@particle-academy/agent-integrations 0.47.0 → 0.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/dom-navigation/agent.ts","../src/dom-navigation/remote.ts"],"names":["id","setter"],"mappings":"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","file":"dom-navigation.js","sourcesContent":["/**\n * The in-page half of DOM co-browsing: a framework-free walker that turns a\n * live document into a {@link PageSnapshot} of stable handles, and acts on\n * those handles.\n *\n * Extracted from px-ui-sandbox's CoBrowseProvider so a host that does NOT own\n * the page (Genie's browser, showing sites through an Electron\n * WebContentsView) can run the same walker, injected into an isolated world.\n *\n * Constraints this file holds, because the injected IIFE is built from it:\n *\n * - NO runtime imports. Type-only imports are erased; anything else would be\n * bundled into a script that must run with no module loader.\n * - Nothing touches `document` / `window` until a method is called, so the\n * script can be evaluated in a context with no DOM at all.\n * - Every result is plain, structured-cloneable data.\n *\n * Trust boundary: the page is hostile input. It controls every attribute,\n * label and text node read here. Two consequences:\n * - Sensitive values (passwords, card fields, one-time codes, anything marked\n * `data-private`) are masked HERE, before anything leaves the page — the host\n * cannot mask what it has already received.\n * - Handles are compared as plain strings, never spliced into a CSS selector,\n * so a crafted handle cannot change what a lookup matches.\n */\nimport type { PageAction, PageSnapshot } from \"../bridges/navigation\";\n\n/** Elements the walker considers actionable. */\nexport const INTERACTIVE =\n \"a[href], button, input, select, textarea, [role=button], [role=link], [role=checkbox], [role=tab], [data-co-handle]\";\n\n/** Every method the in-page agent answers. The wire protocol is exactly this list. */\nexport const DOM_NAVIGATION_METHODS = [\n \"getLocation\",\n \"describe\",\n \"read\",\n \"visit\",\n \"back\",\n \"forward\",\n \"scrollTo\",\n \"scrollBy\",\n \"setField\",\n \"click\",\n \"submit\",\n \"rectFor\",\n] as const;\n\nexport type DomNavigationMethod = (typeof DOM_NAVIGATION_METHODS)[number];\n\nexport type ActionResult = { ok: boolean; error?: string };\nexport type HandleRect = { x: number; y: number; width: number; height: number };\n\ntype FieldElement = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n\nconst tag = (el: Element) => el.tagName.toUpperCase();\n\nexport function isVisible(el: Element): boolean {\n const he = el as HTMLElement;\n if ((el as HTMLInputElement).type === \"hidden\") return false;\n if (he.hidden || he.getAttribute(\"aria-hidden\") === \"true\") return false;\n return he.offsetParent !== null || he.getClientRects().length > 0;\n}\n\n/** Sensitive fields whose value is never read into the snapshot. */\nexport function isSensitive(el: Element): boolean {\n const input = el as HTMLInputElement;\n const ac = (el.getAttribute(\"autocomplete\") ?? \"\").toLowerCase();\n return (\n input.type === \"password\" ||\n ac.startsWith(\"cc-\") ||\n ac === \"one-time-code\" ||\n el.hasAttribute(\"data-private\")\n );\n}\n\n/** True when this node, or any element containing it, is sensitive. */\nfunction insideSensitive(node: Node): boolean {\n for (let el = node.parentElement; el; el = el.parentElement) {\n if (isSensitive(el)) return true;\n }\n return false;\n}\n\n/** textContent, minus any text that sits inside a sensitive element. */\nfunction safeText(root: Node): string {\n const doc = root.ownerDocument ?? (root as Document);\n // NodeFilter.SHOW_TEXT === 4; the literal avoids depending on a NodeFilter global.\n const walker = doc.createTreeWalker(root, 4);\n let out = \"\";\n for (let n = walker.nextNode(); n; n = walker.nextNode()) {\n if (!insideSensitive(n)) out += n.nodeValue ?? \"\";\n }\n return out;\n}\n\nexport function roleOf(el: Element): string {\n const explicit = el.getAttribute(\"role\");\n if (explicit) return explicit;\n const t = tag(el);\n if (t === \"A\") return \"link\";\n if (t === \"BUTTON\") return \"button\";\n if (t === \"SELECT\") return \"select\";\n if (t === \"TEXTAREA\") return \"textbox\";\n if (t === \"INPUT\") {\n const type = (el as HTMLInputElement).type;\n if (type === \"checkbox\") return \"checkbox\";\n if (type === \"radio\") return \"radio\";\n if (type === \"submit\" || type === \"button\") return \"button\";\n return \"textbox\";\n }\n return \"generic\";\n}\n\nfunction labelFor(doc: Document, id: string): Element | null {\n // Equivalent to querySelector(`label[for=\"${CSS.escape(id)}\"]`) — first match\n // in document order — without building a selector from page-controlled text.\n for (const lbl of Array.from(doc.querySelectorAll(\"label[for]\"))) {\n if (lbl.getAttribute(\"for\") === id) return lbl;\n }\n return null;\n}\n\nexport function accessibleName(el: Element): string {\n const doc = el.ownerDocument;\n const aria = el.getAttribute(\"aria-label\");\n if (aria) return aria.trim();\n const labelledby = el.getAttribute(\"aria-labelledby\");\n if (labelledby) {\n const txt = labelledby\n .split(/\\s+/)\n .map((id) => doc.getElementById(id)?.textContent ?? \"\")\n .join(\" \")\n .trim();\n if (txt) return txt;\n }\n const id = el.getAttribute(\"id\");\n if (id) {\n const lbl = labelFor(doc, id);\n if (lbl?.textContent?.trim()) return lbl.textContent.trim();\n }\n const wrapping = el.closest(\"label\");\n if (wrapping) {\n const txt = safeText(wrapping).trim();\n if (txt) return txt;\n }\n const placeholder = el.getAttribute(\"placeholder\");\n if (placeholder) return placeholder.trim();\n // A sensitive field's own text is its value (a textarea's content), so it is\n // never used as its name.\n const text = isSensitive(el) ? \"\" : (el as HTMLElement).textContent?.trim();\n if (text) return text.replace(/\\s+/g, \" \").slice(0, 80);\n return el.getAttribute(\"name\") ?? el.getAttribute(\"id\") ?? roleOf(el);\n}\n\nexport function isDestructive(el: Element, label: string): boolean {\n if (el.hasAttribute(\"data-co-confirm\")) return true;\n if ((el as HTMLInputElement).type === \"submit\") return true;\n if (tag(el) === \"BUTTON\" && (el as HTMLButtonElement).type === \"submit\") return true;\n return /\\b(delete|remove|destroy|sign out|log ?out|cancel subscription|deactivate)\\b/i.test(label);\n}\n\n/**\n * The element's own stable handle: data-co-handle → name → id, or \"\" when it\n * has none. An EMPTY attribute counts as absent — `button.name` is `\"\"`, not\n * null, on every button, anchor and input without one, so a plain `??` chain\n * never reaches the id.\n */\nexport function attributeHandle(el: Element): string {\n return (\n el.getAttribute(\"data-co-handle\") ||\n el.getAttribute(\"name\") ||\n el.getAttribute(\"id\") ||\n \"\"\n );\n}\n\n/**\n * Build a fresh snapshot + a handle→element registry. Handle preference:\n * data-co-handle → name → id → `role#index` (stable within a snapshot).\n */\nexport function walk(doc: Document = document): { snapshot: PageSnapshot; registry: Map<string, Element> } {\n const registry = new Map<string, Element>();\n const actions: PageAction[] = [];\n const seen = new Set<Element>();\n let synthetic = 0;\n\n for (const el of Array.from(doc.querySelectorAll(INTERACTIVE))) {\n if (seen.has(el) || !isVisible(el)) continue;\n seen.add(el);\n const label = accessibleName(el);\n const role = roleOf(el);\n let handle = attributeHandle(el);\n if (!handle || registry.has(handle)) handle = `${role}#${synthetic++}`;\n registry.set(handle, el);\n\n let value: unknown;\n if (role === \"textbox\" || role === \"select\") {\n value = isSensitive(el) ? undefined : (el as HTMLInputElement).value;\n } else if (role === \"checkbox\" || role === \"radio\") {\n value = (el as HTMLInputElement).checked;\n }\n\n const action: PageAction = { handle, role, label, destructive: isDestructive(el, label) };\n if (value !== undefined) action.value = value;\n actions.push(action);\n }\n\n const loc = doc.defaultView?.location;\n return {\n snapshot: { url: loc ? loc.pathname + loc.search : \"\", title: doc.title, actions },\n registry,\n };\n}\n\nfunction isField(el: Element): el is FieldElement {\n const t = tag(el);\n return t === \"INPUT\" || t === \"TEXTAREA\" || t === \"SELECT\";\n}\n\n/**\n * Set a field's value so a React-controlled input sees the change: call the\n * PROTOTYPE setter (React shadows `value` on the instance with its value\n * tracker), then dispatch bubbling `input` + `change`.\n */\nexport function setNativeValue(el: FieldElement, value: unknown): void {\n const view = (el.ownerDocument.defaultView ?? globalThis) as typeof globalThis;\n const fire = () => {\n el.dispatchEvent(new view.Event(\"input\", { bubbles: true }));\n el.dispatchEvent(new view.Event(\"change\", { bubbles: true }));\n };\n const t = tag(el);\n if (t === \"INPUT\" && ((el as HTMLInputElement).type === \"checkbox\" || (el as HTMLInputElement).type === \"radio\")) {\n const setter = Object.getOwnPropertyDescriptor(view.HTMLInputElement.prototype, \"checked\")?.set;\n setter?.call(el, Boolean(value));\n fire();\n return;\n }\n const proto =\n t === \"TEXTAREA\"\n ? view.HTMLTextAreaElement.prototype\n : t === \"SELECT\"\n ? view.HTMLSelectElement.prototype\n : view.HTMLInputElement.prototype;\n const setter = Object.getOwnPropertyDescriptor(proto, \"value\")?.set;\n setter?.call(el, String(value));\n fire();\n}\n\n/** Visible text / heading outline, with sensitive text removed. */\nexport function readPage(doc: Document = document): string {\n const main = doc.querySelector(\"main\") ?? doc.body;\n if (!main) return doc.title;\n const heads = Array.from(main.querySelectorAll(\"h1, h2, h3\"))\n .map((h) => `${h.tagName}: ${safeText(h).trim()}`)\n .filter(Boolean);\n const text = safeText(main).replace(/\\s+/g, \" \").trim().slice(0, 4000);\n return [doc.title, ...heads, \"\", text].join(\"\\n\");\n}\n\nexport type DomNavigationAgentOptions = {\n /** Document to drive. Default: the global `document`, read lazily. */\n document?: Document;\n /**\n * Called just before the agent acts on the page — before resolving a field\n * for `setField`, and after resolving (only when the element exists) for\n * `click` / `submit`. The sandbox uses it to attribute the request an action\n * causes to the agent.\n */\n beforeAction?: (action: \"setField\" | \"click\" | \"submit\") => void;\n};\n\nexport type DomNavigationAgent = {\n getLocation(): { url: string; title: string };\n describe(): PageSnapshot;\n read(): string;\n /** Navigate. Only http(s) or same-site paths; deferred a tick so a remote call returns first. */\n visit(url: string): void;\n back(): void;\n forward(): void;\n scrollTo(opts: { x?: number; y?: number; handle?: string }): void;\n scrollBy(dy: number): void;\n setField(handle: string, value: unknown): ActionResult;\n click(handle: string): ActionResult;\n submit(handle: string): ActionResult;\n rectFor(handle: string): HandleRect | null;\n /** Element for a handle: this snapshot's registry, then a live attribute lookup. */\n resolve(handle: string): Element | null;\n /** Serialisable dispatch — what the injected script exposes to a host. */\n call(method: DomNavigationMethod, args?: unknown[]): unknown;\n};\n\nfunction findByAttribute(doc: Document, attr: string, value: string): Element | null {\n for (const el of Array.from(doc.querySelectorAll(`[${attr}]`))) {\n if (el.getAttribute(attr) === value) return el;\n }\n return null;\n}\n\nconst num = (v: unknown) => (typeof v === \"number\" ? v : undefined);\n\nexport function createDomNavigationAgent(options: DomNavigationAgentOptions = {}): DomNavigationAgent {\n let registry = new Map<string, Element>();\n const doc = () => options.document ?? document;\n const win = () => (doc().defaultView ?? window) as Window;\n const before = (action: \"setField\" | \"click\" | \"submit\") => options.beforeAction?.(action);\n\n const resolve = (handle: string): Element | null => {\n const hit = registry.get(handle);\n if (hit && hit.isConnected) return hit;\n // Fallback: a real attribute handle the agent may use before describe().\n const d = doc();\n return (\n findByAttribute(d, \"data-co-handle\", handle) ??\n findByAttribute(d, \"name\", handle) ??\n d.getElementById(handle)\n );\n };\n\n const agent: DomNavigationAgent = {\n getLocation: () => {\n const loc = win().location;\n return { url: loc.pathname + loc.search, title: doc().title };\n },\n describe: () => {\n const res = walk(doc());\n registry = res.registry;\n return res.snapshot;\n },\n read: () => readPage(doc()),\n visit: (url) => {\n const w = win();\n const target = new URL(String(url), w.location.href);\n if (target.protocol !== \"http:\" && target.protocol !== \"https:\") {\n throw new Error(`Refusing to navigate to a '${target.protocol}' URL.`);\n }\n w.setTimeout(() => w.location.assign(target.href), 0);\n },\n back: () => win().history.back(),\n forward: () => win().history.forward(),\n scrollTo: ({ x, y, handle }) => {\n const w = win();\n if (handle) {\n resolve(handle)?.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n return;\n }\n w.scrollTo({ left: x ?? w.scrollX, top: y ?? w.scrollY, behavior: \"smooth\" });\n },\n scrollBy: (dy) => win().scrollBy({ top: dy, behavior: \"smooth\" }),\n setField: (handle, value) => {\n before(\"setField\");\n const el = resolve(handle);\n if (!el) return { ok: false, error: `No element for handle \"${handle}\"` };\n if (isField(el)) {\n setNativeValue(el, value);\n return { ok: true };\n }\n return { ok: false, error: `Handle \"${handle}\" is not a form field` };\n },\n click: (handle) => {\n const el = resolve(handle);\n if (!el) return { ok: false, error: `No element for handle \"${handle}\"` };\n // Before the click: an Inertia link fires its visit synchronously inside click().\n before(\"click\");\n (el as HTMLElement).click();\n return { ok: true };\n },\n submit: (handle) => {\n const el = resolve(handle);\n if (!el) return { ok: false, error: `No element for handle \"${handle}\"` };\n const form = (tag(el) === \"FORM\" ? el : el.closest(\"form\")) as HTMLFormElement | null;\n if (!form) return { ok: false, error: `Handle \"${handle}\" is not inside a form` };\n before(\"submit\");\n if (typeof form.requestSubmit === \"function\") form.requestSubmit();\n else form.submit();\n return { ok: true };\n },\n rectFor: (handle) => {\n const el = resolve(handle);\n if (!el) return null;\n const r = el.getBoundingClientRect();\n return { x: r.left, y: r.top, width: r.width, height: r.height };\n },\n resolve,\n call: (method, args = []) => {\n const a = Array.isArray(args) ? args : [];\n const handle = String(a[0] ?? \"\");\n switch (method) {\n case \"getLocation\":\n return agent.getLocation();\n case \"describe\":\n return agent.describe();\n case \"read\":\n return agent.read();\n case \"visit\":\n agent.visit(String(a[0] ?? \"\"));\n return undefined;\n case \"back\":\n agent.back();\n return undefined;\n case \"forward\":\n agent.forward();\n return undefined;\n case \"scrollTo\": {\n const o = (a[0] && typeof a[0] === \"object\" ? a[0] : {}) as Record<string, unknown>;\n agent.scrollTo({\n x: num(o.x),\n y: num(o.y),\n handle: typeof o.handle === \"string\" ? o.handle : undefined,\n });\n return undefined;\n }\n case \"scrollBy\":\n agent.scrollBy(Number(a[0] ?? 0));\n return undefined;\n case \"setField\":\n return agent.setField(handle, a[1]);\n case \"click\":\n return agent.click(handle);\n case \"submit\":\n return agent.submit(handle);\n case \"rectFor\":\n return agent.rectFor(handle);\n default:\n throw new Error(`Unknown dom-navigation method: ${String(method)}`);\n }\n },\n };\n return agent;\n}\n","/**\n * The host half: a {@link NavigationBridgeAdapter} that drives a page it does\n * not run in, through any transport that can carry a method name and plain\n * arguments into the page and a plain result back — Electron's\n * `executeJavaScript` / `executeJavaScriptInIsolatedWorld`, a MessagePort, a\n * WebSocket to a remote browser.\n *\n * Every result is treated as hostile: the page owns the DOM the in-page walker\n * reads, and if the script was injected into the MAIN world the page can\n * replace the walker outright. So results are coerced to the declared shapes\n * here, and anything malformed is dropped rather than passed on to the agent.\n */\nimport type {\n NavigationBridgeAdapter,\n NavigationConfirmRequest,\n PageAction,\n PageSnapshot,\n} from \"../bridges/navigation\";\nimport { DOM_NAVIGATION_METHODS, type ActionResult, type DomNavigationMethod, type HandleRect } from \"./agent\";\n\n/** The global the injected script installs in the world it runs in. */\nexport const DOM_NAVIGATION_GLOBAL = \"__fancyDomNavigation\";\n\n/** Bumped only if the wire protocol changes incompatibly. */\nexport const DOM_NAVIGATION_PROTOCOL = 1;\n\n/**\n * Carries one call into the page. `args` and the resolved value are plain,\n * structured-cloneable data. Reject (or throw) when the call could not be\n * delivered — e.g. the page navigated and the script must be re-injected.\n */\nexport type DomNavigationTransport = {\n call(method: DomNavigationMethod, args: unknown[]): Promise<unknown>;\n};\n\nexport type RemoteNavigationAdapterOptions = {\n transport: DomNavigationTransport;\n /** Optional fancy-screens screen id for presence targeting. */\n screenId?: string;\n /** Human-control revision, if the host tracks one. Omit to disable stale-intent protection. */\n getRevision?: () => number | Promise<number>;\n /**\n * Trust-but-verify. Without it, `page_submit` and destructive `page_click`\n * are NOT staged — they run as soon as the agent asks. A host showing pages\n * it does not own should always supply one.\n */\n confirm?: (req: NavigationConfirmRequest) => Promise<boolean>;\n};\n\nconst METHODS = new Set<string>(DOM_NAVIGATION_METHODS);\n\nfunction assertMethod(method: string): asserts method is DomNavigationMethod {\n if (!METHODS.has(method)) throw new Error(`Unknown dom-navigation method: ${method}`);\n}\n\n/**\n * A JavaScript expression that performs one call against the injected global —\n * what a host passes to `executeJavaScript`. Arguments are embedded as JSON,\n * which is a valid JS expression, so no argument can break out of its literal.\n */\nexport function domNavigationCallScript(method: DomNavigationMethod, args: unknown[] = []): string {\n assertMethod(method);\n const g = JSON.stringify(DOM_NAVIGATION_GLOBAL);\n return (\n `(function(){var n=globalThis[${g}];` +\n `if(!n||typeof n.call!==\"function\")throw new Error(\"fancy dom-navigation is not injected in this world\");` +\n `return n.call(${JSON.stringify(method)},${JSON.stringify(args)});})()`\n );\n}\n\nconst str = (v: unknown, fallback = \"\") => (typeof v === \"string\" ? v : fallback);\nconst isObj = (v: unknown): v is Record<string, unknown> => typeof v === \"object\" && v !== null;\n\nfunction coerceAction(v: unknown): PageAction | null {\n if (!isObj(v) || typeof v.handle !== \"string\" || v.handle === \"\") return null;\n const action: PageAction = {\n handle: v.handle,\n role: str(v.role, \"generic\"),\n label: str(v.label),\n destructive: v.destructive === true,\n };\n const value = v.value;\n if (typeof value === \"string\" || typeof value === \"boolean\" || (typeof value === \"number\" && Number.isFinite(value))) {\n action.value = value;\n }\n return action;\n}\n\nfunction coerceSnapshot(v: unknown): PageSnapshot {\n const o = isObj(v) ? v : {};\n const actions = Array.isArray(o.actions)\n ? o.actions.map(coerceAction).filter((a): a is PageAction => a !== null)\n : [];\n return { url: str(o.url), title: str(o.title), actions };\n}\n\nfunction coerceResult(v: unknown): ActionResult {\n const o = isObj(v) ? v : {};\n return { ok: o.ok === true, error: typeof o.error === \"string\" ? o.error : undefined };\n}\n\nfunction coerceRect(v: unknown): HandleRect | null {\n if (!isObj(v)) return null;\n const { x, y, width, height } = v;\n const finite = (n: unknown): n is number => typeof n === \"number\" && Number.isFinite(n);\n return finite(x) && finite(y) && finite(width) && finite(height) ? { x, y, width, height } : null;\n}\n\n/** Build a NavigationBridgeAdapter backed by a transport into the page. */\nexport function createRemoteNavigationAdapter(options: RemoteNavigationAdapterOptions): NavigationBridgeAdapter {\n const { transport } = options;\n const call = (method: DomNavigationMethod, ...args: unknown[]) => transport.call(method, args);\n const fail = (e: unknown): ActionResult => ({ ok: false, error: e instanceof Error ? e.message : String(e) });\n\n return {\n screenId: options.screenId,\n getRevision: options.getRevision,\n confirm: options.confirm,\n getLocation: async () => {\n const o = await call(\"getLocation\");\n const loc = isObj(o) ? o : {};\n return { url: str(loc.url), title: str(loc.title) };\n },\n describe: async () => coerceSnapshot(await call(\"describe\")),\n read: async () => str(await call(\"read\")),\n visit: async (url) => {\n await call(\"visit\", url);\n },\n back: async () => {\n await call(\"back\");\n },\n forward: async () => {\n await call(\"forward\");\n },\n scrollTo: async (opts) => {\n await call(\"scrollTo\", { x: opts.x, y: opts.y, handle: opts.handle });\n },\n scrollBy: async (dy) => {\n await call(\"scrollBy\", dy);\n },\n setField: async (handle, value) => coerceResult(await call(\"setField\", handle, value).catch(fail)),\n click: async (handle) => coerceResult(await call(\"click\", handle).catch(fail)),\n submit: async (handle) => coerceResult(await call(\"submit\", handle).catch(fail)),\n rectFor: async (handle) => coerceRect(await call(\"rectFor\", handle).catch(() => null)),\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/dom-navigation/agent.ts","../src/dom-navigation/remote.ts"],"names":["id","setter"],"mappings":"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","file":"dom-navigation.js","sourcesContent":["/**\n * The in-page half of DOM co-browsing: a framework-free walker that turns a\n * live document into a {@link PageSnapshot} of stable handles, and acts on\n * those handles.\n *\n * Extracted from px-ui-sandbox's CoBrowseProvider so a host that does NOT own\n * the page (Genie's browser, showing sites through an Electron\n * WebContentsView) can run the same walker, injected into an isolated world.\n *\n * Constraints this file holds, because the injected IIFE is built from it:\n *\n * - NO runtime imports. Type-only imports are erased; anything else would be\n * bundled into a script that must run with no module loader.\n * - Nothing touches `document` / `window` until a method is called, so the\n * script can be evaluated in a context with no DOM at all.\n * - Every result is plain, structured-cloneable data.\n *\n * Trust boundary: the page is hostile input. It controls every attribute,\n * label and text node read here. Two consequences:\n * - Sensitive values (passwords, card fields, one-time codes, anything marked\n * `data-private`) are masked HERE, before anything leaves the page — the host\n * cannot mask what it has already received.\n * - Handles are compared as plain strings, never spliced into a CSS selector,\n * so a crafted handle cannot change what a lookup matches.\n */\nimport type { PageAction, PageReadout, PageSnapshot } from \"../bridges/navigation\";\n\n/** Elements the walker considers actionable. */\nexport const INTERACTIVE =\n \"a[href], button, input, select, textarea, [role=button], [role=link], [role=checkbox], [role=tab], [data-co-handle]\";\n\n/** Every method the in-page agent answers. The wire protocol is exactly this list. */\nexport const DOM_NAVIGATION_METHODS = [\n \"getLocation\",\n \"describe\",\n \"read\",\n \"visit\",\n \"back\",\n \"forward\",\n \"scrollTo\",\n \"scrollBy\",\n \"setField\",\n \"click\",\n \"submit\",\n \"rectFor\",\n] as const;\n\nexport type DomNavigationMethod = (typeof DOM_NAVIGATION_METHODS)[number];\n\nexport type ActionResult = { ok: boolean; error?: string };\nexport type HandleRect = { x: number; y: number; width: number; height: number };\n\ntype FieldElement = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n\nconst tag = (el: Element) => el.tagName.toUpperCase();\n\nexport function isVisible(el: Element): boolean {\n const he = el as HTMLElement;\n if ((el as HTMLInputElement).type === \"hidden\") return false;\n if (he.hidden || he.getAttribute(\"aria-hidden\") === \"true\") return false;\n return he.offsetParent !== null || he.getClientRects().length > 0;\n}\n\n/** Sensitive fields whose value is never read into the snapshot. */\nexport function isSensitive(el: Element): boolean {\n const input = el as HTMLInputElement;\n const ac = (el.getAttribute(\"autocomplete\") ?? \"\").toLowerCase();\n return (\n input.type === \"password\" ||\n ac.startsWith(\"cc-\") ||\n ac === \"one-time-code\" ||\n el.hasAttribute(\"data-private\")\n );\n}\n\n/** True when this node, or any element containing it, is sensitive. */\nfunction insideSensitive(node: Node): boolean {\n for (let el = node.parentElement; el; el = el.parentElement) {\n if (isSensitive(el)) return true;\n }\n return false;\n}\n\n/** textContent, minus any text that sits inside a sensitive element. */\nfunction safeText(root: Node): string {\n const doc = root.ownerDocument ?? (root as Document);\n // NodeFilter.SHOW_TEXT === 4; the literal avoids depending on a NodeFilter global.\n const walker = doc.createTreeWalker(root, 4);\n let out = \"\";\n for (let n = walker.nextNode(); n; n = walker.nextNode()) {\n if (!insideSensitive(n)) out += n.nodeValue ?? \"\";\n }\n return out;\n}\n\nexport function roleOf(el: Element): string {\n const explicit = el.getAttribute(\"role\");\n if (explicit) return explicit;\n const t = tag(el);\n if (t === \"A\") return \"link\";\n if (t === \"BUTTON\") return \"button\";\n if (t === \"SELECT\") return \"select\";\n if (t === \"TEXTAREA\") return \"textbox\";\n if (t === \"INPUT\") {\n const type = (el as HTMLInputElement).type;\n if (type === \"checkbox\") return \"checkbox\";\n if (type === \"radio\") return \"radio\";\n if (type === \"submit\" || type === \"button\") return \"button\";\n return \"textbox\";\n }\n return \"generic\";\n}\n\nfunction labelFor(doc: Document, id: string): Element | null {\n // Equivalent to querySelector(`label[for=\"${CSS.escape(id)}\"]`) — first match\n // in document order — without building a selector from page-controlled text.\n for (const lbl of Array.from(doc.querySelectorAll(\"label[for]\"))) {\n if (lbl.getAttribute(\"for\") === id) return lbl;\n }\n return null;\n}\n\nexport function accessibleName(el: Element): string {\n const doc = el.ownerDocument;\n const aria = el.getAttribute(\"aria-label\");\n if (aria) return aria.trim();\n const labelledby = el.getAttribute(\"aria-labelledby\");\n if (labelledby) {\n const txt = labelledby\n .split(/\\s+/)\n .map((id) => doc.getElementById(id)?.textContent ?? \"\")\n .join(\" \")\n .trim();\n if (txt) return txt;\n }\n const id = el.getAttribute(\"id\");\n if (id) {\n const lbl = labelFor(doc, id);\n if (lbl?.textContent?.trim()) return lbl.textContent.trim();\n }\n const wrapping = el.closest(\"label\");\n if (wrapping) {\n const txt = safeText(wrapping).trim();\n if (txt) return txt;\n }\n const placeholder = el.getAttribute(\"placeholder\");\n if (placeholder) return placeholder.trim();\n // A sensitive field's own text is its value (a textarea's content), so it is\n // never used as its name.\n const text = isSensitive(el) ? \"\" : (el as HTMLElement).textContent?.trim();\n if (text) return text.replace(/\\s+/g, \" \").slice(0, 80);\n return el.getAttribute(\"name\") ?? el.getAttribute(\"id\") ?? roleOf(el);\n}\n\nexport function isDestructive(el: Element, label: string): boolean {\n if (el.hasAttribute(\"data-co-confirm\")) return true;\n if ((el as HTMLInputElement).type === \"submit\") return true;\n if (tag(el) === \"BUTTON\" && (el as HTMLButtonElement).type === \"submit\") return true;\n return /\\b(delete|remove|destroy|sign out|log ?out|cancel subscription|deactivate)\\b/i.test(label);\n}\n\n/**\n * The element's own stable handle: data-co-handle → name → id, or \"\" when it\n * has none. An EMPTY attribute counts as absent — `button.name` is `\"\"`, not\n * null, on every button, anchor and input without one, so a plain `??` chain\n * never reaches the id.\n */\nexport function attributeHandle(el: Element): string {\n return (\n el.getAttribute(\"data-co-handle\") ||\n el.getAttribute(\"name\") ||\n el.getAttribute(\"id\") ||\n \"\"\n );\n}\n\n/**\n * Build a fresh snapshot + a handle→element registry. Handle preference:\n * data-co-handle → name → id → `role#index` (stable within a snapshot).\n */\nexport function walk(doc: Document = document): { snapshot: PageSnapshot; registry: Map<string, Element> } {\n const registry = new Map<string, Element>();\n const actions: PageAction[] = [];\n const seen = new Set<Element>();\n let synthetic = 0;\n\n for (const el of Array.from(doc.querySelectorAll(INTERACTIVE))) {\n if (seen.has(el) || !isVisible(el)) continue;\n seen.add(el);\n const label = accessibleName(el);\n const role = roleOf(el);\n let handle = attributeHandle(el);\n if (!handle || registry.has(handle)) handle = `${role}#${synthetic++}`;\n registry.set(handle, el);\n\n let value: unknown;\n if (role === \"textbox\" || role === \"select\") {\n value = isSensitive(el) ? undefined : (el as HTMLInputElement).value;\n } else if (role === \"checkbox\" || role === \"radio\") {\n value = (el as HTMLInputElement).checked;\n }\n\n const action: PageAction = { handle, role, label, destructive: isDestructive(el, label) };\n if (value !== undefined) action.value = value;\n actions.push(action);\n }\n\n const loc = doc.defaultView?.location;\n return {\n snapshot: { url: loc ? loc.pathname + loc.search : \"\", title: doc.title, actions },\n registry,\n };\n}\n\nfunction isField(el: Element): el is FieldElement {\n const t = tag(el);\n return t === \"INPUT\" || t === \"TEXTAREA\" || t === \"SELECT\";\n}\n\n/**\n * Set a field's value so a React-controlled input sees the change.\n *\n * - Text, textarea, select: call the PROTOTYPE `value` setter (React shadows\n * `value` on the instance with its value tracker), then dispatch bubbling\n * `input` + `change`.\n * - Checkbox, radio: React's onChange for these listens to `click`, not\n * `input` / `change`, so the write is a real `click()` — the browser toggles\n * the box and fires click, input and change itself. Only when the state\n * actually differs, so setting the current value is a no-op rather than a\n * toggle. A radio cannot be unchecked by clicking it; that one case falls\n * back to the setter.\n */\nexport function setNativeValue(el: FieldElement, value: unknown): void {\n const view = (el.ownerDocument.defaultView ?? globalThis) as typeof globalThis;\n const fire = () => {\n el.dispatchEvent(new view.Event(\"input\", { bubbles: true }));\n el.dispatchEvent(new view.Event(\"change\", { bubbles: true }));\n };\n const t = tag(el);\n if (t === \"INPUT\" && ((el as HTMLInputElement).type === \"checkbox\" || (el as HTMLInputElement).type === \"radio\")) {\n const input = el as HTMLInputElement;\n const want = Boolean(value);\n if (input.checked === want) return;\n if (input.type === \"checkbox\" || want) {\n input.click();\n return;\n }\n const setter = Object.getOwnPropertyDescriptor(view.HTMLInputElement.prototype, \"checked\")?.set;\n setter?.call(el, false);\n fire();\n return;\n }\n const proto =\n t === \"TEXTAREA\"\n ? view.HTMLTextAreaElement.prototype\n : t === \"SELECT\"\n ? view.HTMLSelectElement.prototype\n : view.HTMLInputElement.prototype;\n const setter = Object.getOwnPropertyDescriptor(proto, \"value\")?.set;\n setter?.call(el, String(value));\n fire();\n}\n\n/**\n * Visible text / heading outline, with sensitive text removed. Structured, so\n * the bridge can render each page-supplied string on its own single line.\n */\nexport function readPage(doc: Document = document): PageReadout {\n const main = doc.querySelector(\"main\") ?? doc.body;\n if (!main) return { title: doc.title, headings: [], text: \"\" };\n const headings = Array.from(main.querySelectorAll(\"h1, h2, h3\")).map((h) => ({\n level: Number(h.tagName.slice(1)),\n text: safeText(h).trim(),\n }));\n const text = safeText(main).replace(/\\s+/g, \" \").trim().slice(0, 4000);\n return { title: doc.title, headings, text };\n}\n\nexport type DomNavigationAgentOptions = {\n /** Document to drive. Default: the global `document`, read lazily. */\n document?: Document;\n /**\n * Called just before the agent acts on the page — before resolving a field\n * for `setField`, and after resolving (only when the element exists) for\n * `click` / `submit`. The sandbox uses it to attribute the request an action\n * causes to the agent.\n */\n beforeAction?: (action: \"setField\" | \"click\" | \"submit\") => void;\n};\n\nexport type DomNavigationAgent = {\n getLocation(): { url: string; title: string };\n describe(): PageSnapshot;\n read(): PageReadout;\n /** Navigate. Only http(s) or same-site paths; deferred a tick so a remote call returns first. */\n visit(url: string): void;\n back(): void;\n forward(): void;\n scrollTo(opts: { x?: number; y?: number; handle?: string }): void;\n scrollBy(dy: number): void;\n setField(handle: string, value: unknown): ActionResult;\n click(handle: string): ActionResult;\n submit(handle: string): ActionResult;\n rectFor(handle: string): HandleRect | null;\n /** Element for a handle: this snapshot's registry, then a live attribute lookup. */\n resolve(handle: string): Element | null;\n /** Serialisable dispatch — what the injected script exposes to a host. */\n call(method: DomNavigationMethod, args?: unknown[]): unknown;\n};\n\nfunction findByAttribute(doc: Document, attr: string, value: string): Element | null {\n for (const el of Array.from(doc.querySelectorAll(`[${attr}]`))) {\n if (el.getAttribute(attr) === value) return el;\n }\n return null;\n}\n\nconst num = (v: unknown) => (typeof v === \"number\" ? v : undefined);\n\nexport function createDomNavigationAgent(options: DomNavigationAgentOptions = {}): DomNavigationAgent {\n let registry = new Map<string, Element>();\n const doc = () => options.document ?? document;\n const win = () => (doc().defaultView ?? window) as Window;\n const before = (action: \"setField\" | \"click\" | \"submit\") => options.beforeAction?.(action);\n\n const resolve = (handle: string): Element | null => {\n const hit = registry.get(handle);\n if (hit && hit.isConnected) return hit;\n // Fallback: a real attribute handle the agent may use before describe().\n const d = doc();\n return (\n findByAttribute(d, \"data-co-handle\", handle) ??\n findByAttribute(d, \"name\", handle) ??\n d.getElementById(handle)\n );\n };\n\n const agent: DomNavigationAgent = {\n getLocation: () => {\n const loc = win().location;\n return { url: loc.pathname + loc.search, title: doc().title };\n },\n describe: () => {\n const res = walk(doc());\n registry = res.registry;\n return res.snapshot;\n },\n read: () => readPage(doc()),\n visit: (url) => {\n const w = win();\n const target = new URL(String(url), w.location.href);\n if (target.protocol !== \"http:\" && target.protocol !== \"https:\") {\n throw new Error(`Refusing to navigate to a '${target.protocol}' URL.`);\n }\n w.setTimeout(() => w.location.assign(target.href), 0);\n },\n back: () => win().history.back(),\n forward: () => win().history.forward(),\n scrollTo: ({ x, y, handle }) => {\n const w = win();\n if (handle) {\n resolve(handle)?.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n return;\n }\n w.scrollTo({ left: x ?? w.scrollX, top: y ?? w.scrollY, behavior: \"smooth\" });\n },\n scrollBy: (dy) => win().scrollBy({ top: dy, behavior: \"smooth\" }),\n setField: (handle, value) => {\n before(\"setField\");\n const el = resolve(handle);\n if (!el) return { ok: false, error: `No element for handle \"${handle}\"` };\n if (isField(el)) {\n setNativeValue(el, value);\n return { ok: true };\n }\n return { ok: false, error: `Handle \"${handle}\" is not a form field` };\n },\n click: (handle) => {\n const el = resolve(handle);\n if (!el) return { ok: false, error: `No element for handle \"${handle}\"` };\n // Before the click: an Inertia link fires its visit synchronously inside click().\n before(\"click\");\n (el as HTMLElement).click();\n return { ok: true };\n },\n submit: (handle) => {\n const el = resolve(handle);\n if (!el) return { ok: false, error: `No element for handle \"${handle}\"` };\n const form = (tag(el) === \"FORM\" ? el : el.closest(\"form\")) as HTMLFormElement | null;\n if (!form) return { ok: false, error: `Handle \"${handle}\" is not inside a form` };\n before(\"submit\");\n if (typeof form.requestSubmit === \"function\") form.requestSubmit();\n else form.submit();\n return { ok: true };\n },\n rectFor: (handle) => {\n const el = resolve(handle);\n if (!el) return null;\n const r = el.getBoundingClientRect();\n return { x: r.left, y: r.top, width: r.width, height: r.height };\n },\n resolve,\n call: (method, args = []) => {\n const a = Array.isArray(args) ? args : [];\n const handle = String(a[0] ?? \"\");\n switch (method) {\n case \"getLocation\":\n return agent.getLocation();\n case \"describe\":\n return agent.describe();\n case \"read\":\n return agent.read();\n case \"visit\":\n agent.visit(String(a[0] ?? \"\"));\n return undefined;\n case \"back\":\n agent.back();\n return undefined;\n case \"forward\":\n agent.forward();\n return undefined;\n case \"scrollTo\": {\n const o = (a[0] && typeof a[0] === \"object\" ? a[0] : {}) as Record<string, unknown>;\n agent.scrollTo({\n x: num(o.x),\n y: num(o.y),\n handle: typeof o.handle === \"string\" ? o.handle : undefined,\n });\n return undefined;\n }\n case \"scrollBy\":\n agent.scrollBy(Number(a[0] ?? 0));\n return undefined;\n case \"setField\":\n return agent.setField(handle, a[1]);\n case \"click\":\n return agent.click(handle);\n case \"submit\":\n return agent.submit(handle);\n case \"rectFor\":\n return agent.rectFor(handle);\n default:\n throw new Error(`Unknown dom-navigation method: ${String(method)}`);\n }\n },\n };\n return agent;\n}\n","/**\n * The host half: a {@link NavigationBridgeAdapter} that drives a page it does\n * not run in, through any transport that can carry a method name and plain\n * arguments into the page and a plain result back — Electron's\n * `executeJavaScript` / `executeJavaScriptInIsolatedWorld`, a MessagePort, a\n * WebSocket to a remote browser.\n *\n * Every result is treated as hostile: the page owns the DOM the in-page walker\n * reads, and if the script was injected into the MAIN world the page can\n * replace the walker outright. So results are coerced to the declared shapes\n * here, and anything malformed is dropped rather than passed on to the agent.\n */\nimport type {\n NavigationBridgeAdapter,\n NavigationConfirmRequest,\n PageAction,\n PageReadout,\n PageSnapshot,\n} from \"../bridges/navigation\";\nimport { DOM_NAVIGATION_METHODS, type ActionResult, type DomNavigationMethod, type HandleRect } from \"./agent\";\n\n/** The global the injected script installs in the world it runs in. */\nexport const DOM_NAVIGATION_GLOBAL = \"__fancyDomNavigation\";\n\n/** Bumped only if the wire protocol changes incompatibly. */\nexport const DOM_NAVIGATION_PROTOCOL = 1;\n\n/**\n * Carries one call into the page. `args` and the resolved value are plain,\n * structured-cloneable data. Reject (or throw) when the call could not be\n * delivered — e.g. the page navigated and the script must be re-injected.\n */\nexport type DomNavigationTransport = {\n call(method: DomNavigationMethod, args: unknown[]): Promise<unknown>;\n};\n\nexport type RemoteNavigationAdapterOptions = {\n transport: DomNavigationTransport;\n /** Optional fancy-screens screen id for presence targeting. */\n screenId?: string;\n /** Human-control revision, if the host tracks one. Omit to disable stale-intent protection. */\n getRevision?: () => number | Promise<number>;\n /**\n * Trust-but-verify. Without it, `page_submit` and destructive `page_click`\n * are NOT staged — they run as soon as the agent asks. A host showing pages\n * it does not own should always supply one.\n */\n confirm?: (req: NavigationConfirmRequest) => Promise<boolean>;\n};\n\nconst METHODS = new Set<string>(DOM_NAVIGATION_METHODS);\n\nfunction assertMethod(method: string): asserts method is DomNavigationMethod {\n if (!METHODS.has(method)) throw new Error(`Unknown dom-navigation method: ${method}`);\n}\n\n/**\n * A JavaScript expression that performs one call against the injected global —\n * what a host passes to `executeJavaScript`. Arguments are embedded as JSON,\n * which is a valid JS expression, so no argument can break out of its literal.\n */\nexport function domNavigationCallScript(method: DomNavigationMethod, args: unknown[] = []): string {\n assertMethod(method);\n const g = JSON.stringify(DOM_NAVIGATION_GLOBAL);\n return (\n `(function(){var n=globalThis[${g}];` +\n `if(!n||typeof n.call!==\"function\")throw new Error(\"fancy dom-navigation is not injected in this world\");` +\n `return n.call(${JSON.stringify(method)},${JSON.stringify(args)});})()`\n );\n}\n\nconst str = (v: unknown, fallback = \"\") => (typeof v === \"string\" ? v : fallback);\nconst isObj = (v: unknown): v is Record<string, unknown> => typeof v === \"object\" && v !== null;\n\nfunction coerceAction(v: unknown): PageAction | null {\n if (!isObj(v) || typeof v.handle !== \"string\" || v.handle === \"\") return null;\n const action: PageAction = {\n handle: v.handle,\n role: str(v.role, \"generic\"),\n label: str(v.label),\n destructive: v.destructive === true,\n };\n const value = v.value;\n if (typeof value === \"string\" || typeof value === \"boolean\" || (typeof value === \"number\" && Number.isFinite(value))) {\n action.value = value;\n }\n return action;\n}\n\nfunction coerceSnapshot(v: unknown): PageSnapshot {\n const o = isObj(v) ? v : {};\n const actions = Array.isArray(o.actions)\n ? o.actions.map(coerceAction).filter((a): a is PageAction => a !== null)\n : [];\n return { url: str(o.url), title: str(o.title), actions };\n}\n\n/** A plain string stays a string (the bridge renders it as one line). */\nfunction coerceReadout(v: unknown): string | PageReadout {\n if (typeof v === \"string\") return v;\n const o = isObj(v) ? v : {};\n const headings = (Array.isArray(o.headings) ? o.headings : []).flatMap((h) =>\n isObj(h) && typeof h.text === \"string\" && typeof h.level === \"number\" && Number.isFinite(h.level)\n ? [{ level: h.level, text: h.text }]\n : [],\n );\n return { title: str(o.title), headings, text: str(o.text) };\n}\n\nfunction coerceResult(v: unknown): ActionResult {\n const o = isObj(v) ? v : {};\n return { ok: o.ok === true, error: typeof o.error === \"string\" ? o.error : undefined };\n}\n\nfunction coerceRect(v: unknown): HandleRect | null {\n if (!isObj(v)) return null;\n const { x, y, width, height } = v;\n const finite = (n: unknown): n is number => typeof n === \"number\" && Number.isFinite(n);\n return finite(x) && finite(y) && finite(width) && finite(height) ? { x, y, width, height } : null;\n}\n\n/** Build a NavigationBridgeAdapter backed by a transport into the page. */\nexport function createRemoteNavigationAdapter(options: RemoteNavigationAdapterOptions): NavigationBridgeAdapter {\n const { transport } = options;\n const call = (method: DomNavigationMethod, ...args: unknown[]) => transport.call(method, args);\n const fail = (e: unknown): ActionResult => ({ ok: false, error: e instanceof Error ? e.message : String(e) });\n\n return {\n screenId: options.screenId,\n getRevision: options.getRevision,\n confirm: options.confirm,\n getLocation: async () => {\n const o = await call(\"getLocation\");\n const loc = isObj(o) ? o : {};\n return { url: str(loc.url), title: str(loc.title) };\n },\n describe: async () => coerceSnapshot(await call(\"describe\")),\n read: async () => coerceReadout(await call(\"read\")),\n visit: async (url) => {\n await call(\"visit\", url);\n },\n back: async () => {\n await call(\"back\");\n },\n forward: async () => {\n await call(\"forward\");\n },\n scrollTo: async (opts) => {\n await call(\"scrollTo\", { x: opts.x, y: opts.y, handle: opts.handle });\n },\n scrollBy: async (dy) => {\n await call(\"scrollBy\", dy);\n },\n setField: async (handle, value) => coerceResult(await call(\"setField\", handle, value).catch(fail)),\n click: async (handle) => coerceResult(await call(\"click\", handle).catch(fail)),\n submit: async (handle) => coerceResult(await call(\"submit\", handle).catch(fail)),\n rectFor: async (handle) => coerceRect(await call(\"rectFor\", handle).catch(() => null)),\n };\n}\n"]}
package/dist/index.cjs CHANGED
@@ -3416,6 +3416,22 @@ function registerTerminalBridge(host, options) {
3416
3416
 
3417
3417
  // src/bridges/navigation.ts
3418
3418
  var DEFAULT_AGENT12 = { id: "agent", name: "Agent", color: "#a855f7" };
3419
+ var isControl = (code) => code < 32 || code >= 127 && code <= 159 || code === 8232 || code === 8233;
3420
+ function oneLine(value, max) {
3421
+ const raw = typeof value === "string" ? value : value == null ? "" : String(value);
3422
+ const bounded = raw.length > max * 4 ? raw.slice(0, max * 4) : raw;
3423
+ let out = "";
3424
+ for (const c of bounded) out += isControl(c.charCodeAt(0)) ? " " : c;
3425
+ out = out.replace(/\s+/g, " ").trim();
3426
+ return out.length > max ? out.slice(0, max - 3) + "..." : out;
3427
+ }
3428
+ var SAFE_HANDLE = /^[A-Za-z0-9_.:#@/-]{1,80}$/;
3429
+ var CAP = { url: 500, title: 200, role: 40, label: 200, heading: 200, text: 4e3, error: 300, headings: 50 };
3430
+ function formatReadout(r) {
3431
+ if (typeof r === "string") return oneLine(r, CAP.text);
3432
+ const headings = (Array.isArray(r.headings) ? r.headings : []).slice(0, CAP.headings).map((h) => `H${Math.min(6, Math.max(1, Math.trunc(Number(h?.level)) || 1))}: ${oneLine(h?.text, CAP.heading)}`);
3433
+ return [oneLine(r.title, CAP.title), ...headings, "", oneLine(r.text, CAP.text)].join("\n");
3434
+ }
3419
3435
  function registerNavigationBridge(host, options) {
3420
3436
  const { adapter } = options;
3421
3437
  const agent = { ...DEFAULT_AGENT12, ...options.agent ?? {} };
@@ -3432,6 +3448,9 @@ function registerNavigationBridge(host, options) {
3432
3448
  }
3433
3449
  return null;
3434
3450
  };
3451
+ let aliases = /* @__PURE__ */ new Map();
3452
+ const pageHandle = (handle) => aliases.get(handle) ?? handle;
3453
+ const failure = (message, fallback) => errorResult(oneLine(message ?? fallback, CAP.error) || fallback);
3435
3454
  ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
3436
3455
  const target = (label, elementId) => ({
3437
3456
  kind: "navigation",
@@ -3444,7 +3463,7 @@ function registerNavigationBridge(host, options) {
3444
3463
  try {
3445
3464
  return await handler(args);
3446
3465
  } catch (e) {
3447
- return errorResult(e instanceof Error ? e.message : String(e));
3466
+ return failure(e instanceof Error ? e.message : String(e), `${name} failed`);
3448
3467
  }
3449
3468
  };
3450
3469
  const final = activity ? wrapToolWithActivity(wrapped, {
@@ -3471,17 +3490,29 @@ function registerNavigationBridge(host, options) {
3471
3490
  {},
3472
3491
  [],
3473
3492
  async () => {
3474
- const snap = await adapter.describe();
3493
+ const raw = await adapter.describe();
3494
+ const next = /* @__PURE__ */ new Map();
3495
+ const actions = (Array.isArray(raw.actions) ? raw.actions : []).map((a) => {
3496
+ const handle = String(a.handle ?? "");
3497
+ if (SAFE_HANDLE.test(handle)) return a;
3498
+ const alias = `~${next.size}`;
3499
+ next.set(alias, handle);
3500
+ return { ...a, handle: alias };
3501
+ });
3502
+ aliases = next;
3503
+ const snap = { ...raw, actions };
3475
3504
  const revision = await adapter.getRevision?.();
3476
3505
  if (revision !== void 0) {
3477
3506
  snap.revision = revision;
3478
3507
  groundedRevision = revision;
3479
3508
  }
3480
3509
  const text = [
3481
- `URL: ${snap.url}`,
3482
- `Title: ${snap.title}`,
3510
+ `URL: ${oneLine(snap.url, CAP.url)}`,
3511
+ `Title: ${oneLine(snap.title, CAP.title)}`,
3483
3512
  "",
3484
- ...snap.actions.map((a) => `[${a.handle}] ${a.role}: ${a.label}${a.destructive ? " (destructive)" : ""}`)
3513
+ ...actions.map(
3514
+ (a) => `[${a.handle}] ${oneLine(a.role, CAP.role)}: ${oneLine(a.label, CAP.label)}${a.destructive ? " (destructive)" : ""}`
3515
+ )
3485
3516
  ].join("\n");
3486
3517
  return textResult(text, snap);
3487
3518
  },
@@ -3492,7 +3523,10 @@ function registerNavigationBridge(host, options) {
3492
3523
  "Read the page's visible text / heading outline for grounding.",
3493
3524
  {},
3494
3525
  [],
3495
- async () => textResult(adapter.read ? await adapter.read() : "(host did not provide page text)"),
3526
+ async () => {
3527
+ const r = adapter.read ? await adapter.read() : void 0;
3528
+ return textResult(r == null ? "(host did not provide page text)" : formatReadout(r));
3529
+ },
3496
3530
  () => target("Read page")
3497
3531
  );
3498
3532
  reg(
@@ -3503,11 +3537,12 @@ function registerNavigationBridge(host, options) {
3503
3537
  async (args) => {
3504
3538
  const stale = await staleIntent();
3505
3539
  if (stale) return stale;
3506
- const handle = String(args.handle ?? "");
3540
+ const shown = String(args.handle ?? "");
3541
+ const handle = pageHandle(shown);
3507
3542
  const action = (await adapter.describe()).actions.find((candidate) => candidate.handle === handle);
3508
- if (!action) return errorResult(`No element for handle "${handle}"`);
3509
- return textResult(`Focused ${handle}`, {
3510
- handle,
3543
+ if (!action) return failure(`No element for handle "${shown}"`, "No element for that handle");
3544
+ return textResult(`Focused ${oneLine(shown, CAP.label)}`, {
3545
+ handle: shown,
3511
3546
  rect: await adapter.rectFor?.(handle) ?? void 0
3512
3547
  });
3513
3548
  },
@@ -3587,13 +3622,17 @@ function registerNavigationBridge(host, options) {
3587
3622
  async (args) => {
3588
3623
  const stale = await staleIntent();
3589
3624
  if (stale) return stale;
3590
- const handle = typeof args.handle === "string" ? args.handle : void 0;
3625
+ const shown = typeof args.handle === "string" ? args.handle : void 0;
3626
+ const handle = shown === void 0 ? void 0 : pageHandle(shown);
3591
3627
  await adapter.scrollTo({
3592
3628
  handle,
3593
3629
  x: typeof args.x === "number" ? args.x : void 0,
3594
3630
  y: typeof args.y === "number" ? args.y : void 0
3595
3631
  });
3596
- return textResult("Scrolled", handle ? { handle, rect: await adapter.rectFor?.(handle) ?? void 0 } : void 0);
3632
+ return textResult(
3633
+ "Scrolled",
3634
+ handle ? { handle: shown, rect: await adapter.rectFor?.(handle) ?? void 0 } : void 0
3635
+ );
3597
3636
  },
3598
3637
  () => target("Scroll")
3599
3638
  );
@@ -3621,10 +3660,15 @@ function registerNavigationBridge(host, options) {
3621
3660
  async (args) => {
3622
3661
  const stale = await staleIntent();
3623
3662
  if (stale) return stale;
3624
- const handle = String(args.handle ?? "");
3663
+ const shown = String(args.handle ?? "");
3664
+ const handle = pageHandle(shown);
3625
3665
  const res = await adapter.setField(handle, args.value);
3626
- if (!res.ok) return errorResult(res.error ?? `Could not set ${handle}`);
3627
- return textResult(`${handle} \u2190 ${JSON.stringify(args.value)}`, { handle, value: args.value, rect: await adapter.rectFor?.(handle) ?? void 0 });
3666
+ if (!res.ok) return failure(res.error, `Could not set ${oneLine(shown, CAP.label)}`);
3667
+ return textResult(`${oneLine(shown, CAP.label)} \u2190 ${JSON.stringify(args.value)}`, {
3668
+ handle: shown,
3669
+ value: args.value,
3670
+ rect: await adapter.rectFor?.(handle) ?? void 0
3671
+ });
3628
3672
  },
3629
3673
  (args) => target(`Set ${String(args.handle ?? "")}`, String(args.handle ?? ""))
3630
3674
  );
@@ -3636,7 +3680,8 @@ function registerNavigationBridge(host, options) {
3636
3680
  async (args) => {
3637
3681
  const stale = await staleIntent();
3638
3682
  if (stale) return stale;
3639
- const handle = String(args.handle ?? "");
3683
+ const shown = String(args.handle ?? "");
3684
+ const handle = pageHandle(shown);
3640
3685
  const action = (await adapter.describe()).actions.find((a) => a.handle === handle);
3641
3686
  const rect = await adapter.rectFor?.(handle) ?? void 0;
3642
3687
  if (pendingMode && action?.destructive && adapter.confirm) {
@@ -3644,8 +3689,8 @@ function registerNavigationBridge(host, options) {
3644
3689
  if (!ok) return errorResult("Declined by user");
3645
3690
  }
3646
3691
  const res = await adapter.click(handle);
3647
- if (!res.ok) return errorResult(res.error ?? `Could not click ${handle}`);
3648
- return textResult(`Clicked ${handle}`, { handle, rect });
3692
+ if (!res.ok) return failure(res.error, `Could not click ${oneLine(shown, CAP.label)}`);
3693
+ return textResult(`Clicked ${oneLine(shown, CAP.label)}`, { handle: shown, rect });
3649
3694
  },
3650
3695
  (args) => target(`Click ${String(args.handle ?? "")}`, String(args.handle ?? ""))
3651
3696
  );
@@ -3657,15 +3702,16 @@ function registerNavigationBridge(host, options) {
3657
3702
  async (args) => {
3658
3703
  const stale = await staleIntent();
3659
3704
  if (stale) return stale;
3660
- const handle = String(args.handle ?? "");
3705
+ const shown = String(args.handle ?? "");
3706
+ const handle = pageHandle(shown);
3661
3707
  const rect = await adapter.rectFor?.(handle) ?? void 0;
3662
3708
  if (pendingMode && adapter.confirm) {
3663
3709
  const ok = await adapter.confirm({ action: "submit", handle, label: handle });
3664
3710
  if (!ok) return errorResult("Declined by user");
3665
3711
  }
3666
3712
  const res = await adapter.submit(handle);
3667
- if (!res.ok) return errorResult(res.error ?? "Submit failed");
3668
- return textResult(`Submitted ${handle}`, { handle, rect });
3713
+ if (!res.ok) return failure(res.error, "Submit failed");
3714
+ return textResult(`Submitted ${oneLine(shown, CAP.label)}`, { handle: shown, rect });
3669
3715
  },
3670
3716
  (args) => target(`Submit ${String(args.handle ?? "")}`, String(args.handle ?? ""))
3671
3717
  );