@tangle-network/browser-agent-driver 0.31.0 → 0.33.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.
Files changed (190) hide show
  1. package/dist/artifacts/filesystem-sink.d.ts +1 -1
  2. package/dist/artifacts/filesystem-sink.js +1 -1
  3. package/dist/brain/index.d.ts +16 -9
  4. package/dist/brain/index.d.ts.map +1 -1
  5. package/dist/brain/index.js +75 -72
  6. package/dist/brain/index.js.map +1 -1
  7. package/dist/browser-launch.js +1 -3
  8. package/dist/browser-launch.js.map +1 -1
  9. package/dist/captcha.d.ts.map +1 -1
  10. package/dist/captcha.js +1 -3
  11. package/dist/captcha.js.map +1 -1
  12. package/dist/cli-attach.d.ts +2 -2
  13. package/dist/cli-attach.js +2 -2
  14. package/dist/cli-design-audit.d.ts.map +1 -1
  15. package/dist/cli-design-audit.js +14 -24
  16. package/dist/cli-design-audit.js.map +1 -1
  17. package/dist/cli-jobs.js +4 -13
  18. package/dist/cli-jobs.js.map +1 -1
  19. package/dist/cli-patterns.d.ts +1 -1
  20. package/dist/cli-patterns.d.ts.map +1 -1
  21. package/dist/cli.js +26 -28
  22. package/dist/cli.js.map +1 -1
  23. package/dist/config.d.ts +5 -3
  24. package/dist/config.d.ts.map +1 -1
  25. package/dist/config.js +1 -0
  26. package/dist/config.js.map +1 -1
  27. package/dist/design/audit/attribution/types.d.ts +3 -3
  28. package/dist/design/audit/attribution/types.d.ts.map +1 -1
  29. package/dist/design/audit/attribution/types.js +2 -2
  30. package/dist/design/audit/build-result.d.ts +71 -0
  31. package/dist/design/audit/build-result.d.ts.map +1 -0
  32. package/dist/design/audit/build-result.js +251 -0
  33. package/dist/design/audit/build-result.js.map +1 -0
  34. package/dist/design/audit/classify-ensemble.d.ts +1 -1
  35. package/dist/design/audit/classify-ensemble.d.ts.map +1 -1
  36. package/dist/design/audit/ethics/check.d.ts +2 -2
  37. package/dist/design/audit/ethics/check.d.ts.map +1 -1
  38. package/dist/design/audit/ethics/check.js +1 -1
  39. package/dist/design/audit/ethics/loader.d.ts +1 -1
  40. package/dist/design/audit/ethics/loader.d.ts.map +1 -1
  41. package/dist/design/audit/evaluate.d.ts +5 -2
  42. package/dist/design/audit/evaluate.d.ts.map +1 -1
  43. package/dist/design/audit/evaluate.js +10 -4
  44. package/dist/design/audit/evaluate.js.map +1 -1
  45. package/dist/design/audit/first-principles-mode.d.ts +1 -1
  46. package/dist/design/audit/first-principles-mode.d.ts.map +1 -1
  47. package/dist/design/audit/modality/android.d.ts +1 -1
  48. package/dist/design/audit/modality/android.d.ts.map +1 -1
  49. package/dist/design/audit/modality/html.d.ts +1 -1
  50. package/dist/design/audit/modality/html.d.ts.map +1 -1
  51. package/dist/design/audit/modality/ios.d.ts +1 -1
  52. package/dist/design/audit/modality/ios.d.ts.map +1 -1
  53. package/dist/design/audit/modality/types.d.ts +2 -2
  54. package/dist/design/audit/modality/types.d.ts.map +1 -1
  55. package/dist/design/audit/modality/types.js +1 -1
  56. package/dist/design/audit/patches/generate.d.ts +57 -0
  57. package/dist/design/audit/patches/generate.d.ts.map +1 -0
  58. package/dist/design/audit/patches/generate.js +168 -0
  59. package/dist/design/audit/patches/generate.js.map +1 -0
  60. package/dist/design/audit/patches/parse.d.ts +1 -1
  61. package/dist/design/audit/patches/parse.d.ts.map +1 -1
  62. package/dist/design/audit/patches/render.d.ts +1 -1
  63. package/dist/design/audit/patches/render.d.ts.map +1 -1
  64. package/dist/design/audit/patches/severity-enforcement.d.ts +1 -1
  65. package/dist/design/audit/patches/severity-enforcement.d.ts.map +1 -1
  66. package/dist/design/audit/patches/validate.d.ts +7 -1
  67. package/dist/design/audit/patches/validate.d.ts.map +1 -1
  68. package/dist/design/audit/patches/validate.js +8 -1
  69. package/dist/design/audit/patches/validate.js.map +1 -1
  70. package/dist/design/audit/patterns/match.d.ts +1 -1
  71. package/dist/design/audit/patterns/match.d.ts.map +1 -1
  72. package/dist/design/audit/patterns/types.d.ts +2 -2
  73. package/dist/design/audit/patterns/types.d.ts.map +1 -1
  74. package/dist/design/audit/pipeline.d.ts +4 -4
  75. package/dist/design/audit/pipeline.d.ts.map +1 -1
  76. package/dist/design/audit/pipeline.js +45 -30
  77. package/dist/design/audit/pipeline.js.map +1 -1
  78. package/dist/design/audit/rubric/loader.d.ts +1 -1
  79. package/dist/design/audit/rubric/loader.d.ts.map +1 -1
  80. package/dist/design/audit/rubric/rollup-weights.d.ts +1 -1
  81. package/dist/design/audit/rubric/rollup-weights.d.ts.map +1 -1
  82. package/dist/design/audit/{v2/types.d.ts → score-types.d.ts} +10 -10
  83. package/dist/design/audit/score-types.d.ts.map +1 -0
  84. package/dist/design/audit/{v2/types.js → score-types.js} +2 -2
  85. package/dist/design/audit/score-types.js.map +1 -0
  86. package/dist/design/audit/{v2/score.d.ts → score.d.ts} +9 -9
  87. package/dist/design/audit/score.d.ts.map +1 -0
  88. package/dist/design/audit/{v2/score.js → score.js} +17 -17
  89. package/dist/design/audit/score.js.map +1 -0
  90. package/dist/design/audit/types.d.ts +7 -7
  91. package/dist/design/audit/types.d.ts.map +1 -1
  92. package/dist/drivers/cursor-overlay.d.ts +1 -1
  93. package/dist/drivers/cursor-overlay.d.ts.map +1 -1
  94. package/dist/drivers/cursor-overlay.js +2 -2
  95. package/dist/drivers/extract-with-index.d.ts +4 -7
  96. package/dist/drivers/extract-with-index.d.ts.map +1 -1
  97. package/dist/drivers/extract-with-index.js +4 -7
  98. package/dist/drivers/extract-with-index.js.map +1 -1
  99. package/dist/drivers/overlay-label.d.ts +3 -4
  100. package/dist/drivers/overlay-label.d.ts.map +1 -1
  101. package/dist/drivers/overlay-label.js.map +1 -1
  102. package/dist/drivers/playwright.d.ts +2 -2
  103. package/dist/drivers/playwright.d.ts.map +1 -1
  104. package/dist/drivers/playwright.js +10 -24
  105. package/dist/drivers/playwright.js.map +1 -1
  106. package/dist/drivers/som-overlay.d.ts +2 -3
  107. package/dist/drivers/som-overlay.d.ts.map +1 -1
  108. package/dist/drivers/som-overlay.js +2 -3
  109. package/dist/drivers/som-overlay.js.map +1 -1
  110. package/dist/drivers/types.d.ts +3 -9
  111. package/dist/drivers/types.d.ts.map +1 -1
  112. package/dist/jobs/anti-bot.js +1 -1
  113. package/dist/jobs/anti-bot.js.map +1 -1
  114. package/dist/jobs/types.d.ts +1 -1
  115. package/dist/jobs/types.d.ts.map +1 -1
  116. package/dist/multi-actor.d.ts.map +1 -1
  117. package/dist/multi-actor.js +2 -3
  118. package/dist/multi-actor.js.map +1 -1
  119. package/dist/reports/aggregate.js +6 -6
  120. package/dist/reports/aggregate.js.map +1 -1
  121. package/dist/reports/tokens.d.ts +0 -8
  122. package/dist/reports/tokens.d.ts.map +1 -1
  123. package/dist/reports/tokens.js +1 -15
  124. package/dist/reports/tokens.js.map +1 -1
  125. package/dist/reports/types.d.ts +2 -2
  126. package/dist/reports/types.d.ts.map +1 -1
  127. package/dist/run-state.d.ts +21 -15
  128. package/dist/run-state.d.ts.map +1 -1
  129. package/dist/run-state.js +23 -22
  130. package/dist/run-state.js.map +1 -1
  131. package/dist/runner/completion-language.d.ts +2 -0
  132. package/dist/runner/completion-language.d.ts.map +1 -0
  133. package/dist/runner/completion-language.js +5 -0
  134. package/dist/runner/completion-language.js.map +1 -0
  135. package/dist/runner/direct-start.d.ts +19 -0
  136. package/dist/runner/direct-start.d.ts.map +1 -0
  137. package/dist/runner/direct-start.js +295 -0
  138. package/dist/runner/direct-start.js.map +1 -0
  139. package/dist/runner/events.d.ts +3 -6
  140. package/dist/runner/events.d.ts.map +1 -1
  141. package/dist/runner/events.js.map +1 -1
  142. package/dist/runner/fan-out.d.ts +6 -9
  143. package/dist/runner/fan-out.d.ts.map +1 -1
  144. package/dist/runner/fan-out.js +7 -15
  145. package/dist/runner/fan-out.js.map +1 -1
  146. package/dist/runner/goal-decomposer.d.ts +0 -1
  147. package/dist/runner/goal-decomposer.d.ts.map +1 -1
  148. package/dist/runner/goal-decomposer.js +0 -1
  149. package/dist/runner/goal-decomposer.js.map +1 -1
  150. package/dist/runner/google-flights-preflight.d.ts +35 -0
  151. package/dist/runner/google-flights-preflight.d.ts.map +1 -0
  152. package/dist/runner/google-flights-preflight.js +411 -0
  153. package/dist/runner/google-flights-preflight.js.map +1 -0
  154. package/dist/runner/interrupt-controller.d.ts +1 -1
  155. package/dist/runner/interrupt-controller.js +1 -1
  156. package/dist/runner/overlay-narration.d.ts +1 -1
  157. package/dist/runner/overlay-narration.js +1 -1
  158. package/dist/runner/parallel-runner.d.ts +3 -6
  159. package/dist/runner/parallel-runner.d.ts.map +1 -1
  160. package/dist/runner/parallel-runner.js +2 -3
  161. package/dist/runner/parallel-runner.js.map +1 -1
  162. package/dist/runner/pattern-extractor.d.ts +2 -2
  163. package/dist/runner/pattern-extractor.js +2 -2
  164. package/dist/runner/runner.d.ts +15 -39
  165. package/dist/runner/runner.d.ts.map +1 -1
  166. package/dist/runner/runner.js +254 -231
  167. package/dist/runner/runner.js.map +1 -1
  168. package/dist/runner/stream-webhook.d.ts +1 -1
  169. package/dist/runner/stream-webhook.js +1 -1
  170. package/dist/skills/domain-loader.d.ts +1 -2
  171. package/dist/skills/domain-loader.d.ts.map +1 -1
  172. package/dist/skills/domain-loader.js +1 -2
  173. package/dist/skills/domain-loader.js.map +1 -1
  174. package/dist/telemetry/schema.d.ts +2 -2
  175. package/dist/telemetry/schema.js +2 -2
  176. package/dist/test-runner.d.ts +4 -5
  177. package/dist/test-runner.d.ts.map +1 -1
  178. package/dist/test-runner.js +2 -3
  179. package/dist/test-runner.js.map +1 -1
  180. package/dist/types.d.ts +28 -21
  181. package/dist/types.d.ts.map +1 -1
  182. package/package.json +8 -2
  183. package/dist/design/audit/v2/build-result.d.ts +0 -47
  184. package/dist/design/audit/v2/build-result.d.ts.map +0 -1
  185. package/dist/design/audit/v2/build-result.js +0 -163
  186. package/dist/design/audit/v2/build-result.js.map +0 -1
  187. package/dist/design/audit/v2/score.d.ts.map +0 -1
  188. package/dist/design/audit/v2/score.js.map +0 -1
  189. package/dist/design/audit/v2/types.d.ts.map +0 -1
  190. package/dist/design/audit/v2/types.js.map +0 -1
