@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,114 @@
1
+ // A deterministic local executor and improver that exercise the real refinement workflow with
2
+ // no model and no credentials: the base harness sums only positive ledger amounts, and the
3
+ // scripted improver removes that filter.
4
+ //
5
+ // Ported from Harness² (Apache-2.0, Google LLC; `harness2/demo.py`).
6
+ import { spawnSync } from 'node:child_process';
7
+ import { cpSync, existsSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
8
+ import { tmpdir } from 'node:os';
9
+ import { join } from 'node:path';
10
+ export const DEMO_SCRIPT = `import { readFileSync } from 'node:fs'
11
+
12
+ const rows = readFileSync(process.argv[2], 'utf8').trim().split('\\n').slice(1)
13
+ const cents = rows.map((row) => Math.round(Number(row) * 100))
14
+ const total = cents.filter((amount) => amount > 0).reduce((sum, amount) => sum + amount, 0)
15
+ console.log(\`Total: \${(total / 100).toFixed(2)}\`)
16
+ `;
17
+ export function demoBaseVariant() {
18
+ return {
19
+ 'systemprompt.md': 'Reconcile the ledger using node scripts/summarize.mjs.\n',
20
+ 'guardrails.md': '',
21
+ 'memory.md': '',
22
+ 'tool_guidance.md': '',
23
+ 'scripts/summarize.mjs': DEMO_SCRIPT
24
+ };
25
+ }
26
+ export const DEMO_LEDGERS = {
27
+ 'ledger-1': '100.25\n-20.10\n5.00\n',
28
+ 'ledger-2': '35.50\n-10.25\n-5.00\n'
29
+ };
30
+ /** Writes the demo's source ledgers under `root` and returns the tasks. */
31
+ export function demoTasks(root, scope = 'demo') {
32
+ return Object.entries(DEMO_LEDGERS).map(([id, amounts]) => {
33
+ const sourceDir = join(root, 'sources', id);
34
+ mkdirSync(sourceDir, { recursive: true });
35
+ writeFileSync(join(sourceDir, 'ledger.csv'), `amount\n${amounts}`);
36
+ writeFileSync(join(sourceDir, 'reference_answer.txt'), 'never shown to a model');
37
+ return {
38
+ id,
39
+ scope,
40
+ domain: 'accounting',
41
+ prompt: 'Sum every signed amount in ledger.csv. Return Total: with two decimal places.',
42
+ sourceDir,
43
+ leakGlobs: ['reference_answer.txt'],
44
+ prompts: { work: 'reconcile signed amounts in a transaction ledger' }
45
+ };
46
+ });
47
+ }
48
+ export class DemoExecutor {
49
+ root;
50
+ executions = 0;
51
+ constructor(root) {
52
+ this.root = root;
53
+ }
54
+ async execute(task, variantDir, label, runId) {
55
+ this.executions++;
56
+ const dir = join(this.root, 'executions', runId);
57
+ mkdirSync(dir, { recursive: true });
58
+ const script = join(variantDir ?? '', 'scripts', 'summarize.mjs');
59
+ const result = spawnSync(process.execPath, [script, join(task.sourceDir ?? '', 'ledger.csv')], { encoding: 'utf8', timeout: 10_000 });
60
+ if (result.status !== 0) {
61
+ return { label, runId, dir, ok: false, delivered: false, costUsd: 0, wallMs: 0, error: result.stderr || 'script failed' };
62
+ }
63
+ writeFileSync(join(dir, 'answer.txt'), result.stdout);
64
+ writeFileSync(join(dir, 'trajectory.md'), `[ACTION] Run scripts/summarize.mjs on ledger.csv\n[OBSERVATION]\n${result.stdout}`);
65
+ return { label, runId, dir, ok: true, delivered: true, costUsd: 0, wallMs: 0, error: '' };
66
+ }
67
+ trajectory(rollout) {
68
+ return readFileSync(join(rollout.dir, 'trajectory.md'), 'utf8');
69
+ }
70
+ deliverableFiles(rollout) {
71
+ const path = join(rollout.dir, 'answer.txt');
72
+ return existsSync(path) ? { 'answer.txt': readFileSync(path, 'utf8') } : {};
73
+ }
74
+ validateVariant(_task, variant) {
75
+ if (!variant['scripts/summarize.mjs'])
76
+ throw new Error('The local executor requires scripts/summarize.mjs');
77
+ }
78
+ }
79
+ function signedTotal(ledger) {
80
+ const cents = ledger.trim().split('\n').slice(1).map((row) => Math.round(Number(row) * 100));
81
+ return (cents.reduce((sum, amount) => sum + amount, 0) / 100).toFixed(2);
82
+ }
83
+ /** Scripted edits, selection and reflection. */
84
+ export class DemoImprover {
85
+ calls = [];
86
+ async call(input) {
87
+ this.calls.push(input.label);
88
+ const context = input.contextDir;
89
+ let workspace = null;
90
+ let text;
91
+ if (input.label.startsWith('select.')) {
92
+ const expected = `Total: ${signedTotal(readFileSync(join(context, 'source', 'ledger.csv'), 'utf8'))}`;
93
+ const ids = readdirSync(join(context, 'candidates')).filter((name) => name.endsWith('.md')).sort();
94
+ const chosen = ids.find((name) => readFileSync(join(context, 'candidates', name), 'utf8').includes(expected))?.replace(/\.md$/, '') ?? ids[0].replace(/\.md$/, '');
95
+ text = `<why>The signed total matches the source ledger.</why>\n\`\`\`choice\n${chosen}\n\`\`\``;
96
+ }
97
+ else if (input.label.startsWith('experience.')) {
98
+ const changed = readFileSync(join(context, 'harness', 'scripts', 'summarize.mjs'), 'utf8') !== readFileSync(join(context, 'base_harness', 'scripts', 'summarize.mjs'), 'utf8');
99
+ text =
100
+ `<edits>\ncomponent: scripts/summarize.mjs\ncandidates: inv1\nchange: dropped the positive-only filter from the amount sum\nobserved: the probe total included the credits the base run omitted\nverdict: ${changed ? 'helped' : 'no observed effect'}\n</edits>\n\n` +
101
+ (changed
102
+ ? '<experience>\ncue: When a ledger includes credits and debits\nlesson: Include both signs when summing in scripts/summarize.mjs.\nevidence: The scripts/summarize.mjs row -- removing the positive-only filter changed the probe total to include the credits omitted by the base trajectory.\nconfidence: high for this observed arithmetic contrast\n</experience>'
103
+ : 'NO_ENTRY');
104
+ }
105
+ else {
106
+ workspace = mkdtempSync(join(tmpdir(), 'harness-demo-'));
107
+ cpSync(join(context, 'harness'), workspace, { recursive: true });
108
+ const script = join(workspace, 'scripts', 'summarize.mjs');
109
+ writeFileSync(script, readFileSync(script, 'utf8').replace('.filter((amount) => amount > 0)', ''));
110
+ text = '<notes>Keep signed amounts: the base total omitted credits in the source ledger.</notes>';
111
+ }
112
+ return { label: input.label, text, costUsd: 0, attempts: 1, cached: false, workspace };
113
+ }
114
+ }
@@ -0,0 +1,55 @@
1
+ import { type Variant } from "../variant/surface.js";
2
+ import type { Executor, RefineTask, Rollout } from "./types.js";
3
+ /** Strings that only a grader's own output contains. A tripwire, not the defence itself. */
4
+ export declare const GRADER_VERDICT_MARKERS: readonly ["deterministic_eval_summary", "deterministic_eval_result", "judge_scope_and_deterministic_status", "Judge findings on the rendered result", "\"passed_count\"", "\"pass_rate\"", "\"test_pass_rate\"", "review_verdict", "\"reviewVerdict\""];
5
+ /** Minimum per-observation truncation; lower values fabricate defects. */
6
+ export declare const MIN_OBS_TRUNC = 10000;
7
+ /** Refuses a folder holding a path the task marks as an answer key. */
8
+ export declare function assertNoLeakPaths(root: string, globs?: readonly string[]): void;
9
+ /** Refuses a folder containing a grader's output, by file name and by content. */
10
+ export declare function assertNoGraderVerdicts(root: string, markers?: readonly string[]): void;
11
+ /** The same tripwire on a variant, before it is rolled or stored. */
12
+ export declare function assertVariantHasNoGraderVerdicts(variant: Record<string, string>, markers?: readonly string[]): void;
13
+ /** Copies the task's source material under `root/source`, minus answer-key paths. */
14
+ export declare function copySource(task: RefineTask, root: string): number;
15
+ /** A line-based unified diff, enough for a reader to see what changed. */
16
+ export declare function unifiedDiff(before: Variant, after: Variant, fromLabel: string, toLabel: string): string;
17
+ export interface PoolEntry {
18
+ label: string;
19
+ /** The candidate's harness folder, or null. */
20
+ variantDir: string | null;
21
+ rollout: Rollout | null;
22
+ }
23
+ export interface EvidenceFolder {
24
+ root: string;
25
+ taskId: string;
26
+ rollouts: string[];
27
+ deliverables: string[];
28
+ harnessFiles: number;
29
+ library: boolean;
30
+ pool: string[];
31
+ failed: string[];
32
+ sourceFiles: number;
33
+ decisions: number;
34
+ }
35
+ /** The evidence-layout listing that goes in a mission; it mentions only what exists. */
36
+ export declare function layout(evidence: EvidenceFolder): string;
37
+ export interface BuildInput {
38
+ task: RefineTask;
39
+ executor: Executor;
40
+ rollouts?: readonly Rollout[];
41
+ variantDir?: string | null;
42
+ libraryDir?: string | null;
43
+ pool?: readonly PoolEntry[];
44
+ decisions?: Record<string, string>;
45
+ obsTrunc?: number;
46
+ }
47
+ declare function renderDeliverable(executor: Executor, rollout: Rollout): string;
48
+ export { renderDeliverable };
49
+ /**
50
+ * Writes the evidence folder and returns what landed, so a mission describes only that. A
51
+ * trajectory is written in full; `obsTrunc` applies per observation.
52
+ */
53
+ export declare function build(dest: string, input: BuildInput): EvidenceFolder;
54
+ /** The short pointer to the evidence on disk: the job, where the evidence is, and the instruction to open it. */
55
+ export declare function mission(evidence: EvidenceFolder, job: string): string;
@@ -0,0 +1,330 @@
1
+ // The evidence folder an improver reads. Evidence is served as files and the prompt is a short
2
+ // pointer, so nothing is truncated to fit a prompt:
3
+ //
4
+ // context/task.md the task as the agent received it
5
+ // context/source/ the material it was done from
6
+ // context/rollouts/<label>.md full trajectories
7
+ // context/deliverables/<label>/ what each rollout produced
8
+ // context/harness/<rel> the harness being edited
9
+ // context/library/INDEX.md earlier tasks in this area and their full harnesses
10
+ // context/pool/<label>/ candidate harnesses, their diffs and rollouts
11
+ // context/decisions/<label>.md earlier edit and composition notes
12
+ //
13
+ // Ported from Harness² (Apache-2.0, Google LLC; `harness2/core/context.py`).
14
+ import { copyFileSync, cpSync, existsSync, mkdirSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync } from 'node:fs';
15
+ import { dirname, extname, join, relative, sep } from 'node:path';
16
+ import { PI_SURFACE } from "../variant/surface.js";
17
+ import { readVariant } from "../variant/variant.js";
18
+ /** Strings that only a grader's own output contains. A tripwire, not the defence itself. */
19
+ export const GRADER_VERDICT_MARKERS = [
20
+ 'deterministic_eval_summary',
21
+ 'deterministic_eval_result',
22
+ 'judge_scope_and_deterministic_status',
23
+ 'Judge findings on the rendered result',
24
+ '"passed_count"',
25
+ '"pass_rate"',
26
+ '"test_pass_rate"',
27
+ 'review_verdict',
28
+ '"reviewVerdict"'
29
+ ];
30
+ const SCANNED = new Set(['.md', '.txt', '.json', '.csv', '.tsv', '.yaml', '.yml', '.html', '.htm', '.log', '.py', '.js', '.mjs', '.ts', '.sh', '.xml', '.ini', '.toml', '.patch', '.diff', '']);
31
+ /** Minimum per-observation truncation; lower values fabricate defects. */
32
+ export const MIN_OBS_TRUNC = 10_000;
33
+ function files(dir) {
34
+ const out = [];
35
+ let names;
36
+ try {
37
+ names = readdirSync(dir);
38
+ }
39
+ catch {
40
+ return out;
41
+ }
42
+ for (const name of names.sort()) {
43
+ const path = join(dir, name);
44
+ let isDir = false;
45
+ try {
46
+ isDir = statSync(path).isDirectory();
47
+ }
48
+ catch {
49
+ continue;
50
+ }
51
+ if (isDir)
52
+ out.push(...files(path));
53
+ else
54
+ out.push(path);
55
+ }
56
+ return out;
57
+ }
58
+ function rel(root, path) {
59
+ return relative(root, path).split(sep).join('/');
60
+ }
61
+ function globToRegExp(glob) {
62
+ const pattern = glob.replace(/\\/g, '/').replace(/^\.\//, '');
63
+ let out = '';
64
+ for (const ch of pattern) {
65
+ if (ch === '*')
66
+ out += '[^]*';
67
+ else if (ch === '?')
68
+ out += '.';
69
+ else
70
+ out += ch.replace(/[.+^${}()|[\]\\]/g, '\\$&');
71
+ }
72
+ return new RegExp(`^(?:[^]*/)?${out}$`);
73
+ }
74
+ /** Refuses a folder holding a path the task marks as an answer key. */
75
+ export function assertNoLeakPaths(root, globs = []) {
76
+ if (!globs.length || !existsSync(root))
77
+ return;
78
+ const rx = globs.map(globToRegExp);
79
+ const hits = files(root).map((path) => rel(root, path)).filter((path) => rx.some((r) => r.test(path)));
80
+ if (hits.length)
81
+ throw new Error(`answer-key path(s) would enter model context: ${hits.sort().slice(0, 8).join(', ')}`);
82
+ }
83
+ /** Refuses a folder containing a grader's output, by file name and by content. */
84
+ export function assertNoGraderVerdicts(root, markers = GRADER_VERDICT_MARKERS) {
85
+ if (!existsSync(root))
86
+ return;
87
+ for (const path of files(root)) {
88
+ const name = rel(root, path);
89
+ for (const marker of markers) {
90
+ if (name.includes(marker))
91
+ throw new Error(`grader verdict would enter model context: '${name}' matched marker '${marker}' in its NAME. Find the read path that produced it.`);
92
+ }
93
+ if (!SCANNED.has(extname(path).toLowerCase()))
94
+ continue;
95
+ let body;
96
+ try {
97
+ body = readFileSync(path, 'utf8');
98
+ }
99
+ catch {
100
+ continue;
101
+ }
102
+ for (const marker of markers) {
103
+ const at = body.indexOf(marker);
104
+ if (at >= 0)
105
+ throw new Error(`grader verdict would enter model context: '${name}' contains marker '${marker}' at offset ${at}. Find the read path that produced it.`);
106
+ }
107
+ }
108
+ }
109
+ /** The same tripwire on a variant, before it is rolled or stored. */
110
+ export function assertVariantHasNoGraderVerdicts(variant, markers = GRADER_VERDICT_MARKERS) {
111
+ for (const [name, body] of Object.entries(variant).sort()) {
112
+ for (const marker of markers) {
113
+ if (name.includes(marker))
114
+ throw new Error(`harness file '${name}' has grader-verdict marker '${marker}' in its NAME; rename it`);
115
+ if (SCANNED.has(extname(name).toLowerCase()) && body.includes(marker))
116
+ throw new Error(`harness file '${name}' contains grader-verdict marker '${marker}'; remove that string -- files carrying it cannot be served as evidence to later tasks`);
117
+ }
118
+ }
119
+ }
120
+ function copyFolder(src, dst) {
121
+ let n = 0;
122
+ for (const path of files(src)) {
123
+ if (path.includes(`${sep}__pycache__${sep}`) || path.endsWith('.pyc'))
124
+ continue;
125
+ const target = join(dst, relative(src, path));
126
+ mkdirSync(dirname(target), { recursive: true });
127
+ copyFileSync(path, target);
128
+ n++;
129
+ }
130
+ return n;
131
+ }
132
+ /** Copies the task's source material under `root/source`, minus answer-key paths. */
133
+ export function copySource(task, root) {
134
+ const src = task.sourceDir;
135
+ if (!src || !existsSync(src))
136
+ return 0;
137
+ const leak = (task.leakGlobs ?? []).map(globToRegExp);
138
+ let n = 0;
139
+ for (const path of files(src)) {
140
+ const name = rel(src, path);
141
+ if (name.split('/').includes('__pycache__') || leak.some((r) => r.test(name)))
142
+ continue;
143
+ const target = join(root, 'source', name);
144
+ mkdirSync(dirname(target), { recursive: true });
145
+ copyFileSync(path, target);
146
+ n++;
147
+ }
148
+ if (n)
149
+ assertNoLeakPaths(join(root, 'source'), task.leakGlobs);
150
+ return n;
151
+ }
152
+ /** A line-based unified diff, enough for a reader to see what changed. */
153
+ export function unifiedDiff(before, after, fromLabel, toLabel) {
154
+ const out = [];
155
+ for (const name of [...new Set([...Object.keys(before), ...Object.keys(after)])].sort()) {
156
+ const a = before[name] ?? '';
157
+ const b = after[name] ?? '';
158
+ if (a === b)
159
+ continue;
160
+ out.push(`--- ${fromLabel}/${name}`, `+++ ${toLabel}/${name}`);
161
+ const x = a ? a.split('\n') : [];
162
+ const y = b ? b.split('\n') : [];
163
+ // A longest-common-subsequence walk; variants are small enough for the quadratic table.
164
+ const dp = Array.from({ length: x.length + 1 }, () => new Array(y.length + 1).fill(0));
165
+ for (let i = x.length - 1; i >= 0; i--)
166
+ for (let j = y.length - 1; j >= 0; j--)
167
+ dp[i][j] = x[i] === y[j] ? dp[i + 1][j + 1] + 1 : Math.max(dp[i + 1][j], dp[i][j + 1]);
168
+ let i = 0;
169
+ let j = 0;
170
+ while (i < x.length || j < y.length) {
171
+ if (i < x.length && j < y.length && x[i] === y[j]) {
172
+ out.push(` ${x[i]}`);
173
+ i++;
174
+ j++;
175
+ }
176
+ else if (j < y.length && (i >= x.length || dp[i][j + 1] >= dp[i + 1][j])) {
177
+ out.push(`+${y[j]}`);
178
+ j++;
179
+ }
180
+ else {
181
+ out.push(`-${x[i]}`);
182
+ i++;
183
+ }
184
+ }
185
+ }
186
+ return out.length ? `${out.join('\n')}\n` : '';
187
+ }
188
+ /** The evidence-layout listing that goes in a mission; it mentions only what exists. */
189
+ export function layout(evidence) {
190
+ const lines = ['context/task.md the task as the agent received it'];
191
+ if (evidence.sourceFiles)
192
+ lines.push('context/source/ task source materials');
193
+ if (evidence.decisions)
194
+ lines.push('context/decisions/ earlier edits and composition decisions');
195
+ if (evidence.rollouts.length) {
196
+ const names = evidence.rollouts.slice(0, 6).map((label) => `${label}.md`).join(', ');
197
+ const more = evidence.rollouts.length > 6 ? ` (+${evidence.rollouts.length - 6} more)` : '';
198
+ lines.push(`context/rollouts/ FULL trajectories: ${names}${more}`);
199
+ }
200
+ if (evidence.deliverables.length)
201
+ lines.push('context/deliverables/<label>/ the files each rollout produced, one per artifact (browse INDEX.md for the set)');
202
+ if (evidence.harnessFiles)
203
+ lines.push(`context/harness/ the harness you are editing (${evidence.harnessFiles} files)`);
204
+ if (evidence.pool.length)
205
+ lines.push(`context/pool/ ${evidence.pool.length} candidates, each with its harness and its rollout`);
206
+ if (evidence.library)
207
+ lines.push('context/library/ earlier tasks in this area -- browse INDEX.md first, then open what looks relevant');
208
+ return lines.join('\n');
209
+ }
210
+ function writeRollout(dest, rollout, executor, obsTrunc) {
211
+ let failure = '';
212
+ mkdirSync(join(dest, 'rollouts'), { recursive: true });
213
+ try {
214
+ writeFileSync(join(dest, 'rollouts', `${rollout.label}.md`), executor.trajectory(rollout, { obsTrunc }));
215
+ }
216
+ catch (error) {
217
+ const message = error instanceof Error ? error.message : String(error);
218
+ writeFileSync(join(dest, 'rollouts', `${rollout.label}.md`), `(trajectory unavailable: ${message})`);
219
+ failure = `${rollout.label}: ${message}`;
220
+ }
221
+ const dir = join(dest, 'deliverables', rollout.label);
222
+ mkdirSync(dir, { recursive: true });
223
+ let produced = {};
224
+ try {
225
+ produced = executor.deliverableFiles(rollout);
226
+ }
227
+ catch (error) {
228
+ produced = { 'unavailable.md': `(deliverable unavailable: ${error instanceof Error ? error.message : String(error)})` };
229
+ }
230
+ const names = Object.keys(produced).sort();
231
+ for (const name of names) {
232
+ const target = join(dir, name);
233
+ mkdirSync(dirname(target), { recursive: true });
234
+ writeFileSync(target, produced[name]);
235
+ }
236
+ writeFileSync(join(dir, 'INDEX.md'), names.length ? `# ${rollout.label} produced ${names.length} file(s)\n\n${names.map((name) => `- \`${name}\``).join('\n')}\n` : `# ${rollout.label} produced nothing\n`);
237
+ return failure;
238
+ }
239
+ function renderDeliverable(executor, rollout) {
240
+ const produced = executor.deliverableFiles(rollout);
241
+ const names = Object.keys(produced).sort();
242
+ if (!names.length)
243
+ return '';
244
+ if (names.length === 1)
245
+ return produced[names[0]];
246
+ return names.map((name) => `## ${name}\n\n${produced[name]}`).join('\n\n');
247
+ }
248
+ export { renderDeliverable };
249
+ /**
250
+ * Writes the evidence folder and returns what landed, so a mission describes only that. A
251
+ * trajectory is written in full; `obsTrunc` applies per observation.
252
+ */
253
+ export function build(dest, input) {
254
+ const { task, executor } = input;
255
+ rmSync(dest, { recursive: true, force: true });
256
+ mkdirSync(dest, { recursive: true });
257
+ const obsTrunc = Math.max(input.obsTrunc ?? 50_000, MIN_OBS_TRUNC);
258
+ writeFileSync(join(dest, 'task.md'), task.prompt);
259
+ const sourceFiles = copySource(task, dest);
260
+ for (const [label, notes] of Object.entries(input.decisions ?? {})) {
261
+ mkdirSync(join(dest, 'decisions'), { recursive: true });
262
+ writeFileSync(join(dest, 'decisions', `${label}.md`), notes || 'No decision notes returned.');
263
+ }
264
+ const rollouts = [];
265
+ const deliverables = [];
266
+ const failed = [];
267
+ for (const rollout of input.rollouts ?? []) {
268
+ const failure = writeRollout(dest, rollout, executor, obsTrunc);
269
+ if (failure)
270
+ failed.push(failure);
271
+ else
272
+ rollouts.push(rollout.label);
273
+ deliverables.push(rollout.label);
274
+ }
275
+ let harnessFiles = 0;
276
+ if (input.variantDir && existsSync(input.variantDir)) {
277
+ assertNoLeakPaths(input.variantDir, task.leakGlobs);
278
+ harnessFiles = copyFolder(input.variantDir, join(dest, 'harness'));
279
+ }
280
+ const pool = [];
281
+ for (const entry of input.pool ?? []) {
282
+ const dir = join(dest, 'pool', entry.label);
283
+ mkdirSync(dir, { recursive: true });
284
+ if (entry.variantDir && existsSync(entry.variantDir)) {
285
+ assertNoLeakPaths(entry.variantDir, task.leakGlobs);
286
+ copyFolder(entry.variantDir, join(dir, 'harness'));
287
+ const reference = readVariant(PI_SURFACE, join(dest, 'harness'));
288
+ const candidate = readVariant(PI_SURFACE, entry.variantDir);
289
+ writeFileSync(join(dir, 'harness.diff'), unifiedDiff(reference, candidate, 'current', entry.label));
290
+ }
291
+ if (entry.rollout) {
292
+ try {
293
+ writeFileSync(join(dir, 'rollout.md'), executor.trajectory(entry.rollout, { obsTrunc }));
294
+ writeFileSync(join(dir, 'produced.md'), renderDeliverable(executor, entry.rollout) || '(nothing produced)');
295
+ }
296
+ catch (error) {
297
+ writeFileSync(join(dir, 'rollout.md'), `(unavailable: ${error instanceof Error ? error.message : String(error)})`);
298
+ }
299
+ }
300
+ pool.push(entry.label);
301
+ }
302
+ let library = false;
303
+ if (input.libraryDir && existsSync(input.libraryDir) && readdirSync(input.libraryDir).length) {
304
+ assertNoLeakPaths(input.libraryDir, task.leakGlobs);
305
+ cpSync(input.libraryDir, join(dest, 'library'), { recursive: true });
306
+ library = true;
307
+ }
308
+ assertNoLeakPaths(dest, task.leakGlobs);
309
+ assertNoGraderVerdicts(dest);
310
+ if ((input.rollouts ?? []).length && !rollouts.length) {
311
+ throw new Error(`no trajectory could be rendered for ANY rollout -- the improver would be adapting on nothing: ${failed.slice(0, 4).join('; ')}`);
312
+ }
313
+ return { root: dest, taskId: task.id, rollouts, deliverables, harnessFiles, library, pool, failed, sourceFiles, decisions: Object.keys(input.decisions ?? {}).length };
314
+ }
315
+ /** The short pointer to the evidence on disk: the job, where the evidence is, and the instruction to open it. */
316
+ export function mission(evidence, job) {
317
+ return [
318
+ job.trim(),
319
+ '',
320
+ '# YOUR EVIDENCE',
321
+ '',
322
+ 'It is on disk, in `context/`. Read it -- do not answer from this message alone.',
323
+ '',
324
+ layout(evidence),
325
+ '',
326
+ 'Every trajectory EVENT is present: the trajectory was not clipped to fit this mission. An individual observation may contain an explicit renderer-truncation marker; that marker is ours, not behavior by the solver. Do not diagnose it as a solver failure.',
327
+ '',
328
+ 'Read `task.md` and the current harness first. Inventory every available rollout or candidate and inspect each at least once before deciding. For a candidate, compare what changed from its editing baseline, what behavior changed in its rollout, what improved, and what regressed or remained unresolved. Then deep-read the evidence relevant to any edit. Cite the specific trajectory moment behind every change; one you cannot trace to a moment is speculation.'
329
+ ].join('\n');
330
+ }
@@ -0,0 +1,51 @@
1
+ import type { CallerContext } from "../core/caller.js";
2
+ import type { Launch } from "../prompt/compile.js";
3
+ import type { Effort } from "../sessions/runner.js";
4
+ import type { RefineTask } from "./types.js";
5
+ /** How one execution of a task runs: who it works as and with what. */
6
+ export interface RolloutSession {
7
+ caller: CallerContext;
8
+ tools: {
9
+ allow: string[];
10
+ gated?: string[];
11
+ };
12
+ launch?: Launch;
13
+ model?: string | null;
14
+ effort?: Effort | null;
15
+ accountId?: string | null;
16
+ poolId?: string | null;
17
+ connections?: boolean | {
18
+ readOnly?: boolean;
19
+ };
20
+ providers?: boolean;
21
+ }
22
+ export interface RolloutWorkspace {
23
+ /** The folder the execution works in. It must not be a folder a person is working in. */
24
+ cwd: string;
25
+ /** Called after what the execution produced has been read. */
26
+ cleanup?: () => Promise<void>;
27
+ }
28
+ export interface RefineHost {
29
+ /** A fresh, isolated folder for one execution. */
30
+ prepareWorkspace(input: {
31
+ refineId: string;
32
+ label: string;
33
+ task: RefineTask;
34
+ }): Promise<RolloutWorkspace>;
35
+ /** The session settings an execution runs with. */
36
+ session(input: {
37
+ refineId: string;
38
+ label: string;
39
+ task: RefineTask;
40
+ }): Promise<RolloutSession>;
41
+ /** What one execution produced, filename → readable text. Defaults to its reply and the files it changed. */
42
+ deliverable?(input: {
43
+ cwd: string;
44
+ reply: string;
45
+ task: RefineTask;
46
+ }): Promise<Record<string, string>>;
47
+ }
48
+ /** The reply, and every text file the execution added or changed relative to the task's source. */
49
+ export declare function defaultDeliverable(cwd: string, reply: string, sourceDir: string | null | undefined): Record<string, string>;
50
+ /** For a host that supplies nothing: a temporary copy of the task's source, the caller as the scope, and Pi's file and shell tools. */
51
+ export declare const DEFAULT_REFINE_HOST: RefineHost;
@@ -0,0 +1,76 @@
1
+ // The application's part in refinement (the seventh extension point). The harness runs the
2
+ // method; the application says where an execution may work, as whom, with which tools, and what
3
+ // it produced. Nothing here names an application concept.
4
+ import { cpSync, existsSync, mkdtempSync, readdirSync, readFileSync, rmSync, statSync } from 'node:fs';
5
+ import { tmpdir } from 'node:os';
6
+ import { join, relative, sep } from 'node:path';
7
+ const TEXT_LIMIT = 200_000;
8
+ const FILES_LIMIT = 40;
9
+ function files(dir, into = [], base = dir) {
10
+ let names;
11
+ try {
12
+ names = readdirSync(dir);
13
+ }
14
+ catch {
15
+ return into;
16
+ }
17
+ for (const name of names.sort()) {
18
+ if (name === '.git' || name === 'node_modules' || name.startsWith('.'))
19
+ continue;
20
+ const path = join(dir, name);
21
+ try {
22
+ if (statSync(path).isDirectory())
23
+ files(path, into, base);
24
+ else
25
+ into.push(relative(base, path).split(sep).join('/'));
26
+ }
27
+ catch {
28
+ // Skip what cannot be read.
29
+ }
30
+ if (into.length > 2_000)
31
+ break;
32
+ }
33
+ return into;
34
+ }
35
+ function readable(path) {
36
+ try {
37
+ const buffer = readFileSync(path);
38
+ if (buffer.length > TEXT_LIMIT || buffer.includes(0))
39
+ return null;
40
+ return buffer.toString('utf8');
41
+ }
42
+ catch {
43
+ return null;
44
+ }
45
+ }
46
+ /** The reply, and every text file the execution added or changed relative to the task's source. */
47
+ export function defaultDeliverable(cwd, reply, sourceDir) {
48
+ const out = {};
49
+ if (reply.trim())
50
+ out['reply.md'] = reply;
51
+ let count = 0;
52
+ for (const rel of files(cwd)) {
53
+ const text = readable(join(cwd, rel));
54
+ if (text === null)
55
+ continue;
56
+ const before = sourceDir && existsSync(join(sourceDir, rel)) ? readable(join(sourceDir, rel)) : null;
57
+ if (before === text)
58
+ continue;
59
+ out[`files/${rel}`] = text;
60
+ if (++count >= FILES_LIMIT)
61
+ break;
62
+ }
63
+ return out;
64
+ }
65
+ /** For a host that supplies nothing: a temporary copy of the task's source, the caller as the scope, and Pi's file and shell tools. */
66
+ export const DEFAULT_REFINE_HOST = {
67
+ async prepareWorkspace({ task }) {
68
+ const cwd = mkdtempSync(join(tmpdir(), 'harness-rollout-'));
69
+ if (task.sourceDir && existsSync(task.sourceDir))
70
+ cpSync(task.sourceDir, cwd, { recursive: true });
71
+ return { cwd, cleanup: async () => rmSync(cwd, { recursive: true, force: true }) };
72
+ },
73
+ async session({ task }) {
74
+ return { caller: { agentId: task.scope, actor: 'Code' }, tools: { allow: ['read', 'grep', 'find', 'ls', 'edit', 'write', 'bash'] } };
75
+ }
76
+ };
@@ -0,0 +1,48 @@
1
+ /** R = 4k: k shared base + 2k candidates + k finals. */
2
+ export declare const expectedRollouts: (k: number) => number;
3
+ /** P = 3k: k INV + k DOM + k compositions. */
4
+ export declare const expectedSessions: (k: number) => number;
5
+ export declare class BudgetError extends Error {
6
+ constructor(message: string);
7
+ }
8
+ export interface LedgerEntry {
9
+ kind: 'rollout' | 'session';
10
+ label: string;
11
+ usd: number;
12
+ cached: boolean;
13
+ attempts: number;
14
+ }
15
+ export interface LedgerRecord {
16
+ mode: string;
17
+ taskId: string;
18
+ k: number;
19
+ R: number;
20
+ expectedR: number;
21
+ P: number;
22
+ expectedP: number;
23
+ sessionAttempts: number;
24
+ usd: number;
25
+ rolloutUsd: number;
26
+ sessionUsd: number;
27
+ rollouts: string[];
28
+ sessions: string[];
29
+ }
30
+ export declare class Ledger {
31
+ readonly mode: string;
32
+ readonly taskId: string;
33
+ readonly k: number;
34
+ readonly entries: LedgerEntry[];
35
+ constructor(mode: string, taskId: string, k: number);
36
+ rollout(label: string, usd?: number, cached?: boolean): void;
37
+ session(label: string, usd?: number, options?: {
38
+ cached?: boolean;
39
+ attempts?: number;
40
+ }): void;
41
+ labels(kind: LedgerEntry['kind']): string[];
42
+ get R(): number;
43
+ get P(): number;
44
+ usd(kind?: LedgerEntry['kind']): number;
45
+ /** Throws unless the entries show exactly R=4k and P=3k with no repeated label. */
46
+ assertIdentity(): void;
47
+ toRecord(): LedgerRecord;
48
+ }