@xingular/harness 0.1.6 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (593) hide show
  1. package/CHANGELOG.md +107 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE.md +60 -0
  4. package/README.md +265 -71
  5. package/THIRD_PARTY_LICENSES.md +942 -0
  6. package/dist/cli.js +14842 -9445
  7. package/dist/sdk/accounts/accounts.d.ts +165 -0
  8. package/dist/sdk/accounts/accounts.js +730 -0
  9. package/dist/sdk/accounts/choices.d.ts +23 -0
  10. package/dist/sdk/accounts/choices.js +62 -0
  11. package/dist/sdk/accounts/env.d.ts +78 -0
  12. package/dist/sdk/accounts/env.js +294 -0
  13. package/dist/sdk/accounts/secrets.d.ts +16 -0
  14. package/dist/sdk/accounts/secrets.js +40 -0
  15. package/dist/sdk/accounts/store.d.ts +114 -0
  16. package/dist/sdk/accounts/store.js +255 -0
  17. package/dist/sdk/browser/config.d.ts +16 -0
  18. package/dist/sdk/browser/config.js +22 -0
  19. package/dist/sdk/browser/diagnostics.d.ts +4 -0
  20. package/dist/sdk/browser/diagnostics.js +38 -0
  21. package/dist/sdk/browser/index.d.ts +17 -0
  22. package/dist/sdk/browser/index.js +65 -0
  23. package/dist/sdk/browser/network.d.ts +10 -0
  24. package/dist/sdk/browser/network.js +59 -0
  25. package/dist/sdk/browser/session.d.ts +84 -0
  26. package/dist/sdk/browser/session.js +192 -0
  27. package/dist/sdk/browser/tools.d.ts +8 -0
  28. package/dist/sdk/browser/tools.js +329 -0
  29. package/dist/sdk/capabilities/api.d.ts +22 -0
  30. package/dist/sdk/capabilities/api.js +54 -0
  31. package/dist/sdk/capabilities/runSnapshot.d.ts +18 -0
  32. package/dist/sdk/capabilities/runSnapshot.js +47 -0
  33. package/dist/sdk/capabilities/types.d.ts +29 -0
  34. package/dist/sdk/capabilities/types.js +1 -0
  35. package/dist/sdk/cli.d.ts +2 -0
  36. package/dist/sdk/cli.js +142 -0
  37. package/dist/sdk/core/bus.d.ts +23 -0
  38. package/dist/sdk/core/bus.js +76 -0
  39. package/dist/sdk/core/caller.d.ts +22 -0
  40. package/dist/sdk/core/caller.js +16 -0
  41. package/dist/sdk/core/changes.d.ts +15 -0
  42. package/dist/sdk/core/changes.js +15 -0
  43. package/dist/sdk/core/effort.d.ts +2 -0
  44. package/dist/sdk/core/effort.js +1 -0
  45. package/dist/sdk/core/env.d.ts +18 -0
  46. package/dist/sdk/core/env.js +8 -0
  47. package/dist/sdk/core/errors.d.ts +15 -0
  48. package/dist/sdk/core/errors.js +24 -0
  49. package/dist/sdk/core/frontmatter.d.ts +12 -0
  50. package/dist/sdk/core/frontmatter.js +50 -0
  51. package/dist/sdk/core/fs.d.ts +18 -0
  52. package/dist/sdk/core/fs.js +106 -0
  53. package/dist/sdk/core/index.d.ts +24 -0
  54. package/dist/sdk/core/index.js +187 -0
  55. package/dist/sdk/core/path.d.ts +7 -0
  56. package/dist/sdk/core/path.js +79 -0
  57. package/dist/sdk/core/projects.d.ts +18 -0
  58. package/dist/sdk/core/projects.js +67 -0
  59. package/dist/sdk/core/secrets.d.ts +2 -0
  60. package/dist/sdk/core/secrets.js +5 -0
  61. package/dist/sdk/core/text.d.ts +7 -0
  62. package/dist/sdk/core/text.js +40 -0
  63. package/dist/sdk/doctor/checks.d.ts +5 -0
  64. package/dist/sdk/doctor/checks.js +208 -0
  65. package/dist/sdk/doctor/probe.d.ts +4 -0
  66. package/dist/sdk/doctor/probe.js +92 -0
  67. package/dist/sdk/doctor/service.d.ts +23 -0
  68. package/dist/sdk/doctor/service.js +144 -0
  69. package/dist/sdk/doctor/types.d.ts +141 -0
  70. package/dist/sdk/doctor/types.js +29 -0
  71. package/dist/sdk/harness.d.ts +133 -0
  72. package/dist/sdk/harness.js +299 -0
  73. package/dist/sdk/history/lessonPrompt.d.ts +2 -0
  74. package/dist/sdk/history/lessonPrompt.js +15 -0
  75. package/dist/sdk/history/lessons.d.ts +52 -0
  76. package/dist/sdk/history/lessons.js +173 -0
  77. package/dist/sdk/history/recall.d.ts +68 -0
  78. package/dist/sdk/history/recall.js +199 -0
  79. package/dist/sdk/history/trajectory.d.ts +7 -0
  80. package/dist/sdk/history/trajectory.js +216 -0
  81. package/dist/sdk/hub/catalog.json +123 -0
  82. package/dist/sdk/hub/cli.d.ts +7 -0
  83. package/dist/sdk/hub/cli.js +81 -0
  84. package/dist/sdk/hub/hub.d.ts +74 -0
  85. package/dist/sdk/hub/hub.js +474 -0
  86. package/dist/sdk/hub/schema.d.ts +280 -0
  87. package/dist/sdk/hub/schema.js +78 -0
  88. package/dist/sdk/index.d.ts +63 -0
  89. package/dist/sdk/index.js +48 -0
  90. package/dist/sdk/mcp/connections.d.ts +83 -0
  91. package/dist/sdk/mcp/connections.js +669 -0
  92. package/dist/sdk/mcp/manager.d.ts +26 -0
  93. package/dist/sdk/mcp/manager.js +124 -0
  94. package/dist/sdk/mcp/oauth.d.ts +35 -0
  95. package/dist/sdk/mcp/oauth.js +171 -0
  96. package/dist/sdk/mcp/scopeMigration.d.ts +19 -0
  97. package/dist/sdk/mcp/scopeMigration.js +198 -0
  98. package/dist/sdk/mcp/service.d.ts +160 -0
  99. package/dist/sdk/mcp/service.js +510 -0
  100. package/dist/sdk/mcp/types.d.ts +131 -0
  101. package/dist/sdk/mcp/types.js +49 -0
  102. package/dist/sdk/pi/runtime.d.ts +13 -0
  103. package/dist/sdk/pi/runtime.js +31 -0
  104. package/dist/sdk/plugins/api.d.ts +66 -0
  105. package/dist/sdk/plugins/api.js +155 -0
  106. package/dist/sdk/plugins/attachments.d.ts +46 -0
  107. package/dist/sdk/plugins/attachments.js +111 -0
  108. package/dist/sdk/plugins/builtin.d.ts +6 -0
  109. package/dist/sdk/plugins/builtin.js +68 -0
  110. package/dist/sdk/plugins/catalogue.d.ts +29 -0
  111. package/dist/sdk/plugins/catalogue.js +196 -0
  112. package/dist/sdk/plugins/cli.d.ts +13 -0
  113. package/dist/sdk/plugins/cli.js +187 -0
  114. package/dist/sdk/plugins/discover.d.ts +42 -0
  115. package/dist/sdk/plugins/discover.js +115 -0
  116. package/dist/sdk/plugins/firstParty.d.ts +50 -0
  117. package/dist/sdk/plugins/firstParty.js +113 -0
  118. package/dist/sdk/plugins/hooks.d.ts +94 -0
  119. package/dist/sdk/plugins/hooks.js +162 -0
  120. package/dist/sdk/plugins/identity.d.ts +19 -0
  121. package/dist/sdk/plugins/identity.js +48 -0
  122. package/dist/sdk/plugins/install.d.ts +20 -0
  123. package/dist/sdk/plugins/install.js +110 -0
  124. package/dist/sdk/plugins/inventory.d.ts +22 -0
  125. package/dist/sdk/plugins/inventory.js +110 -0
  126. package/dist/sdk/plugins/manifest.d.ts +13 -0
  127. package/dist/sdk/plugins/manifest.js +56 -0
  128. package/dist/sdk/plugins/plugins.d.ts +104 -0
  129. package/dist/sdk/plugins/plugins.js +164 -0
  130. package/dist/sdk/plugins/runtime.d.ts +9 -0
  131. package/dist/sdk/plugins/runtime.js +95 -0
  132. package/dist/sdk/plugins/trust.d.ts +44 -0
  133. package/dist/sdk/plugins/trust.js +120 -0
  134. package/dist/sdk/plugins/types.d.ts +159 -0
  135. package/dist/sdk/plugins/types.js +7 -0
  136. package/dist/sdk/prompt/compile.d.ts +174 -0
  137. package/dist/sdk/prompt/compile.js +396 -0
  138. package/dist/sdk/refine/cli.d.ts +4 -0
  139. package/dist/sdk/refine/cli.js +186 -0
  140. package/dist/sdk/refine/demo.d.ts +21 -0
  141. package/dist/sdk/refine/demo.js +114 -0
  142. package/dist/sdk/refine/evidence.d.ts +55 -0
  143. package/dist/sdk/refine/evidence.js +330 -0
  144. package/dist/sdk/refine/host.d.ts +51 -0
  145. package/dist/sdk/refine/host.js +76 -0
  146. package/dist/sdk/refine/ledger.d.ts +48 -0
  147. package/dist/sdk/refine/ledger.js +76 -0
  148. package/dist/sdk/refine/library.d.ts +55 -0
  149. package/dist/sdk/refine/library.js +177 -0
  150. package/dist/sdk/refine/pi.d.ts +72 -0
  151. package/dist/sdk/refine/pi.js +248 -0
  152. package/dist/sdk/refine/prompts.d.ts +45 -0
  153. package/dist/sdk/refine/prompts.js +390 -0
  154. package/dist/sdk/refine/recursion.d.ts +113 -0
  155. package/dist/sdk/refine/recursion.js +258 -0
  156. package/dist/sdk/refine/runner.d.ts +81 -0
  157. package/dist/sdk/refine/runner.js +150 -0
  158. package/dist/sdk/refine/selection.d.ts +57 -0
  159. package/dist/sdk/refine/selection.js +251 -0
  160. package/dist/sdk/refine/service.d.ts +84 -0
  161. package/dist/sdk/refine/service.js +165 -0
  162. package/dist/sdk/refine/suite.d.ts +67 -0
  163. package/dist/sdk/refine/suite.js +174 -0
  164. package/dist/sdk/refine/trajectory.d.ts +9 -0
  165. package/dist/sdk/refine/trajectory.js +68 -0
  166. package/dist/sdk/refine/types.d.ts +77 -0
  167. package/dist/sdk/refine/types.js +10 -0
  168. package/dist/sdk/server/methods.d.ts +3 -0
  169. package/dist/sdk/server/methods.js +370 -0
  170. package/dist/sdk/server/remote.d.ts +19 -0
  171. package/dist/sdk/server/remote.js +84 -0
  172. package/dist/sdk/server/rpc.d.ts +20 -0
  173. package/dist/sdk/server/rpc.js +102 -0
  174. package/dist/sdk/server/serve.d.ts +10 -0
  175. package/dist/sdk/server/serve.js +18 -0
  176. package/dist/sdk/sessions/approvals.d.ts +47 -0
  177. package/dist/sdk/sessions/approvals.js +119 -0
  178. package/dist/sdk/sessions/continuation.d.ts +48 -0
  179. package/dist/sdk/sessions/continuation.js +85 -0
  180. package/dist/sdk/sessions/contracts.d.ts +534 -0
  181. package/dist/sdk/sessions/contracts.js +299 -0
  182. package/dist/sdk/sessions/extensionUi.d.ts +19 -0
  183. package/dist/sdk/sessions/extensionUi.js +64 -0
  184. package/dist/sdk/sessions/history.d.ts +16 -0
  185. package/dist/sdk/sessions/history.js +68 -0
  186. package/dist/sdk/sessions/lineageJoin.d.ts +2 -0
  187. package/dist/sdk/sessions/lineageJoin.js +61 -0
  188. package/dist/sdk/sessions/planMode.d.ts +36 -0
  189. package/dist/sdk/sessions/planMode.js +84 -0
  190. package/dist/sdk/sessions/policy.d.ts +43 -0
  191. package/dist/sdk/sessions/policy.js +1 -0
  192. package/dist/sdk/sessions/pricing.d.ts +34 -0
  193. package/dist/sdk/sessions/pricing.js +40 -0
  194. package/dist/sdk/sessions/reasoningSummaries.d.ts +11 -0
  195. package/dist/sdk/sessions/reasoningSummaries.js +61 -0
  196. package/dist/sdk/sessions/registry.d.ts +102 -0
  197. package/dist/sdk/sessions/registry.js +383 -0
  198. package/dist/sdk/sessions/runIndex.d.ts +21 -0
  199. package/dist/sdk/sessions/runIndex.js +65 -0
  200. package/dist/sdk/sessions/runStore.d.ts +66 -0
  201. package/dist/sdk/sessions/runStore.js +335 -0
  202. package/dist/sdk/sessions/runner.d.ts +213 -0
  203. package/dist/sdk/sessions/runner.js +589 -0
  204. package/dist/sdk/sessions/sessions.d.ts +140 -0
  205. package/dist/sdk/sessions/sessions.js +394 -0
  206. package/dist/sdk/sessions/subagentService.d.ts +41 -0
  207. package/dist/sdk/sessions/subagentService.js +247 -0
  208. package/dist/sdk/sessions/subagents.d.ts +50 -0
  209. package/dist/sdk/sessions/subagents.js +68 -0
  210. package/dist/sdk/terminal/accountsMenu.d.ts +46 -0
  211. package/dist/sdk/terminal/accountsMenu.js +392 -0
  212. package/dist/sdk/terminal/cli.d.ts +20 -0
  213. package/dist/sdk/terminal/cli.js +121 -0
  214. package/dist/sdk/terminal/client.d.ts +15 -0
  215. package/dist/sdk/terminal/client.js +126 -0
  216. package/dist/sdk/terminal/control.d.ts +4 -0
  217. package/dist/sdk/terminal/control.js +25 -0
  218. package/dist/sdk/terminal/controller.d.ts +72 -0
  219. package/dist/sdk/terminal/controller.js +351 -0
  220. package/dist/sdk/terminal/hubMenu.d.ts +10 -0
  221. package/dist/sdk/terminal/hubMenu.js +34 -0
  222. package/dist/sdk/terminal/launch.d.ts +5 -0
  223. package/dist/sdk/terminal/launch.js +27 -0
  224. package/dist/sdk/terminal/logs.d.ts +14 -0
  225. package/dist/sdk/terminal/logs.js +59 -0
  226. package/dist/sdk/terminal/piExtension.d.ts +6 -0
  227. package/dist/sdk/terminal/piExtension.js +392 -0
  228. package/dist/sdk/terminal/pluginMenu.d.ts +34 -0
  229. package/dist/sdk/terminal/pluginMenu.js +101 -0
  230. package/dist/sdk/terminal/socket.d.ts +70 -0
  231. package/dist/sdk/terminal/socket.js +256 -0
  232. package/dist/sdk/terminal/standalone.d.ts +18 -0
  233. package/dist/sdk/terminal/standalone.js +146 -0
  234. package/dist/sdk/terminal/terminals.d.ts +176 -0
  235. package/dist/sdk/terminal/terminals.js +767 -0
  236. package/dist/sdk/terminal/trajectory.d.ts +10 -0
  237. package/dist/sdk/terminal/trajectory.js +30 -0
  238. package/dist/sdk/terminal/tui/chrome.d.ts +64 -0
  239. package/dist/sdk/terminal/tui/chrome.js +169 -0
  240. package/dist/sdk/terminal/tui/clipboardFiles.d.ts +11 -0
  241. package/dist/sdk/terminal/tui/clipboardFiles.js +74 -0
  242. package/dist/sdk/terminal/tui/commandPages.d.ts +7 -0
  243. package/dist/sdk/terminal/tui/commandPages.js +63 -0
  244. package/dist/sdk/terminal/tui/commands.d.ts +42 -0
  245. package/dist/sdk/terminal/tui/commands.js +276 -0
  246. package/dist/sdk/terminal/tui/dialogGeometry.d.ts +27 -0
  247. package/dist/sdk/terminal/tui/dialogGeometry.js +50 -0
  248. package/dist/sdk/terminal/tui/dialogs.d.ts +75 -0
  249. package/dist/sdk/terminal/tui/dialogs.js +363 -0
  250. package/dist/sdk/terminal/tui/keybindings.d.ts +11 -0
  251. package/dist/sdk/terminal/tui/keybindings.js +49 -0
  252. package/dist/sdk/terminal/tui/list.d.ts +73 -0
  253. package/dist/sdk/terminal/tui/list.js +196 -0
  254. package/dist/sdk/terminal/tui/modeChoices.d.ts +42 -0
  255. package/dist/sdk/terminal/tui/modeChoices.js +70 -0
  256. package/dist/sdk/terminal/tui/modelPicker.d.ts +55 -0
  257. package/dist/sdk/terminal/tui/modelPicker.js +155 -0
  258. package/dist/sdk/terminal/tui/mouse.d.ts +3 -0
  259. package/dist/sdk/terminal/tui/mouse.js +3 -0
  260. package/dist/sdk/terminal/tui/page.d.ts +14 -0
  261. package/dist/sdk/terminal/tui/page.js +1 -0
  262. package/dist/sdk/terminal/tui/pageOverlay.d.ts +27 -0
  263. package/dist/sdk/terminal/tui/pageOverlay.js +145 -0
  264. package/dist/sdk/terminal/tui/pages/accountsPage.d.ts +54 -0
  265. package/dist/sdk/terminal/tui/pages/accountsPage.js +181 -0
  266. package/dist/sdk/terminal/tui/pages/componentsPage.d.ts +47 -0
  267. package/dist/sdk/terminal/tui/pages/componentsPage.js +119 -0
  268. package/dist/sdk/terminal/tui/pages/doctorPage.d.ts +37 -0
  269. package/dist/sdk/terminal/tui/pages/doctorPage.js +145 -0
  270. package/dist/sdk/terminal/tui/pages/hubPage.d.ts +39 -0
  271. package/dist/sdk/terminal/tui/pages/hubPage.js +128 -0
  272. package/dist/sdk/terminal/tui/pages/logPage.d.ts +38 -0
  273. package/dist/sdk/terminal/tui/pages/logPage.js +189 -0
  274. package/dist/sdk/terminal/tui/pages/permissionsPage.d.ts +44 -0
  275. package/dist/sdk/terminal/tui/pages/permissionsPage.js +124 -0
  276. package/dist/sdk/terminal/tui/pages/pluginsPage.d.ts +57 -0
  277. package/dist/sdk/terminal/tui/pages/pluginsPage.js +243 -0
  278. package/dist/sdk/terminal/tui/pages/settingsPage.d.ts +55 -0
  279. package/dist/sdk/terminal/tui/pages/settingsPage.js +88 -0
  280. package/dist/sdk/terminal/tui/pages/trajectoryPage.d.ts +58 -0
  281. package/dist/sdk/terminal/tui/pages/trajectoryPage.js +377 -0
  282. package/dist/sdk/terminal/tui/piAdapter.d.ts +18 -0
  283. package/dist/sdk/terminal/tui/piAdapter.js +48 -0
  284. package/dist/sdk/terminal/tui/planMode.d.ts +2 -0
  285. package/dist/sdk/terminal/tui/planMode.js +2 -0
  286. package/dist/sdk/terminal/tui/questionPicker.d.ts +20 -0
  287. package/dist/sdk/terminal/tui/questionPicker.js +150 -0
  288. package/dist/sdk/terminal/tui/questions.d.ts +19 -0
  289. package/dist/sdk/terminal/tui/questions.js +42 -0
  290. package/dist/sdk/terminal/tui/runtime.d.ts +114 -0
  291. package/dist/sdk/terminal/tui/runtime.js +441 -0
  292. package/dist/sdk/terminal/tui/search.d.ts +22 -0
  293. package/dist/sdk/terminal/tui/search.js +60 -0
  294. package/dist/sdk/terminal/tui/selection.d.ts +16 -0
  295. package/dist/sdk/terminal/tui/selection.js +16 -0
  296. package/dist/sdk/terminal/tui/sessionUi.d.ts +3 -0
  297. package/dist/sdk/terminal/tui/sessionUi.js +30 -0
  298. package/dist/sdk/terminal/tui/settingsModel.d.ts +12 -0
  299. package/dist/sdk/terminal/tui/settingsModel.js +84 -0
  300. package/dist/sdk/terminal/tui/sideQuestion.d.ts +53 -0
  301. package/dist/sdk/terminal/tui/sideQuestion.js +197 -0
  302. package/dist/sdk/terminal/tui/skillInvocation.d.ts +9 -0
  303. package/dist/sdk/terminal/tui/skillInvocation.js +43 -0
  304. package/dist/sdk/terminal/tui/status.d.ts +18 -0
  305. package/dist/sdk/terminal/tui/status.js +67 -0
  306. package/dist/sdk/terminal/tui/theme.d.ts +45 -0
  307. package/dist/sdk/terminal/tui/theme.js +176 -0
  308. package/dist/sdk/terminal/tui/treeModel.d.ts +79 -0
  309. package/dist/sdk/terminal/tui/treeModel.js +483 -0
  310. package/dist/sdk/terminal/tui/treePicker.d.ts +49 -0
  311. package/dist/sdk/terminal/tui/treePicker.js +251 -0
  312. package/dist/sdk/terminal/tui/ui.d.ts +47 -0
  313. package/dist/sdk/terminal/tui/ui.js +148 -0
  314. package/dist/sdk/terminal/tui/workingStatus.d.ts +9 -0
  315. package/dist/sdk/terminal/tui/workingStatus.js +229 -0
  316. package/dist/sdk/tools/askUser.d.ts +6 -0
  317. package/dist/sdk/tools/askUser.js +74 -0
  318. package/dist/sdk/tools/checklist.d.ts +9 -0
  319. package/dist/sdk/tools/checklist.js +54 -0
  320. package/dist/sdk/tools/definitions.d.ts +30 -0
  321. package/dist/sdk/tools/definitions.js +117 -0
  322. package/dist/sdk/tools/dispatch.d.ts +16 -0
  323. package/dist/sdk/tools/dispatch.js +67 -0
  324. package/dist/sdk/tools/harnessTools.d.ts +6 -0
  325. package/dist/sdk/tools/harnessTools.js +20 -0
  326. package/dist/sdk/tools/sessionName.d.ts +7 -0
  327. package/dist/sdk/tools/sessionName.js +31 -0
  328. package/dist/sdk/tools/spawnSubagent.d.ts +4 -0
  329. package/dist/sdk/tools/spawnSubagent.js +49 -0
  330. package/dist/sdk/tools/types.d.ts +48 -0
  331. package/dist/sdk/tools/types.js +1 -0
  332. package/dist/sdk/variant/components.d.ts +34 -0
  333. package/dist/sdk/variant/components.js +230 -0
  334. package/dist/sdk/variant/materialise.d.ts +66 -0
  335. package/dist/sdk/variant/materialise.js +81 -0
  336. package/dist/sdk/variant/migrate.d.ts +4 -0
  337. package/dist/sdk/variant/migrate.js +41 -0
  338. package/dist/sdk/variant/seed.d.ts +20 -0
  339. package/dist/sdk/variant/seed.js +116 -0
  340. package/dist/sdk/variant/store.d.ts +82 -0
  341. package/dist/sdk/variant/store.js +151 -0
  342. package/dist/sdk/variant/surface.d.ts +56 -0
  343. package/dist/sdk/variant/surface.js +81 -0
  344. package/dist/sdk/variant/trust.d.ts +27 -0
  345. package/dist/sdk/variant/trust.js +64 -0
  346. package/dist/sdk/variant/variant.d.ts +71 -0
  347. package/dist/sdk/variant/variant.js +331 -0
  348. package/dist/sdk/web/markdown.d.ts +10 -0
  349. package/dist/sdk/web/markdown.js +66 -0
  350. package/dist/sdk/web/safeRequest.d.ts +34 -0
  351. package/dist/sdk/web/safeRequest.js +175 -0
  352. package/dist/sdk/web/search.d.ts +53 -0
  353. package/dist/sdk/web/search.js +168 -0
  354. package/dist/sdk/web/text.d.ts +2 -0
  355. package/dist/sdk/web/text.js +7 -0
  356. package/dist/sdk/web/tools.d.ts +22 -0
  357. package/dist/sdk/web/tools.js +195 -0
  358. package/dist/sdk/web/turndown-plugin-gfm.d.ts +4 -0
  359. package/dist/sdk/wiki/notes.d.ts +68 -0
  360. package/dist/sdk/wiki/notes.js +297 -0
  361. package/dist/sdk/world/actions.d.ts +23 -0
  362. package/dist/sdk/world/actions.js +31 -0
  363. package/dist/sdk/world/cli.d.ts +12 -0
  364. package/dist/sdk/world/cli.js +166 -0
  365. package/dist/sdk/world/images.d.ts +20 -0
  366. package/dist/sdk/world/images.js +48 -0
  367. package/dist/sdk/world/untrusted.d.ts +12 -0
  368. package/dist/sdk/world/untrusted.js +20 -0
  369. package/dist/sdk/world/world.d.ts +65 -0
  370. package/dist/sdk/world/world.js +80 -0
  371. package/dist/terminal-opentui.js +13612 -0
  372. package/dist/terminal-pi.js +1170 -62
  373. package/docs/README.md +34 -0
  374. package/docs/architecture/00-overview.md +159 -0
  375. package/docs/architecture/01-extension-points.md +78 -0
  376. package/docs/architecture/02-sessions-and-runs.md +146 -0
  377. package/docs/architecture/03-variants.md +95 -0
  378. package/docs/architecture/04-prompt.md +102 -0
  379. package/docs/architecture/05-refinement.md +107 -0
  380. package/docs/architecture/06-plugins-and-capabilities.md +93 -0
  381. package/docs/architecture/07-tools-and-gate.md +88 -0
  382. package/docs/architecture/08-memory-and-history.md +94 -0
  383. package/docs/architecture/09-accounts-and-connectors.md +90 -0
  384. package/docs/architecture/10-server-protocol.md +84 -0
  385. package/docs/architecture/11-terminal.md +81 -0
  386. package/docs/architecture/12-storage.md +61 -0
  387. package/docs/architecture/13-world-tools.md +23 -0
  388. package/docs/architecture/README.md +114 -0
  389. package/docs/architecture/proposals/PROP-0001-reporting-section.md +106 -0
  390. package/docs/architecture/proposals/PROP-0002-retain-rollout-workspaces.md +104 -0
  391. package/docs/architecture/proposals/PROP-0003-executor-settings.md +81 -0
  392. package/docs/architecture/proposals/PROP-0004-flexible-reporting-guidance.md +71 -0
  393. package/docs/architecture/proposals/PROP-0005-xharness-cli-name.md +78 -0
  394. package/docs/architecture/proposals/PROP-0006-run-checklist.md +68 -0
  395. package/docs/architecture/proposals/PROP-0007-run-continuation.md +80 -0
  396. package/docs/architecture/proposals/PROP-0008-lessons-from-runs.md +80 -0
  397. package/docs/architecture/proposals/PROP-0009-foundation-and-variants.md +78 -0
  398. package/docs/architecture/proposals/PROP-0010-session-names.md +73 -0
  399. package/docs/architecture/proposals/PROP-0011-doctor.md +63 -0
  400. package/docs/architecture/proposals/PROP-0012-release-baseline.md +56 -0
  401. package/docs/architecture/proposals/README.md +76 -0
  402. package/docs/decisions/ADR-0001-owned-terminal.md +87 -0
  403. package/docs/decisions/ADR-0002-native-subagent-lifecycle.md +49 -0
  404. package/docs/decisions/ADR-0003-shared-asynchronous-subagents.md +70 -0
  405. package/docs/decisions/ADR-0004-fullscreen-terminal-layout.md +50 -0
  406. package/docs/decisions/ADR-0005-app-provided-oauth-clients.md +54 -0
  407. package/docs/decisions/ADR-0006-opentui-only-terminal.md +47 -0
  408. package/docs/decisions/ADR-0007-reporting-section.md +33 -0
  409. package/docs/decisions/ADR-0008-flexible-reporting-guidance.md +38 -0
  410. package/docs/decisions/ADR-0009-xharness-command.md +38 -0
  411. package/docs/decisions/ADR-0010-lessons-in-the-wiki.md +31 -0
  412. package/docs/decisions/ADR-0011-foundation-and-variants.md +28 -0
  413. package/docs/decisions/ADR-0012-native-session-names.md +34 -0
  414. package/docs/decisions/ADR-0013-doctor.md +27 -0
  415. package/docs/decisions/ADR-0014-public-release-baseline.md +21 -0
  416. package/docs/doctor.md +74 -0
  417. package/docs/experiments/EXP-0001-terminal-input-latency/plan.md +81 -0
  418. package/docs/experiments/EXP-0001-terminal-input-latency/results.md +46 -0
  419. package/docs/experiments/EXP-0002-opentui-typing-latency/plan.md +70 -0
  420. package/docs/experiments/EXP-0002-opentui-typing-latency/results.md +92 -0
  421. package/docs/features/README.md +20 -0
  422. package/docs/features/automations/README.md +41 -0
  423. package/docs/features/cores/README.md +39 -0
  424. package/docs/features/google-harness2/README.md +52 -0
  425. package/docs/features/integrations/README.md +40 -0
  426. package/docs/features/interfaces/README.md +29 -0
  427. package/docs/features/memory/README.md +28 -0
  428. package/docs/releases/1.0.0.md +40 -0
  429. package/docs/releases/README.md +36 -0
  430. package/docs/study/00-index.md +78 -0
  431. package/docs/study/arms/00-matrix.md +20 -0
  432. package/docs/study/arms/01-system-prompt.md +211 -0
  433. package/docs/study/arms/02-tools.md +79 -0
  434. package/docs/study/arms/03-subagents.md +90 -0
  435. package/docs/study/arms/04-skills.md +75 -0
  436. package/docs/study/arms/05-context-management.md +90 -0
  437. package/docs/study/arms/06-memory.md +90 -0
  438. package/docs/study/arms/07-governance.md +71 -0
  439. package/docs/study/arms/08-execution.md +69 -0
  440. package/docs/study/arms/09-observability.md +60 -0
  441. package/docs/study/arms/10-refinement.md +110 -0
  442. package/docs/study/btw-comparison.md +37 -0
  443. package/docs/study/feature-gap-review.md +42 -0
  444. package/docs/study/insights.md +123 -0
  445. package/docs/study/roadmap.md +72 -0
  446. package/docs/study/sources/claude-code.md +44 -0
  447. package/docs/study/sources/deepseek-harness.md +102 -0
  448. package/docs/study/sources/harness2.md +50 -0
  449. package/docs/study/sources/kimi-cli.md +42 -0
  450. package/docs/study/sources/omp.md +93 -0
  451. package/docs/study/sources/opencode.md +43 -0
  452. package/docs/study/sources/openhands.md +46 -0
  453. package/docs/study/sources/smolagents.md +40 -0
  454. package/docs/study/sources/swe-agent.md +34 -0
  455. package/docs/system-prompt-design.md +196 -0
  456. package/docs/terminal-tui.md +671 -0
  457. package/package.json +48 -12
  458. package/src/accounts/accounts.test.ts +0 -223
  459. package/src/accounts/accounts.ts +0 -522
  460. package/src/accounts/env.test.ts +0 -95
  461. package/src/accounts/env.ts +0 -338
  462. package/src/accounts/secrets.ts +0 -50
  463. package/src/accounts/store.ts +0 -338
  464. package/src/capabilities/api.ts +0 -75
  465. package/src/capabilities/runSnapshot.ts +0 -59
  466. package/src/capabilities/types.ts +0 -34
  467. package/src/cli.ts +0 -114
  468. package/src/core/bus.ts +0 -34
  469. package/src/core/changes.ts +0 -33
  470. package/src/core/env.ts +0 -27
  471. package/src/core/errors.ts +0 -32
  472. package/src/core/frontmatter.ts +0 -47
  473. package/src/core/fs.test.ts +0 -38
  474. package/src/core/fs.ts +0 -92
  475. package/src/core/index.ts +0 -193
  476. package/src/core/path.test.ts +0 -14
  477. package/src/core/path.ts +0 -79
  478. package/src/core/projects.ts +0 -90
  479. package/src/core/text.ts +0 -39
  480. package/src/harness.ts +0 -299
  481. package/src/index.ts +0 -70
  482. package/src/mcp/connections.ts +0 -614
  483. package/src/mcp/manager.ts +0 -130
  484. package/src/mcp/oauth.ts +0 -195
  485. package/src/mcp/scopeMigration.test.ts +0 -79
  486. package/src/mcp/scopeMigration.ts +0 -204
  487. package/src/mcp/service.test.ts +0 -376
  488. package/src/mcp/service.ts +0 -549
  489. package/src/mcp/types.ts +0 -108
  490. package/src/memory/api.test.ts +0 -82
  491. package/src/memory/api.ts +0 -289
  492. package/src/memory/blocks.test.ts +0 -78
  493. package/src/memory/blocks.ts +0 -406
  494. package/src/memory/caller.ts +0 -57
  495. package/src/memory/dispatch.ts +0 -59
  496. package/src/memory/facts.test.ts +0 -41
  497. package/src/memory/facts.ts +0 -248
  498. package/src/memory/graph.ts +0 -103
  499. package/src/memory/health.test.ts +0 -130
  500. package/src/memory/health.ts +0 -74
  501. package/src/memory/maintainer.ts +0 -272
  502. package/src/memory/maintenance.test.ts +0 -176
  503. package/src/memory/maintenance.ts +0 -330
  504. package/src/memory/migrate.ts +0 -79
  505. package/src/memory/operations.ts +0 -138
  506. package/src/memory/proposals.test.ts +0 -168
  507. package/src/memory/proposals.ts +0 -576
  508. package/src/memory/recall.test.ts +0 -104
  509. package/src/memory/recall.ts +0 -271
  510. package/src/memory/references.ts +0 -77
  511. package/src/memory/runContext.ts +0 -93
  512. package/src/memory/secrets.ts +0 -6
  513. package/src/memory/store.test.ts +0 -66
  514. package/src/memory/store.ts +0 -385
  515. package/src/memory/wiki.test.ts +0 -47
  516. package/src/memory/wiki.ts +0 -422
  517. package/src/memory/wikiIndex.test.ts +0 -88
  518. package/src/memory/wikiIndex.ts +0 -116
  519. package/src/plugins/api.ts +0 -181
  520. package/src/plugins/attachments.test.ts +0 -84
  521. package/src/plugins/attachments.ts +0 -141
  522. package/src/plugins/builtin.ts +0 -82
  523. package/src/plugins/catalogue.test.ts +0 -254
  524. package/src/plugins/catalogue.ts +0 -251
  525. package/src/plugins/cli.ts +0 -184
  526. package/src/plugins/discover.ts +0 -151
  527. package/src/plugins/firstParty.test.ts +0 -143
  528. package/src/plugins/firstParty.ts +0 -129
  529. package/src/plugins/hooks.test.ts +0 -250
  530. package/src/plugins/hooks.ts +0 -239
  531. package/src/plugins/identity.ts +0 -37
  532. package/src/plugins/install.test.ts +0 -107
  533. package/src/plugins/install.ts +0 -106
  534. package/src/plugins/inventory.ts +0 -123
  535. package/src/plugins/manifest.ts +0 -76
  536. package/src/plugins/plugins.test.ts +0 -205
  537. package/src/plugins/plugins.ts +0 -189
  538. package/src/plugins/proposal.ts +0 -121
  539. package/src/plugins/runtime.test.ts +0 -40
  540. package/src/plugins/runtime.ts +0 -82
  541. package/src/plugins/trust.ts +0 -142
  542. package/src/plugins/types.ts +0 -149
  543. package/src/prompt/compile.test.ts +0 -261
  544. package/src/prompt/compile.ts +0 -732
  545. package/src/server/methods.ts +0 -314
  546. package/src/server/remote.ts +0 -77
  547. package/src/server/rpc.ts +0 -116
  548. package/src/server/serve.ts +0 -28
  549. package/src/server/server.test.ts +0 -174
  550. package/src/sessions/approvals.ts +0 -118
  551. package/src/sessions/contracts.ts +0 -310
  552. package/src/sessions/conversation.test.ts +0 -150
  553. package/src/sessions/extensionSession.test.ts +0 -74
  554. package/src/sessions/extensionUi.test.ts +0 -65
  555. package/src/sessions/extensionUi.ts +0 -102
  556. package/src/sessions/history.ts +0 -51
  557. package/src/sessions/lineageJoin.ts +0 -75
  558. package/src/sessions/policy.ts +0 -32
  559. package/src/sessions/pricing.ts +0 -60
  560. package/src/sessions/reasoningSummaries.ts +0 -59
  561. package/src/sessions/registry.ts +0 -294
  562. package/src/sessions/runIndex.ts +0 -99
  563. package/src/sessions/runStore.test.ts +0 -152
  564. package/src/sessions/runStore.ts +0 -332
  565. package/src/sessions/runner.ts +0 -569
  566. package/src/sessions/runtimeResources.test.ts +0 -61
  567. package/src/sessions/sessions.test.ts +0 -455
  568. package/src/sessions/sessions.ts +0 -295
  569. package/src/skills/registry.test.ts +0 -104
  570. package/src/skills/registry.ts +0 -407
  571. package/src/terminal/cli.ts +0 -149
  572. package/src/terminal/client.ts +0 -74
  573. package/src/terminal/controller.ts +0 -227
  574. package/src/terminal/launch.test.ts +0 -34
  575. package/src/terminal/launch.ts +0 -88
  576. package/src/terminal/piExtension.ts +0 -210
  577. package/src/terminal/pluginControl.test.ts +0 -146
  578. package/src/terminal/pluginMenu.ts +0 -112
  579. package/src/terminal/socket.test.ts +0 -71
  580. package/src/terminal/socket.ts +0 -221
  581. package/src/terminal/standalone.test.ts +0 -130
  582. package/src/terminal/standalone.ts +0 -144
  583. package/src/terminal/terminal.test.ts +0 -330
  584. package/src/terminal/terminals.ts +0 -443
  585. package/src/tools/askUser.ts +0 -45
  586. package/src/tools/definitions.ts +0 -187
  587. package/src/tools/memoryTools.ts +0 -22
  588. package/src/tools/pluginPropose.ts +0 -41
  589. package/src/tools/types.ts +0 -39
  590. package/src/web/safeRequest.ts +0 -171
  591. package/src/web/text.ts +0 -53
  592. package/src/web/tools.ts +0 -134
  593. package/src/web/web.test.ts +0 -141
