@xingular/harness 0.1.6 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (593) hide show
  1. package/CHANGELOG.md +107 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE.md +60 -0
  4. package/README.md +265 -71
  5. package/THIRD_PARTY_LICENSES.md +942 -0
  6. package/dist/cli.js +14842 -9445
  7. package/dist/sdk/accounts/accounts.d.ts +165 -0
  8. package/dist/sdk/accounts/accounts.js +730 -0
  9. package/dist/sdk/accounts/choices.d.ts +23 -0
  10. package/dist/sdk/accounts/choices.js +62 -0
  11. package/dist/sdk/accounts/env.d.ts +78 -0
  12. package/dist/sdk/accounts/env.js +294 -0
  13. package/dist/sdk/accounts/secrets.d.ts +16 -0
  14. package/dist/sdk/accounts/secrets.js +40 -0
  15. package/dist/sdk/accounts/store.d.ts +114 -0
  16. package/dist/sdk/accounts/store.js +255 -0
  17. package/dist/sdk/browser/config.d.ts +16 -0
  18. package/dist/sdk/browser/config.js +22 -0
  19. package/dist/sdk/browser/diagnostics.d.ts +4 -0
  20. package/dist/sdk/browser/diagnostics.js +38 -0
  21. package/dist/sdk/browser/index.d.ts +17 -0
  22. package/dist/sdk/browser/index.js +65 -0
  23. package/dist/sdk/browser/network.d.ts +10 -0
  24. package/dist/sdk/browser/network.js +59 -0
  25. package/dist/sdk/browser/session.d.ts +84 -0
  26. package/dist/sdk/browser/session.js +192 -0
  27. package/dist/sdk/browser/tools.d.ts +8 -0
  28. package/dist/sdk/browser/tools.js +329 -0
  29. package/dist/sdk/capabilities/api.d.ts +22 -0
  30. package/dist/sdk/capabilities/api.js +54 -0
  31. package/dist/sdk/capabilities/runSnapshot.d.ts +18 -0
  32. package/dist/sdk/capabilities/runSnapshot.js +47 -0
  33. package/dist/sdk/capabilities/types.d.ts +29 -0
  34. package/dist/sdk/capabilities/types.js +1 -0
  35. package/dist/sdk/cli.d.ts +2 -0
  36. package/dist/sdk/cli.js +142 -0
  37. package/dist/sdk/core/bus.d.ts +23 -0
  38. package/dist/sdk/core/bus.js +76 -0
  39. package/dist/sdk/core/caller.d.ts +22 -0
  40. package/dist/sdk/core/caller.js +16 -0
  41. package/dist/sdk/core/changes.d.ts +15 -0
  42. package/dist/sdk/core/changes.js +15 -0
  43. package/dist/sdk/core/effort.d.ts +2 -0
  44. package/dist/sdk/core/effort.js +1 -0
  45. package/dist/sdk/core/env.d.ts +18 -0
  46. package/dist/sdk/core/env.js +8 -0
  47. package/dist/sdk/core/errors.d.ts +15 -0
  48. package/dist/sdk/core/errors.js +24 -0
  49. package/dist/sdk/core/frontmatter.d.ts +12 -0
  50. package/dist/sdk/core/frontmatter.js +50 -0
  51. package/dist/sdk/core/fs.d.ts +18 -0
  52. package/dist/sdk/core/fs.js +106 -0
  53. package/dist/sdk/core/index.d.ts +24 -0
  54. package/dist/sdk/core/index.js +187 -0
  55. package/dist/sdk/core/path.d.ts +7 -0
  56. package/dist/sdk/core/path.js +79 -0
  57. package/dist/sdk/core/projects.d.ts +18 -0
  58. package/dist/sdk/core/projects.js +67 -0
  59. package/dist/sdk/core/secrets.d.ts +2 -0
  60. package/dist/sdk/core/secrets.js +5 -0
  61. package/dist/sdk/core/text.d.ts +7 -0
  62. package/dist/sdk/core/text.js +40 -0
  63. package/dist/sdk/doctor/checks.d.ts +5 -0
  64. package/dist/sdk/doctor/checks.js +208 -0
  65. package/dist/sdk/doctor/probe.d.ts +4 -0
  66. package/dist/sdk/doctor/probe.js +92 -0
  67. package/dist/sdk/doctor/service.d.ts +23 -0
  68. package/dist/sdk/doctor/service.js +144 -0
  69. package/dist/sdk/doctor/types.d.ts +141 -0
  70. package/dist/sdk/doctor/types.js +29 -0
  71. package/dist/sdk/harness.d.ts +133 -0
  72. package/dist/sdk/harness.js +299 -0
  73. package/dist/sdk/history/lessonPrompt.d.ts +2 -0
  74. package/dist/sdk/history/lessonPrompt.js +15 -0
  75. package/dist/sdk/history/lessons.d.ts +52 -0
  76. package/dist/sdk/history/lessons.js +173 -0
  77. package/dist/sdk/history/recall.d.ts +68 -0
  78. package/dist/sdk/history/recall.js +199 -0
  79. package/dist/sdk/history/trajectory.d.ts +7 -0
  80. package/dist/sdk/history/trajectory.js +216 -0
  81. package/dist/sdk/hub/catalog.json +123 -0
  82. package/dist/sdk/hub/cli.d.ts +7 -0
  83. package/dist/sdk/hub/cli.js +81 -0
  84. package/dist/sdk/hub/hub.d.ts +74 -0
  85. package/dist/sdk/hub/hub.js +474 -0
  86. package/dist/sdk/hub/schema.d.ts +280 -0
  87. package/dist/sdk/hub/schema.js +78 -0
  88. package/dist/sdk/index.d.ts +63 -0
  89. package/dist/sdk/index.js +48 -0
  90. package/dist/sdk/mcp/connections.d.ts +83 -0
  91. package/dist/sdk/mcp/connections.js +669 -0
  92. package/dist/sdk/mcp/manager.d.ts +26 -0
  93. package/dist/sdk/mcp/manager.js +124 -0
  94. package/dist/sdk/mcp/oauth.d.ts +35 -0
  95. package/dist/sdk/mcp/oauth.js +171 -0
  96. package/dist/sdk/mcp/scopeMigration.d.ts +19 -0
  97. package/dist/sdk/mcp/scopeMigration.js +198 -0
  98. package/dist/sdk/mcp/service.d.ts +160 -0
  99. package/dist/sdk/mcp/service.js +510 -0
  100. package/dist/sdk/mcp/types.d.ts +131 -0
  101. package/dist/sdk/mcp/types.js +49 -0
  102. package/dist/sdk/pi/runtime.d.ts +13 -0
  103. package/dist/sdk/pi/runtime.js +31 -0
  104. package/dist/sdk/plugins/api.d.ts +66 -0
  105. package/dist/sdk/plugins/api.js +155 -0
  106. package/dist/sdk/plugins/attachments.d.ts +46 -0
  107. package/dist/sdk/plugins/attachments.js +111 -0
  108. package/dist/sdk/plugins/builtin.d.ts +6 -0
  109. package/dist/sdk/plugins/builtin.js +68 -0
  110. package/dist/sdk/plugins/catalogue.d.ts +29 -0
  111. package/dist/sdk/plugins/catalogue.js +196 -0
  112. package/dist/sdk/plugins/cli.d.ts +13 -0
  113. package/dist/sdk/plugins/cli.js +187 -0
  114. package/dist/sdk/plugins/discover.d.ts +42 -0
  115. package/dist/sdk/plugins/discover.js +115 -0
  116. package/dist/sdk/plugins/firstParty.d.ts +50 -0
  117. package/dist/sdk/plugins/firstParty.js +113 -0
  118. package/dist/sdk/plugins/hooks.d.ts +94 -0
  119. package/dist/sdk/plugins/hooks.js +162 -0
  120. package/dist/sdk/plugins/identity.d.ts +19 -0
  121. package/dist/sdk/plugins/identity.js +48 -0
  122. package/dist/sdk/plugins/install.d.ts +20 -0
  123. package/dist/sdk/plugins/install.js +110 -0
  124. package/dist/sdk/plugins/inventory.d.ts +22 -0
  125. package/dist/sdk/plugins/inventory.js +110 -0
  126. package/dist/sdk/plugins/manifest.d.ts +13 -0
  127. package/dist/sdk/plugins/manifest.js +56 -0
  128. package/dist/sdk/plugins/plugins.d.ts +104 -0
  129. package/dist/sdk/plugins/plugins.js +164 -0
  130. package/dist/sdk/plugins/runtime.d.ts +9 -0
  131. package/dist/sdk/plugins/runtime.js +95 -0
  132. package/dist/sdk/plugins/trust.d.ts +44 -0
  133. package/dist/sdk/plugins/trust.js +120 -0
  134. package/dist/sdk/plugins/types.d.ts +159 -0
  135. package/dist/sdk/plugins/types.js +7 -0
  136. package/dist/sdk/prompt/compile.d.ts +174 -0
  137. package/dist/sdk/prompt/compile.js +396 -0
  138. package/dist/sdk/refine/cli.d.ts +4 -0
  139. package/dist/sdk/refine/cli.js +186 -0
  140. package/dist/sdk/refine/demo.d.ts +21 -0
  141. package/dist/sdk/refine/demo.js +114 -0
  142. package/dist/sdk/refine/evidence.d.ts +55 -0
  143. package/dist/sdk/refine/evidence.js +330 -0
  144. package/dist/sdk/refine/host.d.ts +51 -0
  145. package/dist/sdk/refine/host.js +76 -0
  146. package/dist/sdk/refine/ledger.d.ts +48 -0
  147. package/dist/sdk/refine/ledger.js +76 -0
  148. package/dist/sdk/refine/library.d.ts +55 -0
  149. package/dist/sdk/refine/library.js +177 -0
  150. package/dist/sdk/refine/pi.d.ts +72 -0
  151. package/dist/sdk/refine/pi.js +248 -0
  152. package/dist/sdk/refine/prompts.d.ts +45 -0
  153. package/dist/sdk/refine/prompts.js +390 -0
  154. package/dist/sdk/refine/recursion.d.ts +113 -0
  155. package/dist/sdk/refine/recursion.js +258 -0
  156. package/dist/sdk/refine/runner.d.ts +81 -0
  157. package/dist/sdk/refine/runner.js +150 -0
  158. package/dist/sdk/refine/selection.d.ts +57 -0
  159. package/dist/sdk/refine/selection.js +251 -0
  160. package/dist/sdk/refine/service.d.ts +84 -0
  161. package/dist/sdk/refine/service.js +165 -0
  162. package/dist/sdk/refine/suite.d.ts +67 -0
  163. package/dist/sdk/refine/suite.js +174 -0
  164. package/dist/sdk/refine/trajectory.d.ts +9 -0
  165. package/dist/sdk/refine/trajectory.js +68 -0
  166. package/dist/sdk/refine/types.d.ts +77 -0
  167. package/dist/sdk/refine/types.js +10 -0
  168. package/dist/sdk/server/methods.d.ts +3 -0
  169. package/dist/sdk/server/methods.js +370 -0
  170. package/dist/sdk/server/remote.d.ts +19 -0
  171. package/dist/sdk/server/remote.js +84 -0
  172. package/dist/sdk/server/rpc.d.ts +20 -0
  173. package/dist/sdk/server/rpc.js +102 -0
  174. package/dist/sdk/server/serve.d.ts +10 -0
  175. package/dist/sdk/server/serve.js +18 -0
  176. package/dist/sdk/sessions/approvals.d.ts +47 -0
  177. package/dist/sdk/sessions/approvals.js +119 -0
  178. package/dist/sdk/sessions/continuation.d.ts +48 -0
  179. package/dist/sdk/sessions/continuation.js +85 -0
  180. package/dist/sdk/sessions/contracts.d.ts +534 -0
  181. package/dist/sdk/sessions/contracts.js +299 -0
  182. package/dist/sdk/sessions/extensionUi.d.ts +19 -0
  183. package/dist/sdk/sessions/extensionUi.js +64 -0
  184. package/dist/sdk/sessions/history.d.ts +16 -0
  185. package/dist/sdk/sessions/history.js +68 -0
  186. package/dist/sdk/sessions/lineageJoin.d.ts +2 -0
  187. package/dist/sdk/sessions/lineageJoin.js +61 -0
  188. package/dist/sdk/sessions/planMode.d.ts +36 -0
  189. package/dist/sdk/sessions/planMode.js +84 -0
  190. package/dist/sdk/sessions/policy.d.ts +43 -0
  191. package/dist/sdk/sessions/policy.js +1 -0
  192. package/dist/sdk/sessions/pricing.d.ts +34 -0
  193. package/dist/sdk/sessions/pricing.js +40 -0
  194. package/dist/sdk/sessions/reasoningSummaries.d.ts +11 -0
  195. package/dist/sdk/sessions/reasoningSummaries.js +61 -0
  196. package/dist/sdk/sessions/registry.d.ts +102 -0
  197. package/dist/sdk/sessions/registry.js +383 -0
  198. package/dist/sdk/sessions/runIndex.d.ts +21 -0
  199. package/dist/sdk/sessions/runIndex.js +65 -0
  200. package/dist/sdk/sessions/runStore.d.ts +66 -0
  201. package/dist/sdk/sessions/runStore.js +335 -0
  202. package/dist/sdk/sessions/runner.d.ts +213 -0
  203. package/dist/sdk/sessions/runner.js +589 -0
  204. package/dist/sdk/sessions/sessions.d.ts +140 -0
  205. package/dist/sdk/sessions/sessions.js +394 -0
  206. package/dist/sdk/sessions/subagentService.d.ts +41 -0
  207. package/dist/sdk/sessions/subagentService.js +247 -0
  208. package/dist/sdk/sessions/subagents.d.ts +50 -0
  209. package/dist/sdk/sessions/subagents.js +68 -0
  210. package/dist/sdk/terminal/accountsMenu.d.ts +46 -0
  211. package/dist/sdk/terminal/accountsMenu.js +392 -0
  212. package/dist/sdk/terminal/cli.d.ts +20 -0
  213. package/dist/sdk/terminal/cli.js +121 -0
  214. package/dist/sdk/terminal/client.d.ts +15 -0
  215. package/dist/sdk/terminal/client.js +126 -0
  216. package/dist/sdk/terminal/control.d.ts +4 -0
  217. package/dist/sdk/terminal/control.js +25 -0
  218. package/dist/sdk/terminal/controller.d.ts +72 -0
  219. package/dist/sdk/terminal/controller.js +351 -0
  220. package/dist/sdk/terminal/hubMenu.d.ts +10 -0
  221. package/dist/sdk/terminal/hubMenu.js +34 -0
  222. package/dist/sdk/terminal/launch.d.ts +5 -0
  223. package/dist/sdk/terminal/launch.js +27 -0
  224. package/dist/sdk/terminal/logs.d.ts +14 -0
  225. package/dist/sdk/terminal/logs.js +59 -0
  226. package/dist/sdk/terminal/piExtension.d.ts +6 -0
  227. package/dist/sdk/terminal/piExtension.js +392 -0
  228. package/dist/sdk/terminal/pluginMenu.d.ts +34 -0
  229. package/dist/sdk/terminal/pluginMenu.js +101 -0
  230. package/dist/sdk/terminal/socket.d.ts +70 -0
  231. package/dist/sdk/terminal/socket.js +256 -0
  232. package/dist/sdk/terminal/standalone.d.ts +18 -0
  233. package/dist/sdk/terminal/standalone.js +146 -0
  234. package/dist/sdk/terminal/terminals.d.ts +176 -0
  235. package/dist/sdk/terminal/terminals.js +767 -0
  236. package/dist/sdk/terminal/trajectory.d.ts +10 -0
  237. package/dist/sdk/terminal/trajectory.js +30 -0
  238. package/dist/sdk/terminal/tui/chrome.d.ts +64 -0
  239. package/dist/sdk/terminal/tui/chrome.js +169 -0
  240. package/dist/sdk/terminal/tui/clipboardFiles.d.ts +11 -0
  241. package/dist/sdk/terminal/tui/clipboardFiles.js +74 -0
  242. package/dist/sdk/terminal/tui/commandPages.d.ts +7 -0
  243. package/dist/sdk/terminal/tui/commandPages.js +63 -0
  244. package/dist/sdk/terminal/tui/commands.d.ts +42 -0
  245. package/dist/sdk/terminal/tui/commands.js +276 -0
  246. package/dist/sdk/terminal/tui/dialogGeometry.d.ts +27 -0
  247. package/dist/sdk/terminal/tui/dialogGeometry.js +50 -0
  248. package/dist/sdk/terminal/tui/dialogs.d.ts +75 -0
  249. package/dist/sdk/terminal/tui/dialogs.js +363 -0
  250. package/dist/sdk/terminal/tui/keybindings.d.ts +11 -0
  251. package/dist/sdk/terminal/tui/keybindings.js +49 -0
  252. package/dist/sdk/terminal/tui/list.d.ts +73 -0
  253. package/dist/sdk/terminal/tui/list.js +196 -0
  254. package/dist/sdk/terminal/tui/modeChoices.d.ts +42 -0
  255. package/dist/sdk/terminal/tui/modeChoices.js +70 -0
  256. package/dist/sdk/terminal/tui/modelPicker.d.ts +55 -0
  257. package/dist/sdk/terminal/tui/modelPicker.js +155 -0
  258. package/dist/sdk/terminal/tui/mouse.d.ts +3 -0
  259. package/dist/sdk/terminal/tui/mouse.js +3 -0
  260. package/dist/sdk/terminal/tui/page.d.ts +14 -0
  261. package/dist/sdk/terminal/tui/page.js +1 -0
  262. package/dist/sdk/terminal/tui/pageOverlay.d.ts +27 -0
  263. package/dist/sdk/terminal/tui/pageOverlay.js +145 -0
  264. package/dist/sdk/terminal/tui/pages/accountsPage.d.ts +54 -0
  265. package/dist/sdk/terminal/tui/pages/accountsPage.js +181 -0
  266. package/dist/sdk/terminal/tui/pages/componentsPage.d.ts +47 -0
  267. package/dist/sdk/terminal/tui/pages/componentsPage.js +119 -0
  268. package/dist/sdk/terminal/tui/pages/doctorPage.d.ts +37 -0
  269. package/dist/sdk/terminal/tui/pages/doctorPage.js +145 -0
  270. package/dist/sdk/terminal/tui/pages/hubPage.d.ts +39 -0
  271. package/dist/sdk/terminal/tui/pages/hubPage.js +128 -0
  272. package/dist/sdk/terminal/tui/pages/logPage.d.ts +38 -0
  273. package/dist/sdk/terminal/tui/pages/logPage.js +189 -0
  274. package/dist/sdk/terminal/tui/pages/permissionsPage.d.ts +44 -0
  275. package/dist/sdk/terminal/tui/pages/permissionsPage.js +124 -0
  276. package/dist/sdk/terminal/tui/pages/pluginsPage.d.ts +57 -0
  277. package/dist/sdk/terminal/tui/pages/pluginsPage.js +243 -0
  278. package/dist/sdk/terminal/tui/pages/settingsPage.d.ts +55 -0
  279. package/dist/sdk/terminal/tui/pages/settingsPage.js +88 -0
  280. package/dist/sdk/terminal/tui/pages/trajectoryPage.d.ts +58 -0
  281. package/dist/sdk/terminal/tui/pages/trajectoryPage.js +377 -0
  282. package/dist/sdk/terminal/tui/piAdapter.d.ts +18 -0
  283. package/dist/sdk/terminal/tui/piAdapter.js +48 -0
  284. package/dist/sdk/terminal/tui/planMode.d.ts +2 -0
  285. package/dist/sdk/terminal/tui/planMode.js +2 -0
  286. package/dist/sdk/terminal/tui/questionPicker.d.ts +20 -0
  287. package/dist/sdk/terminal/tui/questionPicker.js +150 -0
  288. package/dist/sdk/terminal/tui/questions.d.ts +19 -0
  289. package/dist/sdk/terminal/tui/questions.js +42 -0
  290. package/dist/sdk/terminal/tui/runtime.d.ts +114 -0
  291. package/dist/sdk/terminal/tui/runtime.js +441 -0
  292. package/dist/sdk/terminal/tui/search.d.ts +22 -0
  293. package/dist/sdk/terminal/tui/search.js +60 -0
  294. package/dist/sdk/terminal/tui/selection.d.ts +16 -0
  295. package/dist/sdk/terminal/tui/selection.js +16 -0
  296. package/dist/sdk/terminal/tui/sessionUi.d.ts +3 -0
  297. package/dist/sdk/terminal/tui/sessionUi.js +30 -0
  298. package/dist/sdk/terminal/tui/settingsModel.d.ts +12 -0
  299. package/dist/sdk/terminal/tui/settingsModel.js +84 -0
  300. package/dist/sdk/terminal/tui/sideQuestion.d.ts +53 -0
  301. package/dist/sdk/terminal/tui/sideQuestion.js +197 -0
  302. package/dist/sdk/terminal/tui/skillInvocation.d.ts +9 -0
  303. package/dist/sdk/terminal/tui/skillInvocation.js +43 -0
  304. package/dist/sdk/terminal/tui/status.d.ts +18 -0
  305. package/dist/sdk/terminal/tui/status.js +67 -0
  306. package/dist/sdk/terminal/tui/theme.d.ts +45 -0
  307. package/dist/sdk/terminal/tui/theme.js +176 -0
  308. package/dist/sdk/terminal/tui/treeModel.d.ts +79 -0
  309. package/dist/sdk/terminal/tui/treeModel.js +483 -0
  310. package/dist/sdk/terminal/tui/treePicker.d.ts +49 -0
  311. package/dist/sdk/terminal/tui/treePicker.js +251 -0
  312. package/dist/sdk/terminal/tui/ui.d.ts +47 -0
  313. package/dist/sdk/terminal/tui/ui.js +148 -0
  314. package/dist/sdk/terminal/tui/workingStatus.d.ts +9 -0
  315. package/dist/sdk/terminal/tui/workingStatus.js +229 -0
  316. package/dist/sdk/tools/askUser.d.ts +6 -0
  317. package/dist/sdk/tools/askUser.js +74 -0
  318. package/dist/sdk/tools/checklist.d.ts +9 -0
  319. package/dist/sdk/tools/checklist.js +54 -0
  320. package/dist/sdk/tools/definitions.d.ts +30 -0
  321. package/dist/sdk/tools/definitions.js +117 -0
  322. package/dist/sdk/tools/dispatch.d.ts +16 -0
  323. package/dist/sdk/tools/dispatch.js +67 -0
  324. package/dist/sdk/tools/harnessTools.d.ts +6 -0
  325. package/dist/sdk/tools/harnessTools.js +20 -0
  326. package/dist/sdk/tools/sessionName.d.ts +7 -0
  327. package/dist/sdk/tools/sessionName.js +31 -0
  328. package/dist/sdk/tools/spawnSubagent.d.ts +4 -0
  329. package/dist/sdk/tools/spawnSubagent.js +49 -0
  330. package/dist/sdk/tools/types.d.ts +48 -0
  331. package/dist/sdk/tools/types.js +1 -0
  332. package/dist/sdk/variant/components.d.ts +34 -0
  333. package/dist/sdk/variant/components.js +230 -0
  334. package/dist/sdk/variant/materialise.d.ts +66 -0
  335. package/dist/sdk/variant/materialise.js +81 -0
  336. package/dist/sdk/variant/migrate.d.ts +4 -0
  337. package/dist/sdk/variant/migrate.js +41 -0
  338. package/dist/sdk/variant/seed.d.ts +20 -0
  339. package/dist/sdk/variant/seed.js +116 -0
  340. package/dist/sdk/variant/store.d.ts +82 -0
  341. package/dist/sdk/variant/store.js +151 -0
  342. package/dist/sdk/variant/surface.d.ts +56 -0
  343. package/dist/sdk/variant/surface.js +81 -0
  344. package/dist/sdk/variant/trust.d.ts +27 -0
  345. package/dist/sdk/variant/trust.js +64 -0
  346. package/dist/sdk/variant/variant.d.ts +71 -0
  347. package/dist/sdk/variant/variant.js +331 -0
  348. package/dist/sdk/web/markdown.d.ts +10 -0
  349. package/dist/sdk/web/markdown.js +66 -0
  350. package/dist/sdk/web/safeRequest.d.ts +34 -0
  351. package/dist/sdk/web/safeRequest.js +175 -0
  352. package/dist/sdk/web/search.d.ts +53 -0
  353. package/dist/sdk/web/search.js +168 -0
  354. package/dist/sdk/web/text.d.ts +2 -0
  355. package/dist/sdk/web/text.js +7 -0
  356. package/dist/sdk/web/tools.d.ts +22 -0
  357. package/dist/sdk/web/tools.js +195 -0
  358. package/dist/sdk/web/turndown-plugin-gfm.d.ts +4 -0
  359. package/dist/sdk/wiki/notes.d.ts +68 -0
  360. package/dist/sdk/wiki/notes.js +297 -0
  361. package/dist/sdk/world/actions.d.ts +23 -0
  362. package/dist/sdk/world/actions.js +31 -0
  363. package/dist/sdk/world/cli.d.ts +12 -0
  364. package/dist/sdk/world/cli.js +166 -0
  365. package/dist/sdk/world/images.d.ts +20 -0
  366. package/dist/sdk/world/images.js +48 -0
  367. package/dist/sdk/world/untrusted.d.ts +12 -0
  368. package/dist/sdk/world/untrusted.js +20 -0
  369. package/dist/sdk/world/world.d.ts +65 -0
  370. package/dist/sdk/world/world.js +80 -0
  371. package/dist/terminal-opentui.js +13612 -0
  372. package/dist/terminal-pi.js +1170 -62
  373. package/docs/README.md +34 -0
  374. package/docs/architecture/00-overview.md +159 -0
  375. package/docs/architecture/01-extension-points.md +78 -0
  376. package/docs/architecture/02-sessions-and-runs.md +146 -0
  377. package/docs/architecture/03-variants.md +95 -0
  378. package/docs/architecture/04-prompt.md +102 -0
  379. package/docs/architecture/05-refinement.md +107 -0
  380. package/docs/architecture/06-plugins-and-capabilities.md +93 -0
  381. package/docs/architecture/07-tools-and-gate.md +88 -0
  382. package/docs/architecture/08-memory-and-history.md +94 -0
  383. package/docs/architecture/09-accounts-and-connectors.md +90 -0
  384. package/docs/architecture/10-server-protocol.md +84 -0
  385. package/docs/architecture/11-terminal.md +81 -0
  386. package/docs/architecture/12-storage.md +61 -0
  387. package/docs/architecture/13-world-tools.md +23 -0
  388. package/docs/architecture/README.md +114 -0
  389. package/docs/architecture/proposals/PROP-0001-reporting-section.md +106 -0
  390. package/docs/architecture/proposals/PROP-0002-retain-rollout-workspaces.md +104 -0
  391. package/docs/architecture/proposals/PROP-0003-executor-settings.md +81 -0
  392. package/docs/architecture/proposals/PROP-0004-flexible-reporting-guidance.md +71 -0
  393. package/docs/architecture/proposals/PROP-0005-xharness-cli-name.md +78 -0
  394. package/docs/architecture/proposals/PROP-0006-run-checklist.md +68 -0
  395. package/docs/architecture/proposals/PROP-0007-run-continuation.md +80 -0
  396. package/docs/architecture/proposals/PROP-0008-lessons-from-runs.md +80 -0
  397. package/docs/architecture/proposals/PROP-0009-foundation-and-variants.md +78 -0
  398. package/docs/architecture/proposals/PROP-0010-session-names.md +73 -0
  399. package/docs/architecture/proposals/PROP-0011-doctor.md +63 -0
  400. package/docs/architecture/proposals/PROP-0012-release-baseline.md +56 -0
  401. package/docs/architecture/proposals/README.md +76 -0
  402. package/docs/decisions/ADR-0001-owned-terminal.md +87 -0
  403. package/docs/decisions/ADR-0002-native-subagent-lifecycle.md +49 -0
  404. package/docs/decisions/ADR-0003-shared-asynchronous-subagents.md +70 -0
  405. package/docs/decisions/ADR-0004-fullscreen-terminal-layout.md +50 -0
  406. package/docs/decisions/ADR-0005-app-provided-oauth-clients.md +54 -0
  407. package/docs/decisions/ADR-0006-opentui-only-terminal.md +47 -0
  408. package/docs/decisions/ADR-0007-reporting-section.md +33 -0
  409. package/docs/decisions/ADR-0008-flexible-reporting-guidance.md +38 -0
  410. package/docs/decisions/ADR-0009-xharness-command.md +38 -0
  411. package/docs/decisions/ADR-0010-lessons-in-the-wiki.md +31 -0
  412. package/docs/decisions/ADR-0011-foundation-and-variants.md +28 -0
  413. package/docs/decisions/ADR-0012-native-session-names.md +34 -0
  414. package/docs/decisions/ADR-0013-doctor.md +27 -0
  415. package/docs/decisions/ADR-0014-public-release-baseline.md +21 -0
  416. package/docs/doctor.md +74 -0
  417. package/docs/experiments/EXP-0001-terminal-input-latency/plan.md +81 -0
  418. package/docs/experiments/EXP-0001-terminal-input-latency/results.md +46 -0
  419. package/docs/experiments/EXP-0002-opentui-typing-latency/plan.md +70 -0
  420. package/docs/experiments/EXP-0002-opentui-typing-latency/results.md +92 -0
  421. package/docs/features/README.md +20 -0
  422. package/docs/features/automations/README.md +41 -0
  423. package/docs/features/cores/README.md +39 -0
  424. package/docs/features/google-harness2/README.md +52 -0
  425. package/docs/features/integrations/README.md +40 -0
  426. package/docs/features/interfaces/README.md +29 -0
  427. package/docs/features/memory/README.md +28 -0
  428. package/docs/releases/1.0.0.md +40 -0
  429. package/docs/releases/README.md +36 -0
  430. package/docs/study/00-index.md +78 -0
  431. package/docs/study/arms/00-matrix.md +20 -0
  432. package/docs/study/arms/01-system-prompt.md +211 -0
  433. package/docs/study/arms/02-tools.md +79 -0
  434. package/docs/study/arms/03-subagents.md +90 -0
  435. package/docs/study/arms/04-skills.md +75 -0
  436. package/docs/study/arms/05-context-management.md +90 -0
  437. package/docs/study/arms/06-memory.md +90 -0
  438. package/docs/study/arms/07-governance.md +71 -0
  439. package/docs/study/arms/08-execution.md +69 -0
  440. package/docs/study/arms/09-observability.md +60 -0
  441. package/docs/study/arms/10-refinement.md +110 -0
  442. package/docs/study/btw-comparison.md +37 -0
  443. package/docs/study/feature-gap-review.md +42 -0
  444. package/docs/study/insights.md +123 -0
  445. package/docs/study/roadmap.md +72 -0
  446. package/docs/study/sources/claude-code.md +44 -0
  447. package/docs/study/sources/deepseek-harness.md +102 -0
  448. package/docs/study/sources/harness2.md +50 -0
  449. package/docs/study/sources/kimi-cli.md +42 -0
  450. package/docs/study/sources/omp.md +93 -0
  451. package/docs/study/sources/opencode.md +43 -0
  452. package/docs/study/sources/openhands.md +46 -0
  453. package/docs/study/sources/smolagents.md +40 -0
  454. package/docs/study/sources/swe-agent.md +34 -0
  455. package/docs/system-prompt-design.md +196 -0
  456. package/docs/terminal-tui.md +671 -0
  457. package/package.json +48 -12
  458. package/src/accounts/accounts.test.ts +0 -223
  459. package/src/accounts/accounts.ts +0 -522
  460. package/src/accounts/env.test.ts +0 -95
  461. package/src/accounts/env.ts +0 -338
  462. package/src/accounts/secrets.ts +0 -50
  463. package/src/accounts/store.ts +0 -338
  464. package/src/capabilities/api.ts +0 -75
  465. package/src/capabilities/runSnapshot.ts +0 -59
  466. package/src/capabilities/types.ts +0 -34
  467. package/src/cli.ts +0 -114
  468. package/src/core/bus.ts +0 -34
  469. package/src/core/changes.ts +0 -33
  470. package/src/core/env.ts +0 -27
  471. package/src/core/errors.ts +0 -32
  472. package/src/core/frontmatter.ts +0 -47
  473. package/src/core/fs.test.ts +0 -38
  474. package/src/core/fs.ts +0 -92
  475. package/src/core/index.ts +0 -193
  476. package/src/core/path.test.ts +0 -14
  477. package/src/core/path.ts +0 -79
  478. package/src/core/projects.ts +0 -90
  479. package/src/core/text.ts +0 -39
  480. package/src/harness.ts +0 -299
  481. package/src/index.ts +0 -70
  482. package/src/mcp/connections.ts +0 -614
  483. package/src/mcp/manager.ts +0 -130
  484. package/src/mcp/oauth.ts +0 -195
  485. package/src/mcp/scopeMigration.test.ts +0 -79
  486. package/src/mcp/scopeMigration.ts +0 -204
  487. package/src/mcp/service.test.ts +0 -376
  488. package/src/mcp/service.ts +0 -549
  489. package/src/mcp/types.ts +0 -108
  490. package/src/memory/api.test.ts +0 -82
  491. package/src/memory/api.ts +0 -289
  492. package/src/memory/blocks.test.ts +0 -78
  493. package/src/memory/blocks.ts +0 -406
  494. package/src/memory/caller.ts +0 -57
  495. package/src/memory/dispatch.ts +0 -59
  496. package/src/memory/facts.test.ts +0 -41
  497. package/src/memory/facts.ts +0 -248
  498. package/src/memory/graph.ts +0 -103
  499. package/src/memory/health.test.ts +0 -130
  500. package/src/memory/health.ts +0 -74
  501. package/src/memory/maintainer.ts +0 -272
  502. package/src/memory/maintenance.test.ts +0 -176
  503. package/src/memory/maintenance.ts +0 -330
  504. package/src/memory/migrate.ts +0 -79
  505. package/src/memory/operations.ts +0 -138
  506. package/src/memory/proposals.test.ts +0 -168
  507. package/src/memory/proposals.ts +0 -576
  508. package/src/memory/recall.test.ts +0 -104
  509. package/src/memory/recall.ts +0 -271
  510. package/src/memory/references.ts +0 -77
  511. package/src/memory/runContext.ts +0 -93
  512. package/src/memory/secrets.ts +0 -6
  513. package/src/memory/store.test.ts +0 -66
  514. package/src/memory/store.ts +0 -385
  515. package/src/memory/wiki.test.ts +0 -47
  516. package/src/memory/wiki.ts +0 -422
  517. package/src/memory/wikiIndex.test.ts +0 -88
  518. package/src/memory/wikiIndex.ts +0 -116
  519. package/src/plugins/api.ts +0 -181
  520. package/src/plugins/attachments.test.ts +0 -84
  521. package/src/plugins/attachments.ts +0 -141
  522. package/src/plugins/builtin.ts +0 -82
  523. package/src/plugins/catalogue.test.ts +0 -254
  524. package/src/plugins/catalogue.ts +0 -251
  525. package/src/plugins/cli.ts +0 -184
  526. package/src/plugins/discover.ts +0 -151
  527. package/src/plugins/firstParty.test.ts +0 -143
  528. package/src/plugins/firstParty.ts +0 -129
  529. package/src/plugins/hooks.test.ts +0 -250
  530. package/src/plugins/hooks.ts +0 -239
  531. package/src/plugins/identity.ts +0 -37
  532. package/src/plugins/install.test.ts +0 -107
  533. package/src/plugins/install.ts +0 -106
  534. package/src/plugins/inventory.ts +0 -123
  535. package/src/plugins/manifest.ts +0 -76
  536. package/src/plugins/plugins.test.ts +0 -205
  537. package/src/plugins/plugins.ts +0 -189
  538. package/src/plugins/proposal.ts +0 -121
  539. package/src/plugins/runtime.test.ts +0 -40
  540. package/src/plugins/runtime.ts +0 -82
  541. package/src/plugins/trust.ts +0 -142
  542. package/src/plugins/types.ts +0 -149
  543. package/src/prompt/compile.test.ts +0 -261
  544. package/src/prompt/compile.ts +0 -732
  545. package/src/server/methods.ts +0 -314
  546. package/src/server/remote.ts +0 -77
  547. package/src/server/rpc.ts +0 -116
  548. package/src/server/serve.ts +0 -28
  549. package/src/server/server.test.ts +0 -174
  550. package/src/sessions/approvals.ts +0 -118
  551. package/src/sessions/contracts.ts +0 -310
  552. package/src/sessions/conversation.test.ts +0 -150
  553. package/src/sessions/extensionSession.test.ts +0 -74
  554. package/src/sessions/extensionUi.test.ts +0 -65
  555. package/src/sessions/extensionUi.ts +0 -102
  556. package/src/sessions/history.ts +0 -51
  557. package/src/sessions/lineageJoin.ts +0 -75
  558. package/src/sessions/policy.ts +0 -32
  559. package/src/sessions/pricing.ts +0 -60
  560. package/src/sessions/reasoningSummaries.ts +0 -59
  561. package/src/sessions/registry.ts +0 -294
  562. package/src/sessions/runIndex.ts +0 -99
  563. package/src/sessions/runStore.test.ts +0 -152
  564. package/src/sessions/runStore.ts +0 -332
  565. package/src/sessions/runner.ts +0 -569
  566. package/src/sessions/runtimeResources.test.ts +0 -61
  567. package/src/sessions/sessions.test.ts +0 -455
  568. package/src/sessions/sessions.ts +0 -295
  569. package/src/skills/registry.test.ts +0 -104
  570. package/src/skills/registry.ts +0 -407
  571. package/src/terminal/cli.ts +0 -149
  572. package/src/terminal/client.ts +0 -74
  573. package/src/terminal/controller.ts +0 -227
  574. package/src/terminal/launch.test.ts +0 -34
  575. package/src/terminal/launch.ts +0 -88
  576. package/src/terminal/piExtension.ts +0 -210
  577. package/src/terminal/pluginControl.test.ts +0 -146
  578. package/src/terminal/pluginMenu.ts +0 -112
  579. package/src/terminal/socket.test.ts +0 -71
  580. package/src/terminal/socket.ts +0 -221
  581. package/src/terminal/standalone.test.ts +0 -130
  582. package/src/terminal/standalone.ts +0 -144
  583. package/src/terminal/terminal.test.ts +0 -330
  584. package/src/terminal/terminals.ts +0 -443
  585. package/src/tools/askUser.ts +0 -45
  586. package/src/tools/definitions.ts +0 -187
  587. package/src/tools/memoryTools.ts +0 -22
  588. package/src/tools/pluginPropose.ts +0 -41
  589. package/src/tools/types.ts +0 -39
  590. package/src/web/safeRequest.ts +0 -171
  591. package/src/web/text.ts +0 -53
  592. package/src/web/tools.ts +0 -134
  593. package/src/web/web.test.ts +0 -141
