@xingular/harness 0.1.7 → 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 (683) hide show
  1. package/CHANGELOG.md +97 -1
  2. package/LICENSE +202 -0
  3. package/NOTICE.md +22 -0
  4. package/README.md +187 -85
  5. package/THIRD_PARTY_LICENSES.md +942 -0
  6. package/dist/cli.js +13701 -13498
  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 +808 -151
  373. package/docs/README.md +22 -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-0002-native-subagent-lifecycle.md +49 -0
  403. package/docs/decisions/ADR-0003-shared-asynchronous-subagents.md +70 -0
  404. package/docs/decisions/ADR-0004-fullscreen-terminal-layout.md +50 -0
  405. package/docs/decisions/ADR-0005-app-provided-oauth-clients.md +54 -0
  406. package/docs/decisions/ADR-0006-opentui-only-terminal.md +47 -0
  407. package/docs/decisions/ADR-0007-reporting-section.md +33 -0
  408. package/docs/decisions/ADR-0008-flexible-reporting-guidance.md +38 -0
  409. package/docs/decisions/ADR-0009-xharness-command.md +38 -0
  410. package/docs/decisions/ADR-0010-lessons-in-the-wiki.md +31 -0
  411. package/docs/decisions/ADR-0011-foundation-and-variants.md +28 -0
  412. package/docs/decisions/ADR-0012-native-session-names.md +34 -0
  413. package/docs/decisions/ADR-0013-doctor.md +27 -0
  414. package/docs/decisions/ADR-0014-public-release-baseline.md +21 -0
  415. package/docs/doctor.md +74 -0
  416. package/docs/experiments/EXP-0001-terminal-input-latency/plan.md +81 -0
  417. package/docs/experiments/EXP-0001-terminal-input-latency/results.md +46 -0
  418. package/docs/experiments/EXP-0002-opentui-typing-latency/plan.md +70 -0
  419. package/docs/experiments/EXP-0002-opentui-typing-latency/results.md +92 -0
  420. package/docs/features/README.md +20 -0
  421. package/docs/features/automations/README.md +41 -0
  422. package/docs/features/cores/README.md +39 -0
  423. package/docs/features/google-harness2/README.md +52 -0
  424. package/docs/features/integrations/README.md +40 -0
  425. package/docs/features/interfaces/README.md +29 -0
  426. package/docs/features/memory/README.md +28 -0
  427. package/docs/releases/1.0.0.md +40 -0
  428. package/docs/releases/README.md +36 -0
  429. package/docs/study/00-index.md +78 -0
  430. package/docs/study/arms/00-matrix.md +20 -0
  431. package/docs/study/arms/01-system-prompt.md +211 -0
  432. package/docs/study/arms/02-tools.md +79 -0
  433. package/docs/study/arms/03-subagents.md +90 -0
  434. package/docs/study/arms/04-skills.md +75 -0
  435. package/docs/study/arms/05-context-management.md +90 -0
  436. package/docs/study/arms/06-memory.md +90 -0
  437. package/docs/study/arms/07-governance.md +71 -0
  438. package/docs/study/arms/08-execution.md +69 -0
  439. package/docs/study/arms/09-observability.md +60 -0
  440. package/docs/study/arms/10-refinement.md +110 -0
  441. package/docs/study/btw-comparison.md +37 -0
  442. package/docs/study/feature-gap-review.md +42 -0
  443. package/docs/study/insights.md +123 -0
  444. package/docs/study/roadmap.md +72 -0
  445. package/docs/study/sources/claude-code.md +44 -0
  446. package/docs/study/sources/deepseek-harness.md +102 -0
  447. package/docs/study/sources/harness2.md +50 -0
  448. package/docs/study/sources/kimi-cli.md +42 -0
  449. package/docs/study/sources/omp.md +93 -0
  450. package/docs/study/sources/opencode.md +43 -0
  451. package/docs/study/sources/openhands.md +46 -0
  452. package/docs/study/sources/smolagents.md +40 -0
  453. package/docs/study/sources/swe-agent.md +34 -0
  454. package/docs/system-prompt-design.md +196 -0
  455. package/docs/terminal-tui.md +473 -56
  456. package/package.json +43 -13
  457. package/docs/evidence/terminal-2026-10-17/120x40-completed-transcript.ansi.gz +0 -0
  458. package/docs/evidence/terminal-2026-10-17/40x20-settings-interaction.ansi.gz +0 -0
  459. package/docs/evidence/terminal-2026-10-17/40x20-settings-keyboard.ansi.gz +0 -0
  460. package/docs/evidence/terminal-2026-10-17/40x20-welcome.ansi.gz +0 -0
  461. package/docs/evidence/terminal-2026-10-17/80x24-approval-0.ansi.gz +0 -0
  462. package/docs/evidence/terminal-2026-10-17/80x24-question.ansi.gz +0 -0
  463. package/docs/evidence/terminal-2026-10-17/verification.json +0 -130
  464. package/docs/evidence/terminal-2026-10-17-followup/120x40-completed-transcript.ansi.gz +0 -0
  465. package/docs/evidence/terminal-2026-10-17-followup/40x20-settings-interaction.ansi.gz +0 -0
  466. package/docs/evidence/terminal-2026-10-17-followup/40x20-settings-keyboard.ansi.gz +0 -0
  467. package/docs/evidence/terminal-2026-10-17-followup/40x20-welcome.ansi.gz +0 -0
  468. package/docs/evidence/terminal-2026-10-17-followup/80x24-approval-0.ansi.gz +0 -0
  469. package/docs/evidence/terminal-2026-10-17-followup/80x24-plugin-light.ansi.gz +0 -0
  470. package/docs/evidence/terminal-2026-10-17-followup/80x24-question-batch.ansi.gz +0 -0
  471. package/docs/evidence/terminal-2026-10-17-followup/80x24-question.ansi.gz +0 -0
  472. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-approval-0.ansi.gz +0 -0
  473. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-plugin-light.ansi.gz +0 -0
  474. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-question-batch.ansi.gz +0 -0
  475. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-question.ansi.gz +0 -0
  476. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/verification.json +0 -95
  477. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-approval-0.ansi.gz +0 -0
  478. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-plugin-light.ansi.gz +0 -0
  479. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-question-batch.ansi.gz +0 -0
  480. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-question.ansi.gz +0 -0
  481. package/docs/evidence/terminal-2026-10-17-followup/global-install/README.md +0 -27
  482. package/docs/evidence/terminal-2026-10-17-followup/global-install/shell-command-80x24.ansi.gz +0 -0
  483. package/docs/evidence/terminal-2026-10-17-followup/global-install/shell-command.json +0 -18
  484. package/docs/evidence/terminal-2026-10-17-followup/global-install/verification.json +0 -95
  485. package/docs/evidence/terminal-2026-10-17-followup/harness-reference-80x24.json.gz +0 -0
  486. package/docs/evidence/terminal-2026-10-17-followup/harness-reference-final-80x24.json.gz +0 -0
  487. package/docs/evidence/terminal-2026-10-17-followup/harness-reference-scenario.json +0 -60
  488. package/docs/evidence/terminal-2026-10-17-followup/live-codex/README.md +0 -24
  489. package/docs/evidence/terminal-2026-10-17-followup/live-codex/complete-80x24.ansi.gz +0 -0
  490. package/docs/evidence/terminal-2026-10-17-followup/live-codex/verification.json +0 -57
  491. package/docs/evidence/terminal-2026-10-17-followup/omp-reference-80x24-early.json.gz +0 -0
  492. package/docs/evidence/terminal-2026-10-17-followup/omp-reference-80x24.json.gz +0 -0
  493. package/docs/evidence/terminal-2026-10-17-followup/omp-reference-scenario.json +0 -58
  494. package/docs/evidence/terminal-2026-10-17-followup/omp-supplemental-static.json.gz +0 -0
  495. package/docs/evidence/terminal-2026-10-17-followup/rea-artifacts.json +0 -320
  496. package/docs/evidence/terminal-2026-10-17-followup/reference-comparison.json +0 -30
  497. package/docs/evidence/terminal-2026-10-17-followup/reference-comparison.md +0 -133
  498. package/docs/evidence/terminal-2026-10-17-followup/reference-source-observations.json +0 -20
  499. package/docs/evidence/terminal-2026-10-17-followup/verification.json +0 -207
  500. package/src/accounts/accounts.test.ts +0 -333
  501. package/src/accounts/accounts.ts +0 -658
  502. package/src/accounts/env.test.ts +0 -95
  503. package/src/accounts/env.ts +0 -338
  504. package/src/accounts/secrets.ts +0 -50
  505. package/src/accounts/store.ts +0 -338
  506. package/src/capabilities/api.ts +0 -75
  507. package/src/capabilities/runSnapshot.ts +0 -59
  508. package/src/capabilities/types.ts +0 -34
  509. package/src/cli.ts +0 -118
  510. package/src/core/bus.ts +0 -34
  511. package/src/core/changes.ts +0 -33
  512. package/src/core/env.ts +0 -27
  513. package/src/core/errors.ts +0 -32
  514. package/src/core/frontmatter.ts +0 -47
  515. package/src/core/fs.test.ts +0 -38
  516. package/src/core/fs.ts +0 -92
  517. package/src/core/index.ts +0 -193
  518. package/src/core/path.test.ts +0 -14
  519. package/src/core/path.ts +0 -79
  520. package/src/core/projects.ts +0 -90
  521. package/src/core/text.ts +0 -39
  522. package/src/harness.ts +0 -312
  523. package/src/hub/catalog.json +0 -123
  524. package/src/hub/cli.ts +0 -59
  525. package/src/hub/hub.test.ts +0 -205
  526. package/src/hub/hub.ts +0 -256
  527. package/src/hub/schema.ts +0 -81
  528. package/src/index.ts +0 -75
  529. package/src/mcp/connections.ts +0 -614
  530. package/src/mcp/manager.ts +0 -130
  531. package/src/mcp/oauth.ts +0 -195
  532. package/src/mcp/scopeMigration.test.ts +0 -79
  533. package/src/mcp/scopeMigration.ts +0 -204
  534. package/src/mcp/service.test.ts +0 -376
  535. package/src/mcp/service.ts +0 -549
  536. package/src/mcp/types.ts +0 -108
  537. package/src/memory/api.test.ts +0 -82
  538. package/src/memory/api.ts +0 -303
  539. package/src/memory/blocks.test.ts +0 -78
  540. package/src/memory/blocks.ts +0 -408
  541. package/src/memory/caller.ts +0 -69
  542. package/src/memory/curation.test.ts +0 -163
  543. package/src/memory/curation.ts +0 -64
  544. package/src/memory/dispatch.ts +0 -59
  545. package/src/memory/facts.test.ts +0 -41
  546. package/src/memory/facts.ts +0 -248
  547. package/src/memory/graph.ts +0 -103
  548. package/src/memory/health.test.ts +0 -130
  549. package/src/memory/health.ts +0 -74
  550. package/src/memory/maintainer.ts +0 -272
  551. package/src/memory/maintenance.test.ts +0 -176
  552. package/src/memory/maintenance.ts +0 -518
  553. package/src/memory/migrate.ts +0 -79
  554. package/src/memory/operations.ts +0 -150
  555. package/src/memory/proposals.test.ts +0 -168
  556. package/src/memory/proposals.ts +0 -584
  557. package/src/memory/recall.test.ts +0 -115
  558. package/src/memory/recall.ts +0 -278
  559. package/src/memory/references.ts +0 -77
  560. package/src/memory/runContext.ts +0 -93
  561. package/src/memory/secrets.ts +0 -6
  562. package/src/memory/store.test.ts +0 -66
  563. package/src/memory/store.ts +0 -385
  564. package/src/memory/wiki.test.ts +0 -47
  565. package/src/memory/wiki.ts +0 -422
  566. package/src/memory/wikiIndex.test.ts +0 -88
  567. package/src/memory/wikiIndex.ts +0 -116
  568. package/src/plugins/api.ts +0 -181
  569. package/src/plugins/attachments.test.ts +0 -84
  570. package/src/plugins/attachments.ts +0 -141
  571. package/src/plugins/builtin.ts +0 -82
  572. package/src/plugins/catalogue.test.ts +0 -254
  573. package/src/plugins/catalogue.ts +0 -251
  574. package/src/plugins/cli.ts +0 -184
  575. package/src/plugins/discover.ts +0 -151
  576. package/src/plugins/firstParty.test.ts +0 -143
  577. package/src/plugins/firstParty.ts +0 -129
  578. package/src/plugins/hooks.test.ts +0 -250
  579. package/src/plugins/hooks.ts +0 -239
  580. package/src/plugins/identity.ts +0 -37
  581. package/src/plugins/install.test.ts +0 -107
  582. package/src/plugins/install.ts +0 -106
  583. package/src/plugins/inventory.ts +0 -123
  584. package/src/plugins/manifest.ts +0 -76
  585. package/src/plugins/plugins.test.ts +0 -205
  586. package/src/plugins/plugins.ts +0 -189
  587. package/src/plugins/proposal.ts +0 -121
  588. package/src/plugins/runtime.test.ts +0 -40
  589. package/src/plugins/runtime.ts +0 -82
  590. package/src/plugins/trust.ts +0 -142
  591. package/src/plugins/types.ts +0 -149
  592. package/src/prompt/compile.test.ts +0 -261
  593. package/src/prompt/compile.ts +0 -732
  594. package/src/server/methods.ts +0 -349
  595. package/src/server/remote.ts +0 -77
  596. package/src/server/rpc.ts +0 -116
  597. package/src/server/serve.ts +0 -28
  598. package/src/server/server.test.ts +0 -174
  599. package/src/sessions/approvals.ts +0 -118
  600. package/src/sessions/contracts.ts +0 -336
  601. package/src/sessions/conversation.test.ts +0 -177
  602. package/src/sessions/extensionSession.test.ts +0 -74
  603. package/src/sessions/extensionUi.test.ts +0 -65
  604. package/src/sessions/extensionUi.ts +0 -102
  605. package/src/sessions/history.ts +0 -51
  606. package/src/sessions/lineageJoin.ts +0 -75
  607. package/src/sessions/policy.ts +0 -36
  608. package/src/sessions/pricing.ts +0 -60
  609. package/src/sessions/questionBatches.test.ts +0 -110
  610. package/src/sessions/reasoningSummaries.ts +0 -59
  611. package/src/sessions/registry.ts +0 -381
  612. package/src/sessions/runIndex.ts +0 -99
  613. package/src/sessions/runStore.test.ts +0 -152
  614. package/src/sessions/runStore.ts +0 -332
  615. package/src/sessions/runner.ts +0 -604
  616. package/src/sessions/runtimeResources.test.ts +0 -61
  617. package/src/sessions/sessions.test.ts +0 -549
  618. package/src/sessions/sessions.ts +0 -339
  619. package/src/skills/registry.test.ts +0 -104
  620. package/src/skills/registry.ts +0 -413
  621. package/src/terminal/accountsMenu.test.ts +0 -225
  622. package/src/terminal/accountsMenu.ts +0 -382
  623. package/src/terminal/cli.ts +0 -149
  624. package/src/terminal/client.ts +0 -74
  625. package/src/terminal/control.test.ts +0 -23
  626. package/src/terminal/control.ts +0 -23
  627. package/src/terminal/controller.ts +0 -291
  628. package/src/terminal/hubMenu.ts +0 -24
  629. package/src/terminal/launch.test.ts +0 -25
  630. package/src/terminal/launch.ts +0 -48
  631. package/src/terminal/piExtension.lifecycle.test.ts +0 -55
  632. package/src/terminal/piExtension.ts +0 -259
  633. package/src/terminal/pluginControl.test.ts +0 -146
  634. package/src/terminal/pluginMenu.ts +0 -112
  635. package/src/terminal/socket.test.ts +0 -71
  636. package/src/terminal/socket.ts +0 -232
  637. package/src/terminal/standalone.test.ts +0 -167
  638. package/src/terminal/standalone.ts +0 -153
  639. package/src/terminal/terminal.test.ts +0 -399
  640. package/src/terminal/terminals.ts +0 -553
  641. package/src/terminal/tui/application.test.ts +0 -114
  642. package/src/terminal/tui/application.ts +0 -491
  643. package/src/terminal/tui/commands.test.ts +0 -218
  644. package/src/terminal/tui/commands.ts +0 -361
  645. package/src/terminal/tui/dialogs.ts +0 -301
  646. package/src/terminal/tui/editor.test.ts +0 -84
  647. package/src/terminal/tui/editor.ts +0 -79
  648. package/src/terminal/tui/keybindings.test.ts +0 -22
  649. package/src/terminal/tui/keybindings.ts +0 -50
  650. package/src/terminal/tui/piAdapter.ts +0 -62
  651. package/src/terminal/tui/presentation.test.ts +0 -79
  652. package/src/terminal/tui/questions.test.ts +0 -41
  653. package/src/terminal/tui/questions.ts +0 -47
  654. package/src/terminal/tui/runtime.socket.test.ts +0 -104
  655. package/src/terminal/tui/runtime.test.ts +0 -215
  656. package/src/terminal/tui/runtime.ts +0 -388
  657. package/src/terminal/tui/sessionUi.ts +0 -24
  658. package/src/terminal/tui/settings.test.ts +0 -150
  659. package/src/terminal/tui/settings.ts +0 -188
  660. package/src/terminal/tui/status.test.ts +0 -70
  661. package/src/terminal/tui/status.ts +0 -109
  662. package/src/terminal/tui/theme.ts +0 -174
  663. package/src/terminal/tui/tools.test.ts +0 -145
  664. package/src/terminal/tui/tools.ts +0 -142
  665. package/src/terminal/tui/transcript.test.ts +0 -25
  666. package/src/terminal/tui/transcript.ts +0 -124
  667. package/src/terminal/tui/ui.test.ts +0 -313
  668. package/src/terminal/tui/ui.ts +0 -166
  669. package/src/terminal/tui/welcome.ts +0 -102
  670. package/src/tools/askUser.test.ts +0 -69
  671. package/src/tools/askUser.ts +0 -59
  672. package/src/tools/definitions.ts +0 -187
  673. package/src/tools/maintenance.ts +0 -24
  674. package/src/tools/memoryTools.ts +0 -22
  675. package/src/tools/pluginPropose.ts +0 -41
  676. package/src/tools/registryWrite.test.ts +0 -101
  677. package/src/tools/registryWrite.ts +0 -182
  678. package/src/tools/spawnSubagent.ts +0 -92
  679. package/src/tools/types.ts +0 -39
  680. package/src/web/safeRequest.ts +0 -171
  681. package/src/web/text.ts +0 -53
  682. package/src/web/tools.ts +0 -134
  683. package/src/web/web.test.ts +0 -141
