@xingular/harness 0.1.6 → 1.0.0

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 (593) hide show
  1. package/CHANGELOG.md +107 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE.md +60 -0
  4. package/README.md +265 -71
  5. package/THIRD_PARTY_LICENSES.md +942 -0
  6. package/dist/cli.js +14842 -9445
  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/browser/config.d.ts +16 -0
  18. package/dist/sdk/browser/config.js +22 -0
  19. package/dist/sdk/browser/diagnostics.d.ts +4 -0
  20. package/dist/sdk/browser/diagnostics.js +38 -0
  21. package/dist/sdk/browser/index.d.ts +17 -0
  22. package/dist/sdk/browser/index.js +65 -0
  23. package/dist/sdk/browser/network.d.ts +10 -0
  24. package/dist/sdk/browser/network.js +59 -0
  25. package/dist/sdk/browser/session.d.ts +84 -0
  26. package/dist/sdk/browser/session.js +192 -0
  27. package/dist/sdk/browser/tools.d.ts +8 -0
  28. package/dist/sdk/browser/tools.js +329 -0
  29. package/dist/sdk/capabilities/api.d.ts +22 -0
  30. package/dist/sdk/capabilities/api.js +54 -0
  31. package/dist/sdk/capabilities/runSnapshot.d.ts +18 -0
  32. package/dist/sdk/capabilities/runSnapshot.js +47 -0
  33. package/dist/sdk/capabilities/types.d.ts +29 -0
  34. package/dist/sdk/capabilities/types.js +1 -0
  35. package/dist/sdk/cli.d.ts +2 -0
  36. package/dist/sdk/cli.js +142 -0
  37. package/dist/sdk/core/bus.d.ts +23 -0
  38. package/dist/sdk/core/bus.js +76 -0
  39. package/dist/sdk/core/caller.d.ts +22 -0
  40. package/dist/sdk/core/caller.js +16 -0
  41. package/dist/sdk/core/changes.d.ts +15 -0
  42. package/dist/sdk/core/changes.js +15 -0
  43. package/dist/sdk/core/effort.d.ts +2 -0
  44. package/dist/sdk/core/effort.js +1 -0
  45. package/dist/sdk/core/env.d.ts +18 -0
  46. package/dist/sdk/core/env.js +8 -0
  47. package/dist/sdk/core/errors.d.ts +15 -0
  48. package/dist/sdk/core/errors.js +24 -0
  49. package/dist/sdk/core/frontmatter.d.ts +12 -0
  50. package/dist/sdk/core/frontmatter.js +50 -0
  51. package/dist/sdk/core/fs.d.ts +18 -0
  52. package/dist/sdk/core/fs.js +106 -0
  53. package/dist/sdk/core/index.d.ts +24 -0
  54. package/dist/sdk/core/index.js +187 -0
  55. package/dist/sdk/core/path.d.ts +7 -0
  56. package/dist/sdk/core/path.js +79 -0
  57. package/dist/sdk/core/projects.d.ts +18 -0
  58. package/dist/sdk/core/projects.js +67 -0
  59. package/dist/sdk/core/secrets.d.ts +2 -0
  60. package/dist/sdk/core/secrets.js +5 -0
  61. package/dist/sdk/core/text.d.ts +7 -0
  62. package/dist/sdk/core/text.js +40 -0
  63. package/dist/sdk/doctor/checks.d.ts +5 -0
  64. package/dist/sdk/doctor/checks.js +208 -0
  65. package/dist/sdk/doctor/probe.d.ts +4 -0
  66. package/dist/sdk/doctor/probe.js +92 -0
  67. package/dist/sdk/doctor/service.d.ts +23 -0
  68. package/dist/sdk/doctor/service.js +144 -0
  69. package/dist/sdk/doctor/types.d.ts +141 -0
  70. package/dist/sdk/doctor/types.js +29 -0
  71. package/dist/sdk/harness.d.ts +133 -0
  72. package/dist/sdk/harness.js +299 -0
  73. package/dist/sdk/history/lessonPrompt.d.ts +2 -0
  74. package/dist/sdk/history/lessonPrompt.js +15 -0
  75. package/dist/sdk/history/lessons.d.ts +52 -0
  76. package/dist/sdk/history/lessons.js +173 -0
  77. package/dist/sdk/history/recall.d.ts +68 -0
  78. package/dist/sdk/history/recall.js +199 -0
  79. package/dist/sdk/history/trajectory.d.ts +7 -0
  80. package/dist/sdk/history/trajectory.js +216 -0
  81. package/dist/sdk/hub/catalog.json +123 -0
  82. package/dist/sdk/hub/cli.d.ts +7 -0
  83. package/dist/sdk/hub/cli.js +81 -0
  84. package/dist/sdk/hub/hub.d.ts +74 -0
  85. package/dist/sdk/hub/hub.js +474 -0
  86. package/dist/sdk/hub/schema.d.ts +280 -0
  87. package/dist/sdk/hub/schema.js +78 -0
  88. package/dist/sdk/index.d.ts +63 -0
  89. package/dist/sdk/index.js +48 -0
  90. package/dist/sdk/mcp/connections.d.ts +83 -0
  91. package/dist/sdk/mcp/connections.js +669 -0
  92. package/dist/sdk/mcp/manager.d.ts +26 -0
  93. package/dist/sdk/mcp/manager.js +124 -0
  94. package/dist/sdk/mcp/oauth.d.ts +35 -0
  95. package/dist/sdk/mcp/oauth.js +171 -0
  96. package/dist/sdk/mcp/scopeMigration.d.ts +19 -0
  97. package/dist/sdk/mcp/scopeMigration.js +198 -0
  98. package/dist/sdk/mcp/service.d.ts +160 -0
  99. package/dist/sdk/mcp/service.js +510 -0
  100. package/dist/sdk/mcp/types.d.ts +131 -0
  101. package/dist/sdk/mcp/types.js +49 -0
  102. package/dist/sdk/pi/runtime.d.ts +13 -0
  103. package/dist/sdk/pi/runtime.js +31 -0
  104. package/dist/sdk/plugins/api.d.ts +66 -0
  105. package/dist/sdk/plugins/api.js +155 -0
  106. package/dist/sdk/plugins/attachments.d.ts +46 -0
  107. package/dist/sdk/plugins/attachments.js +111 -0
  108. package/dist/sdk/plugins/builtin.d.ts +6 -0
  109. package/dist/sdk/plugins/builtin.js +68 -0
  110. package/dist/sdk/plugins/catalogue.d.ts +29 -0
  111. package/dist/sdk/plugins/catalogue.js +196 -0
  112. package/dist/sdk/plugins/cli.d.ts +13 -0
  113. package/dist/sdk/plugins/cli.js +187 -0
  114. package/dist/sdk/plugins/discover.d.ts +42 -0
  115. package/dist/sdk/plugins/discover.js +115 -0
  116. package/dist/sdk/plugins/firstParty.d.ts +50 -0
  117. package/dist/sdk/plugins/firstParty.js +113 -0
  118. package/dist/sdk/plugins/hooks.d.ts +94 -0
  119. package/dist/sdk/plugins/hooks.js +162 -0
  120. package/dist/sdk/plugins/identity.d.ts +19 -0
  121. package/dist/sdk/plugins/identity.js +48 -0
  122. package/dist/sdk/plugins/install.d.ts +20 -0
  123. package/dist/sdk/plugins/install.js +110 -0
  124. package/dist/sdk/plugins/inventory.d.ts +22 -0
  125. package/dist/sdk/plugins/inventory.js +110 -0
  126. package/dist/sdk/plugins/manifest.d.ts +13 -0
  127. package/dist/sdk/plugins/manifest.js +56 -0
  128. package/dist/sdk/plugins/plugins.d.ts +104 -0
  129. package/dist/sdk/plugins/plugins.js +164 -0
  130. package/dist/sdk/plugins/runtime.d.ts +9 -0
  131. package/dist/sdk/plugins/runtime.js +95 -0
  132. package/dist/sdk/plugins/trust.d.ts +44 -0
  133. package/dist/sdk/plugins/trust.js +120 -0
  134. package/dist/sdk/plugins/types.d.ts +159 -0
  135. package/dist/sdk/plugins/types.js +7 -0
  136. package/dist/sdk/prompt/compile.d.ts +174 -0
  137. package/dist/sdk/prompt/compile.js +396 -0
  138. package/dist/sdk/refine/cli.d.ts +4 -0
  139. package/dist/sdk/refine/cli.js +186 -0
  140. package/dist/sdk/refine/demo.d.ts +21 -0
  141. package/dist/sdk/refine/demo.js +114 -0
  142. package/dist/sdk/refine/evidence.d.ts +55 -0
  143. package/dist/sdk/refine/evidence.js +330 -0
  144. package/dist/sdk/refine/host.d.ts +51 -0
  145. package/dist/sdk/refine/host.js +76 -0
  146. package/dist/sdk/refine/ledger.d.ts +48 -0
  147. package/dist/sdk/refine/ledger.js +76 -0
  148. package/dist/sdk/refine/library.d.ts +55 -0
  149. package/dist/sdk/refine/library.js +177 -0
  150. package/dist/sdk/refine/pi.d.ts +72 -0
  151. package/dist/sdk/refine/pi.js +248 -0
  152. package/dist/sdk/refine/prompts.d.ts +45 -0
  153. package/dist/sdk/refine/prompts.js +390 -0
  154. package/dist/sdk/refine/recursion.d.ts +113 -0
  155. package/dist/sdk/refine/recursion.js +258 -0
  156. package/dist/sdk/refine/runner.d.ts +81 -0
  157. package/dist/sdk/refine/runner.js +150 -0
  158. package/dist/sdk/refine/selection.d.ts +57 -0
  159. package/dist/sdk/refine/selection.js +251 -0
  160. package/dist/sdk/refine/service.d.ts +84 -0
  161. package/dist/sdk/refine/service.js +165 -0
  162. package/dist/sdk/refine/suite.d.ts +67 -0
  163. package/dist/sdk/refine/suite.js +174 -0
  164. package/dist/sdk/refine/trajectory.d.ts +9 -0
  165. package/dist/sdk/refine/trajectory.js +68 -0
  166. package/dist/sdk/refine/types.d.ts +77 -0
  167. package/dist/sdk/refine/types.js +10 -0
  168. package/dist/sdk/server/methods.d.ts +3 -0
  169. package/dist/sdk/server/methods.js +370 -0
  170. package/dist/sdk/server/remote.d.ts +19 -0
  171. package/dist/sdk/server/remote.js +84 -0
  172. package/dist/sdk/server/rpc.d.ts +20 -0
  173. package/dist/sdk/server/rpc.js +102 -0
  174. package/dist/sdk/server/serve.d.ts +10 -0
  175. package/dist/sdk/server/serve.js +18 -0
  176. package/dist/sdk/sessions/approvals.d.ts +47 -0
  177. package/dist/sdk/sessions/approvals.js +119 -0
  178. package/dist/sdk/sessions/continuation.d.ts +48 -0
  179. package/dist/sdk/sessions/continuation.js +85 -0
  180. package/dist/sdk/sessions/contracts.d.ts +534 -0
  181. package/dist/sdk/sessions/contracts.js +299 -0
  182. package/dist/sdk/sessions/extensionUi.d.ts +19 -0
  183. package/dist/sdk/sessions/extensionUi.js +64 -0
  184. package/dist/sdk/sessions/history.d.ts +16 -0
  185. package/dist/sdk/sessions/history.js +68 -0
  186. package/dist/sdk/sessions/lineageJoin.d.ts +2 -0
  187. package/dist/sdk/sessions/lineageJoin.js +61 -0
  188. package/dist/sdk/sessions/planMode.d.ts +36 -0
  189. package/dist/sdk/sessions/planMode.js +84 -0
  190. package/dist/sdk/sessions/policy.d.ts +43 -0
  191. package/dist/sdk/sessions/policy.js +1 -0
  192. package/dist/sdk/sessions/pricing.d.ts +34 -0
  193. package/dist/sdk/sessions/pricing.js +40 -0
  194. package/dist/sdk/sessions/reasoningSummaries.d.ts +11 -0
  195. package/dist/sdk/sessions/reasoningSummaries.js +61 -0
  196. package/dist/sdk/sessions/registry.d.ts +102 -0
  197. package/dist/sdk/sessions/registry.js +383 -0
  198. package/dist/sdk/sessions/runIndex.d.ts +21 -0
  199. package/dist/sdk/sessions/runIndex.js +65 -0
  200. package/dist/sdk/sessions/runStore.d.ts +66 -0
  201. package/dist/sdk/sessions/runStore.js +335 -0
  202. package/dist/sdk/sessions/runner.d.ts +213 -0
  203. package/dist/sdk/sessions/runner.js +589 -0
  204. package/dist/sdk/sessions/sessions.d.ts +140 -0
  205. package/dist/sdk/sessions/sessions.js +394 -0
  206. package/dist/sdk/sessions/subagentService.d.ts +41 -0
  207. package/dist/sdk/sessions/subagentService.js +247 -0
  208. package/dist/sdk/sessions/subagents.d.ts +50 -0
  209. package/dist/sdk/sessions/subagents.js +68 -0
  210. package/dist/sdk/terminal/accountsMenu.d.ts +46 -0
  211. package/dist/sdk/terminal/accountsMenu.js +392 -0
  212. package/dist/sdk/terminal/cli.d.ts +20 -0
  213. package/dist/sdk/terminal/cli.js +121 -0
  214. package/dist/sdk/terminal/client.d.ts +15 -0
  215. package/dist/sdk/terminal/client.js +126 -0
  216. package/dist/sdk/terminal/control.d.ts +4 -0
  217. package/dist/sdk/terminal/control.js +25 -0
  218. package/dist/sdk/terminal/controller.d.ts +72 -0
  219. package/dist/sdk/terminal/controller.js +351 -0
  220. package/dist/sdk/terminal/hubMenu.d.ts +10 -0
  221. package/dist/sdk/terminal/hubMenu.js +34 -0
  222. package/dist/sdk/terminal/launch.d.ts +5 -0
  223. package/dist/sdk/terminal/launch.js +27 -0
  224. package/dist/sdk/terminal/logs.d.ts +14 -0
  225. package/dist/sdk/terminal/logs.js +59 -0
  226. package/dist/sdk/terminal/piExtension.d.ts +6 -0
  227. package/dist/sdk/terminal/piExtension.js +392 -0
  228. package/dist/sdk/terminal/pluginMenu.d.ts +34 -0
  229. package/dist/sdk/terminal/pluginMenu.js +101 -0
  230. package/dist/sdk/terminal/socket.d.ts +70 -0
  231. package/dist/sdk/terminal/socket.js +256 -0
  232. package/dist/sdk/terminal/standalone.d.ts +18 -0
  233. package/dist/sdk/terminal/standalone.js +146 -0
  234. package/dist/sdk/terminal/terminals.d.ts +176 -0
  235. package/dist/sdk/terminal/terminals.js +767 -0
  236. package/dist/sdk/terminal/trajectory.d.ts +10 -0
  237. package/dist/sdk/terminal/trajectory.js +30 -0
  238. package/dist/sdk/terminal/tui/chrome.d.ts +64 -0
  239. package/dist/sdk/terminal/tui/chrome.js +169 -0
  240. package/dist/sdk/terminal/tui/clipboardFiles.d.ts +11 -0
  241. package/dist/sdk/terminal/tui/clipboardFiles.js +74 -0
  242. package/dist/sdk/terminal/tui/commandPages.d.ts +7 -0
  243. package/dist/sdk/terminal/tui/commandPages.js +63 -0
  244. package/dist/sdk/terminal/tui/commands.d.ts +42 -0
  245. package/dist/sdk/terminal/tui/commands.js +276 -0
  246. package/dist/sdk/terminal/tui/dialogGeometry.d.ts +27 -0
  247. package/dist/sdk/terminal/tui/dialogGeometry.js +50 -0
  248. package/dist/sdk/terminal/tui/dialogs.d.ts +75 -0
  249. package/dist/sdk/terminal/tui/dialogs.js +363 -0
  250. package/dist/sdk/terminal/tui/keybindings.d.ts +11 -0
  251. package/dist/sdk/terminal/tui/keybindings.js +49 -0
  252. package/dist/sdk/terminal/tui/list.d.ts +73 -0
  253. package/dist/sdk/terminal/tui/list.js +196 -0
  254. package/dist/sdk/terminal/tui/modeChoices.d.ts +42 -0
  255. package/dist/sdk/terminal/tui/modeChoices.js +70 -0
  256. package/dist/sdk/terminal/tui/modelPicker.d.ts +55 -0
  257. package/dist/sdk/terminal/tui/modelPicker.js +155 -0
  258. package/dist/sdk/terminal/tui/mouse.d.ts +3 -0
  259. package/dist/sdk/terminal/tui/mouse.js +3 -0
  260. package/dist/sdk/terminal/tui/page.d.ts +14 -0
  261. package/dist/sdk/terminal/tui/page.js +1 -0
  262. package/dist/sdk/terminal/tui/pageOverlay.d.ts +27 -0
  263. package/dist/sdk/terminal/tui/pageOverlay.js +145 -0
  264. package/dist/sdk/terminal/tui/pages/accountsPage.d.ts +54 -0
  265. package/dist/sdk/terminal/tui/pages/accountsPage.js +181 -0
  266. package/dist/sdk/terminal/tui/pages/componentsPage.d.ts +47 -0
  267. package/dist/sdk/terminal/tui/pages/componentsPage.js +119 -0
  268. package/dist/sdk/terminal/tui/pages/doctorPage.d.ts +37 -0
  269. package/dist/sdk/terminal/tui/pages/doctorPage.js +145 -0
  270. package/dist/sdk/terminal/tui/pages/hubPage.d.ts +39 -0
  271. package/dist/sdk/terminal/tui/pages/hubPage.js +128 -0
  272. package/dist/sdk/terminal/tui/pages/logPage.d.ts +38 -0
  273. package/dist/sdk/terminal/tui/pages/logPage.js +189 -0
  274. package/dist/sdk/terminal/tui/pages/permissionsPage.d.ts +44 -0
  275. package/dist/sdk/terminal/tui/pages/permissionsPage.js +124 -0
  276. package/dist/sdk/terminal/tui/pages/pluginsPage.d.ts +57 -0
  277. package/dist/sdk/terminal/tui/pages/pluginsPage.js +243 -0
  278. package/dist/sdk/terminal/tui/pages/settingsPage.d.ts +55 -0
  279. package/dist/sdk/terminal/tui/pages/settingsPage.js +88 -0
  280. package/dist/sdk/terminal/tui/pages/trajectoryPage.d.ts +58 -0
  281. package/dist/sdk/terminal/tui/pages/trajectoryPage.js +377 -0
  282. package/dist/sdk/terminal/tui/piAdapter.d.ts +18 -0
  283. package/dist/sdk/terminal/tui/piAdapter.js +48 -0
  284. package/dist/sdk/terminal/tui/planMode.d.ts +2 -0
  285. package/dist/sdk/terminal/tui/planMode.js +2 -0
  286. package/dist/sdk/terminal/tui/questionPicker.d.ts +20 -0
  287. package/dist/sdk/terminal/tui/questionPicker.js +150 -0
  288. package/dist/sdk/terminal/tui/questions.d.ts +19 -0
  289. package/dist/sdk/terminal/tui/questions.js +42 -0
  290. package/dist/sdk/terminal/tui/runtime.d.ts +114 -0
  291. package/dist/sdk/terminal/tui/runtime.js +441 -0
  292. package/dist/sdk/terminal/tui/search.d.ts +22 -0
  293. package/dist/sdk/terminal/tui/search.js +60 -0
  294. package/dist/sdk/terminal/tui/selection.d.ts +16 -0
  295. package/dist/sdk/terminal/tui/selection.js +16 -0
  296. package/dist/sdk/terminal/tui/sessionUi.d.ts +3 -0
  297. package/dist/sdk/terminal/tui/sessionUi.js +30 -0
  298. package/dist/sdk/terminal/tui/settingsModel.d.ts +12 -0
  299. package/dist/sdk/terminal/tui/settingsModel.js +84 -0
  300. package/dist/sdk/terminal/tui/sideQuestion.d.ts +53 -0
  301. package/dist/sdk/terminal/tui/sideQuestion.js +197 -0
  302. package/dist/sdk/terminal/tui/skillInvocation.d.ts +9 -0
  303. package/dist/sdk/terminal/tui/skillInvocation.js +43 -0
  304. package/dist/sdk/terminal/tui/status.d.ts +18 -0
  305. package/dist/sdk/terminal/tui/status.js +67 -0
  306. package/dist/sdk/terminal/tui/theme.d.ts +45 -0
  307. package/dist/sdk/terminal/tui/theme.js +176 -0
  308. package/dist/sdk/terminal/tui/treeModel.d.ts +79 -0
  309. package/dist/sdk/terminal/tui/treeModel.js +483 -0
  310. package/dist/sdk/terminal/tui/treePicker.d.ts +49 -0
  311. package/dist/sdk/terminal/tui/treePicker.js +251 -0
  312. package/dist/sdk/terminal/tui/ui.d.ts +47 -0
  313. package/dist/sdk/terminal/tui/ui.js +148 -0
  314. package/dist/sdk/terminal/tui/workingStatus.d.ts +9 -0
  315. package/dist/sdk/terminal/tui/workingStatus.js +229 -0
  316. package/dist/sdk/tools/askUser.d.ts +6 -0
  317. package/dist/sdk/tools/askUser.js +74 -0
  318. package/dist/sdk/tools/checklist.d.ts +9 -0
  319. package/dist/sdk/tools/checklist.js +54 -0
  320. package/dist/sdk/tools/definitions.d.ts +30 -0
  321. package/dist/sdk/tools/definitions.js +117 -0
  322. package/dist/sdk/tools/dispatch.d.ts +16 -0
  323. package/dist/sdk/tools/dispatch.js +67 -0
  324. package/dist/sdk/tools/harnessTools.d.ts +6 -0
  325. package/dist/sdk/tools/harnessTools.js +20 -0
  326. package/dist/sdk/tools/sessionName.d.ts +7 -0
  327. package/dist/sdk/tools/sessionName.js +31 -0
  328. package/dist/sdk/tools/spawnSubagent.d.ts +4 -0
  329. package/dist/sdk/tools/spawnSubagent.js +49 -0
  330. package/dist/sdk/tools/types.d.ts +48 -0
  331. package/dist/sdk/tools/types.js +1 -0
  332. package/dist/sdk/variant/components.d.ts +34 -0
  333. package/dist/sdk/variant/components.js +230 -0
  334. package/dist/sdk/variant/materialise.d.ts +66 -0
  335. package/dist/sdk/variant/materialise.js +81 -0
  336. package/dist/sdk/variant/migrate.d.ts +4 -0
  337. package/dist/sdk/variant/migrate.js +41 -0
  338. package/dist/sdk/variant/seed.d.ts +20 -0
  339. package/dist/sdk/variant/seed.js +116 -0
  340. package/dist/sdk/variant/store.d.ts +82 -0
  341. package/dist/sdk/variant/store.js +151 -0
  342. package/dist/sdk/variant/surface.d.ts +56 -0
  343. package/dist/sdk/variant/surface.js +81 -0
  344. package/dist/sdk/variant/trust.d.ts +27 -0
  345. package/dist/sdk/variant/trust.js +64 -0
  346. package/dist/sdk/variant/variant.d.ts +71 -0
  347. package/dist/sdk/variant/variant.js +331 -0
  348. package/dist/sdk/web/markdown.d.ts +10 -0
  349. package/dist/sdk/web/markdown.js +66 -0
  350. package/dist/sdk/web/safeRequest.d.ts +34 -0
  351. package/dist/sdk/web/safeRequest.js +175 -0
  352. package/dist/sdk/web/search.d.ts +53 -0
  353. package/dist/sdk/web/search.js +168 -0
  354. package/dist/sdk/web/text.d.ts +2 -0
  355. package/dist/sdk/web/text.js +7 -0
  356. package/dist/sdk/web/tools.d.ts +22 -0
  357. package/dist/sdk/web/tools.js +195 -0
  358. package/dist/sdk/web/turndown-plugin-gfm.d.ts +4 -0
  359. package/dist/sdk/wiki/notes.d.ts +68 -0
  360. package/dist/sdk/wiki/notes.js +297 -0
  361. package/dist/sdk/world/actions.d.ts +23 -0
  362. package/dist/sdk/world/actions.js +31 -0
  363. package/dist/sdk/world/cli.d.ts +12 -0
  364. package/dist/sdk/world/cli.js +166 -0
  365. package/dist/sdk/world/images.d.ts +20 -0
  366. package/dist/sdk/world/images.js +48 -0
  367. package/dist/sdk/world/untrusted.d.ts +12 -0
  368. package/dist/sdk/world/untrusted.js +20 -0
  369. package/dist/sdk/world/world.d.ts +65 -0
  370. package/dist/sdk/world/world.js +80 -0
  371. package/dist/terminal-opentui.js +13612 -0
  372. package/dist/terminal-pi.js +1170 -62
  373. package/docs/README.md +34 -0
  374. package/docs/architecture/00-overview.md +159 -0
  375. package/docs/architecture/01-extension-points.md +78 -0
  376. package/docs/architecture/02-sessions-and-runs.md +146 -0
  377. package/docs/architecture/03-variants.md +95 -0
  378. package/docs/architecture/04-prompt.md +102 -0
  379. package/docs/architecture/05-refinement.md +107 -0
  380. package/docs/architecture/06-plugins-and-capabilities.md +93 -0
  381. package/docs/architecture/07-tools-and-gate.md +88 -0
  382. package/docs/architecture/08-memory-and-history.md +94 -0
  383. package/docs/architecture/09-accounts-and-connectors.md +90 -0
  384. package/docs/architecture/10-server-protocol.md +84 -0
  385. package/docs/architecture/11-terminal.md +81 -0
  386. package/docs/architecture/12-storage.md +61 -0
  387. package/docs/architecture/13-world-tools.md +23 -0
  388. package/docs/architecture/README.md +114 -0
  389. package/docs/architecture/proposals/PROP-0001-reporting-section.md +106 -0
  390. package/docs/architecture/proposals/PROP-0002-retain-rollout-workspaces.md +104 -0
  391. package/docs/architecture/proposals/PROP-0003-executor-settings.md +81 -0
  392. package/docs/architecture/proposals/PROP-0004-flexible-reporting-guidance.md +71 -0
  393. package/docs/architecture/proposals/PROP-0005-xharness-cli-name.md +78 -0
  394. package/docs/architecture/proposals/PROP-0006-run-checklist.md +68 -0
  395. package/docs/architecture/proposals/PROP-0007-run-continuation.md +80 -0
  396. package/docs/architecture/proposals/PROP-0008-lessons-from-runs.md +80 -0
  397. package/docs/architecture/proposals/PROP-0009-foundation-and-variants.md +78 -0
  398. package/docs/architecture/proposals/PROP-0010-session-names.md +73 -0
  399. package/docs/architecture/proposals/PROP-0011-doctor.md +63 -0
  400. package/docs/architecture/proposals/PROP-0012-release-baseline.md +56 -0
  401. package/docs/architecture/proposals/README.md +76 -0
  402. package/docs/decisions/ADR-0001-owned-terminal.md +87 -0
  403. package/docs/decisions/ADR-0002-native-subagent-lifecycle.md +49 -0
  404. package/docs/decisions/ADR-0003-shared-asynchronous-subagents.md +70 -0
  405. package/docs/decisions/ADR-0004-fullscreen-terminal-layout.md +50 -0
  406. package/docs/decisions/ADR-0005-app-provided-oauth-clients.md +54 -0
  407. package/docs/decisions/ADR-0006-opentui-only-terminal.md +47 -0
  408. package/docs/decisions/ADR-0007-reporting-section.md +33 -0
  409. package/docs/decisions/ADR-0008-flexible-reporting-guidance.md +38 -0
  410. package/docs/decisions/ADR-0009-xharness-command.md +38 -0
  411. package/docs/decisions/ADR-0010-lessons-in-the-wiki.md +31 -0
  412. package/docs/decisions/ADR-0011-foundation-and-variants.md +28 -0
  413. package/docs/decisions/ADR-0012-native-session-names.md +34 -0
  414. package/docs/decisions/ADR-0013-doctor.md +27 -0
  415. package/docs/decisions/ADR-0014-public-release-baseline.md +21 -0
  416. package/docs/doctor.md +74 -0
  417. package/docs/experiments/EXP-0001-terminal-input-latency/plan.md +81 -0
  418. package/docs/experiments/EXP-0001-terminal-input-latency/results.md +46 -0
  419. package/docs/experiments/EXP-0002-opentui-typing-latency/plan.md +70 -0
  420. package/docs/experiments/EXP-0002-opentui-typing-latency/results.md +92 -0
  421. package/docs/features/README.md +20 -0
  422. package/docs/features/automations/README.md +41 -0
  423. package/docs/features/cores/README.md +39 -0
  424. package/docs/features/google-harness2/README.md +52 -0
  425. package/docs/features/integrations/README.md +40 -0
  426. package/docs/features/interfaces/README.md +29 -0
  427. package/docs/features/memory/README.md +28 -0
  428. package/docs/releases/1.0.0.md +40 -0
  429. package/docs/releases/README.md +36 -0
  430. package/docs/study/00-index.md +78 -0
  431. package/docs/study/arms/00-matrix.md +20 -0
  432. package/docs/study/arms/01-system-prompt.md +211 -0
  433. package/docs/study/arms/02-tools.md +79 -0
  434. package/docs/study/arms/03-subagents.md +90 -0
  435. package/docs/study/arms/04-skills.md +75 -0
  436. package/docs/study/arms/05-context-management.md +90 -0
  437. package/docs/study/arms/06-memory.md +90 -0
  438. package/docs/study/arms/07-governance.md +71 -0
  439. package/docs/study/arms/08-execution.md +69 -0
  440. package/docs/study/arms/09-observability.md +60 -0
  441. package/docs/study/arms/10-refinement.md +110 -0
  442. package/docs/study/btw-comparison.md +37 -0
  443. package/docs/study/feature-gap-review.md +42 -0
  444. package/docs/study/insights.md +123 -0
  445. package/docs/study/roadmap.md +72 -0
  446. package/docs/study/sources/claude-code.md +44 -0
  447. package/docs/study/sources/deepseek-harness.md +102 -0
  448. package/docs/study/sources/harness2.md +50 -0
  449. package/docs/study/sources/kimi-cli.md +42 -0
  450. package/docs/study/sources/omp.md +93 -0
  451. package/docs/study/sources/opencode.md +43 -0
  452. package/docs/study/sources/openhands.md +46 -0
  453. package/docs/study/sources/smolagents.md +40 -0
  454. package/docs/study/sources/swe-agent.md +34 -0
  455. package/docs/system-prompt-design.md +196 -0
  456. package/docs/terminal-tui.md +671 -0
  457. package/package.json +48 -12
  458. package/src/accounts/accounts.test.ts +0 -223
  459. package/src/accounts/accounts.ts +0 -522
  460. package/src/accounts/env.test.ts +0 -95
  461. package/src/accounts/env.ts +0 -338
  462. package/src/accounts/secrets.ts +0 -50
  463. package/src/accounts/store.ts +0 -338
  464. package/src/capabilities/api.ts +0 -75
  465. package/src/capabilities/runSnapshot.ts +0 -59
  466. package/src/capabilities/types.ts +0 -34
  467. package/src/cli.ts +0 -114
  468. package/src/core/bus.ts +0 -34
  469. package/src/core/changes.ts +0 -33
  470. package/src/core/env.ts +0 -27
  471. package/src/core/errors.ts +0 -32
  472. package/src/core/frontmatter.ts +0 -47
  473. package/src/core/fs.test.ts +0 -38
  474. package/src/core/fs.ts +0 -92
  475. package/src/core/index.ts +0 -193
  476. package/src/core/path.test.ts +0 -14
  477. package/src/core/path.ts +0 -79
  478. package/src/core/projects.ts +0 -90
  479. package/src/core/text.ts +0 -39
  480. package/src/harness.ts +0 -299
  481. package/src/index.ts +0 -70
  482. package/src/mcp/connections.ts +0 -614
  483. package/src/mcp/manager.ts +0 -130
  484. package/src/mcp/oauth.ts +0 -195
  485. package/src/mcp/scopeMigration.test.ts +0 -79
  486. package/src/mcp/scopeMigration.ts +0 -204
  487. package/src/mcp/service.test.ts +0 -376
  488. package/src/mcp/service.ts +0 -549
  489. package/src/mcp/types.ts +0 -108
  490. package/src/memory/api.test.ts +0 -82
  491. package/src/memory/api.ts +0 -289
  492. package/src/memory/blocks.test.ts +0 -78
  493. package/src/memory/blocks.ts +0 -406
  494. package/src/memory/caller.ts +0 -57
  495. package/src/memory/dispatch.ts +0 -59
  496. package/src/memory/facts.test.ts +0 -41
  497. package/src/memory/facts.ts +0 -248
  498. package/src/memory/graph.ts +0 -103
  499. package/src/memory/health.test.ts +0 -130
  500. package/src/memory/health.ts +0 -74
  501. package/src/memory/maintainer.ts +0 -272
  502. package/src/memory/maintenance.test.ts +0 -176
  503. package/src/memory/maintenance.ts +0 -330
  504. package/src/memory/migrate.ts +0 -79
  505. package/src/memory/operations.ts +0 -138
  506. package/src/memory/proposals.test.ts +0 -168
  507. package/src/memory/proposals.ts +0 -576
  508. package/src/memory/recall.test.ts +0 -104
  509. package/src/memory/recall.ts +0 -271
  510. package/src/memory/references.ts +0 -77
  511. package/src/memory/runContext.ts +0 -93
  512. package/src/memory/secrets.ts +0 -6
  513. package/src/memory/store.test.ts +0 -66
  514. package/src/memory/store.ts +0 -385
  515. package/src/memory/wiki.test.ts +0 -47
  516. package/src/memory/wiki.ts +0 -422
  517. package/src/memory/wikiIndex.test.ts +0 -88
  518. package/src/memory/wikiIndex.ts +0 -116
  519. package/src/plugins/api.ts +0 -181
  520. package/src/plugins/attachments.test.ts +0 -84
  521. package/src/plugins/attachments.ts +0 -141
  522. package/src/plugins/builtin.ts +0 -82
  523. package/src/plugins/catalogue.test.ts +0 -254
  524. package/src/plugins/catalogue.ts +0 -251
  525. package/src/plugins/cli.ts +0 -184
  526. package/src/plugins/discover.ts +0 -151
  527. package/src/plugins/firstParty.test.ts +0 -143
  528. package/src/plugins/firstParty.ts +0 -129
  529. package/src/plugins/hooks.test.ts +0 -250
  530. package/src/plugins/hooks.ts +0 -239
  531. package/src/plugins/identity.ts +0 -37
  532. package/src/plugins/install.test.ts +0 -107
  533. package/src/plugins/install.ts +0 -106
  534. package/src/plugins/inventory.ts +0 -123
  535. package/src/plugins/manifest.ts +0 -76
  536. package/src/plugins/plugins.test.ts +0 -205
  537. package/src/plugins/plugins.ts +0 -189
  538. package/src/plugins/proposal.ts +0 -121
  539. package/src/plugins/runtime.test.ts +0 -40
  540. package/src/plugins/runtime.ts +0 -82
  541. package/src/plugins/trust.ts +0 -142
  542. package/src/plugins/types.ts +0 -149
  543. package/src/prompt/compile.test.ts +0 -261
  544. package/src/prompt/compile.ts +0 -732
  545. package/src/server/methods.ts +0 -314
  546. package/src/server/remote.ts +0 -77
  547. package/src/server/rpc.ts +0 -116
  548. package/src/server/serve.ts +0 -28
  549. package/src/server/server.test.ts +0 -174
  550. package/src/sessions/approvals.ts +0 -118
  551. package/src/sessions/contracts.ts +0 -310
  552. package/src/sessions/conversation.test.ts +0 -150
  553. package/src/sessions/extensionSession.test.ts +0 -74
  554. package/src/sessions/extensionUi.test.ts +0 -65
  555. package/src/sessions/extensionUi.ts +0 -102
  556. package/src/sessions/history.ts +0 -51
  557. package/src/sessions/lineageJoin.ts +0 -75
  558. package/src/sessions/policy.ts +0 -32
  559. package/src/sessions/pricing.ts +0 -60
  560. package/src/sessions/reasoningSummaries.ts +0 -59
  561. package/src/sessions/registry.ts +0 -294
  562. package/src/sessions/runIndex.ts +0 -99
  563. package/src/sessions/runStore.test.ts +0 -152
  564. package/src/sessions/runStore.ts +0 -332
  565. package/src/sessions/runner.ts +0 -569
  566. package/src/sessions/runtimeResources.test.ts +0 -61
  567. package/src/sessions/sessions.test.ts +0 -455
  568. package/src/sessions/sessions.ts +0 -295
  569. package/src/skills/registry.test.ts +0 -104
  570. package/src/skills/registry.ts +0 -407
  571. package/src/terminal/cli.ts +0 -149
  572. package/src/terminal/client.ts +0 -74
  573. package/src/terminal/controller.ts +0 -227
  574. package/src/terminal/launch.test.ts +0 -34
  575. package/src/terminal/launch.ts +0 -88
  576. package/src/terminal/piExtension.ts +0 -210
  577. package/src/terminal/pluginControl.test.ts +0 -146
  578. package/src/terminal/pluginMenu.ts +0 -112
  579. package/src/terminal/socket.test.ts +0 -71
  580. package/src/terminal/socket.ts +0 -221
  581. package/src/terminal/standalone.test.ts +0 -130
  582. package/src/terminal/standalone.ts +0 -144
  583. package/src/terminal/terminal.test.ts +0 -330
  584. package/src/terminal/terminals.ts +0 -443
  585. package/src/tools/askUser.ts +0 -45
  586. package/src/tools/definitions.ts +0 -187
  587. package/src/tools/memoryTools.ts +0 -22
  588. package/src/tools/pluginPropose.ts +0 -41
  589. package/src/tools/types.ts +0 -39
  590. package/src/web/safeRequest.ts +0 -171
  591. package/src/web/text.ts +0 -53
  592. package/src/web/tools.ts +0 -134
  593. package/src/web/web.test.ts +0 -141
