@xingular/harness 0.1.7 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (683) hide show
  1. package/CHANGELOG.md +97 -1
  2. package/LICENSE +202 -0
  3. package/NOTICE.md +22 -0
  4. package/README.md +187 -85
  5. package/THIRD_PARTY_LICENSES.md +942 -0
  6. package/dist/cli.js +13701 -13498
  7. package/dist/sdk/accounts/accounts.d.ts +165 -0
  8. package/dist/sdk/accounts/accounts.js +730 -0
  9. package/dist/sdk/accounts/choices.d.ts +23 -0
  10. package/dist/sdk/accounts/choices.js +62 -0
  11. package/dist/sdk/accounts/env.d.ts +78 -0
  12. package/dist/sdk/accounts/env.js +294 -0
  13. package/dist/sdk/accounts/secrets.d.ts +16 -0
  14. package/dist/sdk/accounts/secrets.js +40 -0
  15. package/dist/sdk/accounts/store.d.ts +114 -0
  16. package/dist/sdk/accounts/store.js +255 -0
  17. package/dist/sdk/browser/config.d.ts +16 -0
  18. package/dist/sdk/browser/config.js +22 -0
  19. package/dist/sdk/browser/diagnostics.d.ts +4 -0
  20. package/dist/sdk/browser/diagnostics.js +38 -0
  21. package/dist/sdk/browser/index.d.ts +17 -0
  22. package/dist/sdk/browser/index.js +65 -0
  23. package/dist/sdk/browser/network.d.ts +10 -0
  24. package/dist/sdk/browser/network.js +59 -0
  25. package/dist/sdk/browser/session.d.ts +84 -0
  26. package/dist/sdk/browser/session.js +192 -0
  27. package/dist/sdk/browser/tools.d.ts +8 -0
  28. package/dist/sdk/browser/tools.js +329 -0
  29. package/dist/sdk/capabilities/api.d.ts +22 -0
  30. package/dist/sdk/capabilities/api.js +54 -0
  31. package/dist/sdk/capabilities/runSnapshot.d.ts +18 -0
  32. package/dist/sdk/capabilities/runSnapshot.js +47 -0
  33. package/dist/sdk/capabilities/types.d.ts +29 -0
  34. package/dist/sdk/capabilities/types.js +1 -0
  35. package/dist/sdk/cli.d.ts +2 -0
  36. package/dist/sdk/cli.js +142 -0
  37. package/dist/sdk/core/bus.d.ts +23 -0
  38. package/dist/sdk/core/bus.js +76 -0
  39. package/dist/sdk/core/caller.d.ts +22 -0
  40. package/dist/sdk/core/caller.js +16 -0
  41. package/dist/sdk/core/changes.d.ts +15 -0
  42. package/dist/sdk/core/changes.js +15 -0
  43. package/dist/sdk/core/effort.d.ts +2 -0
  44. package/dist/sdk/core/effort.js +1 -0
  45. package/dist/sdk/core/env.d.ts +18 -0
  46. package/dist/sdk/core/env.js +8 -0
  47. package/dist/sdk/core/errors.d.ts +15 -0
  48. package/dist/sdk/core/errors.js +24 -0
  49. package/dist/sdk/core/frontmatter.d.ts +12 -0
  50. package/dist/sdk/core/frontmatter.js +50 -0
  51. package/dist/sdk/core/fs.d.ts +18 -0
  52. package/dist/sdk/core/fs.js +106 -0
  53. package/dist/sdk/core/index.d.ts +24 -0
  54. package/dist/sdk/core/index.js +187 -0
  55. package/dist/sdk/core/path.d.ts +7 -0
  56. package/dist/sdk/core/path.js +79 -0
  57. package/dist/sdk/core/projects.d.ts +18 -0
  58. package/dist/sdk/core/projects.js +67 -0
  59. package/dist/sdk/core/secrets.d.ts +2 -0
  60. package/dist/sdk/core/secrets.js +5 -0
  61. package/dist/sdk/core/text.d.ts +7 -0
  62. package/dist/sdk/core/text.js +40 -0
  63. package/dist/sdk/doctor/checks.d.ts +5 -0
  64. package/dist/sdk/doctor/checks.js +208 -0
  65. package/dist/sdk/doctor/probe.d.ts +4 -0
  66. package/dist/sdk/doctor/probe.js +92 -0
  67. package/dist/sdk/doctor/service.d.ts +23 -0
  68. package/dist/sdk/doctor/service.js +144 -0
  69. package/dist/sdk/doctor/types.d.ts +141 -0
  70. package/dist/sdk/doctor/types.js +29 -0
  71. package/dist/sdk/harness.d.ts +133 -0
  72. package/dist/sdk/harness.js +299 -0
  73. package/dist/sdk/history/lessonPrompt.d.ts +2 -0
  74. package/dist/sdk/history/lessonPrompt.js +15 -0
  75. package/dist/sdk/history/lessons.d.ts +52 -0
  76. package/dist/sdk/history/lessons.js +173 -0
  77. package/dist/sdk/history/recall.d.ts +68 -0
  78. package/dist/sdk/history/recall.js +199 -0
  79. package/dist/sdk/history/trajectory.d.ts +7 -0
  80. package/dist/sdk/history/trajectory.js +216 -0
  81. package/dist/sdk/hub/catalog.json +123 -0
  82. package/dist/sdk/hub/cli.d.ts +7 -0
  83. package/dist/sdk/hub/cli.js +81 -0
  84. package/dist/sdk/hub/hub.d.ts +74 -0
  85. package/dist/sdk/hub/hub.js +474 -0
  86. package/dist/sdk/hub/schema.d.ts +280 -0
  87. package/dist/sdk/hub/schema.js +78 -0
  88. package/dist/sdk/index.d.ts +63 -0
  89. package/dist/sdk/index.js +48 -0
  90. package/dist/sdk/mcp/connections.d.ts +83 -0
  91. package/dist/sdk/mcp/connections.js +669 -0
  92. package/dist/sdk/mcp/manager.d.ts +26 -0
  93. package/dist/sdk/mcp/manager.js +124 -0
  94. package/dist/sdk/mcp/oauth.d.ts +35 -0
  95. package/dist/sdk/mcp/oauth.js +171 -0
  96. package/dist/sdk/mcp/scopeMigration.d.ts +19 -0
  97. package/dist/sdk/mcp/scopeMigration.js +198 -0
  98. package/dist/sdk/mcp/service.d.ts +160 -0
  99. package/dist/sdk/mcp/service.js +510 -0
  100. package/dist/sdk/mcp/types.d.ts +131 -0
  101. package/dist/sdk/mcp/types.js +49 -0
  102. package/dist/sdk/pi/runtime.d.ts +13 -0
  103. package/dist/sdk/pi/runtime.js +31 -0
  104. package/dist/sdk/plugins/api.d.ts +66 -0
  105. package/dist/sdk/plugins/api.js +155 -0
  106. package/dist/sdk/plugins/attachments.d.ts +46 -0
  107. package/dist/sdk/plugins/attachments.js +111 -0
  108. package/dist/sdk/plugins/builtin.d.ts +6 -0
  109. package/dist/sdk/plugins/builtin.js +68 -0
  110. package/dist/sdk/plugins/catalogue.d.ts +29 -0
  111. package/dist/sdk/plugins/catalogue.js +196 -0
  112. package/dist/sdk/plugins/cli.d.ts +13 -0
  113. package/dist/sdk/plugins/cli.js +187 -0
  114. package/dist/sdk/plugins/discover.d.ts +42 -0
  115. package/dist/sdk/plugins/discover.js +115 -0
  116. package/dist/sdk/plugins/firstParty.d.ts +50 -0
  117. package/dist/sdk/plugins/firstParty.js +113 -0
  118. package/dist/sdk/plugins/hooks.d.ts +94 -0
  119. package/dist/sdk/plugins/hooks.js +162 -0
  120. package/dist/sdk/plugins/identity.d.ts +19 -0
  121. package/dist/sdk/plugins/identity.js +48 -0
  122. package/dist/sdk/plugins/install.d.ts +20 -0
  123. package/dist/sdk/plugins/install.js +110 -0
  124. package/dist/sdk/plugins/inventory.d.ts +22 -0
  125. package/dist/sdk/plugins/inventory.js +110 -0
  126. package/dist/sdk/plugins/manifest.d.ts +13 -0
  127. package/dist/sdk/plugins/manifest.js +56 -0
  128. package/dist/sdk/plugins/plugins.d.ts +104 -0
  129. package/dist/sdk/plugins/plugins.js +164 -0
  130. package/dist/sdk/plugins/runtime.d.ts +9 -0
  131. package/dist/sdk/plugins/runtime.js +95 -0
  132. package/dist/sdk/plugins/trust.d.ts +44 -0
  133. package/dist/sdk/plugins/trust.js +120 -0
  134. package/dist/sdk/plugins/types.d.ts +159 -0
  135. package/dist/sdk/plugins/types.js +7 -0
  136. package/dist/sdk/prompt/compile.d.ts +174 -0
  137. package/dist/sdk/prompt/compile.js +396 -0
  138. package/dist/sdk/refine/cli.d.ts +4 -0
  139. package/dist/sdk/refine/cli.js +186 -0
  140. package/dist/sdk/refine/demo.d.ts +21 -0
  141. package/dist/sdk/refine/demo.js +114 -0
  142. package/dist/sdk/refine/evidence.d.ts +55 -0
  143. package/dist/sdk/refine/evidence.js +330 -0
  144. package/dist/sdk/refine/host.d.ts +51 -0
  145. package/dist/sdk/refine/host.js +76 -0
  146. package/dist/sdk/refine/ledger.d.ts +48 -0
  147. package/dist/sdk/refine/ledger.js +76 -0
  148. package/dist/sdk/refine/library.d.ts +55 -0
  149. package/dist/sdk/refine/library.js +177 -0
  150. package/dist/sdk/refine/pi.d.ts +72 -0
  151. package/dist/sdk/refine/pi.js +248 -0
  152. package/dist/sdk/refine/prompts.d.ts +45 -0
  153. package/dist/sdk/refine/prompts.js +390 -0
  154. package/dist/sdk/refine/recursion.d.ts +113 -0
  155. package/dist/sdk/refine/recursion.js +258 -0
  156. package/dist/sdk/refine/runner.d.ts +81 -0
  157. package/dist/sdk/refine/runner.js +150 -0
  158. package/dist/sdk/refine/selection.d.ts +57 -0
  159. package/dist/sdk/refine/selection.js +251 -0
  160. package/dist/sdk/refine/service.d.ts +84 -0
  161. package/dist/sdk/refine/service.js +165 -0
  162. package/dist/sdk/refine/suite.d.ts +67 -0
  163. package/dist/sdk/refine/suite.js +174 -0
  164. package/dist/sdk/refine/trajectory.d.ts +9 -0
  165. package/dist/sdk/refine/trajectory.js +68 -0
  166. package/dist/sdk/refine/types.d.ts +77 -0
  167. package/dist/sdk/refine/types.js +10 -0
  168. package/dist/sdk/server/methods.d.ts +3 -0
  169. package/dist/sdk/server/methods.js +370 -0
  170. package/dist/sdk/server/remote.d.ts +19 -0
  171. package/dist/sdk/server/remote.js +84 -0
  172. package/dist/sdk/server/rpc.d.ts +20 -0
  173. package/dist/sdk/server/rpc.js +102 -0
  174. package/dist/sdk/server/serve.d.ts +10 -0
  175. package/dist/sdk/server/serve.js +18 -0
  176. package/dist/sdk/sessions/approvals.d.ts +47 -0
  177. package/dist/sdk/sessions/approvals.js +119 -0
  178. package/dist/sdk/sessions/continuation.d.ts +48 -0
  179. package/dist/sdk/sessions/continuation.js +85 -0
  180. package/dist/sdk/sessions/contracts.d.ts +534 -0
  181. package/dist/sdk/sessions/contracts.js +299 -0
  182. package/dist/sdk/sessions/extensionUi.d.ts +19 -0
  183. package/dist/sdk/sessions/extensionUi.js +64 -0
  184. package/dist/sdk/sessions/history.d.ts +16 -0
  185. package/dist/sdk/sessions/history.js +68 -0
  186. package/dist/sdk/sessions/lineageJoin.d.ts +2 -0
  187. package/dist/sdk/sessions/lineageJoin.js +61 -0
  188. package/dist/sdk/sessions/planMode.d.ts +36 -0
  189. package/dist/sdk/sessions/planMode.js +84 -0
  190. package/dist/sdk/sessions/policy.d.ts +43 -0
  191. package/dist/sdk/sessions/policy.js +1 -0
  192. package/dist/sdk/sessions/pricing.d.ts +34 -0
  193. package/dist/sdk/sessions/pricing.js +40 -0
  194. package/dist/sdk/sessions/reasoningSummaries.d.ts +11 -0
  195. package/dist/sdk/sessions/reasoningSummaries.js +61 -0
  196. package/dist/sdk/sessions/registry.d.ts +102 -0
  197. package/dist/sdk/sessions/registry.js +383 -0
  198. package/dist/sdk/sessions/runIndex.d.ts +21 -0
  199. package/dist/sdk/sessions/runIndex.js +65 -0
  200. package/dist/sdk/sessions/runStore.d.ts +66 -0
  201. package/dist/sdk/sessions/runStore.js +335 -0
  202. package/dist/sdk/sessions/runner.d.ts +213 -0
  203. package/dist/sdk/sessions/runner.js +589 -0
  204. package/dist/sdk/sessions/sessions.d.ts +140 -0
  205. package/dist/sdk/sessions/sessions.js +394 -0
  206. package/dist/sdk/sessions/subagentService.d.ts +41 -0
  207. package/dist/sdk/sessions/subagentService.js +247 -0
  208. package/dist/sdk/sessions/subagents.d.ts +50 -0
  209. package/dist/sdk/sessions/subagents.js +68 -0
  210. package/dist/sdk/terminal/accountsMenu.d.ts +46 -0
  211. package/dist/sdk/terminal/accountsMenu.js +392 -0
  212. package/dist/sdk/terminal/cli.d.ts +20 -0
  213. package/dist/sdk/terminal/cli.js +121 -0
  214. package/dist/sdk/terminal/client.d.ts +15 -0
  215. package/dist/sdk/terminal/client.js +126 -0
  216. package/dist/sdk/terminal/control.d.ts +4 -0
  217. package/dist/sdk/terminal/control.js +25 -0
  218. package/dist/sdk/terminal/controller.d.ts +72 -0
  219. package/dist/sdk/terminal/controller.js +351 -0
  220. package/dist/sdk/terminal/hubMenu.d.ts +10 -0
  221. package/dist/sdk/terminal/hubMenu.js +34 -0
  222. package/dist/sdk/terminal/launch.d.ts +5 -0
  223. package/dist/sdk/terminal/launch.js +27 -0
  224. package/dist/sdk/terminal/logs.d.ts +14 -0
  225. package/dist/sdk/terminal/logs.js +59 -0
  226. package/dist/sdk/terminal/piExtension.d.ts +6 -0
  227. package/dist/sdk/terminal/piExtension.js +392 -0
  228. package/dist/sdk/terminal/pluginMenu.d.ts +34 -0
  229. package/dist/sdk/terminal/pluginMenu.js +101 -0
  230. package/dist/sdk/terminal/socket.d.ts +70 -0
  231. package/dist/sdk/terminal/socket.js +256 -0
  232. package/dist/sdk/terminal/standalone.d.ts +18 -0
  233. package/dist/sdk/terminal/standalone.js +146 -0
  234. package/dist/sdk/terminal/terminals.d.ts +176 -0
  235. package/dist/sdk/terminal/terminals.js +767 -0
  236. package/dist/sdk/terminal/trajectory.d.ts +10 -0
  237. package/dist/sdk/terminal/trajectory.js +30 -0
  238. package/dist/sdk/terminal/tui/chrome.d.ts +64 -0
  239. package/dist/sdk/terminal/tui/chrome.js +169 -0
  240. package/dist/sdk/terminal/tui/clipboardFiles.d.ts +11 -0
  241. package/dist/sdk/terminal/tui/clipboardFiles.js +74 -0
  242. package/dist/sdk/terminal/tui/commandPages.d.ts +7 -0
  243. package/dist/sdk/terminal/tui/commandPages.js +63 -0
  244. package/dist/sdk/terminal/tui/commands.d.ts +42 -0
  245. package/dist/sdk/terminal/tui/commands.js +276 -0
  246. package/dist/sdk/terminal/tui/dialogGeometry.d.ts +27 -0
  247. package/dist/sdk/terminal/tui/dialogGeometry.js +50 -0
  248. package/dist/sdk/terminal/tui/dialogs.d.ts +75 -0
  249. package/dist/sdk/terminal/tui/dialogs.js +363 -0
  250. package/dist/sdk/terminal/tui/keybindings.d.ts +11 -0
  251. package/dist/sdk/terminal/tui/keybindings.js +49 -0
  252. package/dist/sdk/terminal/tui/list.d.ts +73 -0
  253. package/dist/sdk/terminal/tui/list.js +196 -0
  254. package/dist/sdk/terminal/tui/modeChoices.d.ts +42 -0
  255. package/dist/sdk/terminal/tui/modeChoices.js +70 -0
  256. package/dist/sdk/terminal/tui/modelPicker.d.ts +55 -0
  257. package/dist/sdk/terminal/tui/modelPicker.js +155 -0
  258. package/dist/sdk/terminal/tui/mouse.d.ts +3 -0
  259. package/dist/sdk/terminal/tui/mouse.js +3 -0
  260. package/dist/sdk/terminal/tui/page.d.ts +14 -0
  261. package/dist/sdk/terminal/tui/page.js +1 -0
  262. package/dist/sdk/terminal/tui/pageOverlay.d.ts +27 -0
  263. package/dist/sdk/terminal/tui/pageOverlay.js +145 -0
  264. package/dist/sdk/terminal/tui/pages/accountsPage.d.ts +54 -0
  265. package/dist/sdk/terminal/tui/pages/accountsPage.js +181 -0
  266. package/dist/sdk/terminal/tui/pages/componentsPage.d.ts +47 -0
  267. package/dist/sdk/terminal/tui/pages/componentsPage.js +119 -0
  268. package/dist/sdk/terminal/tui/pages/doctorPage.d.ts +37 -0
  269. package/dist/sdk/terminal/tui/pages/doctorPage.js +145 -0
  270. package/dist/sdk/terminal/tui/pages/hubPage.d.ts +39 -0
  271. package/dist/sdk/terminal/tui/pages/hubPage.js +128 -0
  272. package/dist/sdk/terminal/tui/pages/logPage.d.ts +38 -0
  273. package/dist/sdk/terminal/tui/pages/logPage.js +189 -0
  274. package/dist/sdk/terminal/tui/pages/permissionsPage.d.ts +44 -0
  275. package/dist/sdk/terminal/tui/pages/permissionsPage.js +124 -0
  276. package/dist/sdk/terminal/tui/pages/pluginsPage.d.ts +57 -0
  277. package/dist/sdk/terminal/tui/pages/pluginsPage.js +243 -0
  278. package/dist/sdk/terminal/tui/pages/settingsPage.d.ts +55 -0
  279. package/dist/sdk/terminal/tui/pages/settingsPage.js +88 -0
  280. package/dist/sdk/terminal/tui/pages/trajectoryPage.d.ts +58 -0
  281. package/dist/sdk/terminal/tui/pages/trajectoryPage.js +377 -0
  282. package/dist/sdk/terminal/tui/piAdapter.d.ts +18 -0
  283. package/dist/sdk/terminal/tui/piAdapter.js +48 -0
  284. package/dist/sdk/terminal/tui/planMode.d.ts +2 -0
  285. package/dist/sdk/terminal/tui/planMode.js +2 -0
  286. package/dist/sdk/terminal/tui/questionPicker.d.ts +20 -0
  287. package/dist/sdk/terminal/tui/questionPicker.js +150 -0
  288. package/dist/sdk/terminal/tui/questions.d.ts +19 -0
  289. package/dist/sdk/terminal/tui/questions.js +42 -0
  290. package/dist/sdk/terminal/tui/runtime.d.ts +114 -0
  291. package/dist/sdk/terminal/tui/runtime.js +441 -0
  292. package/dist/sdk/terminal/tui/search.d.ts +22 -0
  293. package/dist/sdk/terminal/tui/search.js +60 -0
  294. package/dist/sdk/terminal/tui/selection.d.ts +16 -0
  295. package/dist/sdk/terminal/tui/selection.js +16 -0
  296. package/dist/sdk/terminal/tui/sessionUi.d.ts +3 -0
  297. package/dist/sdk/terminal/tui/sessionUi.js +30 -0
  298. package/dist/sdk/terminal/tui/settingsModel.d.ts +12 -0
  299. package/dist/sdk/terminal/tui/settingsModel.js +84 -0
  300. package/dist/sdk/terminal/tui/sideQuestion.d.ts +53 -0
  301. package/dist/sdk/terminal/tui/sideQuestion.js +197 -0
  302. package/dist/sdk/terminal/tui/skillInvocation.d.ts +9 -0
  303. package/dist/sdk/terminal/tui/skillInvocation.js +43 -0
  304. package/dist/sdk/terminal/tui/status.d.ts +18 -0
  305. package/dist/sdk/terminal/tui/status.js +67 -0
  306. package/dist/sdk/terminal/tui/theme.d.ts +45 -0
  307. package/dist/sdk/terminal/tui/theme.js +176 -0
  308. package/dist/sdk/terminal/tui/treeModel.d.ts +79 -0
  309. package/dist/sdk/terminal/tui/treeModel.js +483 -0
  310. package/dist/sdk/terminal/tui/treePicker.d.ts +49 -0
  311. package/dist/sdk/terminal/tui/treePicker.js +251 -0
  312. package/dist/sdk/terminal/tui/ui.d.ts +47 -0
  313. package/dist/sdk/terminal/tui/ui.js +148 -0
  314. package/dist/sdk/terminal/tui/workingStatus.d.ts +9 -0
  315. package/dist/sdk/terminal/tui/workingStatus.js +229 -0
  316. package/dist/sdk/tools/askUser.d.ts +6 -0
  317. package/dist/sdk/tools/askUser.js +74 -0
  318. package/dist/sdk/tools/checklist.d.ts +9 -0
  319. package/dist/sdk/tools/checklist.js +54 -0
  320. package/dist/sdk/tools/definitions.d.ts +30 -0
  321. package/dist/sdk/tools/definitions.js +117 -0
  322. package/dist/sdk/tools/dispatch.d.ts +16 -0
  323. package/dist/sdk/tools/dispatch.js +67 -0
  324. package/dist/sdk/tools/harnessTools.d.ts +6 -0
  325. package/dist/sdk/tools/harnessTools.js +20 -0
  326. package/dist/sdk/tools/sessionName.d.ts +7 -0
  327. package/dist/sdk/tools/sessionName.js +31 -0
  328. package/dist/sdk/tools/spawnSubagent.d.ts +4 -0
  329. package/dist/sdk/tools/spawnSubagent.js +49 -0
  330. package/dist/sdk/tools/types.d.ts +48 -0
  331. package/dist/sdk/tools/types.js +1 -0
  332. package/dist/sdk/variant/components.d.ts +34 -0
  333. package/dist/sdk/variant/components.js +230 -0
  334. package/dist/sdk/variant/materialise.d.ts +66 -0
  335. package/dist/sdk/variant/materialise.js +81 -0
  336. package/dist/sdk/variant/migrate.d.ts +4 -0
  337. package/dist/sdk/variant/migrate.js +41 -0
  338. package/dist/sdk/variant/seed.d.ts +20 -0
  339. package/dist/sdk/variant/seed.js +116 -0
  340. package/dist/sdk/variant/store.d.ts +82 -0
  341. package/dist/sdk/variant/store.js +151 -0
  342. package/dist/sdk/variant/surface.d.ts +56 -0
  343. package/dist/sdk/variant/surface.js +81 -0
  344. package/dist/sdk/variant/trust.d.ts +27 -0
  345. package/dist/sdk/variant/trust.js +64 -0
  346. package/dist/sdk/variant/variant.d.ts +71 -0
  347. package/dist/sdk/variant/variant.js +331 -0
  348. package/dist/sdk/web/markdown.d.ts +10 -0
  349. package/dist/sdk/web/markdown.js +66 -0
  350. package/dist/sdk/web/safeRequest.d.ts +34 -0
  351. package/dist/sdk/web/safeRequest.js +175 -0
  352. package/dist/sdk/web/search.d.ts +53 -0
  353. package/dist/sdk/web/search.js +168 -0
  354. package/dist/sdk/web/text.d.ts +2 -0
  355. package/dist/sdk/web/text.js +7 -0
  356. package/dist/sdk/web/tools.d.ts +22 -0
  357. package/dist/sdk/web/tools.js +195 -0
  358. package/dist/sdk/web/turndown-plugin-gfm.d.ts +4 -0
  359. package/dist/sdk/wiki/notes.d.ts +68 -0
  360. package/dist/sdk/wiki/notes.js +297 -0
  361. package/dist/sdk/world/actions.d.ts +23 -0
  362. package/dist/sdk/world/actions.js +31 -0
  363. package/dist/sdk/world/cli.d.ts +12 -0
  364. package/dist/sdk/world/cli.js +166 -0
  365. package/dist/sdk/world/images.d.ts +20 -0
  366. package/dist/sdk/world/images.js +48 -0
  367. package/dist/sdk/world/untrusted.d.ts +12 -0
  368. package/dist/sdk/world/untrusted.js +20 -0
  369. package/dist/sdk/world/world.d.ts +65 -0
  370. package/dist/sdk/world/world.js +80 -0
  371. package/dist/terminal-opentui.js +13612 -0
  372. package/dist/terminal-pi.js +808 -151
  373. package/docs/README.md +22 -0
  374. package/docs/architecture/00-overview.md +159 -0
  375. package/docs/architecture/01-extension-points.md +78 -0
  376. package/docs/architecture/02-sessions-and-runs.md +146 -0
  377. package/docs/architecture/03-variants.md +95 -0
  378. package/docs/architecture/04-prompt.md +102 -0
  379. package/docs/architecture/05-refinement.md +107 -0
  380. package/docs/architecture/06-plugins-and-capabilities.md +93 -0
  381. package/docs/architecture/07-tools-and-gate.md +88 -0
  382. package/docs/architecture/08-memory-and-history.md +94 -0
  383. package/docs/architecture/09-accounts-and-connectors.md +90 -0
  384. package/docs/architecture/10-server-protocol.md +84 -0
  385. package/docs/architecture/11-terminal.md +81 -0
  386. package/docs/architecture/12-storage.md +61 -0
  387. package/docs/architecture/13-world-tools.md +23 -0
  388. package/docs/architecture/README.md +114 -0
  389. package/docs/architecture/proposals/PROP-0001-reporting-section.md +106 -0
  390. package/docs/architecture/proposals/PROP-0002-retain-rollout-workspaces.md +104 -0
  391. package/docs/architecture/proposals/PROP-0003-executor-settings.md +81 -0
  392. package/docs/architecture/proposals/PROP-0004-flexible-reporting-guidance.md +71 -0
  393. package/docs/architecture/proposals/PROP-0005-xharness-cli-name.md +78 -0
  394. package/docs/architecture/proposals/PROP-0006-run-checklist.md +68 -0
  395. package/docs/architecture/proposals/PROP-0007-run-continuation.md +80 -0
  396. package/docs/architecture/proposals/PROP-0008-lessons-from-runs.md +80 -0
  397. package/docs/architecture/proposals/PROP-0009-foundation-and-variants.md +78 -0
  398. package/docs/architecture/proposals/PROP-0010-session-names.md +73 -0
  399. package/docs/architecture/proposals/PROP-0011-doctor.md +63 -0
  400. package/docs/architecture/proposals/PROP-0012-release-baseline.md +56 -0
  401. package/docs/architecture/proposals/README.md +76 -0
  402. package/docs/decisions/ADR-0002-native-subagent-lifecycle.md +49 -0
  403. package/docs/decisions/ADR-0003-shared-asynchronous-subagents.md +70 -0
  404. package/docs/decisions/ADR-0004-fullscreen-terminal-layout.md +50 -0
  405. package/docs/decisions/ADR-0005-app-provided-oauth-clients.md +54 -0
  406. package/docs/decisions/ADR-0006-opentui-only-terminal.md +47 -0
  407. package/docs/decisions/ADR-0007-reporting-section.md +33 -0
  408. package/docs/decisions/ADR-0008-flexible-reporting-guidance.md +38 -0
  409. package/docs/decisions/ADR-0009-xharness-command.md +38 -0
  410. package/docs/decisions/ADR-0010-lessons-in-the-wiki.md +31 -0
  411. package/docs/decisions/ADR-0011-foundation-and-variants.md +28 -0
  412. package/docs/decisions/ADR-0012-native-session-names.md +34 -0
  413. package/docs/decisions/ADR-0013-doctor.md +27 -0
  414. package/docs/decisions/ADR-0014-public-release-baseline.md +21 -0
  415. package/docs/doctor.md +74 -0
  416. package/docs/experiments/EXP-0001-terminal-input-latency/plan.md +81 -0
  417. package/docs/experiments/EXP-0001-terminal-input-latency/results.md +46 -0
  418. package/docs/experiments/EXP-0002-opentui-typing-latency/plan.md +70 -0
  419. package/docs/experiments/EXP-0002-opentui-typing-latency/results.md +92 -0
  420. package/docs/features/README.md +20 -0
  421. package/docs/features/automations/README.md +41 -0
  422. package/docs/features/cores/README.md +39 -0
  423. package/docs/features/google-harness2/README.md +52 -0
  424. package/docs/features/integrations/README.md +40 -0
  425. package/docs/features/interfaces/README.md +29 -0
  426. package/docs/features/memory/README.md +28 -0
  427. package/docs/releases/1.0.0.md +40 -0
  428. package/docs/releases/README.md +36 -0
  429. package/docs/study/00-index.md +78 -0
  430. package/docs/study/arms/00-matrix.md +20 -0
  431. package/docs/study/arms/01-system-prompt.md +211 -0
  432. package/docs/study/arms/02-tools.md +79 -0
  433. package/docs/study/arms/03-subagents.md +90 -0
  434. package/docs/study/arms/04-skills.md +75 -0
  435. package/docs/study/arms/05-context-management.md +90 -0
  436. package/docs/study/arms/06-memory.md +90 -0
  437. package/docs/study/arms/07-governance.md +71 -0
  438. package/docs/study/arms/08-execution.md +69 -0
  439. package/docs/study/arms/09-observability.md +60 -0
  440. package/docs/study/arms/10-refinement.md +110 -0
  441. package/docs/study/btw-comparison.md +37 -0
  442. package/docs/study/feature-gap-review.md +42 -0
  443. package/docs/study/insights.md +123 -0
  444. package/docs/study/roadmap.md +72 -0
  445. package/docs/study/sources/claude-code.md +44 -0
  446. package/docs/study/sources/deepseek-harness.md +102 -0
  447. package/docs/study/sources/harness2.md +50 -0
  448. package/docs/study/sources/kimi-cli.md +42 -0
  449. package/docs/study/sources/omp.md +93 -0
  450. package/docs/study/sources/opencode.md +43 -0
  451. package/docs/study/sources/openhands.md +46 -0
  452. package/docs/study/sources/smolagents.md +40 -0
  453. package/docs/study/sources/swe-agent.md +34 -0
  454. package/docs/system-prompt-design.md +196 -0
  455. package/docs/terminal-tui.md +473 -56
  456. package/package.json +43 -13
  457. package/docs/evidence/terminal-2026-10-17/120x40-completed-transcript.ansi.gz +0 -0
  458. package/docs/evidence/terminal-2026-10-17/40x20-settings-interaction.ansi.gz +0 -0
  459. package/docs/evidence/terminal-2026-10-17/40x20-settings-keyboard.ansi.gz +0 -0
  460. package/docs/evidence/terminal-2026-10-17/40x20-welcome.ansi.gz +0 -0
  461. package/docs/evidence/terminal-2026-10-17/80x24-approval-0.ansi.gz +0 -0
  462. package/docs/evidence/terminal-2026-10-17/80x24-question.ansi.gz +0 -0
  463. package/docs/evidence/terminal-2026-10-17/verification.json +0 -130
  464. package/docs/evidence/terminal-2026-10-17-followup/120x40-completed-transcript.ansi.gz +0 -0
  465. package/docs/evidence/terminal-2026-10-17-followup/40x20-settings-interaction.ansi.gz +0 -0
  466. package/docs/evidence/terminal-2026-10-17-followup/40x20-settings-keyboard.ansi.gz +0 -0
  467. package/docs/evidence/terminal-2026-10-17-followup/40x20-welcome.ansi.gz +0 -0
  468. package/docs/evidence/terminal-2026-10-17-followup/80x24-approval-0.ansi.gz +0 -0
  469. package/docs/evidence/terminal-2026-10-17-followup/80x24-plugin-light.ansi.gz +0 -0
  470. package/docs/evidence/terminal-2026-10-17-followup/80x24-question-batch.ansi.gz +0 -0
  471. package/docs/evidence/terminal-2026-10-17-followup/80x24-question.ansi.gz +0 -0
  472. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-approval-0.ansi.gz +0 -0
  473. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-plugin-light.ansi.gz +0 -0
  474. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-question-batch.ansi.gz +0 -0
  475. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-question.ansi.gz +0 -0
  476. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/verification.json +0 -95
  477. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-approval-0.ansi.gz +0 -0
  478. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-plugin-light.ansi.gz +0 -0
  479. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-question-batch.ansi.gz +0 -0
  480. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-question.ansi.gz +0 -0
  481. package/docs/evidence/terminal-2026-10-17-followup/global-install/README.md +0 -27
  482. package/docs/evidence/terminal-2026-10-17-followup/global-install/shell-command-80x24.ansi.gz +0 -0
  483. package/docs/evidence/terminal-2026-10-17-followup/global-install/shell-command.json +0 -18
  484. package/docs/evidence/terminal-2026-10-17-followup/global-install/verification.json +0 -95
  485. package/docs/evidence/terminal-2026-10-17-followup/harness-reference-80x24.json.gz +0 -0
  486. package/docs/evidence/terminal-2026-10-17-followup/harness-reference-final-80x24.json.gz +0 -0
  487. package/docs/evidence/terminal-2026-10-17-followup/harness-reference-scenario.json +0 -60
  488. package/docs/evidence/terminal-2026-10-17-followup/live-codex/README.md +0 -24
  489. package/docs/evidence/terminal-2026-10-17-followup/live-codex/complete-80x24.ansi.gz +0 -0
  490. package/docs/evidence/terminal-2026-10-17-followup/live-codex/verification.json +0 -57
  491. package/docs/evidence/terminal-2026-10-17-followup/omp-reference-80x24-early.json.gz +0 -0
  492. package/docs/evidence/terminal-2026-10-17-followup/omp-reference-80x24.json.gz +0 -0
  493. package/docs/evidence/terminal-2026-10-17-followup/omp-reference-scenario.json +0 -58
  494. package/docs/evidence/terminal-2026-10-17-followup/omp-supplemental-static.json.gz +0 -0
  495. package/docs/evidence/terminal-2026-10-17-followup/rea-artifacts.json +0 -320
  496. package/docs/evidence/terminal-2026-10-17-followup/reference-comparison.json +0 -30
  497. package/docs/evidence/terminal-2026-10-17-followup/reference-comparison.md +0 -133
  498. package/docs/evidence/terminal-2026-10-17-followup/reference-source-observations.json +0 -20
  499. package/docs/evidence/terminal-2026-10-17-followup/verification.json +0 -207
  500. package/src/accounts/accounts.test.ts +0 -333
  501. package/src/accounts/accounts.ts +0 -658
  502. package/src/accounts/env.test.ts +0 -95
  503. package/src/accounts/env.ts +0 -338
  504. package/src/accounts/secrets.ts +0 -50
  505. package/src/accounts/store.ts +0 -338
  506. package/src/capabilities/api.ts +0 -75
  507. package/src/capabilities/runSnapshot.ts +0 -59
  508. package/src/capabilities/types.ts +0 -34
  509. package/src/cli.ts +0 -118
  510. package/src/core/bus.ts +0 -34
  511. package/src/core/changes.ts +0 -33
  512. package/src/core/env.ts +0 -27
  513. package/src/core/errors.ts +0 -32
  514. package/src/core/frontmatter.ts +0 -47
  515. package/src/core/fs.test.ts +0 -38
  516. package/src/core/fs.ts +0 -92
  517. package/src/core/index.ts +0 -193
  518. package/src/core/path.test.ts +0 -14
  519. package/src/core/path.ts +0 -79
  520. package/src/core/projects.ts +0 -90
  521. package/src/core/text.ts +0 -39
  522. package/src/harness.ts +0 -312
  523. package/src/hub/catalog.json +0 -123
  524. package/src/hub/cli.ts +0 -59
  525. package/src/hub/hub.test.ts +0 -205
  526. package/src/hub/hub.ts +0 -256
  527. package/src/hub/schema.ts +0 -81
  528. package/src/index.ts +0 -75
  529. package/src/mcp/connections.ts +0 -614
  530. package/src/mcp/manager.ts +0 -130
  531. package/src/mcp/oauth.ts +0 -195
  532. package/src/mcp/scopeMigration.test.ts +0 -79
  533. package/src/mcp/scopeMigration.ts +0 -204
  534. package/src/mcp/service.test.ts +0 -376
  535. package/src/mcp/service.ts +0 -549
  536. package/src/mcp/types.ts +0 -108
  537. package/src/memory/api.test.ts +0 -82
  538. package/src/memory/api.ts +0 -303
  539. package/src/memory/blocks.test.ts +0 -78
  540. package/src/memory/blocks.ts +0 -408
  541. package/src/memory/caller.ts +0 -69
  542. package/src/memory/curation.test.ts +0 -163
  543. package/src/memory/curation.ts +0 -64
  544. package/src/memory/dispatch.ts +0 -59
  545. package/src/memory/facts.test.ts +0 -41
  546. package/src/memory/facts.ts +0 -248
  547. package/src/memory/graph.ts +0 -103
  548. package/src/memory/health.test.ts +0 -130
  549. package/src/memory/health.ts +0 -74
  550. package/src/memory/maintainer.ts +0 -272
  551. package/src/memory/maintenance.test.ts +0 -176
  552. package/src/memory/maintenance.ts +0 -518
  553. package/src/memory/migrate.ts +0 -79
  554. package/src/memory/operations.ts +0 -150
  555. package/src/memory/proposals.test.ts +0 -168
  556. package/src/memory/proposals.ts +0 -584
  557. package/src/memory/recall.test.ts +0 -115
  558. package/src/memory/recall.ts +0 -278
  559. package/src/memory/references.ts +0 -77
  560. package/src/memory/runContext.ts +0 -93
  561. package/src/memory/secrets.ts +0 -6
  562. package/src/memory/store.test.ts +0 -66
  563. package/src/memory/store.ts +0 -385
  564. package/src/memory/wiki.test.ts +0 -47
  565. package/src/memory/wiki.ts +0 -422
  566. package/src/memory/wikiIndex.test.ts +0 -88
  567. package/src/memory/wikiIndex.ts +0 -116
  568. package/src/plugins/api.ts +0 -181
  569. package/src/plugins/attachments.test.ts +0 -84
  570. package/src/plugins/attachments.ts +0 -141
  571. package/src/plugins/builtin.ts +0 -82
  572. package/src/plugins/catalogue.test.ts +0 -254
  573. package/src/plugins/catalogue.ts +0 -251
  574. package/src/plugins/cli.ts +0 -184
  575. package/src/plugins/discover.ts +0 -151
  576. package/src/plugins/firstParty.test.ts +0 -143
  577. package/src/plugins/firstParty.ts +0 -129
  578. package/src/plugins/hooks.test.ts +0 -250
  579. package/src/plugins/hooks.ts +0 -239
  580. package/src/plugins/identity.ts +0 -37
  581. package/src/plugins/install.test.ts +0 -107
  582. package/src/plugins/install.ts +0 -106
  583. package/src/plugins/inventory.ts +0 -123
  584. package/src/plugins/manifest.ts +0 -76
  585. package/src/plugins/plugins.test.ts +0 -205
  586. package/src/plugins/plugins.ts +0 -189
  587. package/src/plugins/proposal.ts +0 -121
  588. package/src/plugins/runtime.test.ts +0 -40
  589. package/src/plugins/runtime.ts +0 -82
  590. package/src/plugins/trust.ts +0 -142
  591. package/src/plugins/types.ts +0 -149
  592. package/src/prompt/compile.test.ts +0 -261
  593. package/src/prompt/compile.ts +0 -732
  594. package/src/server/methods.ts +0 -349
  595. package/src/server/remote.ts +0 -77
  596. package/src/server/rpc.ts +0 -116
  597. package/src/server/serve.ts +0 -28
  598. package/src/server/server.test.ts +0 -174
  599. package/src/sessions/approvals.ts +0 -118
  600. package/src/sessions/contracts.ts +0 -336
  601. package/src/sessions/conversation.test.ts +0 -177
  602. package/src/sessions/extensionSession.test.ts +0 -74
  603. package/src/sessions/extensionUi.test.ts +0 -65
  604. package/src/sessions/extensionUi.ts +0 -102
  605. package/src/sessions/history.ts +0 -51
  606. package/src/sessions/lineageJoin.ts +0 -75
  607. package/src/sessions/policy.ts +0 -36
  608. package/src/sessions/pricing.ts +0 -60
  609. package/src/sessions/questionBatches.test.ts +0 -110
  610. package/src/sessions/reasoningSummaries.ts +0 -59
  611. package/src/sessions/registry.ts +0 -381
  612. package/src/sessions/runIndex.ts +0 -99
  613. package/src/sessions/runStore.test.ts +0 -152
  614. package/src/sessions/runStore.ts +0 -332
  615. package/src/sessions/runner.ts +0 -604
  616. package/src/sessions/runtimeResources.test.ts +0 -61
  617. package/src/sessions/sessions.test.ts +0 -549
  618. package/src/sessions/sessions.ts +0 -339
  619. package/src/skills/registry.test.ts +0 -104
  620. package/src/skills/registry.ts +0 -413
  621. package/src/terminal/accountsMenu.test.ts +0 -225
  622. package/src/terminal/accountsMenu.ts +0 -382
  623. package/src/terminal/cli.ts +0 -149
  624. package/src/terminal/client.ts +0 -74
  625. package/src/terminal/control.test.ts +0 -23
  626. package/src/terminal/control.ts +0 -23
  627. package/src/terminal/controller.ts +0 -291
  628. package/src/terminal/hubMenu.ts +0 -24
  629. package/src/terminal/launch.test.ts +0 -25
  630. package/src/terminal/launch.ts +0 -48
  631. package/src/terminal/piExtension.lifecycle.test.ts +0 -55
  632. package/src/terminal/piExtension.ts +0 -259
  633. package/src/terminal/pluginControl.test.ts +0 -146
  634. package/src/terminal/pluginMenu.ts +0 -112
  635. package/src/terminal/socket.test.ts +0 -71
  636. package/src/terminal/socket.ts +0 -232
  637. package/src/terminal/standalone.test.ts +0 -167
  638. package/src/terminal/standalone.ts +0 -153
  639. package/src/terminal/terminal.test.ts +0 -399
  640. package/src/terminal/terminals.ts +0 -553
  641. package/src/terminal/tui/application.test.ts +0 -114
  642. package/src/terminal/tui/application.ts +0 -491
  643. package/src/terminal/tui/commands.test.ts +0 -218
  644. package/src/terminal/tui/commands.ts +0 -361
  645. package/src/terminal/tui/dialogs.ts +0 -301
  646. package/src/terminal/tui/editor.test.ts +0 -84
  647. package/src/terminal/tui/editor.ts +0 -79
  648. package/src/terminal/tui/keybindings.test.ts +0 -22
  649. package/src/terminal/tui/keybindings.ts +0 -50
  650. package/src/terminal/tui/piAdapter.ts +0 -62
  651. package/src/terminal/tui/presentation.test.ts +0 -79
  652. package/src/terminal/tui/questions.test.ts +0 -41
  653. package/src/terminal/tui/questions.ts +0 -47
  654. package/src/terminal/tui/runtime.socket.test.ts +0 -104
  655. package/src/terminal/tui/runtime.test.ts +0 -215
  656. package/src/terminal/tui/runtime.ts +0 -388
  657. package/src/terminal/tui/sessionUi.ts +0 -24
  658. package/src/terminal/tui/settings.test.ts +0 -150
  659. package/src/terminal/tui/settings.ts +0 -188
  660. package/src/terminal/tui/status.test.ts +0 -70
  661. package/src/terminal/tui/status.ts +0 -109
  662. package/src/terminal/tui/theme.ts +0 -174
  663. package/src/terminal/tui/tools.test.ts +0 -145
  664. package/src/terminal/tui/tools.ts +0 -142
  665. package/src/terminal/tui/transcript.test.ts +0 -25
  666. package/src/terminal/tui/transcript.ts +0 -124
  667. package/src/terminal/tui/ui.test.ts +0 -313
  668. package/src/terminal/tui/ui.ts +0 -166
  669. package/src/terminal/tui/welcome.ts +0 -102
  670. package/src/tools/askUser.test.ts +0 -69
  671. package/src/tools/askUser.ts +0 -59
  672. package/src/tools/definitions.ts +0 -187
  673. package/src/tools/maintenance.ts +0 -24
  674. package/src/tools/memoryTools.ts +0 -22
  675. package/src/tools/pluginPropose.ts +0 -41
  676. package/src/tools/registryWrite.test.ts +0 -101
  677. package/src/tools/registryWrite.ts +0 -182
  678. package/src/tools/spawnSubagent.ts +0 -92
  679. package/src/tools/types.ts +0 -39
  680. package/src/web/safeRequest.ts +0 -171
  681. package/src/web/text.ts +0 -53
  682. package/src/web/tools.ts +0 -134
  683. package/src/web/web.test.ts +0 -141
