@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,133 @@
1
+ import { Subagents } from "./sessions/subagentService.js";
2
+ import { Accounts } from "./accounts/accounts.js";
3
+ import { Hub, type HubOptions } from "./hub/hub.js";
4
+ import { type SecretStore } from "./accounts/secrets.js";
5
+ import { Bus } from "./core/bus.js";
6
+ import { type Directory, type HarnessEnv } from "./core/env.js";
7
+ import { ConnectedApps } from "./mcp/service.js";
8
+ import type { AppOAuthClients } from "./mcp/types.js";
9
+ import { Lessons } from "./history/lessons.js";
10
+ import type { RefineHost } from "./refine/host.js";
11
+ import { Refinements } from "./refine/service.js";
12
+ import { VariantTrust } from "./variant/trust.js";
13
+ import { World } from "./world/world.js";
14
+ import { Doctor } from "./doctor/service.js";
15
+ import type { Resolver } from "./plugins/discover.js";
16
+ import { Hooks } from "./plugins/hooks.js";
17
+ import { Plugins } from "./plugins/plugins.js";
18
+ import type { PluginDescriptor } from "./plugins/types.js";
19
+ import { Approvals } from "./sessions/approvals.js";
20
+ import type { ToolPolicy } from "./sessions/policy.js";
21
+ import { RunRegistry } from "./sessions/registry.js";
22
+ import type { SessionFactory } from "./sessions/runner.js";
23
+ import { Sessions } from "./sessions/sessions.js";
24
+ import { Terminals, type TerminalAssets } from "./terminal/terminals.js";
25
+ export interface HarnessOptions {
26
+ /** Disable the generic backend when a host supplies its own browser tools. */
27
+ browser?: boolean;
28
+ hub?: HubOptions;
29
+ /** Where knowledge and history live. May be set later with `open`. */
30
+ dataRoot?: string | null;
31
+ /** Device-local state that never belongs in the data root: accounts, approvals, connections, sockets. */
32
+ stateDir: string;
33
+ /** Where credentials are kept. Defaults to an owner-only file in the state directory. */
34
+ secrets?: SecretStore;
35
+ /** How the harness names itself to a model. */
36
+ productName?: string;
37
+ directory?: Directory;
38
+ policy?: ToolPolicy;
39
+ /** Replaces Pi, for tests. */
40
+ sessionFactory?: SessionFactory;
41
+ /** Where refinement executions work and with what; without it, a temporary copy of the task's source and Pi's own tools. */
42
+ refineHost?: RefineHost;
43
+ /** Where the built commands a terminal session runs are, when they are not beside this package. */
44
+ assets?: TerminalAssets;
45
+ /** @deprecated Ignored. The Harness-owned OpenTUI frontend is the only terminal. */
46
+ piProgram?: () => string | null;
47
+ /** Folders of built-in skills, prompts, and rules for the component library, each laid out like `registry/`. */
48
+ builtins?: string[];
49
+ /**
50
+ * The application's own parts, described as plugins: which tools, prompt sections and tool
51
+ * groups each one provides. Data only; it changes what is listed, never what runs.
52
+ */
53
+ plugins?: PluginDescriptor[];
54
+ /** Replaces Pi's own search for extensions, skills, prompts and themes, for tests. */
55
+ resolver?: Resolver;
56
+ /**
57
+ * The application's own registered OAuth clients, so a connector it publishes needs no client
58
+ * from the person. Only a catalog entry listed in `ids` can use one, and nothing is stored.
59
+ */
60
+ oauthClients?: AppOAuthClients;
61
+ /** Replaces how a plugin's hooks file is read as a module, for tests. */
62
+ hookImporter?: (address: string) => Promise<unknown>;
63
+ }
64
+ /** What starting on a data root found and repaired. */
65
+ export interface Recovery {
66
+ interruptedRuns: number;
67
+ /** The runs marked interrupted, which the application may continue with `continueFrom`. */
68
+ interruptedRunIds: string[];
69
+ /** Notes in the Wiki. */
70
+ reindexedPages: number;
71
+ /** Where an earlier Wiki's memory, facts and revisions were moved, when they were. */
72
+ legacyWiki?: string | null;
73
+ /** Set when the storage migration failed; the old data is left as it was. */
74
+ migrationError: string | null;
75
+ }
76
+ declare class Env implements HarnessEnv {
77
+ readonly directory: Directory;
78
+ readonly productName: string;
79
+ dataRoot: string | null;
80
+ readonly bus: Bus;
81
+ constructor(dataRoot: string | null, directory: Directory, productName: string, bus: Bus);
82
+ get root(): string;
83
+ }
84
+ export declare class Harness {
85
+ private readonly browserEnabled;
86
+ readonly hub: Hub;
87
+ readonly bus: Bus;
88
+ readonly env: Env;
89
+ readonly stateDir: string;
90
+ readonly policy: ToolPolicy;
91
+ readonly accounts: Accounts;
92
+ readonly approvals: Approvals;
93
+ readonly runs: RunRegistry;
94
+ readonly apps: ConnectedApps;
95
+ readonly plugins: Plugins;
96
+ /** Code plugins gave the harness to run after memory, the Wiki or history changed. */
97
+ readonly hooks: Hooks;
98
+ /** Every part described as a plugin: the harness's own, then the application's. */
99
+ descriptors: readonly PluginDescriptor[];
100
+ applicationPlugins: ReadonlySet<string>;
101
+ readonly subagents: Subagents;
102
+ readonly sessions: Sessions;
103
+ /** Web, browser and computer tools (page 13). */
104
+ readonly world: World;
105
+ /** Which plugin code in variants a person trusted. */
106
+ readonly trust: VariantTrust;
107
+ /** Refinement: improving a variant from evidence of how it ran. */
108
+ readonly refine: Refinements;
109
+ /** Reflection on finished runs, when the `lessons` plugin is on (page 08). */
110
+ readonly lessons: Lessons;
111
+ refineHost: RefineHost | null;
112
+ readonly terminals: Terminals;
113
+ readonly doctor: Doctor;
114
+ /** Resolves when what was loaded in the background at construction is in place. */
115
+ readonly ready: Promise<void>;
116
+ recovery: Recovery;
117
+ constructor(options: HarnessOptions);
118
+ get dataRoot(): string | null;
119
+ /** Sets the application's own parts, described as plugins. One with a harness plugin's id is ignored. */
120
+ describe(plugins: readonly PluginDescriptor[]): void;
121
+ /**
122
+ * Opens a data root: moves an earlier Wiki's memory and facts aside (once), lays out the Wiki,
123
+ * settles runs that never ended, and refreshes the history index. `agentIds` is accepted for
124
+ * hosts written against earlier versions and is not used.
125
+ */
126
+ open(dataRoot: string, _agentIds?: readonly string[]): Recovery;
127
+ /** Rebuilds the history index from the run records. Returns the notes in the Wiki. */
128
+ rebuildIndex(): number;
129
+ /** Stops live runs and refinements and releases the index. */
130
+ close(): Promise<void>;
131
+ }
132
+ export declare function createHarness(options: HarnessOptions): Harness;
133
+ export {};
@@ -0,0 +1,299 @@
1
+ // The harness, assembled: Pi sessions on isolated accounts, versioned variants that shape
2
+ // them, refinement that improves those variants from evidence, a compiled prompt, project notes,
3
+ // tools, and connected apps. An application embeds one of these and adds its own prompt
4
+ // sections, tools, and policy; nothing here knows what that application is.
5
+ import { Subagents } from "./sessions/subagentService.js";
6
+ import { mkdirSync } from 'node:fs';
7
+ import { join } from 'node:path';
8
+ import { Accounts } from "./accounts/accounts.js";
9
+ import { Hub } from "./hub/hub.js";
10
+ import * as capabilities from "./capabilities/api.js";
11
+ import { ensureSharedDir, isolateProcess } from "./accounts/env.js";
12
+ import { fileSecretStore } from "./accounts/secrets.js";
13
+ import { Bus, log } from "./core/bus.js";
14
+ import { DEFAULT_PRODUCT_NAME, EMPTY_DIRECTORY } from "./core/env.js";
15
+ import { HarnessError } from "./core/errors.js";
16
+ import { readJsonOr } from "./core/fs.js";
17
+ import { closeIndex } from "./core/index.js";
18
+ import { ConnectedApps } from "./mcp/service.js";
19
+ import { migrateConnectionScopes } from "./mcp/scopeMigration.js";
20
+ import { Lessons } from "./history/lessons.js";
21
+ import * as recall from "./history/recall.js";
22
+ import { Refinements } from "./refine/service.js";
23
+ import { configureBuiltins } from "./variant/components.js";
24
+ import { migrateVariantLayout } from "./variant/migrate.js";
25
+ import { VariantTrust } from "./variant/trust.js";
26
+ import * as notes from "./wiki/notes.js";
27
+ import * as pluginApi from "./plugins/api.js";
28
+ import * as attachments from "./plugins/attachments.js";
29
+ import { HARNESS_PLUGINS } from "./plugins/builtin.js";
30
+ import { World } from "./world/world.js";
31
+ import { Doctor } from "./doctor/service.js";
32
+ import { builtinChecks } from "./doctor/checks.js";
33
+ import { diagnosticProbe } from "./doctor/probe.js";
34
+ import { Hooks } from "./plugins/hooks.js";
35
+ import { packageFolders, Plugins } from "./plugins/plugins.js";
36
+ import { approvalKey, Approvals } from "./sessions/approvals.js";
37
+ import { RunRegistry } from "./sessions/registry.js";
38
+ import { markInterruptedRuns } from "./sessions/runStore.js";
39
+ import { Sessions } from "./sessions/sessions.js";
40
+ import { Terminals } from "./terminal/terminals.js";
41
+ class Env {
42
+ directory;
43
+ productName;
44
+ dataRoot;
45
+ bus;
46
+ constructor(dataRoot, directory, productName, bus) {
47
+ this.directory = directory;
48
+ this.productName = productName;
49
+ this.dataRoot = dataRoot;
50
+ this.bus = bus;
51
+ }
52
+ get root() {
53
+ if (!this.dataRoot)
54
+ throw new HarnessError('data_root_missing', 'Choose a data location first.', 'Open Settings → Projects and Storage.');
55
+ return this.dataRoot;
56
+ }
57
+ }
58
+ export class Harness {
59
+ browserEnabled;
60
+ hub;
61
+ bus = new Bus();
62
+ env;
63
+ stateDir;
64
+ policy;
65
+ accounts;
66
+ approvals;
67
+ runs;
68
+ apps;
69
+ plugins;
70
+ /** Code plugins gave the harness to run after memory, the Wiki or history changed. */
71
+ hooks;
72
+ /** Every part described as a plugin: the harness's own, then the application's. */
73
+ descriptors = HARNESS_PLUGINS;
74
+ applicationPlugins = new Set();
75
+ subagents;
76
+ sessions;
77
+ /** Web, browser and computer tools (page 13). */
78
+ world;
79
+ /** Which plugin code in variants a person trusted. */
80
+ trust;
81
+ /** Refinement: improving a variant from evidence of how it ran. */
82
+ refine;
83
+ /** Reflection on finished runs, when the `lessons` plugin is on (page 08). */
84
+ lessons;
85
+ refineHost;
86
+ terminals;
87
+ doctor;
88
+ /** Resolves when what was loaded in the background at construction is in place. */
89
+ ready;
90
+ recovery = { interruptedRuns: 0, interruptedRunIds: [], reindexedPages: 0, migrationError: null };
91
+ constructor(options) {
92
+ this.browserEnabled = options.browser !== false;
93
+ this.stateDir = options.stateDir;
94
+ mkdirSync(this.stateDir, { recursive: true });
95
+ // Before anything can start a session: no inherited credential, no `~/.pi`.
96
+ isolateProcess(join(this.stateDir, 'accounts'));
97
+ this.env = new Env(options.dataRoot || null, options.directory ?? EMPTY_DIRECTORY, options.productName ?? DEFAULT_PRODUCT_NAME, this.bus);
98
+ this.hub = new Hub(this, options.hub);
99
+ this.policy = options.policy ?? {};
100
+ configureBuiltins(options.builtins ?? []);
101
+ this.trust = new VariantTrust(this.stateDir);
102
+ this.refineHost = options.refineHost ?? null;
103
+ const secrets = options.secrets ?? fileSecretStore(join(this.stateDir, 'secrets.json'));
104
+ this.accounts = new Accounts({ dir: join(this.stateDir, 'accounts'), secrets, bus: this.bus });
105
+ this.approvals = new Approvals(this.stateDir, this.bus);
106
+ this.runs = new RunRegistry({
107
+ root: () => this.env.root,
108
+ automatic: async (run, target, operation, standing) => {
109
+ if (standing === 'switch')
110
+ return this.approvals.isAuto(approvalKey(run)) ? 'always' : null;
111
+ return this.approvals.automatic(run, target, (await this.policy.approval?.({ run, target, operation })) ?? {});
112
+ },
113
+ redact: (event) => this.apps.connections.redactEvent(event),
114
+ ended: (runId, sessionId) => this.apps.revokeRun(runId, sessionId)
115
+ });
116
+ this.apps = new ConnectedApps({ env: this.env, stateDir: this.stateDir, secrets, bus: this.bus, runs: this.runs, policy: this.policy, oauthClients: options.oauthClients });
117
+ this.plugins = new Plugins({ stateDir: this.stateDir, bus: this.bus, resolver: options.resolver, attachments: () => (this.env.dataRoot ? attachments.load(this.env.dataRoot) : null), packagesDir: () => (this.env.dataRoot ? join(this.env.dataRoot, 'plugins') : null) });
118
+ this.hooks = new Hooks({
119
+ stateDir: this.stateDir,
120
+ bus: this.bus,
121
+ // A hook runs for everyone or not at all, so only what is on everywhere and trusted counts.
122
+ // The shared folder stands in for an account: packages are the same for all of them.
123
+ wanted: async () => {
124
+ if (!this.env.dataRoot)
125
+ return [];
126
+ const shared = ensureSharedDir(join(this.stateDir, 'accounts'));
127
+ // A hook comes only with a package: one kept beside the data, or one the shared settings
128
+ // name. With neither there is nothing to look for, and Pi is not loaded to find that out.
129
+ const named = readJsonOr(join(shared, 'settings.json'), {}).packages;
130
+ if (!packageFolders(join(this.env.dataRoot, 'plugins')).length && !(Array.isArray(named) && named.length))
131
+ return [];
132
+ return (await this.plugins.loading({ cwd: this.stateDir, agentDir: shared, caller: {} })).hooks;
133
+ },
134
+ call: (connection, tool, args) => this.apps.callUnattended(connection, tool, args ?? {}),
135
+ importFile: options.hookImporter
136
+ });
137
+ let reloadTimer = null;
138
+ this.bus.on((notice) => {
139
+ if (notice.type !== 'plugins.changed' || reloadTimer)
140
+ return;
141
+ // Several changes arrive together when a plugin is installed or switched; one reload covers them.
142
+ reloadTimer = setTimeout(() => {
143
+ reloadTimer = null;
144
+ void this.hooks.reload();
145
+ }, 50);
146
+ reloadTimer.unref?.();
147
+ });
148
+ this.describe(options.plugins ?? []);
149
+ this.subagents = new Subagents(this.env, this.runs, (input) => this.sessions.run(input));
150
+ this.sessions = new Sessions({
151
+ subagents: this.subagents,
152
+ env: this.env,
153
+ accounts: this.accounts,
154
+ runs: this.runs,
155
+ policy: this.policy,
156
+ broker: this.apps,
157
+ plugins: this.plugins,
158
+ resolveCapabilities: (caller, tools, cwd) => capabilities.resolve(this, { agentId: caller.agentId ?? null, projectId: caller.projectId ?? null, cwd, tools }),
159
+ factory: options.sessionFactory,
160
+ trust: this.trust
161
+ });
162
+ this.world = new World({ root: () => this.env.root, stateDir: this.stateDir, secrets, browser: this.browserEnabled ? undefined : false });
163
+ // The harness's own world tools come first; a tool an application provides under the same name is not added again.
164
+ this.sessions.provide(this.world.provider());
165
+ this.doctor = new Doctor({
166
+ checks: context => builtinChecks(this, context, secrets, options.assets),
167
+ probe: (context, signal, action) => diagnosticProbe(this, context, signal, action)
168
+ });
169
+ const refineRuntime = { root: () => this.env.root, runs: this.runs, run: (input) => this.sessions.run(input) };
170
+ this.refine = new Refinements({ root: () => this.env.root, bus: this.bus, trust: this.trust, host: () => this.refineHost, runtime: refineRuntime });
171
+ this.lessons = new Lessons({ root: () => this.env.root, runtime: refineRuntime });
172
+ this.terminals = new Terminals({ trust: this.trust, subagents: this.subagents, resolveCapabilities: (caller, tools, cwd) => capabilities.resolve(this, { agentId: caller.agentId ?? null, projectId: caller.projectId ?? null, cwd, tools }), env: this.env, stateDir: this.stateDir, accounts: this.accounts, runs: this.runs, approvals: this.approvals, apps: this.apps, policy: this.policy, bus: this.bus, plugins: this.plugins, pluginControl: { list: (scope) => pluginApi.list(this, scope), attach: (params, on) => pluginApi.attach(this, params, on), trust: (scope) => pluginApi.trust(this, scope), untrust: (scope) => pluginApi.untrust(this, scope), configure: (params) => pluginApi.configure(this, params) }, assets: options.assets, hub: this.hub, world: this.world, doctor: this.doctor });
173
+ this.ready = this.apps.start().catch((error) => log('connected apps', error instanceof Error ? error.message : String(error)));
174
+ this.runs.listen((event, run) => {
175
+ this.accounts.onRunEvent(event, run);
176
+ // Each run is indexed when it ends, so the next turn can already recall it.
177
+ if (event.type === 'completed' || event.type === 'failed')
178
+ recall.indexRun(this.env.root, event.runId);
179
+ if (run?.trigger === 'doctor')
180
+ return;
181
+ if ((event.type === 'completed' || event.type === 'failed') && run) {
182
+ if (event.type === 'completed')
183
+ this.lessons.consider(run);
184
+ this.hooks.emit({ type: 'history.run.ended', runId: run.id, sessionId: run.sessionId, status: run.status, goal: run.goal ?? null, agentId: run.agentId ?? null, projectId: run.projectId ?? null, startedAt: run.startedAt, endedAt: run.endedAt ?? null, at: event.timestamp });
185
+ }
186
+ });
187
+ }
188
+ get dataRoot() {
189
+ return this.env.dataRoot;
190
+ }
191
+ /** Sets the application's own parts, described as plugins. One with a harness plugin's id is ignored. */
192
+ describe(plugins) {
193
+ const foundation = HARNESS_PLUGINS.filter(plugin => this.browserEnabled || plugin.id !== 'browser');
194
+ const own = new Set(foundation.map((plugin) => plugin.id));
195
+ const supplied = plugins.filter((plugin) => plugin && typeof plugin.id === 'string' && !own.has(plugin.id));
196
+ this.descriptors = [...foundation, ...supplied];
197
+ this.applicationPlugins = new Set(supplied.map((plugin) => plugin.id));
198
+ }
199
+ /**
200
+ * Opens a data root: moves an earlier Wiki's memory and facts aside (once), lays out the Wiki,
201
+ * settles runs that never ended, and refreshes the history index. `agentIds` is accepted for
202
+ * hosts written against earlier versions and is not used.
203
+ */
204
+ open(dataRoot, _agentIds = []) {
205
+ if (this.hub.busy && this.env.dataRoot !== dataRoot)
206
+ throw new HarnessError('hub_busy', 'Wait for the hub installation before changing the data location.');
207
+ if (this.env.dataRoot && this.env.dataRoot !== dataRoot)
208
+ closeIndex(this.env.dataRoot);
209
+ this.env.dataRoot = dataRoot;
210
+ this.hub.watch(dataRoot);
211
+ const root = dataRoot;
212
+ this.hooks.watch(notes.wikiDir(root));
213
+ void this.hooks.reload();
214
+ for (const folder of ['registry/skills', 'registry/prompts', 'registry/rules', 'config', 'runs'])
215
+ mkdirSync(join(root, folder), { recursive: true });
216
+ let migrationError = null;
217
+ try {
218
+ const moved = migrateVariantLayout(root);
219
+ if (moved.length)
220
+ log(`renamed ${moved.length} earlier harness folders to variants`);
221
+ }
222
+ catch (error) {
223
+ migrationError = error instanceof Error ? error.message : String(error);
224
+ log('variant layout', migrationError);
225
+ }
226
+ mkdirSync(join(root, 'variants'), { recursive: true });
227
+ let legacyWiki = null;
228
+ try {
229
+ legacyWiki = notes.moveLegacy(root);
230
+ if (legacyWiki)
231
+ log(`moved the earlier Wiki's memory, facts and revisions to ${legacyWiki}`);
232
+ notes.ensureLayout(root, this.env.productName);
233
+ }
234
+ catch (error) {
235
+ migrationError = error instanceof Error ? error.message : String(error);
236
+ log('Wiki layout', migrationError);
237
+ }
238
+ try {
239
+ migrateConnectionScopes(root, this.stateDir);
240
+ }
241
+ catch (error) {
242
+ const detail = error instanceof Error ? error.message : String(error);
243
+ migrationError = migrationError ? `${migrationError}; connector scope migration: ${detail}` : detail;
244
+ log('connector scope migration failed', detail);
245
+ }
246
+ let interruptedRunIds = [];
247
+ try {
248
+ interruptedRunIds = markInterruptedRuns(root, `${this.env.productName} stopped before the run settled.`);
249
+ }
250
+ catch (error) {
251
+ log('run recovery', error instanceof Error ? error.message : String(error));
252
+ }
253
+ try {
254
+ // Runs recorded while nothing was running become searchable.
255
+ recall.sync(root);
256
+ }
257
+ catch (error) {
258
+ log('recall', error instanceof Error ? error.message : String(error));
259
+ }
260
+ this.recovery = { interruptedRuns: interruptedRunIds.length, interruptedRunIds, reindexedPages: safeCount(root), migrationError, legacyWiki };
261
+ return this.recovery;
262
+ }
263
+ /** Rebuilds the history index from the run records. Returns the notes in the Wiki. */
264
+ rebuildIndex() {
265
+ recall.sync(this.env.root);
266
+ const count = safeCount(this.env.root);
267
+ this.recovery = { ...this.recovery, reindexedPages: count };
268
+ return count;
269
+ }
270
+ /** Stops live runs and refinements and releases the index. */
271
+ async close() {
272
+ await this.doctor.close();
273
+ this.hub.close();
274
+ await this.refine.close();
275
+ await this.lessons.close();
276
+ await this.terminals.close();
277
+ await this.runs.interruptAll();
278
+ await this.world.close();
279
+ await this.hooks.settled().catch(() => undefined);
280
+ this.hooks.close();
281
+ await this.apps.close();
282
+ if (this.env.dataRoot)
283
+ closeIndex(this.env.dataRoot);
284
+ }
285
+ }
286
+ function safeCount(root) {
287
+ try {
288
+ return notes.paths(root).length;
289
+ }
290
+ catch {
291
+ return 0;
292
+ }
293
+ }
294
+ export function createHarness(options) {
295
+ const harness = new Harness(options);
296
+ if (options.dataRoot)
297
+ harness.open(options.dataRoot);
298
+ return harness;
299
+ }
@@ -0,0 +1,2 @@
1
+ export declare const REFLECTION_IDENTITY = "You read the record of one finished agent run and decide whether it teaches a lesson worth keeping for later runs. Work only inside the current folder: the evidence is under `context/`. Do not change any file. Follow the mission in the user message exactly.";
2
+ export declare function lessonMission(): string;
@@ -0,0 +1,15 @@
1
+ // The mission of a reflection run: read how one finished run went and write at most one lesson
2
+ // for the Wiki. The lesson shape (a cue, a checkable lesson, the evidence, or NO_ENTRY) is the
3
+ // one the refinement library uses (`refine/prompts.ts::experience`), from harness².
4
+ import { ANSWER_FREE, EVIDENCE_BOUNDARY } from "../refine/prompts.js";
5
+ export const REFLECTION_IDENTITY = 'You read the record of one finished agent run and decide whether it teaches a lesson worth keeping for later runs. Work only inside the current folder: the evidence is under `context/`. Do not change any file. Follow the mission in the user message exactly.';
6
+ export function lessonMission() {
7
+ return [
8
+ 'Read `context/run.md`: the complete record of one finished run of an agent, in the order it happened -- the request, what the agent said, every tool call and what came back. `context/lessons.md` lists the lessons already kept, one per line, as `path -- cue`.',
9
+ '# WHAT A LESSON IS\n\nA lesson is something a later run, on a different request, would do differently because it read it. It comes from a contrast the record shows: an approach that failed and one that then worked, a tool call that was wasted, a check that caught a mistake, a step that had to be redone.\n\nThe `cue` describes the SHAPE OF SITUATION the lesson applies to, so it can fire on a different matter. Not this run\'s facts -- the pattern. The `lesson` is the operation to perform, stated so it can be applied and checked.\n\nToo generic is useless (\'be thorough\', \'read the code first\'); too specific never fires again (\'the config file is at src/app.json\'). Aim between: \'when a build tool reports a missing module after a dependency upgrade, check the lockfile was regenerated before editing imports\'.\n\nNever put into a lesson a fact about this run\'s subject: names of files, people, projects, values, or anything the user said about their own work. Those are wrong anchors for any other run, and they may be private.',
10
+ '# WHEN TO WRITE NOTHING\n\nMost runs teach nothing new. If the record shows no concrete contrast -- the work simply went as planned, or the only lesson would be generic advice -- reply with the single line NO_ENTRY. That is the expected answer for most runs.\n\nIf one of the lessons in `context/lessons.md` already says the same thing, reply with the single line `SAME <path>` naming it, instead of a new entry.',
11
+ ANSWER_FREE,
12
+ EVIDENCE_BOUNDARY,
13
+ '# OUTPUT FORMAT\n\nExactly one of:\n\nNO_ENTRY\n\nSAME <path from context/lessons.md>\n\n<experience>\ncue: <the shape of situation this applies to, one line>\nlesson: <the operation to perform, one line>\nevidence: <the contrast in the record this rests on, one line, without the subject\'s facts>\nconfidence: <high|medium|low, and why>\n</experience>'
14
+ ].join('\n\n') + '\n';
15
+ }
@@ -0,0 +1,52 @@
1
+ import { type RefineRuntime } from "../refine/pi.js";
2
+ import type { Improver } from "../refine/types.js";
3
+ import type { RunRecord } from "../sessions/contracts.js";
4
+ export declare const REFLECTION_TRIGGER = "reflection";
5
+ export declare const LESSONS_FOLDER = "library/lessons";
6
+ export type LessonOutcome = {
7
+ kind: 'written';
8
+ path: string;
9
+ } | {
10
+ kind: 'same';
11
+ path: string;
12
+ } | {
13
+ kind: 'no_entry';
14
+ } | {
15
+ kind: 'skipped';
16
+ reason: string;
17
+ };
18
+ export interface LessonsOptions {
19
+ root: () => string;
20
+ runtime: RefineRuntime;
21
+ /** Builds the reflection session for one run. Tests pass a fake; by default it is a `PiImprover`. */
22
+ reflector?: (run: RunRecord, model: string | null, signal: AbortSignal) => Improver;
23
+ }
24
+ interface KeptLesson {
25
+ path: string;
26
+ cue: string;
27
+ sources: string[];
28
+ front: Record<string, unknown>;
29
+ body: string;
30
+ }
31
+ /** The lessons the Wiki keeps now. */
32
+ export declare function keptLessons(root: string): KeptLesson[];
33
+ export declare class Lessons {
34
+ private readonly options;
35
+ private readonly queue;
36
+ private readonly abort;
37
+ private draining;
38
+ private closed;
39
+ constructor(options: LessonsOptions);
40
+ /** Called when a run completes. Cheap: the work happens later, one run at a time. */
41
+ consider(run: RunRecord | null): void;
42
+ /** Resolves when everything queued so far was reflected on. */
43
+ idle(): Promise<void>;
44
+ close(): Promise<void>;
45
+ private drain;
46
+ /** The plugin's settings for this run's caller, or null when it is off for them. */
47
+ private limits;
48
+ /** Reflects on one finished run. Exposed for tests and for a host that wants to ask directly. */
49
+ reflect(runId: string): Promise<LessonOutcome>;
50
+ private keep;
51
+ }
52
+ export {};