@@ -25,5 +25,5 @@
25
25
  * The init script that runs in every page. Returned as a string so it can be
26
26
  * passed to `page.addInitScript`. Pure DOM/CSS — no dependencies.
27
27
  */
28
- export declare const CURSOR_OVERLAY_INIT_SCRIPT = "\n(() => {\n if (window.__bad_overlay_installed) return;\n window.__bad_overlay_installed = true;\n\n const NS = 'http://www.w3.org/2000/svg';\n const Z = 2147483647; // max i32\n\n // \u2500\u2500 Root container (absolute, ignores pointer events) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const root = document.createElement('div');\n root.id = '__bad_overlay_root';\n Object.assign(root.style, {\n position: 'fixed',\n inset: '0',\n width: '100vw',\n height: '100vh',\n pointerEvents: 'none',\n zIndex: String(Z),\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n });\n\n // \u2500\u2500 Keyframes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const style = document.createElement('style');\n style.textContent = `\n @keyframes __bad_cursor_bob {\n 0%, 100% { margin-top: 0px; }\n 50% { margin-top: -3px; }\n }\n @keyframes __bad_badge_in {\n from { transform: translateX(-20px); opacity: 0; }\n to { transform: translateX(0); opacity: 1; }\n }\n @keyframes __bad_badge_out {\n from { transform: translateX(0); opacity: 1; }\n to { transform: translateX(20px); opacity: 0; }\n }\n `;\n (document.head || document.documentElement).appendChild(style);\n\n // \u2500\u2500 Cursor sprite (SVG arrow) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const cursor = document.createElementNS(NS, 'svg');\n cursor.setAttribute('width', '24');\n cursor.setAttribute('height', '24');\n cursor.setAttribute('viewBox', '0 0 24 24');\n cursor.setAttribute('fill', 'none');\n Object.assign(cursor.style, {\n position: 'fixed',\n left: '0',\n top: '0',\n transform: 'translate(-100px, -100px)',\n transition: 'transform 400ms cubic-bezier(0.34, 1.56, 0.64, 1)',\n pointerEvents: 'none',\n filter: 'drop-shadow(0 2px 4px rgba(0,0,0,0.5))',\n animation: '__bad_cursor_bob 1.8s ease-in-out infinite',\n });\n cursor.innerHTML = `\n <path d=\"M3 2 L21 12 L13 14 L9 22 Z\" fill=\"#ffffff\" stroke=\"#0b1220\" stroke-width=\"1.5\" stroke-linejoin=\"round\"/>\n `;\n\n // \u2500\u2500 Pulse ring (animated on click) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const ring = document.createElement('div');\n Object.assign(ring.style, {\n position: 'fixed',\n left: '0',\n top: '0',\n width: '0',\n height: '0',\n borderRadius: '9999px',\n border: '3px solid rgba(79, 70, 229, 0.95)',\n transform: 'translate(-100px, -100px)',\n pointerEvents: 'none',\n opacity: '0',\n transition: 'all 500ms ease-out',\n });\n\n // \u2500\u2500 Highlight box (drawn around the target element) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const box = document.createElement('div');\n box.id = '__bad_overlay_box';\n Object.assign(box.style, {\n position: 'fixed',\n left: '0',\n top: '0',\n width: '0',\n height: '0',\n border: '2px solid rgba(34, 197, 94, 0.95)',\n borderRadius: '6px',\n background: 'rgba(34, 197, 94, 0.08)',\n boxShadow: '0 0 0 4px rgba(34, 197, 94, 0.18)',\n transform: 'translate(-100px, -100px)',\n pointerEvents: 'none',\n transition: 'all 350ms cubic-bezier(0.34, 1.56, 0.64, 1)',\n opacity: '0',\n });\n\n // \u2500\u2500 Action label (shows \"click\" / \"type\" / etc next to cursor) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const label = document.createElement('div');\n Object.assign(label.style, {\n position: 'fixed',\n left: '0',\n top: '0',\n padding: '5px 12px',\n background: 'rgba(11, 18, 32, 0.95)',\n color: '#ffffff',\n fontSize: '13px',\n fontWeight: '600',\n letterSpacing: '0.01em',\n borderRadius: '8px',\n transform: 'translate(-200px, -200px)',\n pointerEvents: 'none',\n opacity: '0',\n transition: 'transform 400ms cubic-bezier(0.34, 1.56, 0.64, 1), opacity 200ms ease',\n boxShadow: '0 4px 16px rgba(0,0,0,0.35)',\n whiteSpace: 'nowrap',\n });\n\n // \u2500\u2500 Progress timeline bar (top edge, thin strip) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const progress = document.createElement('div');\n progress.id = '__bad_overlay_progress';\n Object.assign(progress.style, {\n position: 'fixed',\n top: '0',\n left: '0',\n right: '0',\n height: '3px',\n background: 'rgba(11, 18, 32, 0.6)',\n pointerEvents: 'none',\n opacity: '0',\n transition: 'opacity 300ms ease',\n });\n const progressFill = document.createElement('div');\n Object.assign(progressFill.style, {\n position: 'absolute',\n top: '0',\n left: '0',\n height: '100%',\n width: '0%',\n background: 'linear-gradient(90deg, #4f46e5 0%, #7aa2ff 100%)',\n transition: 'width 500ms cubic-bezier(0.4, 0, 0.2, 1)',\n boxShadow: '0 0 8px rgba(79, 70, 229, 0.6)',\n });\n progress.appendChild(progressFill);\n\n // \u2500\u2500 Progress label (turn counter, top-left) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const progressLabel = document.createElement('div');\n Object.assign(progressLabel.style, {\n position: 'fixed',\n top: '10px',\n left: '14px',\n padding: '4px 10px',\n background: 'rgba(11, 18, 32, 0.88)',\n color: '#ffffff',\n fontSize: '11px',\n fontWeight: '700',\n letterSpacing: '0.06em',\n textTransform: 'uppercase',\n borderRadius: '6px',\n pointerEvents: 'none',\n opacity: '0',\n transition: 'opacity 300ms ease',\n boxShadow: '0 2px 8px rgba(0,0,0,0.3)',\n });\n\n // \u2500\u2500 Reasoning panel (top-right, translucent; agent's own words) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const reasoning = document.createElement('div');\n reasoning.id = '__bad_overlay_reasoning';\n Object.assign(reasoning.style, {\n position: 'fixed',\n top: '40px',\n right: '14px',\n maxWidth: '360px',\n minWidth: '220px',\n padding: '12px 14px',\n background: 'rgba(11, 18, 32, 0.92)',\n color: '#e6ebf5',\n fontSize: '12px',\n lineHeight: '1.5',\n borderRadius: '10px',\n borderLeft: '3px solid #7aa2ff',\n pointerEvents: 'none',\n opacity: '0',\n transform: 'translateY(-6px)',\n transition: 'opacity 250ms ease, transform 250ms ease',\n boxShadow: '0 6px 20px rgba(0,0,0,0.35)',\n backdropFilter: 'blur(4px)',\n });\n const reasoningHeader = document.createElement('div');\n Object.assign(reasoningHeader.style, {\n fontSize: '10px',\n fontWeight: '700',\n letterSpacing: '0.1em',\n textTransform: 'uppercase',\n color: '#7aa2ff',\n marginBottom: '6px',\n });\n reasoningHeader.textContent = 'Agent reasoning';\n const reasoningBody = document.createElement('div');\n Object.assign(reasoningBody.style, { whiteSpace: 'pre-wrap' });\n reasoning.appendChild(reasoningHeader);\n reasoning.appendChild(reasoningBody);\n\n // \u2500\u2500 Verdict badges (bottom-left, stacked) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const badges = document.createElement('div');\n badges.id = '__bad_overlay_badges';\n Object.assign(badges.style, {\n position: 'fixed',\n bottom: '14px',\n left: '14px',\n display: 'flex',\n flexDirection: 'column-reverse',\n gap: '6px',\n pointerEvents: 'none',\n maxHeight: '60vh',\n overflow: 'hidden',\n });\n\n // \u2500\u2500 Gen 34 Hydra View \u2014 fan-out grid (live thumbnails of sub-tabs) \u2500\u2500\u2500\u2500\u2500\n // Full-viewport dim overlay + grid of live sub-tab screenshot cells.\n // Cells lay out based on count: 1\u21921, 2\u21921x2, 3-4\u21922x2, 5-6\u21922x3, 7-8\u21922x4.\n // Each cell background updates via updateFanOutCell(i, dataUrl, meta).\n const hydra = document.createElement('div');\n hydra.id = '__bad_overlay_hydra';\n Object.assign(hydra.style, {\n position: 'fixed',\n inset: '0',\n display: 'none',\n background: 'radial-gradient(ellipse at center, rgba(11,18,32,0.80) 0%, rgba(11,18,32,0.95) 100%)',\n backdropFilter: 'blur(6px)',\n alignItems: 'center',\n justifyContent: 'center',\n flexDirection: 'column',\n gap: '20px',\n transition: 'opacity 400ms ease',\n opacity: '0',\n pointerEvents: 'none',\n });\n const hydraTitle = document.createElement('div');\n Object.assign(hydraTitle.style, {\n fontSize: '11px',\n fontWeight: '700',\n letterSpacing: '0.16em',\n textTransform: 'uppercase',\n color: '#7aa2ff',\n textAlign: 'center',\n });\n hydraTitle.textContent = 'Fan-out \u00B7 investigating branches in parallel';\n const hydraGrid = document.createElement('div');\n hydraGrid.id = '__bad_overlay_hydra_grid';\n Object.assign(hydraGrid.style, {\n display: 'grid',\n gap: '16px',\n maxWidth: '1200px',\n maxHeight: '70vh',\n padding: '0 40px',\n });\n const hydraCounter = document.createElement('div');\n Object.assign(hydraCounter.style, {\n fontSize: '13px',\n color: '#e6ebf5',\n fontWeight: '600',\n textAlign: 'center',\n });\n hydra.appendChild(hydraTitle);\n hydra.appendChild(hydraGrid);\n hydra.appendChild(hydraCounter);\n\n // Append to documentElement (not body) so the overlay is not affected by\n // body's stacking context \u2014 many modern sites apply transform/will-change\n // to body which would clip a max-z-index child appended to body.\n // Bound the retry loop so a body-less doc (XML, PDF viewer, chrome://)\n // doesn't spin requestAnimationFrame forever.\n let attachAttempts = 0;\n function attach() {\n const host = document.documentElement || document.body;\n if (!host) {\n if (++attachAttempts > 60) return; // ~1 second of attempts\n requestAnimationFrame(attach);\n return;\n }\n host.appendChild(root);\n root.appendChild(progress);\n root.appendChild(progressLabel);\n root.appendChild(reasoning);\n root.appendChild(badges);\n root.appendChild(box);\n root.appendChild(ring);\n root.appendChild(cursor);\n root.appendChild(label);\n root.appendChild(hydra);\n }\n attach();\n\n // \u2500\u2500 Badge factory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const BADGE_COLORS = {\n positive: { fg: '#fb7185', bg: 'rgba(251,113,133,0.15)', border: 'rgba(251,113,133,0.5)' },\n cleared: { fg: '#4ade80', bg: 'rgba(74,222,128,0.15)', border: 'rgba(74,222,128,0.5)' },\n review: { fg: '#fbbf24', bg: 'rgba(251,191,36,0.15)', border: 'rgba(251,191,36,0.5)' },\n info: { fg: '#7aa2ff', bg: 'rgba(122,162,255,0.15)', border: 'rgba(122,162,255,0.5)' },\n };\n const MAX_BADGES = 6;\n\n function makeBadge(kind, text) {\n const palette = BADGE_COLORS[kind] || BADGE_COLORS.info;\n const el = document.createElement('div');\n Object.assign(el.style, {\n padding: '8px 14px',\n background: 'rgba(11, 18, 32, 0.92)',\n color: palette.fg,\n fontSize: '12px',\n fontWeight: '700',\n letterSpacing: '0.02em',\n borderRadius: '8px',\n border: '1px solid ' + palette.border,\n boxShadow: '0 4px 16px rgba(0,0,0,0.35), inset 0 0 0 9999px ' + palette.bg,\n animation: '__bad_badge_in 300ms cubic-bezier(0.34, 1.56, 0.64, 1) both',\n whiteSpace: 'nowrap',\n maxWidth: '480px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n });\n el.textContent = text;\n return el;\n }\n\n // \u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n window.__bad_overlay = {\n /**\n * Highlight a target element by CSS selector. Returns the rect or null.\n */\n highlight(selector) {\n try {\n const el = typeof selector === 'string'\n ? document.querySelector(selector)\n : null;\n if (!el) return null;\n const rect = el.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return null;\n Object.assign(box.style, {\n width: rect.width + 'px',\n height: rect.height + 'px',\n transform: `translate(${rect.left}px, ${rect.top}px)`,\n opacity: '1',\n });\n return { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2, width: rect.width, height: rect.height };\n } catch { return null; }\n },\n\n highlightRect(x, y, width, height) {\n try {\n Object.assign(box.style, {\n width: width + 'px',\n height: height + 'px',\n transform: `translate(${x}px, ${y}px)`,\n opacity: '1',\n });\n } catch { /* never let cosmetic overlay break a run */ }\n },\n\n moveTo(x, y, labelText) {\n cursor.style.transform = `translate(${x - 4}px, ${y - 4}px)`;\n if (labelText) {\n label.textContent = labelText;\n Object.assign(label.style, {\n transform: `translate(${x + 16}px, ${y + 16}px)`,\n opacity: '1',\n });\n }\n },\n\n pulseClick(x, y) {\n Object.assign(ring.style, {\n width: '0',\n height: '0',\n transform: `translate(${x}px, ${y}px)`,\n opacity: '1',\n });\n requestAnimationFrame(() => {\n Object.assign(ring.style, {\n width: '60px',\n height: '60px',\n transform: `translate(${x - 30}px, ${y - 30}px)`,\n opacity: '0',\n });\n });\n },\n\n /**\n * Show the agent's reasoning for the current turn. Multi-line text,\n * word-wrapped, in the top-right panel. Pass empty string or null to\n * hide the panel.\n */\n setReasoning(text) {\n try {\n const t = (text || '').trim();\n if (!t) {\n Object.assign(reasoning.style, { opacity: '0', transform: 'translateY(-6px)' });\n return;\n }\n reasoningBody.textContent = t;\n Object.assign(reasoning.style, { opacity: '1', transform: 'translateY(0)' });\n } catch { /* cosmetic */ }\n },\n\n /**\n * Update the progress strip: \"current\" of \"total\" actions done.\n * progressText is optional (e.g., \"Turn 27 \u00B7 C-003\").\n */\n setProgress(current, total, progressText) {\n try {\n const c = Math.max(0, Number(current) || 0);\n const tot = Math.max(1, Number(total) || 1);\n const pct = Math.min(100, (c / tot) * 100);\n progressFill.style.width = pct + '%';\n progress.style.opacity = '1';\n if (progressText) {\n progressLabel.textContent = progressText;\n progressLabel.style.opacity = '1';\n }\n } catch { /* cosmetic */ }\n },\n\n /**\n * Push a verdict badge onto the bottom-left stack. Auto-trims to the\n * most recent MAX_BADGES. kind is one of \"positive\" | \"cleared\" |\n * \"review\" | \"info\".\n */\n pushBadge(kind, text) {\n try {\n const el = makeBadge(kind, text);\n badges.appendChild(el);\n // Trim oldest if over cap (column-reverse means first child = bottom)\n while (badges.children.length > MAX_BADGES) {\n const first = badges.firstChild;\n if (!first) break;\n badges.removeChild(first);\n }\n } catch { /* cosmetic */ }\n },\n\n clearBadges() {\n try {\n while (badges.firstChild) badges.removeChild(badges.firstChild);\n } catch { /* cosmetic */ }\n },\n\n // \u2500\u2500 Gen 34 Hydra API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n /**\n * Begin a fan-out: render the dim overlay + grid of N labeled cells.\n * Cells start in \"queued\" state (empty). Call updateFanOutCell(i, ...)\n * as sub-agent screenshots stream in.\n *\n * labels: human-readable label per cell, one per sub-agent.\n * originX/originY: optional viewport coord where the fan-out was\n * initiated \u2014 cells burst outward from this point (default: center).\n */\n fanOutStart(labels, originX, originY) {\n try {\n const n = Math.max(1, Math.min(8, labels.length));\n // Layout: 1\u21921, 2\u21921x2, 3-4\u21922x2, 5-6\u21923x2, 7-8\u21924x2\n const cols = n === 1 ? 1 : n === 2 ? 2 : n <= 4 ? 2 : n <= 6 ? 3 : 4;\n const rows = Math.ceil(n / cols);\n hydraGrid.style.gridTemplateColumns = 'repeat(' + cols + ', 1fr)';\n hydraGrid.style.gridTemplateRows = 'repeat(' + rows + ', 1fr)';\n // Cell size: scale to fit. For a 1200x600 viewport budget:\n const cellW = Math.floor(1120 / cols) - 10;\n const cellH = Math.floor(Math.min(520 / rows, cellW * 0.7));\n // Clear prior cells\n while (hydraGrid.firstChild) hydraGrid.removeChild(hydraGrid.firstChild);\n const originPx = typeof originX === 'number' && typeof originY === 'number'\n ? { x: originX, y: originY }\n : { x: window.innerWidth / 2, y: window.innerHeight / 2 };\n for (let i = 0; i < n; i++) {\n const cell = document.createElement('div');\n cell.className = '__bad_hydra_cell';\n cell.dataset.index = String(i);\n Object.assign(cell.style, {\n position: 'relative',\n width: cellW + 'px',\n height: cellH + 'px',\n background: '#0b1220',\n backgroundSize: 'cover',\n backgroundPosition: 'center top',\n border: '2px solid rgba(122,162,255,0.55)',\n borderRadius: '10px',\n overflow: 'hidden',\n boxShadow: '0 10px 30px rgba(0,0,0,0.55), inset 0 0 0 1px rgba(122,162,255,0.2)',\n opacity: '0',\n transform: 'translate(' + (originPx.x - window.innerWidth / 2) + 'px, ' + (originPx.y - window.innerHeight / 2) + 'px) scale(0.15)',\n transition: 'transform 480ms cubic-bezier(0.34, 1.56, 0.64, 1), opacity 300ms ease, border-color 300ms ease, box-shadow 300ms ease',\n });\n // Header strip: label + live elapsed\n const header = document.createElement('div');\n Object.assign(header.style, {\n position: 'absolute',\n top: '0', left: '0', right: '0',\n padding: '6px 10px',\n background: 'linear-gradient(180deg, rgba(11,18,32,0.95) 0%, rgba(11,18,32,0.0) 100%)',\n color: '#e6ebf5',\n fontSize: '11px',\n fontWeight: '700',\n letterSpacing: '0.04em',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n });\n const headerLabel = document.createElement('span');\n headerLabel.textContent = labels[i] || ('branch-' + (i + 1));\n const headerTimer = document.createElement('span');\n headerTimer.className = '__bad_hydra_timer';\n headerTimer.style.cssText = 'font-family:SF Mono,Menlo,monospace;font-size:10px;color:#9aa3b8;font-weight:500;';\n headerTimer.textContent = '0.0s';\n header.appendChild(headerLabel);\n header.appendChild(headerTimer);\n cell.appendChild(header);\n // Verdict chip (hidden until complete)\n const chip = document.createElement('div');\n chip.className = '__bad_hydra_chip';\n Object.assign(chip.style, {\n position: 'absolute',\n bottom: '8px',\n left: '8px',\n padding: '3px 10px',\n background: 'rgba(11,18,32,0.92)',\n color: '#ffffff',\n fontSize: '10px',\n fontWeight: '700',\n letterSpacing: '0.05em',\n textTransform: 'uppercase',\n borderRadius: '6px',\n opacity: '0',\n transition: 'opacity 220ms ease',\n });\n cell.appendChild(chip);\n hydraGrid.appendChild(cell);\n }\n hydra.style.display = 'flex';\n hydraCounter.textContent = '0 / ' + n + ' branches complete';\n // Next frame: fade in + animate cells to their grid positions\n requestAnimationFrame(() => {\n hydra.style.opacity = '1';\n const cells = hydraGrid.children;\n for (let i = 0; i < cells.length; i++) {\n const c = cells[i];\n // Staggered burst: 0ms, 60ms, 120ms, ...\n setTimeout(function () {\n c.style.opacity = '1';\n c.style.transform = 'translate(0, 0) scale(1)';\n }, i * 60);\n }\n });\n // Start the elapsed-time ticker\n hydra.__tickerStart = Date.now();\n if (hydra.__ticker) clearInterval(hydra.__ticker);\n hydra.__ticker = setInterval(function () {\n const elapsed = (Date.now() - hydra.__tickerStart) / 1000;\n const cells = hydraGrid.children;\n for (let i = 0; i < cells.length; i++) {\n const cell = cells[i];\n if (cell.__completedAt) continue;\n const timer = cell.querySelector('.__bad_hydra_timer');\n if (timer) timer.textContent = elapsed.toFixed(1) + 's';\n }\n }, 100);\n } catch { /* cosmetic */ }\n },\n\n /**\n * Update cell N with a fresh screenshot (data URL) and/or metadata.\n * Call this at 2-5 FPS from the runner's screenshot streamer.\n * meta: { action?: string, turn?: number }\n */\n fanOutUpdateCell(index, dataUrl, meta) {\n try {\n const cell = hydraGrid.children[index];\n if (!cell) return;\n if (dataUrl) {\n cell.style.backgroundImage = 'url(\"' + dataUrl + '\")';\n }\n // eslint-disable-next-line no-empty\n if (meta) { /* reserved for future overlays inside the cell */ }\n } catch { /* cosmetic */ }\n },\n\n /**\n * Mark cell N as complete with a verdict. kind is one of\n * 'positive' | 'cleared' | 'review' | 'info'. Final state: border\n * recolors, chip fades in, timer freezes.\n */\n fanOutCompleteCell(index, kind, verdictText) {\n try {\n const cell = hydraGrid.children[index];\n if (!cell) return;\n cell.__completedAt = Date.now();\n const palette = (kind === 'positive' ? { c: '#fb7185', bg: 'rgba(251,113,133,0.25)' }\n : kind === 'cleared' ? { c: '#4ade80', bg: 'rgba(74,222,128,0.25)' }\n : kind === 'review' ? { c: '#fbbf24', bg: 'rgba(251,191,36,0.25)' }\n : { c: '#7aa2ff', bg: 'rgba(122,162,255,0.25)' });\n cell.style.borderColor = palette.c;\n cell.style.boxShadow = '0 10px 30px rgba(0,0,0,0.55), inset 0 0 0 1px ' + palette.c + ', 0 0 24px ' + palette.bg;\n const chip = cell.querySelector('.__bad_hydra_chip');\n if (chip) {\n chip.style.background = palette.bg;\n chip.style.color = palette.c;\n chip.style.border = '1px solid ' + palette.c;\n chip.textContent = (verdictText || kind).slice(0, 32);\n chip.style.opacity = '1';\n }\n // Update global counter\n const total = hydraGrid.children.length;\n let done = 0;\n for (let i = 0; i < total; i++) if (hydraGrid.children[i].__completedAt) done++;\n hydraCounter.textContent = done + ' / ' + total + ' branches complete';\n } catch { /* cosmetic */ }\n },\n\n /**\n * Collapse the grid: cells fly inward to center, merge into a result\n * tile, then dissolve. Returns after ~800ms when the animation is\n * done (but does NOT hide the overlay \u2014 caller invokes fanOutDismiss).\n */\n fanOutCollapse() {\n try {\n if (hydra.__ticker) { clearInterval(hydra.__ticker); hydra.__ticker = null; }\n const cells = hydraGrid.children;\n const cx = window.innerWidth / 2;\n const cy = window.innerHeight / 2;\n for (let i = 0; i < cells.length; i++) {\n const c = cells[i];\n const rect = c.getBoundingClientRect();\n const dx = cx - (rect.left + rect.width / 2);\n const dy = cy - (rect.top + rect.height / 2);\n c.style.transition = 'transform 520ms cubic-bezier(0.6, 0, 0.4, 1), opacity 400ms ease';\n c.style.transform = 'translate(' + dx + 'px, ' + dy + 'px) scale(0.2)';\n c.style.opacity = '0';\n }\n hydraTitle.style.transition = 'opacity 400ms ease';\n hydraCounter.style.transition = 'opacity 400ms ease';\n setTimeout(function () { hydraTitle.style.opacity = '0'; hydraCounter.style.opacity = '0'; }, 200);\n } catch { /* cosmetic */ }\n },\n\n /**\n * Hide the Hydra overlay entirely. Call after fanOutCollapse has\n * finished + the parent agent has resumed.\n */\n fanOutDismiss() {\n try {\n hydra.style.opacity = '0';\n setTimeout(function () {\n hydra.style.display = 'none';\n hydraTitle.style.opacity = '1';\n hydraCounter.style.opacity = '1';\n while (hydraGrid.firstChild) hydraGrid.removeChild(hydraGrid.firstChild);\n if (hydra.__ticker) { clearInterval(hydra.__ticker); hydra.__ticker = null; }\n }, 400);\n } catch { /* cosmetic */ }\n },\n\n hide() {\n box.style.opacity = '0';\n label.style.opacity = '0';\n ring.style.opacity = '0';\n },\n\n clearHighlight() {\n box.style.opacity = '0';\n },\n };\n})();\n";
28
+ export declare const CURSOR_OVERLAY_INIT_SCRIPT = "\n(() => {\n if (window.__bad_overlay_installed) return;\n window.__bad_overlay_installed = true;\n\n const NS = 'http://www.w3.org/2000/svg';\n const Z = 2147483647; // max i32\n\n // \u2500\u2500 Root container (absolute, ignores pointer events) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const root = document.createElement('div');\n root.id = '__bad_overlay_root';\n Object.assign(root.style, {\n position: 'fixed',\n inset: '0',\n width: '100vw',\n height: '100vh',\n pointerEvents: 'none',\n zIndex: String(Z),\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n });\n\n // \u2500\u2500 Keyframes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const style = document.createElement('style');\n style.textContent = `\n @keyframes __bad_cursor_bob {\n 0%, 100% { margin-top: 0px; }\n 50% { margin-top: -3px; }\n }\n @keyframes __bad_badge_in {\n from { transform: translateX(-20px); opacity: 0; }\n to { transform: translateX(0); opacity: 1; }\n }\n @keyframes __bad_badge_out {\n from { transform: translateX(0); opacity: 1; }\n to { transform: translateX(20px); opacity: 0; }\n }\n `;\n (document.head || document.documentElement).appendChild(style);\n\n // \u2500\u2500 Cursor sprite (SVG arrow) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const cursor = document.createElementNS(NS, 'svg');\n cursor.setAttribute('width', '24');\n cursor.setAttribute('height', '24');\n cursor.setAttribute('viewBox', '0 0 24 24');\n cursor.setAttribute('fill', 'none');\n Object.assign(cursor.style, {\n position: 'fixed',\n left: '0',\n top: '0',\n transform: 'translate(-100px, -100px)',\n transition: 'transform 400ms cubic-bezier(0.34, 1.56, 0.64, 1)',\n pointerEvents: 'none',\n filter: 'drop-shadow(0 2px 4px rgba(0,0,0,0.5))',\n animation: '__bad_cursor_bob 1.8s ease-in-out infinite',\n });\n cursor.innerHTML = `\n <path d=\"M3 2 L21 12 L13 14 L9 22 Z\" fill=\"#ffffff\" stroke=\"#0b1220\" stroke-width=\"1.5\" stroke-linejoin=\"round\"/>\n `;\n\n // \u2500\u2500 Pulse ring (animated on click) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const ring = document.createElement('div');\n Object.assign(ring.style, {\n position: 'fixed',\n left: '0',\n top: '0',\n width: '0',\n height: '0',\n borderRadius: '9999px',\n border: '3px solid rgba(79, 70, 229, 0.95)',\n transform: 'translate(-100px, -100px)',\n pointerEvents: 'none',\n opacity: '0',\n transition: 'all 500ms ease-out',\n });\n\n // \u2500\u2500 Highlight box (drawn around the target element) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const box = document.createElement('div');\n box.id = '__bad_overlay_box';\n Object.assign(box.style, {\n position: 'fixed',\n left: '0',\n top: '0',\n width: '0',\n height: '0',\n border: '2px solid rgba(34, 197, 94, 0.95)',\n borderRadius: '6px',\n background: 'rgba(34, 197, 94, 0.08)',\n boxShadow: '0 0 0 4px rgba(34, 197, 94, 0.18)',\n transform: 'translate(-100px, -100px)',\n pointerEvents: 'none',\n transition: 'all 350ms cubic-bezier(0.34, 1.56, 0.64, 1)',\n opacity: '0',\n });\n\n // \u2500\u2500 Action label (shows \"click\" / \"type\" / etc next to cursor) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const label = document.createElement('div');\n Object.assign(label.style, {\n position: 'fixed',\n left: '0',\n top: '0',\n padding: '5px 12px',\n background: 'rgba(11, 18, 32, 0.95)',\n color: '#ffffff',\n fontSize: '13px',\n fontWeight: '600',\n letterSpacing: '0.01em',\n borderRadius: '8px',\n transform: 'translate(-200px, -200px)',\n pointerEvents: 'none',\n opacity: '0',\n transition: 'transform 400ms cubic-bezier(0.34, 1.56, 0.64, 1), opacity 200ms ease',\n boxShadow: '0 4px 16px rgba(0,0,0,0.35)',\n whiteSpace: 'nowrap',\n });\n\n // \u2500\u2500 Progress timeline bar (top edge, thin strip) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const progress = document.createElement('div');\n progress.id = '__bad_overlay_progress';\n Object.assign(progress.style, {\n position: 'fixed',\n top: '0',\n left: '0',\n right: '0',\n height: '3px',\n background: 'rgba(11, 18, 32, 0.6)',\n pointerEvents: 'none',\n opacity: '0',\n transition: 'opacity 300ms ease',\n });\n const progressFill = document.createElement('div');\n Object.assign(progressFill.style, {\n position: 'absolute',\n top: '0',\n left: '0',\n height: '100%',\n width: '0%',\n background: 'linear-gradient(90deg, #4f46e5 0%, #7aa2ff 100%)',\n transition: 'width 500ms cubic-bezier(0.4, 0, 0.2, 1)',\n boxShadow: '0 0 8px rgba(79, 70, 229, 0.6)',\n });\n progress.appendChild(progressFill);\n\n // \u2500\u2500 Progress label (turn counter, top-left) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const progressLabel = document.createElement('div');\n Object.assign(progressLabel.style, {\n position: 'fixed',\n top: '10px',\n left: '14px',\n padding: '4px 10px',\n background: 'rgba(11, 18, 32, 0.88)',\n color: '#ffffff',\n fontSize: '11px',\n fontWeight: '700',\n letterSpacing: '0.06em',\n textTransform: 'uppercase',\n borderRadius: '6px',\n pointerEvents: 'none',\n opacity: '0',\n transition: 'opacity 300ms ease',\n boxShadow: '0 2px 8px rgba(0,0,0,0.3)',\n });\n\n // \u2500\u2500 Reasoning panel (top-right, translucent; agent's own words) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const reasoning = document.createElement('div');\n reasoning.id = '__bad_overlay_reasoning';\n Object.assign(reasoning.style, {\n position: 'fixed',\n top: '40px',\n right: '14px',\n maxWidth: '360px',\n minWidth: '220px',\n padding: '12px 14px',\n background: 'rgba(11, 18, 32, 0.92)',\n color: '#e6ebf5',\n fontSize: '12px',\n lineHeight: '1.5',\n borderRadius: '10px',\n borderLeft: '3px solid #7aa2ff',\n pointerEvents: 'none',\n opacity: '0',\n transform: 'translateY(-6px)',\n transition: 'opacity 250ms ease, transform 250ms ease',\n boxShadow: '0 6px 20px rgba(0,0,0,0.35)',\n backdropFilter: 'blur(4px)',\n });\n const reasoningHeader = document.createElement('div');\n Object.assign(reasoningHeader.style, {\n fontSize: '10px',\n fontWeight: '700',\n letterSpacing: '0.1em',\n textTransform: 'uppercase',\n color: '#7aa2ff',\n marginBottom: '6px',\n });\n reasoningHeader.textContent = 'Agent reasoning';\n const reasoningBody = document.createElement('div');\n Object.assign(reasoningBody.style, { whiteSpace: 'pre-wrap' });\n reasoning.appendChild(reasoningHeader);\n reasoning.appendChild(reasoningBody);\n\n // \u2500\u2500 Verdict badges (bottom-left, stacked) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const badges = document.createElement('div');\n badges.id = '__bad_overlay_badges';\n Object.assign(badges.style, {\n position: 'fixed',\n bottom: '14px',\n left: '14px',\n display: 'flex',\n flexDirection: 'column-reverse',\n gap: '6px',\n pointerEvents: 'none',\n maxHeight: '60vh',\n overflow: 'hidden',\n });\n\n // \u2500\u2500 Fan-out view \u2014 live thumbnails of sub-tabs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Full-viewport dim overlay + grid of live sub-tab screenshot cells.\n // Cells lay out based on count: 1\u21921, 2\u21921x2, 3-4\u21922x2, 5-6\u21922x3, 7-8\u21922x4.\n // Each cell background updates via updateFanOutCell(i, dataUrl, meta).\n const hydra = document.createElement('div');\n hydra.id = '__bad_overlay_hydra';\n Object.assign(hydra.style, {\n position: 'fixed',\n inset: '0',\n display: 'none',\n background: 'radial-gradient(ellipse at center, rgba(11,18,32,0.80) 0%, rgba(11,18,32,0.95) 100%)',\n backdropFilter: 'blur(6px)',\n alignItems: 'center',\n justifyContent: 'center',\n flexDirection: 'column',\n gap: '20px',\n transition: 'opacity 400ms ease',\n opacity: '0',\n pointerEvents: 'none',\n });\n const hydraTitle = document.createElement('div');\n Object.assign(hydraTitle.style, {\n fontSize: '11px',\n fontWeight: '700',\n letterSpacing: '0.16em',\n textTransform: 'uppercase',\n color: '#7aa2ff',\n textAlign: 'center',\n });\n hydraTitle.textContent = 'Fan-out \u00B7 investigating branches in parallel';\n const hydraGrid = document.createElement('div');\n hydraGrid.id = '__bad_overlay_hydra_grid';\n Object.assign(hydraGrid.style, {\n display: 'grid',\n gap: '16px',\n maxWidth: '1200px',\n maxHeight: '70vh',\n padding: '0 40px',\n });\n const hydraCounter = document.createElement('div');\n Object.assign(hydraCounter.style, {\n fontSize: '13px',\n color: '#e6ebf5',\n fontWeight: '600',\n textAlign: 'center',\n });\n hydra.appendChild(hydraTitle);\n hydra.appendChild(hydraGrid);\n hydra.appendChild(hydraCounter);\n\n // Append to documentElement (not body) so the overlay is not affected by\n // body's stacking context \u2014 many modern sites apply transform/will-change\n // to body which would clip a max-z-index child appended to body.\n // Bound the retry loop so a body-less doc (XML, PDF viewer, chrome://)\n // doesn't spin requestAnimationFrame forever.\n let attachAttempts = 0;\n function attach() {\n const host = document.documentElement || document.body;\n if (!host) {\n if (++attachAttempts > 60) return; // ~1 second of attempts\n requestAnimationFrame(attach);\n return;\n }\n host.appendChild(root);\n root.appendChild(progress);\n root.appendChild(progressLabel);\n root.appendChild(reasoning);\n root.appendChild(badges);\n root.appendChild(box);\n root.appendChild(ring);\n root.appendChild(cursor);\n root.appendChild(label);\n root.appendChild(hydra);\n }\n attach();\n\n // \u2500\u2500 Badge factory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const BADGE_COLORS = {\n positive: { fg: '#fb7185', bg: 'rgba(251,113,133,0.15)', border: 'rgba(251,113,133,0.5)' },\n cleared: { fg: '#4ade80', bg: 'rgba(74,222,128,0.15)', border: 'rgba(74,222,128,0.5)' },\n review: { fg: '#fbbf24', bg: 'rgba(251,191,36,0.15)', border: 'rgba(251,191,36,0.5)' },\n info: { fg: '#7aa2ff', bg: 'rgba(122,162,255,0.15)', border: 'rgba(122,162,255,0.5)' },\n };\n const MAX_BADGES = 6;\n\n function makeBadge(kind, text) {\n const palette = BADGE_COLORS[kind] || BADGE_COLORS.info;\n const el = document.createElement('div');\n Object.assign(el.style, {\n padding: '8px 14px',\n background: 'rgba(11, 18, 32, 0.92)',\n color: palette.fg,\n fontSize: '12px',\n fontWeight: '700',\n letterSpacing: '0.02em',\n borderRadius: '8px',\n border: '1px solid ' + palette.border,\n boxShadow: '0 4px 16px rgba(0,0,0,0.35), inset 0 0 0 9999px ' + palette.bg,\n animation: '__bad_badge_in 300ms cubic-bezier(0.34, 1.56, 0.64, 1) both',\n whiteSpace: 'nowrap',\n maxWidth: '480px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n });\n el.textContent = text;\n return el;\n }\n\n // \u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n window.__bad_overlay = {\n /**\n * Highlight a target element by CSS selector. Returns the rect or null.\n */\n highlight(selector) {\n try {\n const el = typeof selector === 'string'\n ? document.querySelector(selector)\n : null;\n if (!el) return null;\n const rect = el.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return null;\n Object.assign(box.style, {\n width: rect.width + 'px',\n height: rect.height + 'px',\n transform: `translate(${rect.left}px, ${rect.top}px)`,\n opacity: '1',\n });\n return { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2, width: rect.width, height: rect.height };\n } catch { return null; }\n },\n\n highlightRect(x, y, width, height) {\n try {\n Object.assign(box.style, {\n width: width + 'px',\n height: height + 'px',\n transform: `translate(${x}px, ${y}px)`,\n opacity: '1',\n });\n } catch { /* never let cosmetic overlay break a run */ }\n },\n\n moveTo(x, y, labelText) {\n cursor.style.transform = `translate(${x - 4}px, ${y - 4}px)`;\n if (labelText) {\n label.textContent = labelText;\n Object.assign(label.style, {\n transform: `translate(${x + 16}px, ${y + 16}px)`,\n opacity: '1',\n });\n }\n },\n\n pulseClick(x, y) {\n Object.assign(ring.style, {\n width: '0',\n height: '0',\n transform: `translate(${x}px, ${y}px)`,\n opacity: '1',\n });\n requestAnimationFrame(() => {\n Object.assign(ring.style, {\n width: '60px',\n height: '60px',\n transform: `translate(${x - 30}px, ${y - 30}px)`,\n opacity: '0',\n });\n });\n },\n\n /**\n * Show the agent's reasoning for the current turn. Multi-line text,\n * word-wrapped, in the top-right panel. Pass empty string or null to\n * hide the panel.\n */\n setReasoning(text) {\n try {\n const t = (text || '').trim();\n if (!t) {\n Object.assign(reasoning.style, { opacity: '0', transform: 'translateY(-6px)' });\n return;\n }\n reasoningBody.textContent = t;\n Object.assign(reasoning.style, { opacity: '1', transform: 'translateY(0)' });\n } catch { /* cosmetic */ }\n },\n\n /**\n * Update the progress strip: \"current\" of \"total\" actions done.\n * progressText is optional (e.g., \"Turn 27 \u00B7 C-003\").\n */\n setProgress(current, total, progressText) {\n try {\n const c = Math.max(0, Number(current) || 0);\n const tot = Math.max(1, Number(total) || 1);\n const pct = Math.min(100, (c / tot) * 100);\n progressFill.style.width = pct + '%';\n progress.style.opacity = '1';\n if (progressText) {\n progressLabel.textContent = progressText;\n progressLabel.style.opacity = '1';\n }\n } catch { /* cosmetic */ }\n },\n\n /**\n * Push a verdict badge onto the bottom-left stack. Auto-trims to the\n * most recent MAX_BADGES. kind is one of \"positive\" | \"cleared\" |\n * \"review\" | \"info\".\n */\n pushBadge(kind, text) {\n try {\n const el = makeBadge(kind, text);\n badges.appendChild(el);\n // Trim oldest if over cap (column-reverse means first child = bottom)\n while (badges.children.length > MAX_BADGES) {\n const first = badges.firstChild;\n if (!first) break;\n badges.removeChild(first);\n }\n } catch { /* cosmetic */ }\n },\n\n clearBadges() {\n try {\n while (badges.firstChild) badges.removeChild(badges.firstChild);\n } catch { /* cosmetic */ }\n },\n\n // \u2500\u2500 Fan-out overlay API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n /**\n * Begin a fan-out: render the dim overlay + grid of N labeled cells.\n * Cells start in \"queued\" state (empty). Call updateFanOutCell(i, ...)\n * as sub-agent screenshots stream in.\n *\n * labels: human-readable label per cell, one per sub-agent.\n * originX/originY: optional viewport coord where the fan-out was\n * initiated \u2014 cells burst outward from this point (default: center).\n */\n fanOutStart(labels, originX, originY) {\n try {\n const n = Math.max(1, Math.min(8, labels.length));\n // Layout: 1\u21921, 2\u21921x2, 3-4\u21922x2, 5-6\u21923x2, 7-8\u21924x2\n const cols = n === 1 ? 1 : n === 2 ? 2 : n <= 4 ? 2 : n <= 6 ? 3 : 4;\n const rows = Math.ceil(n / cols);\n hydraGrid.style.gridTemplateColumns = 'repeat(' + cols + ', 1fr)';\n hydraGrid.style.gridTemplateRows = 'repeat(' + rows + ', 1fr)';\n // Cell size: scale to fit. For a 1200x600 viewport budget:\n const cellW = Math.floor(1120 / cols) - 10;\n const cellH = Math.floor(Math.min(520 / rows, cellW * 0.7));\n // Clear prior cells\n while (hydraGrid.firstChild) hydraGrid.removeChild(hydraGrid.firstChild);\n const originPx = typeof originX === 'number' && typeof originY === 'number'\n ? { x: originX, y: originY }\n : { x: window.innerWidth / 2, y: window.innerHeight / 2 };\n for (let i = 0; i < n; i++) {\n const cell = document.createElement('div');\n cell.className = '__bad_hydra_cell';\n cell.dataset.index = String(i);\n Object.assign(cell.style, {\n position: 'relative',\n width: cellW + 'px',\n height: cellH + 'px',\n background: '#0b1220',\n backgroundSize: 'cover',\n backgroundPosition: 'center top',\n border: '2px solid rgba(122,162,255,0.55)',\n borderRadius: '10px',\n overflow: 'hidden',\n boxShadow: '0 10px 30px rgba(0,0,0,0.55), inset 0 0 0 1px rgba(122,162,255,0.2)',\n opacity: '0',\n transform: 'translate(' + (originPx.x - window.innerWidth / 2) + 'px, ' + (originPx.y - window.innerHeight / 2) + 'px) scale(0.15)',\n transition: 'transform 480ms cubic-bezier(0.34, 1.56, 0.64, 1), opacity 300ms ease, border-color 300ms ease, box-shadow 300ms ease',\n });\n // Header strip: label + live elapsed\n const header = document.createElement('div');\n Object.assign(header.style, {\n position: 'absolute',\n top: '0', left: '0', right: '0',\n padding: '6px 10px',\n background: 'linear-gradient(180deg, rgba(11,18,32,0.95) 0%, rgba(11,18,32,0.0) 100%)',\n color: '#e6ebf5',\n fontSize: '11px',\n fontWeight: '700',\n letterSpacing: '0.04em',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n });\n const headerLabel = document.createElement('span');\n headerLabel.textContent = labels[i] || ('branch-' + (i + 1));\n const headerTimer = document.createElement('span');\n headerTimer.className = '__bad_hydra_timer';\n headerTimer.style.cssText = 'font-family:SF Mono,Menlo,monospace;font-size:10px;color:#9aa3b8;font-weight:500;';\n headerTimer.textContent = '0.0s';\n header.appendChild(headerLabel);\n header.appendChild(headerTimer);\n cell.appendChild(header);\n // Verdict chip (hidden until complete)\n const chip = document.createElement('div');\n chip.className = '__bad_hydra_chip';\n Object.assign(chip.style, {\n position: 'absolute',\n bottom: '8px',\n left: '8px',\n padding: '3px 10px',\n background: 'rgba(11,18,32,0.92)',\n color: '#ffffff',\n fontSize: '10px',\n fontWeight: '700',\n letterSpacing: '0.05em',\n textTransform: 'uppercase',\n borderRadius: '6px',\n opacity: '0',\n transition: 'opacity 220ms ease',\n });\n cell.appendChild(chip);\n hydraGrid.appendChild(cell);\n }\n hydra.style.display = 'flex';\n hydraCounter.textContent = '0 / ' + n + ' branches complete';\n // Next frame: fade in + animate cells to their grid positions\n requestAnimationFrame(() => {\n hydra.style.opacity = '1';\n const cells = hydraGrid.children;\n for (let i = 0; i < cells.length; i++) {\n const c = cells[i];\n // Staggered burst: 0ms, 60ms, 120ms, ...\n setTimeout(function () {\n c.style.opacity = '1';\n c.style.transform = 'translate(0, 0) scale(1)';\n }, i * 60);\n }\n });\n // Start the elapsed-time ticker\n hydra.__tickerStart = Date.now();\n if (hydra.__ticker) clearInterval(hydra.__ticker);\n hydra.__ticker = setInterval(function () {\n const elapsed = (Date.now() - hydra.__tickerStart) / 1000;\n const cells = hydraGrid.children;\n for (let i = 0; i < cells.length; i++) {\n const cell = cells[i];\n if (cell.__completedAt) continue;\n const timer = cell.querySelector('.__bad_hydra_timer');\n if (timer) timer.textContent = elapsed.toFixed(1) + 's';\n }\n }, 100);\n } catch { /* cosmetic */ }\n },\n\n /**\n * Update cell N with a fresh screenshot (data URL) and/or metadata.\n * Call this at 2-5 FPS from the runner's screenshot streamer.\n * meta: { action?: string, turn?: number }\n */\n fanOutUpdateCell(index, dataUrl, meta) {\n try {\n const cell = hydraGrid.children[index];\n if (!cell) return;\n if (dataUrl) {\n cell.style.backgroundImage = 'url(\"' + dataUrl + '\")';\n }\n // eslint-disable-next-line no-empty\n if (meta) { /* reserved for future overlays inside the cell */ }\n } catch { /* cosmetic */ }\n },\n\n /**\n * Mark cell N as complete with a verdict. kind is one of\n * 'positive' | 'cleared' | 'review' | 'info'. Final state: border\n * recolors, chip fades in, timer freezes.\n */\n fanOutCompleteCell(index, kind, verdictText) {\n try {\n const cell = hydraGrid.children[index];\n if (!cell) return;\n cell.__completedAt = Date.now();\n const palette = (kind === 'positive' ? { c: '#fb7185', bg: 'rgba(251,113,133,0.25)' }\n : kind === 'cleared' ? { c: '#4ade80', bg: 'rgba(74,222,128,0.25)' }\n : kind === 'review' ? { c: '#fbbf24', bg: 'rgba(251,191,36,0.25)' }\n : { c: '#7aa2ff', bg: 'rgba(122,162,255,0.25)' });\n cell.style.borderColor = palette.c;\n cell.style.boxShadow = '0 10px 30px rgba(0,0,0,0.55), inset 0 0 0 1px ' + palette.c + ', 0 0 24px ' + palette.bg;\n const chip = cell.querySelector('.__bad_hydra_chip');\n if (chip) {\n chip.style.background = palette.bg;\n chip.style.color = palette.c;\n chip.style.border = '1px solid ' + palette.c;\n chip.textContent = (verdictText || kind).slice(0, 32);\n chip.style.opacity = '1';\n }\n // Update global counter\n const total = hydraGrid.children.length;\n let done = 0;\n for (let i = 0; i < total; i++) if (hydraGrid.children[i].__completedAt) done++;\n hydraCounter.textContent = done + ' / ' + total + ' branches complete';\n } catch { /* cosmetic */ }\n },\n\n /**\n * Collapse the grid: cells fly inward to center, merge into a result\n * tile, then dissolve. Returns after ~800ms when the animation is\n * done (but does NOT hide the overlay \u2014 caller invokes fanOutDismiss).\n */\n fanOutCollapse() {\n try {\n if (hydra.__ticker) { clearInterval(hydra.__ticker); hydra.__ticker = null; }\n const cells = hydraGrid.children;\n const cx = window.innerWidth / 2;\n const cy = window.innerHeight / 2;\n for (let i = 0; i < cells.length; i++) {\n const c = cells[i];\n const rect = c.getBoundingClientRect();\n const dx = cx - (rect.left + rect.width / 2);\n const dy = cy - (rect.top + rect.height / 2);\n c.style.transition = 'transform 520ms cubic-bezier(0.6, 0, 0.4, 1), opacity 400ms ease';\n c.style.transform = 'translate(' + dx + 'px, ' + dy + 'px) scale(0.2)';\n c.style.opacity = '0';\n }\n hydraTitle.style.transition = 'opacity 400ms ease';\n hydraCounter.style.transition = 'opacity 400ms ease';\n setTimeout(function () { hydraTitle.style.opacity = '0'; hydraCounter.style.opacity = '0'; }, 200);\n } catch { /* cosmetic */ }\n },\n\n /**\n * Hide the Hydra overlay entirely. Call after fanOutCollapse has\n * finished + the parent agent has resumed.\n */\n fanOutDismiss() {\n try {\n hydra.style.opacity = '0';\n setTimeout(function () {\n hydra.style.display = 'none';\n hydraTitle.style.opacity = '1';\n hydraCounter.style.opacity = '1';\n while (hydraGrid.firstChild) hydraGrid.removeChild(hydraGrid.firstChild);\n if (hydra.__ticker) { clearInterval(hydra.__ticker); hydra.__ticker = null; }\n }, 400);\n } catch { /* cosmetic */ }\n },\n\n hide() {\n box.style.opacity = '0';\n label.style.opacity = '0';\n ring.style.opacity = '0';\n },\n\n clearHighlight() {\n box.style.opacity = '0';\n },\n };\n})();\n";
29
29
  //# sourceMappingURL=cursor-overlay.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cursor-overlay.d.ts","sourceRoot":"","sources":["../../src/drivers/cursor-overlay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH;;;GAGG;AACH,eAAO,MAAM,0BAA0B,uh1BA4pBtC,CAAA"}