@@ -0,0 +1,68 @@
1
+ // The harness's own parts, described as plugins. Each is a description of code that already
2
+ // exists; none of it is loaded through Pi's extension system.
3
+ import { CONNECTION_TOOLS, NATIVE_GROUP } from "../prompt/compile.js";
4
+ import { ASK_USER } from "../tools/askUser.js";
5
+ import { CHECKLIST_WRITE } from "../tools/checklist.js";
6
+ import { SPAWN_SUBAGENT, WAIT_SUBAGENTS } from "../sessions/subagents.js";
7
+ import { RECALL_TOOLS, SKILL_TOOLS, TRAJECTORY_TOOLS, WIKI_READ_TOOLS, WIKI_WRITE_TOOLS } from "../tools/definitions.js";
8
+ import { FIRST_PARTY_PLUGINS } from "./firstParty.js";
9
+ import { WEB_PLUGIN } from "../web/tools.js";
10
+ import { BROWSER_PLUGIN } from "../browser/index.js";
11
+ const tools = (definitions) => definitions.map((tool) => ({ name: tool.name, description: tool.label }));
12
+ /** Pi itself. Its command's built-in extensions are added to it as they are found. */
13
+ export const PI_PLUGIN = {
14
+ id: 'pi',
15
+ title: 'Pi',
16
+ description: 'The engine every session runs on: its base prompt, its file and shell tools, and the extensions built into its command.',
17
+ required: 'Pi runs every session.',
18
+ tools: NATIVE_GROUP.map((name) => ({ name })),
19
+ toolGroups: ['Native']
20
+ };
21
+ /** The variant: the eight components that shape what an agent is told and can do. */
22
+ export const VARIANT_PLUGIN = {
23
+ id: 'variant',
24
+ title: 'Variant',
25
+ description: 'The agent\'s own variant: system prompt, guardrails, memory and tool guidance in every prompt; skills, scripts and subagents on demand; plugins in the tool loop. Versioned, and refined from evidence.',
26
+ required: 'Every agent runs on a variant.',
27
+ sections: [
28
+ { id: 'system', name: 'System prompt', description: 'c1: role and procedure.' },
29
+ { id: 'guardrails', name: 'Guardrails', description: 'c2: standing rules.' },
30
+ { id: 'memory', name: 'Memory', description: 'c3: durable facts about this kind of work.' },
31
+ { id: 'subagents', name: 'Subagents', description: 'c5: the list of this variant\'s subagents.' },
32
+ { id: 'scripts', name: 'Scripts', description: 'c7: where this variant\'s scripts are.' },
33
+ { id: 'reporting', name: 'Reporting', description: 'Fixed foundation text, not part of the variant: how the final reply is shaped.' }
34
+ ],
35
+ tools: tools(SKILL_TOOLS)
36
+ };
37
+ export const HARNESS_PLUGINS = [
38
+ PI_PLUGIN,
39
+ { id: 'subagents', title: 'Subagents', description: 'Isolated child runs of the same caller, bounded by parent capabilities and nesting depth.', required: 'Availability is selected by the session host; child runs retain the parent permission boundary.', tools: [{ name: SPAWN_SUBAGENT, description: 'Start a subagent' }, { name: WAIT_SUBAGENTS, description: 'Wait for subagents' }] },
40
+ VARIANT_PLUGIN,
41
+ {
42
+ id: 'wiki',
43
+ title: 'Wiki',
44
+ description: 'Notes about projects, linked to each other, that agents search and read.',
45
+ required: 'Project notes are reached through it.',
46
+ tools: tools([...WIKI_READ_TOOLS, ...WIKI_WRITE_TOOLS]),
47
+ sections: [
48
+ { id: 'wiki', name: 'Wiki', description: 'The current project\'s notes.' },
49
+ { id: 'references', name: 'Selected references', description: 'Notes pinned to one request.' }
50
+ ],
51
+ toolGroups: ['Wiki']
52
+ },
53
+ { id: 'history', title: 'History', description: 'Search earlier conversations and inspect recorded run trajectories.', required: 'Earlier runs are how an agent picks up where work stopped.', tools: tools([...RECALL_TOOLS, ...TRAJECTORY_TOOLS]), toolGroups: ['History'] },
54
+ { id: 'ask-user', title: 'Ask the user', description: 'Lets the agent stop and ask a question with choices.', required: 'An agent must be able to stop and ask you.', tools: [{ name: ASK_USER }] },
55
+ { id: 'checklist', title: 'Checklist', description: 'Lets the agent keep a checklist of the steps of its work, recorded with the run so progress can be shown and picked up again.', required: 'Progress of longer work is kept through it.', tools: [{ name: CHECKLIST_WRITE, description: 'Write the checklist' }] },
56
+ {
57
+ id: 'connected-apps',
58
+ title: 'Connected apps',
59
+ description: 'Outside services reached over MCP, behind two tools that list and call what is connected.',
60
+ required: 'Connected apps are reached only through it. Each app is switched on its own.',
61
+ manage: 'connections',
62
+ tools: CONNECTION_TOOLS.map((name) => ({ name })),
63
+ toolGroups: ['Connections']
64
+ },
65
+ WEB_PLUGIN,
66
+ BROWSER_PLUGIN,
67
+ ...FIRST_PARTY_PLUGINS
68
+ ];
@@ -0,0 +1,29 @@
1
+ import type { Connection } from "../mcp/types.js";
2
+ import { type Attachments, type AttachScope } from "./attachments.js";
3
+ import type { HookStatus } from "./hooks.js";
4
+ import { type Loading, type Registered } from "./plugins.js";
5
+ import type { Plugin, PluginDescriptor } from "./types.js";
6
+ export interface CatalogueInput {
7
+ root: string;
8
+ /** The harness's own parts, then the application's. */
9
+ descriptors: readonly PluginDescriptor[];
10
+ /** Ids of the descriptors the application supplied. */
11
+ application: ReadonlySet<string>;
12
+ connections: readonly Connection[];
13
+ /** What was found for one account and working folder, or `null` when there is no account yet. */
14
+ loading: Loading | null;
15
+ /** The working folder the list is for. Without one, nothing a folder brings is listed. */
16
+ cwd: string | null;
17
+ /** The folder every account shares. */
18
+ sharedDir: string;
19
+ /** The folder of packages kept with a person's data. */
20
+ packagesDir: string;
21
+ /** What each hooks file listens for and how its last run went, by its path. */
22
+ hooks: Record<string, HookStatus>;
23
+ registered: Record<string, Registered>;
24
+ /** The choices a person made about what is switched on. */
25
+ attachments: Attachments;
26
+ /** Whose list this is. With an agent or a project, each state is what that caller gets. */
27
+ caller: AttachScope;
28
+ }
29
+ export declare function catalogue(input: CatalogueInput): Plugin[];
@@ -0,0 +1,196 @@
1
+ // Every plugin there is, from every source, as one list. Building it reads files and settings;
2
+ // it runs no plugin's code and changes nothing.
3
+ import { basename, dirname } from 'node:path';
4
+ import { projectsOrNone } from "../core/projects.js";
5
+ import { compareText } from "../core/text.js";
6
+ import { attached, describe } from "./attachments.js";
7
+ import { settingValue } from "./firstParty.js";
8
+ import { BUILTIN_PREFIX } from "./discover.js";
9
+ import { registrationHash } from "./runtime.js";
10
+ import { contributionId, describeFound, FOUND_KINDS, packageManifest, pluginIdOf } from "./identity.js";
11
+ import { loads, switchable, trustedBy } from "./plugins.js";
12
+ const contribution = (plugin, kind, name, rest = {}) => ({
13
+ id: contributionId(plugin, kind, name),
14
+ kind,
15
+ name,
16
+ description: '',
17
+ path: null,
18
+ state: 'on',
19
+ scope: null,
20
+ attachment: null,
21
+ registered: null,
22
+ problem: null,
23
+ background: false,
24
+ ...rest
25
+ });
26
+ function fromDescriptor(descriptor, source, attachments = null, caller = {}) {
27
+ const switchable = descriptor.switchable && attachments ? descriptor.switchable : null;
28
+ const on = switchable ? attached(attachments, [descriptor.id], caller, switchable.on) : true;
29
+ return {
30
+ id: descriptor.id,
31
+ title: descriptor.title,
32
+ description: descriptor.description,
33
+ version: null,
34
+ source,
35
+ path: null,
36
+ runsCode: !!descriptor.code?.length,
37
+ trust: 'none',
38
+ code: null,
39
+ install: null,
40
+ extends: [],
41
+ required: descriptor.required ?? null,
42
+ manage: descriptor.manage ?? (descriptor.tools?.length ? 'tools' : null),
43
+ settings: (descriptor.settings ?? []).map((setting) => ({ ...setting, value: settingValue(setting, attachments?.settings[descriptor.id]) })),
44
+ connectorTemplates: descriptor.connectorTemplates ?? [],
45
+ attachment: switchable ? describe(attachments, descriptor.id, switchable.on) : null,
46
+ contributions: [
47
+ ...(descriptor.code ?? []).map((code) => contribution(descriptor.id, 'code', code.name, { description: code.description, state: on ? 'on' : 'off' })),
48
+ ...(descriptor.sections ?? []).map((section) => contribution(descriptor.id, 'instruction', section.name, { description: section.description ?? '' })),
49
+ ...(descriptor.tools ?? []).map((tool) => contribution(descriptor.id, 'tool', tool.name, { description: tool.description ?? '', ...(switchable ? { state: on ? 'on' : 'off' } : {}) }))
50
+ ]
51
+ };
52
+ }
53
+ const named = (ids, names) => ids.flatMap((id) => (names.has(id) ? [names.get(id)] : []));
54
+ const counted = (count, word) => (count ? `${count} ${word}${count === 1 ? '' : 's'}` : '');
55
+ /** Who something is switched on for, in words; `null` when it is on for nobody. */
56
+ function scopeWords(attachment, projects) {
57
+ if (attachment.global) {
58
+ const except = [counted(attachment.off.agentIds.length, 'agent'), ...named(attachment.off.projectIds, projects)].filter(Boolean);
59
+ return except.length ? `Everywhere except ${except.join(', ')}` : 'Everywhere';
60
+ }
61
+ const parts = [...named(attachment.on.projectIds, projects), counted(attachment.on.agentIds.length, 'agent')].filter(Boolean);
62
+ return parts.length ? parts.join(', ') : null;
63
+ }
64
+ /** A connection keeps its own scope; this is the same shape for a screen. */
65
+ function connectionAttachment(connection) {
66
+ if (!connection.enabled)
67
+ return null;
68
+ return { global: connection.global, on: { agentIds: connection.agentIds, projectIds: connection.projectIds }, off: { agentIds: connection.excludedAgentIds, projectIds: connection.excludedProjectIds } };
69
+ }
70
+ function connectionScope(connection) {
71
+ if (!connection.enabled)
72
+ return null;
73
+ if (connection.global)
74
+ return 'Everywhere';
75
+ const parts = [counted(connection.agentIds.length, 'agent'), counted(connection.projectIds.length, 'project')].filter(Boolean);
76
+ return parts.length ? parts.join(', ') : null;
77
+ }
78
+ const CONTEXT_NOTES = {
79
+ 'SYSTEM.md': "Replaces Pi's base prompt.",
80
+ 'APPEND_SYSTEM.md': "Added to the end of Pi's base prompt."
81
+ };
82
+ /** What an extension added, in a line; or that no session has loaded it yet. */
83
+ function registeredLine(entry) {
84
+ if (!entry)
85
+ return 'Not loaded in a session yet, so what it adds is not known.';
86
+ const parts = [
87
+ entry.commands.length ? `commands ${entry.commands.map((name) => `/${name}`).join(', ')}` : '',
88
+ entry.tools.length ? `tools ${entry.tools.join(', ')}` : '',
89
+ entry.hooks.length ? `hooks ${entry.hooks.join(', ')}` : '',
90
+ entry.flags.length ? `flags ${entry.flags.map((name) => `--${name}`).join(', ')}` : '',
91
+ entry.shortcuts.length ? `shortcuts ${entry.shortcuts.join(', ')}` : ''
92
+ ].filter(Boolean);
93
+ return parts.length ? `Adds ${parts.join('; ')}.` : 'Registers nothing a session can see.';
94
+ }
95
+ function foundContribution(plugin, item, trusted, input, projects) {
96
+ const kind = FOUND_KINDS[item.kind];
97
+ const { name, description } = describeFound(item);
98
+ const id = contributionId(plugin, kind, name);
99
+ // A hook runs for everyone or not at all: it follows its plugin's switch for everyone and has none of its own.
100
+ const attachment = switchable(item) && item.kind !== 'hook' ? describe(input.attachments, id, attached(input.attachments, [plugin], {}, true)) : null;
101
+ const on = item.kind === 'hook' ? attached(input.attachments, [plugin], {}, true) : !attachment || attached(input.attachments, [id, plugin], input.caller, true);
102
+ const state = !item.enabled || !on ? 'off' : loads(item, trusted) ? 'on' : 'untrusted';
103
+ const rest = { state, attachment, scope: attachment ? scopeWords(attachment, projects) : null };
104
+ if (item.path.startsWith(BUILTIN_PREFIX))
105
+ return contribution(plugin, kind, name, { ...rest, description: 'Built into the pi command. A terminal session loads it; other sessions do not have it.' });
106
+ if (item.kind === 'extension') {
107
+ const observed = input.registered[item.path];
108
+ const hash = input.loading ? registrationHash(input.loading, item.path) : null;
109
+ const current = observed && hash !== null && observed.hash === hash ? observed : undefined;
110
+ return contribution(plugin, kind, name, { ...rest, description: registeredLine(current), path: item.path, registered: current ?? null });
111
+ }
112
+ if (item.kind === 'hook') {
113
+ const status = input.hooks[item.path];
114
+ const events = status?.events ?? [];
115
+ const described = events.length ? `Runs in the background after: ${events.join(', ')}.` : state === 'on' ? 'Runs in the background. It has not said what it listens for yet.' : 'Runs in the background once it is switched on for everyone and trusted.';
116
+ return contribution(plugin, kind, name, { ...rest, description: described, path: item.path, problem: status?.lastError ?? null, background: true });
117
+ }
118
+ if (item.kind === 'context')
119
+ return contribution(plugin, kind, name, { ...rest, description: CONTEXT_NOTES[basename(item.path)] ?? 'Read by Pi at the start of every session in this folder.', path: item.path });
120
+ return contribution(plugin, kind, name, { ...rest, description: description ?? '', path: item.path });
121
+ }
122
+ const empty = (id, title, description, source, path) => ({ id, title, description, version: null, source, path, runsCode: false, trust: 'none', code: null, install: null, extends: [], required: null, manage: 'files', settings: [], connectorTemplates: [], attachment: null, contributions: [] });
123
+ export function catalogue(input) {
124
+ const plugins = new Map();
125
+ for (const descriptor of input.descriptors)
126
+ plugins.set(descriptor.id, fromDescriptor(descriptor, descriptor.id === 'pi' ? 'pi' : input.application.has(descriptor.id) ? 'application' : 'builtin', input.attachments, input.caller));
127
+ const apps = plugins.get('connected-apps');
128
+ if (apps) {
129
+ for (const connection of input.connections) {
130
+ const scope = connectionScope(connection);
131
+ apps.contributions.push({ ...contribution(apps.id, 'connection', connection.name || connection.id, { description: connection.serverName ?? connection.url ?? connection.command, state: scope ? 'on' : 'off', scope, attachment: connectionAttachment(connection) }), id: `${apps.id}/connection/${connection.id}` });
132
+ }
133
+ }
134
+ const projects = new Map(projectsOrNone(input.root).map((project) => [project.id, project.name]));
135
+ const loading = input.loading;
136
+ const trusted = trustedBy(loading);
137
+ for (const item of loading?.found ?? []) {
138
+ if (item.project && !input.cwd)
139
+ continue;
140
+ const id = pluginIdOf(item);
141
+ let plugin = plugins.get(id);
142
+ if (!plugin) {
143
+ if (item.origin === 'builtin')
144
+ continue;
145
+ if (item.packageRoot) {
146
+ const manifest = packageManifest(item.packageRoot);
147
+ // A package a working folder's settings name is that folder's to remove, not a person's install.
148
+ const install = item.project ? null : item.packageRoot.startsWith(`${input.packagesDir}/`) ? { kind: 'folder', source: item.packageRoot } : item.source ? { kind: 'settings', source: item.source } : null;
149
+ // Only parts that exist can be extended; a made-up name is dropped.
150
+ const extended = manifest.extends.filter((part) => input.descriptors.some((descriptor) => descriptor.id === part));
151
+ plugin = { ...empty(id, manifest.name, manifest.description, item.project ? 'project' : 'package', item.packageRoot), version: manifest.version, install, extends: extended, connectorTemplates: manifest.connectorTemplates };
152
+ }
153
+ else if (item.origin === 'home')
154
+ plugin = empty(id, 'Home folder skills', 'Skills in the .agents folder of your home folder. Pi reads them for every account.', 'home', dirname(dirname(item.path)));
155
+ else if (item.origin === 'project')
156
+ plugin = empty(id, 'Project folder', 'Found in the working folder: its .pi and .agents folders, and the instruction files Pi reads on the way up from it.', 'project', input.cwd);
157
+ else
158
+ plugin = empty(id, 'Shared Pi folder', 'Extensions, skills, prompts and instruction files in the folder every account shares.', 'shared', input.sharedDir);
159
+ plugin.attachment = describe(input.attachments, id, true);
160
+ plugins.set(id, plugin);
161
+ }
162
+ const added = foundContribution(plugin.id, item, trusted, input, projects);
163
+ if (plugin.contributions.some((existing) => existing.id === added.id))
164
+ continue;
165
+ plugin.contributions.push(added);
166
+ if (item.kind === 'extension' && added.registered) {
167
+ const registered = added.registered;
168
+ const append = (kind, name, rest = {}) => {
169
+ const id = contributionId(plugin.id, kind, name);
170
+ if (!plugin.contributions.some((existing) => existing.id === id))
171
+ plugin.contributions.push(contribution(plugin.id, kind, name, { state: added.state, description: `Registered by ${added.name}. Observed ${registered.seenAt ?? 'in a session'}.`, ...rest }));
172
+ };
173
+ for (const name of registered.tools)
174
+ append('tool', name);
175
+ for (const name of registered.commands)
176
+ append('command', name);
177
+ for (const resource of registered.resources ?? []) {
178
+ const id = contributionId(plugin.id, resource.kind, resource.name);
179
+ const on = attached(input.attachments, [id, plugin.id], input.caller, true);
180
+ append(resource.kind, resource.name, { path: resource.path, state: on ? added.state : 'off', attachment: describe(input.attachments, id, attached(input.attachments, [plugin.id], {}, true)) });
181
+ }
182
+ }
183
+ if (added.kind === 'code' && item.origin !== 'builtin') {
184
+ plugin.runsCode = true;
185
+ // A working folder's code and an installed package's wait for trust; a loose file in the
186
+ // shared folder was placed by the person.
187
+ const code = item.project ? loading?.projectCode : item.packageRoot ? loading?.packageCode[item.packageRoot] : null;
188
+ if (code) {
189
+ plugin.trust = code.trusted ? 'trusted' : 'untrusted';
190
+ plugin.code = { hash: code.hash, files: code.files };
191
+ }
192
+ }
193
+ }
194
+ const order = ['project', 'package', 'shared', 'home', 'yours', 'application', 'builtin', 'pi'];
195
+ return [...plugins.values()].sort((left, right) => order.indexOf(left.source) - order.indexOf(right.source) || compareText(left.title, right.title));
196
+ }
@@ -0,0 +1,13 @@
1
+ import { Harness, type HarnessOptions } from "../harness.js";
2
+ export declare const PLUGINS_USAGE = "Usage: xharness plugins <command> [options]\n\n list Every plugin and whether it is on\n show <plugin id> One plugin: what it brings, where it is on, its code\n install <source> A folder, an npm name, or a git address. It arrives off and untrusted\n remove <plugin id> Remove a plugin you installed\n update [plugin id] Fetch a newer version of one installed plugin, or of all\n attach <id> Switch a plugin, or one thing it brings, on\n detach <id> Switch it off\n trust <plugin id> [--yes] Show the files of its code, then trust them\n untrust <plugin id> Stop trusting its code\n\nOptions:\n --data <dir> Data directory (default: ~/.xingular-harness/data)\n --state <dir> State directory (default: ~/.xingular-harness/state)\n --cwd <dir> Also list what this working folder brings\n --project <id> attach/detach for one project instead of everywhere\n --agent <id> attach/detach for one agent instead of everywhere\n";
3
+ export interface PluginsCliDependencies {
4
+ home?: string;
5
+ cwd?: string;
6
+ write?: (text: string) => void;
7
+ /** Asks the person a question and returns what they typed. Without it, a trust needs `--yes`. */
8
+ ask?: (question: string) => Promise<string>;
9
+ createHarness?: (options: HarnessOptions) => Harness;
10
+ }
11
+ export declare function runPluginsCli(argv: string[], dependencies?: PluginsCliDependencies): Promise<number>;
12
+ /** Asks on the terminal, when there is one to ask on. */
13
+ export declare function terminalAsk(): ((question: string) => Promise<string>) | undefined;
@@ -0,0 +1,187 @@
1
+ // `xharness plugins …`: plugin control for a person using the harness without an
2
+ // application. It runs outside any session, as the person who typed it, and acts directly.
3
+ import { homedir } from 'node:os';
4
+ import { join, resolve } from 'node:path';
5
+ import { createInterface } from 'node:readline/promises';
6
+ import { Harness } from "../harness.js";
7
+ import * as api from "./api.js";
8
+ import * as install from "./install.js";
9
+ export const PLUGINS_USAGE = `Usage: xharness plugins <command> [options]
10
+
11
+ list Every plugin and whether it is on
12
+ show <plugin id> One plugin: what it brings, where it is on, its code
13
+ install <source> A folder, an npm name, or a git address. It arrives off and untrusted
14
+ remove <plugin id> Remove a plugin you installed
15
+ update [plugin id] Fetch a newer version of one installed plugin, or of all
16
+ attach <id> Switch a plugin, or one thing it brings, on
17
+ detach <id> Switch it off
18
+ trust <plugin id> [--yes] Show the files of its code, then trust them
19
+ untrust <plugin id> Stop trusting its code
20
+
21
+ Options:
22
+ --data <dir> Data directory (default: ~/.xingular-harness/data)
23
+ --state <dir> State directory (default: ~/.xingular-harness/state)
24
+ --cwd <dir> Also list what this working folder brings
25
+ --project <id> attach/detach for one project instead of everywhere
26
+ --agent <id> attach/detach for one agent instead of everywhere
27
+ `;
28
+ function parse(argv) {
29
+ const positional = [];
30
+ const values = {};
31
+ const switches = new Set();
32
+ for (let index = 0; index < argv.length; index += 1) {
33
+ const arg = argv[index];
34
+ if (!arg.startsWith('--'))
35
+ positional.push(arg);
36
+ else if (arg === '--yes')
37
+ switches.add('yes');
38
+ else if (index + 1 < argv.length) {
39
+ values[arg.slice(2)] = argv[index + 1];
40
+ index += 1;
41
+ }
42
+ else
43
+ throw new Error(`${arg} needs a value.`);
44
+ }
45
+ return { positional, values, switches };
46
+ }
47
+ const stateOf = (plugin) => {
48
+ if (plugin.required)
49
+ return 'required';
50
+ if (plugin.trust === 'untrusted')
51
+ return plugin.attachment && !plugin.attachment.global ? 'off, code not trusted' : 'code not trusted';
52
+ if (plugin.attachment)
53
+ return plugin.attachment.global ? 'on' : 'off';
54
+ const on = plugin.contributions.filter((entry) => entry.state === 'on').length;
55
+ return `${on} of ${plugin.contributions.length} on`;
56
+ };
57
+ function describe(plugin) {
58
+ const lines = [`${plugin.title} (${plugin.id})`, ` ${plugin.description || 'No description.'}`, ` Source: ${plugin.source}${plugin.version ? ` ${plugin.version}` : ''}${plugin.path ? ` · ${plugin.path}` : ''}`, ` State: ${stateOf(plugin)}`];
59
+ if (plugin.extends.length)
60
+ lines.push(` Extends: ${plugin.extends.join(', ')}`);
61
+ if (plugin.code)
62
+ lines.push(` Code (${plugin.trust}), fingerprint ${plugin.code.hash.slice(0, 12)}:`, ...plugin.code.files.map((file) => ` ${file}`));
63
+ for (const entry of plugin.contributions)
64
+ lines.push(` ${entry.state === 'on' ? '●' : '○'} ${entry.kind} ${entry.name} (${entry.id})${entry.scope ? ` · ${entry.scope}` : ''}${entry.problem ? ` · last run failed: ${entry.problem}` : ''}`);
65
+ return lines.join('\n');
66
+ }
67
+ export async function runPluginsCli(argv, dependencies = {}) {
68
+ const write = dependencies.write ?? ((text) => void process.stdout.write(text));
69
+ let parsed;
70
+ try {
71
+ parsed = parse(argv);
72
+ }
73
+ catch (error) {
74
+ write(`${error instanceof Error ? error.message : String(error)}\n`);
75
+ return 2;
76
+ }
77
+ const [command, target] = parsed.positional;
78
+ if (!command || command === 'help') {
79
+ write(PLUGINS_USAGE);
80
+ return command ? 0 : 2;
81
+ }
82
+ const base = dependencies.cwd ?? process.cwd();
83
+ const root = join(dependencies.home ?? homedir(), '.xingular-harness');
84
+ const options = { dataRoot: parsed.values.data ? resolve(base, parsed.values.data) : join(root, 'data'), stateDir: parsed.values.state ? resolve(base, parsed.values.state) : join(root, 'state'), productName: 'Xingular Harness' };
85
+ // Built without opening the data root: a plugin command must not settle runs or migrate a Wiki
86
+ // that another process may be using.
87
+ const harness = dependencies.createHarness ? dependencies.createHarness(options) : new Harness(options);
88
+ const scope = { cwd: parsed.values.cwd ? resolve(base, parsed.values.cwd) : null };
89
+ const need = (what) => {
90
+ if (!target)
91
+ throw new Error(`${command} needs ${what}.`);
92
+ return target;
93
+ };
94
+ const find = async (id) => {
95
+ const plugin = (await api.list(harness, scope)).find((candidate) => candidate.id === id);
96
+ if (!plugin)
97
+ throw new Error(`There is no plugin with the id "${id}". Run "plugins list" to see the ids.`);
98
+ return plugin;
99
+ };
100
+ try {
101
+ switch (command) {
102
+ case 'list': {
103
+ const plugins = await api.list(harness, scope);
104
+ const width = Math.max(...plugins.map((plugin) => plugin.id.length));
105
+ write(`${plugins.map((plugin) => `${plugin.id.padEnd(width)} ${stateOf(plugin).padEnd(22)} ${plugin.title}`).join('\n')}\n`);
106
+ return 0;
107
+ }
108
+ case 'show':
109
+ write(`${describe(await find(need('a plugin id')))}\n`);
110
+ return 0;
111
+ case 'install': {
112
+ const before = new Set((await api.list(harness, scope)).map((plugin) => plugin.id));
113
+ const added = (await install.install(harness, { ...scope, source: need('a folder, an npm name, or a git address') })).filter((plugin) => !before.has(plugin.id));
114
+ write(added.length ? `${added.map(describe).join('\n\n')}\n\nInstalled, switched off. Switch it on with "plugins attach <id>"${added.some((plugin) => plugin.code) ? ' and trust its code with "plugins trust <id>"' : ''}.\n` : 'Nothing new was installed.\n');
115
+ return 0;
116
+ }
117
+ case 'remove':
118
+ await install.remove(harness, { ...scope, pluginId: need('a plugin id') });
119
+ write(`Removed ${target}.\n`);
120
+ return 0;
121
+ case 'update':
122
+ await install.update(harness, { ...scope, pluginId: target ?? null });
123
+ write(target ? `Updated ${target}. If its code changed, trust it again.\n` : 'Updated the installed plugins. Any whose code changed needs trust again.\n');
124
+ return 0;
125
+ case 'attach':
126
+ case 'detach': {
127
+ const where = parsed.values.agent ? { agentId: parsed.values.agent } : parsed.values.project ? { projectId: parsed.values.project } : {};
128
+ await api.attach(harness, { ...scope, id: need('a plugin or contribution id'), scope: where }, command === 'attach');
129
+ write(`${target} is ${command === 'attach' ? 'on' : 'off'} ${parsed.values.agent ? `for agent ${parsed.values.agent}` : parsed.values.project ? `for project ${parsed.values.project}` : 'everywhere'}. It applies from the next session start.\n`);
130
+ return 0;
131
+ }
132
+ case 'trust': {
133
+ const plugin = await find(need('a plugin id'));
134
+ if (!plugin.code)
135
+ throw new Error(`${plugin.title} has no code that waits for trust.`);
136
+ if (plugin.trust === 'trusted') {
137
+ write(`${plugin.title} is already trusted.\n`);
138
+ return 0;
139
+ }
140
+ write(`${plugin.title} brings code that runs inside the harness and its sessions. It can do anything you can, including reading your files and credentials.\n\nFiles:\n${plugin.code.files.map((file) => ` ${file}`).join('\n')}\n\nFingerprint ${plugin.code.hash.slice(0, 12)}\n`);
141
+ if (!parsed.switches.has('yes')) {
142
+ if (!dependencies.ask)
143
+ throw new Error('Read the files, then run this again with --yes to trust them.');
144
+ if ((await dependencies.ask('Trust this code? Type yes: ')).trim().toLowerCase() !== 'yes') {
145
+ write('Not trusted.\n');
146
+ return 1;
147
+ }
148
+ }
149
+ await api.trust(harness, { ...scope, hash: plugin.code.hash });
150
+ write(`Trusted. If any of these files changes, it asks again.\n`);
151
+ return 0;
152
+ }
153
+ case 'untrust': {
154
+ const plugin = await find(need('a plugin id'));
155
+ if (!plugin.code)
156
+ throw new Error(`${plugin.title} has no code to stop trusting.`);
157
+ await api.untrust(harness, { ...scope, hash: plugin.code.hash });
158
+ write(`${plugin.title} is not trusted any more.\n`);
159
+ return 0;
160
+ }
161
+ default:
162
+ write(PLUGINS_USAGE);
163
+ return 2;
164
+ }
165
+ }
166
+ catch (error) {
167
+ write(`${error instanceof Error ? error.message : String(error)}\n`);
168
+ return 1;
169
+ }
170
+ finally {
171
+ await harness.close();
172
+ }
173
+ }
174
+ /** Asks on the terminal, when there is one to ask on. */
175
+ export function terminalAsk() {
176
+ if (!process.stdin.isTTY || !process.stdout.isTTY)
177
+ return undefined;
178
+ return async (question) => {
179
+ const reader = createInterface({ input: process.stdin, output: process.stdout });
180
+ try {
181
+ return await reader.question(question);
182
+ }
183
+ finally {
184
+ reader.close();
185
+ }
186
+ };
187
+ }
@@ -0,0 +1,42 @@
1
+ /**
2
+ * `context` is an instruction file Pi reads on its own: `AGENTS.md`, `SYSTEM.md` and their kin.
3
+ * `hook` is a package's hooks file, which the harness runs itself; Pi never loads it.
4
+ */
5
+ export type FoundKind = 'extension' | 'skill' | 'prompt' | 'theme' | 'context' | 'hook';
6
+ /** Where a found item comes from. `builtin` is one of the Pi command's own extensions. */
7
+ export type FoundOrigin = 'shared' | 'package' | 'project' | 'home' | 'builtin';
8
+ export interface Found {
9
+ kind: FoundKind;
10
+ /** A file or folder, or `builtin:<name>`. */
11
+ path: string;
12
+ origin: FoundOrigin;
13
+ /** Declared by the working folder: its `.pi` or `.agents` folder, or its settings. */
14
+ project: boolean;
15
+ /** The folder of the package this belongs to. */
16
+ packageRoot: string | null;
17
+ /** The package as its settings name it (`npm:…`, `git:…`, a folder). */
18
+ source: string | null;
19
+ /** Left on in Pi's settings. An item switched off there is found but never loaded. */
20
+ enabled: boolean;
21
+ }
22
+ export interface ResolveInput {
23
+ cwd: string;
24
+ /** The account's Pi agent folder. */
25
+ agentDir: string;
26
+ /** Install a package the shared settings name and the account does not have yet. */
27
+ install?: boolean;
28
+ /** Folders of packages kept outside Pi's settings: each is found as an installed package. */
29
+ packages?: readonly string[];
30
+ }
31
+ /** Finds what Pi would load. Replaced in tests. */
32
+ export type Resolver = (input: ResolveInput) => Promise<Found[]>;
33
+ /** The extensions built into the `pi` command. A terminal loads them; an SDK session has none. */
34
+ export declare const PI_BUILTINS: readonly ["llama.cpp", "codemode", "tool-search", "mcp"];
35
+ export declare const BUILTIN_PREFIX = "builtin:";
36
+ /**
37
+ * Runs an install with the package manager's install scripts switched off, so fetching a
38
+ * package runs none of its code. A package that builds itself on install then fails to load,
39
+ * and says so; that is the price of installing being safe to do before trust.
40
+ */
41
+ export declare function withoutInstallScripts<T>(action: () => Promise<T>): Promise<T>;
42
+ export declare const piResolver: Resolver;