@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,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
+ }