@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,124 @@
1
+ import { matchesKey, truncateToWidth, wrapTextWithAnsi } from '@earendil-works/pi-tui';
2
+ import { FilterList } from "../list.js";
3
+ const SECTIONS = [
4
+ { id: 'overview', title: 'Overview' },
5
+ { id: 'tools', title: 'Tools' }
6
+ ];
7
+ const FULL = 'full';
8
+ const NOTE = 'Applies to future approvals only. Hard denials and disabled tools still apply.';
9
+ const FULL_WARNING = 'Automatically approve eligible future requests in every Pi terminal session sharing this local Harness state. Hard denials and disabled tools still apply; human-only requests stay manual unless the host explicitly opts them in. Requests already waiting are not approved.';
10
+ export class PermissionsPage {
11
+ options;
12
+ state;
13
+ section = 'overview';
14
+ error;
15
+ busy = false;
16
+ disposed = false;
17
+ list;
18
+ constructor(options) {
19
+ this.options = options;
20
+ this.list = new FilterList({
21
+ theme: options.theme, search: 'always', noun: ['tool', 'tools'], empty: 'No tools to show',
22
+ onActivate: row => { void this.toggle(row.id); },
23
+ onToggle: row => { void this.toggle(row.id); }
24
+ });
25
+ }
26
+ get focused() { return this.list.focused; }
27
+ set focused(value) { this.list.focused = value; }
28
+ activate() { void this.reload(); }
29
+ dispose() { this.disposed = true; }
30
+ tabs() { return SECTIONS; }
31
+ activeTab() { return this.section; }
32
+ hint() { return this.list.query ? 'Enter toggle · Esc clear' : 'Space or Enter toggle · type to search'; }
33
+ async reload() {
34
+ try {
35
+ this.state = await this.options.permissions();
36
+ this.error = undefined;
37
+ }
38
+ catch (error) {
39
+ this.error = error instanceof Error ? error.message : String(error);
40
+ }
41
+ if (this.disposed)
42
+ return;
43
+ this.fill();
44
+ this.options.changed();
45
+ }
46
+ fill() {
47
+ this.list.setRows(this.rows());
48
+ }
49
+ rows() {
50
+ const state = this.state;
51
+ if (!state)
52
+ return [];
53
+ if (this.section === 'overview') {
54
+ return [{ id: FULL, label: 'Full Permission', group: 'Mode', detail: state.full ? 'ON' : 'OFF', tone: state.full ? 'warning' : 'muted', searchText: 'full permission approve everything' }];
55
+ }
56
+ const granted = new Set(state.globalTools);
57
+ const active = this.options.activeTools();
58
+ const inactive = [...granted].filter(tool => !active.includes(tool));
59
+ const byName = (left, right) => left.localeCompare(right);
60
+ const tool = (name, group) => ({
61
+ id: 'tool:' + name, label: name, group,
62
+ detail: granted.has(name) ? '● allowed everywhere' : '○ asks each time',
63
+ tone: granted.has(name) ? 'success' : 'muted'
64
+ });
65
+ return [
66
+ ...[...active].sort(byName).map(name => tool(name, 'Tools in this session')),
67
+ ...inactive.sort(byName).map(name => tool(name, 'Granted, not active here'))
68
+ ];
69
+ }
70
+ async toggle(id) {
71
+ if (this.busy || !this.state)
72
+ return;
73
+ this.busy = true;
74
+ try {
75
+ if (id === FULL) {
76
+ const desired = !this.state.full;
77
+ const latest = await this.options.permissions();
78
+ if (latest.full !== desired && (!desired || await this.options.confirm('Enable Full Permission?', FULL_WARNING)))
79
+ await this.options.setFullPermission(desired);
80
+ }
81
+ else {
82
+ const tool = id.slice('tool:'.length);
83
+ if (!tool)
84
+ return;
85
+ const desired = !this.state.globalTools.includes(tool);
86
+ const latest = await this.options.permissions();
87
+ if (latest.globalTools.includes(tool) !== desired)
88
+ await this.options.setGlobalTool(tool, desired);
89
+ }
90
+ }
91
+ catch (error) {
92
+ this.options.notify(error instanceof Error ? error.message : String(error), 'error');
93
+ }
94
+ finally {
95
+ this.busy = false;
96
+ }
97
+ await this.reload();
98
+ }
99
+ handleMouse(event) {
100
+ return this.list.handleMouse(event);
101
+ }
102
+ handleInput(data) {
103
+ if (matchesKey(data, 'tab') || matchesKey(data, 'shift+tab')) {
104
+ if (!this.list.query) {
105
+ this.section = this.section === 'overview' ? 'tools' : 'overview';
106
+ this.fill();
107
+ }
108
+ return true;
109
+ }
110
+ return this.list.handleInput(data);
111
+ }
112
+ render(width, rows) {
113
+ const theme = this.options.theme();
114
+ if (width < 1 || rows < 1)
115
+ return [];
116
+ if (!this.state)
117
+ return [theme.fg(this.error ? 'error' : 'dim', this.error ? `Could not read permissions: ${this.error}` : 'Reading permissions…')];
118
+ const note = this.section === 'overview' && rows >= 8 ? wrapTextWithAnsi(NOTE, width).slice(0, 2) : [];
119
+ const lines = this.list.render(width, Math.max(1, rows - (note.length ? note.length + 1 : 0)));
120
+ if (note.length)
121
+ lines.push('', ...note.map(line => theme.fg('dim', line)));
122
+ return lines.slice(0, rows).map(line => truncateToWidth(line, width, ''));
123
+ }
124
+ }
@@ -0,0 +1,57 @@
1
+ /**
2
+ * The Plugins page: what this session loads, switched on or off, with trust for plugin code.
3
+ * Enter opens what can be done with a row; nothing changes without a choice made here. A plugin
4
+ * with settings has a Settings row that opens them as a subpage; Esc goes back to the list.
5
+ */
6
+ import type { Theme } from '@earendil-works/pi-coding-agent';
7
+ import { type MenuCall, type MenuUi } from "../../pluginMenu.js";
8
+ import type { TabInfo } from "../chrome.js";
9
+ import type { TerminalPage } from "../page.js";
10
+ import type { TerminalMouseInput } from "../mouse.js";
11
+ export interface PluginsPageOptions {
12
+ theme: () => Theme;
13
+ call: MenuCall;
14
+ ui: MenuUi & {
15
+ input(title: string, placeholder?: string): Promise<string | undefined>;
16
+ };
17
+ changed(): void;
18
+ }
19
+ export declare class PluginsPage implements TerminalPage {
20
+ private readonly options;
21
+ private plugins;
22
+ private section;
23
+ private projectId;
24
+ private error;
25
+ private restart;
26
+ private busy;
27
+ private disposed;
28
+ private readonly list;
29
+ /** The plugin whose settings are open, or null on the list. */
30
+ private settingsFor;
31
+ private saved;
32
+ private readonly settingsList;
33
+ constructor(options: PluginsPageOptions);
34
+ get focused(): boolean;
35
+ set focused(value: boolean);
36
+ activate(): void;
37
+ dispose(): void;
38
+ tabs(): readonly TabInfo[];
39
+ activeTab(): string;
40
+ hint(): string;
41
+ private settingsPlugin;
42
+ private reload;
43
+ private fill;
44
+ /** The menu rows, with a Settings row after the last row of each plugin that has settings. */
45
+ private rows;
46
+ private menu;
47
+ private key;
48
+ private toRow;
49
+ private open;
50
+ private back;
51
+ /** Flips a switch, or asks for a number inside the setting's range, and saves it. */
52
+ private change;
53
+ handleMouse(event: TerminalMouseInput): import("@earendil-works/pi-tui").TuiMouseEventResult | undefined;
54
+ handleInput(data: string): boolean;
55
+ render(width: number, rows: number): string[];
56
+ private renderSettings;
57
+ }
@@ -0,0 +1,243 @@
1
+ import { matchesKey, truncateToWidth, wrapTextWithAnsi } from '@earendil-works/pi-tui';
2
+ import { BACK, applyPluginAction, menuRows, rowActions } from "../../pluginMenu.js";
3
+ import { safeText } from "../chrome.js";
4
+ import { FilterList } from "../list.js";
5
+ const SECTIONS = [
6
+ { id: 'plugins', title: 'Plugins' },
7
+ { id: 'trust', title: 'Trust' }
8
+ ];
9
+ const SETTINGS_ROW = 'settings:';
10
+ const isSwitch = (setting) => setting.min === 0 && setting.max === 1;
11
+ const settingValueText = (setting) => isSwitch(setting)
12
+ ? setting.value === 1 ? 'on' : 'off'
13
+ : `${setting.value.toLocaleString('en-US')}${setting.value === setting.default ? ' · default' : ''}`;
14
+ const settingsOf = (plugin) => plugin.settings ?? [];
15
+ export class PluginsPage {
16
+ options;
17
+ plugins;
18
+ section = 'plugins';
19
+ projectId = null;
20
+ error;
21
+ restart = false;
22
+ busy = false;
23
+ disposed = false;
24
+ list;
25
+ /** The plugin whose settings are open, or null on the list. */
26
+ settingsFor = null;
27
+ saved = false;
28
+ settingsList;
29
+ constructor(options) {
30
+ this.options = options;
31
+ this.list = new FilterList({
32
+ theme: options.theme, search: 'always', noun: ['item', 'items'], empty: 'There is nothing to switch or trust here yet.',
33
+ onActivate: row => { void this.open(row.id); }
34
+ });
35
+ this.settingsList = new FilterList({
36
+ theme: options.theme, search: 'always', noun: ['setting', 'settings'], empty: 'This plugin has no settings.',
37
+ onActivate: row => { void this.change(row.id); },
38
+ onCancel: () => this.back()
39
+ });
40
+ }
41
+ get focused() { return this.list.focused; }
42
+ set focused(value) {
43
+ this.list.focused = value;
44
+ this.settingsList.focused = value;
45
+ }
46
+ activate() { void this.reload(); }
47
+ dispose() { this.disposed = true; }
48
+ tabs() {
49
+ const plugin = this.settingsPlugin();
50
+ return plugin ? [{ id: 'settings', title: `Plugins › ${safeText(plugin.title)}` }] : SECTIONS;
51
+ }
52
+ activeTab() { return this.settingsPlugin() ? 'settings' : this.section; }
53
+ hint() {
54
+ if (this.settingsPlugin())
55
+ return this.settingsList.query ? 'Enter change · Esc clear' : 'Enter change · Esc back';
56
+ return this.list.query ? 'Enter actions · Esc clear' : 'Enter actions · type to search';
57
+ }
58
+ settingsPlugin() {
59
+ return this.settingsFor ? this.plugins?.find(plugin => plugin.id === this.settingsFor) : undefined;
60
+ }
61
+ async reload() {
62
+ try {
63
+ const { call } = this.options;
64
+ this.projectId = (await call('plugins.session').catch(() => ({ projectId: null }))).projectId;
65
+ this.plugins = await call('plugins.list');
66
+ this.error = undefined;
67
+ }
68
+ catch (error) {
69
+ this.error = error instanceof Error ? error.message : String(error);
70
+ }
71
+ if (this.disposed)
72
+ return;
73
+ this.fill();
74
+ this.options.changed();
75
+ }
76
+ fill() {
77
+ if (this.settingsFor && !this.settingsPlugin())
78
+ this.settingsFor = null;
79
+ this.list.setRows(this.rows());
80
+ const plugin = this.settingsPlugin();
81
+ if (plugin)
82
+ this.settingsList.setRows(settingsOf(plugin).map(setting => ({
83
+ id: setting.key, label: safeText(setting.label), detail: settingValueText(setting),
84
+ tone: isSwitch(setting) ? (setting.value === 1 ? 'success' : 'dim') : 'muted',
85
+ searchText: `${setting.label} ${setting.description}`
86
+ })));
87
+ }
88
+ /** The menu rows, with a Settings row after the last row of each plugin that has settings. */
89
+ rows() {
90
+ const menu = this.menu();
91
+ const out = [];
92
+ const placed = new Set();
93
+ const settingsRow = (plugin) => {
94
+ const count = settingsOf(plugin).length;
95
+ placed.add(plugin.id);
96
+ return { id: `${SETTINGS_ROW}${plugin.id}`, group: safeText(plugin.title), label: 'Settings', detail: `${count} ${count === 1 ? 'setting' : 'settings'} ›`, tone: 'muted', searchText: `${plugin.title} settings ${settingsOf(plugin).map(setting => setting.label).join(' ')}` };
97
+ };
98
+ menu.forEach((row, index) => {
99
+ out.push(this.toRow(row));
100
+ const last = menu[index + 1]?.plugin.id !== row.plugin.id;
101
+ if (this.section === 'plugins' && last && settingsOf(row.plugin).length)
102
+ out.push(settingsRow(row.plugin));
103
+ });
104
+ if (this.section === 'plugins') {
105
+ for (const plugin of this.plugins ?? [])
106
+ if (settingsOf(plugin).length && !placed.has(plugin.id))
107
+ out.push(settingsRow(plugin));
108
+ }
109
+ return out;
110
+ }
111
+ menu() {
112
+ const rows = menuRows(this.plugins ?? [], this.projectId);
113
+ return this.section === 'trust'
114
+ ? rows.filter(row => row.whole && Boolean(row.plugin.code))
115
+ : rows.filter(row => rowActions(row, this.projectId).some(action => action.startsWith('Switch ')));
116
+ }
117
+ key(row) { return `${row.whole ? 'plugin' : 'item'}:${row.id}`; }
118
+ toRow(row) {
119
+ const kind = row.whole ? row.note : row.note.replace(/ in .*$/, '');
120
+ return {
121
+ id: this.key(row), group: safeText(row.plugin.title), label: row.whole ? 'Whole plugin' : safeText(row.name),
122
+ detail: `${row.on ? 'on' : 'off'}${kind ? ` · ${kind}` : ''}`, tone: row.on ? 'success' : 'dim',
123
+ searchText: `${row.name} ${row.plugin.title} ${row.note}`
124
+ };
125
+ }
126
+ async open(id) {
127
+ if (id.startsWith(SETTINGS_ROW)) {
128
+ this.settingsFor = id.slice(SETTINGS_ROW.length);
129
+ this.saved = false;
130
+ this.fill();
131
+ this.options.changed();
132
+ return;
133
+ }
134
+ const row = this.menu().find(candidate => this.key(candidate) === id);
135
+ if (!row || this.busy)
136
+ return;
137
+ this.busy = true;
138
+ try {
139
+ const action = await this.options.ui.select(`${row.plugin.title}: ${row.plugin.description || 'No description.'}`, rowActions(row, this.projectId));
140
+ if (action && action !== BACK && await applyPluginAction(this.options.ui, this.options.call, row, action))
141
+ this.restart = true;
142
+ }
143
+ finally {
144
+ this.busy = false;
145
+ }
146
+ await this.reload();
147
+ }
148
+ back() {
149
+ this.settingsFor = null;
150
+ this.saved = false;
151
+ this.fill();
152
+ }
153
+ /** Flips a switch, or asks for a number inside the setting's range, and saves it. */
154
+ async change(key) {
155
+ const plugin = this.settingsPlugin();
156
+ const setting = plugin && settingsOf(plugin).find(candidate => candidate.key === key);
157
+ if (!plugin || !setting || this.busy)
158
+ return;
159
+ this.busy = true;
160
+ try {
161
+ let value;
162
+ if (isSwitch(setting))
163
+ value = setting.value === 1 ? 0 : 1;
164
+ else {
165
+ const answer = await this.options.ui.input(`${setting.label} (${setting.min.toLocaleString('en-US')}–${setting.max.toLocaleString('en-US')})`, String(setting.value));
166
+ if (answer === undefined || !answer.trim())
167
+ return;
168
+ const typed = answer.trim().replace(/[,_]/g, '');
169
+ value = Number(typed);
170
+ if (!/^-?\d+$/.test(typed) || value < setting.min || value > setting.max) {
171
+ this.options.ui.notify(`${setting.label} must be a whole number from ${setting.min.toLocaleString('en-US')} to ${setting.max.toLocaleString('en-US')}.`, 'error');
172
+ return;
173
+ }
174
+ }
175
+ const fresh = await this.options.call('plugins.configure', { pluginId: plugin.id, settings: { [setting.key]: value } });
176
+ if (Array.isArray(fresh))
177
+ this.plugins = fresh;
178
+ else
179
+ await this.reload();
180
+ this.saved = true;
181
+ this.fill();
182
+ }
183
+ catch (error) {
184
+ this.options.ui.notify(error instanceof Error ? error.message : String(error), 'error');
185
+ }
186
+ finally {
187
+ this.busy = false;
188
+ if (!this.disposed)
189
+ this.options.changed();
190
+ }
191
+ }
192
+ handleMouse(event) {
193
+ return this.settingsPlugin() ? this.settingsList.handleMouse(event) : this.list.handleMouse(event);
194
+ }
195
+ handleInput(data) {
196
+ if (this.settingsPlugin()) {
197
+ if (matchesKey(data, 'tab') || matchesKey(data, 'shift+tab'))
198
+ return true;
199
+ return this.settingsList.handleInput(data);
200
+ }
201
+ if (matchesKey(data, 'tab') || matchesKey(data, 'shift+tab')) {
202
+ if (!this.list.query) {
203
+ this.section = this.section === 'plugins' ? 'trust' : 'plugins';
204
+ this.fill();
205
+ }
206
+ return true;
207
+ }
208
+ return this.list.handleInput(data);
209
+ }
210
+ render(width, rows) {
211
+ const theme = this.options.theme();
212
+ if (width < 1 || rows < 1)
213
+ return [];
214
+ if (!this.plugins)
215
+ return [theme.fg(this.error ? 'error' : 'dim', this.error ? `Could not read plugins: ${this.error}` : 'Reading plugins…')];
216
+ const plugin = this.settingsPlugin();
217
+ if (plugin)
218
+ return this.renderSettings(plugin, width, rows);
219
+ const selectedId = this.list.selected?.id;
220
+ const selected = selectedId?.startsWith(SETTINGS_ROW)
221
+ ? this.plugins.find(candidate => `${SETTINGS_ROW}${candidate.id}` === selectedId)
222
+ : this.menu().find(candidate => this.key(candidate) === selectedId)?.plugin;
223
+ const detail = selected && rows >= 8 ? wrapTextWithAnsi(safeText(selected.description || 'No description.'), width).slice(0, 2) : [];
224
+ const note = this.restart ? ['Saved. Changes apply when this session restarts.'] : [];
225
+ const extra = detail.length + note.length;
226
+ const lines = this.list.render(width, Math.max(2, rows - (extra ? extra + 1 : 0)));
227
+ if (extra)
228
+ lines.push('', ...detail.map(line => theme.fg('muted', line)), ...note.map(line => theme.fg('warning', line)));
229
+ return lines.slice(0, rows).map(line => truncateToWidth(line, width, ''));
230
+ }
231
+ renderSettings(plugin, width, rows) {
232
+ const theme = this.options.theme();
233
+ const setting = settingsOf(plugin).find(candidate => candidate.key === this.settingsList.selected?.id);
234
+ const range = setting && !isSwitch(setting) ? [`From ${setting.min.toLocaleString('en-US')} to ${setting.max.toLocaleString('en-US')} · default ${setting.default.toLocaleString('en-US')}`] : [];
235
+ const detail = setting && rows >= 8 ? [...wrapTextWithAnsi(safeText(setting.description), width).slice(0, 3), ...range] : [];
236
+ const note = this.saved ? ['Saved.'] : [];
237
+ const extra = detail.length + note.length;
238
+ const lines = this.settingsList.render(width, Math.max(2, rows - (extra ? extra + 1 : 0)));
239
+ if (extra)
240
+ lines.push('', ...detail.map(line => theme.fg('muted', line)), ...note.map(line => theme.fg('success', line)));
241
+ return lines.slice(0, rows).map(line => truncateToWidth(line, width, ''));
242
+ }
243
+ }
@@ -0,0 +1,55 @@
1
+ /**
2
+ * The Settings page. It lists existing host settings and asks the host to change one; the values
3
+ * and actions belong to the host. Categories are page-local tabs (Tab / Shift+Tab).
4
+ */
5
+ import type { Theme } from '@earendil-works/pi-coding-agent';
6
+ import type { TerminalPage } from "../page.js";
7
+ import type { TerminalMouseInput } from "../mouse.js";
8
+ export interface TerminalSettingItem {
9
+ id: string;
10
+ tab: string;
11
+ group: string;
12
+ label: string;
13
+ value: string;
14
+ description?: string;
15
+ }
16
+ export interface SettingsPageOptions {
17
+ theme: () => Theme;
18
+ items(): TerminalSettingItem[];
19
+ /** Changes the setting; the page reads the items again afterwards. */
20
+ apply(id: string): Promise<void>;
21
+ notify(message: string, type?: string): void;
22
+ changed(): void;
23
+ }
24
+ export declare class SettingsPage implements TerminalPage {
25
+ private readonly options;
26
+ private items;
27
+ private category;
28
+ private readonly list;
29
+ constructor(options: SettingsPageOptions);
30
+ set focused(value: boolean);
31
+ get focused(): boolean;
32
+ private categories;
33
+ private rowsFor;
34
+ private reload;
35
+ /** Searching looks through every category; otherwise the page shows the current one. */
36
+ private fill;
37
+ tabs(): ({
38
+ readonly id: "appearance";
39
+ readonly title: "Appearance";
40
+ } | {
41
+ readonly id: "model";
42
+ readonly title: "Model";
43
+ } | {
44
+ readonly id: "interaction";
45
+ readonly title: "Interaction";
46
+ } | {
47
+ readonly id: "context";
48
+ readonly title: "Context";
49
+ })[];
50
+ activeTab(): string;
51
+ hint(): string;
52
+ handleMouse(event: TerminalMouseInput): import("@earendil-works/pi-tui").TuiMouseEventResult | undefined;
53
+ handleInput(data: string): boolean;
54
+ render(width: number, rows: number): string[];
55
+ }
@@ -0,0 +1,88 @@
1
+ import { matchesKey, truncateToWidth, wrapTextWithAnsi } from '@earendil-works/pi-tui';
2
+ import { safeText } from "../chrome.js";
3
+ import { FilterList } from "../list.js";
4
+ const CATEGORIES = [
5
+ { id: 'appearance', title: 'Appearance' }, { id: 'model', title: 'Model' },
6
+ { id: 'interaction', title: 'Interaction' }, { id: 'context', title: 'Context' }
7
+ ];
8
+ const tabOf = (item) => item.tab.toLowerCase();
9
+ export class SettingsPage {
10
+ options;
11
+ items = [];
12
+ category = '';
13
+ list;
14
+ constructor(options) {
15
+ this.options = options;
16
+ this.list = new FilterList({
17
+ theme: options.theme, search: 'always', noun: ['setting', 'settings'], empty: 'No settings',
18
+ searchContext: () => 'every category',
19
+ onActivate: row => {
20
+ void options.apply(row.id).then(() => this.reload(), error => options.notify(error instanceof Error ? error.message : String(error), 'error'));
21
+ }
22
+ });
23
+ this.reload();
24
+ }
25
+ set focused(value) { this.list.focused = value; }
26
+ get focused() { return this.list.focused; }
27
+ categories() {
28
+ return CATEGORIES.filter(category => this.items.some(item => tabOf(item) === category.id));
29
+ }
30
+ rowsFor(items) {
31
+ return items.map(item => ({
32
+ id: item.id, label: safeText(item.label), detail: safeText(item.value), group: safeText(item.group), data: item,
33
+ searchText: `${item.label} ${item.id} ${item.value} ${item.description ?? ''} ${item.group} ${item.tab}`
34
+ }));
35
+ }
36
+ reload() {
37
+ const selected = this.list.selected?.id;
38
+ this.items = this.options.items().filter(item => CATEGORIES.some(category => category.id === tabOf(item)));
39
+ if (!this.categories().some(category => category.id === this.category))
40
+ this.category = this.categories()[0]?.id ?? '';
41
+ this.fill();
42
+ if (selected)
43
+ this.list.select(selected);
44
+ this.options.changed();
45
+ }
46
+ /** Searching looks through every category; otherwise the page shows the current one. */
47
+ fill() {
48
+ this.list.setRows(this.rowsFor(this.list.query ? this.items : this.items.filter(item => tabOf(item) === this.category)));
49
+ }
50
+ tabs() { return this.categories(); }
51
+ activeTab() { return this.category; }
52
+ hint() { return this.list.query ? 'Enter change · Esc clear' : 'Enter change · type to search'; }
53
+ handleMouse(event) {
54
+ return this.list.handleMouse(event);
55
+ }
56
+ handleInput(data) {
57
+ if (matchesKey(data, 'tab') || matchesKey(data, 'shift+tab')) {
58
+ const categories = this.categories();
59
+ if (!this.list.query && categories.length > 1) {
60
+ const at = Math.max(0, categories.findIndex(category => category.id === this.category));
61
+ this.category = categories[(at + (matchesKey(data, 'shift+tab') ? -1 : 1) + categories.length) % categories.length].id;
62
+ this.fill();
63
+ }
64
+ return true;
65
+ }
66
+ const before = this.list.query;
67
+ const used = this.list.handleInput(data);
68
+ if (this.list.query !== before)
69
+ this.fill();
70
+ return used;
71
+ }
72
+ render(width, rows) {
73
+ if (width < 1 || rows < 1)
74
+ return [];
75
+ const theme = this.options.theme();
76
+ const description = this.list.selected?.data?.description;
77
+ const descriptionRows = Math.min(3, Math.max(0, rows - 7));
78
+ const reserved = descriptionRows ? descriptionRows + 1 : 0;
79
+ const lines = this.list.render(width, Math.max(2, rows - 1 - reserved));
80
+ if (descriptionRows) {
81
+ lines.push('');
82
+ const wrapped = description ? wrapTextWithAnsi(safeText(description), Math.max(1, width)) : [];
83
+ for (let index = 0; index < descriptionRows; index++)
84
+ lines.push(theme.fg('muted', wrapped[index] ?? ''));
85
+ }
86
+ return lines.slice(0, rows).map(line => truncateToWidth(line, width, ''));
87
+ }
88
+ }
@@ -0,0 +1,58 @@
1
+ /** Saved run evidence for the current conversation: runs, their events, and the selected event's payload. */
2
+ import type { Theme } from '@earendil-works/pi-coding-agent';
3
+ import { type TuiMouseEventResult } from '@earendil-works/pi-tui';
4
+ import type { RunEvent } from "../../../sessions/contracts.js";
5
+ import type { TerminalTrajectoryRun, TerminalTrajectorySnapshot } from "../../trajectory.js";
6
+ import { type TabInfo } from "../chrome.js";
7
+ import type { TerminalPage } from "../page.js";
8
+ import { type TerminalMouseInput } from "../mouse.js";
9
+ export interface TrajectoryPageOptions {
10
+ theme: () => Theme;
11
+ runs(): Promise<TerminalTrajectoryRun[]>;
12
+ read(runId: string, afterSequence?: number): Promise<TerminalTrajectorySnapshot>;
13
+ copy(text: string): Promise<void>;
14
+ /** Opens on this run when it is in the list; otherwise the newest. */
15
+ initialRunId?: string;
16
+ notify(message: string, type?: string): void;
17
+ changed(): void;
18
+ }
19
+ export declare class TrajectoryPage implements TerminalPage {
20
+ private readonly options;
21
+ private runs;
22
+ private section;
23
+ private readonly runList;
24
+ private runIndex;
25
+ private run;
26
+ private events;
27
+ private selected;
28
+ private detailOffset;
29
+ private eventRowsStart;
30
+ private eventRowsFirst;
31
+ private eventRowsCount;
32
+ private loading;
33
+ private loaded;
34
+ private disposed;
35
+ private timer;
36
+ private error;
37
+ constructor(options: TrajectoryPageOptions);
38
+ get selectedRunId(): string | undefined;
39
+ get selectedEvent(): RunEvent | undefined;
40
+ get focused(): boolean;
41
+ set focused(value: boolean);
42
+ tabs(): readonly TabInfo[];
43
+ activeTab(): string;
44
+ activate(): void;
45
+ deactivate(): void;
46
+ dispose(): void;
47
+ private load;
48
+ private open;
49
+ private refresh;
50
+ /** `[` is the older run, `]` the newer one. */
51
+ private runRows;
52
+ private selectRun;
53
+ private changeRun;
54
+ hint(): string;
55
+ handleMouse(event: TerminalMouseInput): TuiMouseEventResult | undefined;
56
+ handleInput(data: string): boolean;
57
+ render(width: number, rows: number): string[];
58
+ }