@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,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>;