@xingular/harness 0.1.7 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (819) hide show
  1. package/CHANGELOG.md +125 -1
  2. package/LICENSE +202 -0
  3. package/NOTICE.md +22 -0
  4. package/README.md +239 -86
  5. package/THIRD_PARTY_LICENSES.md +942 -0
  6. package/dist/cli.js +17853 -13114
  7. package/dist/sdk/accounts/accounts.d.ts +165 -0
  8. package/dist/sdk/accounts/accounts.js +730 -0
  9. package/dist/sdk/accounts/choices.d.ts +23 -0
  10. package/dist/sdk/accounts/choices.js +62 -0
  11. package/dist/sdk/accounts/env.d.ts +78 -0
  12. package/dist/sdk/accounts/env.js +294 -0
  13. package/dist/sdk/accounts/secrets.d.ts +16 -0
  14. package/dist/sdk/accounts/secrets.js +40 -0
  15. package/dist/sdk/accounts/store.d.ts +114 -0
  16. package/dist/sdk/accounts/store.js +255 -0
  17. package/dist/sdk/agents/builtin.d.ts +2 -0
  18. package/dist/sdk/agents/builtin.js +34 -0
  19. package/dist/sdk/agents/narrow.d.ts +13 -0
  20. package/dist/sdk/agents/narrow.js +29 -0
  21. package/dist/sdk/agents/profiles.d.ts +80 -0
  22. package/dist/sdk/agents/profiles.js +221 -0
  23. package/dist/sdk/annotations/bridge.d.ts +42 -0
  24. package/dist/sdk/annotations/bridge.js +264 -0
  25. package/dist/sdk/annotations/capture.d.ts +116 -0
  26. package/dist/sdk/annotations/capture.js +308 -0
  27. package/dist/sdk/annotations/delivery.d.ts +72 -0
  28. package/dist/sdk/annotations/delivery.js +130 -0
  29. package/dist/sdk/annotations/inspect.d.ts +10 -0
  30. package/dist/sdk/annotations/inspect.js +33 -0
  31. package/dist/sdk/annotations/isolated.d.ts +6 -0
  32. package/dist/sdk/annotations/isolated.js +51 -0
  33. package/dist/sdk/annotations/pageScript.d.ts +28 -0
  34. package/dist/sdk/annotations/pageScript.js +570 -0
  35. package/dist/sdk/annotations/part.d.ts +10 -0
  36. package/dist/sdk/annotations/part.js +144 -0
  37. package/dist/sdk/annotations/queue.d.ts +4 -0
  38. package/dist/sdk/annotations/queue.js +40 -0
  39. package/dist/sdk/annotations/serverMethods.d.ts +3 -0
  40. package/dist/sdk/annotations/serverMethods.js +62 -0
  41. package/dist/sdk/annotations/store.d.ts +160 -0
  42. package/dist/sdk/annotations/store.js +386 -0
  43. package/dist/sdk/browser/config.d.ts +16 -0
  44. package/dist/sdk/browser/config.js +22 -0
  45. package/dist/sdk/browser/diagnostics.d.ts +4 -0
  46. package/dist/sdk/browser/diagnostics.js +38 -0
  47. package/dist/sdk/browser/index.d.ts +28 -0
  48. package/dist/sdk/browser/index.js +72 -0
  49. package/dist/sdk/browser/network.d.ts +10 -0
  50. package/dist/sdk/browser/network.js +59 -0
  51. package/dist/sdk/browser/serverMethods.d.ts +3 -0
  52. package/dist/sdk/browser/serverMethods.js +7 -0
  53. package/dist/sdk/browser/session.d.ts +85 -0
  54. package/dist/sdk/browser/session.js +228 -0
  55. package/dist/sdk/browser/tools.d.ts +8 -0
  56. package/dist/sdk/browser/tools.js +329 -0
  57. package/dist/sdk/capabilities/api.d.ts +22 -0
  58. package/dist/sdk/capabilities/api.js +54 -0
  59. package/dist/sdk/capabilities/runSnapshot.d.ts +18 -0
  60. package/dist/sdk/capabilities/runSnapshot.js +47 -0
  61. package/dist/sdk/capabilities/types.d.ts +29 -0
  62. package/dist/sdk/capabilities/types.js +1 -0
  63. package/dist/sdk/cli.d.ts +2 -0
  64. package/dist/sdk/cli.js +150 -0
  65. package/dist/sdk/core/bus.d.ts +23 -0
  66. package/dist/sdk/core/bus.js +76 -0
  67. package/dist/sdk/core/caller.d.ts +22 -0
  68. package/dist/sdk/core/caller.js +16 -0
  69. package/dist/sdk/core/changes.d.ts +15 -0
  70. package/dist/sdk/core/changes.js +15 -0
  71. package/dist/sdk/core/effort.d.ts +2 -0
  72. package/dist/sdk/core/effort.js +1 -0
  73. package/dist/sdk/core/env.d.ts +18 -0
  74. package/dist/sdk/core/env.js +8 -0
  75. package/dist/sdk/core/errors.d.ts +15 -0
  76. package/dist/sdk/core/errors.js +24 -0
  77. package/dist/sdk/core/frontmatter.d.ts +12 -0
  78. package/dist/sdk/core/frontmatter.js +50 -0
  79. package/dist/sdk/core/fs.d.ts +18 -0
  80. package/dist/sdk/core/fs.js +106 -0
  81. package/dist/sdk/core/index.d.ts +24 -0
  82. package/dist/sdk/core/index.js +187 -0
  83. package/dist/sdk/core/path.d.ts +7 -0
  84. package/dist/sdk/core/path.js +79 -0
  85. package/dist/sdk/core/projects.d.ts +18 -0
  86. package/dist/sdk/core/projects.js +67 -0
  87. package/dist/sdk/core/secrets.d.ts +2 -0
  88. package/dist/sdk/core/secrets.js +5 -0
  89. package/dist/sdk/core/text.d.ts +7 -0
  90. package/dist/sdk/core/text.js +40 -0
  91. package/dist/sdk/doctor/checks.d.ts +5 -0
  92. package/dist/sdk/doctor/checks.js +208 -0
  93. package/dist/sdk/doctor/probe.d.ts +4 -0
  94. package/dist/sdk/doctor/probe.js +92 -0
  95. package/dist/sdk/doctor/serverMethods.d.ts +3 -0
  96. package/dist/sdk/doctor/serverMethods.js +8 -0
  97. package/dist/sdk/doctor/service.d.ts +23 -0
  98. package/dist/sdk/doctor/service.js +144 -0
  99. package/dist/sdk/doctor/types.d.ts +141 -0
  100. package/dist/sdk/doctor/types.js +29 -0
  101. package/dist/sdk/harness.d.ts +148 -0
  102. package/dist/sdk/harness.js +338 -0
  103. package/dist/sdk/history/lessonPrompt.d.ts +2 -0
  104. package/dist/sdk/history/lessonPrompt.js +15 -0
  105. package/dist/sdk/history/lessons.d.ts +52 -0
  106. package/dist/sdk/history/lessons.js +173 -0
  107. package/dist/sdk/history/recall.d.ts +68 -0
  108. package/dist/sdk/history/recall.js +199 -0
  109. package/dist/sdk/history/serverMethods.d.ts +3 -0
  110. package/dist/sdk/history/serverMethods.js +8 -0
  111. package/dist/sdk/history/trajectory.d.ts +7 -0
  112. package/dist/sdk/history/trajectory.js +216 -0
  113. package/dist/sdk/hub/catalog.json +123 -0
  114. package/dist/sdk/hub/cli.d.ts +7 -0
  115. package/dist/sdk/hub/cli.js +81 -0
  116. package/dist/sdk/hub/hub.d.ts +74 -0
  117. package/dist/sdk/hub/hub.js +474 -0
  118. package/dist/sdk/hub/schema.d.ts +280 -0
  119. package/dist/sdk/hub/schema.js +78 -0
  120. package/dist/sdk/hub/serverMethods.d.ts +3 -0
  121. package/dist/sdk/hub/serverMethods.js +11 -0
  122. package/dist/sdk/index.d.ts +73 -0
  123. package/dist/sdk/index.js +55 -0
  124. package/dist/sdk/mcp/connections.d.ts +83 -0
  125. package/dist/sdk/mcp/connections.js +676 -0
  126. package/dist/sdk/mcp/manager.d.ts +26 -0
  127. package/dist/sdk/mcp/manager.js +124 -0
  128. package/dist/sdk/mcp/oauth.d.ts +35 -0
  129. package/dist/sdk/mcp/oauth.js +171 -0
  130. package/dist/sdk/mcp/scopeMigration.d.ts +19 -0
  131. package/dist/sdk/mcp/scopeMigration.js +198 -0
  132. package/dist/sdk/mcp/serverMethods.d.ts +3 -0
  133. package/dist/sdk/mcp/serverMethods.js +22 -0
  134. package/dist/sdk/mcp/service.d.ts +160 -0
  135. package/dist/sdk/mcp/service.js +510 -0
  136. package/dist/sdk/mcp/types.d.ts +131 -0
  137. package/dist/sdk/mcp/types.js +49 -0
  138. package/dist/sdk/pi/runtime.d.ts +13 -0
  139. package/dist/sdk/pi/runtime.js +31 -0
  140. package/dist/sdk/plugins/api.d.ts +66 -0
  141. package/dist/sdk/plugins/api.js +155 -0
  142. package/dist/sdk/plugins/attachments.d.ts +46 -0
  143. package/dist/sdk/plugins/attachments.js +111 -0
  144. package/dist/sdk/plugins/builtin.d.ts +7 -0
  145. package/dist/sdk/plugins/builtin.js +163 -0
  146. package/dist/sdk/plugins/builtinRegistry.d.ts +53 -0
  147. package/dist/sdk/plugins/builtinRegistry.js +49 -0
  148. package/dist/sdk/plugins/catalogue.d.ts +29 -0
  149. package/dist/sdk/plugins/catalogue.js +196 -0
  150. package/dist/sdk/plugins/cli.d.ts +13 -0
  151. package/dist/sdk/plugins/cli.js +188 -0
  152. package/dist/sdk/plugins/discover.d.ts +42 -0
  153. package/dist/sdk/plugins/discover.js +115 -0
  154. package/dist/sdk/plugins/firstParty.d.ts +50 -0
  155. package/dist/sdk/plugins/firstParty.js +113 -0
  156. package/dist/sdk/plugins/hooks.d.ts +94 -0
  157. package/dist/sdk/plugins/hooks.js +162 -0
  158. package/dist/sdk/plugins/identity.d.ts +19 -0
  159. package/dist/sdk/plugins/identity.js +48 -0
  160. package/dist/sdk/plugins/install.d.ts +20 -0
  161. package/dist/sdk/plugins/install.js +110 -0
  162. package/dist/sdk/plugins/inventory.d.ts +22 -0
  163. package/dist/sdk/plugins/inventory.js +110 -0
  164. package/dist/sdk/plugins/manifest.d.ts +13 -0
  165. package/dist/sdk/plugins/manifest.js +56 -0
  166. package/dist/sdk/plugins/plugins.d.ts +104 -0
  167. package/dist/sdk/plugins/plugins.js +164 -0
  168. package/dist/sdk/plugins/runtime.d.ts +9 -0
  169. package/dist/sdk/plugins/runtime.js +95 -0
  170. package/dist/sdk/plugins/trust.d.ts +44 -0
  171. package/dist/sdk/plugins/trust.js +120 -0
  172. package/dist/sdk/plugins/types.d.ts +159 -0
  173. package/dist/sdk/plugins/types.js +7 -0
  174. package/dist/sdk/prompt/compile.d.ts +177 -0
  175. package/dist/sdk/prompt/compile.js +413 -0
  176. package/dist/sdk/refine/cli.d.ts +4 -0
  177. package/dist/sdk/refine/cli.js +186 -0
  178. package/dist/sdk/refine/demo.d.ts +21 -0
  179. package/dist/sdk/refine/demo.js +114 -0
  180. package/dist/sdk/refine/evidence.d.ts +55 -0
  181. package/dist/sdk/refine/evidence.js +330 -0
  182. package/dist/sdk/refine/host.d.ts +51 -0
  183. package/dist/sdk/refine/host.js +76 -0
  184. package/dist/sdk/refine/ledger.d.ts +48 -0
  185. package/dist/sdk/refine/ledger.js +76 -0
  186. package/dist/sdk/refine/library.d.ts +55 -0
  187. package/dist/sdk/refine/library.js +177 -0
  188. package/dist/sdk/refine/pi.d.ts +72 -0
  189. package/dist/sdk/refine/pi.js +248 -0
  190. package/dist/sdk/refine/prompts.d.ts +45 -0
  191. package/dist/sdk/refine/prompts.js +390 -0
  192. package/dist/sdk/refine/recursion.d.ts +113 -0
  193. package/dist/sdk/refine/recursion.js +258 -0
  194. package/dist/sdk/refine/runner.d.ts +81 -0
  195. package/dist/sdk/refine/runner.js +150 -0
  196. package/dist/sdk/refine/selection.d.ts +57 -0
  197. package/dist/sdk/refine/selection.js +251 -0
  198. package/dist/sdk/refine/serverMethods.d.ts +3 -0
  199. package/dist/sdk/refine/serverMethods.js +20 -0
  200. package/dist/sdk/refine/service.d.ts +84 -0
  201. package/dist/sdk/refine/service.js +165 -0
  202. package/dist/sdk/refine/suite.d.ts +67 -0
  203. package/dist/sdk/refine/suite.js +174 -0
  204. package/dist/sdk/refine/trajectory.d.ts +9 -0
  205. package/dist/sdk/refine/trajectory.js +68 -0
  206. package/dist/sdk/refine/types.d.ts +77 -0
  207. package/dist/sdk/refine/types.js +10 -0
  208. package/dist/sdk/server/methods.d.ts +3 -0
  209. package/dist/sdk/server/methods.js +293 -0
  210. package/dist/sdk/server/params.d.ts +4 -0
  211. package/dist/sdk/server/params.js +11 -0
  212. package/dist/sdk/server/remote.d.ts +19 -0
  213. package/dist/sdk/server/remote.js +84 -0
  214. package/dist/sdk/server/rpc.d.ts +20 -0
  215. package/dist/sdk/server/rpc.js +102 -0
  216. package/dist/sdk/server/serve.d.ts +10 -0
  217. package/dist/sdk/server/serve.js +18 -0
  218. package/dist/sdk/sessions/approvals.d.ts +47 -0
  219. package/dist/sdk/sessions/approvals.js +119 -0
  220. package/dist/sdk/sessions/continuation.d.ts +48 -0
  221. package/dist/sdk/sessions/continuation.js +85 -0
  222. package/dist/sdk/sessions/contracts.d.ts +551 -0
  223. package/dist/sdk/sessions/contracts.js +338 -0
  224. package/dist/sdk/sessions/extensionUi.d.ts +19 -0
  225. package/dist/sdk/sessions/extensionUi.js +64 -0
  226. package/dist/sdk/sessions/history.d.ts +16 -0
  227. package/dist/sdk/sessions/history.js +68 -0
  228. package/dist/sdk/sessions/lineageJoin.d.ts +2 -0
  229. package/dist/sdk/sessions/lineageJoin.js +61 -0
  230. package/dist/sdk/sessions/planMode.d.ts +39 -0
  231. package/dist/sdk/sessions/planMode.js +93 -0
  232. package/dist/sdk/sessions/policy.d.ts +43 -0
  233. package/dist/sdk/sessions/policy.js +1 -0
  234. package/dist/sdk/sessions/pricing.d.ts +34 -0
  235. package/dist/sdk/sessions/pricing.js +40 -0
  236. package/dist/sdk/sessions/reasoningSummaries.d.ts +11 -0
  237. package/dist/sdk/sessions/reasoningSummaries.js +61 -0
  238. package/dist/sdk/sessions/registry.d.ts +103 -0
  239. package/dist/sdk/sessions/registry.js +386 -0
  240. package/dist/sdk/sessions/runIndex.d.ts +21 -0
  241. package/dist/sdk/sessions/runIndex.js +65 -0
  242. package/dist/sdk/sessions/runStore.d.ts +66 -0
  243. package/dist/sdk/sessions/runStore.js +337 -0
  244. package/dist/sdk/sessions/runner.d.ts +213 -0
  245. package/dist/sdk/sessions/runner.js +589 -0
  246. package/dist/sdk/sessions/sessions.d.ts +152 -0
  247. package/dist/sdk/sessions/sessions.js +461 -0
  248. package/dist/sdk/sessions/sideQuestionServerMethods.d.ts +3 -0
  249. package/dist/sdk/sessions/sideQuestionServerMethods.js +19 -0
  250. package/dist/sdk/sessions/sideQuestions.d.ts +66 -0
  251. package/dist/sdk/sessions/sideQuestions.js +290 -0
  252. package/dist/sdk/sessions/subagentServerMethods.d.ts +3 -0
  253. package/dist/sdk/sessions/subagentServerMethods.js +41 -0
  254. package/dist/sdk/sessions/subagentService.d.ts +52 -0
  255. package/dist/sdk/sessions/subagentService.js +265 -0
  256. package/dist/sdk/sessions/subagents.d.ts +58 -0
  257. package/dist/sdk/sessions/subagents.js +87 -0
  258. package/dist/sdk/terminal/accountsMenu.d.ts +46 -0
  259. package/dist/sdk/terminal/accountsMenu.js +392 -0
  260. package/dist/sdk/terminal/browser.d.ts +62 -0
  261. package/dist/sdk/terminal/browser.js +41 -0
  262. package/dist/sdk/terminal/browserControl.d.ts +29 -0
  263. package/dist/sdk/terminal/browserControl.js +186 -0
  264. package/dist/sdk/terminal/cli.d.ts +20 -0
  265. package/dist/sdk/terminal/cli.js +121 -0
  266. package/dist/sdk/terminal/client.d.ts +15 -0
  267. package/dist/sdk/terminal/client.js +126 -0
  268. package/dist/sdk/terminal/commandHelp.d.ts +17 -0
  269. package/dist/sdk/terminal/commandHelp.js +20 -0
  270. package/dist/sdk/terminal/control.d.ts +4 -0
  271. package/dist/sdk/terminal/control.js +25 -0
  272. package/dist/sdk/terminal/controller.d.ts +78 -0
  273. package/dist/sdk/terminal/controller.js +383 -0
  274. package/dist/sdk/terminal/hubMenu.d.ts +10 -0
  275. package/dist/sdk/terminal/hubMenu.js +34 -0
  276. package/dist/sdk/terminal/launch.d.ts +5 -0
  277. package/dist/sdk/terminal/launch.js +27 -0
  278. package/dist/sdk/terminal/logs.d.ts +14 -0
  279. package/dist/sdk/terminal/logs.js +59 -0
  280. package/dist/sdk/terminal/opentui/subagentsWidget.d.ts +28 -0
  281. package/dist/sdk/terminal/opentui/subagentsWidget.js +52 -0
  282. package/dist/sdk/terminal/piExtension.d.ts +6 -0
  283. package/dist/sdk/terminal/piExtension.js +377 -0
  284. package/dist/sdk/terminal/pluginMenu.d.ts +34 -0
  285. package/dist/sdk/terminal/pluginMenu.js +101 -0
  286. package/dist/sdk/terminal/socket.d.ts +73 -0
  287. package/dist/sdk/terminal/socket.js +287 -0
  288. package/dist/sdk/terminal/standalone.d.ts +20 -0
  289. package/dist/sdk/terminal/standalone.js +186 -0
  290. package/dist/sdk/terminal/subagentMonitor.d.ts +38 -0
  291. package/dist/sdk/terminal/subagentMonitor.js +121 -0
  292. package/dist/sdk/terminal/terminals.d.ts +212 -0
  293. package/dist/sdk/terminal/terminals.js +1108 -0
  294. package/dist/sdk/terminal/trajectory.d.ts +10 -0
  295. package/dist/sdk/terminal/trajectory.js +30 -0
  296. package/dist/sdk/terminal/tui/annotateCommand.d.ts +3 -0
  297. package/dist/sdk/terminal/tui/annotateCommand.js +22 -0
  298. package/dist/sdk/terminal/tui/chrome.d.ts +64 -0
  299. package/dist/sdk/terminal/tui/chrome.js +169 -0
  300. package/dist/sdk/terminal/tui/clipboardFiles.d.ts +11 -0
  301. package/dist/sdk/terminal/tui/clipboardFiles.js +74 -0
  302. package/dist/sdk/terminal/tui/commandPages.d.ts +11 -0
  303. package/dist/sdk/terminal/tui/commandPages.js +111 -0
  304. package/dist/sdk/terminal/tui/commands.d.ts +46 -0
  305. package/dist/sdk/terminal/tui/commands.js +399 -0
  306. package/dist/sdk/terminal/tui/dialogGeometry.d.ts +27 -0
  307. package/dist/sdk/terminal/tui/dialogGeometry.js +52 -0
  308. package/dist/sdk/terminal/tui/dialogs.d.ts +80 -0
  309. package/dist/sdk/terminal/tui/dialogs.js +370 -0
  310. package/dist/sdk/terminal/tui/keybindings.d.ts +11 -0
  311. package/dist/sdk/terminal/tui/keybindings.js +49 -0
  312. package/dist/sdk/terminal/tui/list.d.ts +73 -0
  313. package/dist/sdk/terminal/tui/list.js +196 -0
  314. package/dist/sdk/terminal/tui/modeChoices.d.ts +42 -0
  315. package/dist/sdk/terminal/tui/modeChoices.js +70 -0
  316. package/dist/sdk/terminal/tui/modelPicker.d.ts +55 -0
  317. package/dist/sdk/terminal/tui/modelPicker.js +150 -0
  318. package/dist/sdk/terminal/tui/mouse.d.ts +3 -0
  319. package/dist/sdk/terminal/tui/mouse.js +3 -0
  320. package/dist/sdk/terminal/tui/page.d.ts +17 -0
  321. package/dist/sdk/terminal/tui/page.js +1 -0
  322. package/dist/sdk/terminal/tui/pageOverlay.d.ts +27 -0
  323. package/dist/sdk/terminal/tui/pageOverlay.js +156 -0
  324. package/dist/sdk/terminal/tui/pages/accountsPage.d.ts +76 -0
  325. package/dist/sdk/terminal/tui/pages/accountsPage.js +409 -0
  326. package/dist/sdk/terminal/tui/pages/agentsPage.d.ts +74 -0
  327. package/dist/sdk/terminal/tui/pages/agentsPage.js +190 -0
  328. package/dist/sdk/terminal/tui/pages/annotatePage.d.ts +94 -0
  329. package/dist/sdk/terminal/tui/pages/annotatePage.js +341 -0
  330. package/dist/sdk/terminal/tui/pages/browserPage.d.ts +87 -0
  331. package/dist/sdk/terminal/tui/pages/browserPage.js +738 -0
  332. package/dist/sdk/terminal/tui/pages/componentsPage.d.ts +47 -0
  333. package/dist/sdk/terminal/tui/pages/componentsPage.js +119 -0
  334. package/dist/sdk/terminal/tui/pages/doctorPage.d.ts +39 -0
  335. package/dist/sdk/terminal/tui/pages/doctorPage.js +233 -0
  336. package/dist/sdk/terminal/tui/pages/hubPage.d.ts +39 -0
  337. package/dist/sdk/terminal/tui/pages/hubPage.js +128 -0
  338. package/dist/sdk/terminal/tui/pages/logPage.d.ts +38 -0
  339. package/dist/sdk/terminal/tui/pages/logPage.js +189 -0
  340. package/dist/sdk/terminal/tui/pages/notesPage.d.ts +75 -0
  341. package/dist/sdk/terminal/tui/pages/notesPage.js +201 -0
  342. package/dist/sdk/terminal/tui/pages/permissionsPage.d.ts +44 -0
  343. package/dist/sdk/terminal/tui/pages/permissionsPage.js +124 -0
  344. package/dist/sdk/terminal/tui/pages/pluginsPage.d.ts +57 -0
  345. package/dist/sdk/terminal/tui/pages/pluginsPage.js +243 -0
  346. package/dist/sdk/terminal/tui/pages/settingsPage.d.ts +63 -0
  347. package/dist/sdk/terminal/tui/pages/settingsPage.js +103 -0
  348. package/dist/sdk/terminal/tui/pages/subagentsPage.d.ts +23 -0
  349. package/dist/sdk/terminal/tui/pages/subagentsPage.js +70 -0
  350. package/dist/sdk/terminal/tui/pages/trajectoryPage.d.ts +65 -0
  351. package/dist/sdk/terminal/tui/pages/trajectoryPage.js +450 -0
  352. package/dist/sdk/terminal/tui/pages/worktreesPage.d.ts +72 -0
  353. package/dist/sdk/terminal/tui/pages/worktreesPage.js +203 -0
  354. package/dist/sdk/terminal/tui/piAdapter.d.ts +18 -0
  355. package/dist/sdk/terminal/tui/piAdapter.js +48 -0
  356. package/dist/sdk/terminal/tui/planMode.d.ts +2 -0
  357. package/dist/sdk/terminal/tui/planMode.js +2 -0
  358. package/dist/sdk/terminal/tui/pluginCommands.d.ts +14 -0
  359. package/dist/sdk/terminal/tui/pluginCommands.js +27 -0
  360. package/dist/sdk/terminal/tui/questionPicker.d.ts +20 -0
  361. package/dist/sdk/terminal/tui/questionPicker.js +150 -0
  362. package/dist/sdk/terminal/tui/questions.d.ts +21 -0
  363. package/dist/sdk/terminal/tui/questions.js +42 -0
  364. package/dist/sdk/terminal/tui/runtime.d.ts +114 -0
  365. package/dist/sdk/terminal/tui/runtime.js +443 -0
  366. package/dist/sdk/terminal/tui/search.d.ts +22 -0
  367. package/dist/sdk/terminal/tui/search.js +60 -0
  368. package/dist/sdk/terminal/tui/selection.d.ts +16 -0
  369. package/dist/sdk/terminal/tui/selection.js +16 -0
  370. package/dist/sdk/terminal/tui/sessionUi.d.ts +3 -0
  371. package/dist/sdk/terminal/tui/sessionUi.js +30 -0
  372. package/dist/sdk/terminal/tui/settingsModel.d.ts +14 -0
  373. package/dist/sdk/terminal/tui/settingsModel.js +114 -0
  374. package/dist/sdk/terminal/tui/sideQuestion.d.ts +53 -0
  375. package/dist/sdk/terminal/tui/sideQuestion.js +230 -0
  376. package/dist/sdk/terminal/tui/skillInvocation.d.ts +9 -0
  377. package/dist/sdk/terminal/tui/skillInvocation.js +43 -0
  378. package/dist/sdk/terminal/tui/status.d.ts +18 -0
  379. package/dist/sdk/terminal/tui/status.js +67 -0
  380. package/dist/sdk/terminal/tui/theme.d.ts +45 -0
  381. package/dist/sdk/terminal/tui/theme.js +176 -0
  382. package/dist/sdk/terminal/tui/treeModel.d.ts +79 -0
  383. package/dist/sdk/terminal/tui/treeModel.js +483 -0
  384. package/dist/sdk/terminal/tui/treePicker.d.ts +49 -0
  385. package/dist/sdk/terminal/tui/treePicker.js +251 -0
  386. package/dist/sdk/terminal/tui/ui.d.ts +49 -0
  387. package/dist/sdk/terminal/tui/ui.js +149 -0
  388. package/dist/sdk/terminal/tui/workingStatus.d.ts +9 -0
  389. package/dist/sdk/terminal/tui/workingStatus.js +229 -0
  390. package/dist/sdk/tools/askUser.d.ts +6 -0
  391. package/dist/sdk/tools/askUser.js +92 -0
  392. package/dist/sdk/tools/checklist.d.ts +9 -0
  393. package/dist/sdk/tools/checklist.js +54 -0
  394. package/dist/sdk/tools/definitions.d.ts +30 -0
  395. package/dist/sdk/tools/definitions.js +117 -0
  396. package/dist/sdk/tools/dispatch.d.ts +16 -0
  397. package/dist/sdk/tools/dispatch.js +67 -0
  398. package/dist/sdk/tools/harnessTools.d.ts +8 -0
  399. package/dist/sdk/tools/harnessTools.js +20 -0
  400. package/dist/sdk/tools/sessionName.d.ts +7 -0
  401. package/dist/sdk/tools/sessionName.js +31 -0
  402. package/dist/sdk/tools/spawnSubagent.d.ts +4 -0
  403. package/dist/sdk/tools/spawnSubagent.js +58 -0
  404. package/dist/sdk/tools/types.d.ts +48 -0
  405. package/dist/sdk/tools/types.js +1 -0
  406. package/dist/sdk/variant/components.d.ts +34 -0
  407. package/dist/sdk/variant/components.js +230 -0
  408. package/dist/sdk/variant/materialise.d.ts +66 -0
  409. package/dist/sdk/variant/materialise.js +81 -0
  410. package/dist/sdk/variant/migrate.d.ts +4 -0
  411. package/dist/sdk/variant/migrate.js +41 -0
  412. package/dist/sdk/variant/seed.d.ts +20 -0
  413. package/dist/sdk/variant/seed.js +116 -0
  414. package/dist/sdk/variant/store.d.ts +82 -0
  415. package/dist/sdk/variant/store.js +151 -0
  416. package/dist/sdk/variant/surface.d.ts +56 -0
  417. package/dist/sdk/variant/surface.js +81 -0
  418. package/dist/sdk/variant/trust.d.ts +27 -0
  419. package/dist/sdk/variant/trust.js +64 -0
  420. package/dist/sdk/variant/variant.d.ts +71 -0
  421. package/dist/sdk/variant/variant.js +331 -0
  422. package/dist/sdk/web/markdown.d.ts +10 -0
  423. package/dist/sdk/web/markdown.js +66 -0
  424. package/dist/sdk/web/part.d.ts +10 -0
  425. package/dist/sdk/web/part.js +6 -0
  426. package/dist/sdk/web/safeRequest.d.ts +34 -0
  427. package/dist/sdk/web/safeRequest.js +175 -0
  428. package/dist/sdk/web/search.d.ts +53 -0
  429. package/dist/sdk/web/search.js +168 -0
  430. package/dist/sdk/web/serverMethods.d.ts +3 -0
  431. package/dist/sdk/web/serverMethods.js +7 -0
  432. package/dist/sdk/web/text.d.ts +2 -0
  433. package/dist/sdk/web/text.js +7 -0
  434. package/dist/sdk/web/tools.d.ts +22 -0
  435. package/dist/sdk/web/tools.js +195 -0
  436. package/dist/sdk/web/turndown-plugin-gfm.d.ts +4 -0
  437. package/dist/sdk/wiki/notes.d.ts +68 -0
  438. package/dist/sdk/wiki/notes.js +297 -0
  439. package/dist/sdk/wiki/serverMethods.d.ts +3 -0
  440. package/dist/sdk/wiki/serverMethods.js +26 -0
  441. package/dist/sdk/worktrees/cli.d.ts +11 -0
  442. package/dist/sdk/worktrees/cli.js +146 -0
  443. package/dist/sdk/worktrees/copy.d.ts +9 -0
  444. package/dist/sdk/worktrees/copy.js +111 -0
  445. package/dist/sdk/worktrees/git.d.ts +16 -0
  446. package/dist/sdk/worktrees/git.js +81 -0
  447. package/dist/sdk/worktrees/serverMethods.d.ts +3 -0
  448. package/dist/sdk/worktrees/serverMethods.js +30 -0
  449. package/dist/sdk/worktrees/service.d.ts +73 -0
  450. package/dist/sdk/worktrees/service.js +483 -0
  451. package/dist/sdk/worktrees/setup.d.ts +23 -0
  452. package/dist/sdk/worktrees/setup.js +65 -0
  453. package/dist/sdk/worktrees/types.d.ts +91 -0
  454. package/dist/sdk/worktrees/types.js +1 -0
  455. package/dist/sdk/world/actions.d.ts +23 -0
  456. package/dist/sdk/world/actions.js +31 -0
  457. package/dist/sdk/world/cli.d.ts +12 -0
  458. package/dist/sdk/world/cli.js +166 -0
  459. package/dist/sdk/world/images.d.ts +20 -0
  460. package/dist/sdk/world/images.js +48 -0
  461. package/dist/sdk/world/untrusted.d.ts +12 -0
  462. package/dist/sdk/world/untrusted.js +20 -0
  463. package/dist/sdk/world/world.d.ts +67 -0
  464. package/dist/sdk/world/world.js +79 -0
  465. package/dist/terminal-opentui.js +20778 -0
  466. package/dist/terminal-pi.js +794 -518
  467. package/docs/README.md +42 -0
  468. package/docs/architecture/00-overview.md +171 -0
  469. package/docs/architecture/01-extension-points.md +78 -0
  470. package/docs/architecture/02-sessions-and-runs.md +203 -0
  471. package/docs/architecture/03-variants.md +103 -0
  472. package/docs/architecture/04-prompt.md +122 -0
  473. package/docs/architecture/05-refinement.md +107 -0
  474. package/docs/architecture/06-plugins-and-capabilities.md +129 -0
  475. package/docs/architecture/07-tools-and-gate.md +103 -0
  476. package/docs/architecture/08-memory-and-history.md +94 -0
  477. package/docs/architecture/09-accounts-and-connectors.md +98 -0
  478. package/docs/architecture/10-server-protocol.md +193 -0
  479. package/docs/architecture/11-terminal.md +261 -0
  480. package/docs/architecture/12-storage.md +75 -0
  481. package/docs/architecture/13-world-tools.md +45 -0
  482. package/docs/architecture/14-surfaces-and-parity.md +89 -0
  483. package/docs/architecture/README.md +125 -0
  484. package/docs/architecture/proposals/PROP-0001-reporting-section.md +106 -0
  485. package/docs/architecture/proposals/PROP-0002-retain-rollout-workspaces.md +104 -0
  486. package/docs/architecture/proposals/PROP-0003-executor-settings.md +81 -0
  487. package/docs/architecture/proposals/PROP-0004-flexible-reporting-guidance.md +71 -0
  488. package/docs/architecture/proposals/PROP-0005-xharness-cli-name.md +78 -0
  489. package/docs/architecture/proposals/PROP-0006-run-checklist.md +70 -0
  490. package/docs/architecture/proposals/PROP-0007-run-continuation.md +80 -0
  491. package/docs/architecture/proposals/PROP-0008-lessons-from-runs.md +80 -0
  492. package/docs/architecture/proposals/PROP-0009-foundation-and-variants.md +78 -0
  493. package/docs/architecture/proposals/PROP-0010-session-names.md +73 -0
  494. package/docs/architecture/proposals/PROP-0011-doctor.md +63 -0
  495. package/docs/architecture/proposals/PROP-0012-release-baseline.md +56 -0
  496. package/docs/architecture/proposals/PROP-0013-resource-browser.md +58 -0
  497. package/docs/architecture/proposals/PROP-0014-fullscreen-browser-tabs.md +58 -0
  498. package/docs/architecture/proposals/PROP-0015-one-capability-surface.md +88 -0
  499. package/docs/architecture/proposals/PROP-0016-managed-worktrees.md +156 -0
  500. package/docs/architecture/proposals/PROP-0017-page-annotations.md +127 -0
  501. package/docs/architecture/proposals/PROP-0018-annotation-queue-and-app-targets.md +179 -0
  502. package/docs/architecture/proposals/PROP-0019-contextual-side-questions.md +122 -0
  503. package/docs/architecture/proposals/PROP-0020-builtin-feature-plugins.md +105 -0
  504. package/docs/architecture/proposals/PROP-0021-command-namespaces-and-duplicates.md +99 -0
  505. package/docs/architecture/proposals/PROP-0022-plan-only-questions.md +102 -0
  506. package/docs/architecture/proposals/PROP-0023-xagent-cli-name.md +61 -0
  507. package/docs/architecture/proposals/PROP-0024-question-sketch-previews.md +130 -0
  508. package/docs/architecture/proposals/PROP-0025-contextual-question-wireframes.md +49 -0
  509. package/docs/architecture/proposals/PROP-0026-connected-sketch-display.md +94 -0
  510. package/docs/architecture/proposals/PROP-0027-xingular-agent-product-identity.md +60 -0
  511. package/docs/architecture/proposals/PROP-0028-normalize-question-wireframes.md +55 -0
  512. package/docs/architecture/proposals/PROP-0029-agent-profiles.md +124 -0
  513. package/docs/architecture/proposals/PROP-0030-subagent-title.md +86 -0
  514. package/docs/architecture/proposals/README.md +101 -0
  515. package/docs/decisions/ADR-0002-native-subagent-lifecycle.md +49 -0
  516. package/docs/decisions/ADR-0003-shared-asynchronous-subagents.md +70 -0
  517. package/docs/decisions/ADR-0004-fullscreen-terminal-layout.md +50 -0
  518. package/docs/decisions/ADR-0005-app-provided-oauth-clients.md +54 -0
  519. package/docs/decisions/ADR-0006-opentui-only-terminal.md +47 -0
  520. package/docs/decisions/ADR-0007-reporting-section.md +33 -0
  521. package/docs/decisions/ADR-0008-flexible-reporting-guidance.md +38 -0
  522. package/docs/decisions/ADR-0009-xharness-command.md +39 -0
  523. package/docs/decisions/ADR-0010-lessons-in-the-wiki.md +31 -0
  524. package/docs/decisions/ADR-0011-foundation-and-variants.md +28 -0
  525. package/docs/decisions/ADR-0012-native-session-names.md +34 -0
  526. package/docs/decisions/ADR-0013-doctor.md +27 -0
  527. package/docs/decisions/ADR-0014-public-release-baseline.md +22 -0
  528. package/docs/decisions/ADR-0015-resource-browser.md +28 -0
  529. package/docs/decisions/ADR-0016-fullscreen-browser-tabs.md +31 -0
  530. package/docs/decisions/ADR-0017-one-capability-surface.md +34 -0
  531. package/docs/decisions/ADR-0018-builtin-feature-plugins.md +35 -0
  532. package/docs/decisions/ADR-0019-managed-git-worktrees.md +31 -0
  533. package/docs/decisions/ADR-0020-page-annotations.md +37 -0
  534. package/docs/decisions/ADR-0021-required-command-namespaces.md +40 -0
  535. package/docs/decisions/ADR-0022-plan-only-question-tools.md +34 -0
  536. package/docs/decisions/ADR-0023-contextual-side-question-runs.md +35 -0
  537. package/docs/decisions/ADR-0024-xagent-command.md +40 -0
  538. package/docs/decisions/ADR-0025-question-choice-sketches.md +49 -0
  539. package/docs/decisions/ADR-0026-contextual-question-wireframes.md +58 -0
  540. package/docs/decisions/ADR-0027-connected-sketch-display.md +60 -0
  541. package/docs/decisions/ADR-0028-xingular-agent-product-identity.md +56 -0
  542. package/docs/decisions/ADR-0029-normalized-question-wireframe-borders.md +33 -0
  543. package/docs/decisions/ADR-0030-agent-profiles.md +43 -0
  544. package/docs/doctor.md +80 -0
  545. package/docs/experiments/EXP-0001-terminal-input-latency/plan.md +81 -0
  546. package/docs/experiments/EXP-0001-terminal-input-latency/results.md +46 -0
  547. package/docs/experiments/EXP-0002-opentui-typing-latency/plan.md +70 -0
  548. package/docs/experiments/EXP-0002-opentui-typing-latency/results.md +92 -0
  549. package/docs/features/README.md +46 -0
  550. package/docs/features/automations/README.md +41 -0
  551. package/docs/features/cores/README.md +39 -0
  552. package/docs/features/google-harness2/README.md +52 -0
  553. package/docs/features/integrations/README.md +40 -0
  554. package/docs/features/interfaces/README.md +29 -0
  555. package/docs/features/memory/README.md +28 -0
  556. package/docs/future-work.md +48 -0
  557. package/docs/parity.md +78 -0
  558. package/docs/releases/1.0.0.md +40 -0
  559. package/docs/releases/4.0.0.md +46 -0
  560. package/docs/releases/README.md +41 -0
  561. package/docs/study/00-index.md +83 -0
  562. package/docs/study/arms/00-matrix.md +20 -0
  563. package/docs/study/arms/01-system-prompt.md +211 -0
  564. package/docs/study/arms/02-tools.md +79 -0
  565. package/docs/study/arms/03-subagents.md +90 -0
  566. package/docs/study/arms/04-skills.md +75 -0
  567. package/docs/study/arms/05-context-management.md +90 -0
  568. package/docs/study/arms/06-memory.md +90 -0
  569. package/docs/study/arms/07-governance.md +71 -0
  570. package/docs/study/arms/08-execution.md +69 -0
  571. package/docs/study/arms/09-observability.md +60 -0
  572. package/docs/study/arms/10-refinement.md +110 -0
  573. package/docs/study/autonomous-engineering-sources.md +277 -0
  574. package/docs/study/autonomy-sources.md +147 -0
  575. package/docs/study/btw-comparison.md +37 -0
  576. package/docs/study/feature-gap-review.md +42 -0
  577. package/docs/study/insights.md +123 -0
  578. package/docs/study/proactive-autonomy.md +408 -0
  579. package/docs/study/roadmap.md +72 -0
  580. package/docs/study/sources/claude-code.md +44 -0
  581. package/docs/study/sources/deepseek-harness.md +102 -0
  582. package/docs/study/sources/harness2.md +50 -0
  583. package/docs/study/sources/kimi-cli.md +42 -0
  584. package/docs/study/sources/omp.md +93 -0
  585. package/docs/study/sources/opencode.md +43 -0
  586. package/docs/study/sources/openhands.md +46 -0
  587. package/docs/study/sources/smolagents.md +40 -0
  588. package/docs/study/sources/swe-agent.md +34 -0
  589. package/docs/study/tui-resource-browser.md +78 -0
  590. package/docs/system-prompt-design.md +196 -0
  591. package/docs/terminal-tui.md +707 -58
  592. package/package.json +43 -13
  593. package/docs/evidence/terminal-2026-10-17/120x40-completed-transcript.ansi.gz +0 -0
  594. package/docs/evidence/terminal-2026-10-17/40x20-settings-interaction.ansi.gz +0 -0
  595. package/docs/evidence/terminal-2026-10-17/40x20-settings-keyboard.ansi.gz +0 -0
  596. package/docs/evidence/terminal-2026-10-17/40x20-welcome.ansi.gz +0 -0
  597. package/docs/evidence/terminal-2026-10-17/80x24-approval-0.ansi.gz +0 -0
  598. package/docs/evidence/terminal-2026-10-17/80x24-question.ansi.gz +0 -0
  599. package/docs/evidence/terminal-2026-10-17/verification.json +0 -130
  600. package/docs/evidence/terminal-2026-10-17-followup/120x40-completed-transcript.ansi.gz +0 -0
  601. package/docs/evidence/terminal-2026-10-17-followup/40x20-settings-interaction.ansi.gz +0 -0
  602. package/docs/evidence/terminal-2026-10-17-followup/40x20-settings-keyboard.ansi.gz +0 -0
  603. package/docs/evidence/terminal-2026-10-17-followup/40x20-welcome.ansi.gz +0 -0
  604. package/docs/evidence/terminal-2026-10-17-followup/80x24-approval-0.ansi.gz +0 -0
  605. package/docs/evidence/terminal-2026-10-17-followup/80x24-plugin-light.ansi.gz +0 -0
  606. package/docs/evidence/terminal-2026-10-17-followup/80x24-question-batch.ansi.gz +0 -0
  607. package/docs/evidence/terminal-2026-10-17-followup/80x24-question.ansi.gz +0 -0
  608. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-approval-0.ansi.gz +0 -0
  609. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-plugin-light.ansi.gz +0 -0
  610. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-question-batch.ansi.gz +0 -0
  611. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-question.ansi.gz +0 -0
  612. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/verification.json +0 -95
  613. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-approval-0.ansi.gz +0 -0
  614. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-plugin-light.ansi.gz +0 -0
  615. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-question-batch.ansi.gz +0 -0
  616. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-question.ansi.gz +0 -0
  617. package/docs/evidence/terminal-2026-10-17-followup/global-install/README.md +0 -27
  618. package/docs/evidence/terminal-2026-10-17-followup/global-install/shell-command-80x24.ansi.gz +0 -0
  619. package/docs/evidence/terminal-2026-10-17-followup/global-install/shell-command.json +0 -18
  620. package/docs/evidence/terminal-2026-10-17-followup/global-install/verification.json +0 -95
  621. package/docs/evidence/terminal-2026-10-17-followup/harness-reference-80x24.json.gz +0 -0
  622. package/docs/evidence/terminal-2026-10-17-followup/harness-reference-final-80x24.json.gz +0 -0
  623. package/docs/evidence/terminal-2026-10-17-followup/harness-reference-scenario.json +0 -60
  624. package/docs/evidence/terminal-2026-10-17-followup/live-codex/README.md +0 -24
  625. package/docs/evidence/terminal-2026-10-17-followup/live-codex/complete-80x24.ansi.gz +0 -0
  626. package/docs/evidence/terminal-2026-10-17-followup/live-codex/verification.json +0 -57
  627. package/docs/evidence/terminal-2026-10-17-followup/omp-reference-80x24-early.json.gz +0 -0
  628. package/docs/evidence/terminal-2026-10-17-followup/omp-reference-80x24.json.gz +0 -0
  629. package/docs/evidence/terminal-2026-10-17-followup/omp-reference-scenario.json +0 -58
  630. package/docs/evidence/terminal-2026-10-17-followup/omp-supplemental-static.json.gz +0 -0
  631. package/docs/evidence/terminal-2026-10-17-followup/rea-artifacts.json +0 -320
  632. package/docs/evidence/terminal-2026-10-17-followup/reference-comparison.json +0 -30
  633. package/docs/evidence/terminal-2026-10-17-followup/reference-comparison.md +0 -133
  634. package/docs/evidence/terminal-2026-10-17-followup/reference-source-observations.json +0 -20
  635. package/docs/evidence/terminal-2026-10-17-followup/verification.json +0 -207
  636. package/src/accounts/accounts.test.ts +0 -333
  637. package/src/accounts/accounts.ts +0 -658
  638. package/src/accounts/env.test.ts +0 -95
  639. package/src/accounts/env.ts +0 -338
  640. package/src/accounts/secrets.ts +0 -50
  641. package/src/accounts/store.ts +0 -338
  642. package/src/capabilities/api.ts +0 -75
  643. package/src/capabilities/runSnapshot.ts +0 -59
  644. package/src/capabilities/types.ts +0 -34
  645. package/src/cli.ts +0 -118
  646. package/src/core/bus.ts +0 -34
  647. package/src/core/changes.ts +0 -33
  648. package/src/core/env.ts +0 -27
  649. package/src/core/errors.ts +0 -32
  650. package/src/core/frontmatter.ts +0 -47
  651. package/src/core/fs.test.ts +0 -38
  652. package/src/core/fs.ts +0 -92
  653. package/src/core/index.ts +0 -193
  654. package/src/core/path.test.ts +0 -14
  655. package/src/core/path.ts +0 -79
  656. package/src/core/projects.ts +0 -90
  657. package/src/core/text.ts +0 -39
  658. package/src/harness.ts +0 -312
  659. package/src/hub/catalog.json +0 -123
  660. package/src/hub/cli.ts +0 -59
  661. package/src/hub/hub.test.ts +0 -205
  662. package/src/hub/hub.ts +0 -256
  663. package/src/hub/schema.ts +0 -81
  664. package/src/index.ts +0 -75
  665. package/src/mcp/connections.ts +0 -614
  666. package/src/mcp/manager.ts +0 -130
  667. package/src/mcp/oauth.ts +0 -195
  668. package/src/mcp/scopeMigration.test.ts +0 -79
  669. package/src/mcp/scopeMigration.ts +0 -204
  670. package/src/mcp/service.test.ts +0 -376
  671. package/src/mcp/service.ts +0 -549
  672. package/src/mcp/types.ts +0 -108
  673. package/src/memory/api.test.ts +0 -82
  674. package/src/memory/api.ts +0 -303
  675. package/src/memory/blocks.test.ts +0 -78
  676. package/src/memory/blocks.ts +0 -408
  677. package/src/memory/caller.ts +0 -69
  678. package/src/memory/curation.test.ts +0 -163
  679. package/src/memory/curation.ts +0 -64
  680. package/src/memory/dispatch.ts +0 -59
  681. package/src/memory/facts.test.ts +0 -41
  682. package/src/memory/facts.ts +0 -248
  683. package/src/memory/graph.ts +0 -103
  684. package/src/memory/health.test.ts +0 -130
  685. package/src/memory/health.ts +0 -74
  686. package/src/memory/maintainer.ts +0 -272
  687. package/src/memory/maintenance.test.ts +0 -176
  688. package/src/memory/maintenance.ts +0 -518
  689. package/src/memory/migrate.ts +0 -79
  690. package/src/memory/operations.ts +0 -150
  691. package/src/memory/proposals.test.ts +0 -168
  692. package/src/memory/proposals.ts +0 -584
  693. package/src/memory/recall.test.ts +0 -115
  694. package/src/memory/recall.ts +0 -278
  695. package/src/memory/references.ts +0 -77
  696. package/src/memory/runContext.ts +0 -93
  697. package/src/memory/secrets.ts +0 -6
  698. package/src/memory/store.test.ts +0 -66
  699. package/src/memory/store.ts +0 -385
  700. package/src/memory/wiki.test.ts +0 -47
  701. package/src/memory/wiki.ts +0 -422
  702. package/src/memory/wikiIndex.test.ts +0 -88
  703. package/src/memory/wikiIndex.ts +0 -116
  704. package/src/plugins/api.ts +0 -181
  705. package/src/plugins/attachments.test.ts +0 -84
  706. package/src/plugins/attachments.ts +0 -141
  707. package/src/plugins/builtin.ts +0 -82
  708. package/src/plugins/catalogue.test.ts +0 -254
  709. package/src/plugins/catalogue.ts +0 -251
  710. package/src/plugins/cli.ts +0 -184
  711. package/src/plugins/discover.ts +0 -151
  712. package/src/plugins/firstParty.test.ts +0 -143
  713. package/src/plugins/firstParty.ts +0 -129
  714. package/src/plugins/hooks.test.ts +0 -250
  715. package/src/plugins/hooks.ts +0 -239
  716. package/src/plugins/identity.ts +0 -37
  717. package/src/plugins/install.test.ts +0 -107
  718. package/src/plugins/install.ts +0 -106
  719. package/src/plugins/inventory.ts +0 -123
  720. package/src/plugins/manifest.ts +0 -76
  721. package/src/plugins/plugins.test.ts +0 -205
  722. package/src/plugins/plugins.ts +0 -189
  723. package/src/plugins/proposal.ts +0 -121
  724. package/src/plugins/runtime.test.ts +0 -40
  725. package/src/plugins/runtime.ts +0 -82
  726. package/src/plugins/trust.ts +0 -142
  727. package/src/plugins/types.ts +0 -149
  728. package/src/prompt/compile.test.ts +0 -261
  729. package/src/prompt/compile.ts +0 -732
  730. package/src/server/methods.ts +0 -349
  731. package/src/server/remote.ts +0 -77
  732. package/src/server/rpc.ts +0 -116
  733. package/src/server/serve.ts +0 -28
  734. package/src/server/server.test.ts +0 -174
  735. package/src/sessions/approvals.ts +0 -118
  736. package/src/sessions/contracts.ts +0 -336
  737. package/src/sessions/conversation.test.ts +0 -177
  738. package/src/sessions/extensionSession.test.ts +0 -74
  739. package/src/sessions/extensionUi.test.ts +0 -65
  740. package/src/sessions/extensionUi.ts +0 -102
  741. package/src/sessions/history.ts +0 -51
  742. package/src/sessions/lineageJoin.ts +0 -75
  743. package/src/sessions/policy.ts +0 -36
  744. package/src/sessions/pricing.ts +0 -60
  745. package/src/sessions/questionBatches.test.ts +0 -110
  746. package/src/sessions/reasoningSummaries.ts +0 -59
  747. package/src/sessions/registry.ts +0 -381
  748. package/src/sessions/runIndex.ts +0 -99
  749. package/src/sessions/runStore.test.ts +0 -152
  750. package/src/sessions/runStore.ts +0 -332
  751. package/src/sessions/runner.ts +0 -604
  752. package/src/sessions/runtimeResources.test.ts +0 -61
  753. package/src/sessions/sessions.test.ts +0 -549
  754. package/src/sessions/sessions.ts +0 -339
  755. package/src/skills/registry.test.ts +0 -104
  756. package/src/skills/registry.ts +0 -413
  757. package/src/terminal/accountsMenu.test.ts +0 -225
  758. package/src/terminal/accountsMenu.ts +0 -382
  759. package/src/terminal/cli.ts +0 -149
  760. package/src/terminal/client.ts +0 -74
  761. package/src/terminal/control.test.ts +0 -23
  762. package/src/terminal/control.ts +0 -23
  763. package/src/terminal/controller.ts +0 -291
  764. package/src/terminal/hubMenu.ts +0 -24
  765. package/src/terminal/launch.test.ts +0 -25
  766. package/src/terminal/launch.ts +0 -48
  767. package/src/terminal/piExtension.lifecycle.test.ts +0 -55
  768. package/src/terminal/piExtension.ts +0 -259
  769. package/src/terminal/pluginControl.test.ts +0 -146
  770. package/src/terminal/pluginMenu.ts +0 -112
  771. package/src/terminal/socket.test.ts +0 -71
  772. package/src/terminal/socket.ts +0 -232
  773. package/src/terminal/standalone.test.ts +0 -167
  774. package/src/terminal/standalone.ts +0 -153
  775. package/src/terminal/terminal.test.ts +0 -399
  776. package/src/terminal/terminals.ts +0 -553
  777. package/src/terminal/tui/application.test.ts +0 -114
  778. package/src/terminal/tui/application.ts +0 -491
  779. package/src/terminal/tui/commands.test.ts +0 -218
  780. package/src/terminal/tui/commands.ts +0 -361
  781. package/src/terminal/tui/dialogs.ts +0 -301
  782. package/src/terminal/tui/editor.test.ts +0 -84
  783. package/src/terminal/tui/editor.ts +0 -79
  784. package/src/terminal/tui/keybindings.test.ts +0 -22
  785. package/src/terminal/tui/keybindings.ts +0 -50
  786. package/src/terminal/tui/piAdapter.ts +0 -62
  787. package/src/terminal/tui/presentation.test.ts +0 -79
  788. package/src/terminal/tui/questions.test.ts +0 -41
  789. package/src/terminal/tui/questions.ts +0 -47
  790. package/src/terminal/tui/runtime.socket.test.ts +0 -104
  791. package/src/terminal/tui/runtime.test.ts +0 -215
  792. package/src/terminal/tui/runtime.ts +0 -388
  793. package/src/terminal/tui/sessionUi.ts +0 -24
  794. package/src/terminal/tui/settings.test.ts +0 -150
  795. package/src/terminal/tui/settings.ts +0 -188
  796. package/src/terminal/tui/status.test.ts +0 -70
  797. package/src/terminal/tui/status.ts +0 -109
  798. package/src/terminal/tui/theme.ts +0 -174
  799. package/src/terminal/tui/tools.test.ts +0 -145
  800. package/src/terminal/tui/tools.ts +0 -142
  801. package/src/terminal/tui/transcript.test.ts +0 -25
  802. package/src/terminal/tui/transcript.ts +0 -124
  803. package/src/terminal/tui/ui.test.ts +0 -313
  804. package/src/terminal/tui/ui.ts +0 -166
  805. package/src/terminal/tui/welcome.ts +0 -102
  806. package/src/tools/askUser.test.ts +0 -69
  807. package/src/tools/askUser.ts +0 -59
  808. package/src/tools/definitions.ts +0 -187
  809. package/src/tools/maintenance.ts +0 -24
  810. package/src/tools/memoryTools.ts +0 -22
  811. package/src/tools/pluginPropose.ts +0 -41
  812. package/src/tools/registryWrite.test.ts +0 -101
  813. package/src/tools/registryWrite.ts +0 -182
  814. package/src/tools/spawnSubagent.ts +0 -92
  815. package/src/tools/types.ts +0 -39
  816. package/src/web/safeRequest.ts +0 -171
  817. package/src/web/text.ts +0 -53
  818. package/src/web/tools.ts +0 -134
  819. package/src/web/web.test.ts +0 -141