@@ -0,0 +1,251 @@
1
+ // Choosing one anonymised final output, then reflecting on the refinement that produced it.
2
+ // The selector sees only the request, the source and the outputs, shuffled under arbitrary ids;
3
+ // it never sees a harness, a trajectory, or any verdict.
4
+ //
5
+ // Ported from Harness² (Apache-2.0, Google LLC; `harness2/core/selection.py`).
6
+ import { createHash } from 'node:crypto';
7
+ import { cpSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
8
+ import { join } from 'node:path';
9
+ import { writeJson } from "../core/fs.js";
10
+ import { PI_SURFACE } from "../variant/surface.js";
11
+ import { writeVariant } from "../variant/variant.js";
12
+ import * as evidence from "./evidence.js";
13
+ import * as P from "./prompts.js";
14
+ import { defaultPrompts } from "./recursion.js";
15
+ import { ImproverError } from "./types.js";
16
+ /** A seeded mulberry32, so a shuffle is stable across reruns of the same task. */
17
+ function seeded(seed) {
18
+ let a = seed >>> 0;
19
+ return () => {
20
+ a = (a + 0x6d2b79f5) >>> 0;
21
+ let t = a;
22
+ t = Math.imul(t ^ (t >>> 15), t | 1);
23
+ t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
24
+ return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
25
+ };
26
+ }
27
+ /** A..Z, AA..AZ, BA...: always accepted by the choice parser. */
28
+ export function anonId(index) {
29
+ let out = '';
30
+ let n = index + 1;
31
+ while (n) {
32
+ const rem = (n - 1) % 26;
33
+ out = String.fromCharCode(65 + rem) + out;
34
+ n = Math.floor((n - 1) / 26);
35
+ }
36
+ return out;
37
+ }
38
+ /** anon id → label, by canonical sort then a seeded shuffle. */
39
+ export function assignIds(labels, taskId, k, mode) {
40
+ const seed = parseInt(createHash('sha1').update(`${taskId}|${k}|${mode}`).digest('hex').slice(0, 8), 16);
41
+ const ordered = [...labels].sort();
42
+ const random = seeded(seed);
43
+ for (let i = ordered.length - 1; i > 0; i--) {
44
+ const j = Math.floor(random() * (i + 1));
45
+ [ordered[i], ordered[j]] = [ordered[j], ordered[i]];
46
+ }
47
+ return Object.fromEntries(ordered.map((label, i) => [anonId(i), label]));
48
+ }
49
+ /** Exactly the k finals of a mode: agg1..aggk or c1..ck. The base executions are never in it. */
50
+ export function selectionPool(mode, k, rollouts) {
51
+ const labels = Array.from({ length: k }, (_, i) => (mode === 'agg' ? `agg${i + 1}` : `c${i + 1}`));
52
+ return Object.fromEntries(labels.filter((label) => rollouts[label]).map((label) => [label, rollouts[label]]));
53
+ }
54
+ function newSelection(taskId, mode, k) {
55
+ return { taskId, mode, k, chosenId: '', chosenLabel: '', chosenRunId: '', chosenDir: '', why: '', idMap: {}, dropped: [], candidates: 0, ok: false, fallback: false, trivial: false, error: '', usd: 0, experience: {} };
56
+ }
57
+ /** Drops non-answers before anonymising, recording each drop and its cause. */
58
+ function renderPool(candidates, executor, sel) {
59
+ const pool = {};
60
+ const artifacts = {};
61
+ for (const [label, rollout] of Object.entries(candidates)) {
62
+ if (!(rollout.ok && rollout.delivered)) {
63
+ sel.dropped.push(label);
64
+ continue;
65
+ }
66
+ let text = '';
67
+ try {
68
+ text = evidence.renderDeliverable(executor, rollout);
69
+ }
70
+ catch (error) {
71
+ sel.dropped.push(`${label} (render failed: ${error instanceof Error ? error.message : String(error)})`.slice(0, 200));
72
+ continue;
73
+ }
74
+ if (!text.trim()) {
75
+ sel.dropped.push(label);
76
+ continue;
77
+ }
78
+ pool[label] = rollout;
79
+ artifacts[label] = text;
80
+ }
81
+ return { pool, artifacts };
82
+ }
83
+ function persist(sel, root) {
84
+ try {
85
+ writeJson(join(root, 'selection.json'), sel);
86
+ }
87
+ catch (error) {
88
+ sel.ok = false;
89
+ sel.error = `${sel.error} | could not persist selection: ${error instanceof Error ? error.message : String(error)}`.slice(0, 400);
90
+ }
91
+ }
92
+ function choose(sel, label, pool) {
93
+ sel.chosenLabel = label;
94
+ sel.chosenId = Object.entries(sel.idMap).find(([, l]) => l === label)?.[0] ?? '';
95
+ sel.chosenRunId = pool[label]?.runId ?? '';
96
+ sel.chosenDir = pool[label]?.dir ?? '';
97
+ }
98
+ /** Picks one output. A selector failure falls back to the first final and never throws. */
99
+ export async function runSelection(input) {
100
+ const { task, k, mode, executor } = input;
101
+ const sel = newSelection(task.id, mode, k);
102
+ const { pool, artifacts } = renderPool(input.candidates, executor, sel);
103
+ sel.candidates = Object.keys(pool).length;
104
+ if (!sel.candidates) {
105
+ sel.error = 'no candidate produced an artifact';
106
+ return sel;
107
+ }
108
+ sel.idMap = assignIds(Object.keys(pool), task.id, k, mode);
109
+ const root = join(input.workDir, 'selection', `${mode}${k}`);
110
+ rmSync(root, { recursive: true, force: true });
111
+ mkdirSync(join(root, 'candidates'), { recursive: true });
112
+ writeFileSync(join(root, 'task.md'), task.prompt);
113
+ evidence.copySource(task, root);
114
+ for (const [anon, label] of Object.entries(sel.idMap)) {
115
+ const text = artifacts[label];
116
+ writeFileSync(join(root, 'candidates', `${anon}.md`), `<!-- candidate ${anon}: ${text.length.toLocaleString('en-US')} chars, ${(text.split('\n').length).toLocaleString('en-US')} lines. COMPLETE -- nothing trimmed. Navigate with grep/offsets; evaluating a candidate means opening the part that determines whether it works. -->\n${text}`);
117
+ }
118
+ const ids = Object.keys(sel.idMap).sort().join(', ');
119
+ const mission = [
120
+ P.select(task.prompts ?? defaultPrompts(), sel.candidates, { poolKind: 'finals' }),
121
+ `# YOUR EVIDENCE\n\nIt is on disk. Read it -- do not answer from this message alone.\n\ncontext/task.md the instructions\ncontext/source/ task source materials, when supplied\ncontext/candidates/<id>.md one file per candidate: ${ids}\n\nOpen every candidate before choosing. Choose exactly one of: ${ids}.`
122
+ ].join('\n\n');
123
+ evidence.assertNoGraderVerdicts(root);
124
+ try {
125
+ const reply = await input.improver.call({ mission, contextDir: root, label: `select.${mode}${k}`, signal: input.signal });
126
+ sel.usd += reply.costUsd;
127
+ const choice = /```choice\s*\n?\s*([A-Za-z0-9_-]+)\s*\n?\s*```/.exec(reply.text)?.[1]?.trim();
128
+ if (!choice)
129
+ throw new Error('no ```choice block in the reply');
130
+ if (!sel.idMap[choice])
131
+ throw new Error(`chose '${choice}', which is not one of ${ids}`);
132
+ sel.why = (/<why>([\s\S]*?)<\/why>/.exec(reply.text)?.[1]?.trim() ?? '').slice(0, 2000);
133
+ sel.ok = true;
134
+ choose(sel, sel.idMap[choice], pool);
135
+ }
136
+ catch (error) {
137
+ if (error instanceof ImproverError)
138
+ sel.usd += error.costUsd;
139
+ // The neutral stand-in: the first final in canonical order. It is delivered, but the
140
+ // selection did not succeed, so nothing is reflected on or added to the library.
141
+ choose(sel, Object.keys(pool).sort()[0], pool);
142
+ sel.fallback = true;
143
+ sel.ok = false;
144
+ sel.error = (error instanceof Error ? error.message : String(error)).slice(0, 400);
145
+ }
146
+ persist(sel, root);
147
+ return sel;
148
+ }
149
+ /** Delivers the single k=1 final without a selector session. */
150
+ export function trivialSelection(input) {
151
+ const { task, k, mode } = input;
152
+ if (Object.keys(input.candidates).length > 1)
153
+ throw new Error(`trivialSelection expects at most one candidate, got ${Object.keys(input.candidates).sort().join(', ')}`);
154
+ const sel = newSelection(task.id, mode, k);
155
+ sel.trivial = true;
156
+ const { pool } = renderPool(input.candidates, input.executor, sel);
157
+ sel.candidates = Object.keys(pool).length;
158
+ if (!sel.candidates) {
159
+ sel.error = 'no candidate produced an artifact (the finals-only pool has no base fallback)';
160
+ return sel;
161
+ }
162
+ const label = Object.keys(pool)[0];
163
+ sel.idMap = { A: label };
164
+ choose(sel, label, pool);
165
+ sel.ok = true;
166
+ sel.why = 'trivial pool: single final at k=1; delivered without a selector session';
167
+ const root = join(input.workDir, 'selection', `${mode}${k}`);
168
+ rmSync(root, { recursive: true, force: true });
169
+ mkdirSync(root, { recursive: true });
170
+ persist(sel, root);
171
+ return sel;
172
+ }
173
+ /** Learns from the edits, decisions, trajectories and outputs after adoption. Never throws. */
174
+ export async function reflectAdoption(input) {
175
+ const { task, selection: sel } = input;
176
+ const chosen = input.rollouts[sel.chosenLabel];
177
+ if (!sel.ok || !chosen)
178
+ return {};
179
+ const root = join(input.workDir, 'reflection', `${sel.mode}${sel.k}`);
180
+ const variants = join(input.workDir, 'variants');
181
+ let layout = '';
182
+ try {
183
+ const built = evidence.build(root, {
184
+ task,
185
+ executor: input.executor,
186
+ rollouts: Object.values(input.rollouts),
187
+ variantDir: join(variants, sel.chosenLabel),
188
+ pool: Object.entries(input.rollouts).filter(([label]) => !label.startsWith('base')).map(([label, rollout]) => ({ label, variantDir: join(variants, label), rollout })),
189
+ decisions: input.decisions
190
+ });
191
+ layout = evidence.layout(built);
192
+ writeVariant(PI_SURFACE, input.baseVariant, join(root, 'base_harness'), { stubs: false });
193
+ writeFileSync(join(root, 'adoption.json'), `${JSON.stringify({ chosen_label: sel.chosenLabel, candidate_ids: sel.idMap, reason: sel.why }, null, 2)}\n`);
194
+ evidence.assertNoLeakPaths(root, task.leakGlobs);
195
+ evidence.assertNoGraderVerdicts(root);
196
+ }
197
+ catch {
198
+ return {};
199
+ }
200
+ const mission = [
201
+ P.experience(task.prompts ?? defaultPrompts()),
202
+ `# WHAT HAPPENED\n\nHarness ${sel.chosenLabel} was adopted. The selection reasoning was:\n\n${sel.why}\n\ncontext/adoption.json maps any anonymous IDs in that reasoning to rollout labels. Compare context/harness/ with context/base_harness/ and the candidates in context/pool/. Read the decisions and execution contrasts before writing.\n\n${layout}`
203
+ ].join('\n\n');
204
+ const expRoot = `${root}.experience`;
205
+ rmSync(expRoot, { recursive: true, force: true });
206
+ cpSync(root, expRoot, { recursive: true });
207
+ let text;
208
+ try {
209
+ const reply = await input.improver.call({ mission, contextDir: expRoot, label: `experience.${sel.mode}${sel.k}`, signal: input.signal });
210
+ sel.usd += reply.costUsd;
211
+ text = reply.text;
212
+ }
213
+ catch (error) {
214
+ if (error instanceof ImproverError)
215
+ sel.usd += error.costUsd;
216
+ return {};
217
+ }
218
+ const out = parseExperience(text);
219
+ if (out.edits)
220
+ writeFileSync(join(root, 'edits.md'), `${out.edits}\n`);
221
+ try {
222
+ evidence.assertVariantHasNoGraderVerdicts({ 'EXPERIENCE.md': JSON.stringify(out) });
223
+ }
224
+ catch {
225
+ return {};
226
+ }
227
+ sel.experience = out;
228
+ persist(sel, join(input.workDir, 'selection', `${sel.mode}${sel.k}`));
229
+ return out;
230
+ }
231
+ /** Reads `<edits>` and `<experience>` blocks. A reply without a supported lesson gives only the edits. */
232
+ export function parseExperience(text) {
233
+ const edits = /<edits>([\s\S]*?)<\/edits>/.exec(text)?.[1]?.trim();
234
+ const block = /<experience>([\s\S]*?)<\/experience>/.exec(text)?.[1];
235
+ const out = {};
236
+ if (block) {
237
+ for (const line of block.trim().split('\n')) {
238
+ const at = line.indexOf(':');
239
+ if (at < 0)
240
+ continue;
241
+ const key = line.slice(0, at).trim().toLowerCase();
242
+ if (key === 'cue' || key === 'lesson' || key === 'evidence' || key === 'confidence')
243
+ out[key] = line.slice(at + 1).trim();
244
+ }
245
+ }
246
+ if (!out.cue || !out.lesson || !out.evidence)
247
+ return edits ? { edits } : {};
248
+ if (edits)
249
+ out.edits = edits;
250
+ return out;
251
+ }
@@ -0,0 +1,84 @@
1
+ import type { Bus } from "../core/bus.js";
2
+ import * as store from "../variant/store.js";
3
+ import { type VariantDiff } from "../variant/variant.js";
4
+ import type { VariantTrust } from "../variant/trust.js";
5
+ import { type RefineHost } from "./host.js";
6
+ import { Library } from "./library.js";
7
+ import { type ImproverSettings, type RefineRuntime } from "./pi.js";
8
+ import { type RefineSummary } from "./runner.js";
9
+ import type { Executor, Improver, RecursionMode, RefineTask } from "./types.js";
10
+ export interface StartInput {
11
+ task: RefineTask;
12
+ k?: number;
13
+ mode?: RecursionMode;
14
+ /** The model and account improver, selector and reflector sessions use. Defaults to the account default. */
15
+ improver?: ImproverSettings;
16
+ /** Start from this version of the scope instead of its head. */
17
+ baseVersion?: string | null;
18
+ /** Model, effort and account for executions; a host's own session settings win (PROP-0003). */
19
+ executor?: ImproverSettings;
20
+ /** Keep every execution's workspace under `rollouts/<label>/workspace/` for measurement afterwards. */
21
+ retainWorkspaces?: boolean;
22
+ id?: string;
23
+ }
24
+ export interface CandidateView {
25
+ label: string;
26
+ kind: 'base' | 'candidate' | 'final';
27
+ ok: boolean;
28
+ delivered: boolean;
29
+ runId: string;
30
+ fingerprint: string | null;
31
+ diff: VariantDiff | null;
32
+ files: string[];
33
+ /** The retained workspace of this execution, or null when the refinement did not keep it. */
34
+ workspace: string | null;
35
+ }
36
+ export interface RefinementsOptions {
37
+ root: () => string;
38
+ bus: Bus;
39
+ runtime: RefineRuntime;
40
+ host: () => RefineHost | null;
41
+ trust: VariantTrust;
42
+ /** Replace the Pi executor and improver, for tests and the demo. */
43
+ executor?: (id: string, dir: string, signal: AbortSignal) => Executor;
44
+ improver?: (id: string, dir: string, settings: ImproverSettings, signal: AbortSignal) => Improver;
45
+ }
46
+ export declare class Refinements {
47
+ private readonly options;
48
+ private readonly active;
49
+ constructor(options: RefinementsOptions);
50
+ /** Starts a refinement and returns at once; progress arrives as `refine.changed` and `refine.event` notices. */
51
+ start(input: StartInput): {
52
+ id: string;
53
+ };
54
+ /** Waits for a running refinement; resolves at once for one that is not running. */
55
+ wait(id: string): Promise<RefineSummary | null>;
56
+ get(id: string): RefineSummary;
57
+ running(): string[];
58
+ /** Every recorded refinement, newest first, optionally for one scope. */
59
+ list(options?: {
60
+ scope?: string | null;
61
+ limit?: number;
62
+ }): RefineSummary[];
63
+ cancel(id: string): Promise<void>;
64
+ /** Every execution of a refinement: what variant it ran, how it differs from the base, what it produced. */
65
+ candidates(id: string): CandidateView[];
66
+ /**
67
+ * Makes a refinement's chosen harness (or one of its candidates, by label) the scope's head.
68
+ * Plugin code in it must already be trusted.
69
+ */
70
+ adopt(id: string, options?: {
71
+ label?: string | null;
72
+ }): store.Head;
73
+ library(scope: string): {
74
+ area: string;
75
+ entries: ReturnType<Library['list']>;
76
+ }[];
77
+ libraryEntry(scope: string, area: string, task: string): {
78
+ experience: string | null;
79
+ variant: Record<string, string>;
80
+ };
81
+ forget(scope: string, area: string, tasks: string[]): void;
82
+ scopes(): string[];
83
+ close(): Promise<void>;
84
+ }
@@ -0,0 +1,165 @@
1
+ // Refinements as the harness offers them: start one in the background, follow it, stop it, read
2
+ // what it produced, and adopt its chosen harness. The method itself is in `runner.ts`.
3
+ import { randomUUID } from 'node:crypto';
4
+ import { existsSync, readdirSync } from 'node:fs';
5
+ import { join } from 'node:path';
6
+ import { HarnessError, invalid, notFound } from "../core/errors.js";
7
+ import { readJsonOr, safeId } from "../core/fs.js";
8
+ import * as store from "../variant/store.js";
9
+ import { PI_SURFACE } from "../variant/surface.js";
10
+ import { diffSummary, readVariant } from "../variant/variant.js";
11
+ import { DEFAULT_REFINE_HOST } from "./host.js";
12
+ import { Library, libraryAreas, libraryScopes } from "./library.js";
13
+ import { PiExecutor, PiImprover, RETAINED_WORKSPACE } from "./pi.js";
14
+ import { checkWorkPrompts } from "./prompts.js";
15
+ import { readSummary, refineDir, runRefinement } from "./runner.js";
16
+ /** A refinement's variants folder; records made before PROP-0009 call it `harnesses`. */
17
+ const variantsFolder = (dir) => (existsSync(join(dir, 'variants')) || !existsSync(join(dir, 'harnesses')) ? join(dir, 'variants') : join(dir, 'harnesses'));
18
+ export class Refinements {
19
+ options;
20
+ active = new Map();
21
+ constructor(options) {
22
+ this.options = options;
23
+ }
24
+ /** Starts a refinement and returns at once; progress arrives as `refine.changed` and `refine.event` notices. */
25
+ start(input) {
26
+ const root = this.options.root();
27
+ const task = input.task;
28
+ if (!task || typeof task.id !== 'string' || !task.id.trim() || typeof task.prompt !== 'string' || !task.prompt.trim())
29
+ throw invalid('A refinement needs a task with an id and a request.');
30
+ safeId(task.scope);
31
+ if (task.prompts)
32
+ checkWorkPrompts(task.prompts);
33
+ const k = input.k ?? 1;
34
+ const mode = input.mode ?? 'parallel';
35
+ if (mode !== 'parallel' && mode !== 'sequential')
36
+ throw invalid('mode is parallel or sequential.');
37
+ const base = input.baseVersion ? { variant: store.readVersion(root, task.scope, input.baseVersion) } : store.headVariant(root, task.scope);
38
+ if (!base)
39
+ throw new HarnessError('harness_missing', `The harness '${task.scope}' has no version yet.`, 'Create or seed it first.');
40
+ const id = input.id ? safeId(input.id) : `${new Date().toISOString().slice(0, 10)}-${randomUUID().slice(0, 8)}`;
41
+ if (this.active.has(id))
42
+ throw invalid('That refinement is already running.');
43
+ const dir = refineDir(root, id);
44
+ const controller = new AbortController();
45
+ const host = this.options.host() ?? DEFAULT_REFINE_HOST;
46
+ const executor = this.options.executor?.(id, dir, controller.signal) ?? new PiExecutor(this.options.runtime, host, id, dir, controller.signal, { retainWorkspaces: input.retainWorkspaces === true, settings: input.executor });
47
+ const improver = this.options.improver?.(id, dir, input.improver ?? {}, controller.signal) ?? new PiImprover(this.options.runtime, dir, input.improver ?? {}, controller.signal);
48
+ const emit = (event) => {
49
+ if (event.type === 'summary')
50
+ this.options.bus.emit({ type: 'refine.changed', id, scope: task.scope, status: event.summary.status });
51
+ else
52
+ this.options.bus.emit({ type: 'refine.event', id, scope: task.scope, event });
53
+ };
54
+ const done = runRefinement({ root, id, task, k, mode, executor, improver, baseVariant: base.variant, settings: { executor: input.executor ?? null, improver: input.improver ?? null }, onEvent: emit, signal: controller.signal })
55
+ .catch((error) => {
56
+ this.options.bus.emit({ type: 'refine.changed', id, scope: task.scope, status: 'failed', error: error instanceof Error ? error.message : String(error) });
57
+ return null;
58
+ })
59
+ .finally(() => this.active.delete(id));
60
+ this.active.set(id, { controller, done });
61
+ return { id };
62
+ }
63
+ /** Waits for a running refinement; resolves at once for one that is not running. */
64
+ async wait(id) {
65
+ return (await this.active.get(id)?.done) ?? readSummary(this.options.root(), id);
66
+ }
67
+ get(id) {
68
+ const summary = readSummary(this.options.root(), safeId(id));
69
+ if (!summary)
70
+ throw notFound('That refinement');
71
+ return summary;
72
+ }
73
+ running() {
74
+ return [...this.active.keys()];
75
+ }
76
+ /** Every recorded refinement, newest first, optionally for one scope. */
77
+ list(options = {}) {
78
+ const dir = join(this.options.root(), 'refine');
79
+ if (!existsSync(dir))
80
+ return [];
81
+ const out = [];
82
+ for (const name of readdirSync(dir).sort().reverse()) {
83
+ if (name === 'library')
84
+ continue;
85
+ const summary = readSummary(this.options.root(), name);
86
+ if (summary && (!options.scope || summary.scope === options.scope))
87
+ out.push(summary);
88
+ }
89
+ return out.sort((a, b) => b.startedAt.localeCompare(a.startedAt)).slice(0, options.limit ?? 100);
90
+ }
91
+ async cancel(id) {
92
+ const running = this.active.get(id);
93
+ if (!running)
94
+ return;
95
+ running.controller.abort();
96
+ await running.done;
97
+ }
98
+ /** Every execution of a refinement: what variant it ran, how it differs from the base, what it produced. */
99
+ candidates(id) {
100
+ const root = this.options.root();
101
+ const summary = this.get(id);
102
+ const dir = refineDir(root, id);
103
+ const baseVariant = readVariant(PI_SURFACE, join(variantsFolder(dir), 'base'));
104
+ const finals = new Set(summary.recursion?.finals ?? []);
105
+ const labels = existsSync(join(dir, 'rollouts')) ? readdirSync(join(dir, 'rollouts')).sort() : [];
106
+ return labels.map((label) => {
107
+ const record = readJsonOr(join(dir, 'rollouts', label, 'rollout.json'), {});
108
+ const base = summary.base.find((entry) => entry.label === label);
109
+ const variantDir = join(variantsFolder(dir), label);
110
+ const variant = existsSync(variantDir) ? readVariant(PI_SURFACE, variantDir) : null;
111
+ const files = record.files ?? [];
112
+ const workspace = join(dir, 'rollouts', label, RETAINED_WORKSPACE);
113
+ return {
114
+ label,
115
+ kind: label.startsWith('base') ? 'base' : finals.has(label) ? 'final' : 'candidate',
116
+ ok: base ? base.ok : record.status ? record.status === 'completed' : true,
117
+ delivered: base ? base.delivered : files.length > 0,
118
+ runId: `${id}-${label}`,
119
+ fingerprint: variant ? store.fingerprint(variant) : null,
120
+ diff: variant && !label.startsWith('base') ? diffSummary(PI_SURFACE, baseVariant, variant) : null,
121
+ files,
122
+ workspace: existsSync(workspace) ? workspace : null
123
+ };
124
+ });
125
+ }
126
+ /**
127
+ * Makes a refinement's chosen harness (or one of its candidates, by label) the scope's head.
128
+ * Plugin code in it must already be trusted.
129
+ */
130
+ adopt(id, options = {}) {
131
+ const root = this.options.root();
132
+ const summary = this.get(id);
133
+ const label = options.label ?? summary.selection?.chosenLabel;
134
+ if (!label)
135
+ throw invalid('This refinement has nothing to adopt.');
136
+ const variant = readVariant(PI_SURFACE, join(variantsFolder(refineDir(root, id)), safeId(label)));
137
+ if (!Object.keys(variant).length)
138
+ throw notFound('That candidate variant');
139
+ const untrusted = this.options.trust.review(variant).filter((plugin) => !plugin.trusted);
140
+ if (untrusted.length)
141
+ throw new HarnessError('plugin_untrusted', `Trust the plugin code first: ${untrusted.map((plugin) => plugin.path).join(', ')}.`, 'Review the plugin files on the Harness page, trust them, then adopt.');
142
+ store.commit(root, summary.scope, variant, { kind: 'refinement', refineId: id, label, note: summary.selection?.why?.slice(0, 500) });
143
+ this.options.bus.emit({ type: 'variants.changed', scope: summary.scope });
144
+ return store.head(root, summary.scope);
145
+ }
146
+ library(scope) {
147
+ const root = this.options.root();
148
+ return libraryAreas(root, scope).map((area) => ({ area, entries: new Library(root, scope, area).list() }));
149
+ }
150
+ libraryEntry(scope, area, task) {
151
+ const library = new Library(this.options.root(), scope, area);
152
+ return { experience: library.experienceText(task), variant: library.variantOf(task) };
153
+ }
154
+ forget(scope, area, tasks) {
155
+ new Library(this.options.root(), scope, area).forget(tasks);
156
+ this.options.bus.emit({ type: 'library.changed', scope });
157
+ }
158
+ scopes() {
159
+ return libraryScopes(this.options.root());
160
+ }
161
+ async close() {
162
+ for (const id of this.running())
163
+ await this.cancel(id);
164
+ }
165
+ }
@@ -0,0 +1,67 @@
1
+ import { type Variant } from "../variant/surface.js";
2
+ import type { Executor, RefineTask } from "./types.js";
3
+ export type MatrixStatus = 'running' | 'ok' | 'partial' | 'failed' | 'cancelled';
4
+ export interface MatrixVersion {
5
+ /** Record label; also names the variant copy under the record's variants/ folder. */
6
+ label: string;
7
+ variant: Variant;
8
+ }
9
+ export interface MatrixRow {
10
+ version: string;
11
+ fingerprint: string;
12
+ task: string;
13
+ runId: string;
14
+ dir: string;
15
+ ok: boolean;
16
+ delivered: boolean;
17
+ costUsd: number;
18
+ wallMs: number;
19
+ error: string;
20
+ /** Comparability keys: one task text, one executor, one package release. */
21
+ taskHash: string;
22
+ executor: string;
23
+ packageVersion: string;
24
+ }
25
+ export interface MatrixSummary {
26
+ id: string;
27
+ status: MatrixStatus;
28
+ startedAt: string;
29
+ endedAt: string | null;
30
+ versions: string[];
31
+ tasks: string[];
32
+ rows: MatrixRow[];
33
+ usd: number;
34
+ errors: string[];
35
+ }
36
+ export type MatrixEvent = {
37
+ type: 'execution.started';
38
+ version: string;
39
+ task: string;
40
+ label: string;
41
+ } | {
42
+ type: 'execution.finished';
43
+ version: string;
44
+ task: string;
45
+ ok: boolean;
46
+ delivered: boolean;
47
+ error: string;
48
+ } | {
49
+ type: 'summary';
50
+ summary: MatrixSummary;
51
+ };
52
+ export interface MatrixInput {
53
+ root: string;
54
+ id: string;
55
+ versions: MatrixVersion[];
56
+ tasks: RefineTask[];
57
+ executor: Executor;
58
+ /** The executor's name for the records; defaults to its constructor's name. */
59
+ executorName?: string;
60
+ rolloutWidth?: number;
61
+ onEvent?: (event: MatrixEvent) => void;
62
+ signal?: AbortSignal;
63
+ }
64
+ export declare function matrixDir(root: string, id: string): string;
65
+ export declare function readMatrix(root: string, id: string): MatrixSummary | null;
66
+ /** Runs the full version × task matrix. Bad input throws; execution failures become rows. */
67
+ export declare function runMatrix(input: MatrixInput): Promise<MatrixSummary>;