cli-jaw 2.2.2 → 2.2.3

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 (240) hide show
  1. package/README.ja.md +13 -9
  2. package/README.ko.md +5 -5
  3. package/README.md +7 -6
  4. package/README.zh-CN.md +5 -5
  5. package/dist/bin/commands/goal.js +14 -1
  6. package/dist/bin/commands/goal.js.map +1 -1
  7. package/dist/src/agent/agy-bootstrap.js +104 -0
  8. package/dist/src/agent/agy-bootstrap.js.map +1 -0
  9. package/dist/src/agent/agy-capabilities.js +103 -0
  10. package/dist/src/agent/agy-capabilities.js.map +1 -0
  11. package/dist/src/agent/agy-transcript-watcher.js +11 -0
  12. package/dist/src/agent/agy-transcript-watcher.js.map +1 -1
  13. package/dist/src/agent/args.js +32 -13
  14. package/dist/src/agent/args.js.map +1 -1
  15. package/dist/src/agent/events/claude.js +8 -4
  16. package/dist/src/agent/events/claude.js.map +1 -1
  17. package/dist/src/agent/events/helpers.js +13 -0
  18. package/dist/src/agent/events/helpers.js.map +1 -1
  19. package/dist/src/agent/events/index.js +24 -4
  20. package/dist/src/agent/events/index.js.map +1 -1
  21. package/dist/src/agent/lifecycle-handler.js +25 -4
  22. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  23. package/dist/src/agent/spawn/queue.js +11 -5
  24. package/dist/src/agent/spawn/queue.js.map +1 -1
  25. package/dist/src/agent/spawn.js +49 -13
  26. package/dist/src/agent/spawn.js.map +1 -1
  27. package/dist/src/browser/web-ai/ax-snapshot.js +131 -8
  28. package/dist/src/browser/web-ai/ax-snapshot.js.map +1 -1
  29. package/dist/src/browser/web-ai/candidate-reconcile.js +61 -0
  30. package/dist/src/browser/web-ai/candidate-reconcile.js.map +1 -0
  31. package/dist/src/browser/web-ai/capability-probe.js +92 -0
  32. package/dist/src/browser/web-ai/capability-probe.js.map +1 -0
  33. package/dist/src/browser/web-ai/chatgpt-archive.js +90 -0
  34. package/dist/src/browser/web-ai/chatgpt-archive.js.map +1 -0
  35. package/dist/src/browser/web-ai/chatgpt-attachments.js +70 -3
  36. package/dist/src/browser/web-ai/chatgpt-attachments.js.map +1 -1
  37. package/dist/src/browser/web-ai/chatgpt-composer.js +97 -11
  38. package/dist/src/browser/web-ai/chatgpt-composer.js.map +1 -1
  39. package/dist/src/browser/web-ai/chatgpt-deep-research-report.js +63 -0
  40. package/dist/src/browser/web-ai/chatgpt-deep-research-report.js.map +1 -0
  41. package/dist/src/browser/web-ai/chatgpt-deep-research.js +76 -13
  42. package/dist/src/browser/web-ai/chatgpt-deep-research.js.map +1 -1
  43. package/dist/src/browser/web-ai/chatgpt-files.js +328 -0
  44. package/dist/src/browser/web-ai/chatgpt-files.js.map +1 -0
  45. package/dist/src/browser/web-ai/chatgpt-images.js +281 -0
  46. package/dist/src/browser/web-ai/chatgpt-images.js.map +1 -0
  47. package/dist/src/browser/web-ai/chatgpt-model.js +35 -14
  48. package/dist/src/browser/web-ai/chatgpt-model.js.map +1 -1
  49. package/dist/src/browser/web-ai/chatgpt-multi-turn.js +28 -4
  50. package/dist/src/browser/web-ai/chatgpt-multi-turn.js.map +1 -1
  51. package/dist/src/browser/web-ai/chatgpt-project-sources.js +191 -0
  52. package/dist/src/browser/web-ai/chatgpt-project-sources.js.map +1 -0
  53. package/dist/src/browser/web-ai/chatgpt-response-dom.js +64 -0
  54. package/dist/src/browser/web-ai/chatgpt-response-dom.js.map +1 -0
  55. package/dist/src/browser/web-ai/chatgpt-response-observer.js +170 -0
  56. package/dist/src/browser/web-ai/chatgpt-response-observer.js.map +1 -0
  57. package/dist/src/browser/web-ai/chatgpt-response.js +99 -60
  58. package/dist/src/browser/web-ai/chatgpt-response.js.map +1 -1
  59. package/dist/src/browser/web-ai/chatgpt-tools.js +48 -1
  60. package/dist/src/browser/web-ai/chatgpt-tools.js.map +1 -1
  61. package/dist/src/browser/web-ai/chatgpt-upload-surface.js +202 -0
  62. package/dist/src/browser/web-ai/chatgpt-upload-surface.js.map +1 -0
  63. package/dist/src/browser/web-ai/chatgpt.js +93 -12
  64. package/dist/src/browser/web-ai/chatgpt.js.map +1 -1
  65. package/dist/src/browser/web-ai/code-artifact.js +32 -10
  66. package/dist/src/browser/web-ai/code-artifact.js.map +1 -1
  67. package/dist/src/browser/web-ai/code-mode.js +40 -4
  68. package/dist/src/browser/web-ai/code-mode.js.map +1 -1
  69. package/dist/src/browser/web-ai/contract-audit.js +7 -22
  70. package/dist/src/browser/web-ai/contract-audit.js.map +1 -1
  71. package/dist/src/browser/web-ai/control-summary.js +43 -0
  72. package/dist/src/browser/web-ai/control-summary.js.map +1 -0
  73. package/dist/src/browser/web-ai/copy-markdown.js +10 -0
  74. package/dist/src/browser/web-ai/copy-markdown.js.map +1 -1
  75. package/dist/src/browser/web-ai/diagnostics.js +7 -0
  76. package/dist/src/browser/web-ai/diagnostics.js.map +1 -1
  77. package/dist/src/browser/web-ai/errors.js +17 -0
  78. package/dist/src/browser/web-ai/errors.js.map +1 -1
  79. package/dist/src/browser/web-ai/gemini-capabilities.js +46 -0
  80. package/dist/src/browser/web-ai/gemini-capabilities.js.map +1 -0
  81. package/dist/src/browser/web-ai/gemini-live.js +6 -0
  82. package/dist/src/browser/web-ai/gemini-live.js.map +1 -1
  83. package/dist/src/browser/web-ai/gemini-model.js +41 -0
  84. package/dist/src/browser/web-ai/gemini-model.js.map +1 -1
  85. package/dist/src/browser/web-ai/grok-capabilities.js +41 -0
  86. package/dist/src/browser/web-ai/grok-capabilities.js.map +1 -0
  87. package/dist/src/browser/web-ai/grok-live.js +5 -0
  88. package/dist/src/browser/web-ai/grok-live.js.map +1 -1
  89. package/dist/src/browser/web-ai/grok-model.js +38 -0
  90. package/dist/src/browser/web-ai/grok-model.js.map +1 -1
  91. package/dist/src/browser/web-ai/index.js +10 -0
  92. package/dist/src/browser/web-ai/index.js.map +1 -1
  93. package/dist/src/browser/web-ai/navigation-ready.js +123 -0
  94. package/dist/src/browser/web-ai/navigation-ready.js.map +1 -0
  95. package/dist/src/browser/web-ai/observation-bundle.js +26 -1
  96. package/dist/src/browser/web-ai/observation-bundle.js.map +1 -1
  97. package/dist/src/browser/web-ai/provider-adapter.js.map +1 -1
  98. package/dist/src/browser/web-ai/session-artifacts.js +156 -0
  99. package/dist/src/browser/web-ai/session-artifacts.js.map +1 -0
  100. package/dist/src/browser/web-ai/session-doctor.js +101 -0
  101. package/dist/src/browser/web-ai/session-doctor.js.map +1 -0
  102. package/dist/src/browser/web-ai/session-store.js +94 -17
  103. package/dist/src/browser/web-ai/session-store.js.map +1 -1
  104. package/dist/src/browser/web-ai/session.js +73 -0
  105. package/dist/src/browser/web-ai/session.js.map +1 -1
  106. package/dist/src/browser/web-ai/tab-inspect.js +143 -0
  107. package/dist/src/browser/web-ai/tab-inspect.js.map +1 -0
  108. package/dist/src/browser/web-ai/tab-lease-store.js +114 -4
  109. package/dist/src/browser/web-ai/tab-lease-store.js.map +1 -1
  110. package/dist/src/browser/web-ai/tier-timeout.js +58 -0
  111. package/dist/src/browser/web-ai/tier-timeout.js.map +1 -0
  112. package/dist/src/browser/web-ai/vendor-editor-contract.js +6 -3
  113. package/dist/src/browser/web-ai/vendor-editor-contract.js.map +1 -1
  114. package/dist/src/browser/web-ai/watcher-lock.js +125 -0
  115. package/dist/src/browser/web-ai/watcher-lock.js.map +1 -0
  116. package/dist/src/browser/web-ai/watcher.js +23 -4
  117. package/dist/src/browser/web-ai/watcher.js.map +1 -1
  118. package/dist/src/cli/handlers-workflows.js +14 -3
  119. package/dist/src/cli/handlers-workflows.js.map +1 -1
  120. package/dist/src/core/cli-detection.js +2 -3
  121. package/dist/src/core/cli-detection.js.map +1 -1
  122. package/dist/src/core/settings-merge.js +2 -2
  123. package/dist/src/core/settings-merge.js.map +1 -1
  124. package/dist/src/goal/heartbeat.js +13 -7
  125. package/dist/src/goal/heartbeat.js.map +1 -1
  126. package/dist/src/goal/pause-gate.js +22 -0
  127. package/dist/src/goal/pause-gate.js.map +1 -0
  128. package/dist/src/goal/store.js +5 -0
  129. package/dist/src/goal/store.js.map +1 -1
  130. package/dist/src/manager/lifecycle.js +2 -1
  131. package/dist/src/manager/lifecycle.js.map +1 -1
  132. package/dist/src/manager/preview-origin-proxy.js +36 -6
  133. package/dist/src/manager/preview-origin-proxy.js.map +1 -1
  134. package/dist/src/manager/proxy.js +25 -4
  135. package/dist/src/manager/proxy.js.map +1 -1
  136. package/dist/src/manager/registry.js +36 -3
  137. package/dist/src/manager/registry.js.map +1 -1
  138. package/dist/src/manager/routes/runtime-monitor.js +2 -0
  139. package/dist/src/manager/routes/runtime-monitor.js.map +1 -1
  140. package/dist/src/manager/routes/telegram-hub.js +120 -0
  141. package/dist/src/manager/routes/telegram-hub.js.map +1 -0
  142. package/dist/src/manager/server.js +4 -0
  143. package/dist/src/manager/server.js.map +1 -1
  144. package/dist/src/manager/telegram-hub/hub-bot.js +409 -0
  145. package/dist/src/manager/telegram-hub/hub-bot.js.map +1 -0
  146. package/dist/src/manager/telegram-hub/routing-store.js +24 -0
  147. package/dist/src/manager/telegram-hub/routing-store.js.map +1 -0
  148. package/dist/src/manager/telegram-hub/types.js +5 -0
  149. package/dist/src/manager/telegram-hub/types.js.map +1 -0
  150. package/dist/src/messaging/thread-target.js +21 -0
  151. package/dist/src/messaging/thread-target.js.map +1 -0
  152. package/dist/src/orchestrator/gateway.js +10 -7
  153. package/dist/src/orchestrator/gateway.js.map +1 -1
  154. package/dist/src/orchestrator/pipeline.js +19 -0
  155. package/dist/src/orchestrator/pipeline.js.map +1 -1
  156. package/dist/src/orchestrator/worker-registry.js.map +1 -1
  157. package/dist/src/routes/command.js +58 -2
  158. package/dist/src/routes/command.js.map +1 -1
  159. package/dist/src/routes/goal.js +6 -3
  160. package/dist/src/routes/goal.js.map +1 -1
  161. package/dist/src/routes/messaging.js +7 -2
  162. package/dist/src/routes/messaging.js.map +1 -1
  163. package/dist/src/routes/orchestrate.js +2 -0
  164. package/dist/src/routes/orchestrate.js.map +1 -1
  165. package/dist/src/telegram/bot.js +59 -4
  166. package/dist/src/telegram/bot.js.map +1 -1
  167. package/dist/src/telegram/forwarder.js +4 -1
  168. package/dist/src/telegram/forwarder.js.map +1 -1
  169. package/dist/src/telegram/hub-callback.js +21 -0
  170. package/dist/src/telegram/hub-callback.js.map +1 -0
  171. package/dist/src/telegram/rich-message.js +20 -0
  172. package/dist/src/telegram/rich-message.js.map +1 -0
  173. package/dist/src/telegram/telegram-file.js +4 -3
  174. package/dist/src/telegram/telegram-file.js.map +1 -1
  175. package/dist/src/workflows/status.js +14 -4
  176. package/dist/src/workflows/status.js.map +1 -1
  177. package/package.json +5 -5
  178. package/public/dist/assets/{Agent-wJtedbz4.js → Agent-Ci12HWhE.js} +1 -1
  179. package/public/dist/assets/{Heartbeat-CjgQ-0p8.js → Heartbeat-D-Rfp094.js} +1 -1
  180. package/public/dist/assets/{Memory-6o-wyhAT.js → Memory-VH4ZJCMW.js} +1 -1
  181. package/public/dist/assets/ModelProvider-_tUCghOF.js +1 -0
  182. package/public/dist/assets/TelegramHub-CuJoPPib.js +1 -0
  183. package/public/dist/assets/{agent-meta-g8UDRdWA.js → agent-meta-DqBTGRRQ.js} +1 -1
  184. package/public/dist/assets/{app-CLrfEHAk.js → app-DaORcAyD.js} +4 -4
  185. package/public/dist/assets/bgtask-badge-B3HLOZae.js +1 -0
  186. package/public/dist/assets/{bgtask-badge-xWbw-l-0.js → bgtask-badge-BtUXEe1T.js} +1 -1
  187. package/public/dist/assets/constants-DkJ3E63Y.js +1 -0
  188. package/public/dist/assets/{employees-C5GPj3d3.js → employees-CZSyvJbx.js} +1 -1
  189. package/public/dist/assets/manager-D3waO_XX.css +1 -0
  190. package/public/dist/assets/manager-DB5qTw1A.js +13 -0
  191. package/public/dist/assets/memory-BEruUlfu.js +1 -0
  192. package/public/dist/assets/{memory-CcnjBuo-.js → memory-cWI_Htbn.js} +1 -1
  193. package/public/dist/assets/message-history-DU1V9ZAW.js +142 -0
  194. package/public/dist/assets/message-history-tjkyOp_K.js +1 -0
  195. package/public/dist/assets/{render-C2g_qvCg.js → render-Bp8eyqCf.js} +1 -1
  196. package/public/dist/assets/settings-B-GgyJZI.js +1 -0
  197. package/public/dist/assets/{settings-DxClXVD0.js → settings-DLkP7qRV.js} +1 -1
  198. package/public/dist/assets/{settings-core-CSUV4-QG.js → settings-core-B5XRRNcX.js} +1 -1
  199. package/public/dist/assets/settings-core-Cw1av-Ox.js +1 -0
  200. package/public/dist/assets/{sidebar-CJz_SnMW.js → sidebar-CsogFOse.js} +3 -3
  201. package/public/dist/assets/skills-CLcoop6W.js +1 -0
  202. package/public/dist/assets/{skills-PKg2h1N4.js → skills-Dmf4v9rj.js} +1 -1
  203. package/public/dist/assets/slash-commands-DY6-hzq6.js +1 -0
  204. package/public/dist/assets/{slash-commands-FMOOfedZ.js → slash-commands-vcf7FuPD.js} +1 -1
  205. package/public/dist/assets/{trace-drawer-BoU1ucw7.js → trace-drawer-DuQQ0SNq.js} +1 -1
  206. package/public/dist/assets/{ui-BX-IfLze.js → ui-BKYuBdZE.js} +1 -1
  207. package/public/dist/assets/ui-CqlGwgUo.js +1 -0
  208. package/public/dist/index.html +1 -1
  209. package/public/dist/manager/index.html +2 -2
  210. package/public/js/constants.ts +2 -3
  211. package/public/js/features/process-block.ts +61 -9
  212. package/public/manager/src/code/code-composer.css +1 -0
  213. package/public/manager/src/code/code.css +7 -2
  214. package/public/manager/src/dashboard-settings/DashboardSettingsSidebar.tsx +6 -2
  215. package/public/manager/src/dashboard-settings/DashboardSettingsWorkspace.tsx +91 -2
  216. package/public/manager/src/goal-status/GoalPabcdStatusPanel.tsx +9 -1
  217. package/public/manager/src/goal-status/goal-pabcd-status-client.ts +9 -0
  218. package/public/manager/src/settings/SettingsShell.tsx +1 -0
  219. package/public/manager/src/settings/SettingsSidebar.tsx +1 -0
  220. package/public/manager/src/settings/pages/TelegramHub.tsx +179 -0
  221. package/public/manager/src/settings/pages/components/PerCliRow.tsx +23 -13
  222. package/public/manager/src/settings/pages/components/agent/agent-meta.ts +3 -1
  223. package/public/manager/src/settings/types.ts +1 -0
  224. package/public/manager/src/settings-shell.css +11 -0
  225. package/public/sw.js +1 -1
  226. package/scripts/bundle-sidecar.sh +6 -1
  227. package/public/dist/assets/ModelProvider-CNu6WOjM.js +0 -1
  228. package/public/dist/assets/bgtask-badge-4OjtCvDq.js +0 -1
  229. package/public/dist/assets/constants-CCiCctGV.js +0 -1
  230. package/public/dist/assets/manager-Ceg2x8D0.js +0 -13
  231. package/public/dist/assets/manager-CwAlpgV7.css +0 -1
  232. package/public/dist/assets/memory-B1beDKbo.js +0 -1
  233. package/public/dist/assets/message-history-BSWJwi__.js +0 -142
  234. package/public/dist/assets/message-history-CzaziSe8.js +0 -1
  235. package/public/dist/assets/settings-Dst1mUjn.js +0 -1
  236. package/public/dist/assets/settings-core-BW5mtFPE.js +0 -1
  237. package/public/dist/assets/skills-B2io6S_4.js +0 -1
  238. package/public/dist/assets/slash-commands-D1IS00Eg.js +0 -1
  239. package/public/dist/assets/ui-C-al0etg.js +0 -1
  240. /package/public/dist/assets/{TerminalPanel-B7WRXPsE.js → TerminalPanel-DSCJeGjp.js} +0 -0
