@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,847 @@
1
+ // Loaded by the `pi` command in a terminal session (`--extension`). It reports what the native
2
+ // session does to the harness, asks before each tool call, takes instructions the harness
3
+ // queues for it, and gives the session the harness's own tools. It runs in the `pi` process,
4
+ // so everything it knows about the harness comes through the session socket.
5
+ import { readFileSync } from 'node:fs';
6
+ import { createBashTool, createEditTool, createEditToolDefinition, createPowerShellTool, createWriteTool, createWriteToolDefinition } from '@earendil-works/pi-coding-agent';
7
+ import { Type } from 'typebox';
8
+ import { bodyOf } from "../core/frontmatter.js";
9
+ import { connectionFromEnv, socketCall, terminalCall } from "./client.js";
10
+ import { controlCall } from "./control.js";
11
+ import { SPAWN_SUBAGENT, SUBAGENT_OWNER, SUBAGENT_RECEIPT, SUBAGENT_RESULTS, subagentHistory } from "../sessions/subagents.js";
12
+ import { PLAN_RESEARCH_TOOLS } from "../agents/planResearch.js";
13
+ import { askUserTool } from "../tools/askUser.js";
14
+ import { TODO_WRITE, todoTool } from "../tools/todo.js";
15
+ import { goalStopOutcome, handoffFields, stopCheckpointReason, stopSummary } from "../sessions/goalStop.js";
16
+ import { launchSwitchOff, sessionCheckModel } from "../sessions/completionCheck.js";
17
+ import { GOAL_STATE_ENTRY, GOAL_TOOLS, goalTools } from "../sessions/goal.js";
18
+ import { GOAL_EXTENSION, goalLoop, goalNotice } from "../sessions/goalLoop.js";
19
+ import { activeToolBeat, createSliceState, DEFAULT_SLICE_POLICY, parseWorkSlice, sliceContinuation, workSliceGuard, WORK_SLICE_EXTENSION } from "../sessions/workSlice.js";
20
+ import { DEFAULT_COMMAND_TIMEOUT_SECONDS, withCommandBudget } from "../core/commandBudget.js";
21
+ import { SESSION_NAME, deriveSessionName, sessionNameTool } from "../tools/sessionName.js";
22
+ import { CAPABILITY_DISCOVERY, describeCapabilities } from "../tools/getCapabilities.js";
23
+ import { PLAN_INSTRUCTIONS, PLAN_REPAIR_CUSTOM_TYPE, PLAN_REPAIR_INSTRUCTIONS, parsePlanOutcome, planRefusal } from "../sessions/planMode.js";
24
+ import { compactionCheckpoint } from "../sessions/compactionCheckpoint.js";
25
+ import { requiredSkillsText, sessionStateText } from "../prompt/compile.js";
26
+ import { pruneToolImages } from "../world/images.js";
27
+ import { parseInitialBashCommand } from "../sessions/initialBash.js";
28
+ import { skillInvocations } from "./tui/skillInvocation.js";
29
+ import { inspectWorkspaceWrite } from "../sessions/workspaceBoundary.js";
30
+ import { createWorkspaceShellTool } from "../core/workspaceBashTool.js";
31
+ import { createWorkspaceBashOperations, runWithWorkspaceWriteScope } from "../core/workspaceSandbox.js";
32
+ import { createWorkspaceFileTools } from "../core/workspaceWriteOperations.js";
33
+ import { BUDGET_GUARD, OUTPUT_TRIM, budgetGuard, outputTrim } from "../plugins/firstParty.js";
34
+ /** How long reply text gathers before it is sent on to a paired phone. */
35
+ const STREAM_FLUSH_MS = 150;
36
+ /** How much text a tool handed back to the model. */
37
+ function resultSize(result) {
38
+ const content = result?.content;
39
+ if (!Array.isArray(content))
40
+ return typeof result === 'string' ? result.length : null;
41
+ return content.reduce((total, part) => total + (part?.type === 'text' && typeof part.text === 'string' ? part.text.length : 0), 0);
42
+ }
43
+ async function withParentCancellation(signal, work) {
44
+ const stop = () => { void controlCall('terminal.interrupt').catch(() => { }); };
45
+ if (signal?.aborted)
46
+ stop();
47
+ signal?.addEventListener('abort', stop, { once: true });
48
+ try {
49
+ return await work();
50
+ }
51
+ finally {
52
+ signal?.removeEventListener('abort', stop);
53
+ }
54
+ }
55
+ export default async function (pi, planRun, getSession, goal) {
56
+ await terminalCall('startup', { phase: 'Pi extension loaded' });
57
+ let context = null;
58
+ let nativeSubagents = false;
59
+ let subagentParent = false;
60
+ let stoppedChildren = null;
61
+ let timer = null;
62
+ let heartbeat = null;
63
+ let turnStartedAt = 0;
64
+ let polling = false;
65
+ let failure;
66
+ let failureCode;
67
+ let messageAborted = false;
68
+ let turnActive = false;
69
+ let lastContextTokens;
70
+ let planRepairAttempted = false;
71
+ let lastPlanText = '';
72
+ const emptyUsage = () => ({ inputTokens: 0, outputTokens: 0, cacheReadTokens: 0, cacheWriteTokens: 0, requests: 0, costUsd: 0 });
73
+ let usage = emptyUsage();
74
+ let reasoningTokens;
75
+ let costReported = false;
76
+ let requestStartedAt = null;
77
+ let pendingRefusals = [];
78
+ const toolStartedAt = new Map();
79
+ const toolsInFlight = new Map();
80
+ const fileTools = new Map();
81
+ const writeAuthorizations = new Map();
82
+ let workspaceRoot = null;
83
+ let sessionState = null;
84
+ let stateDelivered = false;
85
+ let autoNameTried = false;
86
+ let lastTodo = [];
87
+ // The harness's own tools for this session (connected apps and what the application offers).
88
+ let stage = 'Tool discovery';
89
+ try {
90
+ await terminalCall('startup', { phase: stage });
91
+ const connection = connectionFromEnv();
92
+ const { tools } = await socketCall(connection, 'tools.list', {}, 15_000);
93
+ stage = 'Tool registration';
94
+ for (const tool of tools) {
95
+ pi.registerTool({
96
+ name: tool.name,
97
+ label: tool.label,
98
+ description: tool.description,
99
+ parameters: Type.Unsafe(tool.parameters),
100
+ async execute(_id, input) {
101
+ const result = await socketCall(connection, 'tools.call', { name: tool.name, input: input }, 1_230_000);
102
+ const images = (result.images ?? []).map((image) => ({ type: 'image', data: image.data, mimeType: image.mimeType }));
103
+ return { content: [{ type: 'text', text: result.text }, ...images], details: result.details };
104
+ }
105
+ });
106
+ }
107
+ // The harness's own extensions a person switched on, as a structured session loads them inline.
108
+ const own = await socketCall(connection, 'firstParty.list', {}, 15_000)
109
+ .then((reply) => reply?.plugins ?? [], () => []);
110
+ for (const plugin of own) {
111
+ if (plugin.id === OUTPUT_TRIM)
112
+ outputTrim(plugin.settings)(pi);
113
+ if (plugin.id === BUDGET_GUARD)
114
+ budgetGuard(plugin.settings)(pi);
115
+ }
116
+ const native = await controlCall('terminal.subagents.tools');
117
+ nativeSubagents = native.tools.length > 0;
118
+ if (planRun && native.profiles)
119
+ planRun.subagentProfiles = native.profiles;
120
+ for (const tool of native.tools)
121
+ pi.registerTool({
122
+ name: tool.name, label: tool.label, description: tool.description, parameters: Type.Unsafe(tool.parameters),
123
+ execute: async (_id, input, signal) => {
124
+ const result = await withParentCancellation(signal, () => controlCall('terminal.subagents.call', { name: tool.name, input }, 2_147_483_647));
125
+ return { content: [{ type: 'text', text: result.text }], details: result.details ?? {} };
126
+ }
127
+ });
128
+ }
129
+ catch (error) {
130
+ await terminalCall('startupFailed', { reason: `${stage} failed: ${error instanceof Error ? error.message : 'Unavailable'}` }).catch(() => { });
131
+ throw error;
132
+ }
133
+ pi.registerTool({
134
+ ...CAPABILITY_DISCOVERY,
135
+ parameters: Type.Unsafe(CAPABILITY_DISCOVERY.parameters),
136
+ async execute(_id, input) {
137
+ const active = pi.getActiveTools();
138
+ const tools = pi.getAllTools();
139
+ const selected = planRun?.active ? [...planRun.allowedTools] : active;
140
+ const name = input && typeof input === 'object' && typeof input.tool === 'string'
141
+ ? input.tool
142
+ : undefined;
143
+ const text = JSON.stringify(describeCapabilities({
144
+ capabilities: { version: 1, tools: selected, connectors: planRun?.connectors ?? [], contributions: [] },
145
+ active,
146
+ registered: tools
147
+ }, name));
148
+ return { content: [{ type: 'text', text }], details: undefined };
149
+ }
150
+ });
151
+ const workspaceBash = createWorkspaceBashOperations(() => workspaceRoot, {
152
+ bypassWorkspaceBoundary: async (request) => {
153
+ const result = await controlCall('terminal.workspaceBoundaryBypass', { tool: 'bash', args: { command: request.command, cwd: request.cwd, workspaceRoot: request.workspaceRoot } });
154
+ return result.bypass;
155
+ },
156
+ requestWorkspaceWriteScope: async (request) => {
157
+ const result = await controlCall('terminal.workspaceEscape', { tool: 'bash', args: { command: request.command, workspaceWriteScope: 'outside' }, reason: request.reason });
158
+ return result.approved;
159
+ },
160
+ workspaceWriteScope: () => planRun?.active ? 'read-only' : undefined
161
+ });
162
+ pi.registerTool(createWorkspaceShellTool({ createBashTool, createPowerShellTool }, process.cwd(), workspaceBash));
163
+ const nativeFileTools = createWorkspaceFileTools({ createWriteTool, createWriteToolDefinition, createEditTool, createEditToolDefinition }, process.cwd(), writeAuthorizations);
164
+ pi.registerTool(nativeFileTools.write);
165
+ pi.registerTool(nativeFileTools.edit);
166
+ // The current name and this run's todo ride with each request; they never change the stable prefix.
167
+ pi.on('context', (event) => {
168
+ if (!sessionState || stateDelivered)
169
+ return;
170
+ stateDelivered = true;
171
+ return {
172
+ messages: [...event.messages, {
173
+ role: 'custom',
174
+ customType: 'xingular-session-state',
175
+ content: sessionState,
176
+ display: false,
177
+ timestamp: Date.now()
178
+ }]
179
+ };
180
+ });
181
+ compactionCheckpoint({ planInstructions: () => planRun?.active ? PLAN_INSTRUCTIONS : null })(pi);
182
+ // A terminal reply is bounded like any other (PROP-0041): a checkpoint at each boundary, and the
183
+ // reply continues in place up to the policy's slice cap (ADR-0070) before the person decides.
184
+ let slicePolicy;
185
+ try {
186
+ slicePolicy = parseWorkSlice(undefined);
187
+ }
188
+ catch (error) {
189
+ slicePolicy = { ...DEFAULT_SLICE_POLICY };
190
+ console.error(`${error instanceof Error ? error.message : String(error)} Using the default work slices.`);
191
+ }
192
+ const sliceState = createSliceState(slicePolicy);
193
+ // `XINGULAR_WORK_SLICE=off` at launch leaves terminal replies unbounded, as before PROP-0041.
194
+ // A goal-claim check's model request counts with the reply's usage, like any other request.
195
+ const recordCheckUsage = (raw) => {
196
+ const message = raw;
197
+ const reported = message.usage;
198
+ if (!reported)
199
+ return;
200
+ usage.inputTokens += reported.input ?? 0;
201
+ usage.outputTokens += reported.output ?? 0;
202
+ usage.cacheReadTokens += reported.cacheRead ?? 0;
203
+ usage.cacheWriteTokens += reported.cacheWrite ?? 0;
204
+ usage.requests += 1;
205
+ if (typeof reported.reasoning === 'number')
206
+ reasoningTokens = (reasoningTokens ?? 0) + reported.reasoning;
207
+ const cost = reported.cost?.total;
208
+ if (typeof cost === 'number') {
209
+ usage.costUsd += cost;
210
+ costReported = true;
211
+ }
212
+ const identity = { model: message.model, provider: message.provider };
213
+ const { costUsd, ...tokens } = usage;
214
+ void terminalCall('usage', {
215
+ ...tokens,
216
+ ...(costReported ? { costUsd, costSource: 'harness' } : {}),
217
+ ...(reasoningTokens === undefined ? {} : { reasoningTokens }),
218
+ ...identity,
219
+ request: {
220
+ index: usage.requests,
221
+ ...identity,
222
+ responseId: message.responseId,
223
+ inputTokens: reported.input ?? 0,
224
+ cacheReadTokens: reported.cacheRead ?? 0,
225
+ cacheWriteTokens: reported.cacheWrite ?? 0,
226
+ outputTokens: reported.output ?? 0,
227
+ ...(typeof reported.reasoning === 'number' ? { reasoningTokens: reported.reasoning } : {}),
228
+ ...(typeof cost === 'number' ? { costUsd: cost, costSource: 'harness' } : {}),
229
+ ...(typeof message.durationMs === 'number' ? { durationMs: message.durationMs } : {}),
230
+ stopReason: message.stopReason
231
+ }
232
+ }).catch(() => undefined);
233
+ };
234
+ if (slicePolicy.enabled)
235
+ workSliceGuard({
236
+ policy: slicePolicy,
237
+ state: sliceState,
238
+ onRefuse: (event, reason) => { pendingRefusals.push(terminalCall('refusal', { toolCallId: event.toolCallId, name: event.toolName, code: 'work_slice', reason: reason.slice(0, 2_000) }).catch(() => { })); }
239
+ })(pi);
240
+ // Only the latest screenshots stay in what the model sees (world/images.ts).
241
+ pi.on('context', (event) => {
242
+ const messages = pruneToolImages(event.messages);
243
+ return messages === event.messages ? undefined : { messages: messages };
244
+ });
245
+ pi.on('session_start', async (_event, ctx) => {
246
+ context = ctx;
247
+ sessionState = null;
248
+ stateDelivered = false;
249
+ autoNameTried = false;
250
+ lastTodo = [];
251
+ if (timer)
252
+ clearInterval(timer);
253
+ // The branch's parent runs let the controller show the latest one's rows again on reopen.
254
+ await terminalCall('ready', { nativeSessionId: ctx.sessionManager.getSessionFile(), owners: subagentHistory(ctx.sessionManager.getBranch?.() ?? []).owners });
255
+ timer = setInterval(() => {
256
+ if (polling || !context)
257
+ return;
258
+ polling = true;
259
+ void terminalCall('poll', {}, 5_000)
260
+ .then(({ command }) => {
261
+ if (command?.type === 'interrupt')
262
+ context?.abort();
263
+ else if (command?.type === 'send') {
264
+ if (context?.ui.getEditorText().trim())
265
+ throw new Error('The terminal contains a user draft.');
266
+ // Pi 1.2 needs deliverAs while a run is busy; a message sent then waits for that run to finish.
267
+ pi.sendUserMessage(command.text, context?.isIdle() === false ? { deliverAs: 'followUp' } : undefined);
268
+ }
269
+ })
270
+ .catch(() => {
271
+ context?.abort();
272
+ if (timer)
273
+ clearInterval(timer);
274
+ })
275
+ .finally(() => {
276
+ polling = false;
277
+ });
278
+ }, 100);
279
+ });
280
+ pi.on('before_agent_start', async (event, ctx) => {
281
+ context = ctx;
282
+ failure = undefined;
283
+ failureCode = undefined;
284
+ messageAborted = false;
285
+ lastContextTokens = undefined;
286
+ planRepairAttempted = false;
287
+ lastPlanText = '';
288
+ usage = emptyUsage();
289
+ reasoningTokens = undefined;
290
+ costReported = false;
291
+ // A run a plugin starts with a custom message has no user prompt to record; it still begins a turn.
292
+ const begun = await terminalCall('begin', { text: event.messageType === 'user' ? event.prompt : '', model: ctx.model ? `${ctx.model.provider}/${ctx.model.id}` : null, effort: pi.getThinkingLevel?.() ?? null });
293
+ turnActive = true;
294
+ workspaceRoot = typeof begun.workspaceRoot === 'string' ? begun.workspaceRoot : null;
295
+ if (!workspaceRoot)
296
+ throw new Error('The active project workspace could not be resolved; the turn was not started.');
297
+ // Every turn marks its run on the branch, so a reopened conversation finds its latest one.
298
+ pi.appendEntry(SUBAGENT_OWNER, { runId: begun.runId });
299
+ // A live reply reports progress so a person and the watchdog can tell a long turn from a wedged
300
+ // one; a turn that stops producing anything is settled with reason `stalled` (INV-RUN-14).
301
+ turnStartedAt = Date.now();
302
+ toolsInFlight.clear();
303
+ if (heartbeat)
304
+ clearInterval(heartbeat);
305
+ heartbeat = setInterval(() => {
306
+ void terminalCall('heartbeat', {
307
+ steps: sliceState.steps,
308
+ elapsedMs: Date.now() - turnStartedAt,
309
+ lastTool: sliceState.lastTool,
310
+ compactions: sliceState.compactions,
311
+ slice: sliceState.slice,
312
+ maxToolCalls: slicePolicy.enabled ? slicePolicy.maxToolCalls : 0,
313
+ ...activeToolBeat(toolsInFlight)
314
+ }, 10_000).catch(() => { });
315
+ }, 30_000);
316
+ heartbeat.unref?.();
317
+ stoppedChildren = null;
318
+ if (nativeSubagents) {
319
+ const snapshot = await controlCall('terminal.subagents.register', { tools: pi.getActiveTools(), model: ctx.model ? `${ctx.model.provider}/${ctx.model.id}` : null, effort: pi.getThinkingLevel(), plan: planRun?.active === true, history: subagentHistory(ctx.sessionManager.getBranch()) });
320
+ if (planRun && Array.isArray(snapshot.connectors))
321
+ planRun.connectors = snapshot.connectors;
322
+ if (planRun && snapshot.subagentProfiles)
323
+ planRun.subagentProfiles = snapshot.subagentProfiles;
324
+ stoppedChildren = snapshot.notice ?? null;
325
+ subagentParent = true;
326
+ }
327
+ if (planRun && event.messageType === 'user') {
328
+ if (planRun.active)
329
+ event.systemPromptOptions.sections.plan = PLAN_INSTRUCTIONS;
330
+ else
331
+ delete event.systemPromptOptions.sections.plan;
332
+ if (planRun.subagentProfiles)
333
+ event.systemPromptOptions.sections.subagents = planRun.active ? planRun.subagentProfiles.plan : planRun.subagentProfiles.normal;
334
+ }
335
+ const bang = event.messageType === 'user' ? /^\s*!\s*([\s\S]+)$/u.exec(event.prompt) : null;
336
+ if (!bang)
337
+ return;
338
+ const initial = parseInitialBashCommand(bang[1]);
339
+ const command = initial.command;
340
+ const args = { command, ...(initial.workspaceWriteScope === 'outside' ? { workspaceWriteScope: 'outside' } : {}) };
341
+ const id = `initial-bash:${begun.runId}`;
342
+ const started = Date.now();
343
+ await terminalCall('tool', { phase: 'start', id, name: 'bash', summary: command.slice(0, 200), input: JSON.stringify(args) });
344
+ let refusal;
345
+ let refusalCode;
346
+ let result;
347
+ if (!command) {
348
+ refusal = 'Enter a Bash command after !outside.';
349
+ }
350
+ else if (planRun?.active) {
351
+ refusal = 'Bash commands are disabled while a plan request is running.';
352
+ refusalCode = 'plan_mode';
353
+ }
354
+ else {
355
+ let checkingGate = true;
356
+ try {
357
+ const policy = await terminalCall('policy', { tool: 'bash', args });
358
+ if (policy.requiresApproval) {
359
+ const approval = await terminalCall('approval', { requestId: id, tool: 'bash', args });
360
+ if (approval.decision !== 'approved') {
361
+ refusal = 'The user denied this Bash command.';
362
+ refusalCode = 'approval_denied';
363
+ }
364
+ }
365
+ else if (!policy.allowed) {
366
+ refusal = policy.reason ?? 'This Bash command is outside what the terminal allows.';
367
+ refusalCode = 'policy';
368
+ }
369
+ checkingGate = false;
370
+ if (!refusal) {
371
+ const session = getSession?.();
372
+ if (!session)
373
+ refusal = 'The native session is unavailable.';
374
+ else
375
+ result = await runWithWorkspaceWriteScope(initial.workspaceWriteScope, () => withCommandBudget(() => session.executeBash(command, undefined, { id, operations: workspaceBash }), () => session.abortBash(), DEFAULT_COMMAND_TIMEOUT_SECONDS));
376
+ }
377
+ }
378
+ catch (error) {
379
+ refusal = error instanceof Error ? error.message : 'The Bash policy or command failed.';
380
+ if (checkingGate)
381
+ refusalCode = 'controller_unavailable';
382
+ }
383
+ }
384
+ if (refusal && refusalCode)
385
+ await terminalCall('refusal', { toolCallId: id, name: 'bash', code: refusalCode, reason: refusal.slice(0, 2_000) }).catch(() => { });
386
+ const output = result?.output ?? refusal ?? 'The command did not complete.';
387
+ const outputTruncated = output.length > 24_000;
388
+ await terminalCall('tool', {
389
+ phase: 'end', id, name: 'bash', ok: !refusal && result?.exitCode === 0 && !result.cancelled,
390
+ durationMs: Date.now() - started, resultChars: output.length,
391
+ output: outputTruncated ? `${output.slice(0, 23_987)}\n…[truncated]` : output,
392
+ ...(outputTruncated ? { outputTruncated: true } : {})
393
+ });
394
+ const instruction = refusal
395
+ ? `The user's initial Bash command was not run. Reason: ${refusal}. Do not claim that it ran; explain the limitation and ask how to proceed.`
396
+ : 'The user’s initial Bash command has already run. Read its native Bash result and explain what it shows. Do not run the same command again unless the user explicitly asks.';
397
+ return { message: { customType: 'xingular-initial-bash', content: instruction, display: false, details: {} } };
398
+ });
399
+ // A second handler, so the notice joins any initial-Bash message rather than replacing it.
400
+ pi.on('before_agent_start', async () => {
401
+ const notice = stoppedChildren;
402
+ stoppedChildren = null;
403
+ if (notice)
404
+ return { message: { customType: SUBAGENT_RESULTS, content: notice.text, display: false, details: { [SUBAGENT_RECEIPT]: notice.receipt } } };
405
+ });
406
+ // A `$name` anywhere in the message makes that skill required for this request. The skill's text is
407
+ // delivered as a hidden request-scoped message, so the person's own wording reaches the model unchanged.
408
+ pi.on('before_agent_start', async (event) => {
409
+ if (event.messageType !== 'user' || /^\s*!/u.test(event.prompt))
410
+ return;
411
+ if (pi.getSettings?.().enableSkillCommands === false)
412
+ return;
413
+ const skills = (pi.getCommands?.() ?? [])
414
+ .filter((command) => command.source === 'skill')
415
+ .map((command) => ({
416
+ name: command.name.replace(/^skill:/, ''),
417
+ path: command.sourceInfo.path,
418
+ ...(command.sourceInfo.baseDir ? { baseDir: command.sourceInfo.baseDir } : {})
419
+ }));
420
+ if (!skills.length)
421
+ return;
422
+ const names = skillInvocations(event.prompt, new Set(skills.map((skill) => skill.name)));
423
+ if (!names.length)
424
+ return;
425
+ const entries = names.map((name) => {
426
+ const skill = skills.find((candidate) => candidate.name === name);
427
+ try {
428
+ return { name, path: skill.path, baseDir: skill.baseDir, body: bodyOf(readFileSync(skill.path, 'utf8')) };
429
+ }
430
+ catch {
431
+ return { name, path: skill.path, body: '' };
432
+ }
433
+ });
434
+ const content = requiredSkillsText(entries);
435
+ return content ? { message: { customType: 'xingular-required-skills', content, display: false, details: { skills: names } } } : undefined;
436
+ });
437
+ // A new user turn starts with an empty todo. The previous list is context, not this run's list.
438
+ // A substantive first turn also gets a provisional name when the terminal policy allows it.
439
+ pi.on('before_agent_start', async (event, ctx) => {
440
+ if (event.messageType !== 'user')
441
+ return;
442
+ const branch = ctx.sessionManager.getBranch?.() ?? [];
443
+ const hasUser = branch.some((entry) => entry.type === 'message' && entry.message?.role === 'user');
444
+ let name = typeof pi.getSessionName === 'function' ? pi.getSessionName() ?? null : null;
445
+ if (!name && !autoNameTried && pi.setSessionName) {
446
+ const candidate = deriveSessionName(event.prompt);
447
+ if (candidate) {
448
+ autoNameTried = true;
449
+ try {
450
+ const policy = await controlCall('terminal.policy', { tool: SESSION_NAME, args: { name: candidate } });
451
+ if (policy.allowed && !policy.requiresApproval) {
452
+ pi.setSessionName(candidate);
453
+ name = candidate;
454
+ }
455
+ }
456
+ catch {
457
+ // Session naming is metadata; a refused or failed name never fails the turn.
458
+ }
459
+ }
460
+ }
461
+ const state = {
462
+ name,
463
+ todo: [],
464
+ ...(lastTodo.length ? { previousTodo: lastTodo } : {}),
465
+ firstTurn: !hasUser
466
+ };
467
+ lastTodo = [];
468
+ const active = typeof pi.getActiveTools === 'function' ? pi.getActiveTools() : null;
469
+ sessionState = sessionStateText(state, {
470
+ name: active ? active.includes(SESSION_NAME) : true,
471
+ todo: active ? active.includes(TODO_WRITE) : true
472
+ });
473
+ stateDelivered = false;
474
+ });
475
+ const deliverChildren = async (event, ctx, settle) => {
476
+ if (!nativeSubagents || (settle && event.outcome !== 'completed') || ctx.signal?.aborted)
477
+ return;
478
+ const result = await withParentCancellation(ctx.signal, () => controlCall('terminal.subagents.delivery', { history: subagentHistory([...ctx.sessionManager.getBranch(), ...event.entries]), settle }, 2_147_483_647));
479
+ if (!result)
480
+ return;
481
+ return { entries: [...event.entries, { type: 'custom_message', customType: SUBAGENT_RESULTS, content: result.text, display: false, details: { [SUBAGENT_RECEIPT]: result.receipt } }], continue: true };
482
+ };
483
+ pi.on('turn_end', (event, ctx) => deliverChildren(event, ctx, false));
484
+ pi.on('agent_before_settle', (event, ctx) => deliverChildren(event, ctx, true));
485
+ pi.on('agent_before_settle', (event, ctx) => {
486
+ if (!planRun?.active || planRepairAttempted || event.outcome !== 'completed' || event.continue || ctx.signal?.aborted || failure || sliceState.endedBy || parsePlanOutcome(lastPlanText).kind !== 'invalid')
487
+ return;
488
+ planRepairAttempted = true;
489
+ return {
490
+ entries: [...event.entries, { type: 'custom_message', customType: PLAN_REPAIR_CUSTOM_TYPE, content: PLAN_REPAIR_INSTRUCTIONS, display: false, details: { reason: 'invalid_plan_outcome' } }],
491
+ continue: true
492
+ };
493
+ });
494
+ // The stop gate is gone (ADR-0075): a reply the model ends settles as it ends, and the todo list
495
+ // is progress, not a gate. A /goal (ADR-0072) is the only layer that continues a reply: while one
496
+ // is active, a reply that would end continues in place; its claim check is the only completion
497
+ // check.
498
+ if (goal) {
499
+ for (const spec of goalTools(() => goal))
500
+ pi.registerTool({
501
+ name: spec.name,
502
+ label: spec.label,
503
+ description: spec.description,
504
+ parameters: spec.parameters(Type),
505
+ async execute(_id, input) {
506
+ const result = await spec.execute(input);
507
+ return { content: [{ type: 'text', text: typeof result === 'string' ? result : result.text }], details: undefined };
508
+ }
509
+ });
510
+ // The goal's tools are offered to the model only while a goal exists.
511
+ const syncGoalTools = (state) => {
512
+ const active = pi.getActiveTools();
513
+ const wanted = state !== null && state.status !== 'complete';
514
+ const has = GOAL_TOOLS.some((name) => active.includes(name));
515
+ if (wanted && !GOAL_TOOLS.every((name) => active.includes(name)))
516
+ pi.setActiveTools([...active, ...GOAL_TOOLS.filter((name) => !active.includes(name))]);
517
+ else if (!wanted && has)
518
+ pi.setActiveTools(active.filter((name) => !GOAL_TOOLS.includes(name)));
519
+ };
520
+ const unsubscribe = goal.subscribe((state) => {
521
+ try {
522
+ pi.appendEntry(GOAL_STATE_ENTRY, { goal: state });
523
+ syncGoalTools(state);
524
+ }
525
+ catch {
526
+ // The session is closing; the next one restores from its own branch.
527
+ }
528
+ });
529
+ pi.on('session_shutdown', () => { unsubscribe(); });
530
+ pi.on('session_start', (_event, ctx) => {
531
+ // A goal is restored from the branch, and waits for the person: nothing resumes by itself.
532
+ const entries = (ctx.sessionManager.getBranch?.() ?? []);
533
+ const saved = [...entries].reverse().find((entry) => entry.type === 'custom' && entry.customType === GOAL_STATE_ENTRY)?.data?.goal ?? null;
534
+ goal.restore(saved && (saved.status === 'active') ? { ...saved, status: 'paused', claimed: false } : saved);
535
+ syncGoalTools(goal.get());
536
+ });
537
+ goalLoop({
538
+ controller: goal,
539
+ check: launchSwitchOff('XINGULAR_COMPLETION_CHECK') ? null : sessionCheckModel,
540
+ active: () => !planRun?.active,
541
+ sliceEnded: () => sliceState.endedBy !== null,
542
+ failed: () => Boolean(failure),
543
+ recordUsage: recordCheckUsage,
544
+ onEvent: (event) => {
545
+ void terminalCall('notice', { kind: 'notify', level: 'info', extension: GOAL_EXTENSION, text: goalNotice(event) }).catch(() => undefined);
546
+ }
547
+ })(pi);
548
+ }
549
+ // A reply that did work and reached its budget continues as the next slice of the same run
550
+ // (ADR-0070).
551
+ if (slicePolicy.enabled)
552
+ sliceContinuation({
553
+ policy: slicePolicy,
554
+ state: sliceState,
555
+ active: () => !planRun?.active,
556
+ failed: () => Boolean(failure),
557
+ blocked: () => goal?.get()?.status === 'blocked',
558
+ goalActive: () => goal?.active() === true,
559
+ todo: () => lastTodo,
560
+ next: () => handoffFields(lastTodo, goal?.get() ?? null).next,
561
+ onContinue: (ended) => {
562
+ void terminalCall('checkpoint', { summary: `Work slice ${ended.slice} reached its limit after ${ended.steps} steps; the reply continues.`, ...handoffFields(lastTodo, goal?.get() ?? null), files: [], checks: [], decisions: [], slice: ended.slice, reason: 'budget' }).catch(() => undefined);
563
+ void terminalCall('notice', { kind: 'notify', level: 'info', extension: WORK_SLICE_EXTENSION, text: `Work slice ${ended.slice} reached ${ended.limit ?? 'its limit'}; continuing with slice ${ended.slice + 1} of up to ${slicePolicy.maxSlices}.` }).catch(() => undefined);
564
+ }
565
+ })(pi);
566
+ // Reply text as it streams, batched, for a paired phone (remote control). The completed message
567
+ // carries the same id and replaces whatever streamed.
568
+ let streamId = null;
569
+ let streamText = '';
570
+ let streamTimer = null;
571
+ let streamCount = 0;
572
+ const flushStream = () => {
573
+ streamTimer = null;
574
+ if (!streamId || !streamText)
575
+ return;
576
+ const text = streamText;
577
+ streamText = '';
578
+ void terminalCall('delta', { id: streamId, text }).catch(() => undefined);
579
+ };
580
+ pi.on('message_update', (event) => {
581
+ const update = event.assistantMessageEvent;
582
+ if (event.message.role !== 'assistant' || update.type !== 'text_delta' || !update.delta)
583
+ return;
584
+ streamId ??= `${Date.now().toString(36)}-${++streamCount}`;
585
+ streamText += update.delta;
586
+ streamTimer ??= setTimeout(flushStream, STREAM_FLUSH_MS);
587
+ });
588
+ pi.on('message_end', async (event) => {
589
+ if (event.message.role !== 'assistant')
590
+ return;
591
+ const messageId = streamId;
592
+ if (streamTimer)
593
+ clearTimeout(streamTimer);
594
+ streamTimer = null;
595
+ streamText = '';
596
+ streamId = null;
597
+ if (event.message.stopReason === 'error') {
598
+ failure = event.message.errorMessage || 'Pi stopped: error';
599
+ failureCode = 'provider_error';
600
+ }
601
+ if (event.message.stopReason === 'aborted')
602
+ messageAborted = true;
603
+ const text = event.message.content.filter((part) => part.type === 'text').map((part) => part.text).join('\n');
604
+ lastPlanText = text;
605
+ if (text)
606
+ await terminalCall('message', messageId ? { id: messageId, text } : { text });
607
+ if (event.message.usage) {
608
+ const reported = event.message.usage;
609
+ lastContextTokens = (reported.input ?? 0) + (reported.cacheRead ?? 0) + (reported.cacheWrite ?? 0);
610
+ usage.inputTokens += reported.input ?? 0;
611
+ usage.outputTokens += reported.output ?? 0;
612
+ usage.cacheReadTokens += reported.cacheRead ?? 0;
613
+ usage.cacheWriteTokens += reported.cacheWrite ?? 0;
614
+ usage.requests += 1;
615
+ if (typeof reported.reasoning === 'number')
616
+ reasoningTokens = (reasoningTokens ?? 0) + reported.reasoning;
617
+ const cost = reported.cost?.total;
618
+ if (typeof cost === 'number') {
619
+ usage.costUsd += cost;
620
+ costReported = true;
621
+ }
622
+ const identity = { model: event.message.model, provider: event.message.provider };
623
+ const { costUsd, ...tokens } = usage;
624
+ await terminalCall('usage', {
625
+ ...tokens,
626
+ ...(costReported ? { costUsd, costSource: 'harness' } : {}),
627
+ ...(reasoningTokens === undefined ? {} : { reasoningTokens }),
628
+ contextTokens: (reported.input ?? 0) + (reported.cacheRead ?? 0) + (reported.cacheWrite ?? 0),
629
+ ...(context?.model?.contextWindow ? { contextWindow: context.model.contextWindow } : {}),
630
+ ...identity,
631
+ request: {
632
+ index: usage.requests,
633
+ ...identity,
634
+ responseId: event.message.responseId,
635
+ inputTokens: reported.input ?? 0,
636
+ cacheReadTokens: reported.cacheRead ?? 0,
637
+ cacheWriteTokens: reported.cacheWrite ?? 0,
638
+ outputTokens: reported.output ?? 0,
639
+ ...(typeof reported.reasoning === 'number' ? { reasoningTokens: reported.reasoning } : {}),
640
+ ...(typeof cost === 'number' ? { costUsd: cost, costSource: 'harness' } : {}),
641
+ ...(requestStartedAt === null ? {} : { durationMs: Date.now() - requestStartedAt }),
642
+ stopReason: event.message.stopReason
643
+ }
644
+ });
645
+ requestStartedAt = null;
646
+ }
647
+ });
648
+ pi.on('session_before_compact', async (event, ctx) => {
649
+ if (!turnActive)
650
+ return;
651
+ await terminalCall('compaction.started', { reason: event.reason, ...(lastContextTokens === undefined ? {} : { contextTokens: lastContextTokens }), ...(ctx.model?.contextWindow ? { contextWindow: ctx.model.contextWindow } : {}) });
652
+ });
653
+ pi.on('session_compact', async (event) => {
654
+ if (!turnActive)
655
+ return;
656
+ sliceState.compactions += 1;
657
+ const summary = event.compactionEntry.summary;
658
+ const chars = Array.from(summary);
659
+ const marker = '\n…[truncated]';
660
+ const truncated = chars.length > 24_000;
661
+ await terminalCall('compaction.ended', { reason: event.reason, aborted: false, tokensBefore: event.compactionEntry.tokensBefore, willRetry: event.willRetry, ...(summary ? { summary: truncated ? `${chars.slice(0, 24_000 - Array.from(marker).length).join('')}${marker}` : summary, ...(truncated ? { summaryTruncated: true } : {}) } : {}) });
662
+ });
663
+ pi.on('session_compact_failed', async (event) => {
664
+ if (!turnActive)
665
+ return;
666
+ sliceState.compactions += 1;
667
+ await terminalCall('compaction.ended', { reason: event.reason, aborted: event.aborted, willRetry: event.willRetry, ...(event.errorMessage ? { error: event.errorMessage.slice(0, 1_000) } : {}) });
668
+ });
669
+ pi.on('turn_start', async () => {
670
+ requestStartedAt = Date.now();
671
+ });
672
+ pi.on('tool_call', async (event, ctx) => {
673
+ const refuse = async (code, reason) => {
674
+ await terminalCall('refusal', { toolCallId: event.toolCallId, name: event.toolName, code, reason: reason.slice(0, 2_000) }).catch(() => { });
675
+ return { block: true, reason };
676
+ };
677
+ if (planRun?.active && !planRun.allowedTools.has(event.toolName)) {
678
+ const reason = planRefusal(event.toolName, new Set(), event.input) ?? `Plan mode is research-only: ${event.toolName} is not available in this session.`;
679
+ return refuse('plan_mode', reason);
680
+ }
681
+ if (planRun?.active && event.toolName === SPAWN_SUBAGENT) {
682
+ try {
683
+ const eligibility = await controlCall('terminal.subagents.planSafe', { input: event.input });
684
+ if (!eligibility.allowed)
685
+ return refuse('plan_mode', eligibility.reason ?? 'This profile is not eligible for plan-mode research.');
686
+ }
687
+ catch (error) {
688
+ return refuse('controller_unavailable', `Plan-mode research eligibility could not be verified: ${error instanceof Error ? error.message : 'controller unavailable'}`);
689
+ }
690
+ }
691
+ else if (planRun?.active) {
692
+ const reason = planRefusal(event.toolName, new Set(PLAN_RESEARCH_TOOLS), event.input);
693
+ if (reason)
694
+ return refuse('plan_mode', reason);
695
+ }
696
+ let authorization;
697
+ if ((event.toolName === 'edit' || event.toolName === 'write') && typeof event.input.path === 'string') {
698
+ try {
699
+ if (!workspaceRoot)
700
+ throw new Error('The active project workspace is unavailable.');
701
+ const inspection = inspectWorkspaceWrite(workspaceRoot, ctx.cwd, event.toolName, event.input);
702
+ Object.assign(event.input, inspection.input);
703
+ if (!inspection.path)
704
+ throw new Error('The native file-write target could not be verified.');
705
+ authorization = {
706
+ workspaceRoot,
707
+ cwd: ctx.cwd,
708
+ path: inspection.path,
709
+ outside: inspection.outside,
710
+ authorized: false
711
+ };
712
+ }
713
+ catch (error) {
714
+ return refuse('workspace', error instanceof Error ? error.message : 'The active project workspace could not be verified.');
715
+ }
716
+ }
717
+ try {
718
+ const policy = await controlCall('terminal.policy', { tool: event.toolName, args: event.input });
719
+ if (policy.requiresApproval) {
720
+ const approval = await controlCall('terminal.approval', { requestId: event.toolCallId, tool: event.toolName, args: event.input });
721
+ if (approval.decision !== 'approved')
722
+ return refuse('approval_denied', 'The user denied this action. Do not repeat it or ask for permission in a message; choose another approach or report what is blocked.');
723
+ }
724
+ else if (!policy.allowed) {
725
+ return refuse('policy', policy.reason ?? 'Outside what this session may do.');
726
+ }
727
+ if (authorization) {
728
+ authorization.authorized = true;
729
+ writeAuthorizations.set(event.toolCallId, authorization);
730
+ }
731
+ }
732
+ catch (error) {
733
+ const detail = error instanceof Error ? error.message : String(error);
734
+ return refuse('controller_unavailable', `The terminal controller is unavailable: ${detail}`);
735
+ }
736
+ });
737
+ pi.on('tool_execution_start', async (event) => {
738
+ if (['edit', 'write'].includes(event.toolName) && typeof event.args.path === 'string')
739
+ fileTools.set(event.toolCallId, event.args.path);
740
+ toolStartedAt.set(event.toolCallId, Date.now());
741
+ toolsInFlight.set(event.toolCallId, { name: event.toolName, at: Date.now() });
742
+ await terminalCall('tool', { phase: 'start', id: event.toolCallId, name: event.toolName, summary: JSON.stringify(event.args).slice(0, 200) });
743
+ });
744
+ pi.on('tool_execution_end', async (event) => {
745
+ const started = toolStartedAt.get(event.toolCallId);
746
+ toolStartedAt.delete(event.toolCallId);
747
+ toolsInFlight.delete(event.toolCallId);
748
+ const resultChars = resultSize(event.result);
749
+ await terminalCall('tool', { phase: 'end', id: event.toolCallId, name: event.toolName, ok: !event.isError, ...(started === undefined ? {} : { durationMs: Date.now() - started }), ...(resultChars === null ? {} : { resultChars }) });
750
+ const path = fileTools.get(event.toolCallId);
751
+ fileTools.delete(event.toolCallId);
752
+ if (!event.isError && path)
753
+ await terminalCall('file', { path, change: 'modified' });
754
+ });
755
+ pi.on('agent_settled', async (event, ctx) => {
756
+ await Promise.all(pendingRefusals);
757
+ pendingRefusals = [];
758
+ if (heartbeat)
759
+ clearInterval(heartbeat);
760
+ heartbeat = null;
761
+ if (subagentParent && !event.aborted && !failure) {
762
+ try {
763
+ await controlCall('terminal.subagents.verify', { history: subagentHistory(ctx.sessionManager.getBranch()) }, 2_147_483_647);
764
+ }
765
+ catch (error) {
766
+ failure = error instanceof Error ? error.message : String(error);
767
+ }
768
+ }
769
+ subagentParent = false;
770
+ // A reply that stopped at its work-slice boundary is not a completed task: the record says so,
771
+ // so a host can offer the continuation instead of treating it as done (PROP-0041).
772
+ // An ordinary reply settles as it ends (ADR-0075); only a goal that was blocked, paused or hit
773
+ // a limit stops it for the person, and the checkpoint carries what is left.
774
+ const aborted = event.aborted || messageAborted;
775
+ const stop = !sliceState.endedBy && !failure && !aborted && !planRun?.active ? goalStopOutcome(lastTodo, goal?.get() ?? null) : null;
776
+ if (stop) {
777
+ await terminalCall('checkpoint', { summary: stopSummary(stop), ...handoffFields(lastTodo, goal?.get() ?? null), files: [], checks: [], decisions: [], slice: sliceState.slice, reason: stopCheckpointReason(stop) }).catch(() => undefined);
778
+ }
779
+ else if (sliceState.endedBy && !failure && !aborted) {
780
+ // The guard ended the reply and promised the model the harness would keep its state.
781
+ await terminalCall('checkpoint', { summary: `The reply stopped after ${sliceState.steps} steps at its work-slice boundary.`, ...handoffFields(lastTodo, goal?.get() ?? null), files: [], checks: [], decisions: [], slice: sliceState.slice, reason: sliceState.endedBy }).catch(() => undefined);
782
+ }
783
+ const reason = sliceState.endedBy ? 'slice_complete' : stop?.code;
784
+ const code = sliceState.endedBy === 'compaction-thrash' ? 'compaction_thrash' : sliceState.endedBy === 'budget' ? 'slice_budget' : stop?.code;
785
+ await terminalCall('settled', { error: failure, ...(failureCode ? { errorCode: failureCode } : {}), aborted, ...(reason ? { reason } : {}), ...(code ? { code } : {}) });
786
+ turnActive = false;
787
+ });
788
+ pi.on('user_bash', async () => {
789
+ throw new Error('Use the ! command composer so this action can be checked.');
790
+ });
791
+ pi.on('session_shutdown', async () => {
792
+ if (timer)
793
+ clearInterval(timer);
794
+ timer = null;
795
+ if (heartbeat)
796
+ clearInterval(heartbeat);
797
+ heartbeat = null;
798
+ context = null;
799
+ turnActive = false;
800
+ sessionState = null;
801
+ stateDelivered = false;
802
+ autoNameTried = false;
803
+ lastTodo = [];
804
+ // This clears the controller's readiness while the next native session binds. The
805
+ // process-level control claim survives replacement; only the session poller stops.
806
+ await terminalCall('shutdown').catch(() => { });
807
+ });
808
+ const naming = sessionNameTool(() => ({
809
+ get sessionName() { return pi.getSessionName(); },
810
+ setSessionName: name => pi.setSessionName(name)
811
+ }));
812
+ pi.registerTool({
813
+ name: naming.name, label: naming.label, description: naming.description,
814
+ parameters: Type.Unsafe(naming.parameters(Type)),
815
+ async execute(_id, input) {
816
+ const result = await naming.execute(input);
817
+ return { content: [{ type: 'text', text: typeof result === 'string' ? result : result.text }], details: undefined };
818
+ }
819
+ });
820
+ // The todo list is recorded on the harness run; the shared tool validates and the socket carries the event.
821
+ let recorded = Promise.resolve();
822
+ const todo = todoTool({ emit: (_type, payload) => { recorded = terminalCall('todo', payload); } });
823
+ pi.registerTool({
824
+ name: todo.name, label: todo.label, description: todo.description,
825
+ parameters: Type.Unsafe(todo.parameters(Type)),
826
+ async execute(_id, input) {
827
+ recorded = Promise.resolve();
828
+ const result = await todo.execute(input);
829
+ await recorded;
830
+ const items = input.items;
831
+ if (Array.isArray(items))
832
+ lastTodo = items;
833
+ return { content: [{ type: 'text', text: typeof result === 'string' ? result : result.text }], details: undefined };
834
+ }
835
+ });
836
+ const ask = askUserTool({ requestAnswers: questions => terminalCall('questions', { questions }, 1_230_000) });
837
+ pi.registerTool({
838
+ name: ask.name, label: ask.label, description: ask.description,
839
+ parameters: Type.Unsafe(ask.parameters(Type)),
840
+ async execute(_id, input) {
841
+ const result = await ask.execute(input);
842
+ return { content: [{ type: 'text', text: typeof result === 'string' ? result : result.text }], details: undefined };
843
+ }
844
+ });
845
+ // One question tool, as in every structured session: the terminal has no ask_user_question alias (PROP-0039).
846
+ await terminalCall('startup', { phase: 'Pi hooks registered' });
847
+ }