@xingular/harness 0.1.7 → 1.1.1

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 (819) hide show
  1. package/CHANGELOG.md +125 -1
  2. package/LICENSE +202 -0
  3. package/NOTICE.md +22 -0
  4. package/README.md +239 -86
  5. package/THIRD_PARTY_LICENSES.md +942 -0
  6. package/dist/cli.js +17853 -13114
  7. package/dist/sdk/accounts/accounts.d.ts +165 -0
  8. package/dist/sdk/accounts/accounts.js +730 -0
  9. package/dist/sdk/accounts/choices.d.ts +23 -0
  10. package/dist/sdk/accounts/choices.js +62 -0
  11. package/dist/sdk/accounts/env.d.ts +78 -0
  12. package/dist/sdk/accounts/env.js +294 -0
  13. package/dist/sdk/accounts/secrets.d.ts +16 -0
  14. package/dist/sdk/accounts/secrets.js +40 -0
  15. package/dist/sdk/accounts/store.d.ts +114 -0
  16. package/dist/sdk/accounts/store.js +255 -0
  17. package/dist/sdk/agents/builtin.d.ts +2 -0
  18. package/dist/sdk/agents/builtin.js +34 -0
  19. package/dist/sdk/agents/narrow.d.ts +13 -0
  20. package/dist/sdk/agents/narrow.js +29 -0
  21. package/dist/sdk/agents/profiles.d.ts +80 -0
  22. package/dist/sdk/agents/profiles.js +221 -0
  23. package/dist/sdk/annotations/bridge.d.ts +42 -0
  24. package/dist/sdk/annotations/bridge.js +264 -0
  25. package/dist/sdk/annotations/capture.d.ts +116 -0
  26. package/dist/sdk/annotations/capture.js +308 -0
  27. package/dist/sdk/annotations/delivery.d.ts +72 -0
  28. package/dist/sdk/annotations/delivery.js +130 -0
  29. package/dist/sdk/annotations/inspect.d.ts +10 -0
  30. package/dist/sdk/annotations/inspect.js +33 -0
  31. package/dist/sdk/annotations/isolated.d.ts +6 -0
  32. package/dist/sdk/annotations/isolated.js +51 -0
  33. package/dist/sdk/annotations/pageScript.d.ts +28 -0
  34. package/dist/sdk/annotations/pageScript.js +570 -0
  35. package/dist/sdk/annotations/part.d.ts +10 -0
  36. package/dist/sdk/annotations/part.js +144 -0
  37. package/dist/sdk/annotations/queue.d.ts +4 -0
  38. package/dist/sdk/annotations/queue.js +40 -0
  39. package/dist/sdk/annotations/serverMethods.d.ts +3 -0
  40. package/dist/sdk/annotations/serverMethods.js +62 -0
  41. package/dist/sdk/annotations/store.d.ts +160 -0
  42. package/dist/sdk/annotations/store.js +386 -0
  43. package/dist/sdk/browser/config.d.ts +16 -0
  44. package/dist/sdk/browser/config.js +22 -0
  45. package/dist/sdk/browser/diagnostics.d.ts +4 -0
  46. package/dist/sdk/browser/diagnostics.js +38 -0
  47. package/dist/sdk/browser/index.d.ts +28 -0
  48. package/dist/sdk/browser/index.js +72 -0
  49. package/dist/sdk/browser/network.d.ts +10 -0
  50. package/dist/sdk/browser/network.js +59 -0
  51. package/dist/sdk/browser/serverMethods.d.ts +3 -0
  52. package/dist/sdk/browser/serverMethods.js +7 -0
  53. package/dist/sdk/browser/session.d.ts +85 -0
  54. package/dist/sdk/browser/session.js +228 -0
  55. package/dist/sdk/browser/tools.d.ts +8 -0
  56. package/dist/sdk/browser/tools.js +329 -0
  57. package/dist/sdk/capabilities/api.d.ts +22 -0
  58. package/dist/sdk/capabilities/api.js +54 -0
  59. package/dist/sdk/capabilities/runSnapshot.d.ts +18 -0
  60. package/dist/sdk/capabilities/runSnapshot.js +47 -0
  61. package/dist/sdk/capabilities/types.d.ts +29 -0
  62. package/dist/sdk/capabilities/types.js +1 -0
  63. package/dist/sdk/cli.d.ts +2 -0
  64. package/dist/sdk/cli.js +150 -0
  65. package/dist/sdk/core/bus.d.ts +23 -0
  66. package/dist/sdk/core/bus.js +76 -0
  67. package/dist/sdk/core/caller.d.ts +22 -0
  68. package/dist/sdk/core/caller.js +16 -0
  69. package/dist/sdk/core/changes.d.ts +15 -0
  70. package/dist/sdk/core/changes.js +15 -0
  71. package/dist/sdk/core/effort.d.ts +2 -0
  72. package/dist/sdk/core/effort.js +1 -0
  73. package/dist/sdk/core/env.d.ts +18 -0
  74. package/dist/sdk/core/env.js +8 -0
  75. package/dist/sdk/core/errors.d.ts +15 -0
  76. package/dist/sdk/core/errors.js +24 -0
  77. package/dist/sdk/core/frontmatter.d.ts +12 -0
  78. package/dist/sdk/core/frontmatter.js +50 -0
  79. package/dist/sdk/core/fs.d.ts +18 -0
  80. package/dist/sdk/core/fs.js +106 -0
  81. package/dist/sdk/core/index.d.ts +24 -0
  82. package/dist/sdk/core/index.js +187 -0
  83. package/dist/sdk/core/path.d.ts +7 -0
  84. package/dist/sdk/core/path.js +79 -0
  85. package/dist/sdk/core/projects.d.ts +18 -0
  86. package/dist/sdk/core/projects.js +67 -0
  87. package/dist/sdk/core/secrets.d.ts +2 -0
  88. package/dist/sdk/core/secrets.js +5 -0
  89. package/dist/sdk/core/text.d.ts +7 -0
  90. package/dist/sdk/core/text.js +40 -0
  91. package/dist/sdk/doctor/checks.d.ts +5 -0
  92. package/dist/sdk/doctor/checks.js +208 -0
  93. package/dist/sdk/doctor/probe.d.ts +4 -0
  94. package/dist/sdk/doctor/probe.js +92 -0
  95. package/dist/sdk/doctor/serverMethods.d.ts +3 -0
  96. package/dist/sdk/doctor/serverMethods.js +8 -0
  97. package/dist/sdk/doctor/service.d.ts +23 -0
  98. package/dist/sdk/doctor/service.js +144 -0
  99. package/dist/sdk/doctor/types.d.ts +141 -0
  100. package/dist/sdk/doctor/types.js +29 -0
  101. package/dist/sdk/harness.d.ts +148 -0
  102. package/dist/sdk/harness.js +338 -0
  103. package/dist/sdk/history/lessonPrompt.d.ts +2 -0
  104. package/dist/sdk/history/lessonPrompt.js +15 -0
  105. package/dist/sdk/history/lessons.d.ts +52 -0
  106. package/dist/sdk/history/lessons.js +173 -0
  107. package/dist/sdk/history/recall.d.ts +68 -0
  108. package/dist/sdk/history/recall.js +199 -0
  109. package/dist/sdk/history/serverMethods.d.ts +3 -0
  110. package/dist/sdk/history/serverMethods.js +8 -0
  111. package/dist/sdk/history/trajectory.d.ts +7 -0
  112. package/dist/sdk/history/trajectory.js +216 -0
  113. package/dist/sdk/hub/catalog.json +123 -0
  114. package/dist/sdk/hub/cli.d.ts +7 -0
  115. package/dist/sdk/hub/cli.js +81 -0
  116. package/dist/sdk/hub/hub.d.ts +74 -0
  117. package/dist/sdk/hub/hub.js +474 -0
  118. package/dist/sdk/hub/schema.d.ts +280 -0
  119. package/dist/sdk/hub/schema.js +78 -0
  120. package/dist/sdk/hub/serverMethods.d.ts +3 -0
  121. package/dist/sdk/hub/serverMethods.js +11 -0
  122. package/dist/sdk/index.d.ts +73 -0
  123. package/dist/sdk/index.js +55 -0
  124. package/dist/sdk/mcp/connections.d.ts +83 -0
  125. package/dist/sdk/mcp/connections.js +676 -0
  126. package/dist/sdk/mcp/manager.d.ts +26 -0
  127. package/dist/sdk/mcp/manager.js +124 -0
  128. package/dist/sdk/mcp/oauth.d.ts +35 -0
  129. package/dist/sdk/mcp/oauth.js +171 -0
  130. package/dist/sdk/mcp/scopeMigration.d.ts +19 -0
  131. package/dist/sdk/mcp/scopeMigration.js +198 -0
  132. package/dist/sdk/mcp/serverMethods.d.ts +3 -0
  133. package/dist/sdk/mcp/serverMethods.js +22 -0
  134. package/dist/sdk/mcp/service.d.ts +160 -0
  135. package/dist/sdk/mcp/service.js +510 -0
  136. package/dist/sdk/mcp/types.d.ts +131 -0
  137. package/dist/sdk/mcp/types.js +49 -0
  138. package/dist/sdk/pi/runtime.d.ts +13 -0
  139. package/dist/sdk/pi/runtime.js +31 -0
  140. package/dist/sdk/plugins/api.d.ts +66 -0
  141. package/dist/sdk/plugins/api.js +155 -0
  142. package/dist/sdk/plugins/attachments.d.ts +46 -0
  143. package/dist/sdk/plugins/attachments.js +111 -0
  144. package/dist/sdk/plugins/builtin.d.ts +7 -0
  145. package/dist/sdk/plugins/builtin.js +163 -0
  146. package/dist/sdk/plugins/builtinRegistry.d.ts +53 -0
  147. package/dist/sdk/plugins/builtinRegistry.js +49 -0
  148. package/dist/sdk/plugins/catalogue.d.ts +29 -0
  149. package/dist/sdk/plugins/catalogue.js +196 -0
  150. package/dist/sdk/plugins/cli.d.ts +13 -0
  151. package/dist/sdk/plugins/cli.js +188 -0
  152. package/dist/sdk/plugins/discover.d.ts +42 -0
  153. package/dist/sdk/plugins/discover.js +115 -0
  154. package/dist/sdk/plugins/firstParty.d.ts +50 -0
  155. package/dist/sdk/plugins/firstParty.js +113 -0
  156. package/dist/sdk/plugins/hooks.d.ts +94 -0
  157. package/dist/sdk/plugins/hooks.js +162 -0
  158. package/dist/sdk/plugins/identity.d.ts +19 -0
  159. package/dist/sdk/plugins/identity.js +48 -0
  160. package/dist/sdk/plugins/install.d.ts +20 -0
  161. package/dist/sdk/plugins/install.js +110 -0
  162. package/dist/sdk/plugins/inventory.d.ts +22 -0
  163. package/dist/sdk/plugins/inventory.js +110 -0
  164. package/dist/sdk/plugins/manifest.d.ts +13 -0
  165. package/dist/sdk/plugins/manifest.js +56 -0
  166. package/dist/sdk/plugins/plugins.d.ts +104 -0
  167. package/dist/sdk/plugins/plugins.js +164 -0
  168. package/dist/sdk/plugins/runtime.d.ts +9 -0
  169. package/dist/sdk/plugins/runtime.js +95 -0
  170. package/dist/sdk/plugins/trust.d.ts +44 -0
  171. package/dist/sdk/plugins/trust.js +120 -0
  172. package/dist/sdk/plugins/types.d.ts +159 -0
  173. package/dist/sdk/plugins/types.js +7 -0
  174. package/dist/sdk/prompt/compile.d.ts +177 -0
  175. package/dist/sdk/prompt/compile.js +413 -0
  176. package/dist/sdk/refine/cli.d.ts +4 -0
  177. package/dist/sdk/refine/cli.js +186 -0
  178. package/dist/sdk/refine/demo.d.ts +21 -0
  179. package/dist/sdk/refine/demo.js +114 -0
  180. package/dist/sdk/refine/evidence.d.ts +55 -0
  181. package/dist/sdk/refine/evidence.js +330 -0
  182. package/dist/sdk/refine/host.d.ts +51 -0
  183. package/dist/sdk/refine/host.js +76 -0
  184. package/dist/sdk/refine/ledger.d.ts +48 -0
  185. package/dist/sdk/refine/ledger.js +76 -0
  186. package/dist/sdk/refine/library.d.ts +55 -0
  187. package/dist/sdk/refine/library.js +177 -0
  188. package/dist/sdk/refine/pi.d.ts +72 -0
  189. package/dist/sdk/refine/pi.js +248 -0
  190. package/dist/sdk/refine/prompts.d.ts +45 -0
  191. package/dist/sdk/refine/prompts.js +390 -0
  192. package/dist/sdk/refine/recursion.d.ts +113 -0
  193. package/dist/sdk/refine/recursion.js +258 -0
  194. package/dist/sdk/refine/runner.d.ts +81 -0
  195. package/dist/sdk/refine/runner.js +150 -0
  196. package/dist/sdk/refine/selection.d.ts +57 -0
  197. package/dist/sdk/refine/selection.js +251 -0
  198. package/dist/sdk/refine/serverMethods.d.ts +3 -0
  199. package/dist/sdk/refine/serverMethods.js +20 -0
  200. package/dist/sdk/refine/service.d.ts +84 -0
  201. package/dist/sdk/refine/service.js +165 -0
  202. package/dist/sdk/refine/suite.d.ts +67 -0
  203. package/dist/sdk/refine/suite.js +174 -0
  204. package/dist/sdk/refine/trajectory.d.ts +9 -0
  205. package/dist/sdk/refine/trajectory.js +68 -0
  206. package/dist/sdk/refine/types.d.ts +77 -0
  207. package/dist/sdk/refine/types.js +10 -0
  208. package/dist/sdk/server/methods.d.ts +3 -0
  209. package/dist/sdk/server/methods.js +293 -0
  210. package/dist/sdk/server/params.d.ts +4 -0
  211. package/dist/sdk/server/params.js +11 -0
  212. package/dist/sdk/server/remote.d.ts +19 -0
  213. package/dist/sdk/server/remote.js +84 -0
  214. package/dist/sdk/server/rpc.d.ts +20 -0
  215. package/dist/sdk/server/rpc.js +102 -0
  216. package/dist/sdk/server/serve.d.ts +10 -0
  217. package/dist/sdk/server/serve.js +18 -0
  218. package/dist/sdk/sessions/approvals.d.ts +47 -0
  219. package/dist/sdk/sessions/approvals.js +119 -0
  220. package/dist/sdk/sessions/continuation.d.ts +48 -0
  221. package/dist/sdk/sessions/continuation.js +85 -0
  222. package/dist/sdk/sessions/contracts.d.ts +551 -0
  223. package/dist/sdk/sessions/contracts.js +338 -0
  224. package/dist/sdk/sessions/extensionUi.d.ts +19 -0
  225. package/dist/sdk/sessions/extensionUi.js +64 -0
  226. package/dist/sdk/sessions/history.d.ts +16 -0
  227. package/dist/sdk/sessions/history.js +68 -0
  228. package/dist/sdk/sessions/lineageJoin.d.ts +2 -0
  229. package/dist/sdk/sessions/lineageJoin.js +61 -0
  230. package/dist/sdk/sessions/planMode.d.ts +39 -0
  231. package/dist/sdk/sessions/planMode.js +93 -0
  232. package/dist/sdk/sessions/policy.d.ts +43 -0
  233. package/dist/sdk/sessions/policy.js +1 -0
  234. package/dist/sdk/sessions/pricing.d.ts +34 -0
  235. package/dist/sdk/sessions/pricing.js +40 -0
  236. package/dist/sdk/sessions/reasoningSummaries.d.ts +11 -0
  237. package/dist/sdk/sessions/reasoningSummaries.js +61 -0
  238. package/dist/sdk/sessions/registry.d.ts +103 -0
  239. package/dist/sdk/sessions/registry.js +386 -0
  240. package/dist/sdk/sessions/runIndex.d.ts +21 -0
  241. package/dist/sdk/sessions/runIndex.js +65 -0
  242. package/dist/sdk/sessions/runStore.d.ts +66 -0
  243. package/dist/sdk/sessions/runStore.js +337 -0
  244. package/dist/sdk/sessions/runner.d.ts +213 -0
  245. package/dist/sdk/sessions/runner.js +589 -0
  246. package/dist/sdk/sessions/sessions.d.ts +152 -0
  247. package/dist/sdk/sessions/sessions.js +461 -0
  248. package/dist/sdk/sessions/sideQuestionServerMethods.d.ts +3 -0
  249. package/dist/sdk/sessions/sideQuestionServerMethods.js +19 -0
  250. package/dist/sdk/sessions/sideQuestions.d.ts +66 -0
  251. package/dist/sdk/sessions/sideQuestions.js +290 -0
  252. package/dist/sdk/sessions/subagentServerMethods.d.ts +3 -0
  253. package/dist/sdk/sessions/subagentServerMethods.js +41 -0
  254. package/dist/sdk/sessions/subagentService.d.ts +52 -0
  255. package/dist/sdk/sessions/subagentService.js +265 -0
  256. package/dist/sdk/sessions/subagents.d.ts +58 -0
  257. package/dist/sdk/sessions/subagents.js +87 -0
  258. package/dist/sdk/terminal/accountsMenu.d.ts +46 -0
  259. package/dist/sdk/terminal/accountsMenu.js +392 -0
  260. package/dist/sdk/terminal/browser.d.ts +62 -0
  261. package/dist/sdk/terminal/browser.js +41 -0
  262. package/dist/sdk/terminal/browserControl.d.ts +29 -0
  263. package/dist/sdk/terminal/browserControl.js +186 -0
  264. package/dist/sdk/terminal/cli.d.ts +20 -0
  265. package/dist/sdk/terminal/cli.js +121 -0
  266. package/dist/sdk/terminal/client.d.ts +15 -0
  267. package/dist/sdk/terminal/client.js +126 -0
  268. package/dist/sdk/terminal/commandHelp.d.ts +17 -0
  269. package/dist/sdk/terminal/commandHelp.js +20 -0
  270. package/dist/sdk/terminal/control.d.ts +4 -0
  271. package/dist/sdk/terminal/control.js +25 -0
  272. package/dist/sdk/terminal/controller.d.ts +78 -0
  273. package/dist/sdk/terminal/controller.js +383 -0
  274. package/dist/sdk/terminal/hubMenu.d.ts +10 -0
  275. package/dist/sdk/terminal/hubMenu.js +34 -0
  276. package/dist/sdk/terminal/launch.d.ts +5 -0
  277. package/dist/sdk/terminal/launch.js +27 -0
  278. package/dist/sdk/terminal/logs.d.ts +14 -0
  279. package/dist/sdk/terminal/logs.js +59 -0
  280. package/dist/sdk/terminal/opentui/subagentsWidget.d.ts +28 -0
  281. package/dist/sdk/terminal/opentui/subagentsWidget.js +52 -0
  282. package/dist/sdk/terminal/piExtension.d.ts +6 -0
  283. package/dist/sdk/terminal/piExtension.js +377 -0
  284. package/dist/sdk/terminal/pluginMenu.d.ts +34 -0
  285. package/dist/sdk/terminal/pluginMenu.js +101 -0
  286. package/dist/sdk/terminal/socket.d.ts +73 -0
  287. package/dist/sdk/terminal/socket.js +287 -0
  288. package/dist/sdk/terminal/standalone.d.ts +20 -0
  289. package/dist/sdk/terminal/standalone.js +186 -0
  290. package/dist/sdk/terminal/subagentMonitor.d.ts +38 -0
  291. package/dist/sdk/terminal/subagentMonitor.js +121 -0
  292. package/dist/sdk/terminal/terminals.d.ts +212 -0
  293. package/dist/sdk/terminal/terminals.js +1108 -0
  294. package/dist/sdk/terminal/trajectory.d.ts +10 -0
  295. package/dist/sdk/terminal/trajectory.js +30 -0
  296. package/dist/sdk/terminal/tui/annotateCommand.d.ts +3 -0
  297. package/dist/sdk/terminal/tui/annotateCommand.js +22 -0
  298. package/dist/sdk/terminal/tui/chrome.d.ts +64 -0
  299. package/dist/sdk/terminal/tui/chrome.js +169 -0
  300. package/dist/sdk/terminal/tui/clipboardFiles.d.ts +11 -0
  301. package/dist/sdk/terminal/tui/clipboardFiles.js +74 -0
  302. package/dist/sdk/terminal/tui/commandPages.d.ts +11 -0
  303. package/dist/sdk/terminal/tui/commandPages.js +111 -0
  304. package/dist/sdk/terminal/tui/commands.d.ts +46 -0
  305. package/dist/sdk/terminal/tui/commands.js +399 -0
  306. package/dist/sdk/terminal/tui/dialogGeometry.d.ts +27 -0
  307. package/dist/sdk/terminal/tui/dialogGeometry.js +52 -0
  308. package/dist/sdk/terminal/tui/dialogs.d.ts +80 -0
  309. package/dist/sdk/terminal/tui/dialogs.js +370 -0
  310. package/dist/sdk/terminal/tui/keybindings.d.ts +11 -0
  311. package/dist/sdk/terminal/tui/keybindings.js +49 -0
  312. package/dist/sdk/terminal/tui/list.d.ts +73 -0
  313. package/dist/sdk/terminal/tui/list.js +196 -0
  314. package/dist/sdk/terminal/tui/modeChoices.d.ts +42 -0
  315. package/dist/sdk/terminal/tui/modeChoices.js +70 -0
  316. package/dist/sdk/terminal/tui/modelPicker.d.ts +55 -0
  317. package/dist/sdk/terminal/tui/modelPicker.js +150 -0
  318. package/dist/sdk/terminal/tui/mouse.d.ts +3 -0
  319. package/dist/sdk/terminal/tui/mouse.js +3 -0
  320. package/dist/sdk/terminal/tui/page.d.ts +17 -0
  321. package/dist/sdk/terminal/tui/page.js +1 -0
  322. package/dist/sdk/terminal/tui/pageOverlay.d.ts +27 -0
  323. package/dist/sdk/terminal/tui/pageOverlay.js +156 -0
  324. package/dist/sdk/terminal/tui/pages/accountsPage.d.ts +76 -0
  325. package/dist/sdk/terminal/tui/pages/accountsPage.js +409 -0
  326. package/dist/sdk/terminal/tui/pages/agentsPage.d.ts +74 -0
  327. package/dist/sdk/terminal/tui/pages/agentsPage.js +190 -0
  328. package/dist/sdk/terminal/tui/pages/annotatePage.d.ts +94 -0
  329. package/dist/sdk/terminal/tui/pages/annotatePage.js +341 -0
  330. package/dist/sdk/terminal/tui/pages/browserPage.d.ts +87 -0
  331. package/dist/sdk/terminal/tui/pages/browserPage.js +738 -0
  332. package/dist/sdk/terminal/tui/pages/componentsPage.d.ts +47 -0
  333. package/dist/sdk/terminal/tui/pages/componentsPage.js +119 -0
  334. package/dist/sdk/terminal/tui/pages/doctorPage.d.ts +39 -0
  335. package/dist/sdk/terminal/tui/pages/doctorPage.js +233 -0
  336. package/dist/sdk/terminal/tui/pages/hubPage.d.ts +39 -0
  337. package/dist/sdk/terminal/tui/pages/hubPage.js +128 -0
  338. package/dist/sdk/terminal/tui/pages/logPage.d.ts +38 -0
  339. package/dist/sdk/terminal/tui/pages/logPage.js +189 -0
  340. package/dist/sdk/terminal/tui/pages/notesPage.d.ts +75 -0
  341. package/dist/sdk/terminal/tui/pages/notesPage.js +201 -0
  342. package/dist/sdk/terminal/tui/pages/permissionsPage.d.ts +44 -0
  343. package/dist/sdk/terminal/tui/pages/permissionsPage.js +124 -0
  344. package/dist/sdk/terminal/tui/pages/pluginsPage.d.ts +57 -0
  345. package/dist/sdk/terminal/tui/pages/pluginsPage.js +243 -0
  346. package/dist/sdk/terminal/tui/pages/settingsPage.d.ts +63 -0
  347. package/dist/sdk/terminal/tui/pages/settingsPage.js +103 -0
  348. package/dist/sdk/terminal/tui/pages/subagentsPage.d.ts +23 -0
  349. package/dist/sdk/terminal/tui/pages/subagentsPage.js +70 -0
  350. package/dist/sdk/terminal/tui/pages/trajectoryPage.d.ts +65 -0
  351. package/dist/sdk/terminal/tui/pages/trajectoryPage.js +450 -0
  352. package/dist/sdk/terminal/tui/pages/worktreesPage.d.ts +72 -0
  353. package/dist/sdk/terminal/tui/pages/worktreesPage.js +203 -0
  354. package/dist/sdk/terminal/tui/piAdapter.d.ts +18 -0
  355. package/dist/sdk/terminal/tui/piAdapter.js +48 -0
  356. package/dist/sdk/terminal/tui/planMode.d.ts +2 -0
  357. package/dist/sdk/terminal/tui/planMode.js +2 -0
  358. package/dist/sdk/terminal/tui/pluginCommands.d.ts +14 -0
  359. package/dist/sdk/terminal/tui/pluginCommands.js +27 -0
  360. package/dist/sdk/terminal/tui/questionPicker.d.ts +20 -0
  361. package/dist/sdk/terminal/tui/questionPicker.js +150 -0
  362. package/dist/sdk/terminal/tui/questions.d.ts +21 -0
  363. package/dist/sdk/terminal/tui/questions.js +42 -0
  364. package/dist/sdk/terminal/tui/runtime.d.ts +114 -0
  365. package/dist/sdk/terminal/tui/runtime.js +443 -0
  366. package/dist/sdk/terminal/tui/search.d.ts +22 -0
  367. package/dist/sdk/terminal/tui/search.js +60 -0
  368. package/dist/sdk/terminal/tui/selection.d.ts +16 -0
  369. package/dist/sdk/terminal/tui/selection.js +16 -0
  370. package/dist/sdk/terminal/tui/sessionUi.d.ts +3 -0
  371. package/dist/sdk/terminal/tui/sessionUi.js +30 -0
  372. package/dist/sdk/terminal/tui/settingsModel.d.ts +14 -0
  373. package/dist/sdk/terminal/tui/settingsModel.js +114 -0
  374. package/dist/sdk/terminal/tui/sideQuestion.d.ts +53 -0
  375. package/dist/sdk/terminal/tui/sideQuestion.js +230 -0
  376. package/dist/sdk/terminal/tui/skillInvocation.d.ts +9 -0
  377. package/dist/sdk/terminal/tui/skillInvocation.js +43 -0
  378. package/dist/sdk/terminal/tui/status.d.ts +18 -0
  379. package/dist/sdk/terminal/tui/status.js +67 -0
  380. package/dist/sdk/terminal/tui/theme.d.ts +45 -0
  381. package/dist/sdk/terminal/tui/theme.js +176 -0
  382. package/dist/sdk/terminal/tui/treeModel.d.ts +79 -0
  383. package/dist/sdk/terminal/tui/treeModel.js +483 -0
  384. package/dist/sdk/terminal/tui/treePicker.d.ts +49 -0
  385. package/dist/sdk/terminal/tui/treePicker.js +251 -0
  386. package/dist/sdk/terminal/tui/ui.d.ts +49 -0
  387. package/dist/sdk/terminal/tui/ui.js +149 -0
  388. package/dist/sdk/terminal/tui/workingStatus.d.ts +9 -0
  389. package/dist/sdk/terminal/tui/workingStatus.js +229 -0
  390. package/dist/sdk/tools/askUser.d.ts +6 -0
  391. package/dist/sdk/tools/askUser.js +92 -0
  392. package/dist/sdk/tools/checklist.d.ts +9 -0
  393. package/dist/sdk/tools/checklist.js +54 -0
  394. package/dist/sdk/tools/definitions.d.ts +30 -0
  395. package/dist/sdk/tools/definitions.js +117 -0
  396. package/dist/sdk/tools/dispatch.d.ts +16 -0
  397. package/dist/sdk/tools/dispatch.js +67 -0
  398. package/dist/sdk/tools/harnessTools.d.ts +8 -0
  399. package/dist/sdk/tools/harnessTools.js +20 -0
  400. package/dist/sdk/tools/sessionName.d.ts +7 -0
  401. package/dist/sdk/tools/sessionName.js +31 -0
  402. package/dist/sdk/tools/spawnSubagent.d.ts +4 -0
  403. package/dist/sdk/tools/spawnSubagent.js +58 -0
  404. package/dist/sdk/tools/types.d.ts +48 -0
  405. package/dist/sdk/tools/types.js +1 -0
  406. package/dist/sdk/variant/components.d.ts +34 -0
  407. package/dist/sdk/variant/components.js +230 -0
  408. package/dist/sdk/variant/materialise.d.ts +66 -0
  409. package/dist/sdk/variant/materialise.js +81 -0
  410. package/dist/sdk/variant/migrate.d.ts +4 -0
  411. package/dist/sdk/variant/migrate.js +41 -0
  412. package/dist/sdk/variant/seed.d.ts +20 -0
  413. package/dist/sdk/variant/seed.js +116 -0
  414. package/dist/sdk/variant/store.d.ts +82 -0
  415. package/dist/sdk/variant/store.js +151 -0
  416. package/dist/sdk/variant/surface.d.ts +56 -0
  417. package/dist/sdk/variant/surface.js +81 -0
  418. package/dist/sdk/variant/trust.d.ts +27 -0
  419. package/dist/sdk/variant/trust.js +64 -0
  420. package/dist/sdk/variant/variant.d.ts +71 -0
  421. package/dist/sdk/variant/variant.js +331 -0
  422. package/dist/sdk/web/markdown.d.ts +10 -0
  423. package/dist/sdk/web/markdown.js +66 -0
  424. package/dist/sdk/web/part.d.ts +10 -0
  425. package/dist/sdk/web/part.js +6 -0
  426. package/dist/sdk/web/safeRequest.d.ts +34 -0
  427. package/dist/sdk/web/safeRequest.js +175 -0
  428. package/dist/sdk/web/search.d.ts +53 -0
  429. package/dist/sdk/web/search.js +168 -0
  430. package/dist/sdk/web/serverMethods.d.ts +3 -0
  431. package/dist/sdk/web/serverMethods.js +7 -0
  432. package/dist/sdk/web/text.d.ts +2 -0
  433. package/dist/sdk/web/text.js +7 -0
  434. package/dist/sdk/web/tools.d.ts +22 -0
  435. package/dist/sdk/web/tools.js +195 -0
  436. package/dist/sdk/web/turndown-plugin-gfm.d.ts +4 -0
  437. package/dist/sdk/wiki/notes.d.ts +68 -0
  438. package/dist/sdk/wiki/notes.js +297 -0
  439. package/dist/sdk/wiki/serverMethods.d.ts +3 -0
  440. package/dist/sdk/wiki/serverMethods.js +26 -0
  441. package/dist/sdk/worktrees/cli.d.ts +11 -0
  442. package/dist/sdk/worktrees/cli.js +146 -0
  443. package/dist/sdk/worktrees/copy.d.ts +9 -0
  444. package/dist/sdk/worktrees/copy.js +111 -0
  445. package/dist/sdk/worktrees/git.d.ts +16 -0
  446. package/dist/sdk/worktrees/git.js +81 -0
  447. package/dist/sdk/worktrees/serverMethods.d.ts +3 -0
  448. package/dist/sdk/worktrees/serverMethods.js +30 -0
  449. package/dist/sdk/worktrees/service.d.ts +73 -0
  450. package/dist/sdk/worktrees/service.js +483 -0
  451. package/dist/sdk/worktrees/setup.d.ts +23 -0
  452. package/dist/sdk/worktrees/setup.js +65 -0
  453. package/dist/sdk/worktrees/types.d.ts +91 -0
  454. package/dist/sdk/worktrees/types.js +1 -0
  455. package/dist/sdk/world/actions.d.ts +23 -0
  456. package/dist/sdk/world/actions.js +31 -0
  457. package/dist/sdk/world/cli.d.ts +12 -0
  458. package/dist/sdk/world/cli.js +166 -0
  459. package/dist/sdk/world/images.d.ts +20 -0
  460. package/dist/sdk/world/images.js +48 -0
  461. package/dist/sdk/world/untrusted.d.ts +12 -0
  462. package/dist/sdk/world/untrusted.js +20 -0
  463. package/dist/sdk/world/world.d.ts +67 -0
  464. package/dist/sdk/world/world.js +79 -0
  465. package/dist/terminal-opentui.js +20778 -0
  466. package/dist/terminal-pi.js +794 -518
  467. package/docs/README.md +42 -0
  468. package/docs/architecture/00-overview.md +171 -0
  469. package/docs/architecture/01-extension-points.md +78 -0
  470. package/docs/architecture/02-sessions-and-runs.md +203 -0
  471. package/docs/architecture/03-variants.md +103 -0
  472. package/docs/architecture/04-prompt.md +122 -0
  473. package/docs/architecture/05-refinement.md +107 -0
  474. package/docs/architecture/06-plugins-and-capabilities.md +129 -0
  475. package/docs/architecture/07-tools-and-gate.md +103 -0
  476. package/docs/architecture/08-memory-and-history.md +94 -0
  477. package/docs/architecture/09-accounts-and-connectors.md +98 -0
  478. package/docs/architecture/10-server-protocol.md +193 -0
  479. package/docs/architecture/11-terminal.md +261 -0
  480. package/docs/architecture/12-storage.md +75 -0
  481. package/docs/architecture/13-world-tools.md +45 -0
  482. package/docs/architecture/14-surfaces-and-parity.md +89 -0
  483. package/docs/architecture/README.md +125 -0
  484. package/docs/architecture/proposals/PROP-0001-reporting-section.md +106 -0
  485. package/docs/architecture/proposals/PROP-0002-retain-rollout-workspaces.md +104 -0
  486. package/docs/architecture/proposals/PROP-0003-executor-settings.md +81 -0
  487. package/docs/architecture/proposals/PROP-0004-flexible-reporting-guidance.md +71 -0
  488. package/docs/architecture/proposals/PROP-0005-xharness-cli-name.md +78 -0
  489. package/docs/architecture/proposals/PROP-0006-run-checklist.md +70 -0
  490. package/docs/architecture/proposals/PROP-0007-run-continuation.md +80 -0
  491. package/docs/architecture/proposals/PROP-0008-lessons-from-runs.md +80 -0
  492. package/docs/architecture/proposals/PROP-0009-foundation-and-variants.md +78 -0
  493. package/docs/architecture/proposals/PROP-0010-session-names.md +73 -0
  494. package/docs/architecture/proposals/PROP-0011-doctor.md +63 -0
  495. package/docs/architecture/proposals/PROP-0012-release-baseline.md +56 -0
  496. package/docs/architecture/proposals/PROP-0013-resource-browser.md +58 -0
  497. package/docs/architecture/proposals/PROP-0014-fullscreen-browser-tabs.md +58 -0
  498. package/docs/architecture/proposals/PROP-0015-one-capability-surface.md +88 -0
  499. package/docs/architecture/proposals/PROP-0016-managed-worktrees.md +156 -0
  500. package/docs/architecture/proposals/PROP-0017-page-annotations.md +127 -0
  501. package/docs/architecture/proposals/PROP-0018-annotation-queue-and-app-targets.md +179 -0
  502. package/docs/architecture/proposals/PROP-0019-contextual-side-questions.md +122 -0
  503. package/docs/architecture/proposals/PROP-0020-builtin-feature-plugins.md +105 -0
  504. package/docs/architecture/proposals/PROP-0021-command-namespaces-and-duplicates.md +99 -0
  505. package/docs/architecture/proposals/PROP-0022-plan-only-questions.md +102 -0
  506. package/docs/architecture/proposals/PROP-0023-xagent-cli-name.md +61 -0
  507. package/docs/architecture/proposals/PROP-0024-question-sketch-previews.md +130 -0
  508. package/docs/architecture/proposals/PROP-0025-contextual-question-wireframes.md +49 -0
  509. package/docs/architecture/proposals/PROP-0026-connected-sketch-display.md +94 -0
  510. package/docs/architecture/proposals/PROP-0027-xingular-agent-product-identity.md +60 -0
  511. package/docs/architecture/proposals/PROP-0028-normalize-question-wireframes.md +55 -0
  512. package/docs/architecture/proposals/PROP-0029-agent-profiles.md +124 -0
  513. package/docs/architecture/proposals/PROP-0030-subagent-title.md +86 -0
  514. package/docs/architecture/proposals/README.md +101 -0
  515. package/docs/decisions/ADR-0002-native-subagent-lifecycle.md +49 -0
  516. package/docs/decisions/ADR-0003-shared-asynchronous-subagents.md +70 -0
  517. package/docs/decisions/ADR-0004-fullscreen-terminal-layout.md +50 -0
  518. package/docs/decisions/ADR-0005-app-provided-oauth-clients.md +54 -0
  519. package/docs/decisions/ADR-0006-opentui-only-terminal.md +47 -0
  520. package/docs/decisions/ADR-0007-reporting-section.md +33 -0
  521. package/docs/decisions/ADR-0008-flexible-reporting-guidance.md +38 -0
  522. package/docs/decisions/ADR-0009-xharness-command.md +39 -0
  523. package/docs/decisions/ADR-0010-lessons-in-the-wiki.md +31 -0
  524. package/docs/decisions/ADR-0011-foundation-and-variants.md +28 -0
  525. package/docs/decisions/ADR-0012-native-session-names.md +34 -0
  526. package/docs/decisions/ADR-0013-doctor.md +27 -0
  527. package/docs/decisions/ADR-0014-public-release-baseline.md +22 -0
  528. package/docs/decisions/ADR-0015-resource-browser.md +28 -0
  529. package/docs/decisions/ADR-0016-fullscreen-browser-tabs.md +31 -0
  530. package/docs/decisions/ADR-0017-one-capability-surface.md +34 -0
  531. package/docs/decisions/ADR-0018-builtin-feature-plugins.md +35 -0
  532. package/docs/decisions/ADR-0019-managed-git-worktrees.md +31 -0
  533. package/docs/decisions/ADR-0020-page-annotations.md +37 -0
  534. package/docs/decisions/ADR-0021-required-command-namespaces.md +40 -0
  535. package/docs/decisions/ADR-0022-plan-only-question-tools.md +34 -0
  536. package/docs/decisions/ADR-0023-contextual-side-question-runs.md +35 -0
  537. package/docs/decisions/ADR-0024-xagent-command.md +40 -0
  538. package/docs/decisions/ADR-0025-question-choice-sketches.md +49 -0
  539. package/docs/decisions/ADR-0026-contextual-question-wireframes.md +58 -0
  540. package/docs/decisions/ADR-0027-connected-sketch-display.md +60 -0
  541. package/docs/decisions/ADR-0028-xingular-agent-product-identity.md +56 -0
  542. package/docs/decisions/ADR-0029-normalized-question-wireframe-borders.md +33 -0
  543. package/docs/decisions/ADR-0030-agent-profiles.md +43 -0
  544. package/docs/doctor.md +80 -0
  545. package/docs/experiments/EXP-0001-terminal-input-latency/plan.md +81 -0
  546. package/docs/experiments/EXP-0001-terminal-input-latency/results.md +46 -0
  547. package/docs/experiments/EXP-0002-opentui-typing-latency/plan.md +70 -0
  548. package/docs/experiments/EXP-0002-opentui-typing-latency/results.md +92 -0
  549. package/docs/features/README.md +46 -0
  550. package/docs/features/automations/README.md +41 -0
  551. package/docs/features/cores/README.md +39 -0
  552. package/docs/features/google-harness2/README.md +52 -0
  553. package/docs/features/integrations/README.md +40 -0
  554. package/docs/features/interfaces/README.md +29 -0
  555. package/docs/features/memory/README.md +28 -0
  556. package/docs/future-work.md +48 -0
  557. package/docs/parity.md +78 -0
  558. package/docs/releases/1.0.0.md +40 -0
  559. package/docs/releases/4.0.0.md +46 -0
  560. package/docs/releases/README.md +41 -0
  561. package/docs/study/00-index.md +83 -0
  562. package/docs/study/arms/00-matrix.md +20 -0
  563. package/docs/study/arms/01-system-prompt.md +211 -0
  564. package/docs/study/arms/02-tools.md +79 -0
  565. package/docs/study/arms/03-subagents.md +90 -0
  566. package/docs/study/arms/04-skills.md +75 -0
  567. package/docs/study/arms/05-context-management.md +90 -0
  568. package/docs/study/arms/06-memory.md +90 -0
  569. package/docs/study/arms/07-governance.md +71 -0
  570. package/docs/study/arms/08-execution.md +69 -0
  571. package/docs/study/arms/09-observability.md +60 -0
  572. package/docs/study/arms/10-refinement.md +110 -0
  573. package/docs/study/autonomous-engineering-sources.md +277 -0
  574. package/docs/study/autonomy-sources.md +147 -0
  575. package/docs/study/btw-comparison.md +37 -0
  576. package/docs/study/feature-gap-review.md +42 -0
  577. package/docs/study/insights.md +123 -0
  578. package/docs/study/proactive-autonomy.md +408 -0
  579. package/docs/study/roadmap.md +72 -0
  580. package/docs/study/sources/claude-code.md +44 -0
  581. package/docs/study/sources/deepseek-harness.md +102 -0
  582. package/docs/study/sources/harness2.md +50 -0
  583. package/docs/study/sources/kimi-cli.md +42 -0
  584. package/docs/study/sources/omp.md +93 -0
  585. package/docs/study/sources/opencode.md +43 -0
  586. package/docs/study/sources/openhands.md +46 -0
  587. package/docs/study/sources/smolagents.md +40 -0
  588. package/docs/study/sources/swe-agent.md +34 -0
  589. package/docs/study/tui-resource-browser.md +78 -0
  590. package/docs/system-prompt-design.md +196 -0
  591. package/docs/terminal-tui.md +707 -58
  592. package/package.json +43 -13
  593. package/docs/evidence/terminal-2026-10-17/120x40-completed-transcript.ansi.gz +0 -0
  594. package/docs/evidence/terminal-2026-10-17/40x20-settings-interaction.ansi.gz +0 -0
  595. package/docs/evidence/terminal-2026-10-17/40x20-settings-keyboard.ansi.gz +0 -0
  596. package/docs/evidence/terminal-2026-10-17/40x20-welcome.ansi.gz +0 -0
  597. package/docs/evidence/terminal-2026-10-17/80x24-approval-0.ansi.gz +0 -0
  598. package/docs/evidence/terminal-2026-10-17/80x24-question.ansi.gz +0 -0
  599. package/docs/evidence/terminal-2026-10-17/verification.json +0 -130
  600. package/docs/evidence/terminal-2026-10-17-followup/120x40-completed-transcript.ansi.gz +0 -0
  601. package/docs/evidence/terminal-2026-10-17-followup/40x20-settings-interaction.ansi.gz +0 -0
  602. package/docs/evidence/terminal-2026-10-17-followup/40x20-settings-keyboard.ansi.gz +0 -0
  603. package/docs/evidence/terminal-2026-10-17-followup/40x20-welcome.ansi.gz +0 -0
  604. package/docs/evidence/terminal-2026-10-17-followup/80x24-approval-0.ansi.gz +0 -0
  605. package/docs/evidence/terminal-2026-10-17-followup/80x24-plugin-light.ansi.gz +0 -0
  606. package/docs/evidence/terminal-2026-10-17-followup/80x24-question-batch.ansi.gz +0 -0
  607. package/docs/evidence/terminal-2026-10-17-followup/80x24-question.ansi.gz +0 -0
  608. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-approval-0.ansi.gz +0 -0
  609. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-plugin-light.ansi.gz +0 -0
  610. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-question-batch.ansi.gz +0 -0
  611. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-question.ansi.gz +0 -0
  612. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/verification.json +0 -95
  613. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-approval-0.ansi.gz +0 -0
  614. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-plugin-light.ansi.gz +0 -0
  615. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-question-batch.ansi.gz +0 -0
  616. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-question.ansi.gz +0 -0
  617. package/docs/evidence/terminal-2026-10-17-followup/global-install/README.md +0 -27
  618. package/docs/evidence/terminal-2026-10-17-followup/global-install/shell-command-80x24.ansi.gz +0 -0
  619. package/docs/evidence/terminal-2026-10-17-followup/global-install/shell-command.json +0 -18
  620. package/docs/evidence/terminal-2026-10-17-followup/global-install/verification.json +0 -95
  621. package/docs/evidence/terminal-2026-10-17-followup/harness-reference-80x24.json.gz +0 -0
  622. package/docs/evidence/terminal-2026-10-17-followup/harness-reference-final-80x24.json.gz +0 -0
  623. package/docs/evidence/terminal-2026-10-17-followup/harness-reference-scenario.json +0 -60
  624. package/docs/evidence/terminal-2026-10-17-followup/live-codex/README.md +0 -24
  625. package/docs/evidence/terminal-2026-10-17-followup/live-codex/complete-80x24.ansi.gz +0 -0
  626. package/docs/evidence/terminal-2026-10-17-followup/live-codex/verification.json +0 -57
  627. package/docs/evidence/terminal-2026-10-17-followup/omp-reference-80x24-early.json.gz +0 -0
  628. package/docs/evidence/terminal-2026-10-17-followup/omp-reference-80x24.json.gz +0 -0
  629. package/docs/evidence/terminal-2026-10-17-followup/omp-reference-scenario.json +0 -58
  630. package/docs/evidence/terminal-2026-10-17-followup/omp-supplemental-static.json.gz +0 -0
  631. package/docs/evidence/terminal-2026-10-17-followup/rea-artifacts.json +0 -320
  632. package/docs/evidence/terminal-2026-10-17-followup/reference-comparison.json +0 -30
  633. package/docs/evidence/terminal-2026-10-17-followup/reference-comparison.md +0 -133
  634. package/docs/evidence/terminal-2026-10-17-followup/reference-source-observations.json +0 -20
  635. package/docs/evidence/terminal-2026-10-17-followup/verification.json +0 -207
  636. package/src/accounts/accounts.test.ts +0 -333
  637. package/src/accounts/accounts.ts +0 -658
  638. package/src/accounts/env.test.ts +0 -95
  639. package/src/accounts/env.ts +0 -338
  640. package/src/accounts/secrets.ts +0 -50
  641. package/src/accounts/store.ts +0 -338
  642. package/src/capabilities/api.ts +0 -75
  643. package/src/capabilities/runSnapshot.ts +0 -59
  644. package/src/capabilities/types.ts +0 -34
  645. package/src/cli.ts +0 -118
  646. package/src/core/bus.ts +0 -34
  647. package/src/core/changes.ts +0 -33
  648. package/src/core/env.ts +0 -27
  649. package/src/core/errors.ts +0 -32
  650. package/src/core/frontmatter.ts +0 -47
  651. package/src/core/fs.test.ts +0 -38
  652. package/src/core/fs.ts +0 -92
  653. package/src/core/index.ts +0 -193
  654. package/src/core/path.test.ts +0 -14
  655. package/src/core/path.ts +0 -79
  656. package/src/core/projects.ts +0 -90
  657. package/src/core/text.ts +0 -39
  658. package/src/harness.ts +0 -312
  659. package/src/hub/catalog.json +0 -123
  660. package/src/hub/cli.ts +0 -59
  661. package/src/hub/hub.test.ts +0 -205
  662. package/src/hub/hub.ts +0 -256
  663. package/src/hub/schema.ts +0 -81
  664. package/src/index.ts +0 -75
  665. package/src/mcp/connections.ts +0 -614
  666. package/src/mcp/manager.ts +0 -130
  667. package/src/mcp/oauth.ts +0 -195
  668. package/src/mcp/scopeMigration.test.ts +0 -79
  669. package/src/mcp/scopeMigration.ts +0 -204
  670. package/src/mcp/service.test.ts +0 -376
  671. package/src/mcp/service.ts +0 -549
  672. package/src/mcp/types.ts +0 -108
  673. package/src/memory/api.test.ts +0 -82
  674. package/src/memory/api.ts +0 -303
  675. package/src/memory/blocks.test.ts +0 -78
  676. package/src/memory/blocks.ts +0 -408
  677. package/src/memory/caller.ts +0 -69
  678. package/src/memory/curation.test.ts +0 -163
  679. package/src/memory/curation.ts +0 -64
  680. package/src/memory/dispatch.ts +0 -59
  681. package/src/memory/facts.test.ts +0 -41
  682. package/src/memory/facts.ts +0 -248
  683. package/src/memory/graph.ts +0 -103
  684. package/src/memory/health.test.ts +0 -130
  685. package/src/memory/health.ts +0 -74
  686. package/src/memory/maintainer.ts +0 -272
  687. package/src/memory/maintenance.test.ts +0 -176
  688. package/src/memory/maintenance.ts +0 -518
  689. package/src/memory/migrate.ts +0 -79
  690. package/src/memory/operations.ts +0 -150
  691. package/src/memory/proposals.test.ts +0 -168
  692. package/src/memory/proposals.ts +0 -584
  693. package/src/memory/recall.test.ts +0 -115
  694. package/src/memory/recall.ts +0 -278
  695. package/src/memory/references.ts +0 -77
  696. package/src/memory/runContext.ts +0 -93
  697. package/src/memory/secrets.ts +0 -6
  698. package/src/memory/store.test.ts +0 -66
  699. package/src/memory/store.ts +0 -385
  700. package/src/memory/wiki.test.ts +0 -47
  701. package/src/memory/wiki.ts +0 -422
  702. package/src/memory/wikiIndex.test.ts +0 -88
  703. package/src/memory/wikiIndex.ts +0 -116
  704. package/src/plugins/api.ts +0 -181
  705. package/src/plugins/attachments.test.ts +0 -84
  706. package/src/plugins/attachments.ts +0 -141
  707. package/src/plugins/builtin.ts +0 -82
  708. package/src/plugins/catalogue.test.ts +0 -254
  709. package/src/plugins/catalogue.ts +0 -251
  710. package/src/plugins/cli.ts +0 -184
  711. package/src/plugins/discover.ts +0 -151
  712. package/src/plugins/firstParty.test.ts +0 -143
  713. package/src/plugins/firstParty.ts +0 -129
  714. package/src/plugins/hooks.test.ts +0 -250
  715. package/src/plugins/hooks.ts +0 -239
  716. package/src/plugins/identity.ts +0 -37
  717. package/src/plugins/install.test.ts +0 -107
  718. package/src/plugins/install.ts +0 -106
  719. package/src/plugins/inventory.ts +0 -123
  720. package/src/plugins/manifest.ts +0 -76
  721. package/src/plugins/plugins.test.ts +0 -205
  722. package/src/plugins/plugins.ts +0 -189
  723. package/src/plugins/proposal.ts +0 -121
  724. package/src/plugins/runtime.test.ts +0 -40
  725. package/src/plugins/runtime.ts +0 -82
  726. package/src/plugins/trust.ts +0 -142
  727. package/src/plugins/types.ts +0 -149
  728. package/src/prompt/compile.test.ts +0 -261
  729. package/src/prompt/compile.ts +0 -732
  730. package/src/server/methods.ts +0 -349
  731. package/src/server/remote.ts +0 -77
  732. package/src/server/rpc.ts +0 -116
  733. package/src/server/serve.ts +0 -28
  734. package/src/server/server.test.ts +0 -174
  735. package/src/sessions/approvals.ts +0 -118
  736. package/src/sessions/contracts.ts +0 -336
  737. package/src/sessions/conversation.test.ts +0 -177
  738. package/src/sessions/extensionSession.test.ts +0 -74
  739. package/src/sessions/extensionUi.test.ts +0 -65
  740. package/src/sessions/extensionUi.ts +0 -102
  741. package/src/sessions/history.ts +0 -51
  742. package/src/sessions/lineageJoin.ts +0 -75
  743. package/src/sessions/policy.ts +0 -36
  744. package/src/sessions/pricing.ts +0 -60
  745. package/src/sessions/questionBatches.test.ts +0 -110
  746. package/src/sessions/reasoningSummaries.ts +0 -59
  747. package/src/sessions/registry.ts +0 -381
  748. package/src/sessions/runIndex.ts +0 -99
  749. package/src/sessions/runStore.test.ts +0 -152
  750. package/src/sessions/runStore.ts +0 -332
  751. package/src/sessions/runner.ts +0 -604
  752. package/src/sessions/runtimeResources.test.ts +0 -61
  753. package/src/sessions/sessions.test.ts +0 -549
  754. package/src/sessions/sessions.ts +0 -339
  755. package/src/skills/registry.test.ts +0 -104
  756. package/src/skills/registry.ts +0 -413
  757. package/src/terminal/accountsMenu.test.ts +0 -225
  758. package/src/terminal/accountsMenu.ts +0 -382
  759. package/src/terminal/cli.ts +0 -149
  760. package/src/terminal/client.ts +0 -74
  761. package/src/terminal/control.test.ts +0 -23
  762. package/src/terminal/control.ts +0 -23
  763. package/src/terminal/controller.ts +0 -291
  764. package/src/terminal/hubMenu.ts +0 -24
  765. package/src/terminal/launch.test.ts +0 -25
  766. package/src/terminal/launch.ts +0 -48
  767. package/src/terminal/piExtension.lifecycle.test.ts +0 -55
  768. package/src/terminal/piExtension.ts +0 -259
  769. package/src/terminal/pluginControl.test.ts +0 -146
  770. package/src/terminal/pluginMenu.ts +0 -112
  771. package/src/terminal/socket.test.ts +0 -71
  772. package/src/terminal/socket.ts +0 -232
  773. package/src/terminal/standalone.test.ts +0 -167
  774. package/src/terminal/standalone.ts +0 -153
  775. package/src/terminal/terminal.test.ts +0 -399
  776. package/src/terminal/terminals.ts +0 -553
  777. package/src/terminal/tui/application.test.ts +0 -114
  778. package/src/terminal/tui/application.ts +0 -491
  779. package/src/terminal/tui/commands.test.ts +0 -218
  780. package/src/terminal/tui/commands.ts +0 -361
  781. package/src/terminal/tui/dialogs.ts +0 -301
  782. package/src/terminal/tui/editor.test.ts +0 -84
  783. package/src/terminal/tui/editor.ts +0 -79
  784. package/src/terminal/tui/keybindings.test.ts +0 -22
  785. package/src/terminal/tui/keybindings.ts +0 -50
  786. package/src/terminal/tui/piAdapter.ts +0 -62
  787. package/src/terminal/tui/presentation.test.ts +0 -79
  788. package/src/terminal/tui/questions.test.ts +0 -41
  789. package/src/terminal/tui/questions.ts +0 -47
  790. package/src/terminal/tui/runtime.socket.test.ts +0 -104
  791. package/src/terminal/tui/runtime.test.ts +0 -215
  792. package/src/terminal/tui/runtime.ts +0 -388
  793. package/src/terminal/tui/sessionUi.ts +0 -24
  794. package/src/terminal/tui/settings.test.ts +0 -150
  795. package/src/terminal/tui/settings.ts +0 -188
  796. package/src/terminal/tui/status.test.ts +0 -70
  797. package/src/terminal/tui/status.ts +0 -109
  798. package/src/terminal/tui/theme.ts +0 -174
  799. package/src/terminal/tui/tools.test.ts +0 -145
  800. package/src/terminal/tui/tools.ts +0 -142
  801. package/src/terminal/tui/transcript.test.ts +0 -25
  802. package/src/terminal/tui/transcript.ts +0 -124
  803. package/src/terminal/tui/ui.test.ts +0 -313
  804. package/src/terminal/tui/ui.ts +0 -166
  805. package/src/terminal/tui/welcome.ts +0 -102
  806. package/src/tools/askUser.test.ts +0 -69
  807. package/src/tools/askUser.ts +0 -59
  808. package/src/tools/definitions.ts +0 -187
  809. package/src/tools/maintenance.ts +0 -24
  810. package/src/tools/memoryTools.ts +0 -22
  811. package/src/tools/pluginPropose.ts +0 -41
  812. package/src/tools/registryWrite.test.ts +0 -101
  813. package/src/tools/registryWrite.ts +0 -182
  814. package/src/tools/spawnSubagent.ts +0 -92
  815. package/src/tools/types.ts +0 -39
  816. package/src/web/safeRequest.ts +0 -171
  817. package/src/web/text.ts +0 -53
  818. package/src/web/tools.ts +0 -134
  819. package/src/web/web.test.ts +0 -141
