@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,383 @@
1
+ // Live runs. Assigns per-run sequence numbers, validates every event against the contract,
2
+ // persists it, hands it to listeners, and tracks interrupt, approval, and question handlers.
3
+ import { randomUUID } from 'node:crypto';
4
+ import { log } from "../core/bus.js";
5
+ import { HarnessError } from "../core/errors.js";
6
+ import { isActiveStatus, runEventSchema } from "./contracts.js";
7
+ import { findRun, persistEvent, readEvents, runFamily } from "./runStore.js";
8
+ function validateQuestionRecommendations(input) {
9
+ if (!Array.isArray(input.options) || input.options.length === 0) {
10
+ throw new HarnessError('invalid_request', 'Every question needs at least one choice.');
11
+ }
12
+ const recommendations = input.options.filter((option) => option.recommended).length;
13
+ if (recommendations === 0) {
14
+ throw new HarnessError('invalid_request', 'Every question needs at least one recommended choice.');
15
+ }
16
+ if (!input.multiSelect && recommendations > 1) {
17
+ throw new HarnessError('invalid_request', 'A single-choice question can recommend at most one option.');
18
+ }
19
+ }
20
+ export class RunRegistry {
21
+ options;
22
+ runs = new Map();
23
+ approvals = new Map();
24
+ questions = new Map();
25
+ nativeCleared = new Map();
26
+ waiters = new Map();
27
+ stopping = new Set();
28
+ listeners = [];
29
+ constructor(options) {
30
+ this.options = options;
31
+ }
32
+ /** Observers see events after they are persisted, in order. */
33
+ listen(listener) {
34
+ this.listeners.push(listener);
35
+ return () => {
36
+ const at = this.listeners.indexOf(listener);
37
+ if (at >= 0)
38
+ this.listeners.splice(at, 1);
39
+ };
40
+ }
41
+ deliver(event) {
42
+ const root = this.options.root();
43
+ try {
44
+ this.options.redact?.(event);
45
+ if (!persistEvent(root, event))
46
+ return false;
47
+ }
48
+ catch (error) {
49
+ log(`could not persist event for ${event.runId}: ${error instanceof Error ? error.message : String(error)}`);
50
+ return false;
51
+ }
52
+ const run = findRun(root, event.runId);
53
+ for (const listener of this.listeners) {
54
+ try {
55
+ listener(event, run);
56
+ }
57
+ catch (error) {
58
+ log('a run listener failed', error instanceof Error ? error.message : String(error));
59
+ }
60
+ }
61
+ return true;
62
+ }
63
+ /** Starts tracking a run whose record is already saved. */
64
+ start(sessionId, runId = randomUUID()) {
65
+ let sequence = 0;
66
+ try {
67
+ sequence = readEvents(this.options.root(), runId).reduce((highest, event) => Math.max(highest, event.sequence + 1), 0);
68
+ }
69
+ catch {
70
+ sequence = 0;
71
+ }
72
+ let finished = false;
73
+ let finishing = false;
74
+ const interruptHandlers = [];
75
+ let steerHandler = null;
76
+ const waitingStatus = () => [...this.approvals.values()].some((request) => request.runId === runId) ? 'waiting_for_approval' : [...this.questions.values()].some((request) => request.runId === runId) ? 'waiting_for_input' : 'running';
77
+ const requestQuestion = (input, batch, statusEvent = true) => {
78
+ const { requestId, ...payload } = input;
79
+ const questionId = requestId ?? randomUUID();
80
+ if (finished || finishing || this.nativeCleared.delete(questionId))
81
+ return Promise.resolve({ selected: [] });
82
+ validateQuestionRecommendations(input);
83
+ if (this.questions.has(questionId))
84
+ throw new HarnessError('invalid_request', 'This question id is already pending.');
85
+ return new Promise((resolve) => {
86
+ this.questions.set(questionId, {
87
+ runId,
88
+ input,
89
+ ...(batch ? { batch } : {}),
90
+ resolve: (answer) => {
91
+ this.questions.delete(questionId);
92
+ emit('question.answered', { questionId, ...answer, ...(batch ?? {}) });
93
+ emit('status.changed', { status: waitingStatus() });
94
+ resolve(answer);
95
+ }
96
+ });
97
+ emit('question.requested', { questionId, ...payload, ...(batch ?? {}) });
98
+ if (statusEvent)
99
+ emit('status.changed', { status: 'waiting_for_input' });
100
+ });
101
+ };
102
+ const emit = (type, payload, native) => {
103
+ if (finished)
104
+ return;
105
+ const parsed = runEventSchema.safeParse({ id: randomUUID(), runId, sessionId, sequence, timestamp: new Date().toISOString(), type, payload, ...(native === undefined ? {} : { native }) });
106
+ if (!parsed.success) {
107
+ log(`dropped invalid ${type} event for run ${runId}`);
108
+ return;
109
+ }
110
+ sequence += 1;
111
+ this.deliver(parsed.data);
112
+ };
113
+ const run = {
114
+ runId,
115
+ sessionId,
116
+ emit,
117
+ onInterrupt: (handler) => void interruptHandlers.push(handler),
118
+ onSteer: (handler) => {
119
+ steerHandler = handler;
120
+ },
121
+ steer: async (text) => {
122
+ if (finished || !steerHandler)
123
+ throw new HarnessError('run_not_active', 'This run is not accepting messages.');
124
+ await steerHandler(text);
125
+ },
126
+ requestApproval: async (input) => {
127
+ const { requestId, standing = 'full', timeoutMs, ...payload } = input;
128
+ const approvalId = requestId ?? randomUUID();
129
+ // What the user already allowed is known here; if it cannot be read, ask as usual.
130
+ const record = findRun(this.options.root(), runId);
131
+ const automatic = record && this.options.automatic && standing !== 'none' ? await this.options.automatic(record, input.target, input.operation, standing).catch(() => null) : null;
132
+ if (finished || finishing)
133
+ return 'denied';
134
+ if (this.nativeCleared.delete(approvalId))
135
+ return 'native';
136
+ if (automatic) {
137
+ // Marked on the request too, so nothing treats it as waiting on someone.
138
+ emit('approval.requested', { approvalId, ...payload, automatic });
139
+ emit('approval.resolved', { approvalId, decision: 'approved', automatic });
140
+ return 'approved';
141
+ }
142
+ emit('approval.requested', { approvalId, ...payload });
143
+ emit('status.changed', { status: 'waiting_for_approval' });
144
+ return new Promise((resolve) => {
145
+ const timer = timeoutMs ? setTimeout(() => this.approvals.get(approvalId)?.resolve('denied'), timeoutMs) : null;
146
+ this.approvals.set(approvalId, {
147
+ runId,
148
+ resolve: (decision) => {
149
+ if (timer)
150
+ clearTimeout(timer);
151
+ this.approvals.delete(approvalId);
152
+ emit('approval.resolved', { approvalId, decision });
153
+ emit('status.changed', { status: waitingStatus() });
154
+ resolve(decision);
155
+ }
156
+ });
157
+ });
158
+ },
159
+ requestAnswer: (input) => requestQuestion(input),
160
+ requestAnswers: (inputs) => {
161
+ if (!Array.isArray(inputs) || inputs.length < 1 || inputs.length > 5) {
162
+ throw new HarnessError('invalid_request', 'A question batch must contain between one and five questions.');
163
+ }
164
+ inputs.forEach(validateQuestionRecommendations);
165
+ const requestedIds = inputs.flatMap((input) => input.requestId ? [input.requestId] : []);
166
+ if (new Set(requestedIds).size !== requestedIds.length || requestedIds.some((id) => this.questions.has(id))) {
167
+ throw new HarnessError('invalid_request', 'Question ids in a batch must be unique and not already pending.');
168
+ }
169
+ if (finished || finishing)
170
+ return Promise.resolve(inputs.map(() => ({ selected: [] })));
171
+ const batchId = randomUUID();
172
+ const answers = inputs.map((input, index) => requestQuestion(input, { batchId, batchIndex: index + 1, batchCount: inputs.length }, false));
173
+ emit('status.changed', { status: 'waiting_for_input' });
174
+ return Promise.all(answers);
175
+ },
176
+ finish: (outcome, failure) => {
177
+ if (finished || finishing)
178
+ return;
179
+ finishing = true;
180
+ // Persist cancellation receipts while emit is still open, so every interface clears them.
181
+ for (const [, approval] of [...this.approvals])
182
+ if (approval.runId === runId)
183
+ approval.resolve('denied');
184
+ for (const [, question] of [...this.questions])
185
+ if (question.runId === runId)
186
+ question.resolve({ selected: [] });
187
+ if (outcome === 'failed')
188
+ emit('failed', failure ?? { code: 'failed', message: 'The run failed.' });
189
+ else if (outcome === 'interrupted')
190
+ emit('status.changed', { status: 'interrupted' });
191
+ else
192
+ emit('completed', {});
193
+ finished = true;
194
+ this.runs.delete(runId);
195
+ for (const resolve of [...(this.waiters.get(runId) ?? [])])
196
+ resolve();
197
+ this.waiters.delete(runId);
198
+ for (const [id, owner] of this.nativeCleared)
199
+ if (owner === runId)
200
+ this.nativeCleared.delete(id);
201
+ try {
202
+ this.options.ended?.(runId, sessionId);
203
+ }
204
+ catch (error) {
205
+ log('a run could not be closed cleanly', error instanceof Error ? error.message : String(error));
206
+ }
207
+ },
208
+ get finished() {
209
+ return finished;
210
+ },
211
+ interrupt: async () => {
212
+ // Release approvals/questions before SDK abort waits for their blocked tools.
213
+ run.finish('interrupted');
214
+ for (const handler of interruptHandlers) {
215
+ try {
216
+ await handler();
217
+ }
218
+ catch (error) {
219
+ log(`an interrupt handler failed for run ${runId}`, error instanceof Error ? error.message : String(error));
220
+ }
221
+ }
222
+ }
223
+ };
224
+ this.runs.set(runId, run);
225
+ emit('started', {});
226
+ emit('status.changed', { status: 'running' });
227
+ const record = findRun(this.options.root(), runId);
228
+ if (record?.parentRunId && this.hasStoppedAncestor(record.parentRunId))
229
+ run.finish('interrupted');
230
+ return run;
231
+ }
232
+ hasStoppedAncestor(runId) {
233
+ const visited = new Set();
234
+ let currentId = runId;
235
+ while (currentId && !visited.has(currentId)) {
236
+ if (this.stopping.has(currentId))
237
+ return true;
238
+ visited.add(currentId);
239
+ const record = findRun(this.options.root(), currentId);
240
+ if (!record)
241
+ return false;
242
+ if (!isActiveStatus(record.status))
243
+ return true;
244
+ currentId = record.parentRunId;
245
+ }
246
+ return false;
247
+ }
248
+ /** Wait for a recorded run to settle without polling storage or retaining an event listener. */
249
+ wait(runId, signal) {
250
+ const record = findRun(this.options.root(), runId);
251
+ if (!record)
252
+ throw new HarnessError('not_found', 'Run was not found.');
253
+ if (!isActiveStatus(record.status))
254
+ return Promise.resolve();
255
+ if (!this.runs.has(runId))
256
+ throw new HarnessError('run_not_active', 'This run is not active in this process.');
257
+ if (signal?.aborted)
258
+ return Promise.reject(new HarnessError('run_not_active', 'The wait was interrupted.'));
259
+ return new Promise((resolve, reject) => {
260
+ const cleanup = () => {
261
+ signal?.removeEventListener('abort', abort);
262
+ const pending = this.waiters.get(runId);
263
+ const index = pending?.indexOf(done) ?? -1;
264
+ if (index >= 0)
265
+ pending.splice(index, 1);
266
+ if (!pending?.length)
267
+ this.waiters.delete(runId);
268
+ };
269
+ const done = () => { cleanup(); resolve(); };
270
+ const abort = () => { cleanup(); reject(new HarnessError('run_not_active', 'The wait was interrupted.')); };
271
+ const pending = this.waiters.get(runId) ?? [];
272
+ pending.push(done);
273
+ this.waiters.set(runId, pending);
274
+ signal?.addEventListener('abort', abort, { once: true });
275
+ });
276
+ }
277
+ /** The live run with this id, for a tool or broker that reports into it. */
278
+ active(runId) {
279
+ return this.runs.get(runId) ?? null;
280
+ }
281
+ /** The live run of a session, when it has one. */
282
+ activeForSession(sessionId) {
283
+ for (const run of this.runs.values())
284
+ if (run.sessionId === sessionId)
285
+ return run;
286
+ return null;
287
+ }
288
+ /** Hands a message to a live run's model after its current step. Throws `run_not_active` when the run cannot take it. */
289
+ async steer(runId, text) {
290
+ const run = this.runs.get(runId);
291
+ if (!run)
292
+ throw new HarnessError('run_not_active', 'This run is not active.');
293
+ await run.steer(text);
294
+ }
295
+ async interrupt(runId) {
296
+ const run = this.runs.get(runId);
297
+ if (!run)
298
+ throw new HarnessError('run_not_active', 'This run is not active.');
299
+ if (this.stopping.has(runId))
300
+ return;
301
+ const family = runFamily(this.options.root(), runId);
302
+ const active = family.runs.map(({ run: member }) => member.id).filter((id) => this.runs.has(id));
303
+ for (const id of active)
304
+ this.stopping.add(id);
305
+ try {
306
+ await Promise.allSettled(active.map((id) => this.runs.get(id)?.interrupt()));
307
+ }
308
+ finally {
309
+ for (const id of active)
310
+ this.stopping.delete(id);
311
+ }
312
+ }
313
+ /** Interrupts every live run, giving each a moment to stop cleanly. */
314
+ async interruptAll(timeoutMs = 3000) {
315
+ await Promise.race([Promise.allSettled(this.activeRunIds().map((id) => this.interrupt(id))), new Promise((resolve) => setTimeout(resolve, timeoutMs))]);
316
+ }
317
+ resolveApproval(runId, approvalId, decision) {
318
+ if (decision !== 'approved' && decision !== 'denied' && decision !== 'native')
319
+ throw new HarnessError('invalid_request', 'Unknown decision.');
320
+ const approval = this.approvals.get(approvalId);
321
+ if (!approval || approval.runId !== runId)
322
+ throw new HarnessError('approval_not_pending', 'This approval is not pending for this run.');
323
+ approval.resolve(decision);
324
+ }
325
+ answerQuestion(runId, questionId, answer) {
326
+ const question = this.questions.get(questionId);
327
+ if (!question || question.runId !== runId)
328
+ throw new HarnessError('question_not_pending', 'This question is not waiting for an answer.');
329
+ if (question.batch)
330
+ throw new HarnessError('question_batch_required', 'Answer every question in this batch together.');
331
+ question.resolve(this.validateAnswer(question.input, answer));
332
+ }
333
+ answerQuestions(runId, batchId, answers) {
334
+ const questions = [...this.questions.entries()].filter(([, pending]) => pending.runId === runId && pending.batch?.batchId === batchId);
335
+ if (!questions.length || answers.length !== questions.length || new Set(answers.map(({ questionId }) => questionId)).size !== answers.length) {
336
+ throw new HarnessError('question_not_pending', 'This question batch is not waiting for an answer.');
337
+ }
338
+ const pendingById = new Map(questions);
339
+ const validated = answers.map(({ questionId, answer }) => {
340
+ const pending = pendingById.get(questionId);
341
+ if (!pending)
342
+ throw new HarnessError('question_not_pending', 'Every question in the batch must be answered together.');
343
+ return { pending, answer: this.validateAnswer(pending.input, answer) };
344
+ });
345
+ for (const { pending, answer } of validated)
346
+ pending.resolve(answer);
347
+ }
348
+ validateAnswer(input, answer) {
349
+ const selected = answer.selected;
350
+ const selectedLabels = new Set(selected);
351
+ const notes = {};
352
+ for (const [label, note] of Object.entries(answer.notes ?? {})) {
353
+ const normalized = typeof note === 'string' ? note.trim() : '';
354
+ if (normalized)
355
+ notes[label] = normalized;
356
+ }
357
+ const text = answer.text?.trim();
358
+ if ((!input.multiSelect && selected.length > 1) ||
359
+ selectedLabels.size !== selected.length ||
360
+ selected.some((label) => !input.options.some((option) => option.label === label)) ||
361
+ (text && !input.allowText) ||
362
+ Object.keys(notes).some((label) => !selectedLabels.has(label)) ||
363
+ Object.values(notes).some((note) => note.length > 10_000)) {
364
+ throw new HarnessError('invalid_answer', 'Choose the offered options or an allowed text answer, and attach notes only to selected choices.');
365
+ }
366
+ return { selected, ...(text ? { text } : {}), ...(Object.keys(notes).length ? { notes } : {}) };
367
+ }
368
+ activeRunIds() {
369
+ return [...this.runs.keys()];
370
+ }
371
+ /** A request the session's own interface already settled: nothing here is waiting on it any more. */
372
+ nativeResolved(runId, requestId) {
373
+ if (!this.runs.has(runId))
374
+ return;
375
+ const approval = this.approvals.get(requestId);
376
+ if (approval?.runId === runId)
377
+ return approval.resolve('native');
378
+ const question = this.questions.get(requestId);
379
+ if (question?.runId === runId)
380
+ return question.resolve({ selected: [] });
381
+ this.nativeCleared.set(requestId, runId);
382
+ }
383
+ }
@@ -0,0 +1,21 @@
1
+ import type { DatabaseSync } from 'node:sqlite';
2
+ import { type RunRecord } from "./contracts.js";
3
+ export declare function upsertRun(database: DatabaseSync, record: RunRecord): void;
4
+ /** Index failures never block a run. */
5
+ export declare function recordRun(root: string, record: RunRecord): void;
6
+ /** Every readable run record under `<data root>/runs`. */
7
+ export declare function readAllRuns(root: string): RunRecord[];
8
+ /**
9
+ * Adds the runs the table is missing, and those whose status changed, from the run files. A run
10
+ * recorded while the index was unavailable would otherwise be absent from session history.
11
+ */
12
+ export declare function syncRuns(root: string): number;
13
+ export declare function runsForSession(root: string, sessionId: string, limit: number): string[];
14
+ /** Which runs to read: one session's, one agent's wherever it replied, one account's, or all. */
15
+ export interface RunFilter {
16
+ session?: string | null;
17
+ agent?: string | null;
18
+ account?: string | null;
19
+ }
20
+ /** Runs matching `filter` started at or after `since` (an RFC 3339 instant), oldest first. */
21
+ export declare function runsSince(root: string, filter: RunFilter, since: string | null): string[];
@@ -0,0 +1,65 @@
1
+ import { join } from 'node:path';
2
+ import { readJson } from "../core/fs.js";
3
+ import { all, run as execute, runFolders, transaction, withIndex } from "../core/index.js";
4
+ import { runRecordSchema, upgradeRunRecord } from "./contracts.js";
5
+ export function upsertRun(database, record) {
6
+ execute(database, `INSERT OR REPLACE INTO runs (id, project_id, mode, harness, session_type, session_id, status, started_at, ended_at, account_id, agent_id)
7
+ VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11)`, record.id, record.projectId, record.mode, record.harness, record.sessionType, record.sessionId, record.status, record.startedAt, record.endedAt, record.accountId, record.agentId);
8
+ }
9
+ /** Index failures never block a run. */
10
+ export function recordRun(root, record) {
11
+ try {
12
+ withIndex(root, (database) => upsertRun(database, record));
13
+ }
14
+ catch {
15
+ // The index is rebuilt from run files when it is next repaired.
16
+ }
17
+ }
18
+ /** Every readable run record under `<data root>/runs`. */
19
+ export function readAllRuns(root) {
20
+ const records = [];
21
+ for (const name of runFolders(root)) {
22
+ try {
23
+ const parsed = runRecordSchema.safeParse(upgradeRunRecord(readJson(join(root, 'runs', name, 'run.json'))));
24
+ if (parsed.success)
25
+ records.push(parsed.data);
26
+ }
27
+ catch {
28
+ // Not a run folder.
29
+ }
30
+ }
31
+ return records;
32
+ }
33
+ /**
34
+ * Adds the runs the table is missing, and those whose status changed, from the run files. A run
35
+ * recorded while the index was unavailable would otherwise be absent from session history.
36
+ */
37
+ export function syncRuns(root) {
38
+ const known = new Map();
39
+ withIndex(root, (database) => {
40
+ for (const row of all(database, 'SELECT id, status, agent_id FROM runs'))
41
+ known.set(row.id, { status: row.status, agentId: row.agent_id });
42
+ });
43
+ // A row is rewritten when its status changed, or when it predates the agent column.
44
+ const pending = readAllRuns(root).filter((record) => {
45
+ const row = known.get(record.id);
46
+ return !row || row.status !== record.status || (row.agentId === null && record.agentId !== null);
47
+ });
48
+ if (!pending.length)
49
+ return 0;
50
+ withIndex(root, (database) => transaction(database, () => pending.forEach((record) => upsertRun(database, record))));
51
+ return pending.length;
52
+ }
53
+ export function runsForSession(root, sessionId, limit) {
54
+ return withIndex(root, (database) => all(database, 'SELECT id FROM runs WHERE session_id = ?1 ORDER BY started_at DESC LIMIT ?2', sessionId, limit).map((row) => row.id));
55
+ }
56
+ /** Runs matching `filter` started at or after `since` (an RFC 3339 instant), oldest first. */
57
+ export function runsSince(root, filter, since) {
58
+ return withIndex(root, (database) =>
59
+ // A chat run recorded before the agent column belongs to the agent whose own session it ran in.
60
+ all(database, `SELECT id FROM runs WHERE started_at >= ?1
61
+ AND (?2 IS NULL OR session_id = ?2)
62
+ AND (?3 IS NULL OR agent_id = ?3 OR (agent_id IS NULL AND mode = 'chat' AND session_id = ?3))
63
+ AND (?4 IS NULL OR account_id = ?4)
64
+ ORDER BY started_at`, since ?? '', filter.session ?? null, filter.agent ?? null, filter.account ?? null).map((row) => row.id));
65
+ }
@@ -0,0 +1,66 @@
1
+ import { type RunEvent, type RunRecord, type UsagePayload } from "./contracts.js";
2
+ export declare function runDir(root: string, runId: string): string;
3
+ export declare function saveRun(root: string, record: RunRecord): void;
4
+ export declare function loadRun(root: string, runId: string): RunRecord;
5
+ export declare function findRun(root: string, runId: string): RunRecord | null;
6
+ /** A parent's reserved child IDs survive a crash before the spawn tool returns. */
7
+ export declare function recordSubagent(root: string, parentRunId: string, childRunId: string): void;
8
+ export declare function recordedSubagents(root: string, parentRunId: string): string[];
9
+ /** Changes a run's record. A settled run keeps its outcome whatever the change says. */
10
+ export declare function updateRun(root: string, runId: string, update: (record: RunRecord) => void): void;
11
+ export declare function terminalStatus(event: Pick<RunEvent, 'type' | 'payload'>): 'completed' | 'failed' | 'interrupted' | null;
12
+ export declare function appendEvent(root: string, event: RunEvent): void;
13
+ /** A torn final line (a crash mid-write) is skipped rather than failing the whole log. */
14
+ export declare function readEvents(root: string, runId: string): RunEvent[];
15
+ /** An incoming event that passes the contract, or `null`. */
16
+ export declare function parseEvent(value: unknown): RunEvent | null;
17
+ /** The events that affected execution; what arrived after the outcome stays in the raw log as evidence. */
18
+ export declare function executionEvents(events: readonly RunEvent[]): RunEvent[];
19
+ /**
20
+ * Appends an event and applies it to the run record. An event that arrives after the run
21
+ * settled is kept as evidence and returns `false`: it is never applied or relayed.
22
+ */
23
+ export declare function persistEvent(root: string, event: RunEvent): boolean;
24
+ /** Startup reconciliation for every run that did not settle before the process stopped. */
25
+ export declare function markInterruptedRuns(root: string, reason?: string): string[];
26
+ /** An approval or question a run asked for that nothing has answered yet. */
27
+ export interface PendingDecision {
28
+ kind: 'approval' | 'question';
29
+ id: string;
30
+ eventId: string;
31
+ payload: unknown;
32
+ }
33
+ /** The run's unanswered approvals and questions, oldest first. */
34
+ export declare function pendingDecisions(events: readonly RunEvent[]): PendingDecision[];
35
+ export interface RunSnapshot {
36
+ run: RunRecord;
37
+ events: RunEvent[];
38
+ lastSequence: number;
39
+ }
40
+ export interface RunFamilySnapshot {
41
+ rootRunId: string;
42
+ runs: {
43
+ run: RunRecord;
44
+ usage: UsagePayload | null;
45
+ }[];
46
+ usage: {
47
+ inputTokens: number | null;
48
+ outputTokens: number | null;
49
+ cacheReadTokens: number | null;
50
+ cacheWriteTokens: number | null;
51
+ reasoningTokens: number | null;
52
+ costUsd: number | null;
53
+ requests: number | null;
54
+ };
55
+ settled: boolean;
56
+ }
57
+ /** A root run and all descendants linked through opaque parent-run metadata. */
58
+ export declare function runFamily(root: string, runId: string): RunFamilySnapshot;
59
+ export declare function snapshot(root: string, runId: string): RunSnapshot;
60
+ export interface RunListFilter {
61
+ projectId?: string | null;
62
+ sessionId?: string | null;
63
+ activeOnly?: boolean;
64
+ }
65
+ /** A session's history comes from the index; other filters scan run records. At most 200, newest first. */
66
+ export declare function listRuns(root: string, filter: RunListFilter): RunRecord[];