@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,287 @@
1
+ // The session socket: how a process the harness did not start in-process (the `pi` command in
2
+ // a terminal, with its extension and the `xagent-wiki` / `xagent-mcp` commands) reaches the
3
+ // session it belongs to. Owner-only Unix socket (a named pipe on Windows), newline-delimited JSON.
4
+ // A connection carries one request unless the request asks to `keep` it open, in which case the
5
+ // reply leaves it open for the next request. Each terminal session holds a random token bound to
6
+ // its caller, its connected-apps grant, and its controller; the token stops working when the
7
+ // terminal ends.
8
+ import { randomBytes } from 'node:crypto';
9
+ import { chmodSync, mkdirSync, readdirSync, rmSync, statSync } from 'node:fs';
10
+ import { createServer } from 'node:net';
11
+ import { tmpdir } from 'node:os';
12
+ import { dirname, join } from 'node:path';
13
+ import { log } from "../core/bus.js";
14
+ import { HarnessError, toErrorShape } from "../core/errors.js";
15
+ import { newId } from "../core/fs.js";
16
+ const MAX_REQUEST_BYTES = 1024 * 1024;
17
+ /** macOS refuses a socket path longer than 103 bytes. */
18
+ const MAX_SOCKET_PATH = 100;
19
+ /**
20
+ * Each Harness process listens on its own path. Windows has no socket files for Node's `net`: it
21
+ * listens on a named pipe in a machine-wide namespace, and a random name keeps another local process
22
+ * from guessing it. On Unix the file is named for this process, because several Harness processes
23
+ * may share one state folder: closing a server removes its socket file, so a shared name would let
24
+ * one process delete, and the next one take over, the path another's sessions still call. The token
25
+ * still decides what a caller may do.
26
+ */
27
+ export function socketPath(stateDir) {
28
+ if (process.platform === 'win32')
29
+ return `\\\\.\\pipe\\xingular-harness-${randomBytes(12).toString('hex')}`;
30
+ const path = join(stateDir, 'run', `harness-${process.pid}-${randomBytes(8).toString('hex')}.sock`);
31
+ if (Buffer.byteLength(path) <= MAX_SOCKET_PATH)
32
+ return path;
33
+ return join(tmpdir(), `xh-${process.pid}-${randomBytes(8).toString('hex')}.sock`);
34
+ }
35
+ const OWN_SOCKET = /^harness-(\d+)-[0-9a-f]+\.sock$/;
36
+ /** Removes socket files left in `folder` by Harness processes that are no longer running. */
37
+ function pruneDeadSockets(folder) {
38
+ let names;
39
+ try {
40
+ names = readdirSync(folder);
41
+ }
42
+ catch {
43
+ return;
44
+ }
45
+ for (const name of names) {
46
+ const pid = Number(OWN_SOCKET.exec(name)?.[1]);
47
+ if (!pid || pid === process.pid || isRunning(pid))
48
+ continue;
49
+ rmSync(join(folder, name), { force: true });
50
+ }
51
+ }
52
+ function isRunning(pid) {
53
+ try {
54
+ process.kill(pid, 0);
55
+ return true;
56
+ }
57
+ catch (error) {
58
+ return error.code === 'EPERM';
59
+ }
60
+ }
61
+ function alternateSocketPath(path) {
62
+ const candidate = join(dirname(path), `harness-${process.pid}-${randomBytes(8).toString('hex')}.sock`);
63
+ return Buffer.byteLength(candidate) <= MAX_SOCKET_PATH ? candidate : join(tmpdir(), `xh-${process.pid}-${randomBytes(8).toString('hex')}.sock`);
64
+ }
65
+ /** A named pipe has no folder, file mode, or owner to check or clean up. */
66
+ const isPipePath = (path) => path.startsWith('\\\\.\\pipe\\');
67
+ /** Names the folder and the user when the operating system refuses the socket, so the cause shows. */
68
+ function refusedBind(path, error) {
69
+ const code = error?.code;
70
+ if (code !== 'EACCES' && code !== 'EPERM')
71
+ return error;
72
+ if (isPipePath(path)) {
73
+ return new HarnessError('session_socket_denied', `The session pipe ${path} could not be created (${code}).`, 'Start the harness again from your own user session. If it keeps failing, report this code and the Windows version.');
74
+ }
75
+ let folder;
76
+ try {
77
+ const stat = statSync(dirname(path));
78
+ folder = `${dirname(path)} is owned by uid ${stat.uid} with mode ${(stat.mode & 0o777).toString(8)}`;
79
+ }
80
+ catch {
81
+ folder = `${dirname(path)} could not be read`;
82
+ }
83
+ const uid = process.getuid?.() ?? 'unknown';
84
+ return new HarnessError('session_socket_denied', `The session socket ${path} could not be created (${code}). ${folder}; this process runs as uid ${uid}.`, 'Run the harness from your own terminal, as the user that owns its state folder, or choose a state folder you own with --state.');
85
+ }
86
+ export class SessionSocket {
87
+ handlers;
88
+ server = null;
89
+ listening = null;
90
+ socketPathValue;
91
+ grants = new Map();
92
+ /**
93
+ * A second key per token, handed out once. The token is in the session's environment, where a
94
+ * command the model runs can read it; this key is claimed by the session's extension as it
95
+ * loads, before any model turn, and kept in its memory only.
96
+ */
97
+ controls = new Map();
98
+ clients = new Set();
99
+ constructor(path, handlers) {
100
+ this.handlers = handlers;
101
+ this.socketPathValue = path;
102
+ }
103
+ get path() { return this.socketPathValue; }
104
+ issue(grant) {
105
+ const token = `${newId()}${newId()}`.replaceAll('-', '');
106
+ this.grants.set(token, grant);
107
+ return token;
108
+ }
109
+ revoke(token) {
110
+ this.grants.delete(token);
111
+ this.controls.delete(token);
112
+ }
113
+ revokeSession(sessionId) {
114
+ for (const [token, grant] of this.grants)
115
+ if (grant.sessionId === sessionId)
116
+ this.revoke(token);
117
+ }
118
+ /** Runs one request line and returns the reply line's object. */
119
+ async handle(line, connection) {
120
+ try {
121
+ let request;
122
+ try {
123
+ request = JSON.parse(line);
124
+ }
125
+ catch {
126
+ throw new HarnessError('invalid_request', 'The request is not JSON.');
127
+ }
128
+ connection?.keep?.(request.keep === true);
129
+ const token = typeof request.token === 'string' ? request.token : '';
130
+ const grant = this.grants.get(token);
131
+ if (!grant)
132
+ throw new HarnessError('unauthorized', 'This session token is not valid. It ends when its terminal session ends.');
133
+ if (typeof request.event === 'string') {
134
+ if (!grant.terminal)
135
+ throw new HarnessError('unknown_method', 'This session has no terminal controller.');
136
+ connection?.waiting(grant);
137
+ try {
138
+ return { result: (await grant.terminal.accept(request.event, (request.data ?? {}))) ?? {} };
139
+ }
140
+ finally {
141
+ connection?.waiting(null);
142
+ }
143
+ }
144
+ const call = typeof request.call === 'string' ? request.call : '';
145
+ const params = (request.params && typeof request.params === 'object' ? request.params : {});
146
+ if (['wiki.', 'skill.', 'recall.', 'trajectory.'].some((prefix) => call.startsWith(prefix)))
147
+ return { result: this.handlers.memory(grant.caller(), call, params) };
148
+ if (call === 'tools.list' && !grant.broker)
149
+ return { result: { tools: [] } };
150
+ if (['mcp.', 'tools.'].some((prefix) => call.startsWith(prefix))) {
151
+ if (!grant.broker)
152
+ throw new HarnessError('mcp_unauthorized', 'Connected apps are not available to this session.');
153
+ return { result: await this.handlers.apps(grant.broker, call, params) };
154
+ }
155
+ if (call === 'control.claim') {
156
+ if (this.controls.has(token))
157
+ throw new HarnessError('unauthorized', "This session's control key was already claimed.");
158
+ const key = `${newId()}${newId()}`.replaceAll('-', '');
159
+ this.controls.set(token, key);
160
+ return { result: { key } };
161
+ }
162
+ if (call.startsWith('terminal.') && grant.terminal?.control) {
163
+ const key = this.controls.get(token);
164
+ if (!key || request.control !== key)
165
+ throw new HarnessError('unauthorized', 'Only a person at this terminal can answer decisions or change its draft state.');
166
+ return { result: await grant.terminal.control(call, params) };
167
+ }
168
+ if ((call.startsWith('plugins.') || call.startsWith('hub.')) && this.handlers.plugins) {
169
+ const key = this.controls.get(token);
170
+ return { result: await this.handlers.plugins(grant, call, params, key !== undefined && request.control === key) };
171
+ }
172
+ if (call.startsWith('accounts.') && this.handlers.accounts) {
173
+ const key = this.controls.get(token);
174
+ return { result: await this.handlers.accounts(grant, call, params, key !== undefined && request.control === key) };
175
+ }
176
+ throw new HarnessError('unknown_method', `Unknown call ${call}.`);
177
+ }
178
+ catch (error) {
179
+ return { error: toErrorShape(error) };
180
+ }
181
+ }
182
+ serve(client) {
183
+ let buffer = '';
184
+ let busy = false;
185
+ let ended = false;
186
+ let waiting = null;
187
+ this.clients.add(client);
188
+ client.on('error', () => { });
189
+ client.once('close', () => {
190
+ this.clients.delete(client);
191
+ // A decision the native process was waiting on can no longer reach it.
192
+ waiting?.terminal?.disconnected();
193
+ });
194
+ // Requests on one connection run one at a time, in order.
195
+ const next = () => {
196
+ if (busy || ended)
197
+ return;
198
+ const newline = buffer.indexOf('\n');
199
+ if (newline < 0)
200
+ return;
201
+ const line = buffer.slice(0, newline);
202
+ buffer = buffer.slice(newline + 1);
203
+ busy = true;
204
+ client.pause();
205
+ let keep = false;
206
+ void this.handle(line, { waiting: (grant) => void (waiting = grant), keep: (value) => void (keep = value) }).then((reply) => {
207
+ busy = false;
208
+ const text = `${JSON.stringify(reply)}\n`;
209
+ if (!keep || client.destroyed) {
210
+ ended = true;
211
+ client.end(text);
212
+ return;
213
+ }
214
+ client.write(text);
215
+ client.resume();
216
+ next();
217
+ });
218
+ };
219
+ client.on('data', (chunk) => {
220
+ buffer += chunk.toString('utf8');
221
+ if (Buffer.byteLength(buffer) > MAX_REQUEST_BYTES) {
222
+ client.destroy();
223
+ return;
224
+ }
225
+ next();
226
+ });
227
+ }
228
+ bind(path) {
229
+ return new Promise((resolve, reject) => {
230
+ const server = createServer((client) => this.serve(client));
231
+ server.once('error', reject);
232
+ server.listen(path, () => {
233
+ if (!isPipePath(path)) {
234
+ try {
235
+ chmodSync(path, 0o600);
236
+ }
237
+ catch (error) {
238
+ log('session socket permissions', error instanceof Error ? error.message : String(error));
239
+ }
240
+ }
241
+ this.server = server;
242
+ resolve();
243
+ });
244
+ });
245
+ }
246
+ /** Binds the usual path, or an instance-specific path if another Harness owns it. */
247
+ async bindAvailablePath() {
248
+ if (!isPipePath(this.path)) {
249
+ mkdirSync(dirname(this.path), { recursive: true, mode: 0o700 });
250
+ pruneDeadSockets(dirname(this.path));
251
+ }
252
+ try {
253
+ await this.bind(this.path);
254
+ }
255
+ catch (error) {
256
+ if (isPipePath(this.path) || error.code !== 'EADDRINUSE')
257
+ throw refusedBind(this.path, error);
258
+ this.socketPathValue = alternateSocketPath(this.path);
259
+ try {
260
+ await this.bind(this.path);
261
+ }
262
+ catch (alternateError) {
263
+ throw refusedBind(this.path, alternateError);
264
+ }
265
+ }
266
+ }
267
+ /** Binds the socket once; later calls wait for the same bind. */
268
+ listen() {
269
+ this.listening ??= this.bindAvailablePath().catch(error => {
270
+ this.listening = null;
271
+ throw error;
272
+ });
273
+ return this.listening;
274
+ }
275
+ async close() {
276
+ this.grants.clear();
277
+ const server = this.server;
278
+ this.server = null;
279
+ this.listening = null;
280
+ for (const client of this.clients)
281
+ client.destroy();
282
+ if (server)
283
+ await new Promise((resolve) => server.close(() => resolve()));
284
+ if (!isPipePath(this.path))
285
+ rmSync(this.path, { force: true });
286
+ }
287
+ }
@@ -0,0 +1,20 @@
1
+ import { spawn as nodeSpawn } from 'node:child_process';
2
+ import { type Harness, type HarnessOptions } from "../harness.js";
3
+ export interface StandalonePaths {
4
+ dataRoot: string;
5
+ stateDir: string;
6
+ /** `--worktree [name]`: start in a new managed worktree (true) or the named one. */
7
+ worktree?: string | true | null;
8
+ }
9
+ export interface StandaloneDependencies {
10
+ home?: string;
11
+ cwd?: string;
12
+ stdinIsTTY?: boolean;
13
+ stdoutIsTTY?: boolean;
14
+ createSessionId?: () => string;
15
+ createHarness?: (options: HarnessOptions) => Harness;
16
+ spawn?: typeof nodeSpawn;
17
+ }
18
+ export declare function standaloneArguments(argv: string[]): string[] | null;
19
+ export declare function parseStandaloneOptions(argv: string[], home?: string, cwd?: string): StandalonePaths;
20
+ export declare function runStandaloneTerminal(argv: string[], dependencies?: StandaloneDependencies): Promise<number>;
@@ -0,0 +1,186 @@
1
+ // The standalone host prepares an isolated Harness terminal and supervises its frontend.
2
+ import { spawn as nodeSpawn } from 'node:child_process';
3
+ import { createHash, randomUUID } from 'node:crypto';
4
+ import { appendFileSync } from 'node:fs';
5
+ import { homedir } from 'node:os';
6
+ import { isAbsolute, join, resolve } from 'node:path';
7
+ import { setLogSink } from "../core/bus.js";
8
+ import { DEFAULT_PRODUCT_NAME } from "../core/env.js";
9
+ import { createHarness } from "../harness.js";
10
+ export function standaloneArguments(argv) {
11
+ const command = argv[0];
12
+ if (!command || command.startsWith('-'))
13
+ return argv;
14
+ return command === 'terminal' ? argv.slice(1) : null;
15
+ }
16
+ export function parseStandaloneOptions(argv, home = homedir(), cwd = process.cwd()) {
17
+ const root = join(home, '.xingular-harness');
18
+ const paths = {
19
+ dataRoot: join(root, 'data'),
20
+ stateDir: join(root, 'state')
21
+ };
22
+ const given = new Set();
23
+ for (let index = 0; index < argv.length; index += 1) {
24
+ const argument = argv[index];
25
+ if (argument === '--worktree' || argument === '-w') {
26
+ const name = argv[index + 1];
27
+ if (name && !name.startsWith('-')) {
28
+ paths.worktree = name;
29
+ index += 1;
30
+ }
31
+ else
32
+ paths.worktree = true;
33
+ continue;
34
+ }
35
+ if (argument !== '--data' && argument !== '--state')
36
+ throw new Error(`Unknown standalone option: ${argument}`);
37
+ const value = argv[index + 1];
38
+ if (!value || value.startsWith('--'))
39
+ throw new Error(`${argument} needs a directory path.`);
40
+ paths[argument === '--data' ? 'dataRoot' : 'stateDir'] = resolve(cwd, value);
41
+ given.add(argument);
42
+ index += 1;
43
+ }
44
+ // A home that is not a folder path (for example HOME set to the word "HOME") would put the
45
+ // defaults, and the session socket, in whatever folder the command was started from.
46
+ if (!isAbsolute(home) && !(given.has('--data') && given.has('--state'))) {
47
+ throw new Error(`The home folder "${home}" is not an absolute path, so the default data and state folders cannot be placed. Set HOME to your home folder, or pass --data and --state with absolute folders.`);
48
+ }
49
+ return paths;
50
+ }
51
+ function processEnvironment(overrides) {
52
+ const environment = { ...process.env };
53
+ for (const [name, value] of Object.entries(overrides)) {
54
+ if (value === null)
55
+ delete environment[name];
56
+ else
57
+ environment[name] = value;
58
+ }
59
+ return environment;
60
+ }
61
+ function exitCode(code, signal) {
62
+ if (code !== null)
63
+ return code;
64
+ if (signal === 'SIGINT')
65
+ return 130;
66
+ if (signal === 'SIGTERM')
67
+ return 143;
68
+ if (signal === 'SIGHUP')
69
+ return 129;
70
+ return 1;
71
+ }
72
+ function spawnError(error, launch) {
73
+ const code = error.code;
74
+ if (code !== 'ENOENT' && code !== 'EACCES' && code !== 'EPERM')
75
+ return error;
76
+ const problem = code === 'ENOENT' ? 'was not found' : `could not start (${code})`;
77
+ return new Error(`Could not start the Harness terminal. The Bun executable "${launch.program}" ${problem}; install Bun or set XINGULAR_HARNESS_BUN, then run npm run build:tui.`, { cause: error });
78
+ }
79
+ function spawnFrontend(launch, cwd, spawn = nodeSpawn) {
80
+ return new Promise((resolveExit, reject) => {
81
+ const child = spawn(launch.program, launch.args, {
82
+ cwd,
83
+ env: processEnvironment(launch.env),
84
+ stdio: 'inherit'
85
+ });
86
+ let settled = false;
87
+ const cleanup = () => {
88
+ process.off('SIGINT', onInterrupt);
89
+ process.off('SIGTERM', onTerminate);
90
+ process.off('SIGHUP', onHangup);
91
+ };
92
+ const finish = (action) => {
93
+ if (settled)
94
+ return;
95
+ settled = true;
96
+ cleanup();
97
+ action();
98
+ };
99
+ // Ctrl+C is delivered to both processes in the foreground process group. Keep this host
100
+ // alive while the frontend handles it so the account credentials and harness socket are cleaned up.
101
+ const onInterrupt = () => undefined;
102
+ const onTerminate = () => {
103
+ child.kill('SIGTERM');
104
+ };
105
+ const onHangup = () => undefined;
106
+ process.on('SIGINT', onInterrupt);
107
+ process.on('SIGTERM', onTerminate);
108
+ process.on('SIGHUP', onHangup);
109
+ child.once('error', (error) => finish(() => reject(spawnError(error, launch))));
110
+ child.once('exit', (code, signal) => finish(() => resolveExit(exitCode(code, signal))));
111
+ });
112
+ }
113
+ /**
114
+ * `--worktree`: the named worktree of the repository in `cwd`, or a new managed one. Older managed
115
+ * worktrees beyond the kept number are pruned (unsaved work is kept as a snapshot).
116
+ */
117
+ async function enterWorktree(harness, cwd, wanted) {
118
+ const name = wanted === true ? undefined : wanted;
119
+ const existing = name ? (await harness.worktrees.list(cwd)).find((record) => record.name === name) : undefined;
120
+ if (existing)
121
+ return existing;
122
+ const created = await harness.worktrees.create({ repo: cwd, ...(name ? { name } : {}) });
123
+ process.stdout.write(`Working in worktree ${created.worktree.name} (${created.worktree.path}).\n`);
124
+ if (created.setup.state === 'untrusted')
125
+ process.stdout.write('This repository has a setup script you have not trusted; read .xharness/worktree-setup, then run: xagent worktree trust-setup\n');
126
+ if (created.setup.state === 'failed')
127
+ process.stdout.write(`The worktree setup script failed; see ${created.setup.log}.\n`);
128
+ await harness.worktrees.prune({ repo: cwd }).catch(() => undefined);
129
+ return created.worktree;
130
+ }
131
+ export async function runStandaloneTerminal(argv, dependencies = {}) {
132
+ if (!(dependencies.stdinIsTTY ?? process.stdin.isTTY) || !(dependencies.stdoutIsTTY ?? process.stdout.isTTY)) {
133
+ throw new Error('The interactive Harness terminal needs a TTY. Run it from a terminal, or use `xagent serve` for a host process.');
134
+ }
135
+ let cwd = resolve(dependencies.cwd ?? process.cwd());
136
+ const paths = parseStandaloneOptions(argv, dependencies.home, cwd);
137
+ const makeHarness = dependencies.createHarness ?? createHarness;
138
+ const harness = makeHarness({ dataRoot: paths.dataRoot, stateDir: paths.stateDir, productName: DEFAULT_PRODUCT_NAME });
139
+ const newSessionId = dependencies.createSessionId ?? randomUUID;
140
+ let current = { sessionId: newSessionId(), accountId: null, nativeSessionId: null };
141
+ // The frontend draws on this terminal, so the host's diagnostics go to a file the person can read instead.
142
+ const logFile = join(paths.stateDir, 'harness.log');
143
+ setLogSink((text) => {
144
+ try {
145
+ appendFileSync(logFile, `${new Date().toISOString()} ${text}\n`);
146
+ }
147
+ catch {
148
+ // Diagnostics are best effort; a full disk must not stop the terminal.
149
+ }
150
+ });
151
+ try {
152
+ await harness.ready;
153
+ if (harness.accounts.overview().accounts.length === 0)
154
+ harness.accounts.create('Default', 'subscription');
155
+ let worktreeId = null;
156
+ if (paths.worktree) {
157
+ const worktree = await enterWorktree(harness, cwd, paths.worktree);
158
+ cwd = worktree.path;
159
+ worktreeId = worktree.id;
160
+ }
161
+ for (;;) {
162
+ const sessionFolder = join(paths.dataRoot, 'sessions', 'terminal', createHash('sha256').update(cwd).digest('hex'));
163
+ const launch = await harness.terminals.prepare({ ...current, cwd, sessionFolder, ...(worktreeId ? { run: { worktreeId } } : {}) });
164
+ const code = await spawnFrontend(launch, cwd, dependencies.spawn);
165
+ // `/accounts` and `/worktree` ask for a switch and end the frontend. An account switch resumes
166
+ // the conversation; a folder switch starts a new one there.
167
+ const next = harness.terminals.takeRelaunch(current.sessionId);
168
+ if (!next)
169
+ return code;
170
+ if (next.cwd) {
171
+ process.stdout.write(`Opening ${next.cwd}.\n`);
172
+ cwd = next.cwd;
173
+ worktreeId = next.worktreeId ?? null;
174
+ }
175
+ else
176
+ process.stdout.write(`Switching this session to account ${harness.accounts.find(next.accountId).label}.\n`);
177
+ await harness.terminals.dispose(current.sessionId);
178
+ current = { sessionId: newSessionId(), accountId: next.accountId, nativeSessionId: next.nativeSessionId };
179
+ }
180
+ }
181
+ finally {
182
+ await harness.terminals.dispose(current.sessionId);
183
+ await harness.close();
184
+ setLogSink(null);
185
+ }
186
+ }
@@ -0,0 +1,38 @@
1
+ import type { RunEvent, RunStatus } from "../sessions/contracts.js";
2
+ /** The agent profile a child started from, as the roster shows it (PROP-0029). */
3
+ export interface TerminalSubagentProfile {
4
+ name: string;
5
+ color: string;
6
+ }
7
+ export interface TerminalSubagentRun {
8
+ id: string;
9
+ parentRunId: string | null;
10
+ relation: 'subagent';
11
+ /** The short name the parent gave the child (PROP-0030). */
12
+ title: string;
13
+ goal: string | null;
14
+ status: RunStatus;
15
+ startedAt: string;
16
+ endedAt: string | null;
17
+ profile?: TerminalSubagentProfile | null;
18
+ }
19
+ export interface TerminalSubagentActivity extends TerminalSubagentRun {
20
+ activity: string;
21
+ /** How far the child's own checklist is: counts only, never the items. */
22
+ checklist: {
23
+ done: number;
24
+ total: number;
25
+ } | null;
26
+ }
27
+ export declare const ACTIVE_SUBAGENT_STATUSES: Set<"queued" | "running" | "waiting_for_approval" | "waiting_for_input" | "interrupted" | "completed" | "failed">;
28
+ export declare function terminalSubagentDuration(activity: TerminalSubagentRun, now?: number): string;
29
+ export declare function terminalSubagentTone(status: RunStatus): 'success' | 'warning' | 'error' | 'muted';
30
+ /** Volatile, read-only activity projection for the active terminal parent run. */
31
+ export declare class SubagentMonitor {
32
+ private parentRunId;
33
+ private readonly activities;
34
+ begin(parentRunId: string): void;
35
+ observe(parentRunId: string, run: TerminalSubagentRun, event: RunEvent): void;
36
+ snapshot(parentRunId: string): TerminalSubagentActivity[];
37
+ clear(parentRunId?: string): void;
38
+ }
@@ -0,0 +1,121 @@
1
+ export const ACTIVE_SUBAGENT_STATUSES = new Set(['queued', 'running', 'waiting_for_approval', 'waiting_for_input']);
2
+ export function terminalSubagentDuration(activity, now = Date.now()) {
3
+ const start = Date.parse(activity.startedAt);
4
+ const end = activity.endedAt ? Date.parse(activity.endedAt) : now;
5
+ if (!Number.isFinite(start) || !Number.isFinite(end))
6
+ return '—';
7
+ const seconds = Math.max(0, Math.floor((end - start) / 1000));
8
+ if (seconds < 60)
9
+ return `${seconds}s`;
10
+ const minutes = Math.floor(seconds / 60);
11
+ if (minutes < 60)
12
+ return `${minutes}:${String(seconds % 60).padStart(2, '0')}`;
13
+ return `${Math.floor(minutes / 60)}h${String(minutes % 60).padStart(2, '0')}m`;
14
+ }
15
+ export function terminalSubagentTone(status) {
16
+ if (status === 'completed')
17
+ return 'success';
18
+ if (status === 'failed')
19
+ return 'error';
20
+ if (ACTIVE_SUBAGENT_STATUSES.has(status))
21
+ return 'warning';
22
+ return 'muted';
23
+ }
24
+ function statusActivity(status) {
25
+ switch (status) {
26
+ case 'queued': return 'Queued';
27
+ case 'waiting_for_approval': return 'Waiting for approval';
28
+ case 'waiting_for_input': return 'Waiting for input';
29
+ case 'completed': return 'Completed';
30
+ case 'failed': return 'Failed';
31
+ case 'interrupted': return 'Interrupted';
32
+ case 'running': return 'Working';
33
+ }
34
+ }
35
+ function payloadOf(event) {
36
+ return event.payload && typeof event.payload === 'object' ? event.payload : {};
37
+ }
38
+ function stringOf(value) {
39
+ return typeof value === 'string' && value.trim() ? value.trim() : undefined;
40
+ }
41
+ function latestTool(tools) {
42
+ return [...tools.values()].sort((left, right) => right.sequence - left.sequence)[0]?.text;
43
+ }
44
+ /** Volatile, read-only activity projection for the active terminal parent run. */
45
+ export class SubagentMonitor {
46
+ parentRunId = null;
47
+ activities = new Map();
48
+ begin(parentRunId) {
49
+ this.parentRunId = parentRunId;
50
+ this.activities.clear();
51
+ }
52
+ observe(parentRunId, run, event) {
53
+ if (this.parentRunId !== parentRunId || run.relation !== 'subagent')
54
+ return;
55
+ const row = this.activities.get(run.id) ?? {
56
+ id: run.id,
57
+ parentRunId: run.parentRunId,
58
+ relation: run.relation,
59
+ title: run.title,
60
+ goal: run.goal,
61
+ status: run.status,
62
+ startedAt: run.startedAt,
63
+ endedAt: run.endedAt,
64
+ activity: statusActivity(run.status),
65
+ checklist: null,
66
+ profile: run.profile ?? null,
67
+ tools: new Map(),
68
+ lastTool: null
69
+ };
70
+ row.parentRunId = run.parentRunId;
71
+ if (run.profile !== undefined)
72
+ row.profile = run.profile;
73
+ row.title = run.title;
74
+ row.goal = run.goal;
75
+ row.status = run.status;
76
+ row.startedAt = run.startedAt;
77
+ row.endedAt = run.endedAt;
78
+ const payload = payloadOf(event);
79
+ if (event.type === 'tool.started') {
80
+ const toolCallId = stringOf(payload.toolCallId);
81
+ const name = stringOf(payload.name) ?? 'Tool';
82
+ if (toolCallId)
83
+ row.tools.set(toolCallId, { sequence: event.sequence, text: name });
84
+ }
85
+ else if (event.type === 'tool.completed') {
86
+ const toolCallId = stringOf(payload.toolCallId);
87
+ const tool = toolCallId ? row.tools.get(toolCallId) : undefined;
88
+ if (tool && (!row.lastTool || tool.sequence >= row.lastTool.sequence))
89
+ row.lastTool = tool;
90
+ if (toolCallId)
91
+ row.tools.delete(toolCallId);
92
+ }
93
+ else if (event.type === 'message.delta') {
94
+ row.lastTool = null;
95
+ row.activity = 'Responding';
96
+ }
97
+ else if (event.type === 'checklist.updated') {
98
+ const items = Array.isArray(payload.items) ? payload.items : [];
99
+ row.checklist = items.length ? { done: items.filter(item => item?.status === 'completed').length, total: items.length } : null;
100
+ }
101
+ if (run.status !== 'running')
102
+ row.tools.clear();
103
+ row.activity = run.status === 'running'
104
+ ? latestTool(row.tools) ?? row.lastTool?.text ?? (event.type === 'message.delta' ? 'Responding' : 'Working')
105
+ : statusActivity(run.status);
106
+ this.activities.set(run.id, row);
107
+ }
108
+ snapshot(parentRunId) {
109
+ if (this.parentRunId !== parentRunId)
110
+ return [];
111
+ return [...this.activities.values()]
112
+ .sort((left, right) => left.startedAt.localeCompare(right.startedAt) || left.id.localeCompare(right.id))
113
+ .map(({ tools: _tools, lastTool: _lastTool, ...activity }) => activity);
114
+ }
115
+ clear(parentRunId) {
116
+ if (parentRunId && this.parentRunId !== parentRunId)
117
+ return;
118
+ this.parentRunId = null;
119
+ this.activities.clear();
120
+ }
121
+ }