@@ -0,0 +1,386 @@
1
+ // Page notes (PROP-0017): what a person wrote about a whole web page, a quoted passage or an element
2
+ // of it. One JSON file per note under `<data root>/annotations/`, changed only with the version the
3
+ // caller last saw. A note is private until a person shares it with a session or an agent; the
4
+ // model can only read notes shared with it.
5
+ import { existsSync, lstatSync, mkdirSync, readdirSync, rmSync } from 'node:fs';
6
+ import { join } from 'node:path';
7
+ import { HarnessError, invalid, notFound } from "../core/errors.js";
8
+ import { newId, now, readJson, safeId, writeJson } from "../core/fs.js";
9
+ export const MAX_NOTES = 10_000;
10
+ const MAX_HISTORY = 100;
11
+ const codepoints = (value) => Array.from(value).length;
12
+ function bounded(value, max, required, field) {
13
+ if (typeof value !== 'string' || codepoints(value) > max || (required && !value.trim()))
14
+ throw invalid(`Invalid note ${field}.`);
15
+ return value;
16
+ }
17
+ export function validateUrl(value) {
18
+ const text = bounded(value, 4096, true, 'URL');
19
+ let url;
20
+ try {
21
+ url = new URL(text);
22
+ }
23
+ catch {
24
+ throw invalid('Invalid note URL.');
25
+ }
26
+ const authority = /^[a-z][a-z0-9+.-]*:\/\/([^/?#]*)/i.exec(text)?.[1] ?? null;
27
+ if (!['http:', 'https:'].includes(url.protocol) || !url.hostname || url.username || url.password || authority === null || authority.includes('@') || /[\s\p{Cc}]/u.test(text)) {
28
+ throw invalid('Note URLs must be HTTP(S) without credentials.');
29
+ }
30
+ return text;
31
+ }
32
+ const APP_SCHEMES = new Set(['http:', 'https:', 'file:', 'app:', 'tauri:', 'electron:', 'asset:']);
33
+ /** An app window's address: web addresses, plus the local schemes desktop apps load from. Never credentials. */
34
+ export function validateAppUrl(value) {
35
+ const text = bounded(value, 4096, true, 'URL');
36
+ let url;
37
+ try {
38
+ url = new URL(text);
39
+ }
40
+ catch {
41
+ throw invalid('Invalid note URL.');
42
+ }
43
+ if (!APP_SCHEMES.has(url.protocol) || url.username || url.password || /[\s\p{Cc}]/u.test(text))
44
+ throw invalid('An app note URL must be a web, file or app address without credentials.');
45
+ return text;
46
+ }
47
+ function validateApp(app) {
48
+ if (app == null)
49
+ return null;
50
+ const value = app;
51
+ if (value.kind !== 'cdp' && value.kind !== 'bridge')
52
+ throw invalid('A note app is attached through cdp or a bridge.');
53
+ return { kind: value.kind, name: bounded(value.name, 200, true, 'app name') };
54
+ }
55
+ function validateSource(source) {
56
+ if (!source || typeof source !== 'object')
57
+ throw invalid('A note needs its source page.');
58
+ const value = source;
59
+ const app = validateApp(value.app);
60
+ return {
61
+ url: app ? validateAppUrl(value.url) : validateUrl(value.url),
62
+ ...(app ? { app } : {}),
63
+ title: bounded(value.title ?? '', 200, false, 'title'),
64
+ capturedAt: typeof value.capturedAt === 'string' && value.capturedAt ? value.capturedAt : now(),
65
+ ...(value.surface != null ? { surface: bounded(value.surface, 200, true, 'surface') } : {}),
66
+ ...(value.representationHint != null ? { representationHint: bounded(value.representationHint, 128, true, 'representation hint') } : {})
67
+ };
68
+ }
69
+ export function validateTarget(target) {
70
+ if (!target || typeof target !== 'object')
71
+ throw invalid('A note needs a target.');
72
+ const value = target;
73
+ const keys = Object.keys(value).sort().join(',');
74
+ if (value.kind === 'page') {
75
+ if (keys !== 'kind')
76
+ throw invalid('Invalid page target.');
77
+ return { kind: 'page' };
78
+ }
79
+ if (value.kind === 'text') {
80
+ if (keys !== 'end,exact,kind,prefix,start,suffix')
81
+ throw invalid('Invalid text target.');
82
+ const exact = bounded(value.exact, 4000, true, 'exact text');
83
+ const prefix = bounded(value.prefix, 128, false, 'text prefix');
84
+ const suffix = bounded(value.suffix, 128, false, 'text suffix');
85
+ const start = value.start;
86
+ const end = value.end;
87
+ // Offsets count Unicode code points of the page's normalised text, not UTF-16 units.
88
+ if (!Number.isSafeInteger(start) || !Number.isSafeInteger(end) || start < 0 || end <= start || end - start !== codepoints(exact)) {
89
+ throw invalid('Note text offsets do not match the exact text.');
90
+ }
91
+ return { kind: 'text', exact, prefix, suffix, start: start, end: end };
92
+ }
93
+ if (value.kind === 'element') {
94
+ if (keys !== 'context,kind,name,role,selector,tag,text')
95
+ throw invalid('Invalid element target.');
96
+ const element = {
97
+ kind: 'element',
98
+ tag: bounded(value.tag, 40, true, 'element tag'),
99
+ role: bounded(value.role, 80, false, 'element role'),
100
+ name: bounded(value.name, 200, false, 'element name'),
101
+ text: bounded(value.text, 500, false, 'element text'),
102
+ context: bounded(value.context, 200, false, 'element context'),
103
+ selector: bounded(value.selector, 500, false, 'element selector')
104
+ };
105
+ if (!element.name.trim() && !element.text.trim())
106
+ throw invalid('An element note needs a meaningful name or text.');
107
+ return element;
108
+ }
109
+ throw invalid('A note target is a page, text or an element.');
110
+ }
111
+ function normalizeBody(body) {
112
+ return bounded(typeof body === 'string' ? body.trim() : body, 10_000, true, 'body');
113
+ }
114
+ function normalizeTags(tags) {
115
+ if (tags === undefined)
116
+ return [];
117
+ if (!Array.isArray(tags) || tags.length > 12)
118
+ throw invalid('A note takes at most 12 tags.');
119
+ return [...new Set(tags.map((tag) => bounded(typeof tag === 'string' ? tag.trim() : tag, 40, true, 'tag')))];
120
+ }
121
+ function validatePrincipal(principal) {
122
+ const value = (principal ?? {});
123
+ const result = {};
124
+ if (typeof value.sessionId === 'string' && value.sessionId)
125
+ result.sessionId = safeId(value.sessionId);
126
+ if (typeof value.agentId === 'string' && value.agentId)
127
+ result.agentId = safeId(value.agentId);
128
+ if (!result.sessionId === !result.agentId)
129
+ throw invalid('Share a note with exactly one session or one agent.');
130
+ return result;
131
+ }
132
+ const samePrincipal = (left, right) => left.sessionId === right.sessionId && left.agentId === right.agentId;
133
+ /** Whether a caller may read a note through the model tools. */
134
+ export function visibleTo(note, caller) {
135
+ return note.grants.some((grant) => (grant.principal.sessionId && grant.principal.sessionId === caller.sessionId) ||
136
+ (grant.principal.agentId && grant.principal.agentId === caller.agentId));
137
+ }
138
+ export function notesDir(root) {
139
+ return join(root, 'annotations');
140
+ }
141
+ function folder(root) {
142
+ const dir = notesDir(root);
143
+ if (existsSync(dir) && (lstatSync(dir).isSymbolicLink() || !lstatSync(dir).isDirectory()))
144
+ throw new HarnessError('invalid_data', 'Note storage must be a plain folder.');
145
+ mkdirSync(dir, { recursive: true });
146
+ return dir;
147
+ }
148
+ function file(root, id) {
149
+ return join(folder(root), `${safeId(id)}.json`);
150
+ }
151
+ function validNote(note, id) {
152
+ if (!note || note.id !== id || note.author !== 'user' || !Number.isSafeInteger(note.version) || note.version < 1 || !Array.isArray(note.grants) || !Array.isArray(note.history)) {
153
+ throw new HarnessError('invalid_data', `Note ${id} is not a valid note.`);
154
+ }
155
+ return note;
156
+ }
157
+ export function read(root, id) {
158
+ const path = file(root, id);
159
+ if (!existsSync(path))
160
+ throw notFound('Note');
161
+ if (lstatSync(path).isSymbolicLink())
162
+ throw new HarnessError('invalid_data', 'Note records must not be links.');
163
+ return validNote(readJson(path), id);
164
+ }
165
+ function all(root) {
166
+ const notes = [];
167
+ for (const name of readdirSync(folder(root))) {
168
+ if (!name.endsWith('.json'))
169
+ continue;
170
+ try {
171
+ notes.push(read(root, name.slice(0, -'.json'.length)));
172
+ }
173
+ catch {
174
+ // A damaged file is skipped, never shown as a note.
175
+ }
176
+ }
177
+ return notes;
178
+ }
179
+ function matchingNotes(root, filter) {
180
+ const query = filter.query?.trim().toLowerCase();
181
+ return all(root)
182
+ .filter((note) => !filter.url || note.source.url === filter.url)
183
+ .filter((note) => !filter.status || note.status === filter.status)
184
+ .filter((note) => !query || [note.body, note.source.title, note.source.url, ...note.tags, note.target.kind === 'text' ? note.target.exact : note.target.kind === 'element' ? note.target.name : ''].join('\n').toLowerCase().includes(query))
185
+ .sort((left, right) => right.updatedAt.localeCompare(left.updatedAt) || left.id.localeCompare(right.id));
186
+ }
187
+ /** All matching notes for internal consumers that paginate after applying their own visibility filter. */
188
+ export function listAll(root, filter = {}) {
189
+ return matchingNotes(root, filter);
190
+ }
191
+ export function list(root, filter = {}) {
192
+ const matching = matchingNotes(root, filter);
193
+ const offset = Math.max(0, Math.floor(filter.offset ?? 0));
194
+ const limit = Math.max(1, Math.min(200, Math.floor(filter.limit ?? 50)));
195
+ return { notes: matching.slice(offset, offset + limit), total: matching.length };
196
+ }
197
+ function save(root, note, operation) {
198
+ note.version += 1;
199
+ note.updatedAt = now();
200
+ note.history.push({ version: note.version, operation, at: note.updatedAt });
201
+ if (note.history.length > MAX_HISTORY)
202
+ note.history.splice(0, note.history.length - MAX_HISTORY);
203
+ writeJson(file(root, note.id), note);
204
+ return note;
205
+ }
206
+ function current(root, id, expectedVersion) {
207
+ const note = read(root, id);
208
+ if (expectedVersion !== undefined && note.version !== expectedVersion)
209
+ throw new HarnessError('version_conflict', 'The note changed. Read it again before saving.');
210
+ return note;
211
+ }
212
+ export function create(root, input) {
213
+ const source = validateSource(input?.source);
214
+ const target = validateTarget(input?.target);
215
+ const body = normalizeBody(input?.body);
216
+ const tags = normalizeTags(input?.tags);
217
+ if (readdirSync(folder(root)).filter((name) => name.endsWith('.json')).length >= MAX_NOTES) {
218
+ throw new HarnessError('annotation_limit', `At most ${MAX_NOTES} notes may be kept.`);
219
+ }
220
+ const at = now();
221
+ const note = { id: newId(), version: 1, source, target, body, tags, status: 'open', author: 'user', createdAt: at, updatedAt: at, grants: [], history: [{ version: 1, operation: 'create', at }] };
222
+ writeJson(file(root, note.id), note);
223
+ return note;
224
+ }
225
+ export function update(root, id, expectedVersion, patch) {
226
+ const note = current(root, id, expectedVersion);
227
+ if (patch.body !== undefined)
228
+ note.body = normalizeBody(patch.body);
229
+ if (patch.tags !== undefined)
230
+ note.tags = normalizeTags(patch.tags);
231
+ if (patch.status !== undefined) {
232
+ if (patch.status !== 'open' && patch.status !== 'resolved')
233
+ throw invalid('A note is open or resolved.');
234
+ note.status = patch.status;
235
+ if (patch.status === 'resolved' && note.delivery?.state === 'queued')
236
+ note.delivery = null;
237
+ }
238
+ if (patch.target !== undefined)
239
+ note.target = validateTarget(patch.target);
240
+ return save(root, note, 'update');
241
+ }
242
+ export function remove(root, id, expectedVersion) {
243
+ current(root, id, expectedVersion);
244
+ rmSync(file(root, id));
245
+ }
246
+ /** A person lets one session or agent read the note through the model tools. */
247
+ export function share(root, id, principal, binding = null) {
248
+ const who = validatePrincipal(principal);
249
+ const note = current(root, id, undefined);
250
+ note.grants = note.grants.filter((grant) => !samePrincipal(grant.principal, who));
251
+ note.grants.push({ principal: who, ...(binding ? { binding: bounded(binding, 200, true, 'binding') } : {}), grantedAt: now() });
252
+ return save(root, note, 'share');
253
+ }
254
+ export function unshare(root, id, principal) {
255
+ const who = validatePrincipal(principal);
256
+ const note = current(root, id, undefined);
257
+ note.grants = note.grants.filter((grant) => !samePrincipal(grant.principal, who));
258
+ return save(root, note, 'unshare');
259
+ }
260
+ /** The host withdrew what a binding stood for (a tab closed or was shared again): every grant made with it ends. */
261
+ export function revokeBinding(root, binding) {
262
+ bounded(binding, 200, true, 'binding');
263
+ let changed = 0;
264
+ for (const note of all(root)) {
265
+ if (!note.grants.some((grant) => grant.binding === binding))
266
+ continue;
267
+ note.grants = note.grants.filter((grant) => grant.binding !== binding);
268
+ save(root, note, 'revoke_binding');
269
+ changed += 1;
270
+ }
271
+ return changed;
272
+ }
273
+ /** Takes notes another store kept, keeping their ids. A note whose id exists is skipped. */
274
+ export function importNotes(root, notes) {
275
+ const imported = [];
276
+ const skipped = [];
277
+ for (const raw of Array.isArray(notes) ? notes : []) {
278
+ const value = (raw ?? {});
279
+ const id = typeof value.id === 'string' ? value.id : null;
280
+ try {
281
+ if (!id)
282
+ throw invalid('A note needs an id.');
283
+ safeId(id);
284
+ if (existsSync(file(root, id))) {
285
+ skipped.push({ id, reason: 'exists' });
286
+ continue;
287
+ }
288
+ const at = now();
289
+ const note = {
290
+ id,
291
+ version: 1,
292
+ source: validateSource(value.source),
293
+ target: validateTarget(value.target),
294
+ body: normalizeBody(value.body),
295
+ tags: normalizeTags(value.tags),
296
+ status: value.status === 'resolved' ? 'resolved' : 'open',
297
+ author: 'user',
298
+ createdAt: typeof value.createdAt === 'string' ? value.createdAt : at,
299
+ updatedAt: typeof value.updatedAt === 'string' ? value.updatedAt : at,
300
+ grants: Array.isArray(value.grants) ? value.grants.map((grant) => {
301
+ const entry = (grant ?? {});
302
+ return { principal: validatePrincipal(entry.principal), ...(typeof entry.binding === 'string' && entry.binding ? { binding: entry.binding } : {}), grantedAt: typeof entry.grantedAt === 'string' ? entry.grantedAt : at };
303
+ }) : [],
304
+ history: [{ version: 1, operation: 'import', at }]
305
+ };
306
+ writeJson(file(root, id), note);
307
+ imported.push(id);
308
+ }
309
+ catch (error) {
310
+ skipped.push({ id, reason: error instanceof Error ? error.message : String(error) });
311
+ }
312
+ }
313
+ return { imported, skipped };
314
+ }
315
+ // ---- Delivery to an agent (PROP-0018) ----------------------------------------------------------
316
+ /**
317
+ * A person asks a session to act on the note: it is shared with that session (if it was not) and
318
+ * waits in the session's queue until it is sent.
319
+ */
320
+ export function queue(root, id, expectedVersion, sessionId, options = {}) {
321
+ const session = safeId(sessionId);
322
+ const note = current(root, id, expectedVersion);
323
+ if (note.status === 'resolved')
324
+ throw invalid('Reopen this note before queueing it.');
325
+ if (!note.grants.some((grant) => grant.principal.sessionId === session))
326
+ note.grants.push({ principal: { sessionId: session }, grantedAt: now() });
327
+ const confirmationRequired = options.confirm === true || (note.delivery?.confirm === true && options.confirmed !== true);
328
+ note.delivery = {
329
+ state: 'queued',
330
+ sessionId: session,
331
+ queuedAt: now(),
332
+ ...(options.autoSend ? { autoSend: true } : {}),
333
+ ...(confirmationRequired ? { confirm: true } : {})
334
+ };
335
+ return save(root, note, 'queue');
336
+ }
337
+ /** Takes the note out of the queue. It stays shared; unshare withdraws that. */
338
+ export function dequeue(root, id, expectedVersion) {
339
+ const note = current(root, id, expectedVersion);
340
+ if (note.delivery?.state !== 'queued')
341
+ throw invalid('This note is not waiting to be sent.');
342
+ note.delivery = null;
343
+ return save(root, note, 'dequeue');
344
+ }
345
+ /** The notes waiting for one session, oldest first. `auto` keeps only those to send when it is idle. */
346
+ export function queued(root, sessionId, filter = {}) {
347
+ const ids = filter.ids ? new Set(filter.ids) : null;
348
+ return all(root)
349
+ .filter((note) => note.status === 'open' && note.delivery?.state === 'queued' && note.delivery.sessionId === sessionId)
350
+ .filter((note) => !filter.auto || (note.delivery?.autoSend === true && note.delivery.confirm !== true))
351
+ .filter((note) => !ids || ids.has(note.id))
352
+ .sort((left, right) => (left.delivery.queuedAt).localeCompare(right.delivery.queuedAt) || left.id.localeCompare(right.id));
353
+ }
354
+ /** The notes went to the session as part of `runId`. */
355
+ export function markSent(root, ids, sessionId, runId) {
356
+ const session = safeId(sessionId);
357
+ const run = safeId(runId);
358
+ const notes = [...new Set(ids)].map((id) => current(root, id, undefined));
359
+ for (const note of notes) {
360
+ if (note.status !== 'open')
361
+ throw invalid('Resolved notes cannot be sent.');
362
+ if (note.delivery?.state !== 'queued' || note.delivery.sessionId !== session)
363
+ throw invalid('This note is not queued for this session.');
364
+ if (note.delivery.confirm)
365
+ throw invalid('Confirm this note before sending it.');
366
+ }
367
+ return notes.map((note) => {
368
+ note.delivery = { ...note.delivery, state: 'sent', sessionId: session, sentAt: now(), runId: run };
369
+ delete note.delivery.autoSend;
370
+ delete note.delivery.confirm;
371
+ return save(root, note, 'deliver');
372
+ });
373
+ }
374
+ /** The agent says it acted on a note shared with it. The note stays open until a person resolves it. */
375
+ export function markFixed(root, id, caller, summary) {
376
+ const note = current(root, id, undefined);
377
+ if (!visibleTo(note, caller))
378
+ throw notFound('Note');
379
+ const sessionId = note.delivery?.sessionId ?? caller.sessionId ?? note.grants.find((grant) => grant.principal.sessionId)?.principal.sessionId;
380
+ if (!sessionId)
381
+ throw invalid('This note was never sent to a session.');
382
+ note.delivery = { ...(note.delivery ?? { queuedAt: now() }), state: 'fixed', sessionId, fixedAt: now(), summary: bounded(summary.trim(), 2000, true, 'summary') };
383
+ delete note.delivery.autoSend;
384
+ delete note.delivery.confirm;
385
+ return save(root, note, 'mark_fixed');
386
+ }
@@ -0,0 +1,16 @@
1
+ export interface BrowserConfig {
2
+ /** Show the browser window instead of running it headless. */
3
+ headed: boolean;
4
+ /** Attach to a browser a person already runs (its DevTools address) instead of launching one. */
5
+ cdpUrl: string | null;
6
+ /** A browser program to launch; otherwise Chrome, then Edge, then Playwright's Chromium. */
7
+ executablePath: string | null;
8
+ /** Let pages reach this machine and private networks (local development servers). */
9
+ allowPrivate: boolean;
10
+ /** When set, pages may only reach these sites (and their subdomains). */
11
+ allowedDomains: string[];
12
+ }
13
+ export declare const DEFAULT_BROWSER_CONFIG: BrowserConfig;
14
+ export declare const configPath: (stateDir: string) => string;
15
+ export declare function readBrowserConfig(stateDir: string): BrowserConfig;
16
+ export declare function writeBrowserConfig(stateDir: string, change: Partial<BrowserConfig>): BrowserConfig;
@@ -0,0 +1,22 @@
1
+ // How the harness's browser runs, kept on this device: `<state dir>/browser.json`. Only a person
2
+ // (through a command or the application) writes it; no tool argument can point the browser at
3
+ // another endpoint or profile.
4
+ import { join } from 'node:path';
5
+ import { readJsonOr, writeJson } from "../core/fs.js";
6
+ export const DEFAULT_BROWSER_CONFIG = { headed: false, cdpUrl: null, executablePath: null, allowPrivate: false, allowedDomains: [] };
7
+ export const configPath = (stateDir) => join(stateDir, 'browser.json');
8
+ export function readBrowserConfig(stateDir) {
9
+ const saved = readJsonOr(configPath(stateDir), {});
10
+ return {
11
+ headed: saved.headed === true,
12
+ cdpUrl: typeof saved.cdpUrl === 'string' && /^(?:https?|wss?):\/\/(?:127\.0\.0\.1|localhost|\[::1\])(?::\d+)?(?:\/|$)/.test(saved.cdpUrl) ? saved.cdpUrl : null,
13
+ executablePath: typeof saved.executablePath === 'string' && saved.executablePath.trim() ? saved.executablePath : null,
14
+ allowPrivate: saved.allowPrivate === true,
15
+ allowedDomains: Array.isArray(saved.allowedDomains) ? saved.allowedDomains.filter((domain) => typeof domain === 'string' && /^[a-z0-9.-]+$/i.test(domain)).map((domain) => domain.toLowerCase()) : []
16
+ };
17
+ }
18
+ export function writeBrowserConfig(stateDir, change) {
19
+ const next = { ...readBrowserConfig(stateDir), ...change };
20
+ writeJson(configPath(stateDir), next);
21
+ return readBrowserConfig(stateDir);
22
+ }
@@ -0,0 +1,4 @@
1
+ import type { BrowserConfig } from "./config.js";
2
+ import type { DoctorCheck } from "../doctor/types.js";
3
+ /** Exercises the production tool path against a synthetic page in a throwaway profile. */
4
+ export declare function browserDiagnostic(configure: () => BrowserConfig): DoctorCheck;
@@ -0,0 +1,38 @@
1
+ import { accessSync, constants } from 'node:fs';
2
+ const outputText = (result) => typeof result === 'string' ? result : result.text;
3
+ /** Exercises the production tool path against a synthetic page in a throwaway profile. */
4
+ export function browserDiagnostic(configure) {
5
+ return {
6
+ id: 'browser', category: 'browser', title: 'Isolated browser',
7
+ tools: ['browser_navigate', 'browser_read', 'browser_snapshot', 'browser_click'],
8
+ local: async () => {
9
+ const config = configure();
10
+ if (config.executablePath)
11
+ accessSync(config.executablePath, constants.X_OK);
12
+ return { status: 'pass', evidence: `Browser tools are installed. ${config.cdpUrl ? 'A CDP endpoint is configured; diagnostics will not attach to it.' : 'A dedicated browser will be launched only after live-check confirmation.'} Browser launch is unverified.` };
13
+ },
14
+ live: {
15
+ notice: 'Launch a dedicated headless browser with a disposable profile, open an offline synthetic page, read its marker, and click its test button. No existing browser or profile is used.',
16
+ run: async (probe) => {
17
+ if (configure().cdpUrl)
18
+ return { status: 'blocked', evidence: 'This backend is configured to attach to a browser. Isolated diagnostics will not attach to it.', remedy: 'Use a dedicated launch configuration to test browser interaction.' };
19
+ const needed = ['browser_navigate', 'browser_read', 'browser_snapshot', 'browser_click'];
20
+ if (needed.some(name => !probe.context.tools.includes(name)))
21
+ return { status: 'blocked', evidence: 'The browser interaction test requires navigate, read, snapshot, and click capabilities.' };
22
+ const html = '<!doctype html><title>Harness Doctor</title><p>doctor-ready</p><button onclick="document.querySelector(\'p\').textContent=\'doctor-clicked\'">Diagnostic test</button>';
23
+ await probe.call('browser_navigate', { url: `data:text/html,${encodeURIComponent(html)}` });
24
+ const before = outputText(await probe.call('browser_read', {}));
25
+ if (!before.includes('doctor-ready'))
26
+ return { status: 'fail', evidence: 'The diagnostic page marker could not be read.' };
27
+ const snapshot = outputText(await probe.call('browser_snapshot', {}));
28
+ const line = snapshot.split('\n').find(line => line.includes('button') && line.includes('Diagnostic test'));
29
+ const ref = line && /\b(e\d+)\b/.exec(line)?.[1];
30
+ if (!ref)
31
+ return { status: 'fail', evidence: 'The test button was absent from the browser snapshot.' };
32
+ await probe.call('browser_click', { ref });
33
+ const after = outputText(await probe.call('browser_read', {}));
34
+ return after.includes('doctor-clicked') ? { status: 'pass', evidence: 'Navigation, reading, element discovery, and clicking succeeded in the disposable diagnostic browser.' } : { status: 'fail', evidence: 'Clicking did not change the expected page marker.' };
35
+ }
36
+ }
37
+ };
38
+ }
@@ -0,0 +1,28 @@
1
+ import type { PluginDescriptor } from "../plugins/types.js";
2
+ import type { WorldContext, WorldPart } from "../world/world.js";
3
+ import type { ToolSpec } from "../tools/types.js";
4
+ import { NetworkPolicy } from "./network.js";
5
+ import { BrowserSession, type Launcher } from "./session.js";
6
+ export declare const BROWSER_PLUGIN: PluginDescriptor;
7
+ /** A browser closes after this long without a call. */
8
+ export declare const IDLE_MS: number;
9
+ export interface BrowserPartOptions {
10
+ stateDir: string;
11
+ launch?: Launcher;
12
+ /** Replaces the address check in tests. */
13
+ network?: NetworkPolicy;
14
+ idleMs?: number;
15
+ }
16
+ /** Foundation-owned isolated browser engine. Plugin tools receive sessions through this interface. */
17
+ export interface BrowserEngine {
18
+ sessions: Map<string, BrowserSession>;
19
+ diagnostics: NonNullable<WorldPart['diagnostics']>;
20
+ tools(context: WorldContext): ToolSpec[];
21
+ release(sessionKey: string): Promise<void>;
22
+ close(): Promise<void>;
23
+ }
24
+ export declare function createBrowserEngine(options: BrowserPartOptions): BrowserEngine;
25
+ /** Plugin adapter that exposes the Foundation engine's checked browser tools to a session. */
26
+ export declare function browserPluginPart(engine: BrowserEngine): WorldPart;
27
+ /** Combined adapter retained for direct browser tests and embedders that construct a WorldPart. */
28
+ export declare function browserPart(options: BrowserPartOptions): WorldPart & Pick<BrowserEngine, 'sessions' | 'release' | 'close'>;
@@ -0,0 +1,72 @@
1
+ // Foundation owns the isolated browser engine; the Browser plugin exposes its user-facing tools.
2
+ import { rmSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { readBrowserConfig } from "./config.js";
5
+ import { browserDiagnostic } from "./diagnostics.js";
6
+ import { NetworkPolicy } from "./network.js";
7
+ import { BrowserSession, fileName, launchBrowser } from "./session.js";
8
+ import { BROWSER_TOOL_NAMES, browserTools } from "./tools.js";
9
+ export const BROWSER_PLUGIN = {
10
+ id: 'browser',
11
+ title: 'Browser',
12
+ description: 'A browser the agent drives: open pages that need scripts, read them, click, type and choose. Each session has its own; sign-ins are kept per agent on this device. Sending, buying, deleting, account changes and granting access always ask you.',
13
+ manage: 'tools',
14
+ switchable: { on: true },
15
+ // Its tools are listed in the World group, which the Web plugin owns.
16
+ tools: BROWSER_TOOL_NAMES.map((name) => ({ name }))
17
+ };
18
+ /** A browser closes after this long without a call. */
19
+ export const IDLE_MS = 15 * 60_000;
20
+ export function createBrowserEngine(options) {
21
+ const sessions = new Map();
22
+ const diagnosticKeys = new Set();
23
+ const config = () => readBrowserConfig(options.stateDir);
24
+ const network = options.network ?? new NetworkPolicy(config);
25
+ const sessionFor = (context) => {
26
+ let session = sessions.get(context.sessionKey);
27
+ if (!session) {
28
+ const owner = context.caller.agentId ?? context.caller.projectId ?? 'default';
29
+ const key = context.sessionKey;
30
+ const diagnostic = context.caller.surface === 'doctor';
31
+ if (diagnostic)
32
+ diagnosticKeys.add(key);
33
+ session = new BrowserSession({
34
+ key,
35
+ profileDir: diagnostic ? null : join(options.stateDir, 'browser', 'profiles', fileName(owner)),
36
+ downloadsDir: join(options.stateDir, 'browser', 'downloads', fileName(key)),
37
+ config: diagnostic ? () => ({ ...config(), cdpUrl: null, headed: false }) : config,
38
+ network,
39
+ launch: options.launch ?? launchBrowser,
40
+ idleMs: options.idleMs ?? IDLE_MS,
41
+ onIdle: () => void release(key)
42
+ });
43
+ sessions.set(key, session);
44
+ }
45
+ return session;
46
+ };
47
+ const release = async (key) => {
48
+ const session = sessions.get(key);
49
+ sessions.delete(key);
50
+ await session?.close();
51
+ if (diagnosticKeys.delete(key))
52
+ rmSync(join(options.stateDir, 'browser', 'downloads', fileName(key)), { recursive: true, force: true });
53
+ };
54
+ return {
55
+ diagnostics: () => [browserDiagnostic(config)],
56
+ sessions,
57
+ tools: (context) => browserTools(context, () => sessionFor(context)),
58
+ release,
59
+ close: async () => {
60
+ await Promise.all([...sessions.keys()].map(release));
61
+ }
62
+ };
63
+ }
64
+ /** Plugin adapter that exposes the Foundation engine's checked browser tools to a session. */
65
+ export function browserPluginPart(engine) {
66
+ return { plugin: BROWSER_PLUGIN, diagnostics: engine.diagnostics, tools: context => engine.tools(context) };
67
+ }
68
+ /** Combined adapter retained for direct browser tests and embedders that construct a WorldPart. */
69
+ export function browserPart(options) {
70
+ const engine = createBrowserEngine(options);
71
+ return { ...browserPluginPart(engine), sessions: engine.sessions, release: engine.release, close: engine.close };
72
+ }
@@ -0,0 +1,10 @@
1
+ import type { BrowserConfig } from "./config.js";
2
+ export declare class NetworkPolicy {
3
+ private readonly config;
4
+ private readonly resolve;
5
+ private readonly hosts;
6
+ constructor(config: () => BrowserConfig, resolve?: (host: string) => Promise<string[]>);
7
+ /** Why an address may not be loaded, or null when it may. */
8
+ refusal(address: string): Promise<string | null>;
9
+ private isPublic;
10
+ }
@@ -0,0 +1,59 @@
1
+ // What a page in the harness's browser may reach. The same rule as `web_fetch`: public addresses
2
+ // only, unless a person allowed private ones for local development. This filters the browser's
3
+ // requests; it is a guard, not a sandbox (a page's own DNS can still differ from ours).
4
+ import { lookup } from 'node:dns/promises';
5
+ import { isIP } from 'node:net';
6
+ import { isPublicAddress } from "../web/safeRequest.js";
7
+ const OPEN_SCHEMES = new Set(['data:', 'blob:', 'about:']);
8
+ const CACHE_MS = 60_000;
9
+ export class NetworkPolicy {
10
+ config;
11
+ resolve;
12
+ hosts = new Map();
13
+ constructor(config, resolve = async (host) => (await lookup(host, { all: true, verbatim: true })).map((entry) => entry.address)) {
14
+ this.config = config;
15
+ this.resolve = resolve;
16
+ }
17
+ /** Why an address may not be loaded, or null when it may. */
18
+ async refusal(address) {
19
+ let url;
20
+ try {
21
+ url = new URL(address);
22
+ }
23
+ catch {
24
+ return 'That is not a web address.';
25
+ }
26
+ if (OPEN_SCHEMES.has(url.protocol))
27
+ return null;
28
+ if (url.protocol !== 'http:' && url.protocol !== 'https:')
29
+ return `${url.protocol} addresses cannot be opened.`;
30
+ if (url.username || url.password)
31
+ return 'Addresses with a username or password cannot be opened.';
32
+ const host = url.hostname.replace(/^\[|\]$/g, '').toLowerCase();
33
+ const { allowedDomains, allowPrivate } = this.config();
34
+ if (allowedDomains.length && !allowedDomains.some((domain) => host === domain || host.endsWith(`.${domain}`)))
35
+ return `${host} is not among the sites this browser may reach.`;
36
+ if (allowPrivate)
37
+ return null;
38
+ return (await this.isPublic(host)) ? null : `${host} is not a public address. A person can allow private addresses in the browser settings.`;
39
+ }
40
+ async isPublic(host) {
41
+ if (isIP(host))
42
+ return isPublicAddress(host);
43
+ if (host === 'localhost' || host.endsWith('.localhost'))
44
+ return false;
45
+ const cached = this.hosts.get(host);
46
+ if (cached && Date.now() - cached.at < CACHE_MS)
47
+ return cached.ok;
48
+ let ok = false;
49
+ try {
50
+ const addresses = await this.resolve(host);
51
+ ok = addresses.length > 0 && addresses.every(isPublicAddress);
52
+ }
53
+ catch {
54
+ ok = false;
55
+ }
56
+ this.hosts.set(host, { at: Date.now(), ok });
57
+ return ok;
58
+ }
59
+ }
@@ -0,0 +1,3 @@
1
+ import type { Harness } from "../harness.js";
2
+ import type { Handler } from "../server/rpc.js";
3
+ export declare function browserServerMethods(harness: Harness): Record<string, Handler>;
@@ -0,0 +1,7 @@
1
+ import { pick } from "../server/params.js";
2
+ export function browserServerMethods(harness) {
3
+ return {
4
+ 'browser.config': () => harness.world.browserConfig(),
5
+ 'browser.configure': (params) => harness.world.configureBrowser(pick(params, ['headed', 'cdpUrl', 'executablePath', 'allowPrivate', 'allowedDomains']))
6
+ };
7
+ }