@xingular/harness 2.0.0 → 2.0.1-unstable

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 (1095) hide show
  1. package/CHANGELOG.md +635 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE.md +50 -0
  4. package/README.md +241 -90
  5. package/THIRD_PARTY_LICENSES.md +942 -0
  6. package/browser-extension/README.md +32 -0
  7. package/browser-extension/background.js +612 -0
  8. package/browser-extension/manifest.json +16 -0
  9. package/browser-extension/overlay.js +97 -0
  10. package/browser-extension/popup.css +19 -0
  11. package/browser-extension/popup.html +30 -0
  12. package/browser-extension/popup.js +101 -0
  13. package/browser-extension/site-access.js +63 -0
  14. package/builtin/skills/plugin-authoring/SKILL.md +53 -0
  15. package/dist/cli.js +32851 -17155
  16. package/dist/sdk/accounts/accounts.d.ts +195 -0
  17. package/dist/sdk/accounts/accounts.js +821 -0
  18. package/dist/sdk/accounts/choices.d.ts +41 -0
  19. package/dist/sdk/accounts/choices.js +89 -0
  20. package/dist/sdk/accounts/env.d.ts +78 -0
  21. package/dist/sdk/accounts/env.js +294 -0
  22. package/dist/sdk/accounts/secrets.d.ts +28 -0
  23. package/dist/sdk/accounts/secrets.js +147 -0
  24. package/dist/sdk/accounts/store.d.ts +139 -0
  25. package/dist/sdk/accounts/store.js +255 -0
  26. package/dist/sdk/agents/builtin.d.ts +2 -0
  27. package/dist/sdk/agents/builtin.js +50 -0
  28. package/dist/sdk/agents/narrow.d.ts +13 -0
  29. package/dist/sdk/agents/narrow.js +29 -0
  30. package/dist/sdk/agents/planResearch.d.ts +27 -0
  31. package/dist/sdk/agents/planResearch.js +82 -0
  32. package/dist/sdk/agents/profiles.d.ts +93 -0
  33. package/dist/sdk/agents/profiles.js +289 -0
  34. package/dist/sdk/annotations/bridge.d.ts +44 -0
  35. package/dist/sdk/annotations/bridge.js +268 -0
  36. package/dist/sdk/annotations/capture.d.ts +158 -0
  37. package/dist/sdk/annotations/capture.js +409 -0
  38. package/dist/sdk/annotations/delivery.d.ts +79 -0
  39. package/dist/sdk/annotations/delivery.js +163 -0
  40. package/dist/sdk/annotations/inspect.d.ts +10 -0
  41. package/dist/sdk/annotations/inspect.js +34 -0
  42. package/dist/sdk/annotations/isolated.d.ts +6 -0
  43. package/dist/sdk/annotations/isolated.js +51 -0
  44. package/dist/sdk/annotations/pageScript.d.ts +28 -0
  45. package/dist/sdk/annotations/pageScript.js +871 -0
  46. package/dist/sdk/annotations/part.d.ts +8 -0
  47. package/dist/sdk/annotations/part.js +126 -0
  48. package/dist/sdk/annotations/queue.d.ts +4 -0
  49. package/dist/sdk/annotations/queue.js +45 -0
  50. package/dist/sdk/annotations/serverMethods.d.ts +3 -0
  51. package/dist/sdk/annotations/serverMethods.js +66 -0
  52. package/dist/sdk/annotations/store.d.ts +159 -0
  53. package/dist/sdk/annotations/store.js +404 -0
  54. package/dist/sdk/browser/backend.d.ts +16 -0
  55. package/dist/sdk/browser/backend.js +17 -0
  56. package/dist/sdk/browser/config.d.ts +19 -0
  57. package/dist/sdk/browser/config.js +23 -0
  58. package/dist/sdk/browser/contracts.d.ts +19 -0
  59. package/dist/sdk/browser/contracts.js +116 -0
  60. package/dist/sdk/browser/diagnostics.d.ts +4 -0
  61. package/dist/sdk/browser/diagnostics.js +38 -0
  62. package/dist/sdk/browser/extension/bridge.d.ts +55 -0
  63. package/dist/sdk/browser/extension/bridge.js +336 -0
  64. package/dist/sdk/browser/extension/session.d.ts +50 -0
  65. package/dist/sdk/browser/extension/session.js +321 -0
  66. package/dist/sdk/browser/index.d.ts +33 -0
  67. package/dist/sdk/browser/index.js +105 -0
  68. package/dist/sdk/browser/network.d.ts +10 -0
  69. package/dist/sdk/browser/network.js +59 -0
  70. package/dist/sdk/browser/serverMethods.d.ts +3 -0
  71. package/dist/sdk/browser/serverMethods.js +10 -0
  72. package/dist/sdk/browser/session.d.ts +85 -0
  73. package/dist/sdk/browser/session.js +228 -0
  74. package/dist/sdk/browser/tools.d.ts +102 -0
  75. package/dist/sdk/browser/tools.js +257 -0
  76. package/dist/sdk/capabilities/api.d.ts +22 -0
  77. package/dist/sdk/capabilities/api.js +54 -0
  78. package/dist/sdk/capabilities/runSnapshot.d.ts +18 -0
  79. package/dist/sdk/capabilities/runSnapshot.js +53 -0
  80. package/dist/sdk/capabilities/types.d.ts +29 -0
  81. package/dist/sdk/capabilities/types.js +1 -0
  82. package/dist/sdk/cli.d.ts +2 -0
  83. package/dist/sdk/cli.js +172 -0
  84. package/dist/sdk/commands/extensionOwners.d.ts +4 -0
  85. package/dist/sdk/commands/extensionOwners.js +17 -0
  86. package/dist/sdk/commands/list.d.ts +3 -0
  87. package/dist/sdk/commands/list.js +90 -0
  88. package/dist/sdk/commands/promptLoader.d.ts +5 -0
  89. package/dist/sdk/commands/promptLoader.js +76 -0
  90. package/dist/sdk/commands/promptRoutes.d.ts +13 -0
  91. package/dist/sdk/commands/promptRoutes.js +46 -0
  92. package/dist/sdk/commands/registry.d.ts +299 -0
  93. package/dist/sdk/commands/registry.js +54 -0
  94. package/dist/sdk/commands/routes.d.ts +16 -0
  95. package/dist/sdk/commands/routes.js +33 -0
  96. package/dist/sdk/commands/runtimeRouter.d.ts +4 -0
  97. package/dist/sdk/commands/runtimeRouter.js +48 -0
  98. package/dist/sdk/computer/boundary.d.ts +40 -0
  99. package/dist/sdk/computer/boundary.js +79 -0
  100. package/dist/sdk/computer/contracts.d.ts +127 -0
  101. package/dist/sdk/computer/contracts.js +13 -0
  102. package/dist/sdk/computer/control.d.ts +34 -0
  103. package/dist/sdk/computer/control.js +112 -0
  104. package/dist/sdk/computer/screenshot.d.ts +32 -0
  105. package/dist/sdk/computer/screenshot.js +35 -0
  106. package/dist/sdk/computer/terminalCapture.d.ts +26 -0
  107. package/dist/sdk/computer/terminalCapture.js +64 -0
  108. package/dist/sdk/computer/volatileImages.d.ts +9 -0
  109. package/dist/sdk/computer/volatileImages.js +50 -0
  110. package/dist/sdk/context/attribution.d.ts +18 -0
  111. package/dist/sdk/context/attribution.js +295 -0
  112. package/dist/sdk/context/runDetails.d.ts +16 -0
  113. package/dist/sdk/context/runDetails.js +22 -0
  114. package/dist/sdk/context/types.d.ts +94 -0
  115. package/dist/sdk/context/types.js +10 -0
  116. package/dist/sdk/core/bus.d.ts +23 -0
  117. package/dist/sdk/core/bus.js +76 -0
  118. package/dist/sdk/core/caller.d.ts +22 -0
  119. package/dist/sdk/core/caller.js +16 -0
  120. package/dist/sdk/core/changes.d.ts +15 -0
  121. package/dist/sdk/core/changes.js +15 -0
  122. package/dist/sdk/core/commandBudget.d.ts +23 -0
  123. package/dist/sdk/core/commandBudget.js +62 -0
  124. package/dist/sdk/core/effort.d.ts +2 -0
  125. package/dist/sdk/core/effort.js +1 -0
  126. package/dist/sdk/core/env.d.ts +18 -0
  127. package/dist/sdk/core/env.js +8 -0
  128. package/dist/sdk/core/errors.d.ts +15 -0
  129. package/dist/sdk/core/errors.js +24 -0
  130. package/dist/sdk/core/frontmatter.d.ts +12 -0
  131. package/dist/sdk/core/frontmatter.js +50 -0
  132. package/dist/sdk/core/fs.d.ts +18 -0
  133. package/dist/sdk/core/fs.js +106 -0
  134. package/dist/sdk/core/index.d.ts +24 -0
  135. package/dist/sdk/core/index.js +203 -0
  136. package/dist/sdk/core/interactiveProfile.d.ts +46 -0
  137. package/dist/sdk/core/interactiveProfile.js +143 -0
  138. package/dist/sdk/core/links.d.ts +51 -0
  139. package/dist/sdk/core/links.js +155 -0
  140. package/dist/sdk/core/path.d.ts +7 -0
  141. package/dist/sdk/core/path.js +79 -0
  142. package/dist/sdk/core/projects.d.ts +18 -0
  143. package/dist/sdk/core/projects.js +67 -0
  144. package/dist/sdk/core/secrets.d.ts +2 -0
  145. package/dist/sdk/core/secrets.js +5 -0
  146. package/dist/sdk/core/shell.d.ts +20 -0
  147. package/dist/sdk/core/shell.js +73 -0
  148. package/dist/sdk/core/text.d.ts +7 -0
  149. package/dist/sdk/core/text.js +40 -0
  150. package/dist/sdk/core/workspace.d.ts +13 -0
  151. package/dist/sdk/core/workspace.js +88 -0
  152. package/dist/sdk/core/workspaceBashTool.d.ts +20 -0
  153. package/dist/sdk/core/workspaceBashTool.js +50 -0
  154. package/dist/sdk/core/workspaceSandbox.d.ts +41 -0
  155. package/dist/sdk/core/workspaceSandbox.js +360 -0
  156. package/dist/sdk/core/workspaceWriteOperations.d.ts +57 -0
  157. package/dist/sdk/core/workspaceWriteOperations.js +245 -0
  158. package/dist/sdk/doctor/checks.d.ts +5 -0
  159. package/dist/sdk/doctor/checks.js +270 -0
  160. package/dist/sdk/doctor/probe.d.ts +4 -0
  161. package/dist/sdk/doctor/probe.js +94 -0
  162. package/dist/sdk/doctor/serverMethods.d.ts +3 -0
  163. package/dist/sdk/doctor/serverMethods.js +8 -0
  164. package/dist/sdk/doctor/service.d.ts +23 -0
  165. package/dist/sdk/doctor/service.js +144 -0
  166. package/dist/sdk/doctor/types.d.ts +141 -0
  167. package/dist/sdk/doctor/types.js +29 -0
  168. package/dist/sdk/harness.d.ts +172 -0
  169. package/dist/sdk/harness.js +387 -0
  170. package/dist/sdk/history/lessonPrompt.d.ts +2 -0
  171. package/dist/sdk/history/lessonPrompt.js +15 -0
  172. package/dist/sdk/history/lessons.d.ts +52 -0
  173. package/dist/sdk/history/lessons.js +173 -0
  174. package/dist/sdk/history/recall.d.ts +68 -0
  175. package/dist/sdk/history/recall.js +199 -0
  176. package/dist/sdk/history/serverMethods.d.ts +3 -0
  177. package/dist/sdk/history/serverMethods.js +8 -0
  178. package/dist/sdk/history/trajectory.d.ts +7 -0
  179. package/dist/sdk/history/trajectory.js +218 -0
  180. package/dist/sdk/hub/catalog.json +123 -0
  181. package/dist/sdk/hub/cli.d.ts +7 -0
  182. package/dist/sdk/hub/cli.js +81 -0
  183. package/dist/sdk/hub/hub.d.ts +74 -0
  184. package/dist/sdk/hub/hub.js +476 -0
  185. package/dist/sdk/hub/schema.d.ts +280 -0
  186. package/dist/sdk/hub/schema.js +78 -0
  187. package/dist/sdk/hub/serverMethods.d.ts +3 -0
  188. package/dist/sdk/hub/serverMethods.js +11 -0
  189. package/dist/sdk/index.d.ts +80 -0
  190. package/dist/sdk/index.js +60 -0
  191. package/dist/sdk/mcp/connections.d.ts +83 -0
  192. package/dist/sdk/mcp/connections.js +676 -0
  193. package/dist/sdk/mcp/manager.d.ts +26 -0
  194. package/dist/sdk/mcp/manager.js +124 -0
  195. package/dist/sdk/mcp/oauth.d.ts +35 -0
  196. package/dist/sdk/mcp/oauth.js +171 -0
  197. package/dist/sdk/mcp/scopeMigration.d.ts +19 -0
  198. package/dist/sdk/mcp/scopeMigration.js +198 -0
  199. package/dist/sdk/mcp/serverMethods.d.ts +3 -0
  200. package/dist/sdk/mcp/serverMethods.js +22 -0
  201. package/dist/sdk/mcp/service.d.ts +160 -0
  202. package/dist/sdk/mcp/service.js +510 -0
  203. package/dist/sdk/mcp/types.d.ts +131 -0
  204. package/dist/sdk/mcp/types.js +49 -0
  205. package/dist/sdk/pi/retryPolicy.d.ts +19 -0
  206. package/dist/sdk/pi/retryPolicy.js +11 -0
  207. package/dist/sdk/pi/runtime.d.ts +14 -0
  208. package/dist/sdk/pi/runtime.js +31 -0
  209. package/dist/sdk/plugins/api.d.ts +66 -0
  210. package/dist/sdk/plugins/api.js +155 -0
  211. package/dist/sdk/plugins/attachments.d.ts +46 -0
  212. package/dist/sdk/plugins/attachments.js +111 -0
  213. package/dist/sdk/plugins/builtin.d.ts +7 -0
  214. package/dist/sdk/plugins/builtin.js +182 -0
  215. package/dist/sdk/plugins/builtinRegistry.d.ts +62 -0
  216. package/dist/sdk/plugins/builtinRegistry.js +77 -0
  217. package/dist/sdk/plugins/catalogue.d.ts +29 -0
  218. package/dist/sdk/plugins/catalogue.js +197 -0
  219. package/dist/sdk/plugins/cli.d.ts +13 -0
  220. package/dist/sdk/plugins/cli.js +188 -0
  221. package/dist/sdk/plugins/commandPrefix.d.ts +8 -0
  222. package/dist/sdk/plugins/commandPrefix.js +21 -0
  223. package/dist/sdk/plugins/discover.d.ts +48 -0
  224. package/dist/sdk/plugins/discover.js +230 -0
  225. package/dist/sdk/plugins/firstParty.d.ts +50 -0
  226. package/dist/sdk/plugins/firstParty.js +119 -0
  227. package/dist/sdk/plugins/hooks.d.ts +94 -0
  228. package/dist/sdk/plugins/hooks.js +162 -0
  229. package/dist/sdk/plugins/identity.d.ts +19 -0
  230. package/dist/sdk/plugins/identity.js +48 -0
  231. package/dist/sdk/plugins/install.d.ts +24 -0
  232. package/dist/sdk/plugins/install.js +160 -0
  233. package/dist/sdk/plugins/inventory.d.ts +22 -0
  234. package/dist/sdk/plugins/inventory.js +111 -0
  235. package/dist/sdk/plugins/manifest.d.ts +21 -0
  236. package/dist/sdk/plugins/manifest.js +94 -0
  237. package/dist/sdk/plugins/plugins.d.ts +106 -0
  238. package/dist/sdk/plugins/plugins.js +165 -0
  239. package/dist/sdk/plugins/proposals.d.ts +17 -0
  240. package/dist/sdk/plugins/proposals.js +147 -0
  241. package/dist/sdk/plugins/runtime.d.ts +9 -0
  242. package/dist/sdk/plugins/runtime.js +95 -0
  243. package/dist/sdk/plugins/surfaces.d.ts +5 -0
  244. package/dist/sdk/plugins/surfaces.js +11 -0
  245. package/dist/sdk/plugins/trust.d.ts +44 -0
  246. package/dist/sdk/plugins/trust.js +120 -0
  247. package/dist/sdk/plugins/types.d.ts +174 -0
  248. package/dist/sdk/plugins/types.js +7 -0
  249. package/dist/sdk/prompt/compile.d.ts +245 -0
  250. package/dist/sdk/prompt/compile.js +535 -0
  251. package/dist/sdk/prompt/reporting.d.ts +2 -0
  252. package/dist/sdk/prompt/reporting.js +94 -0
  253. package/dist/sdk/prompt/standard.d.ts +32 -0
  254. package/dist/sdk/prompt/standard.js +76 -0
  255. package/dist/sdk/refine/cli.d.ts +4 -0
  256. package/dist/sdk/refine/cli.js +186 -0
  257. package/dist/sdk/refine/demo.d.ts +21 -0
  258. package/dist/sdk/refine/demo.js +114 -0
  259. package/dist/sdk/refine/evidence.d.ts +55 -0
  260. package/dist/sdk/refine/evidence.js +330 -0
  261. package/dist/sdk/refine/host.d.ts +59 -0
  262. package/dist/sdk/refine/host.js +105 -0
  263. package/dist/sdk/refine/ledger.d.ts +48 -0
  264. package/dist/sdk/refine/ledger.js +76 -0
  265. package/dist/sdk/refine/library.d.ts +55 -0
  266. package/dist/sdk/refine/library.js +177 -0
  267. package/dist/sdk/refine/pi.d.ts +72 -0
  268. package/dist/sdk/refine/pi.js +248 -0
  269. package/dist/sdk/refine/prompts.d.ts +60 -0
  270. package/dist/sdk/refine/prompts.js +434 -0
  271. package/dist/sdk/refine/recursion.d.ts +113 -0
  272. package/dist/sdk/refine/recursion.js +258 -0
  273. package/dist/sdk/refine/runner.d.ts +83 -0
  274. package/dist/sdk/refine/runner.js +151 -0
  275. package/dist/sdk/refine/selection.d.ts +57 -0
  276. package/dist/sdk/refine/selection.js +251 -0
  277. package/dist/sdk/refine/serverMethods.d.ts +3 -0
  278. package/dist/sdk/refine/serverMethods.js +23 -0
  279. package/dist/sdk/refine/service.d.ts +115 -0
  280. package/dist/sdk/refine/service.js +280 -0
  281. package/dist/sdk/refine/suite.d.ts +67 -0
  282. package/dist/sdk/refine/suite.js +174 -0
  283. package/dist/sdk/refine/trajectory.d.ts +9 -0
  284. package/dist/sdk/refine/trajectory.js +73 -0
  285. package/dist/sdk/refine/types.d.ts +93 -0
  286. package/dist/sdk/refine/types.js +10 -0
  287. package/dist/sdk/remote/addresses.d.ts +19 -0
  288. package/dist/sdk/remote/addresses.js +52 -0
  289. package/dist/sdk/remote/pairing.d.ts +59 -0
  290. package/dist/sdk/remote/pairing.js +160 -0
  291. package/dist/sdk/remote/seal.d.ts +28 -0
  292. package/dist/sdk/remote/seal.js +84 -0
  293. package/dist/sdk/remote/server.d.ts +28 -0
  294. package/dist/sdk/remote/server.js +158 -0
  295. package/dist/sdk/remote/service.d.ts +125 -0
  296. package/dist/sdk/remote/service.js +330 -0
  297. package/dist/sdk/remote/webClient.d.ts +4 -0
  298. package/dist/sdk/remote/webClient.js +452 -0
  299. package/dist/sdk/server/methods.d.ts +3 -0
  300. package/dist/sdk/server/methods.js +365 -0
  301. package/dist/sdk/server/params.d.ts +4 -0
  302. package/dist/sdk/server/params.js +11 -0
  303. package/dist/sdk/server/remote.d.ts +19 -0
  304. package/dist/sdk/server/remote.js +109 -0
  305. package/dist/sdk/server/rpc.d.ts +20 -0
  306. package/dist/sdk/server/rpc.js +102 -0
  307. package/dist/sdk/server/serve.d.ts +13 -0
  308. package/dist/sdk/server/serve.js +25 -0
  309. package/dist/sdk/server/socket.d.ts +28 -0
  310. package/dist/sdk/server/socket.js +122 -0
  311. package/dist/sdk/sessions/approvals.d.ts +47 -0
  312. package/dist/sdk/sessions/approvals.js +119 -0
  313. package/dist/sdk/sessions/checkpoint.d.ts +7 -0
  314. package/dist/sdk/sessions/checkpoint.js +41 -0
  315. package/dist/sdk/sessions/compactionCheckpoint.d.ts +18 -0
  316. package/dist/sdk/sessions/compactionCheckpoint.js +79 -0
  317. package/dist/sdk/sessions/completionCheck.d.ts +51 -0
  318. package/dist/sdk/sessions/completionCheck.js +161 -0
  319. package/dist/sdk/sessions/continuation.d.ts +53 -0
  320. package/dist/sdk/sessions/continuation.js +90 -0
  321. package/dist/sdk/sessions/contracts.d.ts +991 -0
  322. package/dist/sdk/sessions/contracts.js +545 -0
  323. package/dist/sdk/sessions/control.d.ts +72 -0
  324. package/dist/sdk/sessions/control.js +158 -0
  325. package/dist/sdk/sessions/extensionUi.d.ts +19 -0
  326. package/dist/sdk/sessions/extensionUi.js +64 -0
  327. package/dist/sdk/sessions/goal.d.ts +145 -0
  328. package/dist/sdk/sessions/goal.js +405 -0
  329. package/dist/sdk/sessions/goalLoop.d.ts +37 -0
  330. package/dist/sdk/sessions/goalLoop.js +125 -0
  331. package/dist/sdk/sessions/goalPrompts.d.ts +4 -0
  332. package/dist/sdk/sessions/goalPrompts.js +93 -0
  333. package/dist/sdk/sessions/goalStop.d.ts +27 -0
  334. package/dist/sdk/sessions/goalStop.js +41 -0
  335. package/dist/sdk/sessions/history.d.ts +16 -0
  336. package/dist/sdk/sessions/history.js +68 -0
  337. package/dist/sdk/sessions/initialBash.d.ts +7 -0
  338. package/dist/sdk/sessions/initialBash.js +7 -0
  339. package/dist/sdk/sessions/lineageJoin.d.ts +2 -0
  340. package/dist/sdk/sessions/lineageJoin.js +61 -0
  341. package/dist/sdk/sessions/live.d.ts +101 -0
  342. package/dist/sdk/sessions/live.js +265 -0
  343. package/dist/sdk/sessions/planMode.d.ts +116 -0
  344. package/dist/sdk/sessions/planMode.js +281 -0
  345. package/dist/sdk/sessions/policy.d.ts +43 -0
  346. package/dist/sdk/sessions/policy.js +1 -0
  347. package/dist/sdk/sessions/pricing.d.ts +34 -0
  348. package/dist/sdk/sessions/pricing.js +40 -0
  349. package/dist/sdk/sessions/reasoningSummaries.d.ts +11 -0
  350. package/dist/sdk/sessions/reasoningSummaries.js +61 -0
  351. package/dist/sdk/sessions/registry.d.ts +124 -0
  352. package/dist/sdk/sessions/registry.js +392 -0
  353. package/dist/sdk/sessions/runIndex.d.ts +21 -0
  354. package/dist/sdk/sessions/runIndex.js +65 -0
  355. package/dist/sdk/sessions/runStore.d.ts +82 -0
  356. package/dist/sdk/sessions/runStore.js +393 -0
  357. package/dist/sdk/sessions/runner.d.ts +291 -0
  358. package/dist/sdk/sessions/runner.js +1040 -0
  359. package/dist/sdk/sessions/sessionState.d.ts +13 -0
  360. package/dist/sdk/sessions/sessionState.js +31 -0
  361. package/dist/sdk/sessions/sessions.d.ts +238 -0
  362. package/dist/sdk/sessions/sessions.js +923 -0
  363. package/dist/sdk/sessions/sideQuestionServerMethods.d.ts +3 -0
  364. package/dist/sdk/sessions/sideQuestionServerMethods.js +19 -0
  365. package/dist/sdk/sessions/sideQuestions.d.ts +66 -0
  366. package/dist/sdk/sessions/sideQuestions.js +290 -0
  367. package/dist/sdk/sessions/stallWatch.d.ts +35 -0
  368. package/dist/sdk/sessions/stallWatch.js +42 -0
  369. package/dist/sdk/sessions/subagentServerMethods.d.ts +3 -0
  370. package/dist/sdk/sessions/subagentServerMethods.js +41 -0
  371. package/dist/sdk/sessions/subagentService.d.ts +88 -0
  372. package/dist/sdk/sessions/subagentService.js +546 -0
  373. package/dist/sdk/sessions/subagents.d.ts +98 -0
  374. package/dist/sdk/sessions/subagents.js +136 -0
  375. package/dist/sdk/sessions/workSlice.d.ts +167 -0
  376. package/dist/sdk/sessions/workSlice.js +266 -0
  377. package/dist/sdk/sessions/workspaceBoundary.d.ts +15 -0
  378. package/dist/sdk/sessions/workspaceBoundary.js +46 -0
  379. package/dist/sdk/terminal/accountsMenu.d.ts +46 -0
  380. package/dist/sdk/terminal/accountsMenu.js +392 -0
  381. package/dist/sdk/terminal/browser.d.ts +62 -0
  382. package/dist/sdk/terminal/browser.js +41 -0
  383. package/dist/sdk/terminal/browserControl.d.ts +29 -0
  384. package/dist/sdk/terminal/browserControl.js +187 -0
  385. package/dist/sdk/terminal/cli.d.ts +20 -0
  386. package/dist/sdk/terminal/cli.js +121 -0
  387. package/dist/sdk/terminal/client.d.ts +20 -0
  388. package/dist/sdk/terminal/client.js +148 -0
  389. package/dist/sdk/terminal/commandHelp.d.ts +17 -0
  390. package/dist/sdk/terminal/commandHelp.js +20 -0
  391. package/dist/sdk/terminal/control.d.ts +4 -0
  392. package/dist/sdk/terminal/control.js +25 -0
  393. package/dist/sdk/terminal/controller.d.ts +136 -0
  394. package/dist/sdk/terminal/controller.js +579 -0
  395. package/dist/sdk/terminal/credentialStore.d.ts +4 -0
  396. package/dist/sdk/terminal/credentialStore.js +33 -0
  397. package/dist/sdk/terminal/daemon.d.ts +44 -0
  398. package/dist/sdk/terminal/daemon.js +264 -0
  399. package/dist/sdk/terminal/hubMenu.d.ts +10 -0
  400. package/dist/sdk/terminal/hubMenu.js +34 -0
  401. package/dist/sdk/terminal/launch.d.ts +5 -0
  402. package/dist/sdk/terminal/launch.js +27 -0
  403. package/dist/sdk/terminal/liveTerminal.d.ts +96 -0
  404. package/dist/sdk/terminal/liveTerminal.js +436 -0
  405. package/dist/sdk/terminal/logs.d.ts +14 -0
  406. package/dist/sdk/terminal/logs.js +59 -0
  407. package/dist/sdk/terminal/opentui/ansi.d.ts +25 -0
  408. package/dist/sdk/terminal/opentui/ansi.js +192 -0
  409. package/dist/sdk/terminal/opentui/model.d.ts +163 -0
  410. package/dist/sdk/terminal/opentui/model.js +484 -0
  411. package/dist/sdk/terminal/opentui/subagentsWidget.d.ts +28 -0
  412. package/dist/sdk/terminal/opentui/subagentsWidget.js +54 -0
  413. package/dist/sdk/terminal/opentui/theme.d.ts +47 -0
  414. package/dist/sdk/terminal/opentui/theme.js +93 -0
  415. package/dist/sdk/terminal/piExtension.d.ts +12 -0
  416. package/dist/sdk/terminal/piExtension.js +847 -0
  417. package/dist/sdk/terminal/pluginMenu.d.ts +34 -0
  418. package/dist/sdk/terminal/pluginMenu.js +101 -0
  419. package/dist/sdk/terminal/socket.d.ts +73 -0
  420. package/dist/sdk/terminal/socket.js +287 -0
  421. package/dist/sdk/terminal/standalone.d.ts +52 -0
  422. package/dist/sdk/terminal/standalone.js +329 -0
  423. package/dist/sdk/terminal/subagentMonitor.d.ts +62 -0
  424. package/dist/sdk/terminal/subagentMonitor.js +176 -0
  425. package/dist/sdk/terminal/terminals.d.ts +312 -0
  426. package/dist/sdk/terminal/terminals.js +1782 -0
  427. package/dist/sdk/terminal/toolName.d.ts +6 -0
  428. package/dist/sdk/terminal/toolName.js +12 -0
  429. package/dist/sdk/terminal/trajectory.d.ts +15 -0
  430. package/dist/sdk/terminal/trajectory.js +38 -0
  431. package/dist/sdk/terminal/tui/annotateCommand.d.ts +7 -0
  432. package/dist/sdk/terminal/tui/annotateCommand.js +36 -0
  433. package/dist/sdk/terminal/tui/annotateSend.d.ts +30 -0
  434. package/dist/sdk/terminal/tui/annotateSend.js +40 -0
  435. package/dist/sdk/terminal/tui/chrome.d.ts +68 -0
  436. package/dist/sdk/terminal/tui/chrome.js +182 -0
  437. package/dist/sdk/terminal/tui/clipboardFiles.d.ts +11 -0
  438. package/dist/sdk/terminal/tui/clipboardFiles.js +74 -0
  439. package/dist/sdk/terminal/tui/commandPages.d.ts +16 -0
  440. package/dist/sdk/terminal/tui/commandPages.js +136 -0
  441. package/dist/sdk/terminal/tui/commands.d.ts +71 -0
  442. package/dist/sdk/terminal/tui/commands.js +496 -0
  443. package/dist/sdk/terminal/tui/dialogGeometry.d.ts +27 -0
  444. package/dist/sdk/terminal/tui/dialogGeometry.js +52 -0
  445. package/dist/sdk/terminal/tui/dialogs.d.ts +81 -0
  446. package/dist/sdk/terminal/tui/dialogs.js +372 -0
  447. package/dist/sdk/terminal/tui/goalCommand.d.ts +19 -0
  448. package/dist/sdk/terminal/tui/goalCommand.js +83 -0
  449. package/dist/sdk/terminal/tui/harnessRuntime.d.ts +8 -0
  450. package/dist/sdk/terminal/tui/harnessRuntime.js +771 -0
  451. package/dist/sdk/terminal/tui/keybindings.d.ts +11 -0
  452. package/dist/sdk/terminal/tui/keybindings.js +49 -0
  453. package/dist/sdk/terminal/tui/list.d.ts +86 -0
  454. package/dist/sdk/terminal/tui/list.js +278 -0
  455. package/dist/sdk/terminal/tui/markdown.d.ts +16 -0
  456. package/dist/sdk/terminal/tui/markdown.js +55 -0
  457. package/dist/sdk/terminal/tui/modeChoices.d.ts +61 -0
  458. package/dist/sdk/terminal/tui/modeChoices.js +95 -0
  459. package/dist/sdk/terminal/tui/modelPicker.d.ts +55 -0
  460. package/dist/sdk/terminal/tui/modelPicker.js +150 -0
  461. package/dist/sdk/terminal/tui/mouse.d.ts +3 -0
  462. package/dist/sdk/terminal/tui/mouse.js +3 -0
  463. package/dist/sdk/terminal/tui/mouseReport.d.ts +30 -0
  464. package/dist/sdk/terminal/tui/mouseReport.js +80 -0
  465. package/dist/sdk/terminal/tui/page.d.ts +17 -0
  466. package/dist/sdk/terminal/tui/page.js +1 -0
  467. package/dist/sdk/terminal/tui/pageOverlay.d.ts +30 -0
  468. package/dist/sdk/terminal/tui/pageOverlay.js +183 -0
  469. package/dist/sdk/terminal/tui/pages/accountsPage.d.ts +76 -0
  470. package/dist/sdk/terminal/tui/pages/accountsPage.js +409 -0
  471. package/dist/sdk/terminal/tui/pages/agentsPage.d.ts +74 -0
  472. package/dist/sdk/terminal/tui/pages/agentsPage.js +193 -0
  473. package/dist/sdk/terminal/tui/pages/annotatePage.d.ts +148 -0
  474. package/dist/sdk/terminal/tui/pages/annotatePage.js +576 -0
  475. package/dist/sdk/terminal/tui/pages/browserPage.d.ts +87 -0
  476. package/dist/sdk/terminal/tui/pages/browserPage.js +739 -0
  477. package/dist/sdk/terminal/tui/pages/componentsPage.d.ts +47 -0
  478. package/dist/sdk/terminal/tui/pages/componentsPage.js +119 -0
  479. package/dist/sdk/terminal/tui/pages/contextPage.d.ts +91 -0
  480. package/dist/sdk/terminal/tui/pages/contextPage.js +585 -0
  481. package/dist/sdk/terminal/tui/pages/doctorPage.d.ts +39 -0
  482. package/dist/sdk/terminal/tui/pages/doctorPage.js +233 -0
  483. package/dist/sdk/terminal/tui/pages/followUpQueuePage.d.ts +34 -0
  484. package/dist/sdk/terminal/tui/pages/followUpQueuePage.js +130 -0
  485. package/dist/sdk/terminal/tui/pages/hubPage.d.ts +52 -0
  486. package/dist/sdk/terminal/tui/pages/hubPage.js +292 -0
  487. package/dist/sdk/terminal/tui/pages/logPage.d.ts +38 -0
  488. package/dist/sdk/terminal/tui/pages/logPage.js +189 -0
  489. package/dist/sdk/terminal/tui/pages/permissionsPage.d.ts +44 -0
  490. package/dist/sdk/terminal/tui/pages/permissionsPage.js +124 -0
  491. package/dist/sdk/terminal/tui/pages/pluginsPage.d.ts +65 -0
  492. package/dist/sdk/terminal/tui/pages/pluginsPage.js +519 -0
  493. package/dist/sdk/terminal/tui/pages/remoteControlPage.d.ts +32 -0
  494. package/dist/sdk/terminal/tui/pages/remoteControlPage.js +170 -0
  495. package/dist/sdk/terminal/tui/pages/settingsPage.d.ts +63 -0
  496. package/dist/sdk/terminal/tui/pages/settingsPage.js +103 -0
  497. package/dist/sdk/terminal/tui/pages/subagentsPage.d.ts +24 -0
  498. package/dist/sdk/terminal/tui/pages/subagentsPage.js +155 -0
  499. package/dist/sdk/terminal/tui/pages/textPage.d.ts +17 -0
  500. package/dist/sdk/terminal/tui/pages/textPage.js +52 -0
  501. package/dist/sdk/terminal/tui/pages/trajectoryPage.d.ts +66 -0
  502. package/dist/sdk/terminal/tui/pages/trajectoryPage.js +490 -0
  503. package/dist/sdk/terminal/tui/pages/usagePage.d.ts +45 -0
  504. package/dist/sdk/terminal/tui/pages/usagePage.js +397 -0
  505. package/dist/sdk/terminal/tui/pages/worktreesPage.d.ts +72 -0
  506. package/dist/sdk/terminal/tui/pages/worktreesPage.js +203 -0
  507. package/dist/sdk/terminal/tui/piAdapter.d.ts +17 -0
  508. package/dist/sdk/terminal/tui/piAdapter.js +46 -0
  509. package/dist/sdk/terminal/tui/planMode.d.ts +2 -0
  510. package/dist/sdk/terminal/tui/planMode.js +2 -0
  511. package/dist/sdk/terminal/tui/pluginCommands.d.ts +16 -0
  512. package/dist/sdk/terminal/tui/pluginCommands.js +41 -0
  513. package/dist/sdk/terminal/tui/qr.d.ts +4 -0
  514. package/dist/sdk/terminal/tui/qr.js +35 -0
  515. package/dist/sdk/terminal/tui/questionPicker.d.ts +20 -0
  516. package/dist/sdk/terminal/tui/questionPicker.js +150 -0
  517. package/dist/sdk/terminal/tui/questions.d.ts +21 -0
  518. package/dist/sdk/terminal/tui/questions.js +42 -0
  519. package/dist/sdk/terminal/tui/runtime.d.ts +117 -0
  520. package/dist/sdk/terminal/tui/runtime.js +544 -0
  521. package/dist/sdk/terminal/tui/search.d.ts +22 -0
  522. package/dist/sdk/terminal/tui/search.js +61 -0
  523. package/dist/sdk/terminal/tui/selection.d.ts +16 -0
  524. package/dist/sdk/terminal/tui/selection.js +16 -0
  525. package/dist/sdk/terminal/tui/sessionPicker.d.ts +40 -0
  526. package/dist/sdk/terminal/tui/sessionPicker.js +141 -0
  527. package/dist/sdk/terminal/tui/sessionUi.d.ts +3 -0
  528. package/dist/sdk/terminal/tui/sessionUi.js +30 -0
  529. package/dist/sdk/terminal/tui/settingsModel.d.ts +14 -0
  530. package/dist/sdk/terminal/tui/settingsModel.js +195 -0
  531. package/dist/sdk/terminal/tui/sideQuestion.d.ts +57 -0
  532. package/dist/sdk/terminal/tui/sideQuestion.js +241 -0
  533. package/dist/sdk/terminal/tui/skillInvocation.d.ts +28 -0
  534. package/dist/sdk/terminal/tui/skillInvocation.js +63 -0
  535. package/dist/sdk/terminal/tui/status.d.ts +18 -0
  536. package/dist/sdk/terminal/tui/status.js +67 -0
  537. package/dist/sdk/terminal/tui/theme.d.ts +54 -0
  538. package/dist/sdk/terminal/tui/theme.js +185 -0
  539. package/dist/sdk/terminal/tui/thinkingLevels.d.ts +11 -0
  540. package/dist/sdk/terminal/tui/thinkingLevels.js +31 -0
  541. package/dist/sdk/terminal/tui/treeModel.d.ts +79 -0
  542. package/dist/sdk/terminal/tui/treeModel.js +483 -0
  543. package/dist/sdk/terminal/tui/treePicker.d.ts +49 -0
  544. package/dist/sdk/terminal/tui/treePicker.js +251 -0
  545. package/dist/sdk/terminal/tui/ui.d.ts +49 -0
  546. package/dist/sdk/terminal/tui/ui.js +149 -0
  547. package/dist/sdk/terminal/tui/variantCommands.d.ts +32 -0
  548. package/dist/sdk/terminal/tui/variantCommands.js +359 -0
  549. package/dist/sdk/terminal/tui/workingStatus.d.ts +9 -0
  550. package/dist/sdk/terminal/tui/workingStatus.js +229 -0
  551. package/dist/sdk/terminal/variantControl.d.ts +24 -0
  552. package/dist/sdk/terminal/variantControl.js +145 -0
  553. package/dist/sdk/tools/askUser.d.ts +6 -0
  554. package/dist/sdk/tools/askUser.js +92 -0
  555. package/dist/sdk/tools/defaultSkills.d.ts +23 -0
  556. package/dist/sdk/tools/defaultSkills.js +46 -0
  557. package/dist/sdk/tools/definitions.d.ts +32 -0
  558. package/dist/sdk/tools/definitions.js +133 -0
  559. package/dist/sdk/tools/dispatch.d.ts +16 -0
  560. package/dist/sdk/tools/dispatch.js +92 -0
  561. package/dist/sdk/tools/getCapabilities.d.ts +31 -0
  562. package/dist/sdk/tools/getCapabilities.js +34 -0
  563. package/dist/sdk/tools/harnessTools.d.ts +8 -0
  564. package/dist/sdk/tools/harnessTools.js +20 -0
  565. package/dist/sdk/tools/sessionName.d.ts +16 -0
  566. package/dist/sdk/tools/sessionName.js +78 -0
  567. package/dist/sdk/tools/spawnSubagent.d.ts +4 -0
  568. package/dist/sdk/tools/spawnSubagent.js +63 -0
  569. package/dist/sdk/tools/todo.d.ts +15 -0
  570. package/dist/sdk/tools/todo.js +66 -0
  571. package/dist/sdk/tools/types.d.ts +48 -0
  572. package/dist/sdk/tools/types.js +1 -0
  573. package/dist/sdk/usage/analytics.d.ts +20 -0
  574. package/dist/sdk/usage/analytics.js +151 -0
  575. package/dist/sdk/usage/ledger.d.ts +38 -0
  576. package/dist/sdk/usage/ledger.js +142 -0
  577. package/dist/sdk/usage/limits/adapters.d.ts +11 -0
  578. package/dist/sdk/usage/limits/adapters.js +349 -0
  579. package/dist/sdk/usage/limits/capture.d.ts +8 -0
  580. package/dist/sdk/usage/limits/capture.js +47 -0
  581. package/dist/sdk/usage/limits/http.d.ts +12 -0
  582. package/dist/sdk/usage/limits/http.js +51 -0
  583. package/dist/sdk/usage/limits/normalize.d.ts +15 -0
  584. package/dist/sdk/usage/limits/normalize.js +211 -0
  585. package/dist/sdk/usage/limits/service.d.ts +30 -0
  586. package/dist/sdk/usage/limits/service.js +176 -0
  587. package/dist/sdk/usage/limits/types.d.ts +65 -0
  588. package/dist/sdk/usage/limits/types.js +1 -0
  589. package/dist/sdk/usage/serverMethods.d.ts +3 -0
  590. package/dist/sdk/usage/serverMethods.js +22 -0
  591. package/dist/sdk/usage/service.d.ts +32 -0
  592. package/dist/sdk/usage/service.js +66 -0
  593. package/dist/sdk/usage/settings.d.ts +7 -0
  594. package/dist/sdk/usage/settings.js +28 -0
  595. package/dist/sdk/usage/types.d.ts +60 -0
  596. package/dist/sdk/usage/types.js +4 -0
  597. package/dist/sdk/variant/components.d.ts +34 -0
  598. package/dist/sdk/variant/components.js +230 -0
  599. package/dist/sdk/variant/materialise.d.ts +66 -0
  600. package/dist/sdk/variant/materialise.js +81 -0
  601. package/dist/sdk/variant/migrate.d.ts +4 -0
  602. package/dist/sdk/variant/migrate.js +41 -0
  603. package/dist/sdk/variant/seed.d.ts +20 -0
  604. package/dist/sdk/variant/seed.js +116 -0
  605. package/dist/sdk/variant/store.d.ts +114 -0
  606. package/dist/sdk/variant/store.js +256 -0
  607. package/dist/sdk/variant/surface.d.ts +56 -0
  608. package/dist/sdk/variant/surface.js +81 -0
  609. package/dist/sdk/variant/trust.d.ts +27 -0
  610. package/dist/sdk/variant/trust.js +64 -0
  611. package/dist/sdk/variant/variant.d.ts +71 -0
  612. package/dist/sdk/variant/variant.js +331 -0
  613. package/dist/sdk/web/markdown.d.ts +10 -0
  614. package/dist/sdk/web/markdown.js +66 -0
  615. package/dist/sdk/web/part.d.ts +10 -0
  616. package/dist/sdk/web/part.js +6 -0
  617. package/dist/sdk/web/safeRequest.d.ts +34 -0
  618. package/dist/sdk/web/safeRequest.js +175 -0
  619. package/dist/sdk/web/search.d.ts +53 -0
  620. package/dist/sdk/web/search.js +168 -0
  621. package/dist/sdk/web/serverMethods.d.ts +3 -0
  622. package/dist/sdk/web/serverMethods.js +7 -0
  623. package/dist/sdk/web/text.d.ts +2 -0
  624. package/dist/sdk/web/text.js +7 -0
  625. package/dist/sdk/web/tools.d.ts +22 -0
  626. package/dist/sdk/web/tools.js +195 -0
  627. package/dist/sdk/web/turndown-plugin-gfm.d.ts +4 -0
  628. package/dist/sdk/wiki/notes.d.ts +68 -0
  629. package/dist/sdk/wiki/notes.js +297 -0
  630. package/dist/sdk/wiki/serverMethods.d.ts +3 -0
  631. package/dist/sdk/wiki/serverMethods.js +26 -0
  632. package/dist/sdk/worktrees/cli.d.ts +11 -0
  633. package/dist/sdk/worktrees/cli.js +146 -0
  634. package/dist/sdk/worktrees/copy.d.ts +9 -0
  635. package/dist/sdk/worktrees/copy.js +111 -0
  636. package/dist/sdk/worktrees/git.d.ts +18 -0
  637. package/dist/sdk/worktrees/git.js +89 -0
  638. package/dist/sdk/worktrees/serverMethods.d.ts +3 -0
  639. package/dist/sdk/worktrees/serverMethods.js +30 -0
  640. package/dist/sdk/worktrees/service.d.ts +73 -0
  641. package/dist/sdk/worktrees/service.js +483 -0
  642. package/dist/sdk/worktrees/setup.d.ts +23 -0
  643. package/dist/sdk/worktrees/setup.js +65 -0
  644. package/dist/sdk/worktrees/snapshot.d.ts +16 -0
  645. package/dist/sdk/worktrees/snapshot.js +83 -0
  646. package/dist/sdk/worktrees/types.d.ts +91 -0
  647. package/dist/sdk/worktrees/types.js +1 -0
  648. package/dist/sdk/world/actions.d.ts +23 -0
  649. package/dist/sdk/world/actions.js +31 -0
  650. package/dist/sdk/world/cli.d.ts +12 -0
  651. package/dist/sdk/world/cli.js +166 -0
  652. package/dist/sdk/world/images.d.ts +20 -0
  653. package/dist/sdk/world/images.js +48 -0
  654. package/dist/sdk/world/untrusted.d.ts +12 -0
  655. package/dist/sdk/world/untrusted.js +20 -0
  656. package/dist/sdk/world/world.d.ts +75 -0
  657. package/dist/sdk/world/world.js +117 -0
  658. package/dist/terminal-opentui.js +30986 -0
  659. package/dist/terminal-pi.js +3008 -610
  660. package/docs/README.md +45 -1
  661. package/docs/architecture/00-overview.md +171 -0
  662. package/docs/architecture/01-extension-points.md +78 -0
  663. package/docs/architecture/02-sessions-and-runs.md +505 -0
  664. package/docs/architecture/03-variants.md +122 -0
  665. package/docs/architecture/04-prompt.md +277 -0
  666. package/docs/architecture/05-refinement.md +134 -0
  667. package/docs/architecture/06-plugins-and-capabilities.md +208 -0
  668. package/docs/architecture/07-tools-and-gate.md +245 -0
  669. package/docs/architecture/08-memory-and-history.md +100 -0
  670. package/docs/architecture/09-accounts-and-connectors.md +153 -0
  671. package/docs/architecture/10-server-protocol.md +403 -0
  672. package/docs/architecture/11-terminal.md +555 -0
  673. package/docs/architecture/12-storage.md +118 -0
  674. package/docs/architecture/13-world-tools.md +114 -0
  675. package/docs/architecture/14-surfaces-and-parity.md +151 -0
  676. package/docs/architecture/15-remote-control.md +120 -0
  677. package/docs/architecture/README.md +143 -0
  678. package/docs/architecture/proposals/PROP-0001-reporting-section.md +106 -0
  679. package/docs/architecture/proposals/PROP-0002-retain-rollout-workspaces.md +104 -0
  680. package/docs/architecture/proposals/PROP-0003-executor-settings.md +81 -0
  681. package/docs/architecture/proposals/PROP-0004-flexible-reporting-guidance.md +71 -0
  682. package/docs/architecture/proposals/PROP-0005-xharness-cli-name.md +78 -0
  683. package/docs/architecture/proposals/PROP-0006-run-checklist.md +72 -0
  684. package/docs/architecture/proposals/PROP-0007-run-continuation.md +80 -0
  685. package/docs/architecture/proposals/PROP-0008-lessons-from-runs.md +80 -0
  686. package/docs/architecture/proposals/PROP-0009-foundation-and-variants.md +78 -0
  687. package/docs/architecture/proposals/PROP-0010-session-names.md +73 -0
  688. package/docs/architecture/proposals/PROP-0011-doctor.md +63 -0
  689. package/docs/architecture/proposals/PROP-0012-release-baseline.md +56 -0
  690. package/docs/architecture/proposals/PROP-0013-resource-browser.md +58 -0
  691. package/docs/architecture/proposals/PROP-0014-fullscreen-browser-tabs.md +58 -0
  692. package/docs/architecture/proposals/PROP-0015-one-capability-surface.md +88 -0
  693. package/docs/architecture/proposals/PROP-0016-managed-worktrees.md +156 -0
  694. package/docs/architecture/proposals/PROP-0017-page-annotations.md +131 -0
  695. package/docs/architecture/proposals/PROP-0018-annotation-queue-and-app-targets.md +183 -0
  696. package/docs/architecture/proposals/PROP-0019-contextual-side-questions.md +122 -0
  697. package/docs/architecture/proposals/PROP-0020-builtin-feature-plugins.md +105 -0
  698. package/docs/architecture/proposals/PROP-0021-command-namespaces-and-duplicates.md +99 -0
  699. package/docs/architecture/proposals/PROP-0022-plan-only-questions.md +102 -0
  700. package/docs/architecture/proposals/PROP-0023-xagent-cli-name.md +61 -0
  701. package/docs/architecture/proposals/PROP-0024-question-sketch-previews.md +130 -0
  702. package/docs/architecture/proposals/PROP-0025-contextual-question-wireframes.md +49 -0
  703. package/docs/architecture/proposals/PROP-0026-connected-sketch-display.md +96 -0
  704. package/docs/architecture/proposals/PROP-0027-xingular-agent-product-identity.md +60 -0
  705. package/docs/architecture/proposals/PROP-0028-normalize-question-wireframes.md +55 -0
  706. package/docs/architecture/proposals/PROP-0029-agent-profiles.md +124 -0
  707. package/docs/architecture/proposals/PROP-0030-subagent-title.md +86 -0
  708. package/docs/architecture/proposals/PROP-0031-plugin-command-owner-namespaces.md +54 -0
  709. package/docs/architecture/proposals/PROP-0032-planning-quality.md +196 -0
  710. package/docs/architecture/proposals/PROP-0033-compaction-plan-checkpoints.md +75 -0
  711. package/docs/architecture/proposals/PROP-0034-conversation-fast-mode.md +120 -0
  712. package/docs/architecture/proposals/PROP-0035-retain-subagent-status.md +47 -0
  713. package/docs/architecture/proposals/PROP-0036-first-class-harness-commands.md +59 -0
  714. package/docs/architecture/proposals/PROP-0037-workspace-write-boundary.md +63 -0
  715. package/docs/architecture/proposals/PROP-0038-annotate-open-shadow-roots.md +73 -0
  716. package/docs/architecture/proposals/PROP-0039-workspace-boundary-hardening.md +139 -0
  717. package/docs/architecture/proposals/PROP-0040-one-launch-path.md +87 -0
  718. package/docs/architecture/proposals/PROP-0041-bounded-work-slices.md +260 -0
  719. package/docs/architecture/proposals/PROP-0042-usage-and-provider-limits.md +127 -0
  720. package/docs/architecture/proposals/PROP-0043-read-only-plan-bash.md +74 -0
  721. package/docs/architecture/proposals/PROP-0044-work-slice-defaults.md +93 -0
  722. package/docs/architecture/proposals/PROP-0045-rename-checklist-to-todo.md +132 -0
  723. package/docs/architecture/proposals/PROP-0046-progress-aware-stall-guards.md +82 -0
  724. package/docs/architecture/proposals/PROP-0047-plugins-hub-separation.md +122 -0
  725. package/docs/architecture/proposals/PROP-0048-simple-annotate.md +85 -0
  726. package/docs/architecture/proposals/PROP-0049-context-attribution.md +415 -0
  727. package/docs/architecture/proposals/PROP-0050-run-stop-codes-and-refusals.md +30 -0
  728. package/docs/architecture/proposals/PROP-0051-unfinished-run-handoff.md +110 -0
  729. package/docs/architecture/proposals/PROP-0052-terminal-refine-and-variant-switch.md +111 -0
  730. package/docs/architecture/proposals/README.md +123 -0
  731. package/docs/decisions/ADR-0001-owned-terminal.md +10 -3
  732. package/docs/decisions/ADR-0003-shared-asynchronous-subagents.md +3 -1
  733. package/docs/decisions/ADR-0004-fullscreen-terminal-layout.md +3 -2
  734. package/docs/decisions/ADR-0006-opentui-only-terminal.md +47 -0
  735. package/docs/decisions/ADR-0007-reporting-section.md +33 -0
  736. package/docs/decisions/ADR-0008-flexible-reporting-guidance.md +41 -0
  737. package/docs/decisions/ADR-0009-xharness-command.md +39 -0
  738. package/docs/decisions/ADR-0010-lessons-in-the-wiki.md +31 -0
  739. package/docs/decisions/ADR-0011-foundation-and-variants.md +28 -0
  740. package/docs/decisions/ADR-0012-native-session-names.md +34 -0
  741. package/docs/decisions/ADR-0013-doctor.md +27 -0
  742. package/docs/decisions/ADR-0014-public-release-baseline.md +22 -0
  743. package/docs/decisions/ADR-0015-resource-browser.md +28 -0
  744. package/docs/decisions/ADR-0016-fullscreen-browser-tabs.md +31 -0
  745. package/docs/decisions/ADR-0017-one-capability-surface.md +34 -0
  746. package/docs/decisions/ADR-0018-builtin-feature-plugins.md +35 -0
  747. package/docs/decisions/ADR-0019-managed-git-worktrees.md +31 -0
  748. package/docs/decisions/ADR-0020-page-annotations.md +37 -0
  749. package/docs/decisions/ADR-0021-required-command-namespaces.md +40 -0
  750. package/docs/decisions/ADR-0022-plan-only-question-tools.md +34 -0
  751. package/docs/decisions/ADR-0023-contextual-side-question-runs.md +35 -0
  752. package/docs/decisions/ADR-0024-xagent-command.md +40 -0
  753. package/docs/decisions/ADR-0025-question-choice-sketches.md +49 -0
  754. package/docs/decisions/ADR-0026-contextual-question-wireframes.md +58 -0
  755. package/docs/decisions/ADR-0027-connected-sketch-display.md +62 -0
  756. package/docs/decisions/ADR-0028-xingular-agent-product-identity.md +56 -0
  757. package/docs/decisions/ADR-0029-normalized-question-wireframe-borders.md +33 -0
  758. package/docs/decisions/ADR-0030-agent-profiles.md +43 -0
  759. package/docs/decisions/ADR-0031-plugin-command-owner-namespaces.md +37 -0
  760. package/docs/decisions/ADR-0032-compaction-run-checkpoints.md +35 -0
  761. package/docs/decisions/ADR-0033-plan-mode-research-delegation.md +47 -0
  762. package/docs/decisions/ADR-0034-first-class-harness-terminal-commands.md +25 -0
  763. package/docs/decisions/ADR-0035-one-launch-path.md +40 -0
  764. package/docs/decisions/ADR-0036-workspace-write-operation-boundary.md +54 -0
  765. package/docs/decisions/ADR-0037-usage-ledger-and-provider-limits.md +44 -0
  766. package/docs/decisions/ADR-0038-plan-bash-os-read-only.md +29 -0
  767. package/docs/decisions/ADR-0039-progress-aware-stall-guards.md +43 -0
  768. package/docs/decisions/ADR-0040-architecture-change-workflow.md +31 -0
  769. package/docs/decisions/ADR-0041-plugins-hub-separation.md +41 -0
  770. package/docs/decisions/ADR-0042-windows-shell-without-sandbox.md +40 -0
  771. package/docs/decisions/ADR-0043-parents-continue-stopped-subagents.md +49 -0
  772. package/docs/decisions/ADR-0044-annotations-pending-or-sent.md +24 -0
  773. package/docs/decisions/ADR-0045-default-plugin-authoring-skill.md +9 -0
  774. package/docs/decisions/ADR-0046-hash-bound-plugin-proposals.md +20 -0
  775. package/docs/decisions/ADR-0047-links-open-with-the-os-handler.md +47 -0
  776. package/docs/decisions/ADR-0048-required-skills-from-a-message.md +42 -0
  777. package/docs/decisions/ADR-0050-approved-window-screenshots.md +19 -0
  778. package/docs/decisions/ADR-0051-terminal-decision-wait.md +10 -0
  779. package/docs/decisions/ADR-0052-per-profile-subagent-budgets.md +25 -0
  780. package/docs/decisions/ADR-0053-no-repeated-work-guard.md +45 -0
  781. package/docs/decisions/ADR-0054-terminal-reply-heartbeat-and-stall.md +52 -0
  782. package/docs/decisions/ADR-0055-plan-output-repair.md +51 -0
  783. package/docs/decisions/ADR-0056-remote-control.md +53 -0
  784. package/docs/decisions/ADR-0057-structured-plan-outcomes.md +39 -0
  785. package/docs/decisions/ADR-0058-ask-user-only-plan-clarification.md +36 -0
  786. package/docs/decisions/ADR-0059-run-diagnostic-evidence.md +35 -0
  787. package/docs/decisions/ADR-0060-approvals-are-controls.md +40 -0
  788. package/docs/decisions/ADR-0061-strict-plugin-command-namespaces.md +41 -0
  789. package/docs/decisions/ADR-0062-shared-account-state.md +67 -0
  790. package/docs/decisions/ADR-0063-unfinished-work-handoffs.md +34 -0
  791. package/docs/decisions/ADR-0064-account-model-fallback-on-resume.md +79 -0
  792. package/docs/decisions/ADR-0065-variant-switch-at-turn-boundaries.md +31 -0
  793. package/docs/decisions/ADR-0066-guided-refinement-from-turn-snapshots.md +37 -0
  794. package/docs/decisions/ADR-0067-cache-stable-compaction-checkpoint.md +54 -0
  795. package/docs/decisions/ADR-0068-scope-and-completion-report.md +60 -0
  796. package/docs/decisions/ADR-0069-stop-gate-and-finish.md +136 -0
  797. package/docs/decisions/ADR-0070-terminal-slice-continuation.md +49 -0
  798. package/docs/decisions/ADR-0071-completion-check.md +104 -0
  799. package/docs/decisions/ADR-0072-codex-prompts-and-goal.md +108 -0
  800. package/docs/decisions/ADR-0073-large-reporting-prompt.md +89 -0
  801. package/docs/decisions/ADR-0074-report-content-not-report-blocks.md +90 -0
  802. package/docs/decisions/ADR-0075-no-todo-gate.md +84 -0
  803. package/docs/decisions/ADR-0076-codex-final-answer-verbatim.md +98 -0
  804. package/docs/decisions/ADR-0077-plan-runs-may-conclude-no-plan-needed.md +120 -0
  805. package/docs/decisions/ADR-0078-child-aware-stall-watch.md +46 -0
  806. package/docs/decisions/ADR-0079-phase-led-reporting-guidance.md +72 -0
  807. package/docs/decisions/ADR-0080-fixed-width-question-sketch-canvas.md +50 -0
  808. package/docs/decisions/ADR-0081-no-work-slice-budget-by-default.md +36 -0
  809. package/docs/decisions/ADR-0082-connected-brave-browser.md +72 -0
  810. package/docs/decisions/ADR-0083-one-live-session-runtime.md +256 -0
  811. package/docs/doctor.md +95 -0
  812. package/docs/experiments/EXP-0001-terminal-input-latency/plan.md +81 -0
  813. package/docs/experiments/EXP-0001-terminal-input-latency/results.md +46 -0
  814. package/docs/experiments/EXP-0002-opentui-typing-latency/plan.md +70 -0
  815. package/docs/experiments/EXP-0002-opentui-typing-latency/results.md +92 -0
  816. package/docs/experiments/EXP-0003-performance-audit/data/session-runtime-replication.json +420 -0
  817. package/docs/experiments/EXP-0003-performance-audit/data/session-runtime.json +420 -0
  818. package/docs/experiments/EXP-0003-performance-audit/data/terminal-compact.json +376 -0
  819. package/docs/experiments/EXP-0003-performance-audit/data/terminal-history.json +422 -0
  820. package/docs/experiments/EXP-0003-performance-audit/data/terminal-question.json +95 -0
  821. package/docs/experiments/EXP-0003-performance-audit/data/terminal-wide.json +1036 -0
  822. package/docs/experiments/EXP-0003-performance-audit/plan.md +109 -0
  823. package/docs/experiments/EXP-0003-performance-audit/results.md +151 -0
  824. package/docs/features/README.md +46 -0
  825. package/docs/features/automations/README.md +41 -0
  826. package/docs/features/cores/README.md +39 -0
  827. package/docs/features/google-harness2/README.md +52 -0
  828. package/docs/features/integrations/README.md +40 -0
  829. package/docs/features/interfaces/README.md +29 -0
  830. package/docs/features/memory/README.md +28 -0
  831. package/docs/future-work.md +48 -0
  832. package/docs/handoff-2026-10-25-app-parity-and-solo-tabs.md +202 -0
  833. package/docs/parity.md +158 -0
  834. package/docs/releases/1.0.0.md +40 -0
  835. package/docs/releases/1.1.1.md +28 -0
  836. package/docs/releases/1.2.0.md +49 -0
  837. package/docs/releases/1.3.0.md +21 -0
  838. package/docs/releases/1.3.1-unstable.1.md +8 -0
  839. package/docs/releases/1.3.1-unstable.2.md +11 -0
  840. package/docs/releases/1.3.1-unstable.3.md +54 -0
  841. package/docs/releases/1.3.1-unstable.4.md +56 -0
  842. package/docs/releases/1.3.1-unstable.5.md +53 -0
  843. package/docs/releases/1.3.1-unstable.6.md +31 -0
  844. package/docs/releases/1.3.1-unstable.7.md +17 -0
  845. package/docs/releases/1.3.1-unstable.8.md +19 -0
  846. package/docs/releases/1.3.1-unstable.9.md +54 -0
  847. package/docs/releases/1.4.0-unstable.md +25 -0
  848. package/docs/releases/1.5.0-unstable.md +32 -0
  849. package/docs/releases/1.5.1-unstable.md +24 -0
  850. package/docs/releases/1.6.0-unstable.md +59 -0
  851. package/docs/releases/2.0.1-unstable.md +63 -0
  852. package/docs/releases/4.0.0.md +47 -0
  853. package/docs/releases/README.md +49 -0
  854. package/docs/study/00-index.md +112 -0
  855. package/docs/study/STUDY-0003-long-horizon-runs.md +210 -0
  856. package/docs/study/STUDY-0004-turn-end-controls.md +130 -0
  857. package/docs/study/STUDY-0005-skill-installation-guidance.md +146 -0
  858. package/docs/study/STUDY-0006-reporting-prompts.md +119 -0
  859. package/docs/study/STUDY-0007-claude-code-prompt.md +162 -0
  860. package/docs/study/STUDY-0008-browser-control.md +281 -0
  861. package/docs/study/STUDY-0009-claude-code-reporting.md +205 -0
  862. package/docs/study/arms/00-matrix.md +20 -0
  863. package/docs/study/arms/01-system-prompt.md +211 -0
  864. package/docs/study/arms/02-tools.md +79 -0
  865. package/docs/study/arms/03-subagents.md +90 -0
  866. package/docs/study/arms/04-skills.md +81 -0
  867. package/docs/study/arms/05-context-management.md +90 -0
  868. package/docs/study/arms/06-memory.md +90 -0
  869. package/docs/study/arms/07-governance.md +71 -0
  870. package/docs/study/arms/08-execution.md +69 -0
  871. package/docs/study/arms/09-observability.md +60 -0
  872. package/docs/study/arms/10-refinement.md +110 -0
  873. package/docs/study/autonomous-engineering-sources.md +277 -0
  874. package/docs/study/autonomy-sources.md +147 -0
  875. package/docs/study/btw-comparison.md +37 -0
  876. package/docs/study/feature-gap-review.md +42 -0
  877. package/docs/study/insights.md +123 -0
  878. package/docs/study/proactive-autonomy.md +408 -0
  879. package/docs/study/roadmap.md +72 -0
  880. package/docs/study/sources/claude-code.md +56 -0
  881. package/docs/study/sources/deepseek-harness.md +102 -0
  882. package/docs/study/sources/harness2.md +50 -0
  883. package/docs/study/sources/kimi-cli.md +42 -0
  884. package/docs/study/sources/omp.md +93 -0
  885. package/docs/study/sources/opencode.md +43 -0
  886. package/docs/study/sources/openhands.md +46 -0
  887. package/docs/study/sources/smolagents.md +40 -0
  888. package/docs/study/sources/swe-agent.md +34 -0
  889. package/docs/study/tui-resource-browser.md +78 -0
  890. package/docs/system-prompt-design.md +196 -0
  891. package/docs/terminal-tui.md +887 -109
  892. package/package.json +46 -13
  893. package/src/accounts/accounts.test.ts +0 -419
  894. package/src/accounts/accounts.ts +0 -760
  895. package/src/accounts/env.test.ts +0 -95
  896. package/src/accounts/env.ts +0 -338
  897. package/src/accounts/secrets.ts +0 -50
  898. package/src/accounts/store.ts +0 -338
  899. package/src/capabilities/api.ts +0 -75
  900. package/src/capabilities/runSnapshot.ts +0 -59
  901. package/src/capabilities/types.ts +0 -34
  902. package/src/cli.ts +0 -118
  903. package/src/core/bus.test.ts +0 -22
  904. package/src/core/bus.ts +0 -49
  905. package/src/core/changes.ts +0 -33
  906. package/src/core/env.ts +0 -27
  907. package/src/core/errors.ts +0 -32
  908. package/src/core/frontmatter.ts +0 -47
  909. package/src/core/fs.test.ts +0 -38
  910. package/src/core/fs.ts +0 -92
  911. package/src/core/index.ts +0 -193
  912. package/src/core/path.test.ts +0 -14
  913. package/src/core/path.ts +0 -79
  914. package/src/core/projects.ts +0 -90
  915. package/src/core/text.ts +0 -39
  916. package/src/harness.ts +0 -322
  917. package/src/hub/catalog.json +0 -123
  918. package/src/hub/cli.ts +0 -59
  919. package/src/hub/hub.test.ts +0 -205
  920. package/src/hub/hub.ts +0 -256
  921. package/src/hub/schema.ts +0 -81
  922. package/src/index.ts +0 -80
  923. package/src/mcp/connections.ts +0 -641
  924. package/src/mcp/manager.ts +0 -130
  925. package/src/mcp/oauth.ts +0 -195
  926. package/src/mcp/scopeMigration.test.ts +0 -79
  927. package/src/mcp/scopeMigration.ts +0 -204
  928. package/src/mcp/service.test.ts +0 -422
  929. package/src/mcp/service.ts +0 -560
  930. package/src/mcp/types.ts +0 -118
  931. package/src/memory/api.test.ts +0 -82
  932. package/src/memory/api.ts +0 -303
  933. package/src/memory/blocks.test.ts +0 -78
  934. package/src/memory/blocks.ts +0 -408
  935. package/src/memory/caller.ts +0 -69
  936. package/src/memory/curation.test.ts +0 -206
  937. package/src/memory/curation.ts +0 -64
  938. package/src/memory/dispatch.ts +0 -64
  939. package/src/memory/facts.test.ts +0 -41
  940. package/src/memory/facts.ts +0 -248
  941. package/src/memory/graph.ts +0 -103
  942. package/src/memory/health.test.ts +0 -130
  943. package/src/memory/health.ts +0 -74
  944. package/src/memory/maintainer.ts +0 -272
  945. package/src/memory/maintenance.test.ts +0 -192
  946. package/src/memory/maintenance.ts +0 -679
  947. package/src/memory/migrate.ts +0 -79
  948. package/src/memory/operations.ts +0 -150
  949. package/src/memory/proposals.test.ts +0 -168
  950. package/src/memory/proposals.ts +0 -584
  951. package/src/memory/recall.test.ts +0 -115
  952. package/src/memory/recall.ts +0 -279
  953. package/src/memory/references.ts +0 -77
  954. package/src/memory/runContext.ts +0 -93
  955. package/src/memory/secrets.ts +0 -6
  956. package/src/memory/store.test.ts +0 -66
  957. package/src/memory/store.ts +0 -385
  958. package/src/memory/trajectory.test.ts +0 -178
  959. package/src/memory/trajectory.ts +0 -220
  960. package/src/memory/wiki.test.ts +0 -47
  961. package/src/memory/wiki.ts +0 -423
  962. package/src/memory/wikiIndex.test.ts +0 -88
  963. package/src/memory/wikiIndex.ts +0 -117
  964. package/src/plugins/api.ts +0 -181
  965. package/src/plugins/attachments.test.ts +0 -84
  966. package/src/plugins/attachments.ts +0 -141
  967. package/src/plugins/builtin.ts +0 -84
  968. package/src/plugins/catalogue.test.ts +0 -254
  969. package/src/plugins/catalogue.ts +0 -251
  970. package/src/plugins/cli.ts +0 -184
  971. package/src/plugins/discover.ts +0 -151
  972. package/src/plugins/firstParty.test.ts +0 -143
  973. package/src/plugins/firstParty.ts +0 -129
  974. package/src/plugins/hooks.test.ts +0 -250
  975. package/src/plugins/hooks.ts +0 -239
  976. package/src/plugins/identity.ts +0 -37
  977. package/src/plugins/install.test.ts +0 -107
  978. package/src/plugins/install.ts +0 -106
  979. package/src/plugins/inventory.ts +0 -123
  980. package/src/plugins/manifest.ts +0 -76
  981. package/src/plugins/plugins.test.ts +0 -205
  982. package/src/plugins/plugins.ts +0 -189
  983. package/src/plugins/proposal.ts +0 -121
  984. package/src/plugins/runtime.test.ts +0 -40
  985. package/src/plugins/runtime.ts +0 -82
  986. package/src/plugins/trust.ts +0 -142
  987. package/src/plugins/types.ts +0 -149
  988. package/src/prompt/compile.test.ts +0 -261
  989. package/src/prompt/compile.ts +0 -732
  990. package/src/server/methods.ts +0 -355
  991. package/src/server/remote.ts +0 -77
  992. package/src/server/rpc.ts +0 -116
  993. package/src/server/serve.ts +0 -28
  994. package/src/server/server.test.ts +0 -193
  995. package/src/sessions/approvals.test.ts +0 -49
  996. package/src/sessions/approvals.ts +0 -140
  997. package/src/sessions/contracts.ts +0 -336
  998. package/src/sessions/conversation.test.ts +0 -233
  999. package/src/sessions/extensionSession.test.ts +0 -74
  1000. package/src/sessions/extensionUi.test.ts +0 -65
  1001. package/src/sessions/extensionUi.ts +0 -102
  1002. package/src/sessions/history.ts +0 -51
  1003. package/src/sessions/lineageJoin.ts +0 -75
  1004. package/src/sessions/policy.ts +0 -36
  1005. package/src/sessions/pricing.ts +0 -60
  1006. package/src/sessions/questionBatches.test.ts +0 -110
  1007. package/src/sessions/reasoningSummaries.ts +0 -59
  1008. package/src/sessions/registry.ts +0 -412
  1009. package/src/sessions/runIndex.ts +0 -99
  1010. package/src/sessions/runStore.test.ts +0 -152
  1011. package/src/sessions/runStore.ts +0 -346
  1012. package/src/sessions/runner.ts +0 -610
  1013. package/src/sessions/runtimeResources.test.ts +0 -61
  1014. package/src/sessions/sessions.test.ts +0 -588
  1015. package/src/sessions/sessions.ts +0 -331
  1016. package/src/sessions/subagentService.test.ts +0 -159
  1017. package/src/sessions/subagentService.ts +0 -236
  1018. package/src/sessions/subagents.ts +0 -97
  1019. package/src/skills/registry.test.ts +0 -104
  1020. package/src/skills/registry.ts +0 -413
  1021. package/src/terminal/accountsMenu.test.ts +0 -225
  1022. package/src/terminal/accountsMenu.ts +0 -382
  1023. package/src/terminal/cli.ts +0 -149
  1024. package/src/terminal/client.ts +0 -74
  1025. package/src/terminal/control.test.ts +0 -23
  1026. package/src/terminal/control.ts +0 -23
  1027. package/src/terminal/controller.ts +0 -354
  1028. package/src/terminal/hubMenu.ts +0 -24
  1029. package/src/terminal/launch.test.ts +0 -25
  1030. package/src/terminal/launch.ts +0 -48
  1031. package/src/terminal/piExtension.lifecycle.test.ts +0 -55
  1032. package/src/terminal/piExtension.ts +0 -295
  1033. package/src/terminal/pluginControl.test.ts +0 -146
  1034. package/src/terminal/pluginMenu.ts +0 -112
  1035. package/src/terminal/socket.test.ts +0 -94
  1036. package/src/terminal/socket.ts +0 -256
  1037. package/src/terminal/standalone.test.ts +0 -167
  1038. package/src/terminal/standalone.ts +0 -165
  1039. package/src/terminal/terminal.test.ts +0 -534
  1040. package/src/terminal/terminals.ts +0 -661
  1041. package/src/terminal/trajectory.test.ts +0 -66
  1042. package/src/terminal/trajectory.ts +0 -44
  1043. package/src/terminal/tui/application.test.ts +0 -290
  1044. package/src/terminal/tui/application.ts +0 -653
  1045. package/src/terminal/tui/commands.test.ts +0 -278
  1046. package/src/terminal/tui/commands.ts +0 -443
  1047. package/src/terminal/tui/dialogs.ts +0 -301
  1048. package/src/terminal/tui/editor.test.ts +0 -113
  1049. package/src/terminal/tui/editor.ts +0 -109
  1050. package/src/terminal/tui/keybindings.test.ts +0 -30
  1051. package/src/terminal/tui/keybindings.ts +0 -59
  1052. package/src/terminal/tui/piAdapter.ts +0 -62
  1053. package/src/terminal/tui/planMode.test.ts +0 -10
  1054. package/src/terminal/tui/planMode.ts +0 -12
  1055. package/src/terminal/tui/presentation.test.ts +0 -79
  1056. package/src/terminal/tui/questions.test.ts +0 -41
  1057. package/src/terminal/tui/questions.ts +0 -47
  1058. package/src/terminal/tui/runtime.socket.test.ts +0 -178
  1059. package/src/terminal/tui/runtime.test.ts +0 -225
  1060. package/src/terminal/tui/runtime.ts +0 -403
  1061. package/src/terminal/tui/screen.test.ts +0 -143
  1062. package/src/terminal/tui/screen.ts +0 -121
  1063. package/src/terminal/tui/sessionUi.ts +0 -24
  1064. package/src/terminal/tui/settings.test.ts +0 -150
  1065. package/src/terminal/tui/settings.ts +0 -188
  1066. package/src/terminal/tui/skillInvocation.test.ts +0 -71
  1067. package/src/terminal/tui/skillInvocation.ts +0 -51
  1068. package/src/terminal/tui/status.test.ts +0 -48
  1069. package/src/terminal/tui/status.ts +0 -82
  1070. package/src/terminal/tui/theme.ts +0 -185
  1071. package/src/terminal/tui/tools.test.ts +0 -145
  1072. package/src/terminal/tui/tools.ts +0 -142
  1073. package/src/terminal/tui/trajectoryPanel.test.ts +0 -99
  1074. package/src/terminal/tui/trajectoryPanel.ts +0 -226
  1075. package/src/terminal/tui/transcript.test.ts +0 -39
  1076. package/src/terminal/tui/transcript.ts +0 -135
  1077. package/src/terminal/tui/ui.test.ts +0 -313
  1078. package/src/terminal/tui/ui.ts +0 -166
  1079. package/src/terminal/tui/welcome.ts +0 -102
  1080. package/src/terminal/tui/workingStatus.test.ts +0 -44
  1081. package/src/terminal/tui/workingStatus.ts +0 -238
  1082. package/src/tools/askUser.test.ts +0 -69
  1083. package/src/tools/askUser.ts +0 -59
  1084. package/src/tools/definitions.ts +0 -228
  1085. package/src/tools/maintenance.ts +0 -29
  1086. package/src/tools/memoryTools.ts +0 -22
  1087. package/src/tools/pluginPropose.ts +0 -41
  1088. package/src/tools/registryWrite.test.ts +0 -101
  1089. package/src/tools/registryWrite.ts +0 -182
  1090. package/src/tools/spawnSubagent.ts +0 -47
  1091. package/src/tools/types.ts +0 -41
  1092. package/src/web/safeRequest.ts +0 -171
  1093. package/src/web/text.ts +0 -53
  1094. package/src/web/tools.ts +0 -134
  1095. package/src/web/web.test.ts +0 -141
