@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
package/src/core/text.ts DELETED
@@ -1,39 +0,0 @@
1
- // Text helpers that count Unicode characters, not UTF-16 units, so budgets and cuts agree across languages.
2
-
3
- export function charCount(text: string): number {
4
- let count = 0
5
- for (const _ of text) count += 1
6
- return count
7
- }
8
-
9
- export function takeChars(text: string, count: number): string {
10
- if (text.length <= count) return text
11
- let taken = 0
12
- let end = 0
13
- for (const character of text) {
14
- if (taken >= count) break
15
- taken += 1
16
- end += character.length
17
- }
18
- return text.slice(0, end)
19
- }
20
-
21
- /** Lines without their terminators; a final newline does not add an empty last line. */
22
- export function lines(text: string): string[] {
23
- if (!text) return []
24
- const parts = text.split('\n')
25
- if (parts[parts.length - 1] === '') parts.pop()
26
- return parts.map((line) => (line.endsWith('\r') ? line.slice(0, -1) : line))
27
- }
28
-
29
- /** Orders file paths segment by segment, so a folder sorts before a sibling whose name extends it. */
30
- export function comparePaths(left: string, right: string): number {
31
- const a = left.split('/')
32
- const b = right.split('/')
33
- for (let index = 0; index < Math.min(a.length, b.length); index += 1) {
34
- if (a[index] !== b[index]) return a[index] < b[index] ? -1 : 1
35
- }
36
- return a.length - b.length
37
- }
38
-
39
- export const compareText = (left: string, right: string): number => (left < right ? -1 : left > right ? 1 : 0)
package/src/harness.ts DELETED
@@ -1,312 +0,0 @@
1
- // The harness, assembled: Pi sessions on isolated accounts, a compiled prompt, a memory
2
- // lifecycle, tools, connected apps, and skills. An application embeds one of these and adds
3
- // its own prompt sections, tools, and policy; nothing here knows what that application is.
4
- import { mkdirSync } from 'node:fs'
5
- import { join } from 'node:path'
6
-
7
- import { Accounts } from './accounts/accounts'
8
- import { Hub, type HubOptions } from './hub/hub'
9
- import * as capabilities from './capabilities/api'
10
- import { ensureSharedDir, isolateProcess } from './accounts/env'
11
- import { fileSecretStore, type SecretStore } from './accounts/secrets'
12
- import { Bus, log } from './core/bus'
13
- import { DEFAULT_PRODUCT_NAME, EMPTY_DIRECTORY, type Directory, type HarnessEnv } from './core/env'
14
- import { HarnessError } from './core/errors'
15
- import { readJsonOr } from './core/fs'
16
- import { closeIndex } from './core/index'
17
- import { projectsOrNone } from './core/projects'
18
- import { ConnectedApps } from './mcp/service'
19
- import { migrateConnectionScopes } from './mcp/scopeMigration'
20
- import type { MaintainerFactory } from './memory/maintainer'
21
- import { Maintenance } from './memory/maintenance'
22
- import * as migrate from './memory/migrate'
23
- import { writeIndex } from './memory/proposals'
24
- import * as recall from './memory/recall'
25
- import * as store from './memory/store'
26
- import { countPages } from './memory/wiki'
27
- import * as wikiIndex from './memory/wikiIndex'
28
- import * as pluginApi from './plugins/api'
29
- import * as attachments from './plugins/attachments'
30
- import { HARNESS_PLUGINS } from './plugins/builtin'
31
- import type { Resolver } from './plugins/discover'
32
- import { Hooks } from './plugins/hooks'
33
- import { packageFolders, Plugins } from './plugins/plugins'
34
- import type { PluginDescriptor } from './plugins/types'
35
- import { approvalKey, Approvals } from './sessions/approvals'
36
- import type { ToolPolicy } from './sessions/policy'
37
- import { RunRegistry } from './sessions/registry'
38
- import { markInterruptedRuns } from './sessions/runStore'
39
- import type { SessionFactory } from './sessions/runner'
40
- import { Sessions } from './sessions/sessions'
41
- import * as registry from './skills/registry'
42
- import { Terminals, type TerminalAssets } from './terminal/terminals'
43
-
44
- export interface HarnessOptions {
45
- hub?: HubOptions
46
- /** Where knowledge and history live. May be set later with `open`. */
47
- dataRoot?: string | null
48
- /** Device-local state that never belongs in the data root: accounts, approvals, connections, sockets. */
49
- stateDir: string
50
- /** Where credentials are kept. Defaults to an owner-only file in the state directory. */
51
- secrets?: SecretStore
52
- /** How the harness names itself to a model. */
53
- productName?: string
54
- directory?: Directory
55
- policy?: ToolPolicy
56
- /** Replaces Pi, for tests. */
57
- sessionFactory?: SessionFactory
58
- maintainerFactory?: MaintainerFactory
59
- /** Delegate maintenance execution to the embedding host through durable requests. */
60
- externalMaintenance?: boolean
61
- maintenanceExcludedTriggers?: string[]
62
- /** Queue consolidation after every settled run (the default). False leaves memory to explicit proposals and scheduled merges. */
63
- maintenanceRunTrigger?: boolean
64
- /** How long the maintenance queue stays empty before full memory blocks are condensed. */
65
- idleMs?: number
66
- /** Where the built commands a terminal session runs are, when they are not beside this package. */
67
- assets?: TerminalAssets
68
- /** Optional legacy executable override. The default is the Harness-owned terminal frontend. */
69
- piProgram?: () => string | null
70
- /** Folders of built-in skills, prompts, and rules, each laid out like `registry/`. */
71
- builtins?: string[]
72
- /**
73
- * The application's own parts, described as plugins: which tools, prompt sections and tool
74
- * groups each one provides. Data only; it changes what is listed, never what runs.
75
- */
76
- plugins?: PluginDescriptor[]
77
- /** Replaces Pi's own search for extensions, skills, prompts and themes, for tests. */
78
- resolver?: Resolver
79
- /** Replaces how a plugin's hooks file is read as a module, for tests. */
80
- hookImporter?: (address: string) => Promise<unknown>
81
- }
82
-
83
- /** What starting on a data root found and repaired. */
84
- export interface Recovery {
85
- interruptedRuns: number
86
- reindexedPages: number
87
- /** Set when the storage migration failed; the old data is left as it was. */
88
- migrationError: string | null
89
- }
90
-
91
- class Env implements HarnessEnv {
92
- dataRoot: string | null
93
- readonly bus: Bus
94
-
95
- constructor(
96
- dataRoot: string | null,
97
- readonly directory: Directory,
98
- readonly productName: string,
99
- bus: Bus
100
- ) {
101
- this.dataRoot = dataRoot
102
- this.bus = bus
103
- }
104
-
105
- get root(): string {
106
- if (!this.dataRoot) throw new HarnessError('data_root_missing', 'Choose a data location first.', 'Open Settings → Projects and Storage.')
107
- return this.dataRoot
108
- }
109
- }
110
-
111
- export class Harness {
112
- readonly hub: Hub
113
- readonly bus = new Bus()
114
- readonly env: Env
115
- readonly stateDir: string
116
- readonly policy: ToolPolicy
117
- readonly accounts: Accounts
118
- readonly approvals: Approvals
119
- readonly runs: RunRegistry
120
- readonly apps: ConnectedApps
121
- readonly plugins: Plugins
122
- /** Code plugins gave the harness to run after memory, the Wiki or history changed. */
123
- readonly hooks: Hooks
124
- /** Every part described as a plugin: the harness's own, then the application's. */
125
- descriptors: readonly PluginDescriptor[] = HARNESS_PLUGINS
126
- applicationPlugins: ReadonlySet<string> = new Set()
127
- readonly sessions: Sessions
128
- readonly maintenance: Maintenance
129
- readonly terminals: Terminals
130
- /** Resolves when what was loaded in the background at construction is in place. */
131
- readonly ready: Promise<void>
132
- recovery: Recovery = { interruptedRuns: 0, reindexedPages: 0, migrationError: null }
133
-
134
- constructor(options: HarnessOptions) {
135
- this.stateDir = options.stateDir
136
- mkdirSync(this.stateDir, { recursive: true })
137
- // Before anything can start a session: no inherited credential, no `~/.pi`.
138
- isolateProcess(join(this.stateDir, 'accounts'))
139
- this.env = new Env(options.dataRoot || null, options.directory ?? EMPTY_DIRECTORY, options.productName ?? DEFAULT_PRODUCT_NAME, this.bus)
140
- this.hub = new Hub(this, options.hub)
141
- this.policy = options.policy ?? {}
142
- registry.configureBuiltins(options.builtins ?? [])
143
- const secrets = options.secrets ?? fileSecretStore(join(this.stateDir, 'secrets.json'))
144
- this.accounts = new Accounts({ dir: join(this.stateDir, 'accounts'), secrets, bus: this.bus })
145
- this.approvals = new Approvals(this.stateDir, this.bus)
146
- this.runs = new RunRegistry({
147
- root: () => this.env.root,
148
- automatic: async (run, target, operation, standing) => {
149
- if (standing === 'switch') return this.approvals.isAuto(approvalKey(run)) ? 'always' : null
150
- return this.approvals.automatic(run, target, (await this.policy.approval?.({ run, target, operation })) ?? {})
151
- },
152
- redact: (event) => this.apps.connections.redactEvent(event),
153
- ended: (runId, sessionId) => this.apps.revokeRun(runId, sessionId)
154
- })
155
- this.apps = new ConnectedApps({ env: this.env, stateDir: this.stateDir, secrets, bus: this.bus, runs: this.runs, policy: this.policy })
156
- 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) })
157
- this.hooks = new Hooks({
158
- stateDir: this.stateDir,
159
- bus: this.bus,
160
- // A hook runs for everyone or not at all, so only what is on everywhere and trusted counts.
161
- // The shared folder stands in for an account: packages are the same for all of them.
162
- wanted: async () => {
163
- if (!this.env.dataRoot) return []
164
- const shared = ensureSharedDir(join(this.stateDir, 'accounts'))
165
- // A hook comes only with a package: one kept beside the data, or one the shared settings
166
- // name. With neither there is nothing to look for, and Pi is not loaded to find that out.
167
- const named = readJsonOr<{ packages?: unknown }>(join(shared, 'settings.json'), {}).packages
168
- if (!packageFolders(join(this.env.dataRoot, 'plugins')).length && !(Array.isArray(named) && named.length)) return []
169
- return (await this.plugins.loading({ cwd: this.stateDir, agentDir: shared, caller: {} })).hooks
170
- },
171
- call: (connection, tool, args) => this.apps.callUnattended(connection, tool, args ?? {}),
172
- importFile: options.hookImporter
173
- })
174
- let reloadTimer: ReturnType<typeof setTimeout> | null = null
175
- this.bus.on((notice) => {
176
- if (notice.type !== 'plugins.changed' || reloadTimer) return
177
- // Several changes arrive together when a plugin is installed or switched; one reload covers them.
178
- reloadTimer = setTimeout(() => {
179
- reloadTimer = null
180
- void this.hooks.reload()
181
- }, 50)
182
- reloadTimer.unref?.()
183
- })
184
- this.describe(options.plugins ?? [])
185
- this.sessions = new Sessions({
186
- env: this.env,
187
- accounts: this.accounts,
188
- runs: this.runs,
189
- policy: this.policy,
190
- broker: this.apps,
191
- plugins: this.plugins,
192
- resolveCapabilities: (caller, tools, cwd) => capabilities.resolve(this, { agentId: caller.agentId ?? null, projectId: caller.projectId ?? null, cwd, tools }),
193
- factory: options.sessionFactory
194
- })
195
- this.maintenance = new Maintenance({ env: this.env, bus: this.bus, accounts: this.accounts, factory: options.maintainerFactory, idleMs: options.idleMs, external: options.externalMaintenance, excludedTriggers: options.maintenanceExcludedTriggers, runTrigger: options.maintenanceRunTrigger })
196
- this.terminals = new Terminals({ env: this.env, stateDir: this.stateDir, accounts: this.accounts, runs: this.runs, 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) }, assets: options.assets, program: options.piProgram, hub: this.hub })
197
- this.ready = this.apps.start().catch((error) => log('connected apps', error instanceof Error ? error.message : String(error)))
198
- this.runs.listen((event, run) => {
199
- this.accounts.onRunEvent(event, run)
200
- // Each run is indexed when it ends, so the next turn can already recall it.
201
- if (event.type === 'completed' || event.type === 'failed') recall.indexRun(this.env.root, event.runId)
202
- if ((event.type === 'completed' || event.type === 'failed') && run) {
203
- 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 })
204
- }
205
- if (event.type === 'completed' || event.type === 'failed' || (event.type === 'status.changed' && (event.payload as { status?: string }).status === 'interrupted')) this.maintenance.finishRun(event.runId, event.type !== 'completed')
206
- this.maintenance.onRunEvent(event)
207
- })
208
- }
209
-
210
- get dataRoot(): string | null {
211
- return this.env.dataRoot
212
- }
213
-
214
- /** Sets the application's own parts, described as plugins. One with a harness plugin's id is ignored. */
215
- describe(plugins: readonly PluginDescriptor[]): void {
216
- const own = new Set(HARNESS_PLUGINS.map((plugin) => plugin.id))
217
- const supplied = plugins.filter((plugin) => plugin && typeof plugin.id === 'string' && !own.has(plugin.id))
218
- this.descriptors = [...HARNESS_PLUGINS, ...supplied]
219
- this.applicationPlugins = new Set(supplied.map((plugin) => plugin.id))
220
- }
221
-
222
- /**
223
- * Opens a data root: brings its Wiki to the current layout, settles runs that never ended,
224
- * and refreshes the index. `agentIds` are the agents that get their own memory blocks when an
225
- * older Wiki is migrated.
226
- */
227
- open(dataRoot: string, agentIds: readonly string[] = []): Recovery {
228
- if (this.hub.busy && this.env.dataRoot !== dataRoot) throw new HarnessError('hub_busy', 'Wait for the hub installation before changing the data location.')
229
- if (this.env.dataRoot && this.env.dataRoot !== dataRoot) closeIndex(this.env.dataRoot)
230
- this.env.dataRoot = dataRoot
231
- this.hub.watch(dataRoot)
232
- const root = dataRoot
233
- this.hooks.watch(store.wikiDir(root))
234
- void this.hooks.reload()
235
- for (const folder of ['registry/skills', 'registry/prompts', 'registry/rules', 'config', 'runs']) mkdirSync(join(root, folder), { recursive: true })
236
- let migrationError: string | null = null
237
- let wikiMigrationError: string | null = null
238
- try {
239
- if (migrate.run(this.env, agentIds)) log(`started Wiki storage version ${migrate.WIKI_VERSION}; the earlier Wiki is kept as a backup in the data root`)
240
- } catch (error) {
241
- migrationError = error instanceof Error ? error.message : String(error)
242
- wikiMigrationError = migrationError
243
- log('Wiki migration failed', migrationError)
244
- }
245
- try {
246
- migrateConnectionScopes(root, this.stateDir)
247
- } catch (error) {
248
- const detail = error instanceof Error ? error.message : String(error)
249
- migrationError = migrationError ? `${migrationError}; connector scope migration: ${detail}` : detail
250
- log('connector scope migration failed', detail)
251
- }
252
- if (!wikiMigrationError) {
253
- try {
254
- store.ensureLayout(root, this.env.productName)
255
- // Every project has its fixed pages, and the generated indexes match the files.
256
- for (const project of projectsOrNone(root)) store.ensureProjectNamespace(root, project.slug, project.name)
257
- writeIndex(store.wikiDir(root))
258
- } catch (error) {
259
- log('Wiki layout', error instanceof Error ? error.message : String(error))
260
- }
261
- }
262
- let interruptedRuns = 0
263
- try {
264
- interruptedRuns = markInterruptedRuns(root, `${this.env.productName} stopped before the run settled.`)
265
- } catch (error) {
266
- log('run recovery', error instanceof Error ? error.message : String(error))
267
- }
268
- let reindexedPages: number
269
- try {
270
- reindexedPages = wikiIndex.ensure(root)
271
- } catch (error) {
272
- log('index', error instanceof Error ? error.message : String(error))
273
- reindexedPages = countPages(root)
274
- }
275
- try {
276
- // Runs recorded while nothing was running, or before recall existed, become searchable.
277
- recall.sync(root)
278
- } catch (error) {
279
- log('recall', error instanceof Error ? error.message : String(error))
280
- }
281
- this.recovery = { interruptedRuns, reindexedPages, migrationError }
282
- this.maintenance.start()
283
- return this.recovery
284
- }
285
-
286
- /** Deletes the index and rebuilds it from the files. Returns the pages indexed. */
287
- rebuildIndex(): number {
288
- const pages = wikiIndex.rebuild(this.env.root)
289
- recall.sync(this.env.root)
290
- this.recovery = { ...this.recovery, reindexedPages: pages }
291
- return pages
292
- }
293
-
294
- /** Stops live runs and releases the index. */
295
- async close(): Promise<void> {
296
- this.hub.close()
297
- this.maintenance.stop()
298
- await this.terminals.close()
299
- await this.runs.interruptAll()
300
- await this.maintenance.settled()
301
- await this.hooks.settled().catch(() => undefined)
302
- this.hooks.close()
303
- await this.apps.close()
304
- if (this.env.dataRoot) closeIndex(this.env.dataRoot)
305
- }
306
- }
307
-
308
- export function createHarness(options: HarnessOptions): Harness {
309
- const harness = new Harness(options)
310
- if (options.dataRoot) harness.open(options.dataRoot)
311
- return harness
312
- }
@@ -1,123 +0,0 @@
1
- {
2
- "schemaVersion": 1,
3
- "entries": [
4
- {
5
- "id": "xingular/evidence-first",
6
- "title": "Evidence first",
7
- "description": "Keep observations, inferences, and unknowns distinct.",
8
- "publisher": "Xingular",
9
- "license": "MIT",
10
- "version": "1.0.0",
11
- "category": "rule",
12
- "channel": "official",
13
- "tags": [
14
- "rule"
15
- ],
16
- "requires": {
17
- "harness": "0.1.6"
18
- },
19
- "sourceUrl": "https://github.com/tanntnny/xingular-hub/tree/main/entries/xingular/evidence-first/1.0.0",
20
- "delivery": {
21
- "kind": "registry",
22
- "registryKind": "rules",
23
- "url": "https://raw.githubusercontent.com/tanntnny/xingular-hub/main/entries/xingular/evidence-first/1.0.0/payload.json",
24
- "sha256": "0f77661ea41e27bcb51aad982d15d493b893c5c1ba1eb6046a21315ddac07c5b",
25
- "bundled": "{\n \"items\": [\n {\n \"name\": \"hub-evidence-first\",\n \"files\": [\n {\n \"path\": \"CONTENT.md\",\n \"encoding\": \"utf8\",\n \"content\": \"---\\nname: Evidence first\\ndescription: Distinguish observations, inferences, and unknowns.\\n---\\n\\nSupport factual claims with inspectable evidence. Label inferences and uncertainties. Correct a claim when better evidence changes it.\\n\"\n }\n ]\n }\n ]\n}\n"
26
- }
27
- },
28
- {
29
- "id": "xingular/github-connector",
30
- "title": "GitHub connector",
31
- "description": "A setup recipe for the GitHub MCP server; provide your own credentials.",
32
- "publisher": "Xingular",
33
- "license": "MIT",
34
- "version": "1.0.0",
35
- "category": "connector",
36
- "channel": "official",
37
- "tags": [
38
- "connector"
39
- ],
40
- "requires": {
41
- "harness": "0.1.6"
42
- },
43
- "sourceUrl": "https://github.com/tanntnny/xingular-hub/tree/main/entries/xingular/github-connector/1.0.0",
44
- "delivery": {
45
- "kind": "document",
46
- "url": "https://raw.githubusercontent.com/tanntnny/xingular-hub/main/entries/xingular/github-connector/1.0.0/payload.json",
47
- "sha256": "ec5bd9675e2977b9d880cf81732d84ac72b04af271048499415eaa6288896223",
48
- "bundled": "{\n \"id\": \"github-hub\",\n \"name\": \"GitHub\",\n \"description\": \"Repositories, issues, and pull requests\",\n \"kind\": \"remote\",\n \"docsUrl\": \"https://github.com/github/github-mcp-server\",\n \"url\": \"https://api.githubcopilot.com/mcp/\",\n \"auth\": \"headers\",\n \"oauth\": null,\n \"fields\": [\n {\n \"header\": \"Authorization\",\n \"label\": \"Personal access token\",\n \"prefix\": \"Bearer \",\n \"help\": \"Provide a token for only the repositories and permissions you need.\"\n }\n ],\n \"setup\": [\n \"Create a personal access token in GitHub with the access you want to grant.\",\n \"Review the connection before enabling it.\"\n ],\n \"notice\": null,\n \"provenance\": null,\n \"suggestedReadTools\": []\n}\n"
49
- }
50
- },
51
- {
52
- "id": "xingular/research-starter",
53
- "title": "Research starter",
54
- "description": "A starting agent for comparing sources and writing supported answers.",
55
- "publisher": "Xingular",
56
- "license": "MIT",
57
- "version": "1.0.0",
58
- "category": "agent-template",
59
- "channel": "official",
60
- "tags": [
61
- "agent-template"
62
- ],
63
- "requires": {
64
- "harness": "0.1.6"
65
- },
66
- "sourceUrl": "https://github.com/tanntnny/xingular-hub/tree/main/entries/xingular/research-starter/1.0.0",
67
- "delivery": {
68
- "kind": "document",
69
- "url": "https://raw.githubusercontent.com/tanntnny/xingular-hub/main/entries/xingular/research-starter/1.0.0/payload.json",
70
- "sha256": "a2f672583df6f4049cc153ba1e173192301220e5f8817f9ad5a4fe87af25f52b",
71
- "bundled": "{\n \"schemaVersion\": 1,\n \"id\": \"research-starter\",\n \"title\": \"Research starter\",\n \"description\": \"Compare sources and explain the evidence behind an answer.\",\n \"version\": \"1.0.0\",\n \"author\": \"Xingular\",\n \"license\": \"MIT\",\n \"agent\": {\n \"name\": \"Research starter\",\n \"icon\": {\n \"kind\": \"mascot\",\n \"shape\": \"prism\",\n \"color\": \"violet\",\n \"material\": \"glass\"\n },\n \"description\": \"Investigates questions with sources.\",\n \"instructions\": \"Help the user investigate a question. Start with reliable sources, explain what the evidence supports, cite the sources, and state unresolved questions. Ask the user when their goal is unclear.\",\n \"model\": null,\n \"effort\": \"high\",\n \"tools\": [\n \"read\",\n \"grep\",\n \"find\",\n \"ls\",\n \"web_search\",\n \"web_fetch\"\n ]\n },\n \"skills\": [],\n \"connections\": []\n}\n"
72
- }
73
- },
74
- {
75
- "id": "xingular/source-review",
76
- "title": "Review a source",
77
- "description": "Check who wrote a source, what it supports, and what remains uncertain.",
78
- "publisher": "Xingular",
79
- "license": "MIT",
80
- "version": "1.0.0",
81
- "category": "skill",
82
- "channel": "official",
83
- "tags": [
84
- "skill"
85
- ],
86
- "requires": {
87
- "harness": "0.1.6"
88
- },
89
- "sourceUrl": "https://github.com/tanntnny/xingular-hub/tree/main/entries/xingular/source-review/1.0.0",
90
- "delivery": {
91
- "kind": "registry",
92
- "registryKind": "skills",
93
- "url": "https://raw.githubusercontent.com/tanntnny/xingular-hub/main/entries/xingular/source-review/1.0.0/payload.json",
94
- "sha256": "bb0617889ee1ca39611a10952bec3086fa3986e9ce10a809c473c57acf47bc07",
95
- "bundled": "{\n \"items\": [\n {\n \"name\": \"hub-source-review\",\n \"files\": [\n {\n \"path\": \"SKILL.md\",\n \"encoding\": \"utf8\",\n \"content\": \"---\\nname: hub-source-review\\ndescription: Review the evidence behind a source before using its claims.\\n---\\n\\n# Review a source\\n\\nRecord its author and date. Identify the original evidence. Write what the source supports and which uncertainties remain. Cite the source so the reader can inspect it.\\n\"\n }\n ]\n }\n ]\n}\n"
96
- }
97
- },
98
- {
99
- "id": "xingular/summarize-source",
100
- "title": "Summarize a source",
101
- "description": "Summarize a provided source and explain its limitations.",
102
- "publisher": "Xingular",
103
- "license": "MIT",
104
- "version": "1.0.0",
105
- "category": "prompt",
106
- "channel": "official",
107
- "tags": [
108
- "prompt"
109
- ],
110
- "requires": {
111
- "harness": "0.1.6"
112
- },
113
- "sourceUrl": "https://github.com/tanntnny/xingular-hub/tree/main/entries/xingular/summarize-source/1.0.0",
114
- "delivery": {
115
- "kind": "registry",
116
- "registryKind": "prompts",
117
- "url": "https://raw.githubusercontent.com/tanntnny/xingular-hub/main/entries/xingular/summarize-source/1.0.0/payload.json",
118
- "sha256": "12a646d474fe3cd822970869c972d1d9400c7f6350388dc735dce5c31a22680a",
119
- "bundled": "{\n \"items\": [\n {\n \"name\": \"hub-summarize-source\",\n \"files\": [\n {\n \"path\": \"CONTENT.md\",\n \"encoding\": \"utf8\",\n \"content\": \"---\\nname: summarize-source\\ndescription: Summarize the supplied source and its limits.\\n---\\n\\nSummarize the source below. Include its main claims, supporting evidence, limitations, and questions it leaves unanswered.\\n\\n$@\\n\"\n }\n ]\n }\n ]\n}\n"
120
- }
121
- }
122
- ]
123
- }
package/src/hub/cli.ts DELETED
@@ -1,59 +0,0 @@
1
- import { homedir } from 'node:os'
2
- import { join, resolve } from 'node:path'
3
- import { Harness, type HarnessOptions } from '../harness'
4
-
5
- export const HUB_USAGE = `Usage: xingular-harness hub <list | show | install> [id@version] [options]
6
-
7
- list [--refresh] Browse the curated catalog and locally installed versions
8
- show <id@version> Show publisher, license, source, and delivery details
9
- install <id@version> Install the exact reviewed version, disabled and untrusted
10
-
11
- --data <dir> Target data library (default: ~/.xingular-harness/data)
12
- --state <dir> Target device state (default: ~/.xingular-harness/state)
13
- --refresh Refresh the public catalog; cached items remain usable offline
14
- `
15
-
16
- export async function runHubCli(argv: string[], dependencies: { home?: string; write?: (text: string) => void; createHarness?: (options: HarnessOptions) => Harness } = {}): Promise<number> {
17
- const write = dependencies.write ?? ((text: string) => void process.stdout.write(text))
18
- const args: string[] = []
19
- const values: Record<string, string> = {}
20
- let refresh = false
21
- for (let index = 0; index < argv.length; index += 1) {
22
- const arg = argv[index]
23
- if (arg === '--refresh') refresh = true
24
- else if (arg === '--data' || arg === '--state') {
25
- const value = argv[++index]
26
- if (!value || value.startsWith('--')) { write(`${arg} needs a directory.\n`); return 2 }
27
- values[arg.slice(2)] = resolve(value)
28
- } else if (arg.startsWith('--')) { write(`Unknown option ${arg}.\n`); return 2 }
29
- else args.push(arg)
30
- }
31
- const [command, target] = args
32
- if (!command || command === 'help') { write(HUB_USAGE); return 0 }
33
- if (!['list', 'show', 'install'].includes(command)) { write(HUB_USAGE); return 2 }
34
- const root = join(dependencies.home ?? homedir(), '.xingular-harness')
35
- const options: HarnessOptions = { dataRoot: values.data ?? join(root, 'data'), stateDir: values.state ?? join(root, 'state') }
36
- const harness = dependencies.createHarness?.(options) ?? new Harness(options)
37
- try {
38
- const overview = await harness.hub.list(refresh)
39
- if (overview.error) write(`Catalog refresh failed: ${overview.error} Using ${overview.origin} content.\n`)
40
- if (command === 'list') {
41
- write(`Library: ${options.dataRoot}\n${overview.entries.map((entry) => `${entry.id}@${entry.version} ${entry.category} ${entry.title}${overview.installed.some((receipt) => receipt.entry.id === entry.id && receipt.entry.version === entry.version) ? ' · installed' : ''}`).join('\n')}\n`)
42
- return 0
43
- }
44
- const split = target?.lastIndexOf('@') ?? -1
45
- if (!target || split < 1) throw new Error('Name an exact item as publisher/name@version. Run hub list to see versions.')
46
- const id = target.slice(0, split)
47
- const version = target.slice(split + 1)
48
- const entry = await harness.hub.get(id, version)
49
- if (command === 'show') {
50
- const { bundled: _bundled, ...delivery } = entry.delivery.kind === 'pi-package' ? { ...entry.delivery, bundled: undefined } : entry.delivery
51
- write(`${entry.title} (${target})\n${entry.description}\nPublisher: ${entry.publisher}\nLicense: ${entry.license}\nSource: ${entry.sourceUrl}\nDelivery: ${JSON.stringify(delivery)}\n`)
52
- } else {
53
- const receipt = await harness.hub.install(id, version)
54
- write(receipt.document ? `Saved ${target} in ${options.dataRoot}/hub/documents/${receipt.document}. Open this library in a compatible application to apply it.\n` : `Installed ${target}, switched off. Attach it separately${entry.delivery.kind === 'pi-package' ? ' and review/trust any code' : ''} before using it.\n`)
55
- }
56
- return 0
57
- } catch (error) { write(`${error instanceof Error ? error.message : String(error)}\n`); return 1 }
58
- finally { await harness.close() }
59
- }