@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,145 @@
1
+ import { matchesKey } from '@earendil-works/pi-tui';
2
+ import { CENTER_DIALOG_PAD, CHROME_PAD, centerDialogBodyRows, centerDialogContentWidth, centerDialogFrame, centerDialogVerticalPad, contentWidth, pageBodyRows, pageFrame, tabIndexAt, tabStrip } from "./chrome.js";
3
+ import { centeredDialogHost, dialogFits, pageRows } from "./dialogGeometry.js";
4
+ export class PageOverlay {
5
+ options;
6
+ focusedValue = false;
7
+ disposed = false;
8
+ pointerLayout;
9
+ hoveredTab;
10
+ constructor(options) {
11
+ this.options = options;
12
+ options.page.activate?.();
13
+ }
14
+ get page() { return this.options.page; }
15
+ get focused() { return this.focusedValue; }
16
+ set focused(value) {
17
+ this.focusedValue = value;
18
+ if (this.options.page.focused !== undefined)
19
+ this.options.page.focused = value;
20
+ }
21
+ invalidate() { }
22
+ handleMouse(event) {
23
+ if (this.disposed)
24
+ return undefined;
25
+ if (event.type === 'wheel') {
26
+ const key = event.wheelDelta !== undefined && event.wheelDelta < 0 ? '\x1b[5~' : '\x1b[6~';
27
+ this.handleInput(key);
28
+ return { handled: true, render: true };
29
+ }
30
+ if (event.type !== 'move' && event.type !== 'click')
31
+ return undefined;
32
+ if (event.type === 'click' && event.button !== 'left')
33
+ return undefined;
34
+ const layout = this.pointerLayout;
35
+ if (!layout)
36
+ return undefined;
37
+ const tabs = this.options.page.tabs();
38
+ const tabX = event.x - layout.contentX;
39
+ if (layout.tabRow !== undefined && event.y === layout.tabRow && tabs.length > 1) {
40
+ const tabIndex = tabIndexAt(tabs, layout.contentWidth, tabX);
41
+ const current = tabs.findIndex(tab => tab.id === this.options.page.activeTab());
42
+ if (event.type === 'move') {
43
+ const nextHover = tabIndex === undefined ? undefined : tabs[tabIndex]?.id;
44
+ if (nextHover === this.hoveredTab)
45
+ return { handled: true, render: false };
46
+ this.hoveredTab = nextHover;
47
+ return { handled: true, render: true };
48
+ }
49
+ const target = tabIndex ?? (tabX < layout.contentWidth / 2
50
+ ? (current - 1 + tabs.length) % tabs.length
51
+ : (current + 1) % tabs.length);
52
+ const delta = (target - Math.max(0, current) + tabs.length) % tabs.length;
53
+ const reverse = (Math.max(0, current) - target + tabs.length) % tabs.length;
54
+ const direction = delta <= reverse ? '\t' : '\x1b[Z';
55
+ const steps = Math.min(delta, reverse);
56
+ for (let index = 0; index < steps; index += 1)
57
+ this.options.page.handleInput(direction);
58
+ this.hoveredTab = undefined;
59
+ return { handled: true, render: true };
60
+ }
61
+ let hoverChanged = false;
62
+ if (event.type === 'move' && this.hoveredTab) {
63
+ this.hoveredTab = undefined;
64
+ hoverChanged = true;
65
+ }
66
+ if (event.y < layout.bodyStart)
67
+ return hoverChanged ? { handled: true, render: true } : undefined;
68
+ const handled = this.options.page.handleMouse?.({ ...event, x: tabX, y: event.y - layout.bodyStart });
69
+ return handled ?? (hoverChanged ? { handled: true, render: true } : undefined);
70
+ }
71
+ handleInput(data) {
72
+ if (this.disposed)
73
+ return;
74
+ if (matchesKey(data, 'ctrl+c')) {
75
+ this.options.close();
76
+ return;
77
+ }
78
+ const centered = centeredDialogHost(this.options.tui) && dialogFits(this.options.tui.terminal.columns, this.options.tui.terminal.rows);
79
+ const tabs = this.options.page.tabs();
80
+ const input = centered && tabs.length > 1
81
+ ? matchesKey(data, 'right') ? '\t' : matchesKey(data, 'left') ? '\x1b[Z' : data
82
+ : data;
83
+ if (this.options.page.handleInput(input)) {
84
+ this.options.changed();
85
+ return;
86
+ }
87
+ if (matchesKey(data, 'escape'))
88
+ this.options.close();
89
+ }
90
+ render(width) {
91
+ if (this.disposed)
92
+ return [];
93
+ const rows = pageRows(this.options.tui);
94
+ const page = this.options.page;
95
+ const tabs = page.tabs();
96
+ if (width < 1 || rows < 1 || !tabs.length)
97
+ return [];
98
+ const theme = this.options.theme();
99
+ const centered = centeredDialogHost(this.options.tui) && dialogFits(this.options.tui.terminal.columns, this.options.tui.terminal.rows);
100
+ const inner = centered ? centerDialogContentWidth(width) : contentWidth(width);
101
+ if (centered) {
102
+ const tabRows = tabs.length > 1 ? 1 : 0;
103
+ const bodyStart = centerDialogVerticalPad(rows) + 2 + tabRows;
104
+ this.pointerLayout = {
105
+ tabRow: tabRows ? bodyStart - 1 : undefined,
106
+ bodyStart,
107
+ contentX: CENTER_DIALOG_PAD,
108
+ contentWidth: inner,
109
+ centered
110
+ };
111
+ const body = [
112
+ ...(tabRows ? [tabStrip(tabs, page.activeTab(), inner, theme, 'top', this.hoveredTab)] : []),
113
+ ...page.render(inner, Math.max(0, centerDialogBodyRows(rows) - tabRows))
114
+ ];
115
+ return centerDialogFrame({ title: tabs.find(tab => tab.id === page.activeTab())?.title ?? 'Page', body, width, rows, theme });
116
+ }
117
+ this.pointerLayout = {
118
+ tabRow: 0,
119
+ bodyStart: 2,
120
+ contentX: CHROME_PAD,
121
+ contentWidth: contentWidth(width),
122
+ centered
123
+ };
124
+ const footer = [
125
+ page.hint(),
126
+ tabs.length > 1 ? 'Tab/Shift+Tab sections' : '',
127
+ 'Esc close'
128
+ ].filter(Boolean).join(' · ');
129
+ return pageFrame({
130
+ title: '',
131
+ headerLine: tabStrip(tabs, page.activeTab(), inner, theme, 'top', this.hoveredTab),
132
+ body: page.render(inner, pageBodyRows(rows)),
133
+ footer,
134
+ width,
135
+ rows,
136
+ theme
137
+ });
138
+ }
139
+ dispose() {
140
+ if (this.disposed)
141
+ return;
142
+ this.disposed = true;
143
+ this.options.page.dispose?.();
144
+ }
145
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * The Accounts page: one row per account with its health, the selected account's details beneath,
3
+ * and Pools as a second section. Enter on an account opens its actions; the actions themselves are
4
+ * the ones the `/accounts` menu of a native `pi` session uses.
5
+ */
6
+ import type { Theme } from '@earendil-works/pi-coding-agent';
7
+ import { type AccountsCall, type AccountsUi, type SessionAccount } from "../../accountsMenu.js";
8
+ import type { TerminalPage } from "../page.js";
9
+ import type { TerminalMouseInput } from "../mouse.js";
10
+ export interface AccountsPageOptions {
11
+ theme: () => Theme;
12
+ call: AccountsCall;
13
+ /** The account this session runs on. */
14
+ session: () => SessionAccount | null;
15
+ ui: AccountsUi;
16
+ /** The session is switching accounts: the host ends it so the launcher can start it again. */
17
+ relaunch(): void;
18
+ changed(): void;
19
+ }
20
+ export declare class AccountsPage implements TerminalPage {
21
+ private readonly options;
22
+ private overview;
23
+ private error;
24
+ private section;
25
+ private busy;
26
+ private disposed;
27
+ private readonly list;
28
+ constructor(options: AccountsPageOptions);
29
+ get focused(): boolean;
30
+ set focused(value: boolean);
31
+ activate(): void;
32
+ dispose(): void;
33
+ tabs(): readonly [{
34
+ readonly id: "accounts";
35
+ readonly title: "Accounts";
36
+ }, {
37
+ readonly id: "pools";
38
+ readonly title: "Pools";
39
+ }];
40
+ activeTab(): string;
41
+ hint(): string;
42
+ private reload;
43
+ /** Searching looks through accounts and pools together; otherwise the page shows the current section. */
44
+ private fill;
45
+ private accountRows;
46
+ private poolRows;
47
+ private account;
48
+ /** Runs one thing at a time and always reads the accounts again afterwards. */
49
+ private guarded;
50
+ private activateRow;
51
+ handleMouse(event: TerminalMouseInput): import("@earendil-works/pi-tui").TuiMouseEventResult | undefined;
52
+ handleInput(data: string): boolean;
53
+ render(width: number, rows: number): string[];
54
+ }
@@ -0,0 +1,181 @@
1
+ import { matchesKey, truncateToWidth } from '@earendil-works/pi-tui';
2
+ import { HEALTH, accountActions, accountDetails, addAccount, editPool, runAccountAction } from "../../accountsMenu.js";
3
+ import { safeText } from "../chrome.js";
4
+ import { FilterList } from "../list.js";
5
+ const SECTIONS = [{ id: 'accounts', title: 'Accounts' }, { id: 'pools', title: 'Pools' }];
6
+ const ADD = 'action:add';
7
+ const CHECK_ALL = 'action:check-all';
8
+ const NEW_POOL = 'action:new-pool';
9
+ const BACK = 'Back';
10
+ const HEALTH_TONE = { ok: 'success', limited: 'warning', auth_expired: 'error', signed_out: 'error', error: 'error', unknown: 'dim' };
11
+ export class AccountsPage {
12
+ options;
13
+ overview;
14
+ error;
15
+ section = 'accounts';
16
+ busy = false;
17
+ disposed = false;
18
+ list;
19
+ constructor(options) {
20
+ this.options = options;
21
+ this.list = new FilterList({
22
+ theme: options.theme, search: 'always', noun: ['row', 'rows'], empty: 'Nothing here yet',
23
+ searchContext: () => 'accounts and pools',
24
+ onActivate: row => { void this.activateRow(row); }
25
+ });
26
+ }
27
+ get focused() { return this.list.focused; }
28
+ set focused(value) { this.list.focused = value; }
29
+ activate() { void this.reload(); }
30
+ dispose() { this.disposed = true; }
31
+ tabs() { return SECTIONS; }
32
+ activeTab() { return this.section; }
33
+ hint() { return this.list.query ? 'Enter open · Esc clear' : 'Enter actions · type to search'; }
34
+ async reload() {
35
+ try {
36
+ this.overview = await this.options.call('accounts.list');
37
+ this.error = undefined;
38
+ }
39
+ catch (error) {
40
+ this.error = error instanceof Error ? error.message : String(error);
41
+ }
42
+ if (this.disposed)
43
+ return;
44
+ this.fill();
45
+ this.options.changed();
46
+ }
47
+ /** Searching looks through accounts and pools together; otherwise the page shows the current section. */
48
+ fill() {
49
+ this.list.setRows(this.list.query ? [...this.accountRows(), ...this.poolRows()] : this.section === 'accounts' ? this.accountRows() : this.poolRows());
50
+ }
51
+ accountRows() {
52
+ const overview = this.overview;
53
+ if (!overview)
54
+ return [];
55
+ const session = this.options.session();
56
+ const accounts = overview.accounts.map(account => ({
57
+ id: `account:${account.id}`, group: 'Accounts',
58
+ label: `${account.isDefault ? '●' : '○'} ${safeText(account.label)}`,
59
+ detail: `${HEALTH[account.state.health] ?? HEALTH.unknown}${session?.accountId === account.id ? ' · this session' : ''}`,
60
+ tone: HEALTH_TONE[account.state.health] ?? 'dim',
61
+ searchText: `${account.label} ${account.state.identity ?? ''} ${HEALTH[account.state.health] ?? ''}`
62
+ }));
63
+ return [
64
+ ...accounts,
65
+ { id: ADD, label: '+ Add account', group: 'Actions', tone: 'accent' },
66
+ { id: CHECK_ALL, label: '⟳ Check all accounts', group: 'Actions', tone: 'accent' }
67
+ ];
68
+ }
69
+ poolRows() {
70
+ const overview = this.overview;
71
+ if (!overview)
72
+ return [];
73
+ const names = new Map(overview.accounts.map(account => [account.id, account.label]));
74
+ return [
75
+ ...overview.pools.map(pool => ({
76
+ id: `pool:${pool.id}`, group: 'Pools', label: safeText(pool.label),
77
+ detail: pool.accountIds.map(id => names.get(id) ?? 'removed account').join(' → '), tone: 'muted'
78
+ })),
79
+ { id: NEW_POOL, label: '+ New pool', group: 'Actions', tone: 'accent' }
80
+ ];
81
+ }
82
+ account(id) { return this.overview?.accounts.find(account => `account:${account.id}` === id); }
83
+ /** Runs one thing at a time and always reads the accounts again afterwards. */
84
+ async guarded(work) {
85
+ if (this.busy)
86
+ return;
87
+ this.busy = true;
88
+ try {
89
+ await work();
90
+ }
91
+ catch (error) {
92
+ this.options.ui.notify(error instanceof Error ? error.message : String(error), 'error');
93
+ }
94
+ finally {
95
+ this.busy = false;
96
+ }
97
+ await this.reload();
98
+ }
99
+ activateRow(row) {
100
+ return this.guarded(async () => {
101
+ const { ui, call } = this.options;
102
+ const overview = this.overview;
103
+ if (!overview)
104
+ return;
105
+ if (row.id === ADD) {
106
+ await addAccount(ui, call);
107
+ return;
108
+ }
109
+ if (row.id === CHECK_ALL) {
110
+ try {
111
+ await call('accounts.refresh');
112
+ }
113
+ catch (error) {
114
+ ui.notify(error instanceof Error ? error.message : String(error), 'error');
115
+ }
116
+ return;
117
+ }
118
+ if (row.id === NEW_POOL) {
119
+ await editPool(ui, call, overview, null);
120
+ return;
121
+ }
122
+ const pool = overview.pools.find(candidate => `pool:${candidate.id}` === row.id);
123
+ if (pool) {
124
+ const action = await ui.select(pool.label, ['Edit', 'Delete', BACK]);
125
+ if (action === 'Edit')
126
+ await editPool(ui, call, overview, pool);
127
+ else if (action === 'Delete' && await ui.confirm(`Delete ${pool.label}?`, 'The accounts stay. Only the pool is removed.')) {
128
+ try {
129
+ await call('accounts.removePool', { poolId: pool.id });
130
+ }
131
+ catch (error) {
132
+ ui.notify(error instanceof Error ? error.message : String(error), 'error');
133
+ }
134
+ }
135
+ return;
136
+ }
137
+ const account = this.account(row.id);
138
+ if (!account)
139
+ return;
140
+ const isSession = this.options.session()?.accountId === account.id;
141
+ const action = await ui.select(`${account.label} · ${HEALTH[account.state.health] ?? HEALTH.unknown}`, [...accountActions(account, isSession, false), BACK]);
142
+ if (!action || action === BACK)
143
+ return;
144
+ const outcome = await runAccountAction(ui, call, overview, account, action);
145
+ if (outcome === 'relaunch')
146
+ this.options.relaunch();
147
+ });
148
+ }
149
+ handleMouse(event) {
150
+ return this.list.handleMouse(event);
151
+ }
152
+ handleInput(data) {
153
+ if (matchesKey(data, 'tab') || matchesKey(data, 'shift+tab')) {
154
+ if (!this.list.query) {
155
+ this.section = this.section === 'accounts' ? 'pools' : 'accounts';
156
+ this.fill();
157
+ }
158
+ return true;
159
+ }
160
+ const before = this.list.query;
161
+ const used = this.list.handleInput(data);
162
+ if (this.list.query !== before)
163
+ this.fill();
164
+ return used;
165
+ }
166
+ render(width, rows) {
167
+ const theme = this.options.theme();
168
+ if (width < 1 || rows < 1)
169
+ return [];
170
+ if (!this.overview)
171
+ return [theme.fg(this.error ? 'error' : 'dim', this.error ? `Could not read accounts: ${this.error}` : 'Reading accounts…')];
172
+ const selected = this.section === 'accounts' ? this.account(this.list.selected?.id ?? '') : undefined;
173
+ const details = selected ? accountDetails(selected).split('\n').slice(1) : [];
174
+ // The list gets the rows it needs first; the details take what is left.
175
+ const detailRows = Math.min(details.length, 9, Math.max(0, rows - 2 - this.list.height));
176
+ const lines = this.list.render(width, Math.max(2, rows - 1 - (detailRows ? detailRows + 1 : 0)));
177
+ if (detailRows)
178
+ lines.push('', ...details.slice(0, detailRows).map(line => theme.fg('muted', line)));
179
+ return lines.slice(0, rows).map(line => truncateToWidth(line, width, ''));
180
+ }
181
+ }
@@ -0,0 +1,47 @@
1
+ import type { Theme } from '@earendil-works/pi-coding-agent';
2
+ import { type ComponentItem } from "../../../variant/components.js";
3
+ import type { MenuUi } from "../../pluginMenu.js";
4
+ import { type TabInfo } from "../chrome.js";
5
+ import type { TerminalPage } from "../page.js";
6
+ import type { TerminalMouseInput } from "../mouse.js";
7
+ export interface ComponentLibrarySnapshot {
8
+ items: ComponentItem[];
9
+ addedIds: string[];
10
+ writable: boolean;
11
+ fingerprint: string | null;
12
+ }
13
+ export interface ComponentAddedResult {
14
+ fingerprint: string;
15
+ alreadyPresent: boolean;
16
+ }
17
+ export type ComponentPageCall = <T = unknown>(method: string, params?: Record<string, unknown>) => Promise<T>;
18
+ export interface ComponentsPageOptions {
19
+ theme: () => Theme;
20
+ call: ComponentPageCall;
21
+ ui: MenuUi;
22
+ notify(message: string, type?: string): void;
23
+ changed(): void;
24
+ }
25
+ export declare class ComponentsPage implements TerminalPage {
26
+ private readonly options;
27
+ private snapshot;
28
+ private section;
29
+ private error;
30
+ private busy;
31
+ private disposed;
32
+ private readonly list;
33
+ constructor(options: ComponentsPageOptions);
34
+ get focused(): boolean;
35
+ set focused(value: boolean);
36
+ tabs(): readonly TabInfo[];
37
+ activeTab(): string;
38
+ activate(): void;
39
+ dispose(): void;
40
+ hint(): string;
41
+ private load;
42
+ private fill;
43
+ private add;
44
+ handleMouse(event: TerminalMouseInput): import("@earendil-works/pi-tui").TuiMouseEventResult | undefined;
45
+ handleInput(data: string): boolean;
46
+ render(width: number, rows: number): string[];
47
+ }
@@ -0,0 +1,119 @@
1
+ import { matchesKey, truncateToWidth, wrapTextWithAnsi } from '@earendil-works/pi-tui';
2
+ import { safeText } from "../chrome.js";
3
+ import { FilterList } from "../list.js";
4
+ const SECTIONS = [
5
+ { id: 'skills', title: 'Skills' },
6
+ { id: 'prompts', title: 'Prompts' },
7
+ { id: 'rules', title: 'Rules' }
8
+ ];
9
+ export class ComponentsPage {
10
+ options;
11
+ snapshot;
12
+ section = 'skills';
13
+ error;
14
+ busy = false;
15
+ disposed = false;
16
+ list;
17
+ constructor(options) {
18
+ this.options = options;
19
+ this.list = new FilterList({
20
+ theme: options.theme, search: 'always', noun: ['item', 'items'], empty: 'This library section is empty.',
21
+ onActivate: row => { void this.add(row.data); }
22
+ });
23
+ }
24
+ get focused() { return this.list.focused; }
25
+ set focused(value) { this.list.focused = value; }
26
+ tabs() { return SECTIONS; }
27
+ activeTab() { return this.section; }
28
+ activate() { if (!this.snapshot)
29
+ void this.load(); }
30
+ dispose() { this.disposed = true; }
31
+ hint() { return this.list.query ? 'Enter add · Esc clear' : 'Enter add eligible item · type to search'; }
32
+ async load() {
33
+ try {
34
+ this.snapshot = await this.options.call('terminal.components.list');
35
+ this.error = undefined;
36
+ }
37
+ catch (error) {
38
+ this.error = error instanceof Error ? error.message : String(error);
39
+ }
40
+ if (this.disposed)
41
+ return;
42
+ this.fill();
43
+ this.options.changed();
44
+ }
45
+ fill() {
46
+ const items = (this.snapshot?.items ?? []).filter(item => item.kind === this.section);
47
+ const added = new Set(this.snapshot?.addedIds ?? []);
48
+ this.list.setRows(items.map(item => {
49
+ const exists = added.has(item.id);
50
+ const detail = exists ? 'In Harness' : item.kind === 'prompts' ? 'Library only' : this.snapshot?.writable ? 'Add for next session' : 'Browse only';
51
+ return {
52
+ id: item.id, label: safeText(item.name), group: item.builtin ? 'Built-in' : 'Library',
53
+ detail, tone: exists ? 'success' : item.kind === 'prompts' ? 'dim' : 'muted',
54
+ searchText: item.name + ' ' + item.description + ' ' + item.id, data: item
55
+ };
56
+ }));
57
+ }
58
+ async add(item) {
59
+ if (!item || this.busy)
60
+ return;
61
+ if (item.kind === 'prompts') {
62
+ this.options.notify('Prompts stay in the library and cannot be added to a Variant.', 'info');
63
+ return;
64
+ }
65
+ if ((this.snapshot?.addedIds ?? []).includes(item.id)) {
66
+ this.options.notify('This item is already in the current Variant.', 'info');
67
+ return;
68
+ }
69
+ if (!this.snapshot?.writable) {
70
+ this.options.notify('This terminal has no writable Harness scope. The library is browse-only.', 'warning');
71
+ return;
72
+ }
73
+ const approved = await this.options.ui.confirm('Add ' + item.name + '?', 'This creates a new Variant version for the next session. The running terminal keeps its pinned version.');
74
+ if (!approved)
75
+ return;
76
+ this.busy = true;
77
+ try {
78
+ const result = await this.options.call('terminal.components.add', { id: item.id });
79
+ this.options.notify(result.alreadyPresent ? 'This item is already in the current Variant.' : 'Saved for the next session · version ' + result.fingerprint, 'info');
80
+ await this.load();
81
+ }
82
+ catch (error) {
83
+ this.options.notify(error instanceof Error ? error.message : String(error), 'error');
84
+ }
85
+ finally {
86
+ this.busy = false;
87
+ }
88
+ }
89
+ handleMouse(event) {
90
+ return this.list.handleMouse(event);
91
+ }
92
+ handleInput(data) {
93
+ if (matchesKey(data, 'tab') || matchesKey(data, 'shift+tab')) {
94
+ if (!this.list.query) {
95
+ const at = SECTIONS.findIndex(section => section.id === this.section);
96
+ const delta = matchesKey(data, 'shift+tab') ? -1 : 1;
97
+ this.section = SECTIONS[(at + delta + SECTIONS.length) % SECTIONS.length].id;
98
+ this.fill();
99
+ }
100
+ return true;
101
+ }
102
+ return this.list.handleInput(data);
103
+ }
104
+ render(width, rows) {
105
+ const theme = this.options.theme();
106
+ if (width < 1 || rows < 1)
107
+ return [];
108
+ if (!this.snapshot)
109
+ return [theme.fg(this.error ? 'error' : 'dim', this.error ? 'Could not read the component library: ' + this.error : 'Reading the component library…')];
110
+ const selected = this.list.selected?.data;
111
+ const detail = selected && rows >= 8
112
+ ? wrapTextWithAnsi(safeText(selected.description || 'No description.'), width).slice(0, Math.min(3, rows - 4))
113
+ : [];
114
+ const lines = this.list.render(width, Math.max(2, rows - (detail.length ? detail.length + 1 : 0)));
115
+ if (detail.length)
116
+ lines.push('', ...detail.map(line => theme.fg('muted', line)));
117
+ return lines.slice(0, rows).map(line => truncateToWidth(line, width, ''));
118
+ }
119
+ }
@@ -0,0 +1,37 @@
1
+ import type { Theme, ExtensionUIContext } from '@earendil-works/pi-coding-agent';
2
+ import type { TerminalPage } from "../page.js";
3
+ import type { TabInfo } from "../chrome.js";
4
+ interface DoctorPageOptions {
5
+ theme(): Theme;
6
+ call(method: string, params?: Record<string, unknown>): Promise<unknown>;
7
+ selection(): {
8
+ model: string | null;
9
+ tools: string[];
10
+ };
11
+ confirm: ExtensionUIContext['confirm'];
12
+ select: ExtensionUIContext['select'];
13
+ changed(): void;
14
+ }
15
+ export declare class DoctorPage implements TerminalPage {
16
+ private readonly options;
17
+ focused: boolean;
18
+ private report?;
19
+ private error?;
20
+ private timer?;
21
+ private disposed;
22
+ private busy;
23
+ private offset;
24
+ constructor(options: DoctorPageOptions);
25
+ tabs(): readonly TabInfo[];
26
+ activeTab(): string;
27
+ hint(): string;
28
+ activate(): void;
29
+ dispose(): void;
30
+ private start;
31
+ private poll;
32
+ private chooseLive;
33
+ private retry;
34
+ handleInput(data: string): boolean;
35
+ render(width: number, rows: number): string[];
36
+ }
37
+ export {};