@@ -1,407 +0,0 @@
1
- // Canonical skills, prompts, and rules under `<data root>/registry/`. Each item is a Markdown
2
- // file (a skill may also be a folder with `SKILL.md`) with optional `name`/`description`
3
- // frontmatter. These files are the single source of truth. Items are enabled globally and per
4
- // project; enabled items are loaded automatically, and any item can be retrieved on demand.
5
- //
6
- // Built-in items ship with the harness or the application that embeds it, in folders laid out
7
- // like `registry/`. They are read-only and on everywhere until a person switches one off; an
8
- // item of the same id in the data root replaces the built-in one.
9
- import { lstatSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, renameSync, rmSync, unlinkSync, writeFileSync } from 'node:fs'
10
- import { basename, dirname, join } from 'node:path'
11
-
12
- import { invalid } from '../core/errors'
13
- import * as frontmatter from '../core/frontmatter'
14
- import { atomicWrite, now, readJsonOr, safeRelative } from '../core/fs'
15
- import { findProject } from '../core/projects'
16
- import { compareText, lines, takeChars } from '../core/text'
17
- import * as store from '../memory/store'
18
- import * as attachments from '../plugins/attachments'
19
-
20
- export const KINDS = ['skills', 'prompts', 'rules'] as const
21
- export type RegistryKind = (typeof KINDS)[number]
22
-
23
- export interface RegistryItem {
24
- /** `<kind>/<name>`, stable across edits. */
25
- id: string
26
- kind: string
27
- name: string
28
- description: string
29
- path: string
30
- /** Set on an item that ships with the harness or the application, not on a person's own. */
31
- builtin?: true
32
- }
33
-
34
- /** The capability id used when this registry item is shown in the plugin catalogue. */
35
- export function contributionId(item: Pick<RegistryItem, 'id' | 'builtin'>): string {
36
- return `${item.builtin ? 'included' : 'yours'}/${item.id}`
37
- }
38
-
39
- /** Limits registry items to the contributions frozen for a run. `undefined` means no limit. */
40
- export function limitToContributions(items: readonly RegistryItem[], contributions?: readonly string[]): RegistryItem[] {
41
- if (contributions === undefined) return [...items]
42
- const allowed = new Set(contributions)
43
- return items.filter((item) => allowed.has(contributionId(item)))
44
- }
45
-
46
- export interface SkillBundleInput {
47
- name: string
48
- files: { path: string; content: string; encoding: 'utf8' | 'base64' }[]
49
- }
50
-
51
- const MAX_SKILL_BUNDLES = 20
52
- const MAX_SKILL_FILES = 100
53
- const MAX_SKILL_IMPORT_BYTES = 10 * 1024 * 1024
54
-
55
- let builtinDirs: string[] = []
56
-
57
- /** The folders built-in items are read from, each laid out like `registry/`. Later folders win. */
58
- export function configureBuiltins(directories: readonly string[]): void {
59
- builtinDirs = [...directories]
60
- }
61
-
62
- function itemFrom(kind: string, stem: string, file: string): RegistryItem | null {
63
- let text: string
64
- try {
65
- text = readFileSync(file, 'utf8')
66
- } catch {
67
- return null
68
- }
69
- const parsed = frontmatter.parse(text)
70
- const name = parsed?.front.name
71
- const description = parsed?.front.description
72
- // A frontmatter block whose name or description is not text is treated as no frontmatter.
73
- const usable = parsed !== null && (name === undefined || name === null || typeof name === 'string') && (description === undefined || description === null || typeof description === 'string')
74
- const body = usable ? parsed.body : text
75
- return {
76
- id: `${kind}/${stem}`,
77
- kind,
78
- name: usable && typeof name === 'string' ? name : stem.replace(/[-_]/g, ' '),
79
- description: usable && typeof description === 'string' ? description : takeChars(lines(body).find((line) => line.trim() && !line.startsWith('#')) ?? '', 160),
80
- path: file
81
- }
82
- }
83
-
84
- const stemOf = (name: string): string => (name.lastIndexOf('.') > 0 ? name.slice(0, name.lastIndexOf('.')) : name)
85
-
86
- /** The name and description of a skill or prompt file anywhere on disk, read the way a registry item is. */
87
- export function describeFile(file: string): { name: string; description: string } | null {
88
- const stem = basename(file) === 'SKILL.md' ? basename(dirname(file)) : stemOf(basename(file))
89
- const item = itemFrom('', stem, file)
90
- return item && { name: item.name, description: item.description }
91
- }
92
-
93
- function itemsIn(directory: string): RegistryItem[] {
94
- const items: RegistryItem[] = []
95
- for (const kind of KINDS) {
96
- let names: string[]
97
- try {
98
- names = readdirSync(join(directory, kind))
99
- } catch {
100
- continue
101
- }
102
- for (const name of names) {
103
- const path = join(directory, kind, name)
104
- const stem = stemOf(name)
105
- if (stem.startsWith('.')) continue
106
- const file = store.isDir(path) ? join(path, 'SKILL.md') : name.endsWith('.md') ? path : null
107
- const item = file && itemFrom(kind, stem, file)
108
- if (item) items.push(item)
109
- }
110
- }
111
- return items
112
- }
113
-
114
- export function list(root: string): RegistryItem[] {
115
- const items = new Map<string, RegistryItem>()
116
- for (const directory of builtinDirs) for (const item of itemsIn(directory)) items.set(item.id, { ...item, builtin: true })
117
- for (const item of itemsIn(join(root, 'registry'))) items.set(item.id, item)
118
- return [...items.values()].sort((left, right) => compareText(left.id, right.id))
119
- }
120
-
121
- function enablementPath(root: string): string {
122
- return join(root, 'config/registry-enabled.json')
123
- }
124
-
125
- /** Key for items enabled everywhere. Older data roots used `personal`, which is read the same way. */
126
- export const GLOBAL_KEY = 'global'
127
-
128
- /**
129
- * The registry's earlier enablement file as it is on disk: ids keyed by project id, or `global`
130
- * for everyone. The choices now live with every other plugin's (`plugins/attachments.ts`), which
131
- * reads this file until the first change is saved.
132
- */
133
- export function enablement(root: string): Record<string, unknown> {
134
- const map = readJsonOr<unknown>(enablementPath(root), {})
135
- return map && typeof map === 'object' && !Array.isArray(map) ? (map as Record<string, unknown>) : {}
136
- }
137
-
138
- export function enablementIds(map: Record<string, unknown>, key: string): string[] {
139
- const ids = map[key]
140
- return Array.isArray(ids) ? ids.filter((id): id is string => typeof id === 'string') : []
141
- }
142
-
143
- /** Built-in items a person switched off. Everything else built in is on everywhere. */
144
- export const BUILTIN_OFF_KEY = 'builtinOff'
145
-
146
- /** Whether an id names a registry item, as `<kind>/<name>`. */
147
- export const isItemId = (id: string): boolean => KINDS.some((kind) => id.startsWith(`${kind}/`))
148
-
149
- /**
150
- * Items active for a caller. A built-in is on until it is switched off; a person's own is off
151
- * until it is switched on, everywhere, for the caller's project, or for the calling agent.
152
- */
153
- export function enabledFor(root: string, projectId: string | null, agentId: string | null = null, contributions?: readonly string[]): RegistryItem[] {
154
- if (contributions !== undefined) return limitToContributions(list(root), contributions)
155
- const choices = attachments.load(root)
156
- return list(root).filter((item) => attachments.attached(choices, [item.id], { agentId, projectId }, !!item.builtin))
157
- }
158
-
159
- /** An item's Markdown body without frontmatter. */
160
- export function itemBody(item: RegistryItem): string {
161
- try {
162
- const text = readFileSync(item.path, 'utf8')
163
- return frontmatter.split(text)?.body ?? text
164
- } catch {
165
- return ''
166
- }
167
- }
168
-
169
- export interface RegistryResources {
170
- ids: string[]
171
- skillPaths: string[]
172
- promptPaths: string[]
173
- }
174
-
175
- /** What a Pi session needs to load enabled items natively. Rule text reaches the model through the compiled prompt. */
176
- export function resources(root: string, projectId: string | null, agentId: string | null = null, contributions?: readonly string[]): RegistryResources {
177
- const items = enabledFor(root, projectId, agentId, contributions)
178
- return {
179
- ids: items.map((item) => item.id),
180
- skillPaths: items.filter((item) => item.kind === 'skills').map((item) => item.path),
181
- promptPaths: items.filter((item) => item.kind === 'prompts').map((item) => item.path)
182
- }
183
- }
184
-
185
- // Prefix of the entries an earlier version of the harness linked into a Pi agent folder's `skills/`.
186
- const LINKED_SKILL_PREFIX = 'agentx-'
187
-
188
- function isLinkedSkill(path: string): boolean {
189
- let meta
190
- try {
191
- meta = lstatSync(path)
192
- } catch {
193
- return false
194
- }
195
- if (meta.isSymbolicLink()) return true
196
- if (!meta.isDirectory()) return false
197
- // A single-file skill was linked as `agentx-<name>/SKILL.md` inside a folder the harness made.
198
- try {
199
- const entries = readdirSync(path)
200
- return entries.length === 1 && entries[0] === 'SKILL.md' && lstatSync(join(path, 'SKILL.md')).isSymbolicLink()
201
- } catch {
202
- return false
203
- }
204
- }
205
-
206
- /**
207
- * Removes the `agentx-<name>` links an earlier version kept in a terminal session's `skills/`
208
- * folder, leaving the user's own skills alone. Enabled skills now reach a session as paths.
209
- */
210
- export function removeLinkedSkills(skillsDir: string): void {
211
- let names: string[]
212
- try {
213
- names = readdirSync(skillsDir)
214
- } catch {
215
- return
216
- }
217
- for (const name of names) {
218
- const path = join(skillsDir, name)
219
- if (!name.startsWith(LINKED_SKILL_PREFIX) || !isLinkedSkill(path)) continue
220
- if (lstatSync(path).isSymbolicLink()) unlinkSync(path)
221
- else rmSync(path, { recursive: true, force: true })
222
- }
223
- }
224
-
225
- export interface RegistryState {
226
- items: RegistryItem[]
227
- enabled: Record<string, unknown>
228
- }
229
-
230
- /**
231
- * Enablement as a person sees it, in the earlier file's shape: ids keyed by project id, `global`
232
- * for everyone (built-ins that are on count as enabled everywhere), and the built-ins switched off.
233
- */
234
- function shown(items: readonly RegistryItem[], choices: attachments.Attachments): Record<string, unknown> {
235
- const builtin = items.filter((item) => item.builtin).map((item) => item.id)
236
- const off = choices.global.off.filter((id) => builtin.includes(id))
237
- const global = choices.global.on.filter((id) => isItemId(id) && !builtin.includes(id))
238
- const map: Record<string, unknown> = { [GLOBAL_KEY]: [...global, ...builtin.filter((id) => !off.includes(id))] }
239
- for (const [projectId, entries] of Object.entries(choices.projects)) map[projectId] = entries.on.filter(isItemId)
240
- if (off.length) map[BUILTIN_OFF_KEY] = off
241
- return map
242
- }
243
-
244
- export function state(root: string): RegistryState {
245
- const items = list(root)
246
- return { items, enabled: shown(items, attachments.load(root)) }
247
- }
248
-
249
- /** Sets enabled items for a project, or globally when `projectId` is `null`. */
250
- export function setEnabled(root: string, projectId: string | null, ids: string[]): RegistryState {
251
- if (projectId) findProject(root, projectId)
252
- const items = list(root)
253
- const unknown = ids.find((id) => !items.some((item) => item.id === id))
254
- if (unknown !== undefined) throw invalid(`Unknown registry item ${unknown}.`)
255
- const builtin = items.filter((item) => item.builtin).map((item) => item.id)
256
- const choices = attachments.load(root)
257
- const entries = projectId ? (choices.projects[projectId] ??= { on: [], off: [] }) : choices.global
258
- // Only the registry's own ids are replaced; other plugins' choices in the same scope stay.
259
- entries.on = [...entries.on.filter((id) => !isItemId(id)), ...ids.filter((id) => !builtin.includes(id))]
260
- entries.off = entries.off.filter((id) => !isItemId(id) || (!ids.includes(id) && !(!projectId && builtin.includes(id))))
261
- // A built-in left out of the global list was switched off.
262
- if (!projectId) entries.off.push(...builtin.filter((id) => !ids.includes(id)))
263
- attachments.save(root, choices)
264
- return { items, enabled: shown(items, choices) }
265
- }
266
-
267
- function kindDir(root: string, kind: string): string {
268
- if (!(KINDS as readonly string[]).includes(kind)) throw invalid('Unknown registry kind.')
269
- return join(root, 'registry', kind)
270
- }
271
-
272
- /** Creates a starter item from a name: a Markdown file, or a skill folder with `SKILL.md`. */
273
- export function create(root: string, kind: string, rawName: string): RegistryState {
274
- const directory = kindDir(root, kind)
275
- const name = rawName.trim()
276
- const slug = Array.from(name.toLowerCase(), (character) => (/^[a-z0-9]$/.test(character) ? character : '-')).join('').split('-').filter(Boolean).join('-')
277
- if (!slug || slug.length > 64) throw invalid('Use a short name with letters or numbers.')
278
- const description = 'Describe when to use this.'
279
- const target = kind === 'skills' ? join(directory, slug) : join(directory, `${slug}.md`)
280
- let exists = true
281
- try {
282
- lstatSync(target)
283
- } catch {
284
- exists = false
285
- }
286
- if (exists) throw invalid('An item with that name already exists.')
287
- if (kind === 'skills') atomicWrite(join(target, 'SKILL.md'), `---\nname: ${slug}\ndescription: ${description}\n---\n\n# ${name}\n\nSteps the agent should follow.\n`)
288
- else atomicWrite(target, `---\nname: ${name}\ndescription: ${description}\n---\n\n`)
289
- return state(root)
290
- }
291
-
292
- /** Imports complete user-owned skill folders without replacing existing or built-in items. */
293
- export function importSkills(root: string, bundles: SkillBundleInput[]): RegistryState {
294
- if (!Array.isArray(bundles) || bundles.length === 0 || bundles.length > MAX_SKILL_BUNDLES) {
295
- throw invalid(`Import between 1 and ${MAX_SKILL_BUNDLES} skills at a time.`)
296
- }
297
-
298
- const directory = kindDir(root, 'skills')
299
- mkdirSync(directory, { recursive: true })
300
- const existing = new Set(list(root).map((item) => item.id))
301
- const seen = new Set<string>()
302
- let totalBytes = 0
303
- const prepared = bundles.map((bundle) => {
304
- if (!bundle || typeof bundle.name !== 'string' || !Array.isArray(bundle.files) || bundle.files.length === 0 || bundle.files.length > MAX_SKILL_FILES) {
305
- throw invalid('Each skill needs a name and a bounded list of files.')
306
- }
307
- const name = bundle.name.trim()
308
- if (name.length > 64) throw invalid('Use a skill name with at most 64 letters or numbers.')
309
- const slug = Array.from(name.toLowerCase(), (character) => (/^[a-z0-9]$/.test(character) ? character : '-')).join('').split('-').filter(Boolean).join('-')
310
- if (!slug || slug.length > 64) throw invalid('Use a skill name with at most 64 letters or numbers.')
311
- const id = `skills/${slug}`
312
- if (existing.has(id) || seen.has(id)) throw invalid(`The skill “${name}” already exists.`)
313
- try {
314
- lstatSync(join(directory, slug))
315
- throw invalid(`The skill “${name}” already exists.`)
316
- } catch (error) {
317
- if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error
318
- }
319
- seen.add(id)
320
-
321
- const files = new Map<string, Uint8Array>()
322
- for (const file of bundle.files) {
323
- if (!file || typeof file.path !== 'string' || file.path.length > 240 || typeof file.content !== 'string' || !['utf8', 'base64'].includes(file.encoding)) {
324
- throw invalid(`The skill “${name}” contains an invalid file.`)
325
- }
326
- let relative: string
327
- try {
328
- relative = safeRelative(file.path)
329
- } catch {
330
- throw invalid(`The skill “${name}” contains a path outside its folder.`)
331
- }
332
- if (relative.includes('\0') || relative.split('/').some((part) => part.startsWith('.') || part.includes(':'))) {
333
- throw invalid(`The skill “${name}” contains an unsupported file path.`)
334
- }
335
- const portablePath = relative.normalize('NFC').toLowerCase()
336
- if ([...files.keys()].some((path) => path.normalize('NFC').toLowerCase() === portablePath)) throw invalid(`The skill “${name}” contains a duplicate file path.`)
337
- let byteLength: number
338
- if (file.encoding === 'base64') {
339
- if (!/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(file.content)) {
340
- throw invalid(`The file “${relative}” is not valid base64.`)
341
- }
342
- if (file.content.length > Math.ceil(MAX_SKILL_IMPORT_BYTES / 3) * 4) throw invalid('The skill import is larger than 10 MiB.')
343
- byteLength = Math.floor(file.content.length * 3 / 4) - (file.content.endsWith('==') ? 2 : file.content.endsWith('=') ? 1 : 0)
344
- } else {
345
- byteLength = Buffer.byteLength(file.content, 'utf8')
346
- }
347
- totalBytes += byteLength
348
- if (totalBytes > MAX_SKILL_IMPORT_BYTES) throw invalid('The skill import is larger than 10 MiB.')
349
- const bytes = file.encoding === 'base64' ? Buffer.from(file.content, 'base64') : Buffer.from(file.content, 'utf8')
350
- if (file.encoding === 'base64' && bytes.toString('base64') !== file.content) throw invalid(`The file “${relative}” is not valid base64.`)
351
- files.set(relative, bytes)
352
- }
353
- if (!files.has('SKILL.md')) throw invalid(`The skill “${name}” must include SKILL.md at its root.`)
354
- return { name, slug, files }
355
- })
356
-
357
- const staging = mkdtempSync(join(directory, '.agent-template-import-'))
358
- const installed: string[] = []
359
- try {
360
- for (const bundle of prepared) {
361
- const target = join(staging, bundle.slug)
362
- for (const [relative, bytes] of bundle.files) {
363
- const path = join(target, ...relative.split('/'))
364
- mkdirSync(dirname(path), { recursive: true })
365
- writeFileSync(path, bytes, { flag: 'wx' })
366
- }
367
- }
368
- for (const bundle of prepared) {
369
- const target = join(directory, bundle.slug)
370
- renameSync(join(staging, bundle.slug), target)
371
- installed.push(target)
372
- }
373
- } catch (error) {
374
- for (const target of installed) rmSync(target, { recursive: true, force: true })
375
- throw error
376
- } finally {
377
- rmSync(staging, { recursive: true, force: true })
378
- }
379
- return state(root)
380
- }
381
-
382
- /**
383
- * Writes a skill, prompt, or rule (an accepted proposal), keeping an existing item's location.
384
- * The previous content and the new content are recorded as Wiki revisions of the item.
385
- */
386
- export function writeItem(root: string, kind: string, name: string, description: string, body: string, reason: string): string {
387
- const plural = kind === 'skill' ? 'skills' : kind === 'prompt' ? 'prompts' : kind === 'rule' ? 'rules' : null
388
- if (!plural) throw invalid('Only skills, prompts, and rules can be written.')
389
- const stem = store.slug(name)
390
- const id = `${plural}/${stem}`
391
- const existing = list(root).find((item) => item.id === id)
392
- // A built-in is never edited in place: the accepted text becomes the person's own item.
393
- const path = existing && !existing.builtin ? existing.path : plural === 'skills' ? join(kindDir(root, plural), stem, 'SKILL.md') : join(kindDir(root, plural), `${stem}.md`)
394
- const text = frontmatter.serialize({ name: plural === 'skills' ? stem : name.trim(), ...(description.trim() ? { description: description.trim() } : {}) }, body)
395
- const wiki = store.wikiDir(root)
396
- if (existing) {
397
- try {
398
- store.snapshot(wiki, id, readFileSync(existing.path, 'utf8'), 'user', 'Before accepted proposal')
399
- } catch {
400
- // Nothing readable to keep.
401
- }
402
- }
403
- atomicWrite(path, text)
404
- store.snapshot(wiki, id, text, 'user', reason)
405
- store.log(wiki, `- ${now()} · user · ${existing ? 'updated' : 'created'} \`${id}\` · ${reason}`)
406
- return id
407
- }
@@ -1,149 +0,0 @@
1
- // `xagent-wiki` and `xagent-mcp`: the harness's memory, Wiki, and connected apps as commands,
2
- // for a `pi` terminal session's shell. Each command maps onto one call to the session socket.
3
- import type { WikiCall } from '../tools/definitions'
4
- import { connectionFromEnv, socketCall } from './client'
5
-
6
- export const WIKI_COMMAND = 'xagent-wiki'
7
- export const APPS_COMMAND = 'xagent-mcp'
8
-
9
- export const USAGE = `Usage: ${WIKI_COMMAND} <command> [arguments]
10
-
11
- entrypoint Your context pack: memory blocks, rules, skills, project map
12
- search <query> [--kind K] [--namespace NS]
13
- Search every namespace (K: page, fact, skill, rule, prompt)
14
- read <id or path> Read one page, fact, skill, rule, or prompt
15
- list [namespace] [--kind K] List namespaces and pages, or all entries of a kind
16
- skill [name] Load a skill, or list skills
17
- facts [query] [--namespace NS] Recall facts (also: memory)
18
- history <query> [--scope all] [--since YYYY-MM-DD]
19
- Search earlier conversations and runs (also: recall)
20
- history-read <run id> Read one earlier run (also: recall-read)
21
- block append <label> <text> Add to a memory block (user, project, or a shared block)
22
- block replace <label> --old <text> --new <text>
23
- Replace one exact passage in a memory block
24
- block rethink <label> <text> Rewrite a whole memory block
25
- propose <json | -> Record knowledge, e.g. {"kind":"fact","title":"…","body":"…",
26
- "type":"preference","sourceRefs":[{"kind":"run","ref":"current"}]}
27
- `
28
-
29
- export const APPS_USAGE = `Usage: ${APPS_COMMAND} <command>
30
-
31
- list The app and connected-app tools this session may use
32
- call <tool-name> '<JSON arguments>'
33
- Use one of them
34
- `
35
-
36
- export type CliCommand = { kind: 'call'; call: WikiCall; params: Record<string, unknown> } | { kind: 'help' } | { kind: 'stdin-propose' }
37
-
38
- function options(args: string[]): { positional: string[]; flags: Record<string, string> } {
39
- const positional: string[] = []
40
- const flags: Record<string, string> = {}
41
- for (let index = 0; index < args.length; index += 1) {
42
- const arg = args[index]
43
- if (arg.startsWith('--') && index + 1 < args.length) {
44
- flags[arg.slice(2)] = args[index + 1]
45
- index += 1
46
- } else {
47
- positional.push(arg)
48
- }
49
- }
50
- return { positional, flags }
51
- }
52
-
53
- export function parseCli(argv: string[]): CliCommand {
54
- const [command, ...rest] = argv
55
- const { positional, flags } = options(rest)
56
- const joined = positional.join(' ').trim()
57
- switch (command) {
58
- case 'entrypoint':
59
- return { kind: 'call', call: 'wiki.entrypoint', params: {} }
60
- case 'search':
61
- if (!joined) return { kind: 'help' }
62
- return { kind: 'call', call: 'wiki.search', params: { query: joined, ...(flags.kind ? { kinds: [flags.kind] } : {}), ...(flags.namespace ? { namespace: flags.namespace } : {}) } }
63
- case 'read':
64
- if (!joined) return { kind: 'help' }
65
- return { kind: 'call', call: 'wiki.read', params: { id: joined } }
66
- case 'list':
67
- return { kind: 'call', call: 'wiki.list', params: { ...(joined ? { namespace: joined } : {}), ...(flags.kind ? { kind: flags.kind } : {}) } }
68
- case 'skill':
69
- return { kind: 'call', call: 'wiki.skill', params: joined ? { name: joined } : {} }
70
- case 'facts':
71
- case 'memory':
72
- return { kind: 'call', call: 'wiki.memory', params: { ...(joined ? { query: joined } : {}), ...(flags.namespace ? { namespace: flags.namespace } : {}) } }
73
- case 'history':
74
- case 'recall':
75
- if (!joined) return { kind: 'help' }
76
- return { kind: 'call', call: 'recall.search', params: { query: joined, ...(flags.scope ? { scope: flags.scope } : {}), ...(flags.since ? { since: flags.since } : {}) } }
77
- case 'history-read':
78
- case 'recall-read':
79
- if (!joined) return { kind: 'help' }
80
- return { kind: 'call', call: 'recall.read', params: { run: joined } }
81
- case 'block': {
82
- const [action, label, ...words] = positional
83
- const body = words.join(' ').trim()
84
- if (action === 'append' && label && body) return { kind: 'call', call: 'memory.append', params: { block: label, text: body } }
85
- if (action === 'rethink' && label && body) return { kind: 'call', call: 'memory.rethink', params: { block: label, body } }
86
- if (action === 'replace' && label && flags.old !== undefined && flags.new !== undefined) return { kind: 'call', call: 'memory.replace', params: { block: label, old: flags.old, new: flags.new } }
87
- return { kind: 'help' }
88
- }
89
- case 'propose': {
90
- if (joined === '-') return { kind: 'stdin-propose' }
91
- try {
92
- const params = JSON.parse(joined) as unknown
93
- if (params && typeof params === 'object' && !Array.isArray(params)) return { kind: 'call', call: 'wiki.propose', params: params as Record<string, unknown> }
94
- } catch {
95
- // Falls through to help.
96
- }
97
- return { kind: 'help' }
98
- }
99
- default:
100
- return { kind: 'help' }
101
- }
102
- }
103
-
104
- async function readStdin(): Promise<string> {
105
- let text = ''
106
- for await (const chunk of process.stdin) text += chunk.toString()
107
- return text
108
- }
109
-
110
- const errorText = (error: unknown): string => (error instanceof Error ? error.message : String(error))
111
-
112
- /** Runs `xagent-wiki <argv>`; returns the exit code. */
113
- export async function runWikiCli(argv: string[]): Promise<number> {
114
- const command = parseCli(argv)
115
- if (command.kind === 'help') {
116
- process.stdout.write(USAGE)
117
- return argv.length ? 2 : 0
118
- }
119
- try {
120
- const connection = connectionFromEnv()
121
- const result =
122
- command.kind === 'stdin-propose'
123
- ? await socketCall<string>(connection, 'wiki.propose', JSON.parse(await readStdin()) as Record<string, unknown>)
124
- : await socketCall<string>(connection, command.call, command.params)
125
- process.stdout.write(`${typeof result === 'string' ? result : JSON.stringify(result)}\n`)
126
- return 0
127
- } catch (error) {
128
- process.stderr.write(`${errorText(error)}\n`)
129
- return 1
130
- }
131
- }
132
-
133
- /** Runs `xagent-mcp <argv>`; returns the exit code. */
134
- export async function runAppsCli(argv: string[]): Promise<number> {
135
- const [command, name, args] = argv
136
- if (command !== 'list' && !(command === 'call' && name)) {
137
- process.stdout.write(APPS_USAGE)
138
- return argv.length ? 2 : 0
139
- }
140
- try {
141
- const connection = connectionFromEnv()
142
- const result = command === 'list' ? await socketCall(connection, 'mcp.list', {}, 90_000) : await socketCall(connection, 'mcp.call', { name, args: JSON.parse(args ?? '{}') as unknown }, 1_230_000)
143
- process.stdout.write(`${JSON.stringify(result)}\n`)
144
- return 0
145
- } catch (error) {
146
- process.stderr.write(`${errorText(error)}\n`)
147
- return 1
148
- }
149
- }
@@ -1,74 +0,0 @@
1
- // How a process outside the harness (the `pi` command's extension, the `xagent-wiki` and
2
- // `xagent-mcp` commands) reaches it: one newline-delimited JSON request and reply per
3
- // connection to the session socket, authorized by the token the harness put in its environment.
4
- import { createConnection } from 'node:net'
5
-
6
- export const SOCKET_ENV = 'XINGULAR_HARNESS_SOCKET'
7
- export const TOKEN_ENV = 'XINGULAR_HARNESS_TOKEN'
8
-
9
- export class SocketError extends Error {
10
- constructor(
11
- readonly code: string,
12
- message: string
13
- ) {
14
- super(message)
15
- }
16
- }
17
-
18
- export interface SocketConnection {
19
- socket: string
20
- token: string
21
- }
22
-
23
- export function connectionFromEnv(env: NodeJS.ProcessEnv = process.env): SocketConnection {
24
- const socket = env[SOCKET_ENV]
25
- const token = env[TOKEN_ENV]
26
- if (!socket || !token) throw new SocketError('not_configured', `This command only works inside a terminal session the harness started (${SOCKET_ENV} and ${TOKEN_ENV} are not set).`)
27
- return { socket, token }
28
- }
29
-
30
- function request<T>(connection: SocketConnection, body: Record<string, unknown>, what: string, timeoutMs: number): Promise<T> {
31
- return new Promise<T>((resolve, reject) => {
32
- const stream = createConnection(connection.socket)
33
- let buffer = ''
34
- let settled = false
35
- const finish = (action: () => void) => {
36
- if (settled) return
37
- settled = true
38
- clearTimeout(timer)
39
- stream.end()
40
- action()
41
- }
42
- const timer = setTimeout(() => {
43
- stream.destroy()
44
- finish(() => reject(new SocketError('timeout', `The harness did not answer ${what}.`)))
45
- }, timeoutMs)
46
- stream.on('connect', () => stream.write(`${JSON.stringify({ token: connection.token, ...body })}\n`))
47
- stream.on('data', (chunk) => {
48
- buffer += chunk.toString('utf8')
49
- const newline = buffer.indexOf('\n')
50
- if (newline < 0) return
51
- try {
52
- const reply = JSON.parse(buffer.slice(0, newline)) as { result?: T; error?: { code?: string; message?: string } | string }
53
- if (reply.error) {
54
- const error = typeof reply.error === 'string' ? { message: reply.error } : reply.error
55
- finish(() => reject(new SocketError(error.code ?? 'error', error.message ?? `${what} failed.`)))
56
- } else finish(() => resolve(reply.result as T))
57
- } catch {
58
- finish(() => reject(new SocketError('invalid_reply', 'The harness sent an unreadable reply.')))
59
- }
60
- })
61
- stream.on('error', (error) => finish(() => reject(new SocketError('unavailable', `The harness is not reachable: ${error.message}.`))))
62
- stream.on('close', () => finish(() => reject(new SocketError('unavailable', 'The harness closed the connection.'))))
63
- })
64
- }
65
-
66
- /** A memory, Wiki, recall, or connected-app call made on behalf of the session that owns the token. */
67
- export function socketCall<T = unknown>(connection: SocketConnection, call: string, params: Record<string, unknown> = {}, timeoutMs = 120_000, control?: string): Promise<T> {
68
- return request<T>(connection, { call, params, ...(control ? { control } : {}) }, call, timeoutMs)
69
- }
70
-
71
- /** Telemetry and decisions from the native `pi` process. Approvals may wait on a person, so the default wait is long. */
72
- export function terminalCall<T = Record<string, unknown>>(event: string, data: Record<string, unknown> = {}, timeoutMs = 600_000): Promise<T> {
73
- return request<T>(connectionFromEnv(), { event, data }, event, timeoutMs)
74
- }