@@ -0,0 +1,474 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { closeSync, lstatSync, mkdirSync, mkdtempSync, openSync, readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { watch } from 'node:fs';
5
+ import { HarnessError, invalid } from "../core/errors.js";
6
+ import { atomicWrite, now, readJson, readJsonOr, writeJson } from "../core/fs.js";
7
+ import * as pluginApi from "../plugins/api.js";
8
+ import * as packages from "../plugins/install.js";
9
+ import * as registry from "../variant/components.js";
10
+ import * as attachments from "../plugins/attachments.js";
11
+ import manifest from "../../../package.json" with { type: 'json' };
12
+ import bundled from "./catalog.json" with { type: 'json' };
13
+ import { HUB_CATALOG_URL, HUB_MAX_BYTES, HUB_PREVIEW_PAGE_BYTES, hubCatalogSchema, hubEntrySchema, hubReceiptSchema, meetsMinimum } from "./schema.js";
14
+ const variantVersion = manifest.version;
15
+ const digest = (bytes) => createHash('sha256').update(bytes).digest('hex');
16
+ const receiptName = (entry) => digest(`${entry.id}@${entry.version}`);
17
+ /** Acquires an exclusive writer lock. A crashed writer's lock is recovered only when its PID is gone. */
18
+ function acquire(path) {
19
+ mkdirSync(join(path, '..'), { recursive: true });
20
+ try {
21
+ const file = openSync(path, 'wx', 0o600);
22
+ try {
23
+ writeFileSync(file, `${process.pid}`);
24
+ }
25
+ finally {
26
+ closeSync(file);
27
+ }
28
+ return () => rmSync(path, { force: true });
29
+ }
30
+ catch (error) {
31
+ if (error.code !== 'EEXIST')
32
+ throw error;
33
+ // Serialize stale-lock recovery too: two reapers must never remove a new writer's lock.
34
+ let recovery;
35
+ try {
36
+ recovery = openSync(`${path}.recovery`, 'wx', 0o600);
37
+ }
38
+ catch {
39
+ throw new HarnessError('hub_busy', 'Another installation is using this library. Wait and retry.');
40
+ }
41
+ try {
42
+ const pid = Number(readFileSync(path, 'utf8'));
43
+ if (Number.isInteger(pid) && pid > 0) {
44
+ try {
45
+ process.kill(pid, 0);
46
+ }
47
+ catch (probe) {
48
+ if (probe.code === 'ESRCH') {
49
+ rmSync(path);
50
+ return acquire(path);
51
+ }
52
+ }
53
+ }
54
+ throw new HarnessError('hub_busy', 'Another installation is using this library. Wait for it to finish and retry.');
55
+ }
56
+ finally {
57
+ closeSync(recovery);
58
+ rmSync(`${path}.recovery`, { force: true });
59
+ }
60
+ }
61
+ }
62
+ /** Catalog data never loads extensions or changes attachment, trust, or connector scopes. */
63
+ export class Hub {
64
+ harness;
65
+ fallback;
66
+ fetcher;
67
+ catalogUrl;
68
+ watcher = null;
69
+ refresh = null;
70
+ installing = false;
71
+ cachedPayload = null;
72
+ get busy() { return this.installing; }
73
+ constructor(harness, options = {}) {
74
+ this.harness = harness;
75
+ this.fallback = hubCatalogSchema.parse(options.catalog ?? bundled);
76
+ this.fetcher = options.fetch ?? globalThis.fetch;
77
+ this.catalogUrl = options.catalogUrl ?? HUB_CATALOG_URL;
78
+ }
79
+ receipts() {
80
+ const root = this.harness.dataRoot;
81
+ if (!root)
82
+ return [];
83
+ const values = readJson(join(root, 'hub', 'installed.json')) ?? [];
84
+ if (!Array.isArray(values))
85
+ throw invalid('The hub installation records could not be read.');
86
+ return values.map((value) => hubReceiptSchema.parse(value));
87
+ }
88
+ snapshot() {
89
+ const cached = readJsonOr(join(this.harness.stateDir, 'hub', 'catalog.json'), null);
90
+ const parsed = hubCatalogSchema.safeParse(cached?.catalog);
91
+ const catalog = parsed.success ? parsed.data : this.fallback;
92
+ const installed = this.receipts().map((receipt) => ({ ...receipt, state: this.receiptState(receipt) }));
93
+ const entries = new Map(catalog.entries.map((entry) => [`${entry.id}@${entry.version}`, entry]));
94
+ for (const receipt of installed)
95
+ if (!entries.has(`${receipt.entry.id}@${receipt.entry.version}`))
96
+ entries.set(`${receipt.entry.id}@${receipt.entry.version}`, receipt.entry);
97
+ return { entries: [...entries.values()], installed, origin: parsed.success ? 'cached' : 'bundled', refreshedAt: parsed.success ? cached.at : null, error: null, dataRoot: this.harness.dataRoot, stateDir: this.harness.stateDir };
98
+ }
99
+ receiptState(receipt) {
100
+ if (receipt.document && receipt.entry.delivery.kind === 'document') {
101
+ if (receipt.document !== `${receiptName(receipt.entry)}.json`)
102
+ return 'incomplete';
103
+ try {
104
+ const path = join(this.harness.dataRoot, 'hub', 'documents', receipt.document);
105
+ const stat = lstatSync(path);
106
+ if (!stat.isFile() || stat.size > HUB_MAX_BYTES)
107
+ return 'incomplete';
108
+ return digest(readFileSync(path)) === receipt.entry.delivery.sha256 ? 'installed' : 'changed';
109
+ }
110
+ catch {
111
+ return 'incomplete';
112
+ }
113
+ }
114
+ return this.present(receipt) ? 'installed' : 'incomplete';
115
+ }
116
+ present(receipt) {
117
+ const root = this.harness.dataRoot;
118
+ if (!root)
119
+ return false;
120
+ try {
121
+ if (receipt.document) {
122
+ if (receipt.entry.delivery.kind !== 'document' || receipt.document !== `${receiptName(receipt.entry)}.json`)
123
+ return false;
124
+ const path = join(root, 'hub', 'documents', receipt.document);
125
+ const stat = lstatSync(path);
126
+ return stat.isFile() && stat.size <= HUB_MAX_BYTES && digest(readFileSync(path)) === receipt.entry.delivery.sha256;
127
+ }
128
+ if (receipt.entry.delivery.kind === 'registry')
129
+ return receipt.resourceIds.length > 0 && receipt.resourceIds.every((id) => {
130
+ if (!/^(skills|prompts|rules)\/[a-z0-9-]{1,64}$/.test(id))
131
+ return false;
132
+ const [kind, name] = id.split('/');
133
+ return lstatSync(join(root, 'registry', kind, kind === 'skills' ? `${name}/SKILL.md` : `${name}.md`)).isFile();
134
+ });
135
+ if (receipt.entry.delivery.kind === 'pi-package') {
136
+ const source = receipt.entry.delivery.source;
137
+ const settings = readJsonOr(join(this.harness.stateDir, 'accounts', '_shared', 'pi', 'settings.json'), {});
138
+ return settings.packages?.some((item) => (typeof item === 'string' ? item : item.source) === source) ?? false;
139
+ }
140
+ }
141
+ catch {
142
+ return false;
143
+ }
144
+ return false;
145
+ }
146
+ async list(refresh = false) {
147
+ if (!refresh)
148
+ return this.snapshot();
149
+ this.refresh ??= this.refreshCatalog().finally(() => { this.refresh = null; });
150
+ return this.refresh;
151
+ }
152
+ async bytes(url) {
153
+ const parsed = new URL(url);
154
+ if (parsed.protocol !== 'https:' || parsed.username || parsed.password || parsed.search || parsed.hash || parsed.port || parsed.hostname !== 'raw.githubusercontent.com')
155
+ throw invalid('Hub downloads must use public raw.githubusercontent.com HTTPS URLs.');
156
+ const response = await this.fetcher(url, { redirect: 'error', credentials: 'omit', signal: AbortSignal.timeout(30_000) });
157
+ if (!response.ok)
158
+ throw new Error(`The catalog source returned ${response.status}.`);
159
+ if (Number(response.headers.get('content-length') ?? 0) > HUB_MAX_BYTES)
160
+ throw invalid('The hub download exceeds 16 MiB.');
161
+ if (!response.body)
162
+ throw invalid('The hub download has no body.');
163
+ const reader = response.body.getReader();
164
+ const chunks = [];
165
+ let size = 0;
166
+ try {
167
+ for (;;) {
168
+ const { done, value } = await reader.read();
169
+ if (done)
170
+ break;
171
+ size += value.byteLength;
172
+ if (size > HUB_MAX_BYTES)
173
+ throw invalid('The hub download exceeds 16 MiB.');
174
+ chunks.push(value);
175
+ }
176
+ }
177
+ finally {
178
+ await reader.cancel().catch(() => undefined);
179
+ }
180
+ return Buffer.concat(chunks);
181
+ }
182
+ async refreshCatalog() {
183
+ try {
184
+ const catalog = hubCatalogSchema.parse(JSON.parse(this.decode(await this.bytes(this.catalogUrl))));
185
+ writeJson(join(this.harness.stateDir, 'hub', 'catalog.json'), { catalog, at: now() });
186
+ this.harness.bus.emit({ type: 'hub.changed' });
187
+ return { ...this.snapshot(), origin: 'remote' };
188
+ }
189
+ catch (error) {
190
+ return { ...this.snapshot(), error: error instanceof Error ? error.message : String(error) };
191
+ }
192
+ }
193
+ decode(bytes) {
194
+ const text = bytes.toString('utf8');
195
+ if (!Buffer.from(text).equals(bytes))
196
+ throw invalid('Hub JSON must use valid UTF-8.');
197
+ return text;
198
+ }
199
+ find(id, version) {
200
+ const entry = this.snapshot().entries.find((item) => item.id === id && item.version === version);
201
+ if (!entry)
202
+ throw invalid('That item version is not in this catalog. Refresh the Hub and try again.');
203
+ return entry;
204
+ }
205
+ async get(id, version, preview = false) {
206
+ const entry = this.find(id, version);
207
+ if (!preview || entry.delivery.kind === 'pi-package' || entry.delivery.bundled !== undefined)
208
+ return entry;
209
+ const bytes = await this.bytes(entry.delivery.url);
210
+ if (digest(bytes) !== entry.delivery.sha256)
211
+ throw invalid('The downloaded item differs from the reviewed version.');
212
+ return { ...entry, delivery: { ...entry.delivery, bundled: this.decode(bytes) } };
213
+ }
214
+ async verifiedPayload(entry) {
215
+ if (entry.delivery.kind === 'pi-package')
216
+ throw invalid('Packages do not have a JSON payload preview.');
217
+ const key = `${entry.id}@${entry.version}`;
218
+ if (this.cachedPayload?.key === key && this.cachedPayload.expiresAt > Date.now())
219
+ return this.cachedPayload.bytes;
220
+ const bytes = entry.delivery.bundled === undefined ? await this.bytes(entry.delivery.url) : Buffer.from(entry.delivery.bundled);
221
+ if (digest(bytes) !== entry.delivery.sha256)
222
+ throw invalid('The downloaded item differs from the reviewed version. Nothing was installed.');
223
+ this.decode(bytes);
224
+ this.cachedPayload = { key, bytes, expiresAt: Date.now() + 5 * 60 * 1000 };
225
+ return bytes;
226
+ }
227
+ async preview(id, version, offset = 0) {
228
+ if (!Number.isSafeInteger(offset) || offset < 0)
229
+ throw invalid('Preview offset must be a non-negative byte position.');
230
+ const entry = this.find(id, version);
231
+ const bytes = await this.verifiedPayload(entry);
232
+ if (offset > bytes.length || offset < bytes.length && (bytes[offset] & 0xc0) === 0x80)
233
+ throw invalid('Preview offset is outside the payload or splits a UTF-8 character.');
234
+ let end = Math.min(offset + HUB_PREVIEW_PAGE_BYTES, bytes.length);
235
+ while (end > offset && end < bytes.length && (bytes[end] & 0xc0) === 0x80)
236
+ end -= 1;
237
+ const content = this.decode(bytes.subarray(offset, end));
238
+ return { entry, content, offset, nextOffset: end, totalBytes: bytes.length, done: end >= bytes.length };
239
+ }
240
+ async install(id, version) {
241
+ const root = this.harness.env.root;
242
+ const entry = hubEntrySchema.parse(this.find(id, version));
243
+ if (entry.requires.harness && !meetsMinimum(variantVersion, entry.requires.harness))
244
+ throw invalid(`This item requires Harness ${entry.requires.harness} or newer.`);
245
+ const releaseState = acquire(join(this.harness.stateDir, 'hub', 'install.lock'));
246
+ this.installing = true;
247
+ let releaseData = null;
248
+ try {
249
+ releaseData = acquire(join(root, 'hub', 'install.lock'));
250
+ const records = this.receipts();
251
+ const existing = records.find((receipt) => receipt.entry.id === id && receipt.entry.version === version);
252
+ if (existing && this.present(existing))
253
+ return existing;
254
+ if (existing)
255
+ throw invalid('This Hub receipt is changed or incomplete. Uninstall it before installing this version again.');
256
+ const remaining = records.filter((record) => record !== existing);
257
+ const receipt = { entry, installedAt: now(), resourceIds: [], document: null };
258
+ const choicesBefore = attachments.load(root);
259
+ if (entry.delivery.kind === 'pi-package') {
260
+ const source = entry.delivery.source;
261
+ if (remaining.some((record) => record.entry.id === id && this.present(record)))
262
+ throw invalid('Another version is already installed. Manage the existing plugin before replacing it.');
263
+ const before = await pluginApi.list(this.harness, {});
264
+ const identity = (value) => value.slice(0, value.lastIndexOf('@'));
265
+ if (before.some((plugin) => plugin.install && identity(plugin.install.source) === identity(source)))
266
+ throw invalid('This package is already installed. Manage it in Plugins.');
267
+ const after = await packages.install(this.harness, { source });
268
+ receipt.resourceIds = after.filter((plugin) => plugin.install?.source === source && !before.some((old) => old.id === plugin.id)).map((plugin) => plugin.id);
269
+ if (!receipt.resourceIds.length)
270
+ throw invalid('The package did not add an installable plugin. No hub installation was recorded.');
271
+ }
272
+ else {
273
+ const delivery = entry.delivery;
274
+ const bytes = await this.verifiedPayload(entry);
275
+ const text = this.decode(bytes);
276
+ if (delivery.kind === 'document') {
277
+ JSON.parse(text);
278
+ receipt.document = `${receiptName(entry)}.json`;
279
+ const documentPath = join(root, 'hub', 'documents', receipt.document);
280
+ try {
281
+ lstatSync(documentPath);
282
+ throw invalid('A file already exists at the Hub document path. Review or remove it before installing.');
283
+ }
284
+ catch (error) {
285
+ if (error.code !== 'ENOENT')
286
+ throw error;
287
+ }
288
+ atomicWrite(documentPath, bytes);
289
+ }
290
+ else {
291
+ const payload = JSON.parse(text);
292
+ const previous = new Set(registry.list(root).map((item) => item.id));
293
+ const imported = registry.importItems(root, delivery.registryKind, payload.items);
294
+ receipt.resourceIds = imported.filter((item) => !previous.has(item.id)).map((item) => item.id);
295
+ const choices = structuredClone(choicesBefore);
296
+ const ids = new Set(receipt.resourceIds);
297
+ for (const scope of [choices.global, ...Object.values(choices.agents), ...Object.values(choices.projects)]) {
298
+ scope.on = scope.on.filter((id) => !ids.has(id));
299
+ scope.off = scope.off.filter((id) => !ids.has(id));
300
+ }
301
+ attachments.save(root, choices);
302
+ }
303
+ }
304
+ try {
305
+ writeJson(join(root, 'hub', 'installed.json'), [...remaining, receipt]);
306
+ }
307
+ catch (error) {
308
+ if (receipt.document)
309
+ rmSync(join(root, 'hub', 'documents', receipt.document), { force: true });
310
+ if (entry.delivery.kind === 'registry')
311
+ for (const id of receipt.resourceIds) {
312
+ const [kind, name] = id.split('/');
313
+ rmSync(join(root, 'registry', kind, kind === 'skills' ? name : `${name}.md`), { recursive: true, force: true });
314
+ }
315
+ if (entry.delivery.kind === 'registry')
316
+ attachments.save(root, choicesBefore);
317
+ if (entry.delivery.kind === 'pi-package')
318
+ for (const pluginId of receipt.resourceIds)
319
+ await packages.remove(this.harness, { pluginId });
320
+ throw error;
321
+ }
322
+ this.harness.bus.emit({ type: 'hub.changed' });
323
+ this.harness.bus.emit({ type: 'plugins.changed' });
324
+ return receipt;
325
+ }
326
+ finally {
327
+ this.installing = false;
328
+ releaseData?.();
329
+ releaseState();
330
+ }
331
+ }
332
+ async uninstall(id, version) {
333
+ const root = this.harness.env.root;
334
+ const releaseState = acquire(join(this.harness.stateDir, 'hub', 'install.lock'));
335
+ this.installing = true;
336
+ let releaseData = null;
337
+ try {
338
+ releaseData = acquire(join(root, 'hub', 'install.lock'));
339
+ const records = this.receipts();
340
+ const receipt = records.find((item) => item.entry.id === id && item.entry.version === version);
341
+ if (!receipt)
342
+ throw invalid('This Hub installation receipt no longer exists.');
343
+ const staged = mkdtempSync(join(root, 'hub', '.uninstall-'));
344
+ const moves = [];
345
+ let choicesBefore = null;
346
+ let committed = false;
347
+ let rollbackComplete = true;
348
+ try {
349
+ const ownedPaths = [];
350
+ if (receipt.document) {
351
+ if (receipt.entry.delivery.kind !== 'document' || receipt.document !== `${receiptName(receipt.entry)}.json`)
352
+ throw invalid('The Hub receipt has an invalid document path.');
353
+ const path = join(root, 'hub', 'documents', receipt.document);
354
+ try {
355
+ const stat = lstatSync(path);
356
+ if (!stat.isFile())
357
+ throw invalid('The receipt-owned document path is not a regular file; it was left untouched.');
358
+ ownedPaths.push(path);
359
+ }
360
+ catch (error) {
361
+ if (error.code !== 'ENOENT')
362
+ throw error;
363
+ }
364
+ }
365
+ if (receipt.entry.delivery.kind === 'registry') {
366
+ const expectedKind = receipt.entry.delivery.registryKind;
367
+ for (const id of receipt.resourceIds) {
368
+ if (!/^(skills|prompts|rules)\/[a-z0-9-]{1,64}$/.test(id))
369
+ throw invalid('The Hub receipt contains an invalid registry resource path.');
370
+ const [kind, name] = id.split('/');
371
+ if (kind !== expectedKind)
372
+ throw invalid('The Hub receipt contains a resource outside its registry kind.');
373
+ const path = join(root, 'registry', kind, kind === 'skills' ? name : `${name}.md`);
374
+ try {
375
+ lstatSync(path);
376
+ ownedPaths.push(path);
377
+ }
378
+ catch (error) {
379
+ if (error.code !== 'ENOENT')
380
+ throw error;
381
+ }
382
+ }
383
+ choicesBefore = attachments.load(root);
384
+ const choices = structuredClone(choicesBefore);
385
+ const owned = new Set(receipt.resourceIds);
386
+ for (const scope of [choices.global, ...Object.values(choices.agents), ...Object.values(choices.projects)]) {
387
+ scope.on = scope.on.filter((value) => !owned.has(value));
388
+ scope.off = scope.off.filter((value) => !owned.has(value));
389
+ }
390
+ for (let index = 0; index < ownedPaths.length; index += 1) {
391
+ const source = ownedPaths[index];
392
+ const destination = join(staged, String(index));
393
+ renameSync(source, destination);
394
+ moves.push({ source, staged: destination });
395
+ }
396
+ attachments.save(root, choices);
397
+ }
398
+ else {
399
+ for (let index = 0; index < ownedPaths.length; index += 1) {
400
+ const source = ownedPaths[index];
401
+ const destination = join(staged, String(index));
402
+ renameSync(source, destination);
403
+ moves.push({ source, staged: destination });
404
+ }
405
+ }
406
+ if (receipt.entry.delivery.kind === 'pi-package')
407
+ for (const pluginId of receipt.resourceIds)
408
+ await packages.remove(this.harness, { pluginId });
409
+ writeJson(join(root, 'hub', 'installed.json'), records.filter((item) => item !== receipt));
410
+ committed = true;
411
+ try {
412
+ rmSync(staged, { recursive: true, force: true });
413
+ }
414
+ catch { /* The receipt is removed; leave the staged copy for disk recovery. */ }
415
+ this.cachedPayload = this.cachedPayload?.key === `${id}@${version}` ? null : this.cachedPayload;
416
+ this.harness.bus.emit({ type: 'hub.changed' });
417
+ this.harness.bus.emit({ type: 'plugins.changed' });
418
+ return receipt;
419
+ }
420
+ catch (error) {
421
+ if (!committed) {
422
+ if (choicesBefore)
423
+ try {
424
+ attachments.save(root, choicesBefore);
425
+ }
426
+ catch { /* Preserve the original failure and restore the owned files below. */ }
427
+ for (const move of moves.reverse()) {
428
+ try {
429
+ lstatSync(move.staged);
430
+ renameSync(move.staged, move.source);
431
+ }
432
+ catch {
433
+ rollbackComplete = false;
434
+ }
435
+ }
436
+ if (rollbackComplete)
437
+ try {
438
+ rmSync(staged, { recursive: true, force: true });
439
+ }
440
+ catch { /* Keep the staging directory for recovery. */ }
441
+ }
442
+ throw error;
443
+ }
444
+ }
445
+ finally {
446
+ this.installing = false;
447
+ releaseData?.();
448
+ releaseState();
449
+ }
450
+ }
451
+ readDocument(id, version) {
452
+ const receipt = this.receipts().find((item) => item.entry.id === id && item.entry.version === version);
453
+ if (!receipt?.document || receipt.document !== `${receiptName(receipt.entry)}.json`)
454
+ throw invalid('Install this document before opening it.');
455
+ const path = join(this.harness.env.root, 'hub', 'documents', receipt.document);
456
+ const stat = lstatSync(path);
457
+ if (!stat.isFile() || stat.size > HUB_MAX_BYTES)
458
+ throw invalid('The saved document is not a bounded regular file.');
459
+ const content = readFileSync(path, 'utf8');
460
+ if (receipt.entry.delivery.kind === 'pi-package' || digest(content) !== receipt.entry.delivery.sha256)
461
+ throw invalid('The saved document differs from the installed version. Import edited files explicitly instead.');
462
+ return { entry: receipt.entry, content };
463
+ }
464
+ watch(root) {
465
+ this.watcher?.close();
466
+ mkdirSync(join(root, 'hub'), { recursive: true });
467
+ this.watcher = watch(join(root, 'hub'), { persistent: false }, (_event, name) => {
468
+ if (name === 'installed.json')
469
+ this.harness.bus.emit({ type: 'hub.changed' });
470
+ });
471
+ this.watcher.on('error', () => { this.watcher?.close(); this.watcher = null; });
472
+ }
473
+ close() { this.watcher?.close(); this.watcher = null; }
474
+ }