1
+ {"version":3,"file":"cursor-overlay.d.ts","sourceRoot":"","sources":["../../src/drivers/cursor-overlay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH;;;GAGG;AACH,eAAO,MAAM,0BAA0B,0l1BA4pBtC,CAAA"}
@@ -240,7 +240,7 @@ export const CURSOR_OVERLAY_INIT_SCRIPT = `
240
240
  overflow: 'hidden',
241
241
  });
242
242
 
243
- // ── Gen 34 Hydra View fan-out grid (live thumbnails of sub-tabs) ─────
243
+ // ── Fan-out view — live thumbnails of sub-tabs ──────────────────────
244
244
  // Full-viewport dim overlay + grid of live sub-tab screenshot cells.
245
245
  // Cells lay out based on count: 1→1, 2→1x2, 3-4→2x2, 5-6→2x3, 7-8→2x4.
246
246
  // Each cell background updates via updateFanOutCell(i, dataUrl, meta).
@@ -469,7 +469,7 @@ export const CURSOR_OVERLAY_INIT_SCRIPT = `
469
469
  } catch { /* cosmetic */ }
470
470
  },
471
471
 
472
- // ── Gen 34 Hydra API ─────────────────────────────────────────────
472
+ // ── Fan-out overlay API ──────────────────────────────────────────
473
473
  /**
474
474
  * Begin a fan-out: render the dim overlay + grid of N labeled cells.
475
475
  * Cells start in "queued" state (empty). Call updateFanOutCell(i, ...)
@@ -1,17 +1,14 @@
1
1
  /**
2
- * Gen 10 — extractWithIndex implementation.
2
+ * extractWithIndex implementation.
3
3
  *
4
4
  * Runs in page context via page.evaluate() and returns a numbered list of
5
5
  * every visible element matching `query`, each with its tag, textContent,
6
6
  * key attributes, and a stable selector. The agent picks elements by index
7
7
  * in the next turn.
8
8
  *
9
- * Why this is the Gen 10 capability fix: rather than asking the LLM to
10
- * write a precise CSS selector that returns exactly one element (the
11
- * approach that fails on real-web pages where data lives in obscurely-classed
12
- * wrapper divs or `<dl>/<dt>/<dd>` blocks), the LLM emits a wide query and
13
- * READS the actual text content of every match. Pick-by-content beats
14
- * pick-by-selector on every failing task in the Gen 8 gauntlet.
9
+ * The model emits a broad query and reads the actual text content of every
10
+ * match, which is more reliable than precise selectors for pages where data
11
+ * lives in obscure wrappers or `<dl>/<dt>/<dd>` blocks.
15
12
  */