@@ -0,0 +1,383 @@
1
+ // One `pi` command running in a terminal, as the harness sees it. The terminal itself belongs
2
+ // to whoever embeds the harness; this follows the native process through its extension's
3
+ // telemetry (never by reading the screen), turns each native turn into a run, and answers the
4
+ // extension's questions about policy, approvals, and what to do next.
5
+ import { createHash, randomUUID } from 'node:crypto';
6
+ import { HarnessError } from "../core/errors.js";
7
+ import { runStatusSchema } from "../sessions/contracts.js";
8
+ import { briefTitle } from "../sessions/subagents.js";
9
+ import { SubagentMonitor } from "./subagentMonitor.js";
10
+ const READY_TIMEOUT_MS = 90_000;
11
+ const ACK_TIMEOUT_MS = 25_000;
12
+ export class TerminalController {
13
+ hooks;
14
+ run = null;
15
+ pending = new Map();
16
+ subagents = new SubagentMonitor();
17
+ ready = false;
18
+ disposed = false;
19
+ dirty = false;
20
+ multilineDraft = false;
21
+ startupError = null;
22
+ startupPhase = 'Waiting for the native extension';
23
+ delivery = null;
24
+ nativeId;
25
+ seen = new Map();
26
+ commands = [];
27
+ constructor(hooks) {
28
+ this.hooks = hooks;
29
+ this.nativeId = hooks.nativeSessionId;
30
+ }
31
+ get nativeSessionId() {
32
+ return this.nativeId;
33
+ }
34
+ get activeRun() {
35
+ return this.run && !this.run.finished ? this.run : null;
36
+ }
37
+ state() {
38
+ return { ready: this.ready, dirty: this.dirty, active: !!this.activeRun || !!this.delivery };
39
+ }
40
+ requestId(nativeId) {
41
+ return createHash('sha256').update(`${this.hooks.sessionId}:${this.run?.runId}:${nativeId}`).digest('hex');
42
+ }
43
+ begin(nativeTurnId, text) {
44
+ if (this.startupError)
45
+ throw new Error(this.startupError);
46
+ this.dirty = false;
47
+ this.multilineDraft = false;
48
+ if (this.run && !this.run.finished)
49
+ return this.run;
50
+ const delivery = this.delivery;
51
+ if (delivery && text && delivery.text !== text)
52
+ throw new Error('The native prompt did not match the reserved delivery. Inspect the terminal before continuing.');
53
+ const run = this.hooks.begin({ reservedRunId: delivery?.runId ?? null, nativeTurnId, text });
54
+ this.run = run;
55
+ this.subagents.begin(run.runId);
56
+ run.onInterrupt(() => void this.commands.push({ type: 'interrupt' }));
57
+ if (text)
58
+ run.emit('message.completed', { messageId: nativeTurnId, role: 'user', text });
59
+ delivery?.resolve();
60
+ this.delivery = null;
61
+ return run;
62
+ }
63
+ finish(outcome, message) {
64
+ const runId = this.run?.runId;
65
+ this.run?.finish(outcome, message ? { code: 'terminal_attention', message } : undefined);
66
+ this.subagents.clear(runId);
67
+ this.run = null;
68
+ this.seen.clear();
69
+ this.pending.clear();
70
+ }
71
+ /** Hands the native process an instruction and waits until it acknowledges the prompt. */
72
+ async send(runId, text) {
73
+ if (this.disposed)
74
+ throw new HarnessError('terminal_not_ready', 'Reopen the terminal before sending instructions.');
75
+ if (this.activeRun || this.delivery)
76
+ throw new HarnessError('session_busy', 'This terminal has an active task or delivery.');
77
+ const deadline = Date.now() + READY_TIMEOUT_MS;
78
+ while (!this.ready && !this.startupError && !this.disposed && Date.now() < deadline)
79
+ await new Promise((resolve) => setTimeout(resolve, 50));
80
+ if (this.disposed)
81
+ throw new HarnessError('terminal_not_ready', 'The terminal stopped during initialization.');
82
+ if (this.startupError)
83
+ throw new HarnessError('terminal_not_ready', this.startupError);
84
+ if (!this.ready)
85
+ throw new HarnessError('terminal_not_ready', `The native telemetry handshake is missing (${this.startupPhase}). Inspect the terminal sign-in or trust screen.`);
86
+ if (this.dirty)
87
+ throw new HarnessError('terminal_has_draft', 'The terminal contains user input. Submit or clear it before handing back control.');
88
+ let timer;
89
+ const ack = new Promise((resolve, reject) => {
90
+ timer = setTimeout(() => reject(new HarnessError('delivery_uncertain', 'The native prompt acknowledgement was not received. Inspect the terminal; this instruction will not be resent.')), ACK_TIMEOUT_MS);
91
+ this.delivery = { runId, text, resolve, reject };
92
+ });
93
+ // Delivery can fail while the native process is still starting the turn. Observe it immediately.
94
+ void ack.catch(() => { });
95
+ try {
96
+ this.commands.push({ type: 'send', text });
97
+ await ack;
98
+ }
99
+ catch (error) {
100
+ this.ready = false;
101
+ this.startupError = error instanceof Error ? error.message : String(error);
102
+ this.delivery = null;
103
+ this.commands.length = 0;
104
+ this.commands.push({ type: 'interrupt' });
105
+ this.finish('failed', this.startupError);
106
+ throw error;
107
+ }
108
+ finally {
109
+ clearTimeout(timer);
110
+ }
111
+ }
112
+ /** What the person typed into the terminal, so an instruction is never sent over their draft. */
113
+ onInput(data) {
114
+ if (!this.ready || this.activeRun || data === '\u0003')
115
+ return;
116
+ if (data.includes('\n') || data.includes('\r'))
117
+ this.multilineDraft = true;
118
+ this.dirty = data !== '\u0015' || this.multilineDraft;
119
+ }
120
+ /** The native process hung up while it was waiting for a decision. */
121
+ disconnected() {
122
+ if (this.disposed)
123
+ return;
124
+ this.ready = false;
125
+ this.commands.push({ type: 'interrupt' });
126
+ this.finish('failed', 'The native decision callback disconnected. Inspect the terminal before continuing.');
127
+ }
128
+ /** Project registry-owned questions, including grouped requests, into the terminal inbox. */
129
+ observe(event, descendant = false) {
130
+ if (this.disposed || !this.activeRun || (!descendant && event.runId !== this.activeRun.runId))
131
+ return;
132
+ if (event.type === 'question.requested') {
133
+ const payload = event.payload;
134
+ this.pending.set(String(payload.questionId), { ...payload, type: 'question', requestId: payload.questionId, runId: event.runId });
135
+ }
136
+ else if (descendant && event.type === 'approval.requested') {
137
+ const payload = event.payload;
138
+ if (!payload.automatic)
139
+ this.pending.set(String(payload.approvalId), { ...payload, type: 'approval', requestId: payload.approvalId, runId: event.runId });
140
+ }
141
+ else if (event.type === 'approval.resolved') {
142
+ this.pending.delete(String(event.payload.approvalId));
143
+ }
144
+ else if (event.type === 'question.answered') {
145
+ this.pending.delete(String(event.payload.questionId));
146
+ }
147
+ }
148
+ /** A child event that belongs to the active terminal parent run. */
149
+ observeSubagent(parentRunId, run, event, profile = null) {
150
+ if (this.disposed || this.activeRun?.runId !== parentRunId || run.relation !== 'subagent')
151
+ return;
152
+ this.subagents.observe(parentRunId, {
153
+ id: run.id,
154
+ parentRunId: run.parentRunId,
155
+ relation: 'subagent',
156
+ title: run.title ?? briefTitle(run.goal),
157
+ goal: run.goal,
158
+ status: runStatusSchema.parse(run.status),
159
+ startedAt: run.startedAt,
160
+ endedAt: run.endedAt,
161
+ profile
162
+ }, event);
163
+ }
164
+ /** Read-only child activity for the active run. */
165
+ subagentSnapshot() {
166
+ const run = this.activeRun;
167
+ return run ? this.subagents.snapshot(run.runId) : [];
168
+ }
169
+ /** The socket grants this interface only to the process that owns terminal input. */
170
+ async control(call, data) {
171
+ if (this.disposed)
172
+ throw new HarnessError('terminal_not_ready', 'This terminal has ended.');
173
+ if (call === 'terminal.draft') {
174
+ this.dirty = data.dirty === true;
175
+ this.multilineDraft = false;
176
+ return {};
177
+ }
178
+ if (call === 'terminal.pending')
179
+ return { requests: [...this.pending.values()] };
180
+ if (call === 'terminal.interrupt')
181
+ return this.activeRun && this.hooks.interrupt ? this.hooks.interrupt(this.activeRun.runId) : {};
182
+ if (call === 'terminal.policy') {
183
+ const run = this.activeRun;
184
+ if (!run || typeof data.tool !== 'string' || !data.tool)
185
+ throw new HarnessError('invalid_request', 'An active run and tool name are required.');
186
+ return this.hooks.policy(run, data.tool, data.args ?? {});
187
+ }
188
+ if (call === 'terminal.approval')
189
+ return this.requestNativeApproval(data);
190
+ if (call === 'terminal.answers' && this.hooks.answerQuestions) {
191
+ const run = this.activeRun;
192
+ const batchId = String(data.batchId ?? '');
193
+ const requests = [...this.pending.values()].filter(request => request.batchId === batchId);
194
+ if (!run || !batchId || !requests.length || !Array.isArray(data.answers))
195
+ throw new HarnessError('invalid_request', 'This question batch is no longer pending.');
196
+ this.hooks.answerQuestions(String(requests[0].runId ?? run.runId), batchId, data.answers);
197
+ return {};
198
+ }
199
+ const requestId = String(data.requestId ?? '');
200
+ const request = this.pending.get(requestId);
201
+ const run = this.activeRun;
202
+ if (!request || !run)
203
+ throw new HarnessError('invalid_request', 'This terminal decision is no longer pending.');
204
+ if (call === 'terminal.approve' && request.type === 'approval' && this.hooks.resolveApproval) {
205
+ if (data.decision !== 'approved' && data.decision !== 'denied')
206
+ throw new HarnessError('invalid_request', 'Choose approve or deny.');
207
+ const alwaysAllow = data.alwaysAllow === true;
208
+ if (alwaysAllow && request.rememberable !== true)
209
+ throw new HarnessError('invalid_request', 'This approval cannot be remembered for other sessions.');
210
+ let decision = data.decision;
211
+ if (decision === 'approved' && request.direct === true) {
212
+ const operation = request.operation;
213
+ const tool = typeof operation?.tool === 'string' ? operation.tool : '';
214
+ const current = await this.hooks.policy(run, tool, operation?.args ?? {});
215
+ if (!current.allowed && !current.requiresApproval)
216
+ decision = 'denied';
217
+ if (alwaysAllow && current.rememberable !== true) {
218
+ request.rememberable = false;
219
+ throw new HarnessError('invalid_request', 'This tool can no longer be allowed across sessions. Review the approval again.');
220
+ }
221
+ }
222
+ if (decision === 'approved' && alwaysAllow)
223
+ this.hooks.allowToolGlobally(String(request.target ?? ''));
224
+ this.hooks.resolveApproval(String(request.runId ?? run.runId), requestId, decision);
225
+ return {};
226
+ }
227
+ if (call === 'terminal.answer' && request.type === 'question' && this.hooks.answerQuestion) {
228
+ if (!data.answer || !Array.isArray(data.answer.selected))
229
+ throw new HarnessError('invalid_request', 'A question answer is required.');
230
+ this.hooks.answerQuestion(String(request.runId ?? run.runId), requestId, data.answer);
231
+ return {};
232
+ }
233
+ throw new HarnessError('unknown_method', `Unknown terminal control ${call}.`);
234
+ }
235
+ async requestNativeApproval(data) {
236
+ const run = this.activeRun;
237
+ const requestId = typeof data.requestId === 'string' ? data.requestId : '';
238
+ const tool = typeof data.tool === 'string' ? data.tool : '';
239
+ if (!run || !requestId || !tool)
240
+ throw new HarnessError('invalid_request', 'An active run, request id, and tool name are required.');
241
+ const args = data.args && typeof data.args === 'object' && !Array.isArray(data.args) ? data.args : {};
242
+ const policy = await this.hooks.policy(run, tool, args);
243
+ if (!policy.allowed && !policy.requiresApproval)
244
+ return { decision: 'denied' };
245
+ if (policy.allowed && !policy.requiresApproval)
246
+ return { decision: 'approved' };
247
+ const key = this.requestId(`approval:${requestId}`);
248
+ const existing = this.seen.get(key);
249
+ if (existing)
250
+ return { decision: await existing };
251
+ const action = JSON.stringify(args);
252
+ const operation = { tool, args };
253
+ const response = run.requestApproval({
254
+ requestId: key,
255
+ target: tool,
256
+ action,
257
+ operation,
258
+ rememberable: policy.rememberable === true,
259
+ standing: policy.standing
260
+ });
261
+ this.pending.set(key, {
262
+ type: 'approval', requestId: key, runId: run.runId, target: tool, action,
263
+ operation, rememberable: policy.rememberable === true, direct: true
264
+ });
265
+ this.seen.set(key, response);
266
+ try {
267
+ return { decision: await response };
268
+ }
269
+ finally {
270
+ this.pending.delete(key);
271
+ }
272
+ }
273
+ async accept(event, data) {
274
+ if (this.disposed)
275
+ throw new Error('This terminal controller was disposed.');
276
+ if (event !== 'poll')
277
+ this.hooks.telemetry(event);
278
+ if (event === 'startup') {
279
+ this.startupPhase = String(data.phase);
280
+ return {};
281
+ }
282
+ if (event === 'startupFailed') {
283
+ this.startupError = String(data.reason ?? 'The native extension could not initialize.');
284
+ this.ready = false;
285
+ this.finish('failed', this.startupError);
286
+ return {};
287
+ }
288
+ if (event === 'poll')
289
+ return { command: this.commands.shift() ?? null };
290
+ if (event === 'ready') {
291
+ if (!this.ready) {
292
+ this.dirty = false;
293
+ this.multilineDraft = false;
294
+ }
295
+ this.ready = true;
296
+ if (typeof data.nativeSessionId === 'string' && data.nativeSessionId) {
297
+ this.nativeId = data.nativeSessionId;
298
+ this.hooks.native(data.nativeSessionId);
299
+ }
300
+ return {};
301
+ }
302
+ if (event === 'begin') {
303
+ const run = this.begin(String(data.turnId ?? randomUUID()), String(data.text ?? ''));
304
+ return { runId: run.runId };
305
+ }
306
+ if (event === 'shutdown') {
307
+ this.ready = false;
308
+ this.finish('interrupted');
309
+ return {};
310
+ }
311
+ if (event === 'settled') {
312
+ this.finish(data.aborted ? 'interrupted' : data.error ? 'failed' : 'completed', data.error ? String(data.error) : undefined);
313
+ return {};
314
+ }
315
+ const run = this.run;
316
+ if (!run)
317
+ throw new Error('Native telemetry arrived without an active turn.');
318
+ if (event === 'policy')
319
+ return this.hooks.policy(run, String(data.tool), data.args ?? {});
320
+ if (event === 'questions') {
321
+ if (!Array.isArray(data.questions) || !data.questions.length || data.questions.length > 5)
322
+ throw new HarnessError('invalid_request', 'Ask between one and five questions.');
323
+ const questions = data.questions.map(question => ({ ...question, requestId: randomUUID() }));
324
+ return run.requestAnswers(questions);
325
+ }
326
+ if (event === 'approval' || event === 'question') {
327
+ const key = this.requestId(`${event}:${String(data.requestId ?? JSON.stringify(data))}`);
328
+ const existing = this.seen.get(key);
329
+ if (existing)
330
+ return event === 'approval' ? { decision: await existing } : existing;
331
+ if (event === 'question') {
332
+ const summary = typeof data.summary === 'string' && data.summary.trim() ? data.summary.trim() : undefined;
333
+ const sketchMode = data.uiSketch === undefined ? {} : { uiSketch: data.uiSketch };
334
+ const response = run.requestAnswer({ requestId: key, ...(summary ? { summary } : {}), ...sketchMode, question: String(data.question ?? ''), options: data.options ?? [], multiSelect: !!data.multiSelect, allowText: true });
335
+ this.pending.set(key, { type: 'question', requestId: key, ...(summary ? { summary } : {}), ...sketchMode, question: String(data.question ?? ''), options: data.options ?? [], multiSelect: !!data.multiSelect });
336
+ this.seen.set(key, response);
337
+ return response.finally(() => this.pending.delete(key));
338
+ }
339
+ const response = run.requestApproval({
340
+ requestId: key,
341
+ target: String(data.target ?? 'Native action'),
342
+ action: String(data.action ?? '{}'),
343
+ operation: { tool: String(data.tool ?? data.target), args: data.args ?? {} },
344
+ rememberable: false
345
+ });
346
+ this.pending.set(key, { type: 'approval', requestId: key, target: String(data.target ?? 'Action'), action: String(data.action ?? '{}') });
347
+ this.seen.set(key, response);
348
+ try {
349
+ return { decision: await response };
350
+ }
351
+ finally {
352
+ this.pending.delete(key);
353
+ }
354
+ }
355
+ if (event === 'usage')
356
+ run.emit('usage.updated', data);
357
+ else if (event === 'checklist')
358
+ run.emit('checklist.updated', { items: data.items });
359
+ else if (event === 'file')
360
+ run.emit('file.changed', data);
361
+ else if (event === 'message')
362
+ run.emit('message.completed', { messageId: data.id ?? randomUUID(), role: data.role ?? 'assistant', text: String(data.text) });
363
+ else if (event === 'tool') {
364
+ run.emit(data.phase === 'start' ? 'tool.started' : 'tool.completed', {
365
+ toolCallId: String(data.id),
366
+ name: String(data.name),
367
+ ...(data.phase === 'start'
368
+ ? { summary: String(data.summary ?? ''), ...(typeof data.input === 'string' ? { input: data.input.slice(0, 24_000) } : {}) }
369
+ : { ok: data.ok !== false, ...(typeof data.durationMs === 'number' ? { durationMs: data.durationMs } : {}), ...(typeof data.resultChars === 'number' ? { resultChars: data.resultChars } : {}), ...(typeof data.output === 'string' ? { output: data.output.slice(0, 24_000) } : {}), ...(data.outputTruncated === true ? { outputTruncated: true } : {}) })
370
+ });
371
+ }
372
+ return {};
373
+ }
374
+ dispose() {
375
+ if (this.disposed)
376
+ return;
377
+ this.disposed = true;
378
+ this.ready = false;
379
+ this.delivery?.reject(new Error('The terminal stopped before prompt acknowledgement.'));
380
+ this.delivery = null;
381
+ this.finish('interrupted');
382
+ }
383
+ }
@@ -0,0 +1,10 @@
1
+ import type { HubOverview } from "../hub/schema.js";
2
+ import type { MenuCall, MenuUi } from "./pluginMenu.js";
3
+ type HubEntry = HubOverview['entries'][number];
4
+ /** What the person is told before installing: the entry, who published it, and what installing does. */
5
+ export declare function hubSummary(entry: HubEntry): string;
6
+ /** Asks, then installs exactly this version. A refusal or a failure is reported and changes nothing. */
7
+ export declare function installHubEntry(ui: MenuUi, call: MenuCall, entry: HubEntry): Promise<void>;
8
+ /** The terminal's catalog uses the same exact-version installer as embedding applications. */
9
+ export declare function runHubMenu(ui: MenuUi, call: MenuCall): Promise<void>;
10
+ export {};
@@ -0,0 +1,34 @@
1
+ /** What the person is told before installing: the entry, who published it, and what installing does. */
2
+ export function hubSummary(entry) {
3
+ return `${entry.description}\n\nPublisher: ${entry.publisher}\nLicense: ${entry.license}\nSource: ${entry.sourceUrl}\n\n${entry.delivery.kind === 'document' ? 'Saved as data for a compatible application. Nothing is created or enabled.' : 'Installed switched off. Code remains untrusted and approvals remain unchanged.'}`;
4
+ }
5
+ /** Asks, then installs exactly this version. A refusal or a failure is reported and changes nothing. */
6
+ export async function installHubEntry(ui, call, entry) {
7
+ if (!await ui.confirm(`Install ${entry.title} ${entry.version}?`, hubSummary(entry)))
8
+ return;
9
+ try {
10
+ const receipt = await call('hub.install', { id: entry.id, version: entry.version });
11
+ ui.notify(receipt.document ? 'Saved in this library for a compatible application.' : 'Installed, switched off. Use /plugins to review and attach it. Changes apply after restarting the session.', 'info');
12
+ }
13
+ catch (error) {
14
+ ui.notify(error instanceof Error ? error.message : String(error), 'error');
15
+ }
16
+ }
17
+ /** The terminal's catalog uses the same exact-version installer as embedding applications. */
18
+ export async function runHubMenu(ui, call) {
19
+ for (;;) {
20
+ const catalog = await call('hub.list');
21
+ const labels = catalog.entries.map((entry) => `${entry.title} · ${entry.category} · ${entry.id}@${entry.version}`);
22
+ const picked = await ui.select('Hub', [...labels, 'Refresh catalog', 'Done']);
23
+ if (picked === 'Refresh catalog') {
24
+ const refreshed = await call('hub.list', { refresh: true });
25
+ if (refreshed.error)
26
+ ui.notify(`${refreshed.error} Using ${refreshed.origin} content.`, 'warning');
27
+ continue;
28
+ }
29
+ const entry = catalog.entries[labels.indexOf(picked ?? '')];
30
+ if (!entry)
31
+ return;
32
+ await installHubEntry(ui, call, entry);
33
+ }
34
+ }
@@ -0,0 +1,5 @@
1
+ /** Files Pi's Git Bash shell and native Windows shells use to call Harness subcommands. */
2
+ export declare function terminalCommandFiles(platform: NodeJS.Platform, node: string, cli: string, name: string, mode: string): Array<{
3
+ name: string;
4
+ content: string;
5
+ }>;
@@ -0,0 +1,27 @@
1
+ function bashPath(path) {
2
+ const drive = /^([a-z]):[\\/](.*)$/i.exec(path);
3
+ if (drive)
4
+ return `/${drive[1].toLowerCase()}/${drive[2].replaceAll('\\', '/')}`;
5
+ if (path.startsWith('\\\\'))
6
+ return `//${path.slice(2).replaceAll('\\', '/')}`;
7
+ return path;
8
+ }
9
+ function shellQuote(value) {
10
+ return `'${value.replaceAll("'", "'\\''")}'`;
11
+ }
12
+ /** Files Pi's Git Bash shell and native Windows shells use to call Harness subcommands. */
13
+ export function terminalCommandFiles(platform, node, cli, name, mode) {
14
+ const shellNode = platform === 'win32' ? bashPath(node) : node;
15
+ const shellCli = platform === 'win32' ? bashPath(cli) : cli;
16
+ const files = [{
17
+ name,
18
+ content: `#!/bin/sh\nexec ${shellQuote(shellNode)} ${shellQuote(shellCli)} ${mode} "$@"\n`
19
+ }];
20
+ if (platform === 'win32') {
21
+ files.push({
22
+ name: `${name}.cmd`,
23
+ content: `@echo off\r\n"%XINGULAR_HARNESS_NODE%" "%XINGULAR_HARNESS_CLI%" ${mode} %*\r\nexit /b %ERRORLEVEL%\r\n`
24
+ });
25
+ }
26
+ return files;
27
+ }
@@ -0,0 +1,14 @@
1
+ export declare const LOG_READ_CHUNK_BYTES: number;
2
+ export interface HarnessLogInfo {
3
+ size: number | null;
4
+ }
5
+ export interface HarnessLogChunk {
6
+ data: string;
7
+ nextOffset: number;
8
+ }
9
+ /** Captures the byte length of the host-owned diagnostics file; callers never supply a path. */
10
+ export declare function harnessLogInfo(stateDir: string): HarnessLogInfo;
11
+ /** Reads one bounded range from the file size captured by `harnessLogInfo`. */
12
+ export declare function readHarnessLogChunk(stateDir: string, snapshotSize: number, offset: number): HarnessLogChunk;
13
+ /** Collects a fixed-size snapshot while keeping each socket reply bounded. */
14
+ export declare function readHarnessLogSnapshot(info: () => Promise<HarnessLogInfo>, chunk: (snapshotSize: number, offset: number) => Promise<HarnessLogChunk>): Promise<string>;
@@ -0,0 +1,59 @@
1
+ import { closeSync, openSync, readSync, statSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ export const LOG_READ_CHUNK_BYTES = 32 * 1024;
4
+ /** Captures the byte length of the host-owned diagnostics file; callers never supply a path. */
5
+ export function harnessLogInfo(stateDir) {
6
+ try {
7
+ const stat = statSync(join(stateDir, 'harness.log'));
8
+ if (!stat.isFile())
9
+ throw new Error('The Harness diagnostics path is not a regular file.');
10
+ return { size: stat.size };
11
+ }
12
+ catch (error) {
13
+ if (error.code === 'ENOENT')
14
+ return { size: null };
15
+ throw error;
16
+ }
17
+ }
18
+ /** Reads one bounded range from the file size captured by `harnessLogInfo`. */
19
+ export function readHarnessLogChunk(stateDir, snapshotSize, offset) {
20
+ if (!Number.isSafeInteger(snapshotSize) || snapshotSize < 0 || !Number.isSafeInteger(offset) || offset < 0 || offset >= snapshotSize) {
21
+ throw new Error('The Harness diagnostics snapshot range is invalid.');
22
+ }
23
+ const path = join(stateDir, 'harness.log');
24
+ const current = statSync(path);
25
+ if (!current.isFile() || current.size < snapshotSize)
26
+ throw new Error('The Harness diagnostics file changed while it was being read.');
27
+ const length = Math.min(LOG_READ_CHUNK_BYTES, snapshotSize - offset);
28
+ const buffer = Buffer.allocUnsafe(length);
29
+ const descriptor = openSync(path, 'r');
30
+ try {
31
+ const bytesRead = readSync(descriptor, buffer, 0, length, offset);
32
+ if (bytesRead !== length)
33
+ throw new Error('The Harness diagnostics file changed while it was being read.');
34
+ return { data: buffer.toString('base64'), nextOffset: offset + bytesRead };
35
+ }
36
+ finally {
37
+ closeSync(descriptor);
38
+ }
39
+ }
40
+ /** Collects a fixed-size snapshot while keeping each socket reply bounded. */
41
+ export async function readHarnessLogSnapshot(info, chunk) {
42
+ const { size } = await info();
43
+ if (size === null || size === 0)
44
+ return '';
45
+ if (!Number.isSafeInteger(size) || size < 0)
46
+ throw new Error('The Harness returned an invalid diagnostics file size.');
47
+ const buffers = [];
48
+ let offset = 0;
49
+ while (offset < size) {
50
+ const page = await chunk(size, offset);
51
+ const buffer = Buffer.from(page.data, 'base64');
52
+ if (!buffer.length || page.nextOffset !== offset + buffer.length || page.nextOffset > size) {
53
+ throw new Error('The Harness returned an invalid diagnostics file page.');
54
+ }
55
+ buffers.push(buffer);
56
+ offset = page.nextOffset;
57
+ }
58
+ return Buffer.concat(buffers).toString('utf8');
59
+ }
@@ -0,0 +1,28 @@
1
+ import { type TerminalSubagentActivity } from "../subagentMonitor.js";
2
+ export type SubagentTone = 'success' | 'warning' | 'error' | 'muted' | 'accent';
3
+ /** One roster row: status mark, profile, session name, checklist progress, in that order. */
4
+ export interface SubagentRowView {
5
+ id: string;
6
+ mark: string;
7
+ tone: SubagentTone;
8
+ /** The profile name, or `subagent` for a copy of the parent. */
9
+ profile: string;
10
+ /** The profile's colour name (PROP-0029); null for a copy of the parent. */
11
+ color: string | null;
12
+ title: string;
13
+ /** `n of m tasks`, or null when the child wrote no checklist. */
14
+ tasks: string | null;
15
+ }
16
+ export interface SubagentRosterView {
17
+ rows: SubagentRowView[];
18
+ /** `+N more · /subagents` when rows were left out. */
19
+ overflow: string | null;
20
+ }
21
+ export declare function subagentTasks(checklist: TerminalSubagentActivity['checklist']): string | null;
22
+ /**
23
+ * The compact live roster shown under the status line: active children first, at most three
24
+ * rows. The session name is cut first when the terminal is narrow.
25
+ */
26
+ export declare function subagentRoster(items: readonly TerminalSubagentActivity[], width: number, frame?: string): SubagentRosterView | null;
27
+ /** A row as plain text, the way it reads on screen. */
28
+ export declare function subagentRowText(row: SubagentRowView): string;
@@ -0,0 +1,52 @@
1
+ import { stripTerminalSequences, truncateToWidth, visibleWidth } from '@earendil-works/pi-tui';
2
+ import { ACTIVE_SUBAGENT_STATUSES } from "../subagentMonitor.js";
3
+ import { getWorkingSpinnerFrames } from "../tui/workingStatus.js";
4
+ const MAX_VISIBLE_ROWS = 3;
5
+ const GAP = ' ';
6
+ /** Cuts plain text to a width; the cut adds no styling codes. */
7
+ function cut(text, width) {
8
+ return stripTerminalSequences(truncateToWidth(text, width, '…'));
9
+ }
10
+ function safe(text) {
11
+ return stripTerminalSequences(text).replace(/[\x00-\x1f\x7f]/g, ' ').replace(/\s+/g, ' ').trim();
12
+ }
13
+ function mark(status, frame) {
14
+ switch (status) {
15
+ case 'completed': return { mark: '✓', tone: 'success' };
16
+ case 'failed': return { mark: '✕', tone: 'error' };
17
+ case 'interrupted': return { mark: '!', tone: 'muted' };
18
+ case 'queued': return { mark: '○', tone: 'muted' };
19
+ case 'waiting_for_approval':
20
+ case 'waiting_for_input': return { mark: '●', tone: 'accent' };
21
+ case 'running': return { mark: frame, tone: 'warning' };
22
+ }
23
+ }
24
+ export function subagentTasks(checklist) {
25
+ return checklist && checklist.total > 0 ? `${checklist.done} of ${checklist.total} tasks` : null;
26
+ }
27
+ /**
28
+ * The compact live roster shown under the status line: active children first, at most three
29
+ * rows. The session name is cut first when the terminal is narrow.
30
+ */
31
+ export function subagentRoster(items, width, frame = getWorkingSpinnerFrames()[0] ?? '') {
32
+ if (!items.length || width < 1)
33
+ return null;
34
+ const ordered = [...items].sort((left, right) => {
35
+ const active = Number(ACTIVE_SUBAGENT_STATUSES.has(right.status)) - Number(ACTIVE_SUBAGENT_STATUSES.has(left.status));
36
+ return active || left.startedAt.localeCompare(right.startedAt) || left.id.localeCompare(right.id);
37
+ });
38
+ const rows = ordered.slice(0, MAX_VISIBLE_ROWS).map((item) => {
39
+ const status = mark(item.status, frame);
40
+ const profile = cut(safe(item.profile?.name ?? '') || 'subagent', Math.max(1, Math.min(24, width - 2)));
41
+ const tasks = subagentTasks(item.checklist);
42
+ const used = 2 + visibleWidth(profile) + GAP.length + (tasks ? GAP.length + tasks.length : 0);
43
+ const title = cut(safe(item.title) || 'Subagent', Math.max(1, width - used));
44
+ return { id: item.id, mark: status.mark, tone: status.tone, profile, color: item.profile?.color ?? null, title, tasks };
45
+ });
46
+ const overflow = ordered.length - rows.length;
47
+ return { rows, overflow: overflow > 0 ? cut(`+${overflow} more · /subagents`, width) : null };
48
+ }
49
+ /** A row as plain text, the way it reads on screen. */
50
+ export function subagentRowText(row) {
51
+ return [`${row.mark} ${row.profile}`, row.title, row.tasks].filter(Boolean).join(GAP);
52
+ }
@@ -0,0 +1,6 @@
1
+ import type { AgentSession, ExtensionAPI } from '@earendil-works/pi-coding-agent';
2
+ export interface TerminalPlanRunState {
3
+ active: boolean;
4
+ allowedTools: ReadonlySet<string>;
5
+ }
6
+ export default function (pi: ExtensionAPI, planRun?: TerminalPlanRunState, getSession?: () => AgentSession): Promise<void>;