@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,196 @@
1
+ import { fuzzyFilter, matchesKey, truncateToWidth, visibleWidth } from '@earendil-works/pi-tui';
2
+ import { safeText, selectedRow, selectionMuted, selectionText } from "./chrome.js";
3
+ import { SEARCH_FIELD_ROWS, SearchField, searchFieldRowsFor } from "./search.js";
4
+ import { isPrimaryClick } from "./mouse.js";
5
+ export class FilterList {
6
+ options;
7
+ rows;
8
+ visible;
9
+ selectedId;
10
+ focusedValue = false;
11
+ renderedSearchRows = SEARCH_FIELD_ROWS;
12
+ renderedRows = [];
13
+ search;
14
+ constructor(options) {
15
+ this.options = options;
16
+ this.search = new SearchField(options.theme);
17
+ this.rows = [...(options.rows ?? [])];
18
+ this.visible = this.rows;
19
+ this.selectedId = this.firstSelectable()?.id;
20
+ }
21
+ get focused() { return this.focusedValue; }
22
+ set focused(value) { this.focusedValue = value; }
23
+ get query() { return this.search.value; }
24
+ get selected() { return this.visible.find(row => row.id === this.selectedId); }
25
+ get total() { return this.rows.length; }
26
+ get shown() { return this.visible.length; }
27
+ /** Rows the list would use if nothing cut it: the search field, headings and rows. */
28
+ get height() { return (this.searchVisible() ? this.renderedSearchRows : 0) + this.entries().length; }
29
+ /** Rows at the top of `render` that a frame must keep when it has to cut the list. */
30
+ get pinnedRows() { return this.searchVisible() ? this.renderedSearchRows : 0; }
31
+ setRows(rows) {
32
+ this.rows = [...rows];
33
+ this.refilter();
34
+ }
35
+ /** Searches for `text` as if it had been typed. */
36
+ setQuery(text) {
37
+ this.search.setValue(text);
38
+ this.refilter();
39
+ }
40
+ select(id) {
41
+ if (this.visible.some(row => row.id === id))
42
+ this.selectedId = id;
43
+ }
44
+ /** Selects the row at a rendered line, and activates it on a primary click. */
45
+ handleMouse(event) {
46
+ if (!Number.isInteger(event.y) || event.y < 0)
47
+ return undefined;
48
+ const row = this.renderedRows[event.y];
49
+ if (!row || row.disabled)
50
+ return undefined;
51
+ const changed = this.selectedId !== row.id;
52
+ this.selectedId = row.id;
53
+ const activate = isPrimaryClick(event);
54
+ if (activate) {
55
+ if (this.options.onActivate)
56
+ this.options.onActivate(row);
57
+ else
58
+ this.options.onToggle?.(row);
59
+ }
60
+ return { handled: true, render: changed || activate };
61
+ }
62
+ invalidate() { this.search.invalidate(); }
63
+ limit() { return Math.max(1, Math.floor(this.options.limit?.() ?? Number.POSITIVE_INFINITY)); }
64
+ mode() { return this.options.search ?? 'always'; }
65
+ canSearch() { return this.mode() === 'always'; }
66
+ searchVisible() { return this.canSearch() || this.query.length > 0; }
67
+ firstSelectable() { return this.visible.find(row => !row.disabled); }
68
+ refilter() {
69
+ const query = this.query.trim();
70
+ this.visible = query
71
+ ? fuzzyFilter(this.rows, query, row => row.searchText ?? `${row.label} ${row.detail ?? ''} ${row.group ?? ''}`)
72
+ : this.rows;
73
+ if (!this.visible.some(row => row.id === this.selectedId && !row.disabled))
74
+ this.selectedId = this.firstSelectable()?.id;
75
+ }
76
+ move(delta) {
77
+ const selectable = this.visible.filter(row => !row.disabled);
78
+ if (!selectable.length)
79
+ return;
80
+ const at = Math.max(0, selectable.findIndex(row => row.id === this.selectedId));
81
+ this.selectedId = selectable[Math.max(0, Math.min(selectable.length - 1, at + delta))].id;
82
+ }
83
+ handleInput(data) {
84
+ if (matchesKey(data, 'escape')) {
85
+ if (this.search.clear()) {
86
+ this.refilter();
87
+ return true;
88
+ }
89
+ this.options.onCancel?.();
90
+ return Boolean(this.options.onCancel);
91
+ }
92
+ if (matchesKey(data, 'up')) {
93
+ this.move(-1);
94
+ return true;
95
+ }
96
+ if (matchesKey(data, 'down')) {
97
+ this.move(1);
98
+ return true;
99
+ }
100
+ if (matchesKey(data, 'pageUp')) {
101
+ this.move(-Math.max(1, this.limit() - 1));
102
+ return true;
103
+ }
104
+ if (matchesKey(data, 'pageDown')) {
105
+ this.move(Math.max(1, this.limit() - 1));
106
+ return true;
107
+ }
108
+ if (matchesKey(data, 'home')) {
109
+ this.move(-this.visible.length);
110
+ return true;
111
+ }
112
+ if (matchesKey(data, 'end')) {
113
+ this.move(this.visible.length);
114
+ return true;
115
+ }
116
+ if (matchesKey(data, 'enter')) {
117
+ const row = this.selected;
118
+ if (row && !row.disabled)
119
+ this.options.onActivate?.(row);
120
+ return true;
121
+ }
122
+ if (data === ' ' && !this.query && this.options.onToggle) {
123
+ const row = this.selected;
124
+ if (row && !row.disabled)
125
+ this.options.onToggle(row);
126
+ return true;
127
+ }
128
+ if (!this.canSearch() && !this.query)
129
+ return false;
130
+ if (this.search.handleInput(data)) {
131
+ this.refilter();
132
+ return true;
133
+ }
134
+ return false;
135
+ }
136
+ entries() {
137
+ const entries = [];
138
+ let last;
139
+ for (const row of this.visible) {
140
+ if (!this.query && row.group && row.group !== last)
141
+ entries.push({ heading: row.group });
142
+ last = row.group;
143
+ entries.push({ row });
144
+ }
145
+ return entries;
146
+ }
147
+ line(row, width) {
148
+ const theme = this.options.theme();
149
+ const selected = row.id === this.selectedId;
150
+ const detail = row.detail ? safeText(row.detail) : '';
151
+ const room = width - 2;
152
+ const showDetail = detail && room >= visibleWidth(detail) + 6;
153
+ const label = truncateToWidth(safeText(row.label), Math.max(0, room - (showDetail ? visibleWidth(detail) + 2 : 0)), '…');
154
+ const gap = ' '.repeat(Math.max(0, room - visibleWidth(label) - (showDetail ? visibleWidth(detail) : 0)));
155
+ const tone = (text) => theme.fg(row.tone ?? 'muted', text);
156
+ const main = (selected ? '❯ ' : ' ') + label;
157
+ if (selected)
158
+ return selectedRow(selectionText(theme, main) + gap + (showDetail ? selectionMuted(theme, detail) : ''), width, theme);
159
+ return (row.disabled ? theme.fg('dim', main) : main) + gap + (showDetail ? tone(detail) : '');
160
+ }
161
+ /** `rows` is the most the list may use, the search row included. */
162
+ render(width, rows) {
163
+ this.renderedRows = [];
164
+ if (width < 1)
165
+ return [];
166
+ const theme = this.options.theme();
167
+ const searching = this.searchVisible();
168
+ const rowBudget = Math.floor(rows ?? this.limit());
169
+ this.renderedSearchRows = searching ? searchFieldRowsFor(rowBudget) : 0;
170
+ this.search.focused = this.focusedValue && searching;
171
+ const lines = [];
172
+ if (searching) {
173
+ const [one, many] = this.options.noun ?? ['option', 'options'];
174
+ const count = this.query ? `${this.shown} of ${this.total}` : `${this.total} ${this.total === 1 ? one : many}`;
175
+ const context = this.query ? this.options.searchContext?.(this.query.trim()) : undefined;
176
+ const note = context ? `${count} · ${context}` : count;
177
+ const searchLines = this.search.renderLines(width, note, this.renderedSearchRows);
178
+ lines.push(...searchLines);
179
+ this.renderedRows.push(...searchLines.map(() => undefined));
180
+ }
181
+ const budget = Math.max(1, rowBudget - lines.length);
182
+ const entries = this.entries();
183
+ if (!entries.length) {
184
+ lines.push(theme.fg('dim', this.query ? 'No matches' : this.options.empty ?? 'Nothing to show'));
185
+ this.renderedRows.push(undefined);
186
+ return lines.map(line => truncateToWidth(line, width, ''));
187
+ }
188
+ const at = Math.max(0, entries.findIndex(entry => entry.row?.id === this.selectedId));
189
+ const start = Math.max(0, Math.min(Math.max(0, entries.length - budget), at - Math.floor(budget / 2)));
190
+ for (const entry of entries.slice(start, start + budget)) {
191
+ lines.push(entry.row ? this.line(entry.row, width) : theme.fg('dim', safeText(entry.heading ?? '')));
192
+ this.renderedRows.push(entry.row);
193
+ }
194
+ return lines.map(line => truncateToWidth(line, width, ''));
195
+ }
196
+ }
@@ -0,0 +1,42 @@
1
+ import type { AgentSession } from '@earendil-works/pi-coding-agent';
2
+ import { type ChoicePatch, type ModeChoice } from "../../accounts/choices.js";
3
+ import type { Effort } from "../../core/effort.js";
4
+ export type ComposerMode = 'normal' | 'plan';
5
+ export type ChoiceModel = Parameters<AgentSession['setModel']>[0];
6
+ /** The part of the account store a terminal can reach: its own account, through the session socket. */
7
+ export interface ChoiceStore {
8
+ read(): Promise<Record<string, ModeChoice>>;
9
+ write(mode: ComposerMode, patch: ChoicePatch): Promise<unknown>;
10
+ }
11
+ /** The part of a native session a choice touches. */
12
+ export interface ChoiceSession {
13
+ readonly model?: ChoiceModel;
14
+ setModel(model: ChoiceModel, options: {
15
+ persist: boolean;
16
+ }): Promise<void>;
17
+ setThinkingLevel(level: AgentSession['thinkingLevel'], options: {
18
+ persist: boolean;
19
+ }): void;
20
+ }
21
+ export declare class ModeChoices {
22
+ private readonly store;
23
+ private modes;
24
+ private quiet;
25
+ constructor(store: ChoiceStore);
26
+ /** Reads the account's choices. A failed read keeps what is already known, so a session still starts. */
27
+ load(): Promise<void>;
28
+ /** The model and effort a mode starts from: its own, else normal's, field by field. */
29
+ resolve(mode: ComposerMode): {
30
+ model?: string;
31
+ effort?: Effort;
32
+ };
33
+ /** Runs `action` as the terminal's own change. Nothing it causes is recorded as a person's selection. */
34
+ quietly<T>(action: () => T | Promise<T>): Promise<T>;
35
+ /**
36
+ * Applies a mode's saved model and effort to the session. A model the account cannot use is
37
+ * skipped, and Pi clamps an effort the model does not support.
38
+ */
39
+ apply(session: ChoiceSession, mode: ComposerMode, modelFor: (reference: string) => ChoiceModel | undefined): Promise<void>;
40
+ /** Records a selection the person made in `mode`. Skipped while the terminal is making its own change. */
41
+ record(mode: ComposerMode, patch: ChoicePatch): Promise<void>;
42
+ }
@@ -0,0 +1,70 @@
1
+ import { resolveChoice } from "../../accounts/choices.js";
2
+ export class ModeChoices {
3
+ store;
4
+ modes = {};
5
+ quiet = 0;
6
+ constructor(store) {
7
+ this.store = store;
8
+ }
9
+ /** Reads the account's choices. A failed read keeps what is already known, so a session still starts. */
10
+ async load() {
11
+ try {
12
+ this.modes = await this.store.read();
13
+ }
14
+ catch {
15
+ // Keep the choices already known; the terminal starts on Pi's own default when there are none.
16
+ }
17
+ }
18
+ /** The model and effort a mode starts from: its own, else normal's, field by field. */
19
+ resolve(mode) {
20
+ return resolveChoice(this.modes, mode);
21
+ }
22
+ /** Runs `action` as the terminal's own change. Nothing it causes is recorded as a person's selection. */
23
+ async quietly(action) {
24
+ this.quiet += 1;
25
+ try {
26
+ return await action();
27
+ }
28
+ finally {
29
+ this.quiet -= 1;
30
+ }
31
+ }
32
+ /**
33
+ * Applies a mode's saved model and effort to the session. A model the account cannot use is
34
+ * skipped, and Pi clamps an effort the model does not support.
35
+ */
36
+ async apply(session, mode, modelFor) {
37
+ const choice = this.resolve(mode);
38
+ await this.quietly(async () => {
39
+ const model = choice.model ? modelFor(choice.model) : undefined;
40
+ if (model && !(session.model && session.model.provider === model.provider && session.model.id === model.id)) {
41
+ try {
42
+ await session.setModel(model, { persist: false });
43
+ }
44
+ catch {
45
+ // Not usable on this account (no key, or no longer offered): keep the session's model.
46
+ }
47
+ }
48
+ if (choice.effort)
49
+ session.setThinkingLevel(choice.effort, { persist: false });
50
+ });
51
+ }
52
+ /** Records a selection the person made in `mode`. Skipped while the terminal is making its own change. */
53
+ async record(mode, patch) {
54
+ if (this.quiet > 0)
55
+ return;
56
+ const current = this.modes[mode];
57
+ this.modes[mode] = {
58
+ ...current,
59
+ ...(patch.model !== undefined ? { model: patch.model } : {}),
60
+ ...(patch.effort !== undefined ? { effort: patch.effort } : {}),
61
+ updatedAt: new Date().toISOString()
62
+ };
63
+ try {
64
+ await this.store.write(mode, patch);
65
+ }
66
+ catch {
67
+ // Best effort: the selection still applies to this session, and the next one is recorded again.
68
+ }
69
+ }
70
+ }
@@ -0,0 +1,55 @@
1
+ /**
2
+ * The `/model` picker: every model the account can use, searched in the standard place, with the
3
+ * current model marked, the default noted, and Tab to move between all models and the scoped set.
4
+ * Enter uses a model for this session; Ctrl+S also saves it as the default.
5
+ */
6
+ import type { AgentSession, Theme } from '@earendil-works/pi-coding-agent';
7
+ import { type Component, type Focusable, type TUI } from '@earendil-works/pi-tui';
8
+ type PiModel = NonNullable<AgentSession['model']>;
9
+ type ModelCatalog = Pick<AgentSession['modelRuntime'], 'getAvailableSnapshot' | 'getModel' | 'getError' | 'refresh'>;
10
+ export interface ModelPickerOptions {
11
+ theme: () => Theme;
12
+ tui: TUI;
13
+ runtime: ModelCatalog;
14
+ current: PiModel | undefined;
15
+ /** The models Ctrl+P cycles through, when any are chosen. */
16
+ scoped: ReadonlyArray<{
17
+ model: PiModel;
18
+ }>;
19
+ defaultModel?: {
20
+ provider: string;
21
+ id: string;
22
+ };
23
+ initialSearch?: string;
24
+ select(model: PiModel, persist: boolean): void;
25
+ cancel(): void;
26
+ changed(): void;
27
+ }
28
+ export declare class ModelPicker implements Component, Focusable {
29
+ private readonly options;
30
+ private scope;
31
+ private all;
32
+ private scoped;
33
+ private status;
34
+ private error;
35
+ private closed;
36
+ private readonly abort;
37
+ private readonly timer;
38
+ private readonly list;
39
+ constructor(options: ModelPickerOptions);
40
+ get focused(): boolean;
41
+ set focused(value: boolean);
42
+ private isCurrent;
43
+ private isDefault;
44
+ private load;
45
+ /** The current model first, the default second, then by provider. */
46
+ private fill;
47
+ private refresh;
48
+ private finish;
49
+ private cancel;
50
+ dispose(): void;
51
+ invalidate(): void;
52
+ handleInput(data: string): void;
53
+ render(width: number): string[];
54
+ }
55
+ export {};
@@ -0,0 +1,155 @@
1
+ import { matchesKey, truncateToWidth } from '@earendil-works/pi-tui';
2
+ import { centerDialogChromeRows, centerDialogContentWidth, centerDialogFrame, contentWidth, pageFrame, safeText, tabStrip } from "./chrome.js";
3
+ import { centeredDialogHost, dialogFits, pageRows } from "./dialogGeometry.js";
4
+ import { FilterList } from "./list.js";
5
+ const REFRESH_TIMEOUT_MS = 15_000;
6
+ const SCOPES = [{ id: 'all', title: 'All models' }, { id: 'scoped', title: 'Scoped models' }];
7
+ const keyOf = (model) => `${model.provider}\u0000${model.id}`;
8
+ export class ModelPicker {
9
+ options;
10
+ scope;
11
+ all = [];
12
+ scoped;
13
+ status = 'Refreshing model catalogs…';
14
+ error;
15
+ closed = false;
16
+ abort = new AbortController();
17
+ timer;
18
+ list;
19
+ constructor(options) {
20
+ this.options = options;
21
+ this.scoped = options.scoped.map(item => options.runtime.getModel(item.model.provider, item.model.id) ?? item.model);
22
+ this.scope = this.scoped.length ? 'scoped' : 'all';
23
+ this.list = new FilterList({
24
+ theme: options.theme, search: 'always', noun: ['model', 'models'], empty: 'No models are available for this account.',
25
+ searchContext: () => this.scope === 'all' ? 'all models' : 'scoped models',
26
+ onActivate: row => { if (row.data)
27
+ this.finish(row.data, false); },
28
+ onCancel: () => this.cancel()
29
+ });
30
+ this.load();
31
+ if (options.initialSearch)
32
+ this.list.setQuery(options.initialSearch);
33
+ this.timer = setTimeout(() => this.abort.abort(), REFRESH_TIMEOUT_MS);
34
+ void this.refresh();
35
+ }
36
+ get focused() { return this.list.focused; }
37
+ set focused(value) { this.list.focused = value; }
38
+ isCurrent(model) { return this.options.current ? keyOf(this.options.current) === keyOf(model) : false; }
39
+ isDefault(model) { return this.options.defaultModel ? keyOf(this.options.defaultModel) === keyOf(model) : false; }
40
+ load() {
41
+ this.all = [...this.options.runtime.getAvailableSnapshot()];
42
+ this.fill();
43
+ }
44
+ /** The current model first, the default second, then by provider. */
45
+ fill() {
46
+ const source = this.scope === 'scoped' ? this.scoped : this.all;
47
+ const ordered = [...source].sort((left, right) => Number(this.isCurrent(right)) - Number(this.isCurrent(left)) || Number(this.isDefault(right)) - Number(this.isDefault(left)) || left.provider.localeCompare(right.provider));
48
+ const rows = ordered.map(model => ({
49
+ id: keyOf(model), data: model,
50
+ label: `${this.isCurrent(model) ? '✓' : ' '} ${safeText(model.id)}`,
51
+ detail: `${safeText(model.provider)}${this.isDefault(model) ? ' · default' : ''}`,
52
+ tone: 'muted',
53
+ searchText: `${model.provider} ${model.provider}/${model.id} ${model.id} ${model.name ?? ''}${this.isDefault(model) ? ' default' : ''}`
54
+ }));
55
+ this.list.setRows(rows);
56
+ const current = ordered.find(model => this.isCurrent(model));
57
+ if (current)
58
+ this.list.select(keyOf(current));
59
+ }
60
+ async refresh() {
61
+ try {
62
+ const result = await this.options.runtime.refresh({ allowNetwork: true, signal: this.abort.signal });
63
+ if (this.closed)
64
+ return;
65
+ this.status = '';
66
+ if (result.aborted)
67
+ this.error = 'Model refresh timed out; showing cached models.';
68
+ else if (result.errors.size)
69
+ this.error = `Could not refresh ${[...result.errors.keys()].join(', ')}; showing cached models.`;
70
+ else {
71
+ this.error = this.options.runtime.getError();
72
+ if (!this.error)
73
+ this.status = 'Model catalogs refreshed.';
74
+ }
75
+ this.load();
76
+ }
77
+ catch (error) {
78
+ if (this.closed)
79
+ return;
80
+ this.status = '';
81
+ this.error = `Could not refresh model catalogs: ${error instanceof Error ? error.message : String(error)}`;
82
+ }
83
+ finally {
84
+ clearTimeout(this.timer);
85
+ if (!this.closed)
86
+ this.options.changed();
87
+ }
88
+ }
89
+ finish(model, persist) {
90
+ this.dispose();
91
+ this.options.select(model, persist);
92
+ }
93
+ cancel() {
94
+ this.dispose();
95
+ this.options.cancel();
96
+ }
97
+ dispose() {
98
+ if (this.closed)
99
+ return;
100
+ this.closed = true;
101
+ clearTimeout(this.timer);
102
+ this.abort.abort();
103
+ }
104
+ invalidate() { this.list.invalidate(); }
105
+ handleInput(data) {
106
+ if (matchesKey(data, 'ctrl+c')) {
107
+ this.cancel();
108
+ return;
109
+ }
110
+ const centered = centeredDialogHost(this.options.tui) && dialogFits(this.options.tui.terminal.columns, this.options.tui.terminal.rows);
111
+ const scopeForward = matchesKey(data, 'tab') || (centered && matchesKey(data, 'right'));
112
+ const scopeBackward = matchesKey(data, 'shift+tab') || (centered && matchesKey(data, 'left'));
113
+ if (scopeForward || scopeBackward) {
114
+ if (this.scoped.length && !this.list.query) {
115
+ this.scope = this.scope === 'all' ? 'scoped' : 'all';
116
+ this.fill();
117
+ }
118
+ return;
119
+ }
120
+ if (matchesKey(data, 'ctrl+s')) {
121
+ const model = this.list.selected?.data;
122
+ if (model)
123
+ this.finish(model, true);
124
+ return;
125
+ }
126
+ const before = this.list.query;
127
+ this.list.handleInput(data);
128
+ if (this.list.query !== before)
129
+ this.options.changed();
130
+ }
131
+ render(width) {
132
+ const rows = pageRows(this.options.tui);
133
+ const theme = this.options.theme();
134
+ if (width < 1 || rows < 1)
135
+ return [];
136
+ const centered = centeredDialogHost(this.options.tui) && dialogFits(this.options.tui.terminal.columns, this.options.tui.terminal.rows);
137
+ const inner = centered ? centerDialogContentWidth(width) : contentWidth(width);
138
+ const selected = this.list.selected?.data;
139
+ const notes = [
140
+ this.status ? theme.fg('muted', this.status) : '',
141
+ selected ? theme.fg('muted', `Model name: ${safeText(selected.name ?? selected.id)}`) : '',
142
+ this.error ? theme.fg('error', this.error) : ''
143
+ ].filter(Boolean);
144
+ const chromeRows = centered ? centerDialogChromeRows(rows) : 4;
145
+ const lines = this.list.render(inner, Math.max(2, rows - chromeRows - 1 - (notes.length ? notes.length + 1 : 0)));
146
+ if (this.scoped.length)
147
+ lines.splice(this.list.pinnedRows, 0, tabStrip(SCOPES, this.scope, inner, theme, 'sub'));
148
+ if (notes.length)
149
+ lines.push('', ...notes);
150
+ const hint = `Enter use · Ctrl+S set as default${this.scoped.length ? ' · Tab scope' : ''} · Esc cancel`;
151
+ if (centered)
152
+ return centerDialogFrame({ title: 'Model', body: lines.map(line => truncateToWidth(line, inner, '')), width, rows, theme });
153
+ return pageFrame({ title: 'Model', meta: this.status || undefined, body: lines.map(line => truncateToWidth(line, inner, '')), footer: hint, width, rows, theme });
154
+ }
155
+ }
@@ -0,0 +1,3 @@
1
+ import type { TuiMouseEvent } from '@earendil-works/pi-tui';
2
+ export type TerminalMouseInput = TuiMouseEvent;
3
+ export declare function isPrimaryClick(event: TerminalMouseInput): boolean;
@@ -0,0 +1,3 @@
1
+ export function isPrimaryClick(event) {
2
+ return event.type === 'click' && event.button === 'left';
3
+ }
@@ -0,0 +1,14 @@
1
+ import type { TuiMouseEventResult } from '@earendil-works/pi-tui';
2
+ import type { TabInfo } from "./chrome.js";
3
+ import type { TerminalMouseInput } from "./mouse.js";
4
+ export interface TerminalPage {
5
+ tabs(): readonly TabInfo[];
6
+ activeTab(): string;
7
+ render(width: number, rows: number): string[];
8
+ handleInput(data: string): boolean;
9
+ handleMouse?(event: TerminalMouseInput): TuiMouseEventResult | undefined;
10
+ hint(): string;
11
+ focused?: boolean;
12
+ activate?(): void;
13
+ dispose?(): void;
14
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,27 @@
1
+ import type { Theme } from '@earendil-works/pi-coding-agent';
2
+ import { type Component, type Focusable, type TUI, type TuiMouseEventResult } from '@earendil-works/pi-tui';
3
+ import type { TerminalMouseInput } from "./mouse.js";
4
+ import type { TerminalPage } from "./page.js";
5
+ export interface PageOverlayOptions {
6
+ page: TerminalPage;
7
+ tui: TUI;
8
+ theme: () => Theme;
9
+ close(): void;
10
+ changed(): void;
11
+ }
12
+ export declare class PageOverlay implements Component, Focusable {
13
+ readonly options: PageOverlayOptions;
14
+ private focusedValue;
15
+ private disposed;
16
+ private pointerLayout?;
17
+ private hoveredTab?;
18
+ constructor(options: PageOverlayOptions);
19
+ get page(): TerminalPage;
20
+ get focused(): boolean;
21
+ set focused(value: boolean);
22
+ invalidate(): void;
23
+ handleMouse(event: TerminalMouseInput): TuiMouseEventResult | undefined;
24
+ handleInput(data: string): void;
25
+ render(width: number): string[];
26
+ dispose(): void;
27
+ }