@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,443 +0,0 @@
1
- // Terminal sessions: a person working with the `pi` command in a terminal that the embedding
2
- // application draws. The harness prepares the launch (isolated account, compiled instructions,
3
- // skills, the session socket), then follows the process through its extension. It never owns
4
- // the terminal: the application spawns the process from the spec returned here and reports when
5
- // it exits.
6
- import { chmodSync, existsSync, lstatSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs'
7
- import { dirname, join } from 'node:path'
8
- import { fileURLToPath } from 'node:url'
9
-
10
- import type { Accounts } from '../accounts/accounts'
11
- import { configDir, launchEnv } from '../accounts/env'
12
- import type { Account } from '../accounts/store'
13
- import type { Bus } from '../core/bus'
14
- import { log } from '../core/bus'
15
- import type { HarnessEnv } from '../core/env'
16
- import { HarnessError, invalid } from '../core/errors'
17
- import { newId, now } from '../core/fs'
18
- import { prependSearchPath, searchPath } from '../core/path'
19
- import type { BrokerSession, ConnectedApps } from '../mcp/service'
20
- import type { CallerContext } from '../memory/caller'
21
- import { dispatch } from '../memory/dispatch'
22
- import type { AttachParams, PluginScope } from '../plugins/api'
23
- import type { Plugins } from '../plugins/plugins'
24
- import type { Plugin } from '../plugins/types'
25
- import { compile, copyToRun, memoryDelta, record, render, saveForSession, type Launch } from '../prompt/compile'
26
- import type { RunRecord } from '../sessions/contracts'
27
- import { isActiveStatus } from '../sessions/contracts'
28
- import type { ToolPolicy } from '../sessions/policy'
29
- import type { ActiveRun, RunRegistry } from '../sessions/registry'
30
- import { findRun, loadRun, saveRun, updateRun } from '../sessions/runStore'
31
- import { resources } from '../skills/registry'
32
- import type { ToolSpec } from '../tools/types'
33
- import { APPS_COMMAND, WIKI_COMMAND } from './cli'
34
- import { SOCKET_ENV, TOKEN_ENV } from './client'
35
- import { TerminalController, type PolicyReply } from './controller'
36
- import { resolvePiCommand, terminalCommandFiles } from './launch'
37
- import { SessionSocket, socketPath } from './socket'
38
-
39
- /** The files a terminal session needs on disk, outside this process. */
40
- export interface TerminalAssets {
41
- /** The Node binary that runs the commands. */
42
- node: string
43
- /** The built `xingular-harness` command (`dist/cli.js`). */
44
- cli: string
45
- /** The built Pi extension (`dist/terminal-pi.js`). */
46
- piExtension: string
47
- }
48
-
49
- /** Where the package's own build puts them. An application that bundles the harness passes its own. */
50
- export function defaultAssets(): TerminalAssets {
51
- const here = dirname(fileURLToPath(import.meta.url))
52
- const dist = [here, join(here, '..', '..', 'dist'), join(here, '..', 'dist')].find((folder) => existsSync(join(folder, 'terminal-pi.js'))) ?? here
53
- return { node: process.execPath, cli: join(dist, 'cli.js'), piExtension: join(dist, 'terminal-pi.js') }
54
- }
55
-
56
- export interface TerminalPrepareInput {
57
- sessionId: string
58
- /** The account the session is pinned to. Omitted only for a session that has none yet; it then takes the default and keeps it. */
59
- accountId?: string | null
60
- projectId?: string | null
61
- cwd: string
62
- /** The session's own folder. Its compiled instructions and native history are kept under it. */
63
- sessionFolder: string
64
- nativeSessionId?: string | null
65
- model?: string | null
66
- readOnly?: boolean
67
- /** What the application adds to the instructions, and which of its tools it describes. */
68
- launch?: Launch
69
- /** Give the session the connected-apps broker. Defaults to yes. */
70
- connections?: boolean
71
- /** Fields copied onto each run this session records. */
72
- run?: Partial<Pick<RunRecord, 'mode' | 'worktreeId'>>
73
- }
74
-
75
- export interface TerminalLaunch {
76
- program: string
77
- args: string[]
78
- /** Variables to set; `null` removes an inherited one. */
79
- env: Record<string, string | null>
80
- accountId: string
81
- nativeSessionId: string | null
82
- }
83
-
84
- interface Live {
85
- input: TerminalPrepareInput
86
- account: Account
87
- controller: TerminalController
88
- token: string
89
- broker: BrokerSession | null
90
- caller: CallerContext
91
- }
92
-
93
- export interface TerminalsOptions {
94
- env: HarnessEnv
95
- stateDir: string
96
- accounts: Accounts
97
- runs: RunRegistry
98
- apps: ConnectedApps
99
- policy: ToolPolicy
100
- bus: Bus
101
- /** Chooses what a terminal loads. Without it Pi discovers extensions and skills on its own. */
102
- plugins?: Plugins
103
- /** Lists plugins and applies a person's choices, for the session's `/plugins` command. */
104
- pluginControl?: PluginControl
105
- assets?: TerminalAssets
106
- /** The `pi` executable. Defaults to the PATH command on POSIX and the bundled CLI on Windows. */
107
- program?: () => string | null
108
- }
109
-
110
- /** What `/plugins` in a terminal can do. Each takes the session's folder, account and project. */
111
- export interface PluginControl {
112
- list(scope: PluginScope): Promise<Plugin[]>
113
- attach(params: AttachParams, on: boolean): Promise<Plugin[]>
114
- trust(scope: PluginScope & { hash: string }): Promise<Plugin[]>
115
- untrust(scope: PluginScope & { hash: string }): Promise<Plugin[]>
116
- }
117
-
118
- const READ_ONLY_TOOLS = new Set(['read', 'grep', 'find', 'ls'])
119
-
120
- export class Terminals {
121
- private readonly sessions = new Map<string, Live>()
122
- private readonly socket: SessionSocket
123
- private readonly assets: TerminalAssets
124
-
125
- constructor(private readonly options: TerminalsOptions) {
126
- this.assets = options.assets ?? defaultAssets()
127
- this.socket = new SessionSocket(socketPath(options.stateDir), {
128
- memory: (caller, call, params) => dispatch(options.env, caller, call, params),
129
- apps: (session, call, params) => this.appsCall(session, call, params),
130
- plugins: (grant, call, params, control) => this.pluginsCall(grant.sessionId, call, params, control)
131
- })
132
- }
133
-
134
- /** The commands a terminal session finds on PATH. Rewritten only when they change. */
135
- private ensureCommands(): string {
136
- const bin = join(this.options.stateDir, 'run', 'bin')
137
- mkdirSync(bin, { recursive: true })
138
- for (const name of ['agentx-wiki', 'agentx-mcp', 'agentx-wiki.cmd', 'agentx-mcp.cmd']) {
139
- const path = join(bin, name)
140
- try {
141
- if (lstatSync(path).isFile()) unlinkSync(path)
142
- } catch {
143
- // These names belonged to the previous generated wrappers.
144
- }
145
- }
146
- for (const [name, mode] of [[WIKI_COMMAND, 'wiki'], [APPS_COMMAND, 'mcp']] as const) {
147
- for (const file of terminalCommandFiles(process.platform, this.assets.node, this.assets.cli, name, mode)) {
148
- const path = join(bin, file.name)
149
- let current: string | null = null
150
- try {
151
- current = readFileSync(path, 'utf8')
152
- } catch {
153
- current = null
154
- }
155
- if (current !== file.content) {
156
- writeFileSync(path, file.content)
157
- chmodSync(path, 0o755)
158
- }
159
- }
160
- }
161
- return bin
162
- }
163
-
164
- private tools(session: BrokerSession): ToolSpec[] {
165
- return this.options.apps.brokerTools(session)
166
- }
167
-
168
- private async appsCall(session: BrokerSession, call: string, params: Record<string, unknown>): Promise<unknown> {
169
- const { apps } = this.options
170
- switch (call) {
171
- case 'mcp.list':
172
- return apps.list(session)
173
- case 'mcp.call':
174
- return apps.invoke(session, String(params.name ?? ''), (params.args && typeof params.args === 'object' ? params.args : {}) as Record<string, unknown>)
175
- case 'mcp.revision':
176
- return apps.revision(session)
177
- case 'tools.list': {
178
- const { Type } = await import('typebox')
179
- return { tools: this.tools(session).map((tool) => ({ name: tool.name, label: tool.label, description: tool.description, parameters: tool.parameters(Type) })) }
180
- }
181
- case 'tools.call': {
182
- const tool = this.tools(session).find((candidate) => candidate.name === params.name)
183
- if (!tool) throw new HarnessError('unknown_method', `Unknown tool ${String(params.name)}.`)
184
- const result = await tool.execute((params.input && typeof params.input === 'object' ? params.input : {}) as Record<string, unknown>)
185
- return { text: typeof result === 'string' ? result : result.text }
186
- }
187
- default:
188
- throw new HarnessError('unknown_method', `Unknown call ${call}.`)
189
- }
190
- }
191
-
192
- /**
193
- * `/plugins` in a terminal. Listing is open to the session. A change is taken only from the
194
- * session's own extension, which asks the person in the terminal first: the model can reach
195
- * this socket from a shell command, and must not be able to trust code or switch it on.
196
- */
197
- private async pluginsCall(sessionId: string, call: string, params: Record<string, unknown>, control: boolean): Promise<unknown> {
198
- const api = this.options.pluginControl
199
- const live = this.sessions.get(sessionId)
200
- if (!api || !live) throw new HarnessError('unknown_method', `Unknown call ${call}.`)
201
- const projectId = live.input.projectId ?? null
202
- const scope = { cwd: live.input.cwd, accountId: live.account.id, projectId }
203
- if (call === 'plugins.list') return api.list(scope)
204
- if (call === 'plugins.session') return { projectId }
205
- if (!control) throw new HarnessError('unauthorized', 'Only a person at this terminal can change plugins. Type /plugins.')
206
- const text = (name: string): string => {
207
- if (typeof params[name] !== 'string' || !params[name]) throw invalid(`${name} is required.`)
208
- return params[name] as string
209
- }
210
- switch (call) {
211
- case 'plugins.attach':
212
- case 'plugins.detach':
213
- return api.attach({ ...scope, id: text('id'), scope: params.everywhere === true || !projectId ? {} : { projectId } }, call === 'plugins.attach')
214
- case 'plugins.trust':
215
- return api.trust({ ...scope, hash: text('hash') })
216
- case 'plugins.untrust':
217
- return api.untrust({ ...scope, hash: text('hash') })
218
- default:
219
- throw new HarnessError('unknown_method', `Unknown call ${call}.`)
220
- }
221
- }
222
-
223
- private live(sessionId: string): Live {
224
- const live = this.sessions.get(sessionId)
225
- if (!live) throw new HarnessError('terminal_not_ready', 'The terminal controller is unavailable. Reopen this session.')
226
- return live
227
- }
228
-
229
- private historyDir(input: TerminalPrepareInput): string {
230
- return join(input.sessionFolder, 'pi')
231
- }
232
-
233
- private runRecord(live: Live, runId: string, text: string | null): RunRecord {
234
- const { input } = live
235
- return {
236
- resumedFromRunId: null,
237
- parentRunId: null,
238
- relation: null,
239
- terminalReason: null,
240
- agentId: null,
241
- trigger: null,
242
- id: runId,
243
- projectId: input.projectId ?? null,
244
- mode: input.run?.mode ?? 'code',
245
- harness: 'pi',
246
- sessionType: 'terminal',
247
- sessionId: input.sessionId,
248
- nativeSessionId: live.controller.nativeSessionId,
249
- workingDirectory: input.cwd,
250
- worktreeId: input.run?.worktreeId ?? null,
251
- goal: text,
252
- attachmentCount: 0,
253
- startedAt: now(),
254
- endedAt: null,
255
- status: 'queued',
256
- exitCode: null,
257
- handoffId: null,
258
- accountId: live.account.id
259
- }
260
- }
261
-
262
- /** The run a native turn reports into: the one reserved by `send`, or a new one for what the person typed. */
263
- private begin(live: Live, reservedRunId: string | null, text: string): ActiveRun {
264
- const { root } = this.options.env
265
- const { sessionId } = live.input
266
- if (this.options.runs.activeForSession(sessionId)) throw new HarnessError('session_busy', 'A native turn already owns this session.')
267
- let runId = reservedRunId
268
- if (runId) {
269
- const reserved = loadRun(root, runId)
270
- if (reserved.sessionId !== sessionId || reserved.status !== 'queued') throw invalid('Delivery does not own this queued run.')
271
- } else {
272
- runId = newId()
273
- saveRun(root, this.runRecord(live, runId, text || null))
274
- copyToRun(root, live.input.sessionFolder, runId)
275
- }
276
- return this.options.runs.start(sessionId, runId)
277
- }
278
-
279
- private async decide(live: Live, run: ActiveRun, tool: string, args: unknown): Promise<PolicyReply> {
280
- const record = loadRun(this.options.env.root, run.runId)
281
- if (!isActiveStatus(record.status)) throw invalid('The run is no longer active.')
282
- const call = { run: record, caller: { ...live.caller, runId: run.runId }, tool, args }
283
- const { policy } = this.options
284
- if (policy.scope) {
285
- const scope = await policy.scope(call)
286
- if (!scope.allowed && !scope.requiresApproval) return { allowed: false, reason: scope.reason ?? 'Outside what this session may do.' }
287
- try {
288
- await policy.authorize?.(call)
289
- } catch (error) {
290
- return { allowed: false, reason: error instanceof Error ? error.message : 'Tool unavailable in the settings.' }
291
- }
292
- return { allowed: scope.allowed, requiresApproval: !!scope.requiresApproval, reason: scope.reason ?? null }
293
- }
294
- // With no application policy: reads run, a read-only session refuses the rest, and anything else asks.
295
- const name = tool.toLowerCase()
296
- if (READ_ONLY_TOOLS.has(name) || this.options.apps.toolNames.includes(name as never)) return { allowed: true }
297
- if (live.input.readOnly) return { allowed: false, reason: 'This session is read-only.' }
298
- return { allowed: false, requiresApproval: true, reason: 'This native action requires approval.' }
299
- }
300
-
301
- /**
302
- * Prepares a `pi` terminal session and returns what to spawn. The caller must report the
303
- * process's end with `dispose`, also when it never starts.
304
- */
305
- async prepare(input: TerminalPrepareInput): Promise<TerminalLaunch> {
306
- const { env, accounts, apps, bus } = this.options
307
- const { root } = env
308
- if (!input?.sessionId || !input.cwd || !input.sessionFolder) throw invalid('A terminal session needs an id, a working folder, and its own folder.')
309
- await this.dispose(input.sessionId)
310
- const command = resolvePiCommand({ platform: process.platform, node: this.assets.node, programOverride: this.options.program })
311
- // A pinned account is used as it is; it is never exchanged for another one.
312
- const account = input.accountId ? accounts.find(input.accountId) : accounts.resolve(null, null)
313
- const launch = launchEnv(accounts.dir, account)
314
- const loading = (await this.options.plugins?.loading({ cwd: input.cwd, agentDir: configDir(accounts.dir, account), install: true, caller: { projectId: input.projectId ?? null } })) ?? null
315
- await this.socket.listen()
316
- await accounts.terminalBegin(account)
317
-
318
- const sessionId = input.sessionId
319
- const caller: CallerContext = { sessionId, projectId: input.projectId ?? null, actor: 'Code', surface: 'cli' }
320
- let token: string | null = null
321
- try {
322
- const broker = input.connections === false ? null : apps.grant({ sessionId, runId: null, caller, readOnly: !!input.readOnly, depth: 0 })
323
- // The session keeps these instructions; each of its runs records a copy, and a memory
324
- // block that changes later is sent along as a note.
325
- const pack = compile(env, caller, { input: '', ...input.launch })
326
- record(root, caller, pack)
327
- mkdirSync(this.historyDir(input), { recursive: true })
328
- saveForSession(input.sessionFolder, pack)
329
-
330
- const live: Live = {
331
- input,
332
- account,
333
- broker,
334
- caller,
335
- token: '',
336
- controller: new TerminalController({
337
- sessionId,
338
- nativeSessionId: input.nativeSessionId ?? null,
339
- begin: ({ reservedRunId, text }) => this.begin(live, reservedRunId, text),
340
- policy: (run, tool, args) => this.decide(live, run, tool, args),
341
- native: (nativeSessionId) => bus.emit({ type: 'terminal.native', sessionId, nativeSessionId }),
342
- telemetry: (event) => bus.emit({ type: 'terminal.telemetry', sessionId, event })
343
- })
344
- }
345
- token = this.socket.issue({
346
- sessionId,
347
- caller: () => ({ ...caller, runId: live.controller.activeRun?.runId ?? null }),
348
- broker,
349
- terminal: { accept: (event, data) => live.controller.accept(event, data), disconnected: () => live.controller.disconnected() }
350
- })
351
- live.token = token
352
- this.sessions.set(sessionId, live)
353
-
354
- const args = [...command.argsPrefix, '--append-system-prompt', render(env, pack)]
355
- if (input.model) args.push('--model', input.model)
356
- if (loading) {
357
- // Pi's own discovery is off: the terminal loads what the harness found and nothing else.
358
- args.push('--no-extensions', '--no-skills', '--no-prompt-templates', '--no-themes')
359
- const enabled = resources(root, input.projectId ?? null)
360
- for (const path of [...loading.extensionPaths, ...loading.builtins]) args.push('--extension', path)
361
- for (const path of [...enabled.skillPaths, ...loading.skillPaths]) args.push('--skill', path)
362
- for (const path of [...enabled.promptPaths, ...loading.promptPaths]) args.push('--prompt-template', path)
363
- for (const path of loading.themePaths) args.push('--theme', path)
364
- }
365
- // Last, so its gate sees a tool call as every other extension left it.
366
- args.push('--extension', this.assets.piExtension, '--session-dir', this.historyDir(input))
367
- if (input.nativeSessionId) args.push('--session', input.nativeSessionId)
368
- return {
369
- program: command.program,
370
- args,
371
- env: {
372
- ...launch,
373
- ...(process.platform === 'win32' ? { XINGULAR_HARNESS_NODE: this.assets.node, XINGULAR_HARNESS_CLI: this.assets.cli } : {}),
374
- ...prependSearchPath(this.ensureCommands(), searchPath()),
375
- [SOCKET_ENV]: this.socket.path,
376
- [TOKEN_ENV]: token
377
- },
378
- accountId: account.id,
379
- nativeSessionId: input.nativeSessionId ?? null
380
- }
381
- } catch (error) {
382
- if (token) this.socket.revoke(token)
383
- this.sessions.delete(sessionId)
384
- apps.revokeSession(sessionId)
385
- await accounts.terminalEnd(account).catch(() => undefined)
386
- throw error
387
- }
388
- }
389
-
390
- /** Hands the terminal an instruction as a new run. Resolves once the native session has taken it. */
391
- async send(input: { sessionId: string; runId?: string | null; text: string }): Promise<{ runId: string }> {
392
- const { env } = this.options
393
- const { root } = env
394
- if (!input.text?.trim()) throw invalid('Message is empty.')
395
- const live = this.live(input.sessionId)
396
- if (this.options.runs.activeForSession(input.sessionId) || live.controller.state().active) throw new HarnessError('session_busy', 'This session is still working.')
397
- const runId = input.runId || newId()
398
- if (findRun(root, runId)) throw invalid('This run already exists.')
399
- saveRun(root, this.runRecord(live, runId, input.text))
400
- const note = memoryDelta(env, live.input.sessionFolder, { ...live.caller, runId })
401
- copyToRun(root, live.input.sessionFolder, runId)
402
- try {
403
- await live.controller.send(runId, note ? `${note}\n\n${input.text}` : input.text)
404
- } catch (error) {
405
- updateRun(root, runId, (run) => {
406
- if (!isActiveStatus(run.status)) return
407
- run.status = 'failed'
408
- run.endedAt = now()
409
- })
410
- throw error
411
- }
412
- return { runId }
413
- }
414
-
415
- /** What the person typed into the terminal. */
416
- input(sessionId: string, data: string): void {
417
- this.sessions.get(sessionId)?.controller.onInput(data)
418
- }
419
-
420
- state(sessionId: string): { ready: boolean; dirty: boolean; active: boolean } {
421
- return this.live(sessionId).controller.state()
422
- }
423
-
424
- has(sessionId: string): boolean {
425
- return this.sessions.has(sessionId)
426
- }
427
-
428
- /** The terminal process ended (or never started): its turn, tokens, and written credentials go with it. */
429
- async dispose(sessionId: string): Promise<void> {
430
- const live = this.sessions.get(sessionId)
431
- if (!live) return
432
- this.sessions.delete(sessionId)
433
- live.controller.dispose()
434
- this.socket.revoke(live.token)
435
- this.options.apps.revokeSession(sessionId)
436
- await this.options.accounts.terminalEnd(live.account).catch((error) => log('terminal credentials', error instanceof Error ? error.message : String(error)))
437
- }
438
-
439
- async close(): Promise<void> {
440
- await Promise.allSettled([...this.sessions.keys()].map((sessionId) => this.dispose(sessionId)))
441
- await this.socket.close()
442
- }
443
- }
@@ -1,45 +0,0 @@
1
- // Asking the person a question and waiting for the answer: part of every session.
2
- import type { ActiveRun, QuestionAnswer } from '../sessions/registry'
3
- import type { ToolSpec } from './types'
4
-
5
- export const ASK_USER = 'ask_user'
6
- const MAX_OPTIONS = 6
7
-
8
- const text = (value: unknown): string => (typeof value === 'string' ? value.trim() : '')
9
-
10
- /** The answer as the model reads it. */
11
- export function describeAnswer(answer: QuestionAnswer): string {
12
- const parts: string[] = []
13
- if (answer.selected.length) parts.push(`The user chose: ${answer.selected.join(', ')}.`)
14
- if (answer.text) parts.push(answer.selected.length ? `They added: ${answer.text}` : `The user answered: ${answer.text}`)
15
- return parts.join(' ') || 'The user did not answer.'
16
- }
17
-
18
- export function askUserTool(run: ActiveRun): ToolSpec {
19
- return {
20
- name: ASK_USER,
21
- label: 'Ask the user',
22
- description:
23
- 'Ask the user a question and wait for the answer. Offer up to 6 short options when the choices are clear; ' +
24
- 'set multiSelect when several can apply. The user can also type their own answer. Use it when you need a decision, not for small talk.',
25
- parameters: (Type) =>
26
- Type.Object({
27
- question: Type.String({ description: 'The question, in one sentence' }),
28
- options: Type.Optional(
29
- Type.Array(Type.Object({ label: Type.String({ description: 'A short choice' }), description: Type.Optional(Type.String({ description: 'One line about what it means' })) }), { maxItems: MAX_OPTIONS })
30
- ),
31
- multiSelect: Type.Optional(Type.Boolean()),
32
- allowText: Type.Optional(Type.Boolean({ description: 'Let the user type their own answer (default true)' }))
33
- }),
34
- execute: async (input) => {
35
- const question = text(input.question)
36
- if (!question) return 'The question is empty.'
37
- const options = (Array.isArray(input.options) ? input.options : [])
38
- .map((option) => ({ label: text((option as { label?: unknown }).label), description: text((option as { description?: unknown }).description) }))
39
- .filter((option) => option.label)
40
- .slice(0, MAX_OPTIONS)
41
- .map((option) => (option.description ? option : { label: option.label }))
42
- return describeAnswer(await run.requestAnswer({ question, options, multiSelect: options.length > 1 && input.multiSelect === true, allowText: options.length === 0 || input.allowText !== false }))
43
- }
44
- }
45
- }
@@ -1,187 +0,0 @@
1
- // The memory and Wiki tools a session gets, defined once. An SDK session gets them as Pi tools;
2
- // a terminal session gets them from the `xagent-wiki` command or the bundled MCP server. All of
3
- // them reach the same calls.
4
-
5
- export type WikiCall =
6
- | 'memory.append' | 'memory.replace' | 'memory.rethink'
7
- | 'recall.search' | 'recall.read'
8
- | 'wiki.entrypoint' | 'wiki.search' | 'wiki.read' | 'wiki.list' | 'wiki.skill' | 'wiki.memory' | 'wiki.propose'
9
-
10
- /** A JSON Schema object, kept loose so TypeBox, MCP, and the CLI can all use it. */
11
- export type JsonSchema = { type: string; properties?: Record<string, unknown>; required?: string[]; [key: string]: unknown }
12
-
13
- export interface WikiToolDefinition {
14
- name: string
15
- call: WikiCall
16
- label: string
17
- description: string
18
- parameters: JsonSchema
19
- /** The compiled prompt is injected at launch; the tool exists for sessions that need it again. */
20
- bootstrap?: boolean
21
- }
22
-
23
- /** The kinds of entry a model names. A fact was called `memory` before; that word is still accepted. */
24
- export const WIKI_ENTRY_KINDS = ['page', 'fact', 'block', 'skill', 'rule', 'prompt'] as const
25
- export const WIKI_PAGE_TYPES = ['project', 'person', 'concept', 'decision', 'summary', 'question', 'reference'] as const
26
- export const WIKI_MEMORY_KINDS = ['preference', 'fact', 'decision', 'feedback'] as const
27
- export const WIKI_LINK_TYPES = ['references', 'depends_on', 'supersedes', 'contradicts', 'produced_by', 'uses'] as const
28
-
29
- const text = (description: string) => ({ type: 'string', description })
30
- const block = text('The block\'s label as shown in your memory blocks: user, persona, notes, project/<slug>, or a shared block\'s label')
31
-
32
- /** Core memory: the blocks that are always in the caller's context. */
33
- export const MEMORY_TOOLS: WikiToolDefinition[] = [
34
- {
35
- name: 'memory_append',
36
- call: 'memory.append',
37
- label: 'Add to memory',
38
- description:
39
- 'Add a line or short passage to the end of one of your memory blocks. Use it when you learn something worth keeping across conversations: about the user, about how you work, or about a project. The change is saved at once and the user can undo it.',
40
- parameters: { type: 'object', properties: { block, text: text('What to add') }, required: ['block', 'text'] }
41
- },
42
- {
43
- name: 'memory_replace',
44
- call: 'memory.replace',
45
- label: 'Correct memory',
46
- description: 'Replace one exact passage in a memory block, to correct or remove something that is no longer true. Copy the old passage exactly; pass an empty new passage to delete it.',
47
- parameters: { type: 'object', properties: { block, old: text('The exact passage to replace'), new: text('What replaces it') }, required: ['block', 'old', 'new'] }
48
- },
49
- {
50
- name: 'memory_rethink',
51
- call: 'memory.rethink',
52
- label: 'Rewrite memory',
53
- description: 'Rewrite a whole memory block, to condense it when it is close to its limit or has grown repetitive. Keep everything that is still true and useful.',
54
- parameters: { type: 'object', properties: { block, body: text('The complete new content of the block') }, required: ['block', 'body'] }
55
- }
56
- ]
57
-
58
- /** History: what was said and done in earlier conversations and runs. */
59
- export const RECALL_TOOLS: WikiToolDefinition[] = [
60
- {
61
- name: 'history_search',
62
- call: 'recall.search',
63
- label: 'Search history',
64
- description:
65
- 'Search what was said and done before: your earlier conversations (including a chat the user cleared), tool use, and Harness runs. Any word may match; the best matches come first. An agent searches its own conversations unless scope is "all" or a project is given. A Harness session searches Harness runs in its own project.',
66
- parameters: {
67
- type: 'object',
68
- properties: {
69
- query: text('Words to look for'),
70
- scope: { type: 'string', enum: ['mine', 'all'], description: 'mine (default): your own conversations. all: every conversation and Harness run.' },
71
- project: text('Only Harness runs in this project (its name or slug)'),
72
- since: text('Only from this date on, as YYYY-MM-DD'),
73
- limit: { type: 'integer', minimum: 1, maximum: 30 }
74
- },
75
- required: ['query']
76
- }
77
- },
78
- {
79
- name: 'history_read',
80
- call: 'recall.read',
81
- label: 'Read a run',
82
- description: 'Read one earlier run in order: the request, the replies, and the tools used. Pass a run id from history_search.',
83
- parameters: { type: 'object', properties: { run: text('Run id') }, required: ['run'] }
84
- }
85
- ]
86
-
87
- export const WIKI_TOOLS: WikiToolDefinition[] = [
88
- ...MEMORY_TOOLS,
89
- ...RECALL_TOOLS,
90
- {
91
- name: 'wiki_entrypoint',
92
- call: 'wiki.entrypoint',
93
- label: 'Context pack',
94
- description: 'Your {product} context pack again: memory blocks, rules, the skills index, the project map, and tool guidance. It is already in your instructions at the start; call this to see its current state.',
95
- parameters: { type: 'object', properties: {} },
96
- bootstrap: true
97
- },
98
- {
99
- name: 'wiki_search',
100
- call: 'wiki.search',
101
- label: 'Search Wiki',
102
- description:
103
- 'Search everything written down in {product}: the Library, every project namespace, facts, skills, rules, and prompts. Results from the current project rank higher. Each hit has a path and an [id@revision] citation.',
104
- parameters: {
105
- type: 'object',
106
- properties: {
107
- query: text('What to look for'),
108
- kinds: { type: 'array', items: { type: 'string', enum: [...WIKI_ENTRY_KINDS] }, description: 'Only these kinds of entries' },
109
- namespace: text('Only this namespace, such as /library or /projects/<name>'),
110
- limit: { type: 'integer', minimum: 1, maximum: 50 }
111
- },
112
- required: ['query']
113
- }
114
- },
115
- {
116
- name: 'wiki_read',
117
- call: 'wiki.read',
118
- label: 'Read Wiki entry',
119
- description: 'Read one Wiki page, fact, skill, rule, or prompt in full, with its sources, links, and backlinks. Pass an id (arch, skills/review) or a Wiki path (/projects/xagent/arch).',
120
- parameters: { type: 'object', properties: { id: text('Entry id or Wiki path'), revision: text('Optional pinned revision selected for this reply'), offset: { type: 'integer', minimum: 0, description: 'Character offset when reading a pinned revision; use nextOffset to continue.' } }, required: ['id'] }
121
- },
122
- {
123
- name: 'wiki_list',
124
- call: 'wiki.list',
125
- label: 'List Wiki',
126
- description: 'List Wiki namespaces and pages (optionally in one namespace), or all facts, skills, rules, or prompts.',
127
- parameters: {
128
- type: 'object',
129
- properties: { namespace: text('A namespace such as /library or /projects/<name>'), kind: { type: 'string', enum: [...WIKI_ENTRY_KINDS] } }
130
- }
131
- },
132
- {
133
- name: 'skill_load',
134
- call: 'wiki.skill',
135
- label: 'Load skill',
136
- description: "Load a skill's instructions by name, or list every skill (and which are active) when no name is given. Follow a skill's steps when the task matches it.",
137
- parameters: { type: 'object', properties: { name: text('Skill name or id, such as review or skills/review') } }
138
- },
139
- {
140
- name: 'memory_facts',
141
- call: 'wiki.memory',
142
- label: 'Recall facts',
143
- description: 'Recall facts: short statements, preferences, decisions, and feedback. Without a query it returns the facts that apply to the current project.',
144
- parameters: { type: 'object', properties: { query: text('What to recall'), namespace: text('/ or a project namespace') } }
145
- },
146
- {
147
- name: 'wiki_propose',
148
- call: 'wiki.propose',
149
- label: 'Propose Wiki update',
150
- description:
151
- 'Record durable knowledge. kind "fact" for a short fact, preference, decision, or piece of feedback, "page" to update an existing page or add one about an entity or concept (not about one run), or "skill"/"rule"/"prompt" to suggest a change to those. ' +
152
- 'Cite evidence in sourceRefs: {"kind":"run","ref":"current","excerpt":"…"} with a passage copied exactly from this conversation or run (what the user wrote, or what you already said), a source id, or a URL. ' +
153
- 'A run reference without an excerpt found in the run is not evidence. Cited pages and facts apply right away (with undo); uncited or low-confidence ones, and every skill, rule, or prompt change, wait in the Wiki Inbox for the user. Never include secrets.',
154
- parameters: {
155
- type: 'object',
156
- properties: {
157
- kind: { type: 'string', enum: [...WIKI_ENTRY_KINDS] },
158
- title: text('Title (or the skill/rule/prompt name)'),
159
- body: text('Markdown body. For a fact, a few lines.'),
160
- id: text('Existing id to update'),
161
- type: text(`Page type (${WIKI_PAGE_TYPES.join(', ')}) or what sort of fact (${WIKI_MEMORY_KINDS.join(', ')})`),
162
- namespace: text('Where it belongs: /library, /projects/<name>, or / for a fact that applies everywhere. Defaults to the current project.'),
163
- confidence: { type: 'string', enum: ['high', 'medium', 'low'] },
164
- description: text('One line for a skill, rule, or prompt'),
165
- supersedes: text('Id of a fact this one replaces'),
166
- volatile: { type: 'boolean', description: 'For a fact: true when it describes current state that will change (an open issue list, who is on call)' },
167
- reason: text('Why this change is needed (skills, rules, prompts)'),
168
- sourceRefs: {
169
- type: 'array',
170
- items: { type: 'object', properties: { kind: { type: 'string', enum: ['run', 'source', 'url'] }, ref: { type: 'string' }, excerpt: { type: 'string', description: 'For a run or source: a passage copied exactly from it' } }, required: ['kind'] }
171
- },
172
- links: {
173
- type: 'array',
174
- items: { type: 'object', properties: { toId: { type: 'string' }, type: { type: 'string', enum: [...WIKI_LINK_TYPES] } }, required: ['toId', 'type'] }
175
- }
176
- },
177
- required: ['kind', 'title', 'body']
178
- }
179
- }
180
- ]
181
-
182
- /** Tools agents get when the context pack is already in their instructions. */
183
- /** A tool's description with the application's name in it. */
184
- export const describeTool = (tool: WikiToolDefinition, productName: string): string => tool.description.replaceAll('{product}', productName)
185
-
186
- export const WIKI_AGENT_TOOLS = WIKI_TOOLS.filter((tool) => !tool.bootstrap)
187
- export const WIKI_TOOL_NAMES = WIKI_AGENT_TOOLS.map((tool) => tool.name)