@@ -0,0 +1,247 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { join } from 'node:path';
3
+ import { loadRun as loadCapabilities } from "../capabilities/runSnapshot.js";
4
+ import { HarnessError, invalid } from "../core/errors.js";
5
+ import { now } from "../core/fs.js";
6
+ import { takeChars } from "../core/text.js";
7
+ import { isActiveStatus } from "./contracts.js";
8
+ import { subagentOf } from "../variant/materialise.js";
9
+ import { findRun, loadRun, readEvents, recordedSubagents, recordSubagent, saveRun } from "./runStore.js";
10
+ import { SPAWN_SUBAGENT, SUBAGENT_RELATION, SUBAGENT_OWNER, SUBAGENT_RECEIPT, SUBAGENT_RESULTS, subagentHistory } from "./subagents.js";
11
+ function until(promise, signal) {
12
+ if (signal.aborted) {
13
+ void promise.catch(() => { });
14
+ return Promise.reject(new HarnessError('run_not_active', 'The parent run stopped.'));
15
+ }
16
+ return new Promise((resolve, reject) => {
17
+ const abort = () => reject(new HarnessError('run_not_active', 'The parent run stopped.'));
18
+ signal.addEventListener('abort', abort, { once: true });
19
+ promise.then(resolve, reject).finally(() => signal.removeEventListener('abort', abort));
20
+ });
21
+ }
22
+ /** One owner of native child execution and delivery, shared by SDK and terminal adapters. */
23
+ export class Subagents {
24
+ env;
25
+ runs;
26
+ launch;
27
+ parents = new Map();
28
+ constructor(env, runs, launch) {
29
+ this.env = env;
30
+ this.runs = runs;
31
+ this.launch = launch;
32
+ runs.listen((event) => {
33
+ if (event.type !== 'completed' && event.type !== 'failed' && !(event.type === 'status.changed' && event.payload.status === 'interrupted'))
34
+ return;
35
+ this.parents.get(event.runId)?.stopped.abort();
36
+ this.parents.delete(event.runId);
37
+ if (event.type !== 'completed')
38
+ for (const id of runs.activeRunIds()) {
39
+ const child = findRun(this.env.root, id);
40
+ if (child?.relation === SUBAGENT_RELATION && child.parentRunId === event.runId)
41
+ void runs.interrupt(id).catch(() => { });
42
+ }
43
+ });
44
+ }
45
+ /** Internal adapter contract: context comes from a live run, never from model arguments. */
46
+ register(input, accountId, capabilities, deferUntilPrompt = false) {
47
+ if (!this.runs.active(input.run.id))
48
+ throw new HarnessError('run_not_active', 'The parent run is not active.');
49
+ if (this.parents.has(input.run.id))
50
+ return;
51
+ const frozen = loadCapabilities(this.env.root, input.run.id);
52
+ if (!frozen)
53
+ throw invalid('A native parent requires a frozen capability snapshot.');
54
+ const ceiling = {
55
+ version: 1,
56
+ tools: capabilities.tools.filter(name => frozen.tools.includes(name)),
57
+ connectors: capabilities.connectors.filter(id => frozen.connectors.includes(id)),
58
+ contributions: capabilities.contributions.filter(id => frozen.contributions.includes(id))
59
+ };
60
+ let started;
61
+ const ready = new Promise(resolve => { started = resolve; });
62
+ if (!deferUntilPrompt)
63
+ started();
64
+ this.parents.set(input.run.id, { ready, started, input: structuredClone({ ...input, text: '', images: undefined, requiresImageInput: false, preamble: null, resume: null }), accountId, capabilities: ceiling, stopped: new AbortController(), recovered: new Set(), launching: new Map() });
65
+ }
66
+ resolvedModel(runId, model, effort) {
67
+ const parent = this.parents.get(runId);
68
+ if (parent) {
69
+ parent.input.model = model;
70
+ parent.input.effort = effort ?? parent.input.effort;
71
+ }
72
+ }
73
+ parent(runId) {
74
+ const parent = this.parents.get(runId);
75
+ if (!parent || !this.runs.active(runId))
76
+ throw new HarnessError('run_not_active', 'The parent run is not accepting subagents.');
77
+ return parent;
78
+ }
79
+ async spawn(request) {
80
+ const parent = this.parent(request.parentRunId);
81
+ const { input, accountId, capabilities } = parent;
82
+ if (!capabilities.tools.includes(SPAWN_SUBAGENT))
83
+ throw invalid('Subagents are not enabled for this run.');
84
+ const brief = typeof request.brief === 'string' ? request.brief.trim() : '';
85
+ if (!brief)
86
+ throw invalid('Give the subagent a brief.');
87
+ if (request.wait !== undefined && typeof request.wait !== 'boolean')
88
+ throw invalid('wait must be a boolean.');
89
+ if (request.tools !== undefined && (!Array.isArray(request.tools) || request.tools.some((name) => typeof name !== 'string')))
90
+ throw invalid('Tools must be an array of tool names.');
91
+ const outside = request.tools?.filter((name) => !capabilities.tools.includes(name)) ?? [];
92
+ if (outside.length)
93
+ throw invalid(`A subagent cannot have tools you do not have: ${outside.join(', ')}.`);
94
+ const tools = capabilities.tools.filter((name) => !request.tools || request.tools.includes(name));
95
+ await until(parent.ready, parent.stopped.signal);
96
+ let variant = input.variant ?? null;
97
+ let launch = input.launch;
98
+ if (request.agent !== undefined) {
99
+ if (typeof request.agent !== 'string' || !request.agent.trim())
100
+ throw invalid('agent must be the name of one of your subagents.');
101
+ const dir = variant && 'dir' in variant ? variant.dir : null;
102
+ const definition = dir ? subagentOf(dir, request.agent.trim()) : null;
103
+ if (!definition)
104
+ throw invalid(`There is no subagent named ${request.agent.trim()}.`);
105
+ // A named subagent works from its own definition, not from the parent's instructions.
106
+ variant = null;
107
+ launch = { ...(input.launch ?? {}), sections: [...(input.launch?.sections ?? []).filter((section) => section.id !== 'subagent'), { id: 'subagent', title: `Your role: ${definition.name}`, body: definition.instructions || definition.description, budget: 16_000, order: 22 }] };
108
+ }
109
+ const runId = randomUUID();
110
+ const sessionId = randomUUID();
111
+ recordSubagent(this.env.root, request.parentRunId, runId);
112
+ const child = {
113
+ ...input,
114
+ run: { ...input.run, id: runId, sessionId, parentRunId: request.parentRunId, relation: SUBAGENT_RELATION, goal: takeChars(brief, 4000), attachmentCount: 0, resumedFromRunId: null, handoffId: null },
115
+ accountId, poolId: null, sessionDir: join(input.sessionDir, 'subagents', runId), resume: null,
116
+ text: brief, images: undefined, requiresImageInput: false, preamble: null,
117
+ caller: { ...input.caller, runId: undefined, sessionId },
118
+ tools: { allow: tools, gated: (input.tools.gated ?? []).filter((name) => tools.includes(name)) },
119
+ capabilities: { ...capabilities, tools }, depth: (input.depth ?? 0) + 1,
120
+ variant, launch
121
+ };
122
+ const started = this.launch(child).catch((error) => {
123
+ if (!findRun(this.env.root, runId)) {
124
+ const source = loadRun(this.env.root, request.parentRunId);
125
+ saveRun(this.env.root, { ...source, id: runId, sessionId, parentRunId: request.parentRunId, relation: SUBAGENT_RELATION, nativeSessionId: null, resumedFromRunId: null, handoffId: null, exitCode: null, goal: takeChars(brief, 4000), attachmentCount: 0, status: 'failed', startedAt: now(), endedAt: now(), terminalReason: error instanceof HarnessError ? error.message : 'Subagent startup failed before its session opened.' });
126
+ }
127
+ return { runId, nativeSessionId: null };
128
+ });
129
+ parent.launching.set(runId, started);
130
+ void started.finally(() => parent.launching.delete(runId));
131
+ const result = await until(started, parent.stopped.signal);
132
+ if (request.wait)
133
+ await this.wait({ parentRunId: request.parentRunId, runIds: [runId] });
134
+ return result;
135
+ }
136
+ selected(selection, parent) {
137
+ const owned = new Set([...recordedSubagents(this.env.root, selection.parentRunId), ...(parent?.recovered ?? [])]);
138
+ if (selection.runIds !== undefined && (!Array.isArray(selection.runIds) || selection.runIds.some((id) => typeof id !== 'string')))
139
+ throw invalid('runIds must be an array of child run IDs.');
140
+ const ids = [...new Set(selection.runIds ?? [...owned])];
141
+ if (ids.some((id) => !owned.has(id)))
142
+ throw invalid('Select only subagents owned by this parent.');
143
+ return ids;
144
+ }
145
+ results(selection) {
146
+ loadRun(this.env.root, selection.parentRunId);
147
+ const parent = this.parents.get(selection.parentRunId);
148
+ return this.selected(selection, parent).map((runId) => {
149
+ const run = findRun(this.env.root, runId);
150
+ const reply = run && readEvents(this.env.root, runId).filter((event) => event.type === 'message.completed' && event.payload.role === 'assistant').at(-1);
151
+ const payload = reply?.payload;
152
+ return { runId, status: run?.status ?? 'queued', text: takeChars(payload?.text ?? '', 16_000), terminalReason: run?.terminalReason ?? null };
153
+ });
154
+ }
155
+ async wait(selection, signal) {
156
+ const parent = this.parent(selection.parentRunId);
157
+ const ids = this.selected(selection, parent);
158
+ const abort = signal ? AbortSignal.any([signal, parent.stopped.signal]) : parent.stopped.signal;
159
+ await until(Promise.all(ids.map(async (id) => {
160
+ const starting = parent.launching.get(id);
161
+ if (starting)
162
+ await starting;
163
+ const run = findRun(this.env.root, id);
164
+ if (run && isActiveStatus(run.status))
165
+ await this.runs.wait(id, abort);
166
+ })), abort);
167
+ return this.results({ ...selection, runIds: ids });
168
+ }
169
+ /** Reconcile only owners present on the selected native branch, with matching account and caller. */
170
+ restore(parentRunId, history) {
171
+ const parent = this.parent(parentRunId);
172
+ const current = loadRun(this.env.root, parentRunId);
173
+ for (const owner of history.owners) {
174
+ if (owner === parentRunId)
175
+ continue;
176
+ const old = findRun(this.env.root, owner);
177
+ if (!old || old.sessionId !== current.sessionId || old.accountId !== current.accountId || old.agentId !== current.agentId || old.projectId !== current.projectId || old.workingDirectory !== current.workingDirectory || !old.nativeSessionId || old.nativeSessionId !== current.nativeSessionId)
178
+ continue;
179
+ for (const id of recordedSubagents(this.env.root, owner)) {
180
+ let child = findRun(this.env.root, id);
181
+ if (!child) {
182
+ // The process can die after reserving ownership but before sessions.run saves the child.
183
+ saveRun(this.env.root, { ...old, id, sessionId: id, parentRunId: owner, relation: SUBAGENT_RELATION, nativeSessionId: null, resumedFromRunId: null, handoffId: null, exitCode: null, goal: null, attachmentCount: 0, status: 'interrupted', startedAt: now(), endedAt: now(), terminalReason: 'Subagent startup was interrupted before its session opened.' });
184
+ child = findRun(this.env.root, id);
185
+ }
186
+ if (child?.parentRunId === owner && child.relation === SUBAGENT_RELATION && child.accountId === current.accountId)
187
+ parent.recovered.add(id);
188
+ }
189
+ }
190
+ }
191
+ async delivery(parentRunId, history, settle, signal) {
192
+ const parent = this.parent(parentRunId);
193
+ this.restore(parentRunId, history);
194
+ if (settle) {
195
+ // A host may start another child while earlier children are settling.
196
+ for (;;) {
197
+ await this.wait({ parentRunId }, signal);
198
+ if (!parent.launching.size && this.results({ parentRunId }).every((result) => !isActiveStatus(result.status)))
199
+ break;
200
+ }
201
+ }
202
+ const delivered = new Set(history.receipts.flatMap((receipt) => receipt.delivered ?? []));
203
+ const pending = this.results({ parentRunId }).filter((result) => !isActiveStatus(result.status) && !delivered.has(result.runId));
204
+ const chunks = [];
205
+ const ids = [];
206
+ let size = 0;
207
+ for (const result of pending) {
208
+ const text = `Subagent run ${result.runId} · ${result.status}\n${result.text || result.terminalReason || 'No written reply.'}`;
209
+ if (size + text.length > 32_000 && ids.length)
210
+ break;
211
+ chunks.push(text);
212
+ ids.push(result.runId);
213
+ size += text.length;
214
+ }
215
+ return ids.length ? { text: chunks.join('\n\n'), receipt: { version: 1, ownerRunId: parentRunId, delivered: ids } } : null;
216
+ }
217
+ /** A broken adapter must fail visibly rather than complete with an undelivered child result. */
218
+ async verify(parentRunId, history) {
219
+ if (history)
220
+ this.restore(parentRunId, history);
221
+ await this.wait({ parentRunId });
222
+ if (history && await this.delivery(parentRunId, history, false))
223
+ throw new HarnessError('subagent_delivery_failed', 'A child result was not persisted in this conversation. Resume this reply to recover it.');
224
+ }
225
+ extension(runId) {
226
+ return { name: 'native-subagents', factory: (pi) => {
227
+ pi.on('before_agent_start', (_event, ctx) => {
228
+ if (!this.parents.has(runId))
229
+ return;
230
+ this.restore(runId, subagentHistory(ctx.sessionManager.getBranch()));
231
+ pi.appendEntry(SUBAGENT_OWNER, { runId });
232
+ this.parent(runId).started();
233
+ });
234
+ const deliver = async (event, ctx, settle) => {
235
+ if (!this.parents.has(runId) || (settle && event.outcome !== 'completed') || ctx.signal?.aborted)
236
+ return;
237
+ const history = subagentHistory([...ctx.sessionManager.getBranch(), ...event.entries]);
238
+ const result = await this.delivery(runId, history, settle, ctx.signal);
239
+ if (!result)
240
+ return;
241
+ return { entries: [...event.entries, { type: 'custom_message', customType: SUBAGENT_RESULTS, content: result.text, display: false, details: { [SUBAGENT_RECEIPT]: result.receipt } }], continue: true };
242
+ };
243
+ pi.on('turn_end', (event, ctx) => deliver(event, ctx, false));
244
+ pi.on('agent_before_settle', (event, ctx) => deliver(event, ctx, true));
245
+ } };
246
+ }
247
+ }
@@ -0,0 +1,50 @@
1
+ export declare const SPAWN_SUBAGENT = "spawn_subagent";
2
+ export declare const WAIT_SUBAGENTS = "wait_subagents";
3
+ export declare const SUBAGENT_RELATION = "subagent";
4
+ /** How deep subagents may nest when the caller does not say. */
5
+ export declare const DEFAULT_SUBAGENT_DEPTH = 1;
6
+ export declare const MAX_SUBAGENT_DEPTH = 3;
7
+ export interface SubagentOptions {
8
+ /** Maximum consecutive native subagent levels below a caller (1 to 3). */
9
+ maxDepth?: number;
10
+ }
11
+ export declare function subagentDepth(options: SubagentOptions | undefined): number;
12
+ export interface SubagentInput {
13
+ parentRunId: string;
14
+ brief: string;
15
+ tools?: string[];
16
+ wait?: boolean;
17
+ /** One of the parent harness's subagents (c5) by name; its instructions frame the child. */
18
+ agent?: string;
19
+ }
20
+ export interface SubagentSelection {
21
+ parentRunId: string;
22
+ runIds?: string[];
23
+ }
24
+ export interface SubagentResult {
25
+ runId: string;
26
+ status: string;
27
+ text: string;
28
+ terminalReason: string | null;
29
+ }
30
+ export interface SubagentReceipt {
31
+ version: 1;
32
+ ownerRunId: string;
33
+ spawned?: string[];
34
+ delivered?: string[];
35
+ }
36
+ export declare const SUBAGENT_RECEIPT = "xingularSubagents";
37
+ export declare const SUBAGENT_OWNER = "xingular-subagent-owner";
38
+ export declare const SUBAGENT_RESULTS = "xingular-subagent-results";
39
+ /** Read explicit native metadata, including entries retained before compaction. */
40
+ export declare function subagentHistory(entries: readonly unknown[]): {
41
+ owners: string[];
42
+ receipts: SubagentReceipt[];
43
+ };
44
+ /** Native nesting is independent of a host's other uses of the generic caller depth. */
45
+ export declare function subagentNesting(root: string, run: {
46
+ relation?: string | null;
47
+ parentRunId?: string | null;
48
+ }): number;
49
+ /** The child's final reply, or why it ended without one. */
50
+ export declare function subagentReport(root: string, runId: string): string;
@@ -0,0 +1,68 @@
1
+ import { takeChars } from "../core/text.js";
2
+ import { findRun, loadRun, readEvents } from "./runStore.js";
3
+ export const SPAWN_SUBAGENT = 'spawn_subagent';
4
+ export const WAIT_SUBAGENTS = 'wait_subagents';
5
+ export const SUBAGENT_RELATION = 'subagent';
6
+ /** How deep subagents may nest when the caller does not say. */
7
+ export const DEFAULT_SUBAGENT_DEPTH = 1;
8
+ export const MAX_SUBAGENT_DEPTH = 3;
9
+ export function subagentDepth(options) {
10
+ const value = Math.trunc(options?.maxDepth ?? DEFAULT_SUBAGENT_DEPTH);
11
+ return Math.min(MAX_SUBAGENT_DEPTH, Math.max(1, Number.isFinite(value) ? value : DEFAULT_SUBAGENT_DEPTH));
12
+ }
13
+ export const SUBAGENT_RECEIPT = 'xingularSubagents';
14
+ export const SUBAGENT_OWNER = 'xingular-subagent-owner';
15
+ export const SUBAGENT_RESULTS = 'xingular-subagent-results';
16
+ /** Read explicit native metadata, including entries retained before compaction. */
17
+ export function subagentHistory(entries) {
18
+ const owners = [];
19
+ const receipts = [];
20
+ for (const raw of entries) {
21
+ if (!raw || typeof raw !== 'object')
22
+ continue;
23
+ const entry = raw;
24
+ if (entry.type === 'custom' && entry.customType === SUBAGENT_OWNER && typeof entry.data?.runId === 'string')
25
+ owners.push(entry.data.runId);
26
+ const message = entry.type === 'message' ? entry.message : entry;
27
+ const receipt = message?.details?.[SUBAGENT_RECEIPT];
28
+ if (!receipt || receipt.version !== 1 || typeof receipt.ownerRunId !== 'string')
29
+ continue;
30
+ const strings = (value) => Array.isArray(value) && value.every((id) => typeof id === 'string');
31
+ if ((receipt.spawned !== undefined && !strings(receipt.spawned)) || (receipt.delivered !== undefined && !strings(receipt.delivered)))
32
+ continue;
33
+ receipts.push(receipt);
34
+ }
35
+ return { owners, receipts };
36
+ }
37
+ /** Native nesting is independent of a host's other uses of the generic caller depth. */
38
+ export function subagentNesting(root, run) {
39
+ let current = run;
40
+ let depth = 0;
41
+ const visited = new Set();
42
+ while (current.relation === SUBAGENT_RELATION) {
43
+ const parent = current.parentRunId;
44
+ if (!parent || visited.has(parent))
45
+ return MAX_SUBAGENT_DEPTH;
46
+ visited.add(parent);
47
+ depth++;
48
+ const record = findRun(root, parent);
49
+ if (!record)
50
+ return MAX_SUBAGENT_DEPTH;
51
+ current = record;
52
+ }
53
+ return depth;
54
+ }
55
+ /** The child's final reply, or why it ended without one. */
56
+ export function subagentReport(root, runId) {
57
+ const run = loadRun(root, runId);
58
+ const reply = readEvents(root, runId).filter((event) => event.type === 'message.completed' && event.payload.role === 'assistant').at(-1);
59
+ const text = typeof reply?.payload?.text === 'string' ? takeChars(reply.payload.text, 16_000) : '';
60
+ const lines = [`Subagent run ${runId} · ${run.status}`];
61
+ if (text)
62
+ lines.push(`Result:\n${text}`);
63
+ else if (run.status === 'completed')
64
+ lines.push('It finished without a written reply.');
65
+ if (run.status !== 'completed' && run.terminalReason)
66
+ lines.push(`Stopped because: ${run.terminalReason}`);
67
+ return lines.join('\n');
68
+ }
@@ -0,0 +1,46 @@
1
+ import type { AccountsOverview, AccountView } from "../accounts/store.js";
2
+ import type { MenuUi } from "./pluginMenu.js";
3
+ export interface AccountsUi extends MenuUi {
4
+ input(title: string, placeholder?: string): Promise<string | undefined>;
5
+ }
6
+ /** `accounts.*` over the session socket, with the session's control key. */
7
+ export type AccountsCall = <T = unknown>(method: string, params?: Record<string, unknown>) => Promise<T>;
8
+ /** The account this session is on, from `accounts.session`. */
9
+ export interface SessionAccount {
10
+ accountId: string;
11
+ label: string;
12
+ }
13
+ /** One entry of `accounts.providers`. */
14
+ export interface ProviderOption {
15
+ id: string;
16
+ name: string;
17
+ oauth: boolean;
18
+ oauthLabel: string | null;
19
+ apiKey: boolean;
20
+ }
21
+ /** The same words the app shows for each health state (`App/src/modes/accounts/accountModel.ts`). */
22
+ export declare const HEALTH: Record<string, string>;
23
+ /** A short "in 2h 5m" from an ISO time, or the time itself when it has passed. */
24
+ export declare function resetIn(resetsAt: string, now?: number): string;
25
+ /** One line per account, numbered so two accounts with the same name stay distinct in the menu. */
26
+ export declare function accountRows(overview: AccountsOverview, session: SessionAccount | null): {
27
+ label: string;
28
+ account: AccountView;
29
+ }[];
30
+ /** What `Details` shows for one account. */
31
+ export declare function accountDetails(account: AccountView): string;
32
+ /** The whole `/accounts` conversation. Returns `'relaunch'` when the person chose to switch this session's account. */
33
+ export declare function runAccountsMenu(ui: AccountsUi, call: AccountsCall, session: SessionAccount): Promise<'relaunch' | void>;
34
+ export declare function addAccount(ui: AccountsUi, call: AccountsCall): Promise<void>;
35
+ /** What can be done with one account; `details` is left out where the screen already shows them. */
36
+ export declare function accountActions(account: AccountView, isSession: boolean, details?: boolean): string[];
37
+ /**
38
+ * Runs one chosen action. `'relaunch'` means the session is switching to this account; `'gone'` that the
39
+ * account was removed. Anything the person declines or that fails leaves everything as it was.
40
+ */
41
+ export declare function runAccountAction(ui: AccountsUi, call: AccountsCall, overview: AccountsOverview, account: AccountView, action: string): Promise<'relaunch' | 'gone' | void>;
42
+ export declare function editPool(ui: AccountsUi, call: AccountsCall, overview: AccountsOverview, pool: {
43
+ id: string;
44
+ label: string;
45
+ accountIds: string[];
46
+ } | null): Promise<void>;