/** * Source of the in-page recorder that captures console output, page errors, and * network activity so the browser tool can report them back to the agent. * * The script is idempotent: the desktop webview installs it before page scripts * run, and web clients inject it lazily before reading recorded entries. */ export declare const BROWSER_RECORDER_SCRIPT = "(function () {\n\tvar KEY = '__ottoBrowserRecorder';\n\tif (window[KEY]) return;\n\tvar MAX_ENTRIES = 300;\n\tvar MAX_TEXT = 4000;\n\tvar state = {\n\t\tinstalledAt: Date.now(),\n\t\tnextId: 1,\n\t\tconsole: [],\n\t\tnetwork: [],\n\t};\n\n\tfunction push(list, entry) {\n\t\tentry.id = state.nextId++;\n\t\tlist.push(entry);\n\t\tif (list.length > MAX_ENTRIES) list.splice(0, list.length - MAX_ENTRIES);\n\t\treturn entry;\n\t}\n\n\tfunction describe(value) {\n\t\ttry {\n\t\t\tif (typeof value === 'string') return value;\n\t\t\tif (value instanceof Error) {\n\t\t\t\treturn value.stack || value.name + ': ' + value.message;\n\t\t\t}\n\t\t\tif (value && typeof value === 'object') {\n\t\t\t\tvar seen = new WeakSet();\n\t\t\t\treturn JSON.stringify(value, function (_key, item) {\n\t\t\t\t\tif (item && typeof item === 'object') {\n\t\t\t\t\t\tif (seen.has(item)) return '[Circular]';\n\t\t\t\t\t\tseen.add(item);\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof item === 'bigint') return String(item);\n\t\t\t\t\tif (item instanceof Node) return item.nodeName;\n\t\t\t\t\treturn item;\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn String(value);\n\t\t} catch (error) {\n\t\t\ttry {\n\t\t\t\treturn String(value);\n\t\t\t} catch (_ignored) {\n\t\t\t\treturn '[unserializable]';\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction joinArgs(args) {\n\t\tvar parts = [];\n\t\tfor (var index = 0; index < args.length; index += 1) {\n\t\t\tparts.push(describe(args[index]));\n\t\t}\n\t\treturn parts.join(' ').slice(0, MAX_TEXT);\n\t}\n\n\tvar levels = ['log', 'info', 'warn', 'error', 'debug'];\n\tfor (var index = 0; index < levels.length; index += 1) {\n\t\t(function (level) {\n\t\t\tvar original = console[level];\n\t\t\tif (typeof original !== 'function') return;\n\t\t\tconsole[level] = function () {\n\t\t\t\ttry {\n\t\t\t\t\tpush(state.console, {\n\t\t\t\t\t\tlevel: level,\n\t\t\t\t\t\ttext: joinArgs(arguments),\n\t\t\t\t\t\tat: Date.now(),\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {}\n\t\t\t\treturn original.apply(console, arguments);\n\t\t\t};\n\t\t})(levels[index]);\n\t}\n\n\twindow.addEventListener('error', function (event) {\n\t\tvar location = event.filename\n\t\t\t? ' (' + event.filename + ':' + event.lineno + ':' + event.colno + ')'\n\t\t\t: '';\n\t\tpush(state.console, {\n\t\t\tlevel: 'error',\n\t\t\ttext: (event.message || describe(event.error)) + location,\n\t\t\tat: Date.now(),\n\t\t});\n\t});\n\n\twindow.addEventListener('unhandledrejection', function (event) {\n\t\tpush(state.console, {\n\t\t\tlevel: 'error',\n\t\t\ttext: 'Unhandled promise rejection: ' + describe(event.reason),\n\t\t\tat: Date.now(),\n\t\t});\n\t});\n\n\tif (typeof PerformanceObserver === 'function') {\n\t\ttry {\n\t\t\tvar observer = new PerformanceObserver(function (list) {\n\t\t\t\tvar entries = list.getEntries();\n\t\t\t\tfor (var i = 0; i < entries.length; i += 1) {\n\t\t\t\t\tvar entry = entries[i];\n\t\t\t\t\tpush(state.network, {\n\t\t\t\t\t\tsource: 'resource',\n\t\t\t\t\t\tmethod: 'GET',\n\t\t\t\t\t\turl: String(entry.name),\n\t\t\t\t\t\ttype: entry.initiatorType,\n\t\t\t\t\t\tdurationMs: Math.round(entry.duration),\n\t\t\t\t\t\tsize: entry.transferSize,\n\t\t\t\t\t\tat: Date.now(),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t\tobserver.observe({ type: 'resource', buffered: true });\n\t\t} catch (error) {}\n\t}\n\n\twindow[KEY] = state;\n})();"; //# sourceMappingURL=recorder-script.d.ts.map