16
13
  import type { Page } from 'playwright';
17
14
  export interface ExtractMatch {
@@ -1 +1 @@
1
- {"version":3,"file":"extract-with-index.d.ts","sourceRoot":"","sources":["../../src/drivers/extract-with-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,WAAW,YAAY;IAC3B,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAOD;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,EAAE,CAAC,CAsFzB;AAED;;;;;;;;GAQG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,YAAY,EAAE,EACvB,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAmBR"}
1
+ {"version":3,"file":"extract-with-index.d.ts","sourceRoot":"","sources":["../../src/drivers/extract-with-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,WAAW,YAAY;IAC3B,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAOD;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,EAAE,CAAC,CAsFzB;AAED;;;;;;;;GAQG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,YAAY,EAAE,EACvB,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAmBR"}
@@ -1,17 +1,14 @@
1
1
  /**
2
- * Gen 10 — extractWithIndex implementation.
2
+ * extractWithIndex implementation.
3
3
  *
4
4
  * Runs in page context via page.evaluate() and returns a numbered list of
5
5
  * every visible element matching `query`, each with its tag, textContent,
6
6
  * key attributes, and a stable selector. The agent picks elements by index
7
7
  * in the next turn.
8
8
  *
9
- * Why this is the Gen 10 capability fix: rather than asking the LLM to
10
- * write a precise CSS selector that returns exactly one element (the
11
- * approach that fails on real-web pages where data lives in obscurely-classed
12
- * wrapper divs or `<dl>/<dt>/<dd>` blocks), the LLM emits a wide query and
13
- * READS the actual text content of every match. Pick-by-content beats
14
- * pick-by-selector on every failing task in the Gen 8 gauntlet.
9
+ * The model emits a broad query and reads the actual text content of every
10
+ * match, which is more reliable than precise selectors for pages where data
11
+ * lives in obscure wrappers or `<dl>/<dt>/<dd>` blocks.
15
12
  */
16
13
  /** Hard cap on matches returned per call. Prevents 800-element pages from blowing the response. */
17
14
  const MAX_MATCHES = 80;
@@ -1 +1 @@
1
- {"version":3,"file":"extract-with-index.js","sourceRoot":"","sources":["../../src/drivers/extract-with-index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"extract-with-index.js","sourceRoot":"","sources":["../../src/drivers/extract-with-index.ts"],"names":[],"mappings":"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"}
@@ -6,10 +6,9 @@
6
6
  * anyone watching a recorded video — it needs to read like a human
7
7
  * narrator, not like a debug log.
8
8
  *
9
- * Gen 34 rewrite: natural-English sentences.
10
- *
11
- * Before: `type "JOHN SMITH" · Last Name: insert criteria`
12
- * After: `Typing "JOHN SMITH" into Last Name`
9
+ * Examples:
10
+ * `type "JOHN SMITH" · Last Name: insert criteria` becomes
11
+ * `Typing "JOHN SMITH" into Last Name`
13
12
  *
14
13
  * Design rules:
15
14
  * - Labels MUST fit on one line at ~13px. Target max 56 chars rendered.
@@ -1 +1 @@
1
- {"version":3,"file":"overlay-label.d.ts","sourceRoot":"","sources":["../../src/drivers/overlay-label.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AA+HzC,MAAM,WAAW,mBAAmB;IAClC,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,GAAE,mBAAwB,GAAG,MAAM,CAsCxF"}
1
+ {"version":3,"file":"overlay-label.d.ts","sourceRoot":"","sources":["../../src/drivers/overlay-label.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AA+HzC,MAAM,WAAW,mBAAmB;IAClC,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,GAAE,mBAAwB,GAAG,MAAM,CAsCxF"}
@@ -1 +1 @@
1
- {"version":3,"file":"overlay-label.js","sourceRoot":"","sources":["../../src/drivers/overlay-label.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"overlay-label.js","sourceRoot":"","sources":["../../src/drivers/overlay-label.ts"],"names":[],"mappings":"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"}
@@ -56,7 +56,7 @@ export interface PlaywrightDriverOptions {
56
56
  * screenshot lands wherever the transition has reached by then.
57
57
  */
58
58
  showCursor?: boolean;
59
- /** Gen 29: registry of user-defined macros the agent can invoke via
59
+ /** Registry of user-defined macros the agent can invoke via
60
60
  * `{action:"macro", name:..., args:...}`. When omitted, macro calls fail
61
61
  * with an error message referencing the missing name. */
62
62
  macros?: MacroRegistry;
@@ -75,7 +75,7 @@ export declare class PlaywrightDriver implements Driver {
75
75
  * the init script. Undefined if showCursor is off.
76
76
  */
77
77
  private cursorInstallPromise?;
78
- /** Gen 23: SoM element map from last observe — used to resolve clickLabel/typeLabel */
78
+ /** SoM element map from last observe — used to resolve clickLabel/typeLabel */
79
79
  private somElements;
80
80
  constructor(page: Page, options?: PlaywrightDriverOptions);
81
81
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"playwright.d.ts","sourceRoot":"","sources":["../../src/drivers/playwright.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"playwright.d.ts","sourceRoot":"","sources":["../../src/drivers/playwright.ts"],"names":[],"mappings":"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"}
@@ -81,9 +81,7 @@ async function humanMouseMove(page, targetX, targetY) {
81
81
  }
82
82
  }
83
83
  }
84
- // Gen 13: Virtual screen dimensions for vision-first coordinate actions.
85
- // Claude's computer-use training uses 1024x768. Screenshots are resized to
86
- // this before being sent, and coordinate outputs are in this space.
84
+ // Virtual screen dimensions for vision-first coordinate actions.
87
85
  const VIRTUAL_SCREEN = { width: 1024, height: 768 };
88
86
  export class PlaywrightDriver {
89
87
  page;
@@ -99,7 +97,7 @@ export class PlaywrightDriver {
99
97
  * the init script. Undefined if showCursor is off.
100
98
  */
101
99
  cursorInstallPromise;
102
- /** Gen 23: SoM element map from last observe — used to resolve clickLabel/typeLabel */
100
+ /** SoM element map from last observe — used to resolve clickLabel/typeLabel */
103
101
  somElements = [];
104
102
  constructor(page, options = {}) {
105
103
  this.page = page;
@@ -300,7 +298,7 @@ export class PlaywrightDriver {
300
298
  async pushOverlayBadge(kind, text) {
301
299
  await this.callOverlay('pushBadge', [kind, text]);
302
300
  }
303
- // ── Gen 34 Hydra API ───────────────────────────────────────────────
301
+ // ── Fan-out overlay API ────────────────────────────────────────────
304
302
  /** Start the fan-out overlay: dim backdrop + grid of N labeled cells. */
305
303
  async fanOutStart(labels) {
306
304
  await this.callOverlay('fanOutStart', [labels.slice(0, 8)]);
@@ -473,8 +471,7 @@ export class PlaywrightDriver {
473
471
  snapshotText += `\n [data-testid="${el.testId}"] ${el.tag}${text}${disabled}`;
474
472
  }
475
473
  }
476
- // Gen 23: SoM overlay inject numbered labels, screenshot, remove.
477
- // Only when visionStrategy is 'always' (vision/hybrid mode).
474
+ // SoM overlay: inject numbered labels, screenshot, remove.
478
475
  const useSom = captureScreenshot && this.options.visionStrategy === 'always';
479
476
  if (useSom) {
480
477
  try {
@@ -739,11 +736,7 @@ export class PlaywrightDriver {
739
736
  return { success: true, error: undefined, data: stringified };
740
737
  }
741
738
  case 'extractWithIndex': {
742
- // Gen 10: numbered DOM-index extraction. Returns the formatted match
743
- // list as `data` so executePlan can capture it like runScript does.
744
- // The per-action loop has its own intercept (runner.ts) so this
745
- // path is only hit when extractWithIndex appears in a planner-
746
- // emitted Plan step.
739
+ // Numbered DOM-index extraction for planner-emitted plan steps.
747
740
  const matches = await runExtractWithIndex(this.page, action.query, action.contains);
748
741
  const formatted = formatExtractWithIndexResult(matches, action.query, action.contains);
749
742
  return { success: true, error: undefined, data: formatted };
@@ -796,9 +789,7 @@ export class PlaywrightDriver {
796
789
  el.dispatchEvent(new Event('change', { bubbles: true }));
797
790
  });
798
791
  });
799
- // Gen 27: settle delay between fields. Complex forms (Google
800
- // Flights, Booking) use framework-managed state that needs time
801
- // to process each field before the next one is filled.
792
+ // Settle delay between fields lets framework-managed form state process.
802
793
  if (fi < fieldEntries.length - 1) {
803
794
  await this.page.waitForTimeout(150);
804
795
  }
@@ -834,9 +825,7 @@ export class PlaywrightDriver {
834
825
  return { success: false, error: `fill check ${ref}: ${message}` };
835
826
  }
836
827
  }
837
- // Gen 27: post-fill verification. Read back field values to detect
838
- // silent form resets (e.g., Google Flights wiping fields on state change).
839
- // Report mismatches so the agent can switch to keyboard-only filling.
828
+ // Post-fill verification reads field values to detect silent resets.
840
829
  if (fieldEntries.length > 0) {
841
830
  await this.page.waitForTimeout(200); // let framework settle
842
831
  const mismatches = [];
@@ -925,7 +914,7 @@ export class PlaywrightDriver {
925
914
  }
926
915
  return { success: true, ...(lastBounds ? { bounds: lastBounds } : {}) };
927
916
  }
928
- // Gen 13: Vision-first coordinate-based actions.
917
+ // Vision-first coordinate-based actions.
929
918
  // Bounds use a 40×40 box centered on the click point so the
930
919
  // bad-app ClickOverlay renders a visible highlight + ripple.
931
920
  case 'clickAt': {
@@ -947,7 +936,7 @@ export class PlaywrightDriver {
947
936
  await this.page.keyboard.type(action.text);
948
937
  return { success: true, bounds: { x: actualX - 20, y: actualY - 20, width: 40, height: 40 } };
949
938
  }
950
- // Gen 23: SoM label-based actions — resolve label → element center → click
939
+ // SoM label-based actions — resolve label → element center → click.
951
940
  case 'clickLabel': {
952
941
  const el = this.somElements.find(e => e.label === action.label);
953
942
  if (!el)
@@ -967,10 +956,7 @@ export class PlaywrightDriver {
967
956
  return { success: true, bounds: { x: el.x, y: el.y, width: el.width, height: el.height } };
968
957
  }
969
958
  case 'macro': {
970
- // Gen 29: expand a named macro into its composed safe-primitive
971
- // steps and execute each via this.execute. Flat-only (the loader
972
- // forbids macro-in-macro), so recursion depth is bounded at 1.
973
- // A step failure short-circuits the macro with a contextual error.
959
+ // Expand a named macro into safe primitive steps and execute them.
974
960
  const registry = this.options.macros;
975
961
  if (!registry) {
976
962
  return { success: false, error: `No macro registry loaded; cannot invoke "${action.name}"` };