@@ -47,20 +47,26 @@ export function extractInteractiveRefs(snapshot, prefix = '@e') {
47
47
  return { ...snapshot.refs };
48
48
  }
49
49
  const refs = {};
50
+ const occurrenceCounts = new Map();
50
51
  let counter = 1;
51
52
  walkAx(snapshot, (node, depth, path) => {
52
53
  if (!isInteractiveNode(node))
53
54
  return;
54
55
  const ref = `${prefix}${counter++}`;
55
56
  const name = truncateName(node.name || '');
57
+ const role = String(node.role || 'unknown');
58
+ const occurrenceKey = `${role} ${name}`;
59
+ const occurrenceIndex = occurrenceCounts.get(occurrenceKey) || 0;
60
+ occurrenceCounts.set(occurrenceKey, occurrenceIndex + 1);
56
61
  refs[ref] = {
57
62
  ref,
58
- role: String(node.role || 'unknown'),
63
+ role,
59
64
  name,
60
65
  selector: null,
61
66
  framePath: [],
62
67
  shadowPath: [],
63
68
  signatureHash: hashElementSignature({ role: node.role, name, depth, path }),
69
+ occurrenceIndex,
64
70
  };
65
71
  });
66
72
  return refs;
@@ -85,12 +91,8 @@ export function summarizeSnapshotForDoctor(snapshot, { maxRefs = 8 } = {}) {
85
91
  }