@@ -0,0 +1,871 @@
1
+ // The page helper both front ends run inside a web page to capture and reveal note targets: the
2
+ // Harness's own headed browser and a host's web view (PROP-0017). It is plain DOM code with a pull
3
+ // model: the front end calls it with one operation (`identity`, `begin`, `capture`, `next`, `toast`,
4
+ // `cancel`, `resolve`, `reveal`) and reads the JSON it returns. `begin` with kind `inspect` turns on
5
+ // the inspector (PROP-0018): hover outlines, a click or a text drag opens a comment popover, and
6
+ // each submitted comment waits for `next`. The page never calls out. Everything it
7
+ // returns is page-controlled data, never authentication; the caller validates it before saving.
8
+ // No note bodies or host capabilities enter the page.
9
+ /** The helper's source. `__ARGS__` is replaced with one JSON operation; the expression evaluates to a JSON string. */
10
+ export const PAGE_SCRIPT = String.raw `(() => {
11
+ const args = __ARGS__
12
+ try {
13
+ const key = Symbol.for('xingular.browser.annotations.page.v2')
14
+ if (!globalThis[key]) {
15
+ globalThis[key] = (() => {
16
+ // This fallback also works on non-secure HTTP pages. Neither token is a secret.
17
+ const documentId = globalThis.crypto?.randomUUID?.() ?? 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, char => {
18
+ const random = Math.floor(Math.random() * 16)
19
+ return (char === 'x' ? random : (random & 3) | 8).toString(16)
20
+ })
21
+ const excluded = 'script,style,noscript,template,input,textarea,select,option,iframe,object,embed,[contenteditable],[role="textbox"],[hidden],[inert],[aria-hidden="true"],[data-sensitive],[data-private],[data-annotation-overlay],[data-harness-annotation-overlay],[autocomplete*="password"],[autocomplete*="cc-"],[autocomplete*="one-time-code"]'
22
+ const overlays = new WeakSet()
23
+ const cp = value => Array.from(value)
24
+ const norm = value => String(value ?? '').replace(/\s+/gu, ' ').trim()
25
+ const bounded = (value, size) => cp(norm(value)).slice(0, size).join('')
26
+ const validString = (value, size) => typeof value === 'string' && cp(value).length <= size
27
+ let pending = null
28
+ let picked = null
29
+ let listeners = []
30
+ let mark = null
31
+ let overlay = null
32
+ let frame = 0
33
+ let observer = null
34
+ let mutations = null
35
+
36
+ const allowed = element => {
37
+ if (!element || element.getRootNode() !== document || element.closest(excluded)) return false
38
+ for (let current = element; current; current = current.parentElement) {
39
+ if (overlays.has(current) || current.shadowRoot) return false
40
+ const style = getComputedStyle(current)
41
+ if (style.display === 'none' || style.visibility === 'hidden' || style.visibility === 'collapse' || Number(style.opacity) === 0) return false
42
+ }
43
+ return element.getClientRects().length > 0
44
+ }
45
+ const block = element => {
46
+ while (element && element !== document.body) {
47
+ if (!['inline', 'contents', 'inline-block'].includes(getComputedStyle(element).display)) return element
48
+ element = element.parentElement
49
+ }
50
+ return document.body
51
+ }
52
+ // ---- The composed tree: open shadow roots and slotted content, in rendered order. Targets
53
+ // captured with it carry tree:'composed'; older targets keep the document-only rules above
54
+ // and below, so a saved note never changes what it points at. Closed shadow roots stay
55
+ // invisible to script, and frames are never entered.
56
+ const refusedContent = 'input,textarea,select,option,iframe,object,embed,[contenteditable],[role="textbox"],[data-sensitive],[data-private],[autocomplete*="password"],[autocomplete*="cc-"],[autocomplete*="one-time-code"]'
57
+ const tooLarge = () => new Error('This page is too large to anchor safely. Use a page note instead.')
58
+ const composedParent = node => node.assignedSlot ?? node.parentElement ?? (node.parentNode instanceof ShadowRoot ? node.parentNode.host : null)
59
+ const flatChildren = node => {
60
+ if (node instanceof Element && node.shadowRoot) return Array.from(node.shadowRoot.childNodes)
61
+ if (node instanceof HTMLSlotElement) {
62
+ const assigned = node.assignedNodes()
63
+ return assigned.length ? assigned : Array.from(node.childNodes)
64
+ }
65
+ return Array.from(node.childNodes)
66
+ }
67
+ const shown = element => {
68
+ if (overlays.has(element) || element.matches(excluded)) return false
69
+ const style = getComputedStyle(element)
70
+ if (style.display === 'none' || style.visibility === 'hidden' || style.visibility === 'collapse' || Number(style.opacity) === 0) return false
71
+ return style.display === 'contents' || element.getClientRects().length > 0
72
+ }
73
+ const allowedComposed = element => {
74
+ if (!(element instanceof Element) || !element.isConnected || !element.getClientRects().length) return false
75
+ for (let current = element; current; current = composedParent(current)) if (!shown(current)) return false
76
+ return true
77
+ }
78
+ const rootsOf = node => {
79
+ const roots = []
80
+ for (let root = node?.getRootNode?.(); root instanceof ShadowRoot; root = root.host.getRootNode()) roots.push(root)
81
+ return roots
82
+ }
83
+ const openRoots = () => {
84
+ const roots = []
85
+ const pending = [document]
86
+ let seen = 0
87
+ while (pending.length) {
88
+ for (const element of pending.pop().querySelectorAll('*')) {
89
+ if (++seen > 50000) throw tooLarge()
90
+ if (element.shadowRoot) { roots.push(element.shadowRoot); pending.push(element.shadowRoot) }
91
+ }
92
+ }
93
+ return roots
94
+ }
95
+ const byTagComposed = tag => {
96
+ const found = []
97
+ const pending = [document]
98
+ let seen = 0
99
+ while (pending.length) {
100
+ for (const element of pending.pop().querySelectorAll('*')) {
101
+ if (++seen > 50000) throw tooLarge()
102
+ if (element.localName === tag) found.push(element)
103
+ if (element.shadowRoot) pending.push(element.shadowRoot)
104
+ }
105
+ }
106
+ return found
107
+ }
108
+ const blockComposed = node => {
109
+ let element = composedParent(node)
110
+ while (element && element !== document.body) {
111
+ if (!['inline', 'contents', 'inline-block'].includes(getComputedStyle(element).display)) return element
112
+ element = composedParent(element)
113
+ }
114
+ return document.body
115
+ }
116
+ // The same normalized stream as below, walked over the composed tree. It also records where
117
+ // it passed visible fields or private content, so a selection across one is refused, and
118
+ // where each node starts and ends, so selection boundaries in any tree map to positions.
119
+ const streamComposed = (root = document.body) => {
120
+ const chars = []
121
+ const map = []
122
+ const refused = []
123
+ const spans = new Map()
124
+ if (!root) return { chars, map, refused, spans }
125
+ let texts = 0
126
+ let elements = 0
127
+ let previousBlock
128
+ const append = (char, start, end) => {
129
+ if (/\s/u.test(char)) {
130
+ if (!chars.length) return false
131
+ if (chars.at(-1) === ' ') { map.at(-1).end = end; return false }
132
+ char = ' '
133
+ }
134
+ chars.push(char)
135
+ map.push({ start, end })
136
+ return true
137
+ }
138
+ const closing = Symbol('end of node')
139
+ const stack = [root]
140
+ while (stack.length) {
141
+ const node = stack.pop()
142
+ if (node[closing]) { node[closing].end = chars.length; continue }
143
+ if (node.nodeType === Node.TEXT_NODE) {
144
+ if (++texts > 20000 || chars.length + node.data.length > 250000) throw tooLarge()
145
+ // A component with a closed shadow root shows only the light text it slots; the rest is not rendered.
146
+ const holder = node.parentElement
147
+ if (holder && holder.localName.includes('-') && !holder.shadowRoot) {
148
+ const probe = document.createRange()
149
+ probe.selectNodeContents(node)
150
+ if (!probe.getClientRects().length) continue
151
+ }
152
+ const currentBlock = blockComposed(node)
153
+ if (previousBlock && currentBlock !== previousBlock && chars.length) append(' ', map.at(-1).end, [node, 0])
154
+ previousBlock = currentBlock
155
+ const span = { at: chars.length, starts: [], end: chars.length }
156
+ let offset = 0
157
+ for (const char of node.data) {
158
+ if (append(char, [node, offset], [node, offset + char.length])) span.starts.push(offset)
159
+ offset += char.length
160
+ }
161
+ span.end = chars.length
162
+ spans.set(node, span)
163
+ continue
164
+ }
165
+ if (node.nodeType !== Node.ELEMENT_NODE) continue
166
+ if (++elements > 50000) throw tooLarge()
167
+ if (node !== root && !shown(node)) {
168
+ if (node.matches(refusedContent) && node.getClientRects().length > 0) refused.push(chars.length)
169
+ continue
170
+ }
171
+ const span = { at: chars.length, starts: [], end: chars.length }
172
+ spans.set(node, span)
173
+ stack.push({ [closing]: span })
174
+ const children = flatChildren(node)
175
+ for (let index = children.length - 1; index >= 0; index--) stack.push(children[index])
176
+ }
177
+ if (chars.at(-1) === ' ') { chars.pop(); map.pop() }
178
+ return { chars, map, refused, spans }
179
+ }
180
+ // A boundary point (in any tree) as a stream position: the first character at or after it.
181
+ const positionAt = (data, container, offset) => {
182
+ if (container.nodeType === Node.TEXT_NODE) {
183
+ const span = data.spans.get(container)
184
+ return span ? span.at + span.starts.filter(start => start < offset).length : null
185
+ }
186
+ const children = container.childNodes
187
+ for (let index = offset; index < children.length; index++) {
188
+ const span = data.spans.get(children[index])
189
+ if (span) return span.at
190
+ }
191
+ const own = data.spans.get(container instanceof ShadowRoot ? container.host : container)
192
+ return own ? own.end : null
193
+ }
194
+ const textComposed = element => streamComposed(element).chars.join('')
195
+ // One Range per text node: a Range cannot span shadow trees.
196
+ const segmentsFor = (data, start, end) => {
197
+ const segments = []
198
+ let run = null
199
+ for (let index = start; index < end; index++) {
200
+ const entry = data.map[index]
201
+ if (entry.start[0] !== entry.end[0]) { run = null; continue }
202
+ if (run && run.node === entry.start[0]) { run.range.setEnd(...entry.end); continue }
203
+ const range = document.createRange()
204
+ range.setStart(...entry.start)
205
+ range.setEnd(...entry.end)
206
+ run = { node: entry.start[0], range }
207
+ segments.push(range)
208
+ }
209
+ return segments
210
+ }
211
+ const composedSelectionTarget = () => {
212
+ const selection = getSelection()
213
+ // rangeCount, isCollapsed and getRangeAt see a selection in a shadow root only from the document:
214
+ // WebKit reports no range at all for one that crosses into a component.
215
+ if (!selection || typeof selection.getComposedRanges !== 'function') return null
216
+ const roots = openRoots()
217
+ let ranges
218
+ try { ranges = selection.getComposedRanges({ shadowRoots: roots }) } catch { ranges = selection.getComposedRanges(...roots) }
219
+ const range = ranges?.[0]
220
+ if (!range || range.collapsed) return null
221
+ const data = streamComposed()
222
+ let start = positionAt(data, range.startContainer, range.startOffset)
223
+ let end = positionAt(data, range.endContainer, range.endOffset)
224
+ if (start === null || end === null) return null
225
+ while (data.chars[start] === ' ') start++
226
+ while (end > start && data.chars[end - 1] === ' ') end--
227
+ if (end <= start || end - start > 4000) return null
228
+ // Refuse ranges crossing fields or private content rather than silently capturing partial secrets.
229
+ if (data.refused.some(position => position > start && position < end)) return null
230
+ return {
231
+ target: { kind: 'text', exact: data.chars.slice(start, end).join(''), prefix: data.chars.slice(Math.max(0, start - 128), start).join(''), suffix: data.chars.slice(end, end + 128).join(''), start, end, tree: 'composed' },
232
+ segments: segmentsFor(data, start, end)
233
+ }
234
+ }
235
+ // Positions are normalized Unicode code points. Mapping offsets remain DOM UTF-16.
236
+ const stream = (root = document.body) => {
237
+ const chars = []
238
+ const map = []
239
+ if (!root) return { chars, map }
240
+ const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT)
241
+ let node
242
+ let previousBlock
243
+ let visited = 0
244
+ const append = (char, start, end) => {
245
+ if (/\s/u.test(char)) {
246
+ if (!chars.length) return
247
+ if (chars.at(-1) === ' ') { map.at(-1).end = end; return }
248
+ char = ' '
249
+ }
250
+ chars.push(char)
251
+ map.push({ start, end })
252
+ }
253
+ while ((node = walker.nextNode())) {
254
+ if (++visited > 20000 || chars.length + node.data.length > 250000) throw new Error('This page is too large to anchor safely. Use a page note instead.')
255
+ if (!allowed(node.parentElement)) continue
256
+ const currentBlock = block(node.parentElement)
257
+ if (previousBlock && currentBlock !== previousBlock && chars.length) {
258
+ append(' ', map.at(-1).end, [node, 0])
259
+ }
260
+ previousBlock = currentBlock
261
+ let offset = 0
262
+ for (const char of node.data) {
263
+ append(char, [node, offset], [node, offset + char.length])
264
+ offset += char.length
265
+ }
266
+ }
267
+ if (chars.at(-1) === ' ') { chars.pop(); map.pop() }
268
+ return { chars, map }
269
+ }
270
+ const text = element => stream(element).chars.join('')
271
+ const role = element => norm(element.getAttribute('role')) || ({ BUTTON: 'button', A: element.hasAttribute('href') ? 'link' : '', IMG: 'img', SUMMARY: 'button' }[element.tagName] ?? '')
272
+ // composed: read the composed tree (open shadow roots), where ids are scoped to their root.
273
+ const name = (element, composed = false) => {
274
+ const scope = composed ? element.getRootNode() : document
275
+ const labelled = norm(element.getAttribute('aria-labelledby')).split(' ').filter(Boolean).map(id => {
276
+ const label = scope.getElementById?.(id) ?? null
277
+ return composed ? (allowedComposed(label) ? textComposed(label) : '') : (allowed(label) ? text(label) : '')
278
+ }).join(' ')
279
+ return bounded(labelled || element.getAttribute('aria-label') || (element.tagName === 'IMG' ? element.getAttribute('alt') : '') || (composed ? textComposed(element) : text(element)), 200)
280
+ }
281
+ const specificSelector = (selector, tag) => selector.trim().toLowerCase() !== tag.toLowerCase() && ['#', '.', '[', ':', '>', '+', '~'].some(marker => selector.includes(marker))
282
+ const selectorPart = element => {
283
+ const tag = element.localName
284
+ const classes = Array.from(element.classList).slice(0, 3).map(name => '.' + CSS.escape(name)).join('')
285
+ const testId = element.getAttribute('data-testid')
286
+ const identity = element.id ? '#' + CSS.escape(element.id) : tag + (testId ? '[data-testid="' + CSS.escape(testId) + '"]' : '')
287
+ return identity + classes
288
+ }
289
+ const selectorFor = (element, semantic) => {
290
+ const root = element.getRootNode()
291
+ const unique = selector => {
292
+ try {
293
+ const matches = root.querySelectorAll(selector)
294
+ return matches.length === 1 && matches[0] === element
295
+ } catch { return false }
296
+ }
297
+ const direct = selectorPart(element)
298
+ if (cp(direct).length <= 500 && unique(direct) && (semantic || specificSelector(direct, element.localName))) return direct
299
+ const path = []
300
+ for (let current = element; current instanceof Element && current.getRootNode() === root; current = current.parentElement) {
301
+ let part = selectorPart(current)
302
+ const siblings = current.parentElement ? Array.from(current.parentElement.children) : Array.from(root.children ?? [])
303
+ const sameTag = siblings.filter(sibling => sibling.localName === current.localName)
304
+ const index = sameTag.indexOf(current)
305
+ if (!specificSelector(part, current.localName) || sameTag.length > 1) part += ':nth-of-type(' + (index + 1) + ')'
306
+ path.unshift(part)
307
+ const candidate = path.join(' > ')
308
+ if (cp(candidate).length <= 500 && specificSelector(candidate, element.localName) && unique(candidate)) return candidate
309
+ }
310
+ const candidate = path.join(' > ')
311
+ return cp(candidate).length <= 500 ? candidate : cp(direct).length <= 500 ? direct : element.localName
312
+ }
313
+ const describe = (element, composed = false) => {
314
+ const elementName = name(element, composed)
315
+ const elementText = bounded(composed ? textComposed(element) : text(element), 500)
316
+ // At the top of a shadow root the context is the component that holds it.
317
+ const parent = composed ? element.parentElement ?? (element.parentNode instanceof ShadowRoot ? element.parentNode.host : null) : element.parentElement
318
+ const context = composed ? (allowedComposed(parent) ? textComposed(parent) : '') : (allowed(parent) ? text(parent) : '')
319
+ return {
320
+ kind: 'element', tag: element.localName, role: bounded(role(element), 80),
321
+ name: elementName, text: elementText, context: bounded(context, 200),
322
+ selector: selectorFor(element, Boolean(elementName || elementText)),
323
+ ...(composed ? { tree: 'composed' } : {})
324
+ }
325
+ }
326
+ const rangeFor = (data, start, end) => {
327
+ const range = document.createRange()
328
+ range.setStart(...data.map[start].start)
329
+ range.setEnd(...data.map[end - 1].end)
330
+ return range
331
+ }
332
+ const selectionTarget = () => {
333
+ const selection = getSelection()
334
+ if (!selection || selection.rangeCount !== 1 || selection.isCollapsed) return null
335
+ const range = selection.getRangeAt(0)
336
+ if (range.startContainer.getRootNode() !== document || range.endContainer.getRootNode() !== document) return null
337
+ const data = stream()
338
+ const same = (point, node, offset) => point[0] === node && point[1] === offset
339
+ const indices = data.map.flatMap((entry, index) =>
340
+ range.comparePoint(...entry.end) >= 0 && range.comparePoint(...entry.start) <= 0 &&
341
+ !same(entry.end, range.startContainer, range.startOffset) && !same(entry.start, range.endContainer, range.endOffset) ? [index] : [])
342
+ if (!indices.length) return null
343
+ let start = indices[0]
344
+ let end = indices.at(-1) + 1
345
+ while (data.chars[start] === ' ') start++
346
+ while (data.chars[end - 1] === ' ') end--
347
+ if (end <= start || end - start > 4000) return null
348
+ // Refuse ranges crossing excluded subtrees rather than silently capturing partial secrets.
349
+ const walker = document.createTreeWalker(range.commonAncestorContainer, NodeFilter.SHOW_ELEMENT)
350
+ let element
351
+ if (range.commonAncestorContainer.nodeType === Node.TEXT_NODE && !allowed(range.commonAncestorContainer.parentElement)) return null
352
+ while ((element = walker.nextNode())) {
353
+ if (!allowed(element) && range.intersectsNode(element)) return null
354
+ }
355
+ return { kind: 'text', exact: data.chars.slice(start, end).join(''), prefix: data.chars.slice(Math.max(0, start - 128), start).join(''), suffix: data.chars.slice(end, end + 128).join(''), start, end }
356
+ }
357
+ const resolve = target => {
358
+ if (!target || typeof target !== 'object') throw new Error('Invalid target')
359
+ if (target.kind === 'page') return { state: 'matched' }
360
+ if ('tree' in target && target.tree !== 'composed') throw new Error('Invalid target tree')
361
+ const composed = target.tree === 'composed'
362
+ if (target.kind === 'text') {
363
+ if (!validString(target.exact, 4000) || !target.exact || norm(target.exact) !== target.exact ||
364
+ !validString(target.prefix, 128) || !validString(target.suffix, 128) ||
365
+ !Number.isSafeInteger(target.start) || !Number.isSafeInteger(target.end) || target.start < 0 || target.end <= target.start) throw new Error('Invalid text target')
366
+ const data = composed ? streamComposed() : stream()
367
+ const quote = cp(target.exact)
368
+ const prefix = cp(target.prefix)
369
+ const suffix = cp(target.suffix)
370
+ const matches = []
371
+ // Do not prefer the stored position: a duplicate there is still ambiguous.
372
+ const content = data.chars.join('')
373
+ let utf16Index = content.indexOf(target.exact)
374
+ let previousUtf16 = 0
375
+ let index = 0
376
+ while (utf16Index >= 0) {
377
+ index += cp(content.slice(previousUtf16, utf16Index)).length
378
+ previousUtf16 = utf16Index
379
+ utf16Index = content.indexOf(target.exact, utf16Index + 1)
380
+ const end = index + quote.length
381
+ if (prefix.length && data.chars.slice(Math.max(0, index - prefix.length), index).join('') !== target.prefix) continue
382
+ if (suffix.length && data.chars.slice(end, end + suffix.length).join('') !== target.suffix) continue
383
+ matches.push([index, end])
384
+ if (matches.length > 1) return { state: 'ambiguous', reason: 'Quote and context match more than once' }
385
+ }
386
+ if (!matches.length) return { state: 'unresolved', reason: 'Quote or context changed or is unavailable' }
387
+ if (!composed) return { state: 'matched', range: rangeFor(data, ...matches[0]) }
388
+ const segments = segmentsFor(data, ...matches[0])
389
+ return segments.length ? { state: 'matched', segments } : { state: 'unresolved', reason: 'Quote or context changed or is unavailable' }
390
+ }
391
+ if (target.kind === 'element') {
392
+ if (!validString(target.tag, 100) || !/^[a-z][a-z0-9-]*$/.test(target.tag) ||
393
+ !validString(target.role, 200) || !validString(target.name, 200) || !validString(target.text, 500) ||
394
+ !validString(target.context, 200) || !validString(target.selector, 500)) throw new Error('Invalid element target')
395
+ const semantic = Boolean(target.name.trim() || target.text.trim())
396
+ const elements = composed ? byTagComposed(target.tag) : document.getElementsByTagName(target.tag)
397
+ if (elements.length > 2000) return { state: 'unresolved', reason: 'Too many element candidates to resolve safely' }
398
+ if (specificSelector(target.selector, target.tag)) {
399
+ let anchored = []
400
+ try {
401
+ anchored = Array.from(elements).filter(composed ? allowedComposed : allowed).filter(element => element.matches(target.selector)).filter(element => {
402
+ const candidate = describe(element, composed)
403
+ return candidate.role === target.role && candidate.name === target.name && candidate.text === target.text && (!target.context || candidate.context === target.context)
404
+ })
405
+ } catch { anchored = [] }
406
+ if (anchored.length === 1) return { state: 'matched', element: anchored[0] }
407
+ if (anchored.length > 1 && !semantic) return { state: 'ambiguous', reason: 'The CSS selector matches more than one element' }
408
+ }
409
+ if (!semantic) return { state: 'unresolved', reason: 'No semantic evidence or unique CSS selector' }
410
+ let candidates = Array.from(elements).filter(composed ? allowedComposed : allowed).filter(element => {
411
+ const candidate = describe(element, composed)
412
+ return candidate.role === target.role && candidate.name === target.name && candidate.text === target.text
413
+ })
414
+ if (candidates.length > 1 && target.context) candidates = candidates.filter(element => describe(element, composed).context === target.context)
415
+ if (candidates.length > 1) return { state: 'ambiguous', reason: 'Element semantics are duplicated' }
416
+ if (!candidates.length) return { state: 'unresolved', reason: 'Element semantics changed or are unavailable' }
417
+ return { state: 'matched', element: candidates[0] }
418
+ }
419
+ throw new Error('Unknown target kind')
420
+ }
421
+ // What a pointer event points at: the nearest annotatable element on its composed path, or
422
+ // why there is none. Icons and other decorative parts give way to the control around them.
423
+ const pick = event => {
424
+ for (const node of event.composedPath()) {
425
+ if (node === document.body || node === document.documentElement || node === document || node === window) break
426
+ if (!(node instanceof Element)) continue
427
+ if (node.matches('iframe,object,embed')) return { element: null, refusal: 'Embedded frames can\u2019t be annotated.' }
428
+ if (node.matches(refusedContent)) return { element: null, refusal: 'Form fields and private content can\u2019t be annotated.' }
429
+ if (!allowedComposed(node)) continue
430
+ // A component that shows nothing script can read (a closed shadow root) gives nothing to anchor to.
431
+ if (node.localName.includes('-') && !node.shadowRoot && !norm(node.getAttribute('aria-label')) && !textComposed(node)) {
432
+ return { element: null, refusal: 'This component\u2019s contents are private and can\u2019t be annotated.' }
433
+ }
434
+ return { element: node, refusal: null }
435
+ }
436
+ return { element: null, refusal: null }
437
+ }
438
+ // The current selection as a target: through the composed tree when the browser can say
439
+ // where a selection inside a shadow root is, else by the document-only rules.
440
+ const currentSelection = () => {
441
+ if (typeof getSelection()?.getComposedRanges === 'function') return composedSelectionTarget()
442
+ const target = selectionTarget()
443
+ return target ? { target, range: getSelection().getRangeAt(0).cloneRange() } : null
444
+ }
445
+ const unionRect = rects => {
446
+ const list = rects.filter(rect => rect.width || rect.height)
447
+ if (!list.length) return new DOMRect(0, 0, 0, 0)
448
+ const left = Math.min(...list.map(rect => rect.left))
449
+ const top = Math.min(...list.map(rect => rect.top))
450
+ return new DOMRect(left, top, Math.max(...list.map(rect => rect.right)) - left, Math.max(...list.map(rect => rect.bottom)) - top)
451
+ }
452
+ const segmentRects = segments => segments.flatMap(range => Array.from(range.getClientRects()))
453
+ const listen = (node, type, handler, options = true) => {
454
+ node.addEventListener(type, handler, options)
455
+ listeners.push(() => node.removeEventListener(type, handler, options))
456
+ }
457
+ const clear = () => {
458
+ listeners.forEach(remove => remove())
459
+ listeners = []
460
+ observer?.disconnect()
461
+ observer = null
462
+ mutations?.disconnect()
463
+ mutations = null
464
+ if (frame) clearTimeout(frame)
465
+ frame = 0
466
+ overlay?.remove()
467
+ overlay = null
468
+ mark = null
469
+ }
470
+ const draw = () => {
471
+ frame = 0
472
+ if (!mark) return
473
+ const match = resolve(mark)
474
+ overlay?.remove()
475
+ overlay = null
476
+ if (match.state !== 'matched' || (!match.range && !match.element && !match.segments?.length)) return
477
+ const rects = match.range ? Array.from(match.range.getClientRects()) : match.segments ? segmentRects(match.segments) : [match.element.getBoundingClientRect()]
478
+ // Clip marks to nested scrollports, not just the top-level viewport, including those inside components.
479
+ const anchor = match.element ?? match.range?.commonAncestorContainer ?? match.segments[0].startContainer
480
+ let ancestor = anchor.nodeType === Node.ELEMENT_NODE ? anchor : composedParent(anchor)
481
+ let clip = { left: 0, top: 0, right: innerWidth, bottom: innerHeight }
482
+ if (match.element) ancestor = composedParent(ancestor)
483
+ for (; ancestor; ancestor = composedParent(ancestor)) {
484
+ const style = getComputedStyle(ancestor)
485
+ const rect = ancestor.getBoundingClientRect()
486
+ if (/(auto|scroll|hidden|clip)/.test(style.overflowX)) {
487
+ clip.left = Math.max(clip.left, rect.left)
488
+ clip.right = Math.min(clip.right, rect.right)
489
+ }
490
+ if (/(auto|scroll|hidden|clip)/.test(style.overflowY)) {
491
+ clip.top = Math.max(clip.top, rect.top)
492
+ clip.bottom = Math.min(clip.bottom, rect.bottom)
493
+ }
494
+ }
495
+ overlay = document.createElement('div')
496
+ overlays.add(overlay)
497
+ overlay.setAttribute('data-harness-annotation-overlay', '')
498
+ overlay.setAttribute('aria-hidden', 'true')
499
+ overlay.style.cssText = 'all:initial!important;position:fixed!important;inset:0!important;pointer-events:none!important;z-index:2147483647!important;overflow:hidden!important;'
500
+ for (const original of rects) {
501
+ const rect = { left: Math.max(original.left, clip.left), top: Math.max(original.top, clip.top) }
502
+ rect.width = Math.min(original.right, clip.right) - rect.left
503
+ rect.height = Math.min(original.bottom, clip.bottom) - rect.top
504
+ if (rect.width <= 0 || rect.height <= 0) continue
505
+ const box = document.createElement('div')
506
+ box.style.cssText = 'all:initial!important;position:absolute!important;pointer-events:none!important;box-sizing:border-box!important;left:' + rect.left + 'px!important;top:' + rect.top + 'px!important;width:' + rect.width + 'px!important;height:' + rect.height + 'px!important;border:2px solid Highlight!important;background:color-mix(in srgb, Highlight 12%, transparent)!important;'
507
+ overlay.append(box)
508
+ }
509
+ document.documentElement.append(overlay)
510
+ }
511
+ const schedule = () => { if (!frame) frame = setTimeout(draw, 16) }
512
+ const envelope = target => ({ url: location.href, title: bounded(document.title, 200), documentId, target })
513
+
514
+ // ---- Inspect mode (PROP-0018): hover outlines a component, a click opens a comment popover.
515
+ // Everything drawn lives in a closed shadow root, so page CSS and scripts cannot reach it;
516
+ // a page can still call this helper, so hosts treat each result as untrusted.
517
+ let inspect = null
518
+ const INSPECT_CSS = ':host{all:initial!important}' +
519
+ '.layer{position:fixed;inset:0;pointer-events:none;z-index:2147483647;font:12px/1.4 -apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;color-scheme:light dark}' +
520
+ '.box{position:fixed;box-sizing:border-box;border:2px solid #3b82f6;background:rgba(59,130,246,.12);border-radius:2px;display:none}' +
521
+ '.box.frozen{border-color:#f97316;background:rgba(249,115,22,.12)}' +
522
+ '.chip{position:fixed;display:none;padding:2px 6px;border-radius:4px;background:#1e293b;color:#f8fafc;font-size:11px;white-space:nowrap;max-width:360px;overflow:hidden;text-overflow:ellipsis}' +
523
+ '.chip b{font-weight:600;color:#93c5fd}' +
524
+ '.chip.refused{background:#334155;color:#e2e8f0;font-style:italic}' +
525
+ '.pop{position:fixed;display:none;width:320px;box-sizing:border-box;padding:10px;border-radius:8px;pointer-events:auto;background:Canvas;color:CanvasText;border:1px solid rgba(127,127,127,.35);box-shadow:0 8px 28px rgba(0,0,0,.28)}' +
526
+ '.what{font-size:11px;opacity:.7;margin:0 0 6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}' +
527
+ 'textarea{all:unset;display:block;box-sizing:border-box;width:100%;min-height:68px;max-height:200px;padding:6px 8px;border-radius:6px;border:1px solid rgba(127,127,127,.45);font:inherit;font-size:13px;white-space:pre-wrap;overflow:auto;background:Field;color:FieldText}' +
528
+ 'textarea:focus{outline:2px solid #3b82f6;outline-offset:-1px}' +
529
+ '.row{display:flex;gap:6px;margin-top:8px;justify-content:flex-end;flex-wrap:wrap}' +
530
+ 'button{all:unset;cursor:pointer;padding:4px 9px;border-radius:6px;font-size:12px;border:1px solid rgba(127,127,127,.45)}' +
531
+ 'button:hover{background:rgba(127,127,127,.15)}button:focus-visible{outline:2px solid #3b82f6}' +
532
+ 'button.primary{background:#2563eb;border-color:#2563eb;color:#fff}button.primary:hover{background:#1d4ed8}' +
533
+ 'button[disabled]{opacity:.45;cursor:default}' +
534
+ '.hint{margin-top:6px;font-size:10px;opacity:.55;text-align:right}' +
535
+ '.toast{position:fixed;right:16px;bottom:16px;padding:6px 10px;border-radius:6px;background:#1e293b;color:#f8fafc;font-size:12px;display:none}'
536
+ const label = element => {
537
+ const tag = element.tagName.toLowerCase()
538
+ const id = element.id ? '#' + element.id : ''
539
+ const classes = typeof element.className === 'string' ? element.className.trim().split(/\s+/).filter(Boolean).slice(0, 2).map(name => '.' + name).join('') : ''
540
+ const rect = element.getBoundingClientRect()
541
+ return { tag, rest: (id || classes) + ' ' + Math.round(rect.width) + '×' + Math.round(rect.height) }
542
+ }
543
+ const place = (node, rect, width, height, gap) => {
544
+ let top = rect.bottom + gap
545
+ if (top + height > innerHeight - 4 && rect.top - gap - height >= 4) top = rect.top - gap - height
546
+ top = Math.max(4, Math.min(top, innerHeight - height - 4))
547
+ const left = Math.max(4, Math.min(rect.left, innerWidth - width - 4))
548
+ node.style.top = top + 'px'
549
+ node.style.left = left + 'px'
550
+ }
551
+ const stopInspect = () => {
552
+ if (!inspect) return
553
+ inspect.listeners.forEach(remove => remove())
554
+ inspect.host.remove()
555
+ inspect = null
556
+ }
557
+ const startInspect = captureId => {
558
+ stopInspect()
559
+ const host = document.createElement('div')
560
+ overlays.add(host)
561
+ host.setAttribute('data-harness-annotation-overlay', '')
562
+ host.style.cssText = 'all:initial!important;position:fixed!important;inset:0!important;pointer-events:none!important;z-index:2147483647!important;'
563
+ const shadow = host.attachShadow({ mode: 'closed' })
564
+ shadow.innerHTML = '<style>' + INSPECT_CSS + '</style><div class="layer"><div class="box"></div><div class="chip"></div>' +
565
+ '<div class="pop" role="dialog" aria-label="Annotate"><p class="what"></p><textarea placeholder="What should change?" aria-label="Comment"></textarea>' +
566
+ '<div class="row"><button data-action="save">Annotate</button><button class="primary" data-action="send">Annotate &amp; send</button></div>' +
567
+ '<div class="hint">Esc cancel · ⌘↵ annotate &amp; send · the agent can read every annotation</div></div><div class="toast" role="status"></div></div>'
568
+ const $ = selector => shadow.querySelector(selector)
569
+ const state = { captureId, host, shadow, listeners: [], hovered: null, refusal: null, pointer: null, frozen: null, frame: 0, results: [], box: $('.box'), chip: $('.chip'), pop: $('.pop'), what: $('.what'), input: $('textarea'), toast: $('.toast'), toastTimer: 0 }
570
+ inspect = state
571
+ const on = (node, type, handler, options = true) => {
572
+ node.addEventListener(type, handler, options)
573
+ state.listeners.push(() => node.removeEventListener(type, handler, options))
574
+ }
575
+ const rectOf = picked => picked.range ? picked.range.getBoundingClientRect() : picked.segments ? unionRect(segmentRects(picked.segments)) : picked.element.getBoundingClientRect()
576
+ // Scrolls inside a component do not reach the window, so listen on each shadow root met.
577
+ const watched = new WeakSet()
578
+ const watch = node => {
579
+ for (const root of rootsOf(node)) {
580
+ if (watched.has(root)) continue
581
+ watched.add(root)
582
+ on(root, 'scroll', () => repaint(), { capture: true, passive: true })
583
+ }
584
+ }
585
+ const paint = () => {
586
+ state.frame = 0
587
+ const current = state.frozen ?? (state.hovered ? { element: state.hovered } : null)
588
+ state.chip.classList.remove('refused')
589
+ if (!current && state.refusal && state.pointer) {
590
+ // Say why nothing is outlined instead of staying silent.
591
+ state.box.style.display = 'none'
592
+ state.chip.textContent = state.refusal
593
+ state.chip.classList.add('refused')
594
+ state.chip.style.display = 'block'
595
+ place(state.chip, { left: state.pointer.x + 12, top: state.pointer.y + 14, bottom: state.pointer.y + 14 }, Math.min(360, state.chip.offsetWidth || 240), 20, 0)
596
+ return
597
+ }
598
+ const detached = current && (current.element ? !current.element.isConnected : current.segments ? !current.segments[0]?.startContainer.isConnected : false)
599
+ if (!current || detached) {
600
+ state.box.style.display = state.chip.style.display = 'none'
601
+ return
602
+ }
603
+ const rect = rectOf(current)
604
+ Object.assign(state.box.style, { display: 'block', left: rect.left + 'px', top: rect.top + 'px', width: rect.width + 'px', height: rect.height + 'px' })
605
+ state.box.classList.toggle('frozen', Boolean(state.frozen))
606
+ if (state.frozen) {
607
+ state.chip.style.display = 'none'
608
+ place(state.pop, rect, 320, state.pop.offsetHeight || 170, 8)
609
+ } else {
610
+ const text = label(current.element)
611
+ state.chip.innerHTML = ''
612
+ const tag = document.createElement('b')
613
+ tag.textContent = text.tag
614
+ state.chip.append(tag, document.createTextNode(text.rest))
615
+ state.chip.style.display = 'block'
616
+ place(state.chip, { left: rect.left, top: rect.top - 22, bottom: rect.top - 22 + 0 }, Math.min(360, state.chip.offsetWidth || 120), 20, 0)
617
+ if (rect.top < 26) place(state.chip, { left: rect.left, top: rect.bottom, bottom: rect.bottom }, Math.min(360, state.chip.offsetWidth || 120), 20, 2)
618
+ }
619
+ }
620
+ const repaint = () => { if (!state.frame) state.frame = requestAnimationFrame(paint) }
621
+ const closePopover = () => {
622
+ state.frozen = null
623
+ state.pop.style.display = 'none'
624
+ state.input.value = ''
625
+ repaint()
626
+ }
627
+ const openPopover = picked => {
628
+ state.frozen = picked
629
+ state.refusal = null
630
+ watch(picked.element ?? picked.segments?.[0]?.startContainer ?? picked.range?.startContainer)
631
+ const target = picked.target
632
+ state.what.textContent = target.kind === 'text' ? '“' + bounded(target.exact, 80) + '”' : '<' + target.tag + '> ' + (target.name || target.text || target.selector)
633
+ state.pop.style.display = 'block'
634
+ state.chip.style.display = 'none'
635
+ paint()
636
+ state.input.focus()
637
+ setTimeout(() => { if (state.frozen) state.input.focus() }, 0)
638
+ }
639
+ const submit = action => {
640
+ if (!state.frozen) return
641
+ const body = state.input.value.trim()
642
+ if (!body) { state.input.focus(); return }
643
+ state.results.push({ ...envelope(state.frozen.target), body: cp(body).slice(0, 10000).join(''), action })
644
+ if (state.results.length > 20) state.results.shift()
645
+ getSelection()?.removeAllRanges()
646
+ closePopover()
647
+ }
648
+ // The popover's own events stay inside it: the page sees nothing typed or clicked there.
649
+ for (const type of ['keydown', 'keyup', 'keypress', 'input', 'beforeinput', 'paste', 'copy', 'cut', 'pointerdown', 'mousedown', 'pointerup', 'mouseup', 'click', 'dblclick', 'wheel', 'focusin', 'focusout']) {
650
+ on(state.pop, type, event => event.stopPropagation(), false)
651
+ }
652
+ on(state.pop, 'click', event => {
653
+ const button = event.composedPath().find(node => node instanceof HTMLElement && node.dataset?.action)
654
+ if (button) submit(button.dataset.action === 'send' ? 'send' : 'save')
655
+ }, false)
656
+ on(state.input, 'keydown', event => {
657
+ if (event.key === 'Escape') { event.preventDefault(); closePopover() }
658
+ if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) { event.preventDefault(); submit('send') }
659
+ }, false)
660
+ const inPopover = event => event.composedPath().includes(host)
661
+ on(window, 'pointermove', event => {
662
+ if (state.frozen || inPopover(event)) return
663
+ const found = pick(event)
664
+ state.pointer = { x: event.clientX, y: event.clientY }
665
+ if (found.element) watch(found.element)
666
+ if (found.element !== state.hovered || found.refusal !== state.refusal || found.refusal) {
667
+ state.hovered = found.element
668
+ state.refusal = found.refusal
669
+ repaint()
670
+ }
671
+ }, { capture: true, passive: true })
672
+ let down = null
673
+ // The page never sees presses on what is being inspected; the browser may still select text.
674
+ for (const type of ['pointerdown', 'mousedown']) {
675
+ on(window, type, event => {
676
+ if (!event.isTrusted || inPopover(event)) return
677
+ event.stopImmediatePropagation()
678
+ if (event.type === 'pointerdown' && event.button === 0) down = { x: event.clientX, y: event.clientY, element: pick(event).element }
679
+ }, { capture: true, passive: false })
680
+ }
681
+ for (const type of ['pointerup', 'mouseup', 'click', 'dblclick', 'auxclick', 'contextmenu', 'submit']) {
682
+ on(window, type, event => {
683
+ if (inPopover(event)) return
684
+ event.preventDefault()
685
+ event.stopImmediatePropagation()
686
+ if (!event.isTrusted || event.button !== 0 || !down || state.frozen) return
687
+ const start = down
688
+ const moved = Math.hypot(event.clientX - start.x, event.clientY - start.y) > 4
689
+ if (event.type === 'pointerup') {
690
+ // A drag selects text; the popover opens on the selection.
691
+ if (!moved) return
692
+ down = null
693
+ let selected = null
694
+ try { selected = currentSelection() } catch { selected = null }
695
+ if (selected) openPopover(selected)
696
+ else if (!getSelection()?.isCollapsed) showToast('This selection can\u2019t be annotated: it is too long or crosses a form field or private content.')
697
+ return
698
+ }
699
+ if (event.type !== 'click' || moved) return
700
+ down = null
701
+ const found = pick(event)
702
+ if (found.refusal) { showToast(found.refusal); return }
703
+ if (!found.element || found.element !== start.element) return
704
+ openPopover({ target: describe(found.element, true), element: found.element })
705
+ }, { capture: true, passive: false })
706
+ }
707
+ on(window, 'keydown', event => {
708
+ if (event.key === 'Escape' && !inPopover(event)) {
709
+ if (state.frozen) closePopover()
710
+ else { state.hovered = null; repaint() }
711
+ }
712
+ }, true)
713
+ on(window, 'scroll', repaint, { capture: true, passive: true })
714
+ on(window, 'resize', repaint)
715
+ document.documentElement.append(host)
716
+ return state
717
+ }
718
+ const showToast = text => {
719
+ if (!inspect) return
720
+ const state = inspect
721
+ state.toast.textContent = bounded(text, 120)
722
+ state.toast.style.display = 'block'
723
+ clearTimeout(state.toastTimer)
724
+ state.toastTimer = setTimeout(() => { state.toast.style.display = 'none' }, 2200)
725
+ }
726
+ return operation => {
727
+ switch (operation.operation) {
728
+ case 'identity': return { url: location.href, title: bounded(document.title, 200), documentId }
729
+ case 'begin': {
730
+ if (!['text', 'element', 'inspect'].includes(operation.kind) || !validString(operation.captureId, 200) || !operation.captureId) throw new Error('Invalid capture request')
731
+ if (operation.kind === 'inspect') {
732
+ // Stays on across in-page navigation, until cancel or a new document.
733
+ clear()
734
+ pending = null
735
+ picked = null
736
+ startInspect(operation.captureId)
737
+ return null
738
+ }
739
+ stopInspect()
740
+ clear()
741
+ picked = null
742
+ pending = { kind: operation.kind, captureId: operation.captureId }
743
+ const captureUrl = location.href
744
+ const expired = setTimeout(() => { clear(); pending = null; picked = null }, 300000)
745
+ const navigation = setInterval(() => {
746
+ if (location.href !== captureUrl) { clear(); pending = null; picked = null }
747
+ }, 250)
748
+ listeners.push(() => clearTimeout(expired), () => clearInterval(navigation))
749
+ listen(window, 'keydown', event => {
750
+ if (event.key === 'Escape') { clear(); pending = null; picked = null }
751
+ })
752
+ if (pending.kind === 'text') {
753
+ listen(document, 'selectionchange', () => {
754
+ // A selection that grows over something refused must not leave the last acceptable one behind.
755
+ try { const selected = currentSelection(); picked = selected ? envelope(selected.target) : null } catch { picked = null }
756
+ })
757
+ }
758
+ if (pending.kind === 'element') {
759
+ let chosen = null
760
+ const choose = event => {
761
+ if (!event.isTrusted || event.button !== 0 || !pending || pending.kind !== 'element') return
762
+ // Open shadow roots are followed; frames and closed shadow roots never are.
763
+ const element = pick(event).element
764
+ if (!element) return
765
+ event.preventDefault()
766
+ event.stopImmediatePropagation()
767
+ if (event.type === 'pointerdown') chosen = element
768
+ if (event.type === 'click' && chosen === element) {
769
+ picked = envelope(describe(element, true))
770
+ // Keep suppression through this click; capture/cancel removes the listeners.
771
+ }
772
+ }
773
+ for (const type of ['pointerdown', 'mousedown', 'pointerup', 'mouseup', 'click', 'dblclick', 'auxclick']) listen(window, type, choose, { capture: true, passive: false })
774
+ }
775
+ return null
776
+ }
777
+ case 'capture': {
778
+ if (!pending || operation.captureId !== pending.captureId) return null
779
+ const result = picked ?? (pending.kind === 'text' ? currentSelection()?.target ?? null : null)
780
+ if (!result) return null
781
+ const captured = picked ?? envelope(result)
782
+ clear()
783
+ // The trusted host previews, then rechecks this same snapshot on Save.
784
+ picked = captured
785
+ return captured
786
+ }
787
+ case 'next': {
788
+ // Inspect mode: whether it is still on, and the next comment the person submitted.
789
+ const active = Boolean(inspect && inspect.captureId === operation.captureId)
790
+ return { url: location.href, title: bounded(document.title, 200), documentId, active, result: active ? inspect.results.shift() ?? null : null }
791
+ }
792
+ case 'toast':
793
+ if (!validString(operation.text, 400)) throw new Error('Invalid toast')
794
+ showToast(operation.text)
795
+ return null
796
+ case 'cancel':
797
+ if (inspect && (!operation.captureId || operation.captureId === inspect.captureId)) { stopInspect(); return null }
798
+ if (operation.captureId && operation.captureId !== pending?.captureId) return null
799
+ clear()
800
+ pending = null
801
+ picked = null
802
+ return null
803
+ case 'resolve':
804
+ case 'reveal': {
805
+ const match = resolve(operation.target)
806
+ if (operation.operation === 'reveal') {
807
+ clear()
808
+ pending = null
809
+ picked = null
810
+ if (match.state === 'matched' && operation.target.kind !== 'page') {
811
+ const start = (match.range ?? match.segments?.[0])?.startContainer
812
+ const element = match.element ?? start.parentElement ?? start.parentNode.host
813
+ element.scrollIntoView({ block: 'center', inline: 'nearest', behavior: 'instant' })
814
+ mark = operation.target
815
+ const roots = rootsOf(element)
816
+ listen(window, 'scroll', schedule)
817
+ listen(window, 'resize', schedule)
818
+ // Scrolls inside a component do not reach the window.
819
+ for (const root of roots) listen(root, 'scroll', schedule, { capture: true, passive: true })
820
+ if (window.visualViewport) {
821
+ listen(window.visualViewport, 'scroll', schedule)
822
+ listen(window.visualViewport, 'resize', schedule)
823
+ }
824
+ if (globalThis.ResizeObserver) {
825
+ observer = new ResizeObserver(schedule)
826
+ observer.observe(document.documentElement)
827
+ observer.observe(element)
828
+ }
829
+ draw()
830
+ mutations = new MutationObserver(records => {
831
+ if (records.some(record => {
832
+ if (overlays.has(record.target) || overlays.has(record.target.parentElement)) return false
833
+ if (record.type !== 'childList') return true
834
+ return [...record.addedNodes, ...record.removedNodes].some(node => !overlays.has(node))
835
+ })) schedule()
836
+ })
837
+ mutations.observe(document.documentElement, { subtree: true, childList: true, characterData: true, attributes: true })
838
+ for (const root of roots) mutations.observe(root, { subtree: true, childList: true, characterData: true, attributes: true })
839
+ }
840
+ }
841
+ return { state: match.state, ...(match.reason ? { reason: match.reason } : {}) }
842
+ }
843
+ default: throw new Error('Unknown annotation operation')
844
+ }
845
+ }
846
+ })()
847
+ }
848
+ return JSON.stringify({ ok: true, result: globalThis[key](args) })
849
+ } catch (error) {
850
+ return JSON.stringify({ ok: false, error: String(error?.message ?? error) })
851
+ }
852
+ })()`;
853
+ /** The expression to evaluate in the page for one operation. */
854
+ export function pageCall(operation) {
855
+ return PAGE_SCRIPT.replace('__ARGS__', () => JSON.stringify(operation));
856
+ }
857
+ /** Reads the helper's reply, throwing its error. */
858
+ export function pageReply(reply) {
859
+ if (typeof reply !== 'string')
860
+ throw new Error('The page did not answer.');
861
+ let parsed;
862
+ try {
863
+ parsed = JSON.parse(reply);
864
+ }
865
+ catch {
866
+ throw new Error('The page answered with something that is not JSON.');
867
+ }
868
+ if (!parsed.ok)
869
+ throw new Error(parsed.error || 'The page helper failed.');
870
+ return parsed.result;
871
+ }