@xingular/harness 0.1.7 → 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 (683) hide show
  1. package/CHANGELOG.md +97 -1
  2. package/LICENSE +202 -0
  3. package/NOTICE.md +22 -0
  4. package/README.md +187 -85
  5. package/THIRD_PARTY_LICENSES.md +942 -0
  6. package/dist/cli.js +13701 -13498
  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 +808 -151
  373. package/docs/README.md +22 -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-0002-native-subagent-lifecycle.md +49 -0
  403. package/docs/decisions/ADR-0003-shared-asynchronous-subagents.md +70 -0
  404. package/docs/decisions/ADR-0004-fullscreen-terminal-layout.md +50 -0
  405. package/docs/decisions/ADR-0005-app-provided-oauth-clients.md +54 -0
  406. package/docs/decisions/ADR-0006-opentui-only-terminal.md +47 -0
  407. package/docs/decisions/ADR-0007-reporting-section.md +33 -0
  408. package/docs/decisions/ADR-0008-flexible-reporting-guidance.md +38 -0
  409. package/docs/decisions/ADR-0009-xharness-command.md +38 -0
  410. package/docs/decisions/ADR-0010-lessons-in-the-wiki.md +31 -0
  411. package/docs/decisions/ADR-0011-foundation-and-variants.md +28 -0
  412. package/docs/decisions/ADR-0012-native-session-names.md +34 -0
  413. package/docs/decisions/ADR-0013-doctor.md +27 -0
  414. package/docs/decisions/ADR-0014-public-release-baseline.md +21 -0
  415. package/docs/doctor.md +74 -0
  416. package/docs/experiments/EXP-0001-terminal-input-latency/plan.md +81 -0
  417. package/docs/experiments/EXP-0001-terminal-input-latency/results.md +46 -0
  418. package/docs/experiments/EXP-0002-opentui-typing-latency/plan.md +70 -0
  419. package/docs/experiments/EXP-0002-opentui-typing-latency/results.md +92 -0
  420. package/docs/features/README.md +20 -0
  421. package/docs/features/automations/README.md +41 -0
  422. package/docs/features/cores/README.md +39 -0
  423. package/docs/features/google-harness2/README.md +52 -0
  424. package/docs/features/integrations/README.md +40 -0
  425. package/docs/features/interfaces/README.md +29 -0
  426. package/docs/features/memory/README.md +28 -0
  427. package/docs/releases/1.0.0.md +40 -0
  428. package/docs/releases/README.md +36 -0
  429. package/docs/study/00-index.md +78 -0
  430. package/docs/study/arms/00-matrix.md +20 -0
  431. package/docs/study/arms/01-system-prompt.md +211 -0
  432. package/docs/study/arms/02-tools.md +79 -0
  433. package/docs/study/arms/03-subagents.md +90 -0
  434. package/docs/study/arms/04-skills.md +75 -0
  435. package/docs/study/arms/05-context-management.md +90 -0
  436. package/docs/study/arms/06-memory.md +90 -0
  437. package/docs/study/arms/07-governance.md +71 -0
  438. package/docs/study/arms/08-execution.md +69 -0
  439. package/docs/study/arms/09-observability.md +60 -0
  440. package/docs/study/arms/10-refinement.md +110 -0
  441. package/docs/study/btw-comparison.md +37 -0
  442. package/docs/study/feature-gap-review.md +42 -0
  443. package/docs/study/insights.md +123 -0
  444. package/docs/study/roadmap.md +72 -0
  445. package/docs/study/sources/claude-code.md +44 -0
  446. package/docs/study/sources/deepseek-harness.md +102 -0
  447. package/docs/study/sources/harness2.md +50 -0
  448. package/docs/study/sources/kimi-cli.md +42 -0
  449. package/docs/study/sources/omp.md +93 -0
  450. package/docs/study/sources/opencode.md +43 -0
  451. package/docs/study/sources/openhands.md +46 -0
  452. package/docs/study/sources/smolagents.md +40 -0
  453. package/docs/study/sources/swe-agent.md +34 -0
  454. package/docs/system-prompt-design.md +196 -0
  455. package/docs/terminal-tui.md +473 -56
  456. package/package.json +43 -13
  457. package/docs/evidence/terminal-2026-10-17/120x40-completed-transcript.ansi.gz +0 -0
  458. package/docs/evidence/terminal-2026-10-17/40x20-settings-interaction.ansi.gz +0 -0
  459. package/docs/evidence/terminal-2026-10-17/40x20-settings-keyboard.ansi.gz +0 -0
  460. package/docs/evidence/terminal-2026-10-17/40x20-welcome.ansi.gz +0 -0
  461. package/docs/evidence/terminal-2026-10-17/80x24-approval-0.ansi.gz +0 -0
  462. package/docs/evidence/terminal-2026-10-17/80x24-question.ansi.gz +0 -0
  463. package/docs/evidence/terminal-2026-10-17/verification.json +0 -130
  464. package/docs/evidence/terminal-2026-10-17-followup/120x40-completed-transcript.ansi.gz +0 -0
  465. package/docs/evidence/terminal-2026-10-17-followup/40x20-settings-interaction.ansi.gz +0 -0
  466. package/docs/evidence/terminal-2026-10-17-followup/40x20-settings-keyboard.ansi.gz +0 -0
  467. package/docs/evidence/terminal-2026-10-17-followup/40x20-welcome.ansi.gz +0 -0
  468. package/docs/evidence/terminal-2026-10-17-followup/80x24-approval-0.ansi.gz +0 -0
  469. package/docs/evidence/terminal-2026-10-17-followup/80x24-plugin-light.ansi.gz +0 -0
  470. package/docs/evidence/terminal-2026-10-17-followup/80x24-question-batch.ansi.gz +0 -0
  471. package/docs/evidence/terminal-2026-10-17-followup/80x24-question.ansi.gz +0 -0
  472. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-approval-0.ansi.gz +0 -0
  473. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-plugin-light.ansi.gz +0 -0
  474. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-question-batch.ansi.gz +0 -0
  475. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/80x24-question.ansi.gz +0 -0
  476. package/docs/evidence/terminal-2026-10-17-followup/app-bundle/verification.json +0 -95
  477. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-approval-0.ansi.gz +0 -0
  478. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-plugin-light.ansi.gz +0 -0
  479. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-question-batch.ansi.gz +0 -0
  480. package/docs/evidence/terminal-2026-10-17-followup/global-install/80x24-question.ansi.gz +0 -0
  481. package/docs/evidence/terminal-2026-10-17-followup/global-install/README.md +0 -27
  482. package/docs/evidence/terminal-2026-10-17-followup/global-install/shell-command-80x24.ansi.gz +0 -0
  483. package/docs/evidence/terminal-2026-10-17-followup/global-install/shell-command.json +0 -18
  484. package/docs/evidence/terminal-2026-10-17-followup/global-install/verification.json +0 -95
  485. package/docs/evidence/terminal-2026-10-17-followup/harness-reference-80x24.json.gz +0 -0
  486. package/docs/evidence/terminal-2026-10-17-followup/harness-reference-final-80x24.json.gz +0 -0
  487. package/docs/evidence/terminal-2026-10-17-followup/harness-reference-scenario.json +0 -60
  488. package/docs/evidence/terminal-2026-10-17-followup/live-codex/README.md +0 -24
  489. package/docs/evidence/terminal-2026-10-17-followup/live-codex/complete-80x24.ansi.gz +0 -0
  490. package/docs/evidence/terminal-2026-10-17-followup/live-codex/verification.json +0 -57
  491. package/docs/evidence/terminal-2026-10-17-followup/omp-reference-80x24-early.json.gz +0 -0
  492. package/docs/evidence/terminal-2026-10-17-followup/omp-reference-80x24.json.gz +0 -0
  493. package/docs/evidence/terminal-2026-10-17-followup/omp-reference-scenario.json +0 -58
  494. package/docs/evidence/terminal-2026-10-17-followup/omp-supplemental-static.json.gz +0 -0
  495. package/docs/evidence/terminal-2026-10-17-followup/rea-artifacts.json +0 -320
  496. package/docs/evidence/terminal-2026-10-17-followup/reference-comparison.json +0 -30
  497. package/docs/evidence/terminal-2026-10-17-followup/reference-comparison.md +0 -133
  498. package/docs/evidence/terminal-2026-10-17-followup/reference-source-observations.json +0 -20
  499. package/docs/evidence/terminal-2026-10-17-followup/verification.json +0 -207
  500. package/src/accounts/accounts.test.ts +0 -333
  501. package/src/accounts/accounts.ts +0 -658
  502. package/src/accounts/env.test.ts +0 -95
  503. package/src/accounts/env.ts +0 -338
  504. package/src/accounts/secrets.ts +0 -50
  505. package/src/accounts/store.ts +0 -338
  506. package/src/capabilities/api.ts +0 -75
  507. package/src/capabilities/runSnapshot.ts +0 -59
  508. package/src/capabilities/types.ts +0 -34
  509. package/src/cli.ts +0 -118
  510. package/src/core/bus.ts +0 -34
  511. package/src/core/changes.ts +0 -33
  512. package/src/core/env.ts +0 -27
  513. package/src/core/errors.ts +0 -32
  514. package/src/core/frontmatter.ts +0 -47
  515. package/src/core/fs.test.ts +0 -38
  516. package/src/core/fs.ts +0 -92
  517. package/src/core/index.ts +0 -193
  518. package/src/core/path.test.ts +0 -14
  519. package/src/core/path.ts +0 -79
  520. package/src/core/projects.ts +0 -90
  521. package/src/core/text.ts +0 -39
  522. package/src/harness.ts +0 -312
  523. package/src/hub/catalog.json +0 -123
  524. package/src/hub/cli.ts +0 -59
  525. package/src/hub/hub.test.ts +0 -205
  526. package/src/hub/hub.ts +0 -256
  527. package/src/hub/schema.ts +0 -81
  528. package/src/index.ts +0 -75
  529. package/src/mcp/connections.ts +0 -614
  530. package/src/mcp/manager.ts +0 -130
  531. package/src/mcp/oauth.ts +0 -195
  532. package/src/mcp/scopeMigration.test.ts +0 -79
  533. package/src/mcp/scopeMigration.ts +0 -204
  534. package/src/mcp/service.test.ts +0 -376
  535. package/src/mcp/service.ts +0 -549
  536. package/src/mcp/types.ts +0 -108
  537. package/src/memory/api.test.ts +0 -82
  538. package/src/memory/api.ts +0 -303
  539. package/src/memory/blocks.test.ts +0 -78
  540. package/src/memory/blocks.ts +0 -408
  541. package/src/memory/caller.ts +0 -69
  542. package/src/memory/curation.test.ts +0 -163
  543. package/src/memory/curation.ts +0 -64
  544. package/src/memory/dispatch.ts +0 -59
  545. package/src/memory/facts.test.ts +0 -41
  546. package/src/memory/facts.ts +0 -248
  547. package/src/memory/graph.ts +0 -103
  548. package/src/memory/health.test.ts +0 -130
  549. package/src/memory/health.ts +0 -74
  550. package/src/memory/maintainer.ts +0 -272
  551. package/src/memory/maintenance.test.ts +0 -176
  552. package/src/memory/maintenance.ts +0 -518
  553. package/src/memory/migrate.ts +0 -79
  554. package/src/memory/operations.ts +0 -150
  555. package/src/memory/proposals.test.ts +0 -168
  556. package/src/memory/proposals.ts +0 -584
  557. package/src/memory/recall.test.ts +0 -115
  558. package/src/memory/recall.ts +0 -278
  559. package/src/memory/references.ts +0 -77
  560. package/src/memory/runContext.ts +0 -93
  561. package/src/memory/secrets.ts +0 -6
  562. package/src/memory/store.test.ts +0 -66
  563. package/src/memory/store.ts +0 -385
  564. package/src/memory/wiki.test.ts +0 -47
  565. package/src/memory/wiki.ts +0 -422
  566. package/src/memory/wikiIndex.test.ts +0 -88
  567. package/src/memory/wikiIndex.ts +0 -116
  568. package/src/plugins/api.ts +0 -181
  569. package/src/plugins/attachments.test.ts +0 -84
  570. package/src/plugins/attachments.ts +0 -141
  571. package/src/plugins/builtin.ts +0 -82
  572. package/src/plugins/catalogue.test.ts +0 -254
  573. package/src/plugins/catalogue.ts +0 -251
  574. package/src/plugins/cli.ts +0 -184
  575. package/src/plugins/discover.ts +0 -151
  576. package/src/plugins/firstParty.test.ts +0 -143
  577. package/src/plugins/firstParty.ts +0 -129
  578. package/src/plugins/hooks.test.ts +0 -250
  579. package/src/plugins/hooks.ts +0 -239
  580. package/src/plugins/identity.ts +0 -37
  581. package/src/plugins/install.test.ts +0 -107
  582. package/src/plugins/install.ts +0 -106
  583. package/src/plugins/inventory.ts +0 -123
  584. package/src/plugins/manifest.ts +0 -76
  585. package/src/plugins/plugins.test.ts +0 -205
  586. package/src/plugins/plugins.ts +0 -189
  587. package/src/plugins/proposal.ts +0 -121
  588. package/src/plugins/runtime.test.ts +0 -40
  589. package/src/plugins/runtime.ts +0 -82
  590. package/src/plugins/trust.ts +0 -142
  591. package/src/plugins/types.ts +0 -149
  592. package/src/prompt/compile.test.ts +0 -261
  593. package/src/prompt/compile.ts +0 -732
  594. package/src/server/methods.ts +0 -349
  595. package/src/server/remote.ts +0 -77
  596. package/src/server/rpc.ts +0 -116
  597. package/src/server/serve.ts +0 -28
  598. package/src/server/server.test.ts +0 -174
  599. package/src/sessions/approvals.ts +0 -118
  600. package/src/sessions/contracts.ts +0 -336
  601. package/src/sessions/conversation.test.ts +0 -177
  602. package/src/sessions/extensionSession.test.ts +0 -74
  603. package/src/sessions/extensionUi.test.ts +0 -65
  604. package/src/sessions/extensionUi.ts +0 -102
  605. package/src/sessions/history.ts +0 -51
  606. package/src/sessions/lineageJoin.ts +0 -75
  607. package/src/sessions/policy.ts +0 -36
  608. package/src/sessions/pricing.ts +0 -60
  609. package/src/sessions/questionBatches.test.ts +0 -110
  610. package/src/sessions/reasoningSummaries.ts +0 -59
  611. package/src/sessions/registry.ts +0 -381
  612. package/src/sessions/runIndex.ts +0 -99
  613. package/src/sessions/runStore.test.ts +0 -152
  614. package/src/sessions/runStore.ts +0 -332
  615. package/src/sessions/runner.ts +0 -604
  616. package/src/sessions/runtimeResources.test.ts +0 -61
  617. package/src/sessions/sessions.test.ts +0 -549
  618. package/src/sessions/sessions.ts +0 -339
  619. package/src/skills/registry.test.ts +0 -104
  620. package/src/skills/registry.ts +0 -413
  621. package/src/terminal/accountsMenu.test.ts +0 -225
  622. package/src/terminal/accountsMenu.ts +0 -382
  623. package/src/terminal/cli.ts +0 -149
  624. package/src/terminal/client.ts +0 -74
  625. package/src/terminal/control.test.ts +0 -23
  626. package/src/terminal/control.ts +0 -23
  627. package/src/terminal/controller.ts +0 -291
  628. package/src/terminal/hubMenu.ts +0 -24
  629. package/src/terminal/launch.test.ts +0 -25
  630. package/src/terminal/launch.ts +0 -48
  631. package/src/terminal/piExtension.lifecycle.test.ts +0 -55
  632. package/src/terminal/piExtension.ts +0 -259
  633. package/src/terminal/pluginControl.test.ts +0 -146
  634. package/src/terminal/pluginMenu.ts +0 -112
  635. package/src/terminal/socket.test.ts +0 -71
  636. package/src/terminal/socket.ts +0 -232
  637. package/src/terminal/standalone.test.ts +0 -167
  638. package/src/terminal/standalone.ts +0 -153
  639. package/src/terminal/terminal.test.ts +0 -399
  640. package/src/terminal/terminals.ts +0 -553
  641. package/src/terminal/tui/application.test.ts +0 -114
  642. package/src/terminal/tui/application.ts +0 -491
  643. package/src/terminal/tui/commands.test.ts +0 -218
  644. package/src/terminal/tui/commands.ts +0 -361
  645. package/src/terminal/tui/dialogs.ts +0 -301
  646. package/src/terminal/tui/editor.test.ts +0 -84
  647. package/src/terminal/tui/editor.ts +0 -79
  648. package/src/terminal/tui/keybindings.test.ts +0 -22
  649. package/src/terminal/tui/keybindings.ts +0 -50
  650. package/src/terminal/tui/piAdapter.ts +0 -62
  651. package/src/terminal/tui/presentation.test.ts +0 -79
  652. package/src/terminal/tui/questions.test.ts +0 -41
  653. package/src/terminal/tui/questions.ts +0 -47
  654. package/src/terminal/tui/runtime.socket.test.ts +0 -104
  655. package/src/terminal/tui/runtime.test.ts +0 -215
  656. package/src/terminal/tui/runtime.ts +0 -388
  657. package/src/terminal/tui/sessionUi.ts +0 -24
  658. package/src/terminal/tui/settings.test.ts +0 -150
  659. package/src/terminal/tui/settings.ts +0 -188
  660. package/src/terminal/tui/status.test.ts +0 -70
  661. package/src/terminal/tui/status.ts +0 -109
  662. package/src/terminal/tui/theme.ts +0 -174
  663. package/src/terminal/tui/tools.test.ts +0 -145
  664. package/src/terminal/tui/tools.ts +0 -142
  665. package/src/terminal/tui/transcript.test.ts +0 -25
  666. package/src/terminal/tui/transcript.ts +0 -124
  667. package/src/terminal/tui/ui.test.ts +0 -313
  668. package/src/terminal/tui/ui.ts +0 -166
  669. package/src/terminal/tui/welcome.ts +0 -102
  670. package/src/tools/askUser.test.ts +0 -69
  671. package/src/tools/askUser.ts +0 -59
  672. package/src/tools/definitions.ts +0 -187
  673. package/src/tools/maintenance.ts +0 -24
  674. package/src/tools/memoryTools.ts +0 -22
  675. package/src/tools/pluginPropose.ts +0 -41
  676. package/src/tools/registryWrite.test.ts +0 -101
  677. package/src/tools/registryWrite.ts +0 -182
  678. package/src/tools/spawnSubagent.ts +0 -92
  679. package/src/tools/types.ts +0 -39
  680. package/src/web/safeRequest.ts +0 -171
  681. package/src/web/text.ts +0 -53
  682. package/src/web/tools.ts +0 -134
  683. 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
+ }