86
92
  async function captureAccessibilitySnapshot(page, { interactiveOnly, rootSelector }) {
87
93
  if (!page?.accessibility || typeof page.accessibility.snapshot !== 'function') {
88
- throw new WebAiError({
89
- errorCode: 'snapshot.unavailable',
90
- stage: 'snapshot-capture',
91
- retryHint: 'pin-playwright-or-add-cdp-fallback',
92
- message: 'page.accessibility.snapshot() is not available in this Playwright runtime',
93
- });
94
+ // playwright-core >= ~1.55 removed page.accessibility; fall back to the CDP AX tree (104.19).
95
+ return await captureAxViaCdp(page, { interactiveOnly, rootSelector });
94
96
  }
95
97
  let root = null;
96
98
  try {
@@ -115,8 +117,125 @@ async function captureAccessibilitySnapshot(page, { interactiveOnly, rootSelecto
115
117
  await root?.dispose?.().catch(() => undefined);
116
118
  }
117
119
  }
120
+ /** CDP role names mapped onto the Playwright accessibility-snapshot vocabulary. */
121
+ const CDP_ROLE_ALIASES = {
122
+ StaticText: 'text', InlineTextBox: 'text', GenericContainer: 'generic',
123
+ none: 'generic', presentation: 'generic',
124
+ };
125
+ async function captureAxViaCdp(page, { interactiveOnly, rootSelector }) {
126
+ const ctx = page.context?.();
127
+ if (!ctx || typeof ctx.newCDPSession !== 'function') {
128
+ throw new WebAiError({
129
+ errorCode: 'snapshot.unavailable',
130
+ stage: 'snapshot-capture',
131
+ retryHint: 'pin-playwright-or-add-cdp-fallback',
132
+ message: 'page.accessibility.snapshot() is unavailable and no CDP session could be created for this page',
133
+ });
134
+ }
135
+ const client = await ctx.newCDPSession(page);
136
+ try {
137
+ await client.send('Accessibility.enable').catch(() => undefined);
138
+ let backendNodeId;
139
+ if (rootSelector) {
140
+ const doc = (await client.send('DOM.getDocument', { depth: 0 }));
141
+ const qs = (await client.send('DOM.querySelector', { nodeId: doc.root?.nodeId, selector: rootSelector }));
142
+ if (!qs.nodeId) {
143
+ throw new WebAiError({
144
+ errorCode: 'snapshot.root-not-found',
145
+ stage: 'snapshot-capture',
146
+ retryHint: 'fix-root-selector',
147
+ message: `snapshot root selector did not match: ${rootSelector}`,
148
+ evidence: { rootSelector },
149
+ });
150
+ }
151
+ const described = (await client.send('DOM.describeNode', { nodeId: qs.nodeId }));
152
+ backendNodeId = described.node?.backendNodeId;
153
+ }
154
+ const res = backendNodeId
155
+ ? (await client.send('Accessibility.getPartialAXTree', { backendNodeId, fetchRelatives: true }))
156
+ : (await client.send('Accessibility.getFullAXTree', {}));
157
+ const nodeList = Array.isArray(res.nodes) ? res.nodes : [];
158
+ if (!nodeList.length) {
159
+ throw new WebAiError({
160
+ errorCode: 'snapshot.unavailable',
161
+ stage: 'ax-snapshot',
162
+ retryHint: 'retry',
163
+ message: 'CDP returned 0 accessibility nodes for the requested subtree',
164
+ });
165
+ }
166
+ return cdpNodesToAxTree(nodeList, { interactiveOnly });
167
+ }
168
+ finally {
169
+ await client.detach?.().catch(() => undefined);
170
+ }
171
+ }
172
+ /** Convert a flat CDP AX node list into the nested AxNode tree shape. Exported for tests. */
173
+ export function cdpNodesToAxTree(nodes, { interactiveOnly }) {
174
+ if (!nodes.length)
175
+ return { role: 'document', name: '', children: [] };
176
+ const byId = new Map();
177
+ for (const n of nodes)
178
+ byId.set(n.nodeId, n);
179
+ const childIds = new Set();
180
+ for (const n of nodes)
181
+ for (const c of n.childIds || [])
182
+ childIds.add(c);
183
+ const rootCdp = nodes.find((n) => !childIds.has(n.nodeId)) || nodes[0];
184
+ const convert = (cdpNode) => {
185
+ const children = [];
186
+ for (const cid of cdpNode.childIds || []) {
187
+ const child = byId.get(cid);
188
+ if (child)
189
+ children.push(...convert(child));
190
+ }
191
+ if (isCdpNodeCollapsible(cdpNode, interactiveOnly))
192
+ return children;
193
+ return [{ ...mapCdpNode(cdpNode), children }];
194
+ };
195
+ const top = rootCdp ? convert(rootCdp) : [];
196
+ if (top.length === 1 && top[0])
197
+ return top[0];
198
+ return { role: 'document', name: '', children: top };
199
+ }
200
+ function isCdpNodeCollapsible(node, interactiveOnly) {
201
+ if (node.ignored)
202
+ return true;
203
+ if (!interactiveOnly)
204
+ return false;
205
+ const role = String(node.role?.value || '');
206
+ const name = String(node.name?.value || '');
207
+ const generic = role === 'generic' || role === 'none' || role === 'presentation' || role === 'GenericContainer';
208
+ return generic && !name;
209
+ }
210
+ function mapCdpNode(node) {
211
+ const rawRole = String(node.role?.value || 'generic');
212
+ const out = { role: CDP_ROLE_ALIASES[rawRole] || rawRole, name: String(node.name?.value ?? '') };
213
+ const value = node.value?.value;
214
+ if (typeof value === 'string' || typeof value === 'number')
215
+ out.value = value;
216
+ const props = new Map();
217
+ for (const p of node.properties || []) {
218
+ if (p?.name && p.value?.value !== undefined)
219
+ props.set(p.name, p.value.value);
220
+ }
221
+ const checked = props.get('checked');
222
+ if (typeof checked === 'boolean' || typeof checked === 'string')
223
+ out.checked = checked;
224
+ const pressed = props.get('pressed');
225
+ if (typeof pressed === 'boolean' || typeof pressed === 'string')
226
+ out.pressed = pressed;
227
+ for (const key of ['disabled', 'expanded', 'selected', 'focused', 'focusable']) {
228
+ const v = props.get(key);
229
+ if (typeof v === 'boolean')
230
+ out[key] = v;
231
+ }
232
+ const level = props.get('level');
233
+ if (typeof level === 'number')
234
+ out.level = level;
235
+ return out;
236
+ }
118
237
  function serializeAxTree(tree, options) {
119
- const ctx = { ...options, refs: {}, nextRef: 1, nodeCount: 0 };
238
+ const ctx = { ...options, refs: {}, nextRef: 1, nodeCount: 0, occurrenceCounts: new Map() };
120
239
  const lines = serializeNode(tree || { role: 'document', name: '' }, 0, ctx, []);
121
240
  return { text: lines.join('\n'), refs: ctx.refs, nodeCount: ctx.nodeCount };
122
241
  }
@@ -132,10 +251,14 @@ function serializeNode(node, depth, ctx, path) {
132
251
  if (isInteractiveNode(node)) {
133
252
  const ref = `${ctx.refPrefix}${ctx.nextRef++}`;
134
253
  attrs.push(`ref=${ref}`);
254
+ const occurrenceKey = `${role}${rawName}`;
255
+ const occurrenceIndex = ctx.occurrenceCounts.get(occurrenceKey) || 0;
256
+ ctx.occurrenceCounts.set(occurrenceKey, occurrenceIndex + 1);
135
257
  ctx.refs[ref] = {
136
258
  ref, role, name: rawName,
137
259
  selector: null, framePath: [], shadowPath: [],
138
260
  signatureHash: hashElementSignature({ role, name: rawName, depth, path }),
261
+ occurrenceIndex,
139
262
  };
140
263
  }
141
264
  for (const attr of ['checked', 'disabled', 'expanded', 'selected', 'pressed', 'level', 'value']) {
@@ -1 +1 @@
1
- {"version":3,"file":"ax-snapshot.js","sourceRoot":"","sources":["../../../../src/browser/web-ai/ax-snapshot.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ax-snapshot.js","sourceRoot":"","sources":["../../../../src/browser/web-ai/ax-snapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ // Parity catalog 102 (candidate-reconcile). Strict-TS port of agbrowse
2
+ // web-ai/candidate-reconcile.mjs. Reconciles a vision-model click candidate
3
+ // (a point, optionally a bbox) against the fresh observation bundle's ref boxes:
4
+ // point-in-box → ref-click; ambiguous overlap/near-tie → COMPUTER_TARGET_AMBIGUOUS;
5
+ // otherwise fall back to a raw coordinate click. Pure (no DOM/CDP) — fully unit-testable.
6
+ /** Tie-break margin (px): the nearest box must beat the runner-up by this much to win. */
7
+ const NEAR_TIE_MARGIN = 8;
8
+ export function reconcileVisionCandidate(input) {
9
+ const maxDistance = input.maxDistance ?? 32;
10
+ const refs = Array.isArray(input.bundle?.refs)
11
+ ? input.bundle.refs.filter((r) => Boolean(r.box))
12
+ : [];
13
+ const point = input.candidate.point;
14
+ const containing = refs.filter((r) => contains(r.box, point));
15
+ if (containing.length === 1) {
16
+ return { action: 'ref', ref: containing[0].ref, reason: 'candidate_center_inside_ref_box' };
17
+ }
18
+ if (containing.length > 1) {
19
+ return { action: 'fail', code: 'COMPUTER_TARGET_AMBIGUOUS', reason: 'multiple_ref_boxes_contain_candidate' };
20
+ }
21
+ const nearby = refs
22
+ .map((r) => ({ ref: r.ref, distance: distanceToBoxCenter(point, r.box) }))
23
+ .filter((r) => r.distance <= maxDistance)
24
+ .sort((a, b) => a.distance - b.distance);
25
+ if (nearby.length === 1 || (nearby.length > 1 && nearby[0].distance + NEAR_TIE_MARGIN < nearby[1].distance)) {
26
+ return { action: 'ref', ref: nearby[0].ref, reason: 'candidate_center_near_ref_box' };
27
+ }
28
+ if (nearby.length > 1) {
29
+ return { action: 'fail', code: 'COMPUTER_TARGET_AMBIGUOUS', reason: 'multiple_nearby_ref_boxes' };
30
+ }
31
+ return { action: 'coordinate', reason: 'no_matching_ref_box' };
32
+ }
33
+ /**
34
+ * Guard against acting on a stale observation: if the bundle was captured on a
35
+ * different URL/target than the live page, throw COMPUTER_OBSERVATION_STALE.
36
+ */
37
+ export function assertFreshObservationBundle(bundle, current) {
38
+ const basis = bundle.basis || bundle;
39
+ if (basis.url && current.url && basis.url !== current.url) {
40
+ throw new Error('COMPUTER_OBSERVATION_STALE: observation URL does not match current page');
41
+ }
42
+ if (basis.targetId && current.targetId && basis.targetId !== current.targetId) {
43
+ throw new Error('COMPUTER_OBSERVATION_STALE: observation targetId does not match current page');
44
+ }
45
+ }
46
+ function contains(box, point) {
47
+ if (!box)
48
+ return false;
49
+ return (point.x >= box.x &&
50
+ point.y >= box.y &&
51
+ point.x <= box.x + box.width &&
52
+ point.y <= box.y + box.height);
53
+ }
54
+ function distanceToBoxCenter(point, box) {
55
+ if (!box)
56
+ return Number.POSITIVE_INFINITY;
57
+ const cx = box.x + box.width / 2;
58
+ const cy = box.y + box.height / 2;
59
+ return Math.hypot(point.x - cx, point.y - cy);
60
+ }
61
+ //# sourceMappingURL=candidate-reconcile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"candidate-reconcile.js","sourceRoot":"","sources":["../../../../src/browser/web-ai/candidate-reconcile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * 104.8 — Runtime capability-probe engine (port of agbrowse `capability.mjs`).
3
+ *
4
+ * Distinct from the DECLARATIVE registry in `capability-registry.ts` (catalog 201):
5
+ * this runs live DOM probes against a vendor tab and reports, per capability, a
6
+ * `{ capabilityId, state, evidence, next }` row. `state` aggregates worst → best
7
+ * ('fail' > 'warn' > 'ok'/'unknown'); `next` is the recommended retry hint.
8
+ *
9
+ * Side-effect contract: probes MAY open and read DOM but MUST NOT submit prompts
10
+ * or mutate model selection. Probes that open menus must close them before resolving.
11
+ */
12
+ export function defineCapability(capabilityId, probeFn) {
13
+ if (typeof probeFn !== 'function')
14
+ throw new Error(`capability ${capabilityId} requires a probe function`);
15
+ return { capabilityId, probeFn };
16
+ }
17
+ export async function runCapabilities(deps, capabilities, input = {}) {
18
+ const rows = [];
19
+ for (const cap of capabilities) {
20
+ // A single `probe` selector lets callers run just one row (e.g. status --probe gemini-composer-visible).
21
+ if (typeof input['probe'] === 'string' && input['probe'] !== cap.capabilityId)
22
+ continue;
23
+ try {
24
+ // eslint-disable-next-line no-await-in-loop -- probes share one tab; serial keeps DOM reads coherent.
25
+ const probeResult = await cap.probeFn(deps, input);
26
+ rows.push({ capabilityId: cap.capabilityId, ...normalizeRow(probeResult) });
27
+ }
28
+ catch (err) {
29
+ rows.push({
30
+ capabilityId: cap.capabilityId,
31
+ state: 'unknown',
32
+ evidence: { error: err?.message || String(err) },
33
+ next: 're-snapshot',
34
+ });
35
+ }
36
+ }
37
+ return rows;
38
+ }
39
+ export function worstCapabilityState(rows) {
40
+ if (!Array.isArray(rows) || rows.length === 0)
41
+ return 'unknown';
42
+ if (rows.some((r) => r.state === 'fail'))
43
+ return 'fail';
44
+ if (rows.some((r) => r.state === 'warn'))
45
+ return 'warn';
46
+ if (rows.every((r) => r.state === 'ok'))
47
+ return 'ok';
48
+ return 'unknown';
49
+ }
50
+ function normalizeRow(probeResult = {}) {
51
+ return {
52
+ state: probeResult.state || 'unknown',
53
+ evidence: probeResult.evidence ?? null,
54
+ next: probeResult.next || 'send',
55
+ };
56
+ }
57
+ export async function probeHostMatches(page, expectedHosts) {
58
+ try {
59
+ const url = page?.url?.() || '';
60
+ const host = new URL(url).hostname.replace(/^www\./, '');
61
+ if (expectedHosts.has(host))
62
+ return { state: 'ok', evidence: { url, host }, next: 'send' };
63
+ return { state: 'fail', evidence: { url, host, expected: [...expectedHosts] }, next: 'tab-switch' };
64
+ }
65
+ catch {
66
+ return { state: 'fail', evidence: { url: page?.url?.() || null }, next: 'tab-switch' };
67
+ }
68
+ }
69
+ export async function probeFirstVisibleSelector(page, selectors, options = {}) {
70
+ const timeoutMs = options.timeoutMs ?? 1500;
71
+ const deadline = Date.now() + timeoutMs;
72
+ while (Date.now() <= deadline) {
73
+ for (const selector of selectors) {
74
+ try {
75
+ const locator = page.locator(selector).first();
76
+ if (typeof locator.isVisible !== 'function')
77
+ continue;
78
+ // eslint-disable-next-line no-await-in-loop -- ordered selector preference: first visible wins.
79
+ const visible = await locator.isVisible().catch(() => false);
80
+ if (visible)
81
+ return { state: 'ok', evidence: { matched: selector, visible: true }, next: options.okNext || 'send' };
82
+ }
83
+ catch { /* keep trying the next selector */ }
84
+ }
85
+ if (Date.now() >= deadline)
86
+ break;
87
+ // eslint-disable-next-line no-await-in-loop -- poll until the deadline.
88
+ await page.waitForTimeout?.(100).catch(() => undefined);
89
+ }
90
+ return { state: options.failState || 'fail', evidence: { selectorsTried: [...selectors] }, next: options.failNext || 're-snapshot' };
91
+ }
92
+ //# sourceMappingURL=capability-probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability-probe.js","sourceRoot":"","sources":["../../../../src/browser/web-ai/capability-probe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ // Parity catalog 102 (chatgpt-archive). Strict-TS port of agbrowse web-ai/chatgpt-archive.mjs.
2
+ // Auto-archive hygiene for one-shot ChatGPT conversations: resolveArchivePolicy decides
3
+ // whether to archive (never for temporary/multi-turn/deep-research/project/incomplete
4
+ // chats, or when an artifact save was required and failed); archiveConversation drives
5
+ // the conversation-menu → Archive UI. Pure policy helpers are fully unit-testable.
6
+ /** Resolve archive policy based on the --archive flag and session/artifact state. */
7
+ export function resolveArchivePolicy({ archiveFlag = 'auto', session, artifactStatus = null, }) {
8
+ if (archiveFlag === 'never') {
9
+ return { shouldArchive: false, reason: 'archive-disabled' };
10
+ }
11
+ const conversationUrl = session?.conversationUrl;
12
+ if (!conversationUrl) {
13
+ return { shouldArchive: false, reason: 'no-conversation-url' };
14
+ }
15
+ if (isTemporaryChatgptUrl(session?.originalUrl) || isTemporaryChatgptUrl(conversationUrl)) {
16
+ return { shouldArchive: false, reason: 'temporary-chat' };
17
+ }
18
+ if (artifactStatus?.required === true && artifactStatus.ok === false) {
19
+ return { shouldArchive: false, reason: 'artifact-save-failed' };
20
+ }
21
+ if (archiveFlag === 'always') {
22
+ return { shouldArchive: true, reason: 'archive-forced' };
23
+ }
24
+ if ((session.followUpCount ?? 0) > 0) {
25
+ return { shouldArchive: false, reason: 'multi-turn-session' };
26
+ }
27
+ if (session.researchMode === 'deep') {
28
+ return { shouldArchive: false, reason: 'deep-research-session' };
29
+ }
30
+ if (session.projectUrl) {
31
+ return { shouldArchive: false, reason: 'project-chat' };
32
+ }
33
+ if (session.status !== 'complete' && session.status !== 'completed') {
34
+ return { shouldArchive: false, reason: 'session-not-completed' };
35
+ }
36
+ return { shouldArchive: true, reason: 'auto-archive-one-shot' };
37
+ }
38
+ export function isTemporaryChatgptUrl(url) {
39
+ if (!url)
40
+ return false;
41
+ try {
42
+ const parsed = new URL(String(url));
43
+ return parsed.searchParams.get('temporary-chat')?.trim().toLowerCase() === 'true';
44
+ }
45
+ catch {
46
+ return false;
47
+ }
48
+ }
49
+ const ARCHIVE_MENU_SELECTORS = [
50
+ 'button[data-testid="conversation-menu-trigger"]',
51
+ 'button[aria-label*="Options" i]',
52
+ 'button[aria-haspopup="menu"]',
53
+ ];
54
+ const ARCHIVE_ITEM_SELECTORS = [
55
+ '[role="menuitem"]:has-text("Archive")',
56
+ 'div[role="menuitem"]:has-text("Archive")',
57
+ 'a:has-text("Archive chat")',
58
+ ];
59
+ /** Archive a ChatGPT conversation via the UI. Best-effort; returns a warning on miss. */
60
+ export async function archiveConversation(page, { conversationUrl }) {
61
+ const currentUrl = page.url();
62
+ if (!currentUrl.includes(extractConversationId(conversationUrl) || '__never__')) {
63
+ return { ok: false, warning: 'conversation-url-mismatch' };
64
+ }
65
+ for (const sel of ARCHIVE_MENU_SELECTORS) {
66
+ const btn = page.locator(sel).first();
67
+ if (await btn.isVisible().catch(() => false)) {
68
+ await btn.click();
69
+ await page.waitForTimeout(500);
70
+ for (const itemSel of ARCHIVE_ITEM_SELECTORS) {
71
+ const item = page.locator(itemSel).first();
72
+ if (await item.isVisible().catch(() => false)) {
73
+ await item.click();
74
+ await page.waitForTimeout(1000);
75
+ return { ok: true };
76
+ }
77
+ }
78
+ await page.keyboard.press('Escape');
79
+ return { ok: false, warning: 'archive-menu-item-not-found' };
80
+ }
81
+ }
82
+ return { ok: false, warning: 'archive-menu-trigger-not-found' };
83
+ }
84
+ function extractConversationId(url) {
85
+ if (!url)
86
+ return null;
87
+ const match = url.match(/\/c\/([a-f0-9-]+)/);
88
+ return match ? match[1] : null;
89
+ }
90
+ //# sourceMappingURL=chatgpt-archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatgpt-archive.js","sourceRoot":"","sources":["../../../../src/browser/web-ai/chatgpt-archive.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,10 @@ const SOFT_SPREADSHEET_BYTES = 50 * 1024 * 1024;
12
12
  const UNSUPPORTED_EXTENSIONS = new Set(['.gdoc', '.gsheet', '.gslides']);
13
13
  const IMAGE_EXTENSIONS = new Set(['.png', '.jpg', '.jpeg', '.gif', '.webp', '.heic']);
14
14
  const SPREADSHEET_EXTENSIONS = new Set(['.csv', '.tsv', '.xls', '.xlsx']);
15
+ // 104.12: uploads delay send-button enablement, so widen the resolved/scan click window when files are attached.
16
+ export function sendButtonTimeoutMs(fileNames = []) {
17
+ return Array.isArray(fileNames) && fileNames.length > 0 ? 45_000 : 20_000;
18
+ }
15
19
  export function preflightAttachment(file) {
16
20
  const extension = extractExtension(file.basename);
17
21
  const softWarnings = [];
@@ -113,10 +117,16 @@ const COMPOSER_FILE_INPUT_SELECTORS = [
113
117
  'input[type="file"][multiple]',
114
118
  'input[type="file"]',
115
119
  ];
116
- const UPLOAD_BUTTON_SELECTORS = [
120
+ // 105.8: exported for parity testing. Restores agbrowse's explicit composer-plus-btn data-testid,
121
+ // the explicit "Add files and more" label, and the Korean i18n label that the broad `*="Add" i`
122
+ // pattern can't match — selector resilience for upload-surface discovery.
123
+ export const UPLOAD_BUTTON_SELECTORS = [
124
+ 'button[data-testid="composer-plus-btn"]',
117
125
  'button[aria-label*="Upload" i]',
118
126
  'button[aria-label*="Attach" i]',
127
+ 'button[aria-label="Add files and more"]',
119
128
  'button[aria-label*="Add" i]',
129
+ 'button[aria-label="파일 추가 및 기타"]',
120
130
  'button[data-testid*="plus" i]',
121
131
  'button:has-text("Upload")',
122
132
  ];
@@ -191,8 +201,8 @@ export async function attachLocalFileLive(page, file) {
191
201
  usedFallbacks,
192
202
  };
193
203
  }
194
- // Wait for visible chip / file count evidence (input-only success forbidden)
195
- const accepted = await waitForAttachmentAcceptedLive(page, { timeoutMs: 30_000 });
204
+ // Wait for visible chip evidence (input-only success forbidden) — verify the SPECIFIC file (104.13).
205
+ const accepted = await waitForAttachmentAcceptedLive(page, { timeoutMs: 30_000, fileNames: [file.basename] });
196
206
  if (!accepted.ok) {
197
207
  return accepted;
198
208
  }
@@ -248,11 +258,68 @@ export async function clearComposerAttachmentsLive(page) {
248
258
  warnings,
249
259
  };
250
260
  }
261
+ /**
262
+ * 104.13: in-page expression that verifies the SPECIFIC expected files appear in attachment
263
+ * chips (by filename / stem in chip text/attrs), not just that some chip count is non-zero —
264
+ * so a wrong/leftover chip can't false-confirm the upload. Self-contained for page.evaluate.
265
+ */
266
+ export function buildAttachmentReadyExpression(fileNames) {
267
+ return `(() => {
268
+ const expected = ${JSON.stringify((fileNames || []).map(String))};
269
+ const composer = document.querySelector('form:has(textarea), form:has([contenteditable="true"]), main form') || document.querySelector('main') || document.body;
270
+ const chipSelectors = [
271
+ '[data-testid*="attachment" i]',
272
+ '[data-testid*="file" i]',
273
+ '[aria-label*="attachment" i]',
274
+ '[aria-label*="file" i]',
275
+ 'button[aria-label*="Remove file" i]',
276
+ 'button[aria-label*="Remove attachment" i]',
277
+ '.group\\/file-tile'
278
+ ];
279
+ const promptNodes = new Set(Array.from(composer.querySelectorAll('textarea, [contenteditable="true"], [role="textbox"]')));
280
+ const candidates = Array.from(composer.querySelectorAll(chipSelectors.join(',')))
281
+ .filter(node => !Array.from(promptNodes).some(prompt => prompt.contains(node) || node.contains(prompt)));
282
+ const haystackFor = node => {
283
+ const parts = [];
284
+ let current = node;
285
+ for (let i = 0; current && i < 3; i += 1, current = current.parentElement) {
286
+ parts.push(current.textContent || '');
287
+ for (const attr of ['aria-label', 'title', 'data-testid']) parts.push(current.getAttribute?.(attr) || '');
288
+ }
289
+ return parts.join(' ').toLowerCase();
290
+ };
291
+ const haystacks = candidates.map(haystackFor);
292
+ const matched = expected.filter(name => {
293
+ const lower = String(name).toLowerCase();
294
+ const stem = lower.replace(/\\.[^.]+$/, '');
295
+ return haystacks.some(text => text.includes(lower) || (stem.length > 2 && text.includes(stem)));
296
+ });
297
+ const removeCount = candidates.filter(node => /remove (file|attachment)/i.test(node.getAttribute?.('aria-label') || node.textContent || '')).length;
298
+ const progressCount = composer.querySelectorAll('[role="progressbar"], [aria-label*="uploading" i], [aria-label*="processing" i], [data-testid*="upload-progress" i]').length;
299
+ return {
300
+ ok: progressCount === 0 && (matched.length === expected.length || (expected.length > 0 && removeCount >= expected.length)),
301
+ matched,
302
+ chipCount: candidates.length,
303
+ removeCount,
304
+ progressCount
305
+ };
306
+ })()`;
307
+ }
251
308
  export async function waitForAttachmentAcceptedLive(page, opts = {}) {
252
309
  const usedFallbacks = [];
253
310
  const warnings = [];
254
311
  const deadline = Date.now() + (opts.timeoutMs ?? 30_000);
312
+ const expected = (opts.fileNames || []).map(String).filter(Boolean);
255
313
  while (Date.now() < deadline) {
314
+ // 104.13: when filenames are known, verify those specific files (not chip-count only).
315
+ if (expected.length) {
316
+ const ready = await page.evaluate(buildAttachmentReadyExpression(expected)).catch(() => null);
317
+ if (ready?.ok) {
318
+ return { ok: true, stage: 'attachment-verified', chipVisible: true, fileCount: ready.chipCount || expected.length, usedFallbacks, warnings };
319
+ }
320
+ await page.waitForTimeout(500).catch(() => undefined);
321
+ continue;
322
+ }
256
323
  let chipCount = 0;
257
324
  for (const sel of ATTACHMENT_CHIP_SELECTORS) {
258
325
  chipCount += await page.locator(sel).count().catch(() => 0);