@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,771 @@
1
+ // The terminal frontend as a client of the harness (ADR-0083, phase 2). It runs no agent loop of its
2
+ // own: every turn is a `terminal.live.run` on the parent, which runs it as a live harness session.
3
+ // This process keeps what only draws: the model catalogue, the account's settings, the skills and
4
+ // prompts it lists, and a read of the conversation's history file. `session` is a mirror of the live
5
+ // Pi session, kept current from its native events, so the screen code is the same in both modes.
6
+ import { DefaultResourceLoader, ModelRuntime, resolveCliModel, SessionManager, SettingsManager } from '@earendil-works/pi-coding-agent';
7
+ import { appendFileSync, copyFileSync, existsSync, readdirSync, readFileSync, realpathSync } from 'node:fs';
8
+ import { basename, isAbsolute, join, resolve } from 'node:path';
9
+ import { claimTerminalControl, controlCall } from "../control.js";
10
+ import { SocketError } from "../client.js";
11
+ import { terminalCredentialStore } from "../credentialStore.js";
12
+ import { GoalController } from "../../sessions/goal.js";
13
+ import { GOAL_CUSTOM_TYPE } from "../../sessions/goal.js";
14
+ import { requiredSkillsText } from "../../prompt/compile.js";
15
+ import { bodyOf } from "../../core/frontmatter.js";
16
+ import { skillInvocations } from "./skillInvocation.js";
17
+ import { pluginCommandPrefix } from "../../plugins/commandPrefix.js";
18
+ import { clampLevel, supportedLevels } from "./thinkingLevels.js";
19
+ import { ModeChoices } from "./modeChoices.js";
20
+ import { assertTerminalHistoryPath, assertTerminalSessionScope, parseTerminalArguments } from "./runtime.js";
21
+ /**
22
+ * The terminal's runtime (ADR-0083): this client of the harness by default; `inprocess` runs the
23
+ * previous in-process Pi runtime, which keeps plugins' own terminal components.
24
+ */
25
+ export const HARNESS_RUNTIME_ENV = 'XINGULAR_TERMINAL_RUNTIME';
26
+ export const harnessRuntimeSelected = (env = process.env) => env[HARNESS_RUNTIME_ENV]?.trim().toLowerCase() !== 'inprocess';
27
+ const DEFAULT_TOOLS = ['read', 'bash', 'edit', 'write', 'grep', 'find', 'ls'];
28
+ /** The native session id a history file carries in its header. */
29
+ function headerId(path) {
30
+ try {
31
+ const header = JSON.parse(readFileSync(path, 'utf8').split('\n', 1)[0]);
32
+ return header.type === 'session' && typeof header.id === 'string' ? header.id : null;
33
+ }
34
+ catch {
35
+ return null;
36
+ }
37
+ }
38
+ function textOf(message) {
39
+ if (!message)
40
+ return '';
41
+ if (typeof message.content === 'string')
42
+ return message.content;
43
+ return Array.isArray(message.content) ? message.content.map((part) => part.type === 'text' ? part.text ?? '' : '').join('') : '';
44
+ }
45
+ /** `XINGULAR_CLIENT_TRACE=<file>`: timestamped client events, for diagnosing a slow window. */
46
+ function trace(text) {
47
+ const file = process.env.XINGULAR_CLIENT_TRACE;
48
+ if (!file)
49
+ return;
50
+ try {
51
+ appendFileSync(file, `${new Date().toISOString()} ${text}\n`);
52
+ }
53
+ catch {
54
+ // Diagnostics only.
55
+ }
56
+ }
57
+ export async function createHarnessTerminalRuntime(args, host) {
58
+ const prepared = parseTerminalArguments(args);
59
+ const cwd = realpathSync(process.cwd());
60
+ const agentDirValue = process.env.PI_CODING_AGENT_DIR;
61
+ if (!agentDirValue || !isAbsolute(agentDirValue))
62
+ throw new Error('The Harness terminal requires its isolated account directory.');
63
+ const agentDir = realpathSync(agentDirValue);
64
+ const sessionDirectory = realpathSync(resolve(cwd, prepared.sessionDir));
65
+ let sessionFile = prepared.session && existsSync(resolve(cwd, prepared.session)) ? resolve(cwd, prepared.session) : null;
66
+ if (sessionFile) {
67
+ assertTerminalHistoryPath(sessionFile, sessionDirectory);
68
+ assertTerminalSessionScope(sessionFile, cwd);
69
+ }
70
+ await claimTerminalControl();
71
+ const identity = await controlCall('accounts.session').catch(() => null);
72
+ const account = identity && typeof identity.accountId === 'string' && typeof identity.label === 'string'
73
+ ? Object.freeze({ accountId: identity.accountId, label: identity.label }) : null;
74
+ // The catalogue and credential checks only: this process makes no model request.
75
+ const modelRuntime = await ModelRuntime.create({ credentials: terminalCredentialStore(), modelsPath: join(agentDir, 'models.json') });
76
+ const settingsManager = SettingsManager.create(cwd, agentDir);
77
+ // Skills, prompts and themes to list and complete. Extensions run in the harness, never here.
78
+ const resourceLoader = new DefaultResourceLoader({
79
+ cwd, agentDir, settingsManager: SettingsManager.inMemory({}),
80
+ noExtensions: true, noSkills: true, noPromptTemplates: true, noThemes: true,
81
+ additionalSkillPaths: prepared.skills, additionalPromptTemplatePaths: prepared.prompts, additionalThemePaths: prepared.themes
82
+ });
83
+ await resourceLoader.reload();
84
+ const services = { cwd, agentDir, modelRuntime, settingsManager, resourceLoader, diagnostics: [] };
85
+ const choiceStore = {
86
+ read: () => controlCall('accounts.choices.get'),
87
+ write: (mode, patch) => controlCall('accounts.choices.set', { mode, ...patch })
88
+ };
89
+ const modeChoices = new ModeChoices(choiceStore);
90
+ await modeChoices.load();
91
+ let currentMode = 'normal';
92
+ let planActive = false;
93
+ const recordingMode = () => planActive ? 'plan' : currentMode;
94
+ const modelFor = (reference) => resolveCliModel({ cliModel: reference, modelRuntime }).model;
95
+ /** A model this account can use: offered by its catalogue and holding credentials. Never a request. */
96
+ const usableModel = async (reference) => {
97
+ const found = modelFor(reference);
98
+ return found && await modelRuntime.checkAuth(found.provider) ? found : undefined;
99
+ };
100
+ const goal = new GoalController();
101
+ const listeners = new Set();
102
+ const changes = new Set();
103
+ const beforeChanges = new Set();
104
+ let disposed = false;
105
+ let seq = 0;
106
+ let live = { seq: 0, activeRunId: null, live: null, session: null };
107
+ let manager = null;
108
+ let messages = [];
109
+ const state = { messages, pendingToolCalls: new Set() };
110
+ let streaming = false;
111
+ /** A mode switch made during a reply: the next reply starts on the new mode's choice. */
112
+ let pendingApply = false;
113
+ let fresh = !sessionFile;
114
+ const steering = [];
115
+ const followUps = [];
116
+ const pendingNotes = [];
117
+ let model;
118
+ let thinkingLevel = 'medium';
119
+ let sessionName;
120
+ const idleWaiters = new Set();
121
+ /** Reads the history file again: after a reply, a compaction, or a switch. */
122
+ const reloadHistory = () => {
123
+ manager = sessionFile ? SessionManager.open(sessionFile, sessionDirectory) : null;
124
+ messages = manager ? manager.buildSessionContext().messages : [];
125
+ state.messages = messages;
126
+ sessionName = manager?.getSessionName() ?? sessionName;
127
+ };
128
+ reloadHistory();
129
+ // The model: an explicit launch model, then this conversation's own, then the account's latest choice.
130
+ const startChoice = modeChoices.resolve('normal');
131
+ const recorded = () => {
132
+ const context = manager?.buildSessionContext();
133
+ return context?.model ? `${context.model.provider}/${context.model.modelId}` : undefined;
134
+ };
135
+ // The level Pi resolves when no mode has saved an effort: the model's own default, then the account's.
136
+ const defaultEffort = () => ((model ? settingsManager.getModelThinkingLevel(model.provider, model.id) : undefined) ?? settingsManager.getDefaultThinkingLevel() ?? 'medium');
137
+ const initial = prepared.model ?? recorded() ?? startChoice.model;
138
+ if (initial)
139
+ model = modelFor(initial);
140
+ thinkingLevel = (startChoice.effort ?? defaultEffort());
141
+ // A conversation written on another account (a switch resumes it) can name a model this account
142
+ // cannot use. The account's own newest choice decides then; an explicit launch model is the host's.
143
+ const stale = prepared.model ? undefined : recorded();
144
+ let recovered = null;
145
+ if (stale && !(await usableModel(stale).then(Boolean, () => true))) {
146
+ const asSession = { get model() { return model; }, setModel: async (next) => { model = next; }, setThinkingLevel: (level) => { thinkingLevel = level; } };
147
+ const applied = await modeChoices.useFallback(asSession, 'normal', usableModel, defaultEffort()).catch(() => null);
148
+ if (applied)
149
+ recovered = { recorded: stale, ...applied };
150
+ // Nothing on this account is usable: name no model, so the harness picks one rather than the old account's.
151
+ else
152
+ model = undefined;
153
+ }
154
+ const reference = () => model ? `${model.provider}/${model.id}` : null;
155
+ const lastAssistant = () => [...messages].reverse().find((message) => message.role === 'assistant');
156
+ const emit = (event) => {
157
+ for (const listener of listeners)
158
+ listener(event);
159
+ host.changed();
160
+ };
161
+ const dialogs = new Map();
162
+ const showDialog = async (request) => {
163
+ if (dialogs.has(request.requestId))
164
+ return;
165
+ const done = new AbortController();
166
+ dialogs.set(request.requestId, done);
167
+ const { dialog } = request;
168
+ try {
169
+ const options = { signal: done.signal };
170
+ let answer;
171
+ if (dialog.kind === 'select') {
172
+ const chosen = await host.ui.select(dialog.title, dialog.options ?? [], options);
173
+ answer = { selected: chosen === undefined ? [] : [chosen] };
174
+ }
175
+ else if (dialog.kind === 'confirm') {
176
+ answer = { selected: [(await host.ui.confirm(dialog.title, dialog.message ?? '', options)) ? 'Yes' : 'No'] };
177
+ }
178
+ else {
179
+ const text = dialog.kind === 'input' ? await host.ui.input(dialog.title, dialog.placeholder, options) : await host.ui.editor(dialog.title, dialog.prefill);
180
+ answer = text === undefined ? { selected: [] } : { selected: [], text };
181
+ }
182
+ // Answered elsewhere first (another window or a phone): the first answer stands.
183
+ if (done.signal.aborted)
184
+ return;
185
+ await controlCall('terminal.live.answer', { requestId: request.requestId, answer }).catch(() => undefined);
186
+ }
187
+ finally {
188
+ dialogs.delete(request.requestId);
189
+ }
190
+ };
191
+ /** Applies one native event of the live session to the mirror, as Pi applies it to its own state. */
192
+ const apply = (event) => {
193
+ // A harness run names its initial Bash `<run>:initial-bash`; the window draws `initial-bash:<run>`.
194
+ const bash = event;
195
+ if (bash.type === 'bash_execution_update' && bash.id?.endsWith(':initial-bash'))
196
+ event = { ...event, id: `initial-bash:${bash.id.slice(0, -':initial-bash'.length)}` };
197
+ const loose = event;
198
+ switch (loose.type) {
199
+ case 'agent_start':
200
+ streaming = true;
201
+ break;
202
+ case 'message_update':
203
+ if (loose.message?.role === 'assistant')
204
+ state.streamingMessage = loose.message;
205
+ break;
206
+ case 'message_end':
207
+ if (loose.message) {
208
+ if (state.streamingMessage && loose.message.role === 'assistant')
209
+ state.streamingMessage = undefined;
210
+ messages.push(loose.message);
211
+ if (loose.message.role === 'user' && steering.length)
212
+ steering.shift();
213
+ }
214
+ break;
215
+ case 'tool_execution_start':
216
+ if (loose.toolCallId)
217
+ state.pendingToolCalls.add(loose.toolCallId);
218
+ break;
219
+ case 'tool_execution_end':
220
+ if (loose.toolCallId)
221
+ state.pendingToolCalls.delete(loose.toolCallId);
222
+ break;
223
+ case 'compaction_end':
224
+ reloadHistory();
225
+ break;
226
+ case 'harness_settled': {
227
+ const settled = event;
228
+ // The harness ran the goal: its rounds, time and status are the ones to show.
229
+ if (settled.goalMode)
230
+ goal.restore(settled.goalMode);
231
+ // A new conversation's first reply made its file: this window resumes it from now on.
232
+ if (!sessionFile && settled.sessionFile) {
233
+ sessionFile = settled.sessionFile;
234
+ fresh = false;
235
+ reloadHistory();
236
+ }
237
+ // Pi's own settle came first, or never will: settle the mirror as Pi would have.
238
+ if (streaming)
239
+ apply({ type: 'agent_settled', aborted: settled.status === 'interrupted' });
240
+ host.changed();
241
+ return;
242
+ }
243
+ case 'harness_dialog': {
244
+ void showDialog(event.request);
245
+ return;
246
+ }
247
+ case 'harness_dialog_done': {
248
+ dialogs.get(event.requestId)?.abort();
249
+ return;
250
+ }
251
+ case 'harness_notice': {
252
+ // A plugin's notice, status line or widget, drawn by this window as an in-process plugin's would be.
253
+ const notice = event.notice;
254
+ if (notice.kind === 'notify' || notice.kind === 'error')
255
+ host.ui.notify(notice.text, notice.kind === 'error' ? 'error' : notice.level ?? 'info');
256
+ else if (notice.kind === 'status' && notice.key)
257
+ host.ui.setStatus(notice.key, notice.text || undefined);
258
+ else if (notice.kind === 'widget' && notice.key)
259
+ host.ui.setWidget(notice.key, notice.text ? notice.text.split('\n') : undefined);
260
+ else if (notice.kind === 'title')
261
+ host.ui.setTitle(notice.text);
262
+ host.changed();
263
+ return;
264
+ }
265
+ case 'agent_settled': {
266
+ streaming = false;
267
+ if (pendingApply) {
268
+ pendingApply = false;
269
+ void modeChoices.apply(session, currentMode, modelFor, defaultEffort()).then(() => host.changed());
270
+ }
271
+ state.streamingMessage = undefined;
272
+ state.pendingToolCalls.clear();
273
+ steering.length = 0;
274
+ // The file is the record: it carries what the live session wrote, compaction included. A
275
+ // new conversation learns its file from the next state read.
276
+ if (sessionFile)
277
+ reloadHistory();
278
+ for (const wake of idleWaiters)
279
+ wake();
280
+ idleWaiters.clear();
281
+ break;
282
+ }
283
+ }
284
+ emit(event);
285
+ };
286
+ // Bumped when the window switches conversation, so a state read that started before it is ignored.
287
+ let generation = 0;
288
+ const refreshState = async () => {
289
+ const asked = generation;
290
+ const read = await controlCall('terminal.live.state');
291
+ if (asked !== generation)
292
+ return;
293
+ live = read;
294
+ if (live.live?.sessionFile && !sessionFile && !streaming) {
295
+ sessionFile = live.live.sessionFile;
296
+ fresh = false;
297
+ reloadHistory();
298
+ host.changed();
299
+ }
300
+ if (live.session?.sessionName)
301
+ sessionName = live.session.sessionName;
302
+ followUps.splice(0, followUps.length, ...(live.live?.followUps ?? []));
303
+ };
304
+ await refreshState();
305
+ seq = live.seq;
306
+ // Reattached while its reply kept running (ADR-0083): show it as running until it settles.
307
+ if (live.activeRunId)
308
+ streaming = true;
309
+ // Native events of the live session, read as they come. A gap means events were dropped: the mirror reads the file again.
310
+ // Closing the window cancels the read that is waiting, so nothing keeps this process alive.
311
+ const stopReading = new AbortController();
312
+ let unreachable = 0;
313
+ const pump = async () => {
314
+ while (!disposed) {
315
+ try {
316
+ const read = await controlCall('terminal.live.events', { after: seq }, 30_000, stopReading.signal);
317
+ if (disposed)
318
+ return;
319
+ if (read.reset) {
320
+ reloadHistory();
321
+ host.changed();
322
+ }
323
+ if (read.events.length)
324
+ trace(`events ${read.events.length} last=${read.events.at(-1).event.type}`);
325
+ for (const entry of read.events) {
326
+ seq = entry.seq;
327
+ apply(entry.event);
328
+ }
329
+ unreachable = 0;
330
+ if (!read.events.length)
331
+ seq = Math.max(seq, read.seq);
332
+ if (read.events.some((entry) => entry.event.type === 'agent_settled' || entry.event.type === 'agent_start'))
333
+ await refreshState().catch(() => undefined);
334
+ }
335
+ catch (error) {
336
+ if (disposed)
337
+ return;
338
+ // The harness that ran this window is gone (it stopped or crashed): close cleanly.
339
+ if (error instanceof SocketError && error.code === 'unavailable' && ++unreachable >= 2) {
340
+ host.notify('The harness for this window stopped; closing.');
341
+ host.shutdown();
342
+ return;
343
+ }
344
+ if (unreachable === 0)
345
+ host.notify(`The harness session stream stopped: ${error instanceof Error ? error.message : String(error)}`);
346
+ await new Promise((wait) => setTimeout(wait, 1000));
347
+ }
348
+ }
349
+ };
350
+ const requiredSkills = (text) => {
351
+ if (/^\s*!/u.test(text) || settingsManager.getEnableSkillCommands?.() === false)
352
+ return [];
353
+ const skills = resourceLoader.getSkills().skills;
354
+ const names = skillInvocations(text, new Set(skills.map((skill) => skill.name)));
355
+ if (!names.length)
356
+ return [];
357
+ const entries = names.map((name) => {
358
+ const skill = skills.find((candidate) => candidate.name === name);
359
+ try {
360
+ return { name, path: skill.filePath, baseDir: skill.baseDir, body: bodyOf(readFileSync(skill.filePath, 'utf8')) };
361
+ }
362
+ catch {
363
+ return { name, path: skill.filePath, body: '' };
364
+ }
365
+ });
366
+ const content = requiredSkillsText(entries);
367
+ return content ? [{ customType: 'xingular-required-skills', content }] : [];
368
+ };
369
+ const startRun = async (text, options = {}) => {
370
+ if (disposed)
371
+ throw new Error('The terminal runtime has closed.');
372
+ const mode = options.mode ?? (options.plan ? 'plan' : currentMode);
373
+ // A mode with no saved model or effort keeps the conversation's current one, as the in-process runtime does.
374
+ const saved = mode === currentMode ? {} : modeChoices.resolve(mode);
375
+ const choice = { model: (saved.model && modelFor(saved.model) ? saved.model : undefined) ?? reference() ?? undefined, effort: saved.effort ?? thinkingLevel };
376
+ const notes = [...pendingNotes.splice(0), ...requiredSkills(text)];
377
+ const bash = /^!\s*([\s\S]+)$/u.exec(text.trimStart())?.[1];
378
+ trace(`run asked ${JSON.stringify(text.slice(0, 40))}`);
379
+ streaming = true;
380
+ host.changed();
381
+ try {
382
+ await controlCall('terminal.live.run', {
383
+ text,
384
+ ...(choice.model ? { model: choice.model } : {}),
385
+ ...(choice.effort ? { effort: choice.effort } : {}),
386
+ ...(sessionFile ? { resume: { sessionFile, nativeSessionId: headerId(sessionFile) } } : { newHistory: fresh }),
387
+ ...(options.images?.length ? { images: options.images.map((image) => ({ mediaType: image.mimeType, data: image.data })) } : {}),
388
+ ...(options.plan ? { plan: true } : {}),
389
+ ...(options.command ? { command: options.command } : {}),
390
+ ...(options.goal ? { goal: options.goal } : {}),
391
+ ...(bash && !options.plan ? { initialBashCommand: bash } : {}),
392
+ ...(notes.length ? { hiddenNotes: notes } : {})
393
+ }, 60_000);
394
+ }
395
+ catch (error) {
396
+ streaming = false;
397
+ host.changed();
398
+ throw error;
399
+ }
400
+ };
401
+ const setModel = async (next, options = {}) => {
402
+ model = next;
403
+ // As Pi does: the new model runs at the nearest level it supports.
404
+ thinkingLevel = clampLevel(next, thinkingLevel);
405
+ if (options.persist !== false)
406
+ await modeChoices.record(recordingMode(), { model: `${next.provider}/${next.id}` });
407
+ host.changed();
408
+ };
409
+ const setThinkingLevel = (level, options = {}) => {
410
+ thinkingLevel = clampLevel(model, level);
411
+ if (options.persist !== false)
412
+ void modeChoices.record(recordingMode(), { effort: thinkingLevel });
413
+ host.changed();
414
+ };
415
+ const availableLevels = () => supportedLevels(model);
416
+ const commandsNow = () => live.session?.commands ?? live.commands ?? [];
417
+ const extensionRunner = {
418
+ getRegisteredCommands: () => commandsNow().map((command) => ({ ...command, sourceInfo: command.sourceInfo ?? { path: '', source: 'harness' } })),
419
+ getCommand: (name) => {
420
+ const command = commandsNow().find((entry) => entry.invocationName === name || entry.name === name);
421
+ if (!command)
422
+ return undefined;
423
+ // The harness's router takes a plugin command only by its owner-qualified route (ADR-0061).
424
+ const route = `${pluginCommandPrefix((command.sourceInfo ?? { path: '' }))}:${command.invocationName}`;
425
+ return { ...command, handler: async (argument) => { await startRun(`/${route}${argument ? ` ${argument}` : ''}`); } };
426
+ },
427
+ createCommandContext: () => ({}),
428
+ createContext: () => ({}),
429
+ createToolContext: () => ({}),
430
+ getShortcuts: () => new Map(),
431
+ getExtensionPaths: () => [],
432
+ setUIContext: () => undefined,
433
+ emitToolCall: async () => undefined
434
+ };
435
+ const session = {
436
+ get sessionId() { return live.session?.sessionId ?? (sessionFile ? headerId(sessionFile) ?? '' : ''); },
437
+ get sessionFile() { return sessionFile ?? undefined; },
438
+ get sessionName() { return sessionName; },
439
+ setSessionName: (name) => {
440
+ sessionName = name;
441
+ void controlCall('terminal.live.rename', { name, ...(sessionFile ? { sessionFile } : {}) }).catch((error) => host.notify(error instanceof Error ? error.message : String(error)));
442
+ host.changed();
443
+ },
444
+ get messages() { return messages; },
445
+ get state() { return state; },
446
+ get model() { return model; },
447
+ get thinkingLevel() { return thinkingLevel; },
448
+ get isStreaming() { return streaming; },
449
+ get isIdle() { return !streaming; },
450
+ get systemPrompt() { return live.session?.systemPrompt ?? ''; },
451
+ get settingsManager() { return settingsManager; },
452
+ get resourceLoader() { return resourceLoader; },
453
+ get modelRuntime() { return modelRuntime; },
454
+ get sessionManager() { return manager ?? SessionManager.inMemory(cwd); },
455
+ get extensionRunner() { return extensionRunner; },
456
+ get scopedModels() { return []; },
457
+ get steeringMode() { return 'one-at-a-time'; },
458
+ get followUpMode() { return 'one-at-a-time'; },
459
+ get autoCompactionEnabled() { return settingsManager.getCompactionSettings().enabled; },
460
+ get autoRetryEnabled() { return true; },
461
+ setSteeringMode: () => undefined,
462
+ setFollowUpMode: () => undefined,
463
+ setAutoCompactionEnabled: (enabled) => settingsManager.setCompactionEnabled?.(enabled),
464
+ setAutoRetryEnabled: () => undefined,
465
+ supportsThinking: () => !!model?.reasoning,
466
+ getAvailableThinkingLevels: availableLevels,
467
+ cycleThinkingLevel: () => {
468
+ const levels = availableLevels();
469
+ const next = levels[(levels.indexOf(thinkingLevel) + 1) % levels.length];
470
+ setThinkingLevel(next);
471
+ return next;
472
+ },
473
+ cycleModel: async () => undefined,
474
+ setModel,
475
+ setThinkingLevel,
476
+ getActiveToolNames: () => live.session?.activeTools.length ? [...live.session.activeTools] : DEFAULT_TOOLS,
477
+ getAllTools: () => live.session?.tools.length ? live.session.tools : DEFAULT_TOOLS.map((name) => ({ name, description: '' })),
478
+ setActiveToolsByName: () => undefined,
479
+ getToolDefinition: () => undefined,
480
+ getSteeringMessages: () => [...steering],
481
+ getFollowUpMessages: () => [...followUps],
482
+ clearQueue: () => {
483
+ const removed = { steering: [...steering], followUp: [...followUps] };
484
+ steering.length = 0;
485
+ followUps.length = 0;
486
+ void controlCall('terminal.live.followUp.clear').catch(() => undefined);
487
+ host.changed();
488
+ return removed;
489
+ },
490
+ getContextUsage: () => {
491
+ const usage = lastAssistant()?.usage;
492
+ const window = model?.contextWindow ?? 0;
493
+ const tokens = usage ? (usage.totalTokens ?? (usage.input ?? 0) + (usage.output ?? 0) + (usage.cacheRead ?? 0) + (usage.cacheWrite ?? 0)) : null;
494
+ return { tokens, contextWindow: window, percent: tokens !== null && window ? tokens / window * 100 : null };
495
+ },
496
+ getSessionStats: () => {
497
+ const assistant = messages.filter((message) => message.role === 'assistant');
498
+ const sum = (key) => assistant.reduce((total, message) => total + (message.usage?.[key] ?? 0), 0);
499
+ return {
500
+ sessionFile: sessionFile ?? undefined, sessionId: session.sessionId,
501
+ userMessages: messages.filter((message) => message.role === 'user').length, assistantMessages: assistant.length,
502
+ toolCalls: 0, toolResults: messages.filter((message) => message.role === 'toolResult').length, totalMessages: messages.length,
503
+ tokens: { input: sum('input'), output: sum('output'), cacheRead: sum('cacheRead'), cacheWrite: sum('cacheWrite'), total: sum('input') + sum('output') + sum('cacheRead') + sum('cacheWrite') },
504
+ cost: assistant.reduce((total, message) => total + (message.usage?.cost?.total ?? 0), 0)
505
+ };
506
+ },
507
+ getLastAssistantText: () => textOf(lastAssistant()) || undefined,
508
+ getUserMessagesForForking: () => (manager?.getEntries() ?? []).filter((entry) => entry.type === 'message' && entry.message?.role === 'user')
509
+ .map((entry) => ({ entryId: entry.id, text: textOf(entry.message) })),
510
+ subscribe: (listener) => { listeners.add(listener); return () => { listeners.delete(listener); }; },
511
+ prompt: async (text, options = {}) => {
512
+ await runtime.submit(text, options.streamingBehavior === 'followUp', options.images);
513
+ },
514
+ sendCustomMessage: async (message, options = {}) => {
515
+ if (options.deliverAs === 'steer' && streaming) {
516
+ await controlCall('terminal.live.steer', { text: message.content });
517
+ return;
518
+ }
519
+ if (options.triggerTurn && message.customType === GOAL_CUSTOM_TYPE) {
520
+ const current = goal.get();
521
+ if (current)
522
+ await startRun(current.objective, { goal: { objective: current.objective, rounds: current.limits.rounds, hours: current.limits.hours } });
523
+ return;
524
+ }
525
+ pendingNotes.push({ customType: message.customType.replace(/[^a-z0-9-]/g, '-').toLowerCase(), content: message.content });
526
+ },
527
+ abort: async () => { await runtime.interrupt(); },
528
+ abortBash: () => undefined,
529
+ waitForIdle: async () => {
530
+ if (!streaming)
531
+ return;
532
+ await new Promise((wake) => idleWaiters.add(wake));
533
+ },
534
+ compact: async (instructions) => {
535
+ if (!sessionFile)
536
+ throw new Error('There is no saved conversation to compact yet.');
537
+ await startRun('/compact', { command: { name: 'compact', ...(instructions ? { instructions } : {}) } });
538
+ },
539
+ navigateTree: async (targetId, options = {}) => {
540
+ if (!sessionFile)
541
+ return { cancelled: true };
542
+ const entry = manager?.getEntries().find((candidate) => candidate.id === targetId);
543
+ await startRun('/tree', { command: { name: 'navigate', entryId: targetId, summarize: !!options.summarize, ...(options.customInstructions ? { instructions: options.customInstructions } : {}) } });
544
+ await session.waitForIdle();
545
+ return { cancelled: false, ...(entry?.message?.role === 'user' ? { editorText: textOf(entry.message) } : {}) };
546
+ },
547
+ exportToHtml: async (path) => {
548
+ const target = path ? resolve(cwd, path) : join(cwd, `${basename(sessionFile ?? 'session', '.jsonl')}.html`);
549
+ await startRun('/export', { command: { name: 'export', path: target } });
550
+ return target;
551
+ },
552
+ exportToJsonl: async (path) => {
553
+ if (!sessionFile)
554
+ throw new Error('There is no saved conversation to export yet.');
555
+ copyFileSync(sessionFile, resolve(cwd, path));
556
+ return resolve(cwd, path);
557
+ },
558
+ bindExtensions: async () => undefined,
559
+ reload: async () => undefined,
560
+ dispose: () => undefined
561
+ };
562
+ /**
563
+ * Whether a reply really runs. The window learns that a reply ended from the event stream, a moment
564
+ * after the harness knows; when the harness has no running reply, wait for the window to catch up.
565
+ */
566
+ const replying = async () => {
567
+ if (!streaming)
568
+ return false;
569
+ await refreshState().catch(() => undefined);
570
+ if (live.activeRunId)
571
+ return true;
572
+ await Promise.race([
573
+ new Promise((wake) => idleWaiters.add(wake)),
574
+ new Promise((wait) => setTimeout(wait, 2000))
575
+ ]);
576
+ // The harness has nothing running: whatever the stream still owes, the reply is over.
577
+ if (streaming)
578
+ apply({ type: 'agent_settled', aborted: false });
579
+ return false;
580
+ };
581
+ const announce = async () => {
582
+ for (const listener of changes)
583
+ await listener(session);
584
+ host.changed();
585
+ };
586
+ const replace = async (file) => {
587
+ if (await replying())
588
+ throw new Error('Stop the current response before changing or reloading this session.');
589
+ for (const listener of beforeChanges)
590
+ listener();
591
+ // The live session holds the old conversation; the next run opens the new one.
592
+ generation += 1;
593
+ await controlCall('terminal.live.close', { forget: true }).catch(() => undefined);
594
+ live = { ...live, live: null, session: null };
595
+ sessionFile = file;
596
+ fresh = !file;
597
+ sessionName = undefined;
598
+ reloadHistory();
599
+ await announce();
600
+ };
601
+ const runtime = {
602
+ async pending() {
603
+ if (disposed)
604
+ return [];
605
+ return (await controlCall('terminal.live.pending')).requests;
606
+ },
607
+ approve: async (requestId, decision, alwaysAllowTool = false) => { await controlCall('terminal.live.approve', { requestId, decision, alwaysAllow: alwaysAllowTool }); },
608
+ permissions: async () => disposed ? { full: false, globalTools: [] } : controlCall('terminal.permissions.get'),
609
+ setFullPermission: async (enabled) => { await controlCall('terminal.permissions.setFull', { enabled }); },
610
+ setGlobalTool: async (tool, allowed) => { await controlCall('terminal.permissions.setTool', { tool, allowed }); },
611
+ answer: async (requestId, answer) => { await controlCall('terminal.live.answer', { requestId, answer }); },
612
+ answerBatch: async (batchId, answers) => { await controlCall('terminal.live.answers', { batchId, answers }); },
613
+ snapshot() {
614
+ const usage = session.getContextUsage();
615
+ return Object.freeze({
616
+ sessionId: session.sessionId, sessionFile: sessionFile ?? undefined, name: sessionName, cwd, account,
617
+ model: model ? Object.freeze({ id: model.id, provider: model.provider, name: model.name, reasoning: model.reasoning, contextWindow: model.contextWindow }) : undefined,
618
+ thinkingLevel, isStreaming: streaming, idle: !streaming,
619
+ hasUserMessages: messages.some((message) => message.role === 'user'),
620
+ hideThinking: settingsManager.getHideThinkingBlock(),
621
+ context: Object.freeze({ percent: usage.percent, window: usage.contextWindow }),
622
+ costUsd: session.getSessionStats().cost,
623
+ subscription: model ? modelRuntime.isUsingSubscription(model.provider) : false,
624
+ queue: Object.freeze({ steering: Object.freeze([...steering]), followUp: Object.freeze([...followUps]) })
625
+ });
626
+ },
627
+ async submit(text, followUp = false, images) {
628
+ if (disposed)
629
+ throw new Error('The terminal runtime has closed.');
630
+ const input = text.trimStart().startsWith('/') ? text.trimStart() : text;
631
+ if (await replying()) {
632
+ if (followUp) {
633
+ const result = await controlCall('terminal.live.followUp', { text: input });
634
+ if (result.queued)
635
+ followUps.push(input);
636
+ }
637
+ else {
638
+ steering.push(input);
639
+ await controlCall('terminal.live.steer', { text: input }).catch((error) => {
640
+ steering.splice(steering.indexOf(input), 1);
641
+ throw error;
642
+ });
643
+ }
644
+ host.changed();
645
+ return;
646
+ }
647
+ await startRun(input, { images });
648
+ },
649
+ async submitPlan(text, images) {
650
+ if (!text.trim())
651
+ throw new Error('Use /plan <plan brief>.');
652
+ if (await replying())
653
+ throw new Error('A plan request must wait until the current response settles.');
654
+ // A one-shot plan from the normal composer: the window shows and runs the plan's choice, then returns.
655
+ const previous = { model, effort: thinkingLevel };
656
+ const oneShot = currentMode !== 'plan';
657
+ if (oneShot)
658
+ await modeChoices.apply(session, 'plan', modelFor, defaultEffort());
659
+ planActive = true;
660
+ try {
661
+ await startRun(text, { images, plan: true, mode: 'plan' });
662
+ await session.waitForIdle();
663
+ }
664
+ finally {
665
+ planActive = false;
666
+ if (oneShot && !disposed) {
667
+ model = previous.model;
668
+ thinkingLevel = previous.effort;
669
+ if (pendingApply) {
670
+ pendingApply = false;
671
+ await modeChoices.apply(session, currentMode, modelFor, defaultEffort());
672
+ }
673
+ host.changed();
674
+ }
675
+ }
676
+ },
677
+ async setMode(mode) {
678
+ currentMode = mode;
679
+ // A switch during a reply waits for it to settle, so the reply keeps the model it started with.
680
+ if (streaming) {
681
+ pendingApply = true;
682
+ return;
683
+ }
684
+ await modeChoices.apply(session, mode, modelFor, defaultEffort());
685
+ host.changed();
686
+ },
687
+ get session() { return session; },
688
+ get services() { return services; },
689
+ cwd, sessionDirectory,
690
+ subscribe(listener) { listeners.add(listener); return () => { listeners.delete(listener); }; },
691
+ onSessionChange(listener) { changes.add(listener); return () => { changes.delete(listener); }; },
692
+ onBeforeSessionChange(listener) { beforeChanges.add(listener); return () => { beforeChanges.delete(listener); }; },
693
+ newSession: (async () => {
694
+ await modeChoices.load();
695
+ await replace(null);
696
+ return { cancelled: false };
697
+ }),
698
+ switchSession: (async (path, options) => {
699
+ // A conversation by its file, or by the session id its runs record.
700
+ const named = resolve(cwd, path);
701
+ const byId = () => readdirSync(sessionDirectory).filter((name) => name.endsWith('.jsonl')).map((name) => join(sessionDirectory, name)).find((file) => headerId(file) === path);
702
+ const target = existsSync(named) ? named : byId() ?? named;
703
+ assertTerminalHistoryPath(target, sessionDirectory);
704
+ assertTerminalSessionScope(target, cwd, options?.cwdOverride);
705
+ await replace(target);
706
+ return { cancelled: false };
707
+ }),
708
+ fork: (async (entryId) => {
709
+ if (!sessionFile)
710
+ throw new Error('There is no saved conversation to fork yet.');
711
+ // A fork writes a new file from the saved one; the live session's own file is not touched.
712
+ const source = SessionManager.open(sessionFile, sessionDirectory);
713
+ const entry = source.getEntries().find((candidate) => candidate.id === entryId);
714
+ const leaf = entry?.message?.role === 'user' ? entry.parentId ?? null : entryId;
715
+ const forked = leaf ? source.createBranchedSession(leaf) : undefined;
716
+ if (!forked)
717
+ throw new Error('This conversation could not be forked at that message.');
718
+ await replace(forked);
719
+ return { cancelled: false, ...(entry?.message?.role === 'user' ? { selectedText: textOf(entry.message) } : {}) };
720
+ }),
721
+ navigateTree: ((targetId, options) => session.navigateTree(targetId, options)),
722
+ importFromJsonl: (async (path, cwdOverride) => {
723
+ const target = resolve(cwd, path);
724
+ assertTerminalSessionScope(target, cwd, cwdOverride);
725
+ const copy = join(sessionDirectory, basename(target));
726
+ if (!existsSync(copy))
727
+ copyFileSync(target, copy);
728
+ await replace(copy);
729
+ return { cancelled: false };
730
+ }),
731
+ installationDeviceId: () => controlCall('accounts.deviceId'),
732
+ reload: async () => {
733
+ if (await replying())
734
+ throw new Error('Stop the current response before changing or reloading this session.');
735
+ await controlCall('terminal.resources', {}, 30_000);
736
+ // The next run opens a fresh live session that loads plugins again.
737
+ await controlCall('terminal.live.close', { reload: true }).catch(() => undefined);
738
+ await refreshState().catch(() => undefined);
739
+ await resourceLoader.reload();
740
+ await announce();
741
+ },
742
+ goal,
743
+ async interrupt() {
744
+ if (goal.active() && streaming)
745
+ goal.pause();
746
+ trace(`interrupt asked streaming=${streaming}`);
747
+ await controlCall('terminal.live.interrupt', {}, 15_000).then((result) => trace(`interrupt answered ${JSON.stringify(result)}`)).catch((error) => trace(`interrupt failed ${String(error)}`));
748
+ },
749
+ async dispose() {
750
+ if (disposed)
751
+ return;
752
+ disposed = true;
753
+ stopReading.abort();
754
+ // The reply belongs to the harness: the parent ends it, or keeps it running for a reattach.
755
+ for (const wake of idleWaiters)
756
+ wake();
757
+ for (const dialog of dialogs.values())
758
+ dialog.abort();
759
+ listeners.clear();
760
+ changes.clear();
761
+ beforeChanges.clear();
762
+ }
763
+ };
764
+ void pump();
765
+ await announce();
766
+ if (recovered) {
767
+ const effort = recovered.effort ? ` at ${recovered.effort} effort` : '';
768
+ host.notify(`This account cannot use ${recovered.recorded}. Started on ${recovered.reference}${effort}, your latest choice on this account.`);
769
+ }
770
+ return runtime;
771
+ }