gsd-pi 2.76.0-dev.fe143342a → 2.77.0-dev.538325aea

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 (802) hide show
  1. package/README.md +17 -35
  2. package/dist/claude-cli-check.js +32 -3
  3. package/dist/cli.js +13 -21
  4. package/dist/extension-registry.js +1 -1
  5. package/dist/headless-ui.d.ts +1 -1
  6. package/dist/headless.js +2 -4
  7. package/dist/loader.js +0 -1
  8. package/dist/onboarding.js +50 -5
  9. package/dist/provider-migrations.d.ts +2 -2
  10. package/dist/provider-migrations.js +2 -1
  11. package/dist/remote-questions-config.js +1 -1
  12. package/dist/resources/extensions/async-jobs/async-bash-tool.js +1 -1
  13. package/dist/resources/extensions/aws-auth/index.js +2 -1
  14. package/dist/resources/extensions/bg-shell/bg-shell-lifecycle.js +6 -9
  15. package/dist/resources/extensions/bg-shell/process-manager.js +2 -1
  16. package/dist/resources/extensions/browser-tools/index.js +0 -1
  17. package/dist/resources/extensions/claude-code-cli/index.js +1 -1
  18. package/dist/resources/extensions/claude-code-cli/partial-builder.js +106 -17
  19. package/dist/resources/extensions/claude-code-cli/readiness.js +4 -3
  20. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +28 -23
  21. package/dist/resources/extensions/gsd/auto/loop.js +9 -0
  22. package/dist/resources/extensions/gsd/auto/phases.js +54 -4
  23. package/dist/resources/extensions/gsd/auto/run-unit.js +38 -2
  24. package/dist/resources/extensions/gsd/auto/session.js +18 -1
  25. package/dist/resources/extensions/gsd/auto-dispatch.js +56 -17
  26. package/dist/resources/extensions/gsd/auto-model-selection.js +1 -1
  27. package/dist/resources/extensions/gsd/auto-post-unit.js +59 -2
  28. package/dist/resources/extensions/gsd/auto-prompts.js +14 -0
  29. package/dist/resources/extensions/gsd/auto-recovery.js +69 -1
  30. package/dist/resources/extensions/gsd/auto-start.js +35 -38
  31. package/dist/resources/extensions/gsd/auto-worktree.js +51 -53
  32. package/dist/resources/extensions/gsd/auto.js +55 -16
  33. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +17 -1
  34. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +17 -6
  35. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +34 -2
  36. package/dist/resources/extensions/gsd/clean-root-preflight.js +93 -0
  37. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +968 -23
  38. package/dist/resources/extensions/gsd/dispatch-guard.js +44 -3
  39. package/dist/resources/extensions/gsd/gitignore.js +1 -0
  40. package/dist/resources/extensions/gsd/gsd-db.js +90 -30
  41. package/dist/resources/extensions/gsd/guided-flow.js +191 -2
  42. package/dist/resources/extensions/gsd/health-widget.js +4 -1
  43. package/dist/resources/extensions/gsd/key-manager.js +22 -0
  44. package/dist/resources/extensions/gsd/model-router.js +36 -3
  45. package/dist/resources/extensions/gsd/pre-execution-checks.js +31 -6
  46. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -0
  47. package/dist/resources/extensions/gsd/prompts/discuss.md +29 -2
  48. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +5 -2
  49. package/dist/resources/extensions/gsd/prompts/system.md +1 -0
  50. package/dist/resources/extensions/gsd/safety/evidence-collector.js +96 -0
  51. package/dist/resources/extensions/gsd/safety/file-change-validator.js +12 -4
  52. package/dist/resources/extensions/gsd/safety/safety-harness.js +5 -1
  53. package/dist/resources/extensions/gsd/token-counter.js +22 -5
  54. package/dist/resources/extensions/gsd/tools/complete-milestone.js +16 -10
  55. package/dist/resources/extensions/gsd/uok/plan-v2.js +20 -3
  56. package/dist/resources/extensions/gsd/worktree-resolver.js +50 -10
  57. package/dist/resources/extensions/mcp-client/index.js +1 -1
  58. package/dist/resources/extensions/ollama/index.js +1 -2
  59. package/dist/resources/extensions/ollama/ollama-chat-provider.js +5 -15
  60. package/dist/resources/extensions/remote-questions/config.js +12 -1
  61. package/dist/resources/extensions/universal-config/index.js +1 -1
  62. package/dist/resources/skills/verify-before-complete/SKILL.md +2 -1
  63. package/dist/resources/skills/write-docs/SKILL.md +2 -1
  64. package/dist/security-overrides.d.ts +4 -1
  65. package/dist/security-overrides.js +16 -3
  66. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  67. package/dist/web/standalone/.next/BUILD_ID +1 -1
  68. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  69. package/dist/web/standalone/.next/build-manifest.json +3 -3
  70. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  71. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  72. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  73. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  74. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  75. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  76. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  77. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  78. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  79. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  80. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  81. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  82. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  83. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  84. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  85. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  86. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  89. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  90. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +1 -1
  91. package/dist/web/standalone/.next/server/app/index.html +1 -1
  92. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  99. package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
  100. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  101. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  102. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  103. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  104. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  105. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  106. package/dist/web/standalone/.next/static/chunks/2826.d445fb428ef41fa1.js +9 -0
  107. package/dist/web/standalone/.next/static/chunks/{webpack-5fc74f13a25fa1bb.js → webpack-1832629448831fdc.js} +1 -1
  108. package/dist/web-mode.js +1 -1
  109. package/dist/welcome-screen.js +19 -15
  110. package/dist/wizard.js +4 -5
  111. package/package.json +25 -7
  112. package/packages/daemon/package.json +2 -2
  113. package/packages/gsd-agent-core/dist/agent-session.d.ts +716 -0
  114. package/packages/gsd-agent-core/dist/agent-session.d.ts.map +1 -0
  115. package/packages/gsd-agent-core/dist/agent-session.js +2595 -0
  116. package/packages/gsd-agent-core/dist/agent-session.js.map +1 -0
  117. package/packages/gsd-agent-core/dist/artifact-manager.d.ts +52 -0
  118. package/packages/gsd-agent-core/dist/artifact-manager.d.ts.map +1 -0
  119. package/packages/gsd-agent-core/dist/artifact-manager.js +118 -0
  120. package/packages/gsd-agent-core/dist/artifact-manager.js.map +1 -0
  121. package/packages/gsd-agent-core/dist/bash-executor.d.ts +57 -0
  122. package/packages/gsd-agent-core/dist/bash-executor.d.ts.map +1 -0
  123. package/packages/gsd-agent-core/dist/bash-executor.js +282 -0
  124. package/packages/gsd-agent-core/dist/bash-executor.js.map +1 -0
  125. package/packages/gsd-agent-core/dist/blob-store.d.ts +39 -0
  126. package/packages/gsd-agent-core/dist/blob-store.d.ts.map +1 -0
  127. package/packages/gsd-agent-core/dist/blob-store.js +151 -0
  128. package/packages/gsd-agent-core/dist/blob-store.js.map +1 -0
  129. package/packages/gsd-agent-core/dist/compaction/branch-summarization.d.ts +90 -0
  130. package/packages/gsd-agent-core/dist/compaction/branch-summarization.d.ts.map +1 -0
  131. package/packages/gsd-agent-core/dist/compaction/branch-summarization.js +207 -0
  132. package/packages/gsd-agent-core/dist/compaction/branch-summarization.js.map +1 -0
  133. package/packages/gsd-agent-core/dist/compaction/compaction.d.ts +137 -0
  134. package/packages/gsd-agent-core/dist/compaction/compaction.d.ts.map +1 -0
  135. package/packages/gsd-agent-core/dist/compaction/compaction.js +621 -0
  136. package/packages/gsd-agent-core/dist/compaction/compaction.js.map +1 -0
  137. package/packages/gsd-agent-core/dist/compaction/index.d.ts +7 -0
  138. package/packages/gsd-agent-core/dist/compaction/index.d.ts.map +1 -0
  139. package/packages/gsd-agent-core/dist/compaction/index.js +7 -0
  140. package/packages/gsd-agent-core/dist/compaction/index.js.map +1 -0
  141. package/packages/gsd-agent-core/dist/compaction/utils.d.ts +78 -0
  142. package/packages/gsd-agent-core/dist/compaction/utils.d.ts.map +1 -0
  143. package/packages/gsd-agent-core/dist/compaction/utils.js +263 -0
  144. package/packages/gsd-agent-core/dist/compaction/utils.js.map +1 -0
  145. package/packages/gsd-agent-core/dist/compaction-orchestrator.d.ts +90 -0
  146. package/packages/gsd-agent-core/dist/compaction-orchestrator.d.ts.map +1 -0
  147. package/packages/gsd-agent-core/dist/compaction-orchestrator.js +338 -0
  148. package/packages/gsd-agent-core/dist/compaction-orchestrator.js.map +1 -0
  149. package/packages/gsd-agent-core/dist/contextual-tips.d.ts +43 -0
  150. package/packages/gsd-agent-core/dist/contextual-tips.d.ts.map +1 -0
  151. package/packages/gsd-agent-core/dist/contextual-tips.js +208 -0
  152. package/packages/gsd-agent-core/dist/contextual-tips.js.map +1 -0
  153. package/packages/gsd-agent-core/dist/export-html/ansi-to-html.d.ts +18 -0
  154. package/packages/gsd-agent-core/dist/export-html/ansi-to-html.d.ts.map +1 -0
  155. package/packages/gsd-agent-core/dist/export-html/ansi-to-html.js +250 -0
  156. package/packages/gsd-agent-core/dist/export-html/ansi-to-html.js.map +1 -0
  157. package/packages/gsd-agent-core/dist/export-html/index.d.ts +37 -0
  158. package/packages/gsd-agent-core/dist/export-html/index.d.ts.map +1 -0
  159. package/packages/gsd-agent-core/dist/export-html/index.js +257 -0
  160. package/packages/gsd-agent-core/dist/export-html/index.js.map +1 -0
  161. package/packages/gsd-agent-core/dist/export-html/template.css +971 -0
  162. package/packages/gsd-agent-core/dist/export-html/template.html +54 -0
  163. package/packages/gsd-agent-core/dist/export-html/template.js +1583 -0
  164. package/packages/gsd-agent-core/dist/export-html/tool-renderer.d.ts +38 -0
  165. package/packages/gsd-agent-core/dist/export-html/tool-renderer.d.ts.map +1 -0
  166. package/packages/gsd-agent-core/dist/export-html/tool-renderer.js +70 -0
  167. package/packages/gsd-agent-core/dist/export-html/tool-renderer.js.map +1 -0
  168. package/packages/gsd-agent-core/dist/export-html/vendor/highlight.min.js +1213 -0
  169. package/packages/gsd-agent-core/dist/export-html/vendor/marked.min.js +6 -0
  170. package/packages/gsd-agent-core/dist/fallback-resolver.d.ts +75 -0
  171. package/packages/gsd-agent-core/dist/fallback-resolver.d.ts.map +1 -0
  172. package/packages/gsd-agent-core/dist/fallback-resolver.js +118 -0
  173. package/packages/gsd-agent-core/dist/fallback-resolver.js.map +1 -0
  174. package/packages/gsd-agent-core/dist/image-overflow-recovery.d.ts +44 -0
  175. package/packages/gsd-agent-core/dist/image-overflow-recovery.d.ts.map +1 -0
  176. package/packages/gsd-agent-core/dist/image-overflow-recovery.js +99 -0
  177. package/packages/gsd-agent-core/dist/image-overflow-recovery.js.map +1 -0
  178. package/packages/gsd-agent-core/dist/index.d.ts +14 -0
  179. package/packages/gsd-agent-core/dist/index.d.ts.map +1 -0
  180. package/packages/gsd-agent-core/dist/index.js +19 -0
  181. package/packages/gsd-agent-core/dist/index.js.map +1 -0
  182. package/packages/gsd-agent-core/dist/keybindings.d.ts +47 -0
  183. package/packages/gsd-agent-core/dist/keybindings.d.ts.map +1 -0
  184. package/packages/gsd-agent-core/dist/keybindings.js +156 -0
  185. package/packages/gsd-agent-core/dist/keybindings.js.map +1 -0
  186. package/packages/gsd-agent-core/dist/lifecycle-hooks.d.ts +42 -0
  187. package/packages/gsd-agent-core/dist/lifecycle-hooks.d.ts.map +1 -0
  188. package/packages/gsd-agent-core/dist/lifecycle-hooks.js +204 -0
  189. package/packages/gsd-agent-core/dist/lifecycle-hooks.js.map +1 -0
  190. package/packages/gsd-agent-core/dist/retry-handler.d.ts +128 -0
  191. package/packages/gsd-agent-core/dist/retry-handler.d.ts.map +1 -0
  192. package/packages/gsd-agent-core/dist/retry-handler.js +518 -0
  193. package/packages/gsd-agent-core/dist/retry-handler.js.map +1 -0
  194. package/packages/gsd-agent-core/dist/sdk.d.ts +159 -0
  195. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -0
  196. package/packages/gsd-agent-core/dist/sdk.js +375 -0
  197. package/packages/gsd-agent-core/dist/sdk.js.map +1 -0
  198. package/packages/gsd-agent-core/dist/system-prompt.d.ts +28 -0
  199. package/packages/gsd-agent-core/dist/system-prompt.d.ts.map +1 -0
  200. package/packages/gsd-agent-core/dist/system-prompt.js +201 -0
  201. package/packages/gsd-agent-core/dist/system-prompt.js.map +1 -0
  202. package/packages/gsd-agent-core/package.json +25 -0
  203. package/packages/gsd-agent-core/scripts/copy-assets.cjs +43 -0
  204. package/packages/gsd-agent-core/src/agent-session.test.ts +169 -0
  205. package/packages/gsd-agent-core/src/agent-session.ts +3358 -0
  206. package/packages/gsd-agent-core/src/artifact-manager.ts +126 -0
  207. package/packages/gsd-agent-core/src/bash-executor.ts +352 -0
  208. package/packages/gsd-agent-core/src/blob-store.ts +154 -0
  209. package/packages/gsd-agent-core/src/compaction/branch-summarization.ts +317 -0
  210. package/packages/gsd-agent-core/src/compaction/compaction.ts +855 -0
  211. package/packages/gsd-agent-core/src/compaction/index.ts +7 -0
  212. package/packages/gsd-agent-core/src/compaction/utils.ts +312 -0
  213. package/packages/gsd-agent-core/src/compaction-orchestrator.ts +449 -0
  214. package/packages/gsd-agent-core/src/contextual-tips.ts +232 -0
  215. package/packages/gsd-agent-core/src/export-html/ansi-to-html.ts +259 -0
  216. package/packages/gsd-agent-core/src/export-html/index.ts +345 -0
  217. package/packages/gsd-agent-core/src/export-html/template.css +971 -0
  218. package/packages/gsd-agent-core/src/export-html/template.html +54 -0
  219. package/packages/gsd-agent-core/src/export-html/template.js +1583 -0
  220. package/packages/gsd-agent-core/src/export-html/tool-renderer.ts +114 -0
  221. package/packages/gsd-agent-core/src/export-html/vendor/highlight.min.js +1213 -0
  222. package/packages/gsd-agent-core/src/export-html/vendor/marked.min.js +6 -0
  223. package/packages/gsd-agent-core/src/fallback-resolver.ts +193 -0
  224. package/packages/gsd-agent-core/src/image-overflow-recovery.ts +120 -0
  225. package/packages/gsd-agent-core/src/index.ts +68 -0
  226. package/packages/gsd-agent-core/src/keybindings.ts +220 -0
  227. package/packages/gsd-agent-core/src/lifecycle-hooks.ts +284 -0
  228. package/packages/gsd-agent-core/src/retry-handler.ts +620 -0
  229. package/packages/gsd-agent-core/src/sdk.ts +550 -0
  230. package/packages/gsd-agent-core/src/system-prompt.ts +270 -0
  231. package/packages/gsd-agent-core/tsconfig.json +28 -0
  232. package/packages/gsd-agent-core/tsconfig.tsbuildinfo +1 -0
  233. package/packages/gsd-agent-modes/dist/cli/args.d.ts +58 -0
  234. package/packages/gsd-agent-modes/dist/cli/args.d.ts.map +1 -0
  235. package/packages/gsd-agent-modes/dist/cli/args.js +324 -0
  236. package/packages/gsd-agent-modes/dist/cli/args.js.map +1 -0
  237. package/packages/gsd-agent-modes/dist/cli/config-selector.d.ts +13 -0
  238. package/packages/gsd-agent-modes/dist/cli/config-selector.d.ts.map +1 -0
  239. package/packages/gsd-agent-modes/dist/cli/config-selector.js +32 -0
  240. package/packages/gsd-agent-modes/dist/cli/config-selector.js.map +1 -0
  241. package/packages/gsd-agent-modes/dist/cli/file-processor.d.ts +15 -0
  242. package/packages/gsd-agent-modes/dist/cli/file-processor.d.ts.map +1 -0
  243. package/packages/gsd-agent-modes/dist/cli/file-processor.js +86 -0
  244. package/packages/gsd-agent-modes/dist/cli/file-processor.js.map +1 -0
  245. package/packages/gsd-agent-modes/dist/cli/list-models.d.ts +21 -0
  246. package/packages/gsd-agent-modes/dist/cli/list-models.d.ts.map +1 -0
  247. package/packages/gsd-agent-modes/dist/cli/list-models.js +114 -0
  248. package/packages/gsd-agent-modes/dist/cli/list-models.js.map +1 -0
  249. package/packages/gsd-agent-modes/dist/cli/session-picker.d.ts +10 -0
  250. package/packages/gsd-agent-modes/dist/cli/session-picker.d.ts.map +1 -0
  251. package/packages/gsd-agent-modes/dist/cli/session-picker.js +37 -0
  252. package/packages/gsd-agent-modes/dist/cli/session-picker.js.map +1 -0
  253. package/packages/gsd-agent-modes/dist/index.d.ts +7 -0
  254. package/packages/gsd-agent-modes/dist/index.d.ts.map +1 -0
  255. package/packages/gsd-agent-modes/dist/index.js +7 -0
  256. package/packages/gsd-agent-modes/dist/index.js.map +1 -0
  257. package/packages/gsd-agent-modes/dist/main.d.ts +8 -0
  258. package/packages/gsd-agent-modes/dist/main.d.ts.map +1 -0
  259. package/packages/gsd-agent-modes/dist/main.js +491 -0
  260. package/packages/gsd-agent-modes/dist/main.js.map +1 -0
  261. package/packages/gsd-agent-modes/dist/modes/interactive/components/armin.d.ts +34 -0
  262. package/packages/gsd-agent-modes/dist/modes/interactive/components/armin.d.ts.map +1 -0
  263. package/packages/gsd-agent-modes/dist/modes/interactive/components/armin.js +330 -0
  264. package/packages/gsd-agent-modes/dist/modes/interactive/components/armin.js.map +1 -0
  265. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts +29 -0
  266. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
  267. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js +141 -0
  268. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js.map +1 -0
  269. package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.d.ts +36 -0
  270. package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
  271. package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js +157 -0
  272. package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js.map +1 -0
  273. package/packages/gsd-agent-modes/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
  274. package/packages/gsd-agent-modes/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
  275. package/packages/gsd-agent-modes/dist/modes/interactive/components/bordered-loader.js +48 -0
  276. package/packages/gsd-agent-modes/dist/modes/interactive/components/bordered-loader.js.map +1 -0
  277. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  278. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
  279. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js +43 -0
  280. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
  281. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-frame.d.ts +11 -0
  282. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-frame.d.ts.map +1 -0
  283. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-frame.js +47 -0
  284. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-frame.js.map +1 -0
  285. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  286. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
  287. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js +44 -0
  288. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
  289. package/packages/gsd-agent-modes/dist/modes/interactive/components/config-selector.d.ts +71 -0
  290. package/packages/gsd-agent-modes/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
  291. package/packages/gsd-agent-modes/dist/modes/interactive/components/config-selector.js +474 -0
  292. package/packages/gsd-agent-modes/dist/modes/interactive/components/config-selector.js.map +1 -0
  293. package/packages/gsd-agent-modes/dist/modes/interactive/components/countdown-timer.d.ts +15 -0
  294. package/packages/gsd-agent-modes/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
  295. package/packages/gsd-agent-modes/dist/modes/interactive/components/countdown-timer.js +32 -0
  296. package/packages/gsd-agent-modes/dist/modes/interactive/components/countdown-timer.js.map +1 -0
  297. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts +22 -0
  298. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
  299. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js +70 -0
  300. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js.map +1 -0
  301. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-message.d.ts +20 -0
  302. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
  303. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-message.js +75 -0
  304. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-message.js.map +1 -0
  305. package/packages/gsd-agent-modes/dist/modes/interactive/components/daxnuts.d.ts +23 -0
  306. package/packages/gsd-agent-modes/dist/modes/interactive/components/daxnuts.d.ts.map +1 -0
  307. package/packages/gsd-agent-modes/dist/modes/interactive/components/daxnuts.js +140 -0
  308. package/packages/gsd-agent-modes/dist/modes/interactive/components/daxnuts.js.map +1 -0
  309. package/packages/gsd-agent-modes/dist/modes/interactive/components/diff.d.ts +12 -0
  310. package/packages/gsd-agent-modes/dist/modes/interactive/components/diff.d.ts.map +1 -0
  311. package/packages/gsd-agent-modes/dist/modes/interactive/components/diff.js +133 -0
  312. package/packages/gsd-agent-modes/dist/modes/interactive/components/diff.js.map +1 -0
  313. package/packages/gsd-agent-modes/dist/modes/interactive/components/dynamic-border.d.ts +33 -0
  314. package/packages/gsd-agent-modes/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
  315. package/packages/gsd-agent-modes/dist/modes/interactive/components/dynamic-border.js +82 -0
  316. package/packages/gsd-agent-modes/dist/modes/interactive/components/dynamic-border.js.map +1 -0
  317. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.d.ts +20 -0
  318. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
  319. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.js +111 -0
  320. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.js.map +1 -0
  321. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.d.ts +24 -0
  322. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
  323. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.js +63 -0
  324. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.js.map +1 -0
  325. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.d.ts +33 -0
  326. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
  327. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.js +118 -0
  328. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.js.map +1 -0
  329. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts +32 -0
  330. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts.map +1 -0
  331. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js +230 -0
  332. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js.map +1 -0
  333. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.d.ts +34 -0
  334. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.d.ts.map +1 -0
  335. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.js +36 -0
  336. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.js.map +1 -0
  337. package/packages/gsd-agent-modes/dist/modes/interactive/components/keybinding-hints.d.ts +48 -0
  338. package/packages/gsd-agent-modes/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
  339. package/packages/gsd-agent-modes/dist/modes/interactive/components/keybinding-hints.js +72 -0
  340. package/packages/gsd-agent-modes/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
  341. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts +63 -0
  342. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
  343. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js +213 -0
  344. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js.map +1 -0
  345. package/packages/gsd-agent-modes/dist/modes/interactive/components/model-selector.d.ts +86 -0
  346. package/packages/gsd-agent-modes/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
  347. package/packages/gsd-agent-modes/dist/modes/interactive/components/model-selector.js +536 -0
  348. package/packages/gsd-agent-modes/dist/modes/interactive/components/model-selector.js.map +1 -0
  349. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.d.ts +19 -0
  350. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
  351. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.js +93 -0
  352. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.js.map +1 -0
  353. package/packages/gsd-agent-modes/dist/modes/interactive/components/provider-manager.d.ts +30 -0
  354. package/packages/gsd-agent-modes/dist/modes/interactive/components/provider-manager.d.ts.map +1 -0
  355. package/packages/gsd-agent-modes/dist/modes/interactive/components/provider-manager.js +169 -0
  356. package/packages/gsd-agent-modes/dist/modes/interactive/components/provider-manager.js.map +1 -0
  357. package/packages/gsd-agent-modes/dist/modes/interactive/components/scoped-models-selector.d.ts +49 -0
  358. package/packages/gsd-agent-modes/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
  359. package/packages/gsd-agent-modes/dist/modes/interactive/components/scoped-models-selector.js +267 -0
  360. package/packages/gsd-agent-modes/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
  361. package/packages/gsd-agent-modes/dist/modes/interactive/components/session-selector-search.d.ts +21 -0
  362. package/packages/gsd-agent-modes/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
  363. package/packages/gsd-agent-modes/dist/modes/interactive/components/session-selector-search.js +155 -0
  364. package/packages/gsd-agent-modes/dist/modes/interactive/components/session-selector-search.js.map +1 -0
  365. package/packages/gsd-agent-modes/dist/modes/interactive/components/session-selector.d.ts +97 -0
  366. package/packages/gsd-agent-modes/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
  367. package/packages/gsd-agent-modes/dist/modes/interactive/components/session-selector.js +810 -0
  368. package/packages/gsd-agent-modes/dist/modes/interactive/components/session-selector.js.map +1 -0
  369. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +71 -0
  370. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
  371. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +320 -0
  372. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -0
  373. package/packages/gsd-agent-modes/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  374. package/packages/gsd-agent-modes/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
  375. package/packages/gsd-agent-modes/dist/modes/interactive/components/show-images-selector.js +34 -0
  376. package/packages/gsd-agent-modes/dist/modes/interactive/components/show-images-selector.js.map +1 -0
  377. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  378. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
  379. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js +46 -0
  380. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
  381. package/packages/gsd-agent-modes/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  382. package/packages/gsd-agent-modes/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
  383. package/packages/gsd-agent-modes/dist/modes/interactive/components/theme-selector.js +45 -0
  384. package/packages/gsd-agent-modes/dist/modes/interactive/components/theme-selector.js.map +1 -0
  385. package/packages/gsd-agent-modes/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  386. package/packages/gsd-agent-modes/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
  387. package/packages/gsd-agent-modes/dist/modes/interactive/components/thinking-selector.js +46 -0
  388. package/packages/gsd-agent-modes/dist/modes/interactive/components/thinking-selector.js.map +1 -0
  389. package/packages/gsd-agent-modes/dist/modes/interactive/components/timestamp.d.ts +15 -0
  390. package/packages/gsd-agent-modes/dist/modes/interactive/components/timestamp.d.ts.map +1 -0
  391. package/packages/gsd-agent-modes/dist/modes/interactive/components/timestamp.js +40 -0
  392. package/packages/gsd-agent-modes/dist/modes/interactive/components/timestamp.js.map +1 -0
  393. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +111 -0
  394. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
  395. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +984 -0
  396. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -0
  397. package/packages/gsd-agent-modes/dist/modes/interactive/components/tree-render-utils.d.ts +44 -0
  398. package/packages/gsd-agent-modes/dist/modes/interactive/components/tree-render-utils.d.ts.map +1 -0
  399. package/packages/gsd-agent-modes/dist/modes/interactive/components/tree-render-utils.js +61 -0
  400. package/packages/gsd-agent-modes/dist/modes/interactive/components/tree-render-utils.js.map +1 -0
  401. package/packages/gsd-agent-modes/dist/modes/interactive/components/tree-selector.d.ts +109 -0
  402. package/packages/gsd-agent-modes/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
  403. package/packages/gsd-agent-modes/dist/modes/interactive/components/tree-selector.js +1035 -0
  404. package/packages/gsd-agent-modes/dist/modes/interactive/components/tree-selector.js.map +1 -0
  405. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  406. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
  407. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message-selector.js +112 -0
  408. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message-selector.js.map +1 -0
  409. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts +12 -0
  410. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts.map +1 -0
  411. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js +38 -0
  412. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js.map +1 -0
  413. package/packages/gsd-agent-modes/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  414. package/packages/gsd-agent-modes/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
  415. package/packages/gsd-agent-modes/dist/modes/interactive/components/visual-truncate.js +33 -0
  416. package/packages/gsd-agent-modes/dist/modes/interactive/components/visual-truncate.js.map +1 -0
  417. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +27 -0
  418. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -0
  419. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +793 -0
  420. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -0
  421. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.d.ts +4 -0
  422. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.d.ts.map +1 -0
  423. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js +62 -0
  424. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js.map +1 -0
  425. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts +22 -0
  426. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -0
  427. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +118 -0
  428. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -0
  429. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/model-controller.d.ts +7 -0
  430. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/model-controller.d.ts.map +1 -0
  431. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/model-controller.js +68 -0
  432. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/model-controller.js.map +1 -0
  433. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +50 -0
  434. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -0
  435. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js +2 -0
  436. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -0
  437. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +358 -0
  438. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
  439. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +3409 -0
  440. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -0
  441. package/packages/gsd-agent-modes/dist/modes/interactive/slash-command-handlers.d.ts +77 -0
  442. package/packages/gsd-agent-modes/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -0
  443. package/packages/gsd-agent-modes/dist/modes/interactive/slash-command-handlers.js +529 -0
  444. package/packages/gsd-agent-modes/dist/modes/interactive/slash-command-handlers.js.map +1 -0
  445. package/packages/gsd-agent-modes/dist/modes/interactive/utils/shorten-path.d.ts +6 -0
  446. package/packages/gsd-agent-modes/dist/modes/interactive/utils/shorten-path.d.ts.map +1 -0
  447. package/packages/gsd-agent-modes/dist/modes/interactive/utils/shorten-path.js +15 -0
  448. package/packages/gsd-agent-modes/dist/modes/interactive/utils/shorten-path.js.map +1 -0
  449. package/packages/gsd-agent-modes/dist/modes/print-mode.d.ts +28 -0
  450. package/packages/gsd-agent-modes/dist/modes/print-mode.d.ts.map +1 -0
  451. package/packages/gsd-agent-modes/dist/modes/print-mode.js +84 -0
  452. package/packages/gsd-agent-modes/dist/modes/print-mode.js.map +1 -0
  453. package/packages/gsd-agent-modes/dist/modes/rpc/jsonl.d.ts +17 -0
  454. package/packages/gsd-agent-modes/dist/modes/rpc/jsonl.d.ts.map +1 -0
  455. package/packages/gsd-agent-modes/dist/modes/rpc/jsonl.js +49 -0
  456. package/packages/gsd-agent-modes/dist/modes/rpc/jsonl.js.map +1 -0
  457. package/packages/gsd-agent-modes/dist/modes/rpc/remote-terminal.d.ts +37 -0
  458. package/packages/gsd-agent-modes/dist/modes/rpc/remote-terminal.d.ts.map +1 -0
  459. package/packages/gsd-agent-modes/dist/modes/rpc/remote-terminal.js +84 -0
  460. package/packages/gsd-agent-modes/dist/modes/rpc/remote-terminal.js.map +1 -0
  461. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts +243 -0
  462. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts.map +1 -0
  463. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js +464 -0
  464. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js.map +1 -0
  465. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts +25 -0
  466. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
  467. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +750 -0
  468. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -0
  469. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-types.d.ts +511 -0
  470. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-types.d.ts.map +1 -0
  471. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-types.js +8 -0
  472. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-types.js.map +1 -0
  473. package/packages/gsd-agent-modes/dist/modes/shared/command-context-actions.d.ts +19 -0
  474. package/packages/gsd-agent-modes/dist/modes/shared/command-context-actions.d.ts.map +1 -0
  475. package/packages/gsd-agent-modes/dist/modes/shared/command-context-actions.js +45 -0
  476. package/packages/gsd-agent-modes/dist/modes/shared/command-context-actions.js.map +1 -0
  477. package/packages/gsd-agent-modes/dist/pi-coding-agent-compat.d.ts +22 -0
  478. package/packages/gsd-agent-modes/dist/pi-coding-agent-compat.d.ts.map +1 -0
  479. package/packages/gsd-agent-modes/dist/pi-coding-agent-compat.js +21 -0
  480. package/packages/gsd-agent-modes/dist/pi-coding-agent-compat.js.map +1 -0
  481. package/packages/gsd-agent-modes/dist/pi-tui-compat.d.ts +4 -0
  482. package/packages/gsd-agent-modes/dist/pi-tui-compat.d.ts.map +1 -0
  483. package/packages/gsd-agent-modes/dist/pi-tui-compat.js +3 -0
  484. package/packages/gsd-agent-modes/dist/pi-tui-compat.js.map +1 -0
  485. package/packages/gsd-agent-modes/dist/theme.d.ts +15 -0
  486. package/packages/gsd-agent-modes/dist/theme.d.ts.map +1 -0
  487. package/packages/gsd-agent-modes/dist/theme.js +23 -0
  488. package/packages/gsd-agent-modes/dist/theme.js.map +1 -0
  489. package/packages/gsd-agent-modes/dist/utils/theme.d.ts +16 -0
  490. package/packages/gsd-agent-modes/dist/utils/theme.d.ts.map +1 -0
  491. package/packages/gsd-agent-modes/dist/utils/theme.js +11 -0
  492. package/packages/gsd-agent-modes/dist/utils/theme.js.map +1 -0
  493. package/packages/gsd-agent-modes/package.json +23 -0
  494. package/packages/gsd-agent-modes/src/cli/args.ts +350 -0
  495. package/packages/gsd-agent-modes/src/cli/config-selector.ts +54 -0
  496. package/packages/gsd-agent-modes/src/cli/file-processor.ts +107 -0
  497. package/packages/gsd-agent-modes/src/cli/list-models.ts +141 -0
  498. package/packages/gsd-agent-modes/src/cli/session-picker.ts +59 -0
  499. package/packages/gsd-agent-modes/src/index.ts +6 -0
  500. package/packages/gsd-agent-modes/src/main.ts +614 -0
  501. package/packages/gsd-agent-modes/src/modes/interactive/components/__tests__/login-dialog.test.ts +24 -0
  502. package/packages/gsd-agent-modes/src/modes/interactive/components/__tests__/provider-display-name.test.ts +18 -0
  503. package/packages/gsd-agent-modes/src/modes/interactive/components/__tests__/timestamp.test.ts +38 -0
  504. package/packages/gsd-agent-modes/src/modes/interactive/components/__tests__/tool-execution.test.ts +171 -0
  505. package/packages/gsd-agent-modes/src/modes/interactive/components/armin.ts +382 -0
  506. package/packages/gsd-agent-modes/src/modes/interactive/components/assistant-message.ts +178 -0
  507. package/packages/gsd-agent-modes/src/modes/interactive/components/bash-execution.ts +212 -0
  508. package/packages/gsd-agent-modes/src/modes/interactive/components/bordered-loader.ts +66 -0
  509. package/packages/gsd-agent-modes/src/modes/interactive/components/branch-summary-message.ts +59 -0
  510. package/packages/gsd-agent-modes/src/modes/interactive/components/chat-frame.ts +67 -0
  511. package/packages/gsd-agent-modes/src/modes/interactive/components/compaction-summary-message.ts +60 -0
  512. package/packages/gsd-agent-modes/src/modes/interactive/components/config-selector.ts +597 -0
  513. package/packages/gsd-agent-modes/src/modes/interactive/components/countdown-timer.ts +41 -0
  514. package/packages/gsd-agent-modes/src/modes/interactive/components/custom-editor.ts +88 -0
  515. package/packages/gsd-agent-modes/src/modes/interactive/components/custom-message.ts +100 -0
  516. package/packages/gsd-agent-modes/src/modes/interactive/components/daxnuts.ts +165 -0
  517. package/packages/gsd-agent-modes/src/modes/interactive/components/diff.ts +147 -0
  518. package/packages/gsd-agent-modes/src/modes/interactive/components/dynamic-border.test.ts +73 -0
  519. package/packages/gsd-agent-modes/src/modes/interactive/components/dynamic-border.ts +89 -0
  520. package/packages/gsd-agent-modes/src/modes/interactive/components/extension-editor.ts +151 -0
  521. package/packages/gsd-agent-modes/src/modes/interactive/components/extension-input.ts +100 -0
  522. package/packages/gsd-agent-modes/src/modes/interactive/components/extension-selector.ts +156 -0
  523. package/packages/gsd-agent-modes/src/modes/interactive/components/footer.ts +257 -0
  524. package/packages/gsd-agent-modes/src/modes/interactive/components/index.ts +35 -0
  525. package/packages/gsd-agent-modes/src/modes/interactive/components/keybinding-hints.ts +84 -0
  526. package/packages/gsd-agent-modes/src/modes/interactive/components/login-dialog.ts +257 -0
  527. package/packages/gsd-agent-modes/src/modes/interactive/components/model-selector.ts +656 -0
  528. package/packages/gsd-agent-modes/src/modes/interactive/components/oauth-selector.ts +122 -0
  529. package/packages/gsd-agent-modes/src/modes/interactive/components/provider-manager.ts +210 -0
  530. package/packages/gsd-agent-modes/src/modes/interactive/components/scoped-models-selector.ts +342 -0
  531. package/packages/gsd-agent-modes/src/modes/interactive/components/session-selector-search.ts +194 -0
  532. package/packages/gsd-agent-modes/src/modes/interactive/components/session-selector.ts +1011 -0
  533. package/packages/gsd-agent-modes/src/modes/interactive/components/settings-selector.ts +452 -0
  534. package/packages/gsd-agent-modes/src/modes/interactive/components/show-images-selector.ts +45 -0
  535. package/packages/gsd-agent-modes/src/modes/interactive/components/skill-invocation-message.ts +56 -0
  536. package/packages/gsd-agent-modes/src/modes/interactive/components/theme-selector.ts +63 -0
  537. package/packages/gsd-agent-modes/src/modes/interactive/components/thinking-selector.ts +64 -0
  538. package/packages/gsd-agent-modes/src/modes/interactive/components/timestamp.ts +48 -0
  539. package/packages/gsd-agent-modes/src/modes/interactive/components/tool-execution.ts +1157 -0
  540. package/packages/gsd-agent-modes/src/modes/interactive/components/tree-render-utils.ts +81 -0
  541. package/packages/gsd-agent-modes/src/modes/interactive/components/tree-selector.ts +1208 -0
  542. package/packages/gsd-agent-modes/src/modes/interactive/components/user-message-selector.ts +145 -0
  543. package/packages/gsd-agent-modes/src/modes/interactive/components/user-message.ts +44 -0
  544. package/packages/gsd-agent-modes/src/modes/interactive/components/visual-truncate.ts +50 -0
  545. package/packages/gsd-agent-modes/src/modes/interactive/controllers/chat-controller-ordering.test.ts +1430 -0
  546. package/packages/gsd-agent-modes/src/modes/interactive/controllers/chat-controller.test.ts +71 -0
  547. package/packages/gsd-agent-modes/src/modes/interactive/controllers/chat-controller.ts +957 -0
  548. package/packages/gsd-agent-modes/src/modes/interactive/controllers/extension-ui-controller.ts +63 -0
  549. package/packages/gsd-agent-modes/src/modes/interactive/controllers/input-controller.test.ts +183 -0
  550. package/packages/gsd-agent-modes/src/modes/interactive/controllers/input-controller.ts +140 -0
  551. package/packages/gsd-agent-modes/src/modes/interactive/controllers/model-controller.ts +77 -0
  552. package/packages/gsd-agent-modes/src/modes/interactive/interactive-mode-ordering.test.ts +44 -0
  553. package/packages/gsd-agent-modes/src/modes/interactive/interactive-mode-state.ts +49 -0
  554. package/packages/gsd-agent-modes/src/modes/interactive/interactive-mode.ts +4195 -0
  555. package/packages/gsd-agent-modes/src/modes/interactive/slash-command-handlers.ts +670 -0
  556. package/packages/gsd-agent-modes/src/modes/interactive/utils/shorten-path.ts +14 -0
  557. package/packages/gsd-agent-modes/src/modes/print-mode.ts +106 -0
  558. package/packages/gsd-agent-modes/src/modes/rpc/jsonl.ts +58 -0
  559. package/packages/gsd-agent-modes/src/modes/rpc/remote-terminal.ts +109 -0
  560. package/packages/gsd-agent-modes/src/modes/rpc/rpc-client.ts +572 -0
  561. package/packages/gsd-agent-modes/src/modes/rpc/rpc-mode.ts +902 -0
  562. package/packages/gsd-agent-modes/src/modes/rpc/rpc-protocol-v2.test.ts +971 -0
  563. package/packages/gsd-agent-modes/src/modes/rpc/rpc-types.ts +335 -0
  564. package/packages/gsd-agent-modes/src/modes/shared/command-context-actions.ts +53 -0
  565. package/packages/gsd-agent-modes/src/pi-coding-agent-compat.ts +42 -0
  566. package/packages/gsd-agent-modes/src/pi-tui-compat.ts +4 -0
  567. package/packages/gsd-agent-modes/src/theme.ts +25 -0
  568. package/packages/gsd-agent-modes/src/utils/theme.ts +24 -0
  569. package/packages/gsd-agent-modes/tsconfig.json +28 -0
  570. package/packages/gsd-agent-modes/tsconfig.tsbuildinfo +1 -0
  571. package/packages/gsd-agent-types/dist/index.d.ts +176 -0
  572. package/packages/gsd-agent-types/dist/index.d.ts.map +1 -0
  573. package/packages/gsd-agent-types/dist/index.js +24 -0
  574. package/packages/gsd-agent-types/dist/index.js.map +1 -0
  575. package/packages/gsd-agent-types/package.json +24 -0
  576. package/packages/gsd-agent-types/src/index.ts +206 -0
  577. package/packages/gsd-agent-types/tsconfig.json +25 -0
  578. package/packages/gsd-agent-types/tsconfig.tsbuildinfo +1 -0
  579. package/packages/mcp-server/dist/remote-questions.d.ts +45 -0
  580. package/packages/mcp-server/dist/remote-questions.d.ts.map +1 -0
  581. package/packages/mcp-server/dist/remote-questions.js +732 -0
  582. package/packages/mcp-server/dist/remote-questions.js.map +1 -0
  583. package/packages/mcp-server/dist/server.d.ts +7 -0
  584. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  585. package/packages/mcp-server/dist/server.js +77 -11
  586. package/packages/mcp-server/dist/server.js.map +1 -1
  587. package/packages/mcp-server/dist/session-manager.d.ts +14 -0
  588. package/packages/mcp-server/dist/session-manager.d.ts.map +1 -1
  589. package/packages/mcp-server/dist/session-manager.js +49 -1
  590. package/packages/mcp-server/dist/session-manager.js.map +1 -1
  591. package/packages/mcp-server/package.json +4 -3
  592. package/packages/mcp-server/src/mcp-server.test.ts +67 -0
  593. package/packages/mcp-server/src/remote-questions.test.ts +294 -0
  594. package/packages/mcp-server/src/remote-questions.ts +916 -0
  595. package/packages/mcp-server/src/server.ts +94 -18
  596. package/packages/mcp-server/src/session-manager.ts +43 -1
  597. package/packages/mcp-server/tsconfig.test.json +19 -0
  598. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  599. package/packages/native/dist/tsconfig.tsbuildinfo +1 -0
  600. package/packages/native/package.json +1 -1
  601. package/packages/native/tsconfig.json +2 -1
  602. package/packages/pi-agent-core/package.json +1 -1
  603. package/packages/pi-ai/dist/models/custom.d.ts +38 -0
  604. package/packages/pi-ai/dist/models/custom.d.ts.map +1 -1
  605. package/packages/pi-ai/dist/models/custom.js +41 -0
  606. package/packages/pi-ai/dist/models/custom.js.map +1 -1
  607. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +1 -1
  608. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  609. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  610. package/packages/pi-ai/dist/providers/anthropic-shared.js +27 -4
  611. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  612. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  613. package/packages/pi-ai/dist/providers/anthropic.js +8 -3
  614. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  615. package/packages/pi-ai/dist/providers/minimax-tool-name.test.d.ts +2 -0
  616. package/packages/pi-ai/dist/providers/minimax-tool-name.test.d.ts.map +1 -0
  617. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +80 -0
  618. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -0
  619. package/packages/pi-ai/dist/providers/simple-options.d.ts +10 -0
  620. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  621. package/packages/pi-ai/dist/providers/simple-options.js +16 -1
  622. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  623. package/packages/pi-ai/package.json +1 -1
  624. package/packages/pi-ai/src/models/custom.ts +42 -0
  625. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +1 -1
  626. package/packages/pi-ai/src/providers/anthropic-shared.ts +26 -5
  627. package/packages/pi-ai/src/providers/anthropic.ts +9 -3
  628. package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +98 -0
  629. package/packages/pi-ai/src/providers/simple-options.ts +17 -1
  630. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  631. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +3 -2
  632. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  633. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +2 -0
  634. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  635. package/packages/pi-coding-agent/dist/core/agent-session.js +7 -0
  636. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  637. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +2 -0
  638. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  639. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  640. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +7 -0
  641. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  642. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  643. package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.d.ts +2 -0
  644. package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.d.ts.map +1 -0
  645. package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.js +203 -0
  646. package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.js.map +1 -0
  647. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  648. package/packages/pi-coding-agent/dist/core/model-registry.js +14 -0
  649. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  650. package/packages/pi-coding-agent/dist/core/session-manager.js +1 -1
  651. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  652. package/packages/pi-coding-agent/dist/core/session-manager.test.js +21 -1
  653. package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
  654. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  655. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +13 -1
  656. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  657. package/packages/pi-coding-agent/package.json +1 -1
  658. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +3 -2
  659. package/packages/pi-coding-agent/src/core/agent-session.ts +11 -0
  660. package/packages/pi-coding-agent/src/core/extensions/runner.ts +2 -0
  661. package/packages/pi-coding-agent/src/core/extensions/types.ts +7 -0
  662. package/packages/pi-coding-agent/src/core/model-registry-custom-caps.test.ts +245 -0
  663. package/packages/pi-coding-agent/src/core/model-registry.ts +16 -0
  664. package/packages/pi-coding-agent/src/core/session-manager.test.ts +30 -1
  665. package/packages/pi-coding-agent/src/core/session-manager.ts +1 -1
  666. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +13 -1
  667. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  668. package/packages/pi-tui/package.json +1 -1
  669. package/packages/rpc-client/package.json +1 -1
  670. package/pkg/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  671. package/pkg/dist/core/export-html/ansi-to-html.js +1 -0
  672. package/pkg/dist/core/export-html/ansi-to-html.js.map +1 -1
  673. package/pkg/dist/core/export-html/index.d.ts +1 -1
  674. package/pkg/dist/core/export-html/index.d.ts.map +1 -1
  675. package/pkg/dist/core/export-html/index.js +39 -5
  676. package/pkg/dist/core/export-html/index.js.map +1 -1
  677. package/pkg/dist/core/export-html/tool-renderer.d.ts +2 -2
  678. package/pkg/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  679. package/pkg/dist/core/export-html/tool-renderer.js.map +1 -1
  680. package/pkg/package.json +1 -1
  681. package/scripts/ensure-workspace-builds.cjs +2 -0
  682. package/scripts/install.js +512 -0
  683. package/scripts/link-workspace-packages.cjs +2 -0
  684. package/scripts/postinstall.js +9 -178
  685. package/src/resources/extensions/async-jobs/async-bash-tool.ts +1 -1
  686. package/src/resources/extensions/aws-auth/index.ts +2 -1
  687. package/src/resources/extensions/bg-shell/bg-shell-lifecycle.ts +4 -7
  688. package/src/resources/extensions/bg-shell/index.ts +2 -1
  689. package/src/resources/extensions/bg-shell/process-manager.ts +2 -1
  690. package/src/resources/extensions/browser-tools/index.ts +2 -1
  691. package/src/resources/extensions/claude-code-cli/index.ts +1 -1
  692. package/src/resources/extensions/claude-code-cli/partial-builder.ts +115 -23
  693. package/src/resources/extensions/claude-code-cli/readiness.ts +4 -3
  694. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +30 -22
  695. package/src/resources/extensions/claude-code-cli/tests/provider-registration.test.ts +27 -0
  696. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +39 -6
  697. package/src/resources/extensions/gsd/auto/loop-deps.ts +13 -0
  698. package/src/resources/extensions/gsd/auto/loop.ts +9 -0
  699. package/src/resources/extensions/gsd/auto/phases.ts +78 -4
  700. package/src/resources/extensions/gsd/auto/run-unit.ts +40 -2
  701. package/src/resources/extensions/gsd/auto/session.ts +28 -1
  702. package/src/resources/extensions/gsd/auto-dispatch.ts +59 -16
  703. package/src/resources/extensions/gsd/auto-model-selection.ts +1 -1
  704. package/src/resources/extensions/gsd/auto-post-unit.ts +62 -3
  705. package/src/resources/extensions/gsd/auto-prompts.ts +28 -1
  706. package/src/resources/extensions/gsd/auto-recovery.ts +62 -1
  707. package/src/resources/extensions/gsd/auto-start.ts +40 -52
  708. package/src/resources/extensions/gsd/auto-worktree.ts +62 -63
  709. package/src/resources/extensions/gsd/auto.ts +58 -16
  710. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +23 -1
  711. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +18 -6
  712. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +35 -2
  713. package/src/resources/extensions/gsd/clean-root-preflight.ts +111 -0
  714. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +898 -32
  715. package/src/resources/extensions/gsd/dispatch-guard.ts +44 -2
  716. package/src/resources/extensions/gsd/gitignore.ts +1 -1
  717. package/src/resources/extensions/gsd/gsd-db.ts +92 -32
  718. package/src/resources/extensions/gsd/guided-flow.ts +223 -2
  719. package/src/resources/extensions/gsd/health-widget.ts +3 -1
  720. package/src/resources/extensions/gsd/journal.ts +2 -1
  721. package/src/resources/extensions/gsd/key-manager.ts +22 -0
  722. package/src/resources/extensions/gsd/model-router.ts +42 -1
  723. package/src/resources/extensions/gsd/pre-execution-checks.ts +33 -7
  724. package/src/resources/extensions/gsd/preferences-types.ts +8 -0
  725. package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -0
  726. package/src/resources/extensions/gsd/prompts/discuss.md +29 -2
  727. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +5 -2
  728. package/src/resources/extensions/gsd/prompts/system.md +1 -0
  729. package/src/resources/extensions/gsd/safety/evidence-collector.ts +119 -0
  730. package/src/resources/extensions/gsd/safety/file-change-validator.ts +16 -3
  731. package/src/resources/extensions/gsd/safety/safety-harness.ts +9 -0
  732. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +188 -2
  733. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +12 -0
  734. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +122 -0
  735. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +141 -0
  736. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +63 -0
  737. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +23 -0
  738. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +186 -0
  739. package/src/resources/extensions/gsd/tests/complete-milestone-false-merge.test.ts +15 -0
  740. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +61 -1
  741. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
  742. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  743. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
  744. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +9 -9
  745. package/src/resources/extensions/gsd/tests/dispatch-guard-summary-db-mismatch.test.ts +77 -0
  746. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +31 -0
  747. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +1 -1
  748. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +1 -1
  749. package/src/resources/extensions/gsd/tests/escalation.test.ts +1 -1
  750. package/src/resources/extensions/gsd/tests/exec-history.test.ts +113 -0
  751. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +38 -0
  752. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +296 -1
  753. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +1 -0
  754. package/src/resources/extensions/gsd/tests/integration/gitignore-tracked-gsd.test.ts +1 -0
  755. package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +30 -0
  756. package/src/resources/extensions/gsd/tests/integration/worktree-e2e.test.ts +11 -0
  757. package/src/resources/extensions/gsd/tests/issue-4540-regressions.test.ts +288 -0
  758. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +2 -0
  759. package/src/resources/extensions/gsd/tests/key-manager.test.ts +2 -0
  760. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
  761. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +12 -0
  762. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
  763. package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +3 -3
  764. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +19 -0
  765. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +37 -0
  766. package/src/resources/extensions/gsd/tests/pre-exec-gate-loop.test.ts +272 -0
  767. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +337 -0
  768. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +44 -0
  769. package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +388 -0
  770. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +9 -3
  771. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +230 -0
  772. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +205 -0
  773. package/src/resources/extensions/gsd/tests/schema-v21-sequence.test.ts +413 -0
  774. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +32 -40
  775. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +56 -0
  776. package/src/resources/extensions/gsd/tests/token-counter.test.ts +105 -1
  777. package/src/resources/extensions/gsd/tests/tool-compatibility.test.ts +107 -0
  778. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +23 -0
  779. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +127 -5
  780. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +65 -2
  781. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +35 -0
  782. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +6 -1
  783. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +78 -5
  784. package/src/resources/extensions/gsd/tests/write-gate.test.ts +64 -0
  785. package/src/resources/extensions/gsd/token-counter.ts +22 -5
  786. package/src/resources/extensions/gsd/tools/complete-milestone.ts +15 -9
  787. package/src/resources/extensions/gsd/uok/plan-v2.ts +26 -3
  788. package/src/resources/extensions/gsd/workflow-logger.ts +2 -1
  789. package/src/resources/extensions/gsd/worktree-resolver.ts +54 -9
  790. package/src/resources/extensions/mcp-client/index.ts +1 -1
  791. package/src/resources/extensions/ollama/index.ts +3 -3
  792. package/src/resources/extensions/ollama/ollama-chat-provider.ts +6 -18
  793. package/src/resources/extensions/remote-questions/config.ts +15 -4
  794. package/src/resources/extensions/search-the-web/index.ts +2 -1
  795. package/src/resources/extensions/shared/tests/format-utils.test.ts +5 -3
  796. package/src/resources/extensions/universal-config/index.ts +1 -1
  797. package/src/resources/skills/verify-before-complete/SKILL.md +2 -1
  798. package/src/resources/skills/write-docs/SKILL.md +2 -1
  799. package/dist/web/standalone/.next/static/chunks/2826.e59e8578e2e28639.js +0 -9
  800. package/packages/native/tsconfig.tsbuildinfo +0 -1
  801. /package/dist/web/standalone/.next/static/{n21VtX2hZlkpdEUO_nU4z → gy6_foLMsEzdGBT19c3hr}/_buildManifest.js +0 -0
  802. /package/dist/web/standalone/.next/static/{n21VtX2hZlkpdEUO_nU4z → gy6_foLMsEzdGBT19c3hr}/_ssgManifest.js +0 -0
@@ -0,0 +1,267 @@
1
+ import { providerDisplayName } from "./model-selector.js";
2
+ import { Container, fuzzyFilter, Input, Key, matchesKey, Spacer, Text, } from "@gsd/pi-tui";
3
+ import { getKeybindings } from "../../../pi-tui-compat.js";
4
+ import { theme } from "../../../theme.js";
5
+ import { DynamicBorder } from "./dynamic-border.js";
6
+ function isEnabled(enabledIds, id) {
7
+ return enabledIds === null || enabledIds.includes(id);
8
+ }
9
+ function toggle(enabledIds, id) {
10
+ if (enabledIds === null)
11
+ return [id]; // First toggle: start with only this one
12
+ const index = enabledIds.indexOf(id);
13
+ if (index >= 0)
14
+ return [...enabledIds.slice(0, index), ...enabledIds.slice(index + 1)];
15
+ return [...enabledIds, id];
16
+ }
17
+ function enableAll(enabledIds, allIds, targetIds) {
18
+ if (enabledIds === null)
19
+ return null; // Already all enabled
20
+ const targets = targetIds ?? allIds;
21
+ const result = [...enabledIds];
22
+ for (const id of targets) {
23
+ if (!result.includes(id))
24
+ result.push(id);
25
+ }
26
+ return result.length === allIds.length ? null : result;
27
+ }
28
+ function clearAll(enabledIds, allIds, targetIds) {
29
+ if (enabledIds === null) {
30
+ return targetIds ? allIds.filter((id) => !targetIds.includes(id)) : [];
31
+ }
32
+ const targets = new Set(targetIds ?? enabledIds);
33
+ return enabledIds.filter((id) => !targets.has(id));
34
+ }
35
+ function move(enabledIds, allIds, id, delta) {
36
+ const list = enabledIds ?? [...allIds];
37
+ const index = list.indexOf(id);
38
+ if (index < 0)
39
+ return list;
40
+ const newIndex = index + delta;
41
+ if (newIndex < 0 || newIndex >= list.length)
42
+ return list;
43
+ const result = [...list];
44
+ [result[index], result[newIndex]] = [result[newIndex], result[index]];
45
+ return result;
46
+ }
47
+ function getSortedIds(enabledIds, allIds) {
48
+ if (enabledIds === null)
49
+ return allIds;
50
+ const enabledSet = new Set(enabledIds);
51
+ return [...enabledIds, ...allIds.filter((id) => !enabledSet.has(id))];
52
+ }
53
+ /**
54
+ * Component for enabling/disabling models for Ctrl+P cycling.
55
+ * Changes are session-only until explicitly persisted with Ctrl+S.
56
+ */
57
+ export class ScopedModelsSelectorComponent extends Container {
58
+ get focused() {
59
+ return this._focused;
60
+ }
61
+ set focused(value) {
62
+ this._focused = value;
63
+ this.searchInput.focused = value;
64
+ }
65
+ constructor(config, callbacks) {
66
+ super();
67
+ this.modelsById = new Map();
68
+ this.allIds = [];
69
+ this.enabledIds = null;
70
+ this.filteredItems = [];
71
+ this.selectedIndex = 0;
72
+ // Focusable implementation - propagate to searchInput for IME cursor positioning
73
+ this._focused = false;
74
+ this.maxVisible = 15;
75
+ this.isDirty = false;
76
+ this.callbacks = callbacks;
77
+ for (const model of config.allModels) {
78
+ const fullId = `${model.provider}/${model.id}`;
79
+ this.modelsById.set(fullId, model);
80
+ this.allIds.push(fullId);
81
+ }
82
+ this.enabledIds = config.hasEnabledModelsFilter ? [...config.enabledModelIds] : null;
83
+ this.filteredItems = this.buildItems();
84
+ // Header
85
+ this.addChild(new DynamicBorder());
86
+ this.addChild(new Spacer(1));
87
+ this.addChild(new Text(theme.fg("accent", theme.bold("Model Configuration")), 0, 0));
88
+ this.addChild(new Text(theme.fg("muted", "Session-only. Ctrl+S to save to settings."), 0, 0));
89
+ this.addChild(new Spacer(1));
90
+ // Search input
91
+ this.searchInput = new Input();
92
+ this.addChild(this.searchInput);
93
+ this.addChild(new Spacer(1));
94
+ // List container
95
+ this.listContainer = new Container();
96
+ this.addChild(this.listContainer);
97
+ // Footer hint
98
+ this.addChild(new Spacer(1));
99
+ this.footerText = new Text(this.getFooterText(), 0, 0);
100
+ this.addChild(this.footerText);
101
+ this.addChild(new DynamicBorder());
102
+ this.updateList();
103
+ }
104
+ buildItems() {
105
+ // Filter out IDs that no longer have a corresponding model (e.g., after logout)
106
+ return getSortedIds(this.enabledIds, this.allIds)
107
+ .filter((id) => this.modelsById.has(id))
108
+ .map((id) => ({
109
+ fullId: id,
110
+ model: this.modelsById.get(id),
111
+ enabled: isEnabled(this.enabledIds, id),
112
+ }));
113
+ }
114
+ getFooterText() {
115
+ const enabledCount = this.enabledIds?.length ?? this.allIds.length;
116
+ const allEnabled = this.enabledIds === null;
117
+ const countText = allEnabled ? "all enabled" : `${enabledCount}/${this.allIds.length} enabled`;
118
+ const parts = ["Enter toggle", "^A all", "^X clear", "^P provider", `${process.platform === "darwin" ? "⌥↑↓" : "Alt+↑↓"} reorder`, "^S save", countText];
119
+ return this.isDirty
120
+ ? theme.fg("dim", ` ${parts.join(" · ")} `) + theme.fg("warning", "(unsaved)")
121
+ : theme.fg("dim", ` ${parts.join(" · ")}`);
122
+ }
123
+ refresh() {
124
+ const query = this.searchInput.getValue();
125
+ const items = this.buildItems();
126
+ this.filteredItems = query ? fuzzyFilter(items, query, (i) => `${i.model.id} ${i.model.provider}`) : items;
127
+ this.selectedIndex = Math.min(this.selectedIndex, Math.max(0, this.filteredItems.length - 1));
128
+ this.updateList();
129
+ this.footerText.setText(this.getFooterText());
130
+ }
131
+ updateList() {
132
+ this.listContainer.clear();
133
+ if (this.filteredItems.length === 0) {
134
+ this.listContainer.addChild(new Text(theme.fg("muted", " No matching models"), 0, 0));
135
+ return;
136
+ }
137
+ const startIndex = Math.max(0, Math.min(this.selectedIndex - Math.floor(this.maxVisible / 2), this.filteredItems.length - this.maxVisible));
138
+ const endIndex = Math.min(startIndex + this.maxVisible, this.filteredItems.length);
139
+ const allEnabled = this.enabledIds === null;
140
+ for (let i = startIndex; i < endIndex; i++) {
141
+ const item = this.filteredItems[i];
142
+ const isSelected = i === this.selectedIndex;
143
+ const prefix = isSelected ? theme.fg("accent", "→ ") : " ";
144
+ const modelText = isSelected ? theme.fg("accent", item.model.id) : item.model.id;
145
+ const providerBadge = theme.fg("muted", ` [${providerDisplayName(item.model.provider)}]`);
146
+ const status = allEnabled ? "" : item.enabled ? theme.fg("success", " ✓") : theme.fg("dim", " ✗");
147
+ this.listContainer.addChild(new Text(`${prefix}${modelText}${providerBadge}${status}`, 0, 0));
148
+ }
149
+ // Add scroll indicator if needed
150
+ if (startIndex > 0 || endIndex < this.filteredItems.length) {
151
+ this.listContainer.addChild(new Text(theme.fg("muted", ` (${this.selectedIndex + 1}/${this.filteredItems.length})`), 0, 0));
152
+ }
153
+ if (this.filteredItems.length > 0) {
154
+ const selected = this.filteredItems[this.selectedIndex];
155
+ this.listContainer.addChild(new Spacer(1));
156
+ this.listContainer.addChild(new Text(theme.fg("muted", ` Model Name: ${selected.model.name}`), 0, 0));
157
+ }
158
+ }
159
+ handleInput(data) {
160
+ const kb = getKeybindings();
161
+ // Navigation
162
+ if (kb.matches(data, "selectUp")) {
163
+ if (this.filteredItems.length === 0)
164
+ return;
165
+ this.selectedIndex = this.selectedIndex === 0 ? this.filteredItems.length - 1 : this.selectedIndex - 1;
166
+ this.updateList();
167
+ return;
168
+ }
169
+ if (kb.matches(data, "selectDown")) {
170
+ if (this.filteredItems.length === 0)
171
+ return;
172
+ this.selectedIndex = this.selectedIndex === this.filteredItems.length - 1 ? 0 : this.selectedIndex + 1;
173
+ this.updateList();
174
+ return;
175
+ }
176
+ // Alt+Up/Down - Reorder enabled models
177
+ if (matchesKey(data, Key.alt("up")) || matchesKey(data, Key.alt("down"))) {
178
+ const item = this.filteredItems[this.selectedIndex];
179
+ if (item && isEnabled(this.enabledIds, item.fullId)) {
180
+ const delta = matchesKey(data, Key.alt("up")) ? -1 : 1;
181
+ const enabledList = this.enabledIds ?? this.allIds;
182
+ const currentIndex = enabledList.indexOf(item.fullId);
183
+ const newIndex = currentIndex + delta;
184
+ // Only move if within bounds
185
+ if (newIndex >= 0 && newIndex < enabledList.length) {
186
+ this.enabledIds = move(this.enabledIds, this.allIds, item.fullId, delta);
187
+ this.isDirty = true;
188
+ this.selectedIndex += delta;
189
+ this.refresh();
190
+ }
191
+ }
192
+ return;
193
+ }
194
+ // Toggle on Enter
195
+ if (matchesKey(data, Key.enter)) {
196
+ const item = this.filteredItems[this.selectedIndex];
197
+ if (item) {
198
+ const wasAllEnabled = this.enabledIds === null;
199
+ this.enabledIds = toggle(this.enabledIds, item.fullId);
200
+ this.isDirty = true;
201
+ if (wasAllEnabled)
202
+ this.callbacks.onClearAll();
203
+ this.callbacks.onModelToggle(item.fullId, isEnabled(this.enabledIds, item.fullId));
204
+ this.refresh();
205
+ }
206
+ return;
207
+ }
208
+ // Ctrl+A - Enable all (filtered if search active, otherwise all)
209
+ if (matchesKey(data, Key.ctrl("a"))) {
210
+ const targetIds = this.searchInput.getValue() ? this.filteredItems.map((i) => i.fullId) : undefined;
211
+ this.enabledIds = enableAll(this.enabledIds, this.allIds, targetIds);
212
+ this.isDirty = true;
213
+ this.callbacks.onEnableAll(targetIds ?? this.allIds);
214
+ this.refresh();
215
+ return;
216
+ }
217
+ // Ctrl+X - Clear all (filtered if search active, otherwise all)
218
+ if (matchesKey(data, Key.ctrl("x"))) {
219
+ const targetIds = this.searchInput.getValue() ? this.filteredItems.map((i) => i.fullId) : undefined;
220
+ this.enabledIds = clearAll(this.enabledIds, this.allIds, targetIds);
221
+ this.isDirty = true;
222
+ this.callbacks.onClearAll();
223
+ this.refresh();
224
+ return;
225
+ }
226
+ // Ctrl+P - Toggle provider of current item
227
+ if (matchesKey(data, Key.ctrl("p"))) {
228
+ const item = this.filteredItems[this.selectedIndex];
229
+ if (item) {
230
+ const provider = item.model.provider;
231
+ const providerIds = this.allIds.filter((id) => this.modelsById.get(id).provider === provider);
232
+ const allEnabled = providerIds.every((id) => isEnabled(this.enabledIds, id));
233
+ this.enabledIds = allEnabled
234
+ ? clearAll(this.enabledIds, this.allIds, providerIds)
235
+ : enableAll(this.enabledIds, this.allIds, providerIds);
236
+ this.isDirty = true;
237
+ this.callbacks.onToggleProvider(provider, providerIds, !allEnabled);
238
+ this.refresh();
239
+ }
240
+ return;
241
+ }
242
+ // Ctrl+S - Save/persist to settings
243
+ if (matchesKey(data, Key.ctrl("s"))) {
244
+ this.callbacks.onPersist(this.enabledIds ?? [...this.allIds]);
245
+ this.isDirty = false;
246
+ this.footerText.setText(this.getFooterText());
247
+ return;
248
+ }
249
+ // Ctrl+C - always cancel immediately
250
+ if (matchesKey(data, Key.ctrl("c"))) {
251
+ this.callbacks.onCancel();
252
+ return;
253
+ }
254
+ // Escape - cancel
255
+ if (matchesKey(data, Key.escape)) {
256
+ this.callbacks.onCancel();
257
+ return;
258
+ }
259
+ // Pass everything else to search input
260
+ this.searchInput.handleInput(data);
261
+ this.refresh();
262
+ }
263
+ getSearchInput() {
264
+ return this.searchInput;
265
+ }
266
+ }
267
+ //# sourceMappingURL=scoped-models-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoped-models-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/scoped-models-selector.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, Model } from \"@gsd/pi-ai\";\nimport { providerDisplayName } from \"./model-selector.js\";\nimport {\n\tContainer,\n\ttype Focusable,\n\tfuzzyFilter,\n\tInput,\n\tKey,\n\tmatchesKey,\n\tSpacer,\n\tText,\n} from \"@gsd/pi-tui\";\nimport { getKeybindings } from \"../../../pi-tui-compat.js\";\nimport { theme } from \"../../../theme.js\";\nimport { DynamicBorder } from \"./dynamic-border.js\";\n\n// EnabledIds: null = all enabled (no filter), string[] = explicit ordered list\ntype EnabledIds = string[] | null;\n\nfunction isEnabled(enabledIds: EnabledIds, id: string): boolean {\n\treturn enabledIds === null || enabledIds.includes(id);\n}\n\nfunction toggle(enabledIds: EnabledIds, id: string): EnabledIds {\n\tif (enabledIds === null) return [id]; // First toggle: start with only this one\n\tconst index = enabledIds.indexOf(id);\n\tif (index >= 0) return [...enabledIds.slice(0, index), ...enabledIds.slice(index + 1)];\n\treturn [...enabledIds, id];\n}\n\nfunction enableAll(enabledIds: EnabledIds, allIds: string[], targetIds?: string[]): EnabledIds {\n\tif (enabledIds === null) return null; // Already all enabled\n\tconst targets = targetIds ?? allIds;\n\tconst result = [...enabledIds];\n\tfor (const id of targets) {\n\t\tif (!result.includes(id)) result.push(id);\n\t}\n\treturn result.length === allIds.length ? null : result;\n}\n\nfunction clearAll(enabledIds: EnabledIds, allIds: string[], targetIds?: string[]): EnabledIds {\n\tif (enabledIds === null) {\n\t\treturn targetIds ? allIds.filter((id) => !targetIds.includes(id)) : [];\n\t}\n\tconst targets = new Set(targetIds ?? enabledIds);\n\treturn enabledIds.filter((id) => !targets.has(id));\n}\n\nfunction move(enabledIds: EnabledIds, allIds: string[], id: string, delta: number): EnabledIds {\n\tconst list = enabledIds ?? [...allIds];\n\tconst index = list.indexOf(id);\n\tif (index < 0) return list;\n\tconst newIndex = index + delta;\n\tif (newIndex < 0 || newIndex >= list.length) return list;\n\tconst result = [...list];\n\t[result[index], result[newIndex]] = [result[newIndex], result[index]];\n\treturn result;\n}\n\nfunction getSortedIds(enabledIds: EnabledIds, allIds: string[]): string[] {\n\tif (enabledIds === null) return allIds;\n\tconst enabledSet = new Set(enabledIds);\n\treturn [...enabledIds, ...allIds.filter((id) => !enabledSet.has(id))];\n}\n\ninterface ModelItem {\n\tfullId: string;\n\tmodel: Model<Api>;\n\tenabled: boolean;\n}\n\nexport interface ModelsConfig {\n\tallModels: Model<Api>[];\n\tenabledModelIds: Set<string>;\n\t/** true if enabledModels setting is defined (empty = all enabled) */\n\thasEnabledModelsFilter: boolean;\n}\n\nexport interface ModelsCallbacks {\n\t/** Called when a model is toggled (session-only, no persist) */\n\tonModelToggle: (modelId: string, enabled: boolean) => void;\n\t/** Called when user wants to persist current selection to settings */\n\tonPersist: (enabledModelIds: string[]) => void;\n\t/** Called when user enables all models. Returns list of all model IDs. */\n\tonEnableAll: (allModelIds: string[]) => void;\n\t/** Called when user clears all models */\n\tonClearAll: () => void;\n\t/** Called when user toggles all models for a provider. Returns affected model IDs. */\n\tonToggleProvider: (provider: string, modelIds: string[], enabled: boolean) => void;\n\tonCancel: () => void;\n}\n\n/**\n * Component for enabling/disabling models for Ctrl+P cycling.\n * Changes are session-only until explicitly persisted with Ctrl+S.\n */\nexport class ScopedModelsSelectorComponent extends Container implements Focusable {\n\tprivate modelsById: Map<string, Model<Api>> = new Map();\n\tprivate allIds: string[] = [];\n\tprivate enabledIds: EnabledIds = null;\n\tprivate filteredItems: ModelItem[] = [];\n\tprivate selectedIndex = 0;\n\tprivate searchInput: Input;\n\n\t// Focusable implementation - propagate to searchInput for IME cursor positioning\n\tprivate _focused = false;\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.searchInput.focused = value;\n\t}\n\tprivate listContainer: Container;\n\tprivate footerText: Text;\n\tprivate callbacks: ModelsCallbacks;\n\tprivate maxVisible = 15;\n\tprivate isDirty = false;\n\n\tconstructor(config: ModelsConfig, callbacks: ModelsCallbacks) {\n\t\tsuper();\n\t\tthis.callbacks = callbacks;\n\n\t\tfor (const model of config.allModels) {\n\t\t\tconst fullId = `${model.provider}/${model.id}`;\n\t\t\tthis.modelsById.set(fullId, model);\n\t\t\tthis.allIds.push(fullId);\n\t\t}\n\n\t\tthis.enabledIds = config.hasEnabledModelsFilter ? [...config.enabledModelIds] : null;\n\t\tthis.filteredItems = this.buildItems();\n\n\t\t// Header\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"accent\", theme.bold(\"Model Configuration\")), 0, 0));\n\t\tthis.addChild(new Text(theme.fg(\"muted\", \"Session-only. Ctrl+S to save to settings.\"), 0, 0));\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Search input\n\t\tthis.searchInput = new Input();\n\t\tthis.addChild(this.searchInput);\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// List container\n\t\tthis.listContainer = new Container();\n\t\tthis.addChild(this.listContainer);\n\n\t\t// Footer hint\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.footerText = new Text(this.getFooterText(), 0, 0);\n\t\tthis.addChild(this.footerText);\n\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.updateList();\n\t}\n\n\tprivate buildItems(): ModelItem[] {\n\t\t// Filter out IDs that no longer have a corresponding model (e.g., after logout)\n\t\treturn getSortedIds(this.enabledIds, this.allIds)\n\t\t\t.filter((id) => this.modelsById.has(id))\n\t\t\t.map((id) => ({\n\t\t\t\tfullId: id,\n\t\t\t\tmodel: this.modelsById.get(id)!,\n\t\t\t\tenabled: isEnabled(this.enabledIds, id),\n\t\t\t}));\n\t}\n\n\tprivate getFooterText(): string {\n\t\tconst enabledCount = this.enabledIds?.length ?? this.allIds.length;\n\t\tconst allEnabled = this.enabledIds === null;\n\t\tconst countText = allEnabled ? \"all enabled\" : `${enabledCount}/${this.allIds.length} enabled`;\n\t\tconst parts = [\"Enter toggle\", \"^A all\", \"^X clear\", \"^P provider\", `${process.platform === \"darwin\" ? \"⌥↑↓\" : \"Alt+↑↓\"} reorder`, \"^S save\", countText];\n\t\treturn this.isDirty\n\t\t\t? theme.fg(\"dim\", ` ${parts.join(\" · \")} `) + theme.fg(\"warning\", \"(unsaved)\")\n\t\t\t: theme.fg(\"dim\", ` ${parts.join(\" · \")}`);\n\t}\n\n\tprivate refresh(): void {\n\t\tconst query = this.searchInput.getValue();\n\t\tconst items = this.buildItems();\n\t\tthis.filteredItems = query ? fuzzyFilter(items, query, (i) => `${i.model.id} ${i.model.provider}`) : items;\n\t\tthis.selectedIndex = Math.min(this.selectedIndex, Math.max(0, this.filteredItems.length - 1));\n\t\tthis.updateList();\n\t\tthis.footerText.setText(this.getFooterText());\n\t}\n\n\tprivate updateList(): void {\n\t\tthis.listContainer.clear();\n\n\t\tif (this.filteredItems.length === 0) {\n\t\t\tthis.listContainer.addChild(new Text(theme.fg(\"muted\", \" No matching models\"), 0, 0));\n\t\t\treturn;\n\t\t}\n\n\t\tconst startIndex = Math.max(\n\t\t\t0,\n\t\t\tMath.min(this.selectedIndex - Math.floor(this.maxVisible / 2), this.filteredItems.length - this.maxVisible),\n\t\t);\n\t\tconst endIndex = Math.min(startIndex + this.maxVisible, this.filteredItems.length);\n\t\tconst allEnabled = this.enabledIds === null;\n\n\t\tfor (let i = startIndex; i < endIndex; i++) {\n\t\t\tconst item = this.filteredItems[i]!;\n\t\t\tconst isSelected = i === this.selectedIndex;\n\t\t\tconst prefix = isSelected ? theme.fg(\"accent\", \"→ \") : \" \";\n\t\t\tconst modelText = isSelected ? theme.fg(\"accent\", item.model.id) : item.model.id;\n\t\t\tconst providerBadge = theme.fg(\"muted\", ` [${providerDisplayName(item.model.provider)}]`);\n\t\t\tconst status = allEnabled ? \"\" : item.enabled ? theme.fg(\"success\", \" ✓\") : theme.fg(\"dim\", \" ✗\");\n\t\t\tthis.listContainer.addChild(new Text(`${prefix}${modelText}${providerBadge}${status}`, 0, 0));\n\t\t}\n\n\t\t// Add scroll indicator if needed\n\t\tif (startIndex > 0 || endIndex < this.filteredItems.length) {\n\t\t\tthis.listContainer.addChild(\n\t\t\t\tnew Text(theme.fg(\"muted\", ` (${this.selectedIndex + 1}/${this.filteredItems.length})`), 0, 0),\n\t\t\t);\n\t\t}\n\n\t\tif (this.filteredItems.length > 0) {\n\t\t\tconst selected = this.filteredItems[this.selectedIndex];\n\t\t\tthis.listContainer.addChild(new Spacer(1));\n\t\t\tthis.listContainer.addChild(new Text(theme.fg(\"muted\", ` Model Name: ${selected.model.name}`), 0, 0));\n\t\t}\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = getKeybindings();\n\n\t\t// Navigation\n\t\tif (kb.matches(data, \"selectUp\")) {\n\t\t\tif (this.filteredItems.length === 0) return;\n\t\t\tthis.selectedIndex = this.selectedIndex === 0 ? this.filteredItems.length - 1 : this.selectedIndex - 1;\n\t\t\tthis.updateList();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"selectDown\")) {\n\t\t\tif (this.filteredItems.length === 0) return;\n\t\t\tthis.selectedIndex = this.selectedIndex === this.filteredItems.length - 1 ? 0 : this.selectedIndex + 1;\n\t\t\tthis.updateList();\n\t\t\treturn;\n\t\t}\n\n\t\t// Alt+Up/Down - Reorder enabled models\n\t\tif (matchesKey(data, Key.alt(\"up\")) || matchesKey(data, Key.alt(\"down\"))) {\n\t\t\tconst item = this.filteredItems[this.selectedIndex];\n\t\t\tif (item && isEnabled(this.enabledIds, item.fullId)) {\n\t\t\t\tconst delta = matchesKey(data, Key.alt(\"up\")) ? -1 : 1;\n\t\t\t\tconst enabledList = this.enabledIds ?? this.allIds;\n\t\t\t\tconst currentIndex = enabledList.indexOf(item.fullId);\n\t\t\t\tconst newIndex = currentIndex + delta;\n\t\t\t\t// Only move if within bounds\n\t\t\t\tif (newIndex >= 0 && newIndex < enabledList.length) {\n\t\t\t\t\tthis.enabledIds = move(this.enabledIds, this.allIds, item.fullId, delta);\n\t\t\t\t\tthis.isDirty = true;\n\t\t\t\t\tthis.selectedIndex += delta;\n\t\t\t\t\tthis.refresh();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Toggle on Enter\n\t\tif (matchesKey(data, Key.enter)) {\n\t\t\tconst item = this.filteredItems[this.selectedIndex];\n\t\t\tif (item) {\n\t\t\t\tconst wasAllEnabled = this.enabledIds === null;\n\t\t\t\tthis.enabledIds = toggle(this.enabledIds, item.fullId);\n\t\t\t\tthis.isDirty = true;\n\t\t\t\tif (wasAllEnabled) this.callbacks.onClearAll();\n\t\t\t\tthis.callbacks.onModelToggle(item.fullId, isEnabled(this.enabledIds, item.fullId));\n\t\t\t\tthis.refresh();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Ctrl+A - Enable all (filtered if search active, otherwise all)\n\t\tif (matchesKey(data, Key.ctrl(\"a\"))) {\n\t\t\tconst targetIds = this.searchInput.getValue() ? this.filteredItems.map((i) => i.fullId) : undefined;\n\t\t\tthis.enabledIds = enableAll(this.enabledIds, this.allIds, targetIds);\n\t\t\tthis.isDirty = true;\n\t\t\tthis.callbacks.onEnableAll(targetIds ?? this.allIds);\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\n\t\t// Ctrl+X - Clear all (filtered if search active, otherwise all)\n\t\tif (matchesKey(data, Key.ctrl(\"x\"))) {\n\t\t\tconst targetIds = this.searchInput.getValue() ? this.filteredItems.map((i) => i.fullId) : undefined;\n\t\t\tthis.enabledIds = clearAll(this.enabledIds, this.allIds, targetIds);\n\t\t\tthis.isDirty = true;\n\t\t\tthis.callbacks.onClearAll();\n\t\t\tthis.refresh();\n\t\t\treturn;\n\t\t}\n\n\t\t// Ctrl+P - Toggle provider of current item\n\t\tif (matchesKey(data, Key.ctrl(\"p\"))) {\n\t\t\tconst item = this.filteredItems[this.selectedIndex];\n\t\t\tif (item) {\n\t\t\t\tconst provider = item.model.provider;\n\t\t\t\tconst providerIds = this.allIds.filter((id) => this.modelsById.get(id)!.provider === provider);\n\t\t\t\tconst allEnabled = providerIds.every((id) => isEnabled(this.enabledIds, id));\n\t\t\t\tthis.enabledIds = allEnabled\n\t\t\t\t\t? clearAll(this.enabledIds, this.allIds, providerIds)\n\t\t\t\t\t: enableAll(this.enabledIds, this.allIds, providerIds);\n\t\t\t\tthis.isDirty = true;\n\t\t\t\tthis.callbacks.onToggleProvider(provider, providerIds, !allEnabled);\n\t\t\t\tthis.refresh();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Ctrl+S - Save/persist to settings\n\t\tif (matchesKey(data, Key.ctrl(\"s\"))) {\n\t\t\tthis.callbacks.onPersist(this.enabledIds ?? [...this.allIds]);\n\t\t\tthis.isDirty = false;\n\t\t\tthis.footerText.setText(this.getFooterText());\n\t\t\treturn;\n\t\t}\n\n\t\t// Ctrl+C - always cancel immediately\n\t\tif (matchesKey(data, Key.ctrl(\"c\"))) {\n\t\t\tthis.callbacks.onCancel();\n\t\t\treturn;\n\t\t}\n\n\t\t// Escape - cancel\n\t\tif (matchesKey(data, Key.escape)) {\n\t\t\tthis.callbacks.onCancel();\n\t\t\treturn;\n\t\t}\n\n\t\t// Pass everything else to search input\n\t\tthis.searchInput.handleInput(data);\n\t\tthis.refresh();\n\t}\n\n\tgetSearchInput(): Input {\n\t\treturn this.searchInput;\n\t}\n}\n"]}
@@ -0,0 +1,21 @@
1
+ import type { SessionInfo } from "@gsd/agent-types";
2
+ export type SortMode = "threaded" | "recent" | "relevance";
3
+ export type NameFilter = "all" | "named";
4
+ export interface ParsedSearchQuery {
5
+ mode: "tokens" | "regex";
6
+ tokens: {
7
+ kind: "fuzzy" | "phrase";
8
+ value: string;
9
+ }[];
10
+ regex: RegExp | null;
11
+ /** If set, parsing failed and we should treat query as non-matching. */
12
+ error?: string;
13
+ }
14
+ export interface MatchResult {
15
+ matches: boolean;
16
+ /** Lower is better; only meaningful when matches === true */
17
+ score: number;
18
+ }
19
+ export declare function hasSessionName(session: SessionInfo): boolean;
20
+ export declare function filterAndSortSessions(sessions: SessionInfo[], query: string, sortMode: SortMode, nameFilter?: NameFilter): SessionInfo[];
21
+ //# sourceMappingURL=session-selector-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-selector-search.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/session-selector-search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE3D,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,OAAO,CAAC;AAEzC,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IACzB,MAAM,EAAE;QAAE,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACtD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;CACd;AAUD,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAE5D;AA4HD,wBAAgB,qBAAqB,CACpC,QAAQ,EAAE,WAAW,EAAE,EACvB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,QAAQ,EAClB,UAAU,GAAE,UAAkB,GAC5B,WAAW,EAAE,CAiCf"}
@@ -0,0 +1,155 @@
1
+ import { fuzzyMatch } from "@gsd/pi-tui";
2
+ function normalizeWhitespaceLower(text) {
3
+ return text.toLowerCase().replace(/\s+/g, " ").trim();
4
+ }
5
+ function getSessionSearchText(session) {
6
+ return `${session.id} ${session.name ?? ""} ${session.allMessagesText} ${session.cwd}`;
7
+ }
8
+ export function hasSessionName(session) {
9
+ return Boolean(session.name?.trim());
10
+ }
11
+ function matchesNameFilter(session, filter) {
12
+ if (filter === "all")
13
+ return true;
14
+ return hasSessionName(session);
15
+ }
16
+ function parseSearchQuery(query) {
17
+ const trimmed = query.trim();
18
+ if (!trimmed) {
19
+ return { mode: "tokens", tokens: [], regex: null };
20
+ }
21
+ // Regex mode: re:<pattern>
22
+ if (trimmed.startsWith("re:")) {
23
+ const pattern = trimmed.slice(3).trim();
24
+ if (!pattern) {
25
+ return { mode: "regex", tokens: [], regex: null, error: "Empty regex" };
26
+ }
27
+ try {
28
+ return { mode: "regex", tokens: [], regex: new RegExp(pattern, "i") };
29
+ }
30
+ catch (err) {
31
+ const msg = err instanceof Error ? err.message : String(err);
32
+ return { mode: "regex", tokens: [], regex: null, error: msg };
33
+ }
34
+ }
35
+ // Token mode with quote support.
36
+ // Example: foo "node cve" bar
37
+ const tokens = [];
38
+ let buf = "";
39
+ let inQuote = false;
40
+ let hadUnclosedQuote = false;
41
+ const flush = (kind) => {
42
+ const v = buf.trim();
43
+ buf = "";
44
+ if (!v)
45
+ return;
46
+ tokens.push({ kind, value: v });
47
+ };
48
+ for (let i = 0; i < trimmed.length; i++) {
49
+ const ch = trimmed[i];
50
+ if (ch === '"') {
51
+ if (inQuote) {
52
+ flush("phrase");
53
+ inQuote = false;
54
+ }
55
+ else {
56
+ flush("fuzzy");
57
+ inQuote = true;
58
+ }
59
+ continue;
60
+ }
61
+ if (!inQuote && /\s/.test(ch)) {
62
+ flush("fuzzy");
63
+ continue;
64
+ }
65
+ buf += ch;
66
+ }
67
+ if (inQuote) {
68
+ hadUnclosedQuote = true;
69
+ }
70
+ // If quotes were unbalanced, fall back to plain whitespace tokenization.
71
+ if (hadUnclosedQuote) {
72
+ return {
73
+ mode: "tokens",
74
+ tokens: trimmed
75
+ .split(/\s+/)
76
+ .map((t) => t.trim())
77
+ .filter((t) => t.length > 0)
78
+ .map((t) => ({ kind: "fuzzy", value: t })),
79
+ regex: null,
80
+ };
81
+ }
82
+ flush(inQuote ? "phrase" : "fuzzy");
83
+ return { mode: "tokens", tokens, regex: null };
84
+ }
85
+ function matchSession(session, parsed) {
86
+ const text = getSessionSearchText(session);
87
+ if (parsed.mode === "regex") {
88
+ if (!parsed.regex) {
89
+ return { matches: false, score: 0 };
90
+ }
91
+ const idx = text.search(parsed.regex);
92
+ if (idx < 0)
93
+ return { matches: false, score: 0 };
94
+ return { matches: true, score: idx * 0.1 };
95
+ }
96
+ if (parsed.tokens.length === 0) {
97
+ return { matches: true, score: 0 };
98
+ }
99
+ let totalScore = 0;
100
+ let normalizedText = null;
101
+ for (const token of parsed.tokens) {
102
+ if (token.kind === "phrase") {
103
+ if (normalizedText === null) {
104
+ normalizedText = normalizeWhitespaceLower(text);
105
+ }
106
+ const phrase = normalizeWhitespaceLower(token.value);
107
+ if (!phrase)
108
+ continue;
109
+ const idx = normalizedText.indexOf(phrase);
110
+ if (idx < 0)
111
+ return { matches: false, score: 0 };
112
+ totalScore += idx * 0.1;
113
+ continue;
114
+ }
115
+ const m = fuzzyMatch(token.value, text);
116
+ if (!m.matches)
117
+ return { matches: false, score: 0 };
118
+ totalScore += m.score;
119
+ }
120
+ return { matches: true, score: totalScore };
121
+ }
122
+ export function filterAndSortSessions(sessions, query, sortMode, nameFilter = "all") {
123
+ const nameFiltered = nameFilter === "all" ? sessions : sessions.filter((session) => matchesNameFilter(session, nameFilter));
124
+ const trimmed = query.trim();
125
+ if (!trimmed)
126
+ return nameFiltered;
127
+ const parsed = parseSearchQuery(query);
128
+ if (parsed.error)
129
+ return [];
130
+ // Recent mode: filter only, keep incoming order.
131
+ if (sortMode === "recent") {
132
+ const filtered = [];
133
+ for (const s of nameFiltered) {
134
+ const res = matchSession(s, parsed);
135
+ if (res.matches)
136
+ filtered.push(s);
137
+ }
138
+ return filtered;
139
+ }
140
+ // Relevance mode: sort by score, tie-break by modified desc.
141
+ const scored = [];
142
+ for (const s of nameFiltered) {
143
+ const res = matchSession(s, parsed);
144
+ if (!res.matches)
145
+ continue;
146
+ scored.push({ session: s, score: res.score });
147
+ }
148
+ scored.sort((a, b) => {
149
+ if (a.score !== b.score)
150
+ return a.score - b.score;
151
+ return b.session.modified.getTime() - a.session.modified.getTime();
152
+ });
153
+ return scored.map((r) => r.session);
154
+ }
155
+ //# sourceMappingURL=session-selector-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-selector-search.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/session-selector-search.ts"],"names":[],"mappings":"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","sourcesContent":["import { fuzzyMatch } from \"@gsd/pi-tui\";\nimport type { SessionInfo } from \"@gsd/agent-types\";\n\nexport type SortMode = \"threaded\" | \"recent\" | \"relevance\";\n\nexport type NameFilter = \"all\" | \"named\";\n\nexport interface ParsedSearchQuery {\n\tmode: \"tokens\" | \"regex\";\n\ttokens: { kind: \"fuzzy\" | \"phrase\"; value: string }[];\n\tregex: RegExp | null;\n\t/** If set, parsing failed and we should treat query as non-matching. */\n\terror?: string;\n}\n\nexport interface MatchResult {\n\tmatches: boolean;\n\t/** Lower is better; only meaningful when matches === true */\n\tscore: number;\n}\n\nfunction normalizeWhitespaceLower(text: string): string {\n\treturn text.toLowerCase().replace(/\\s+/g, \" \").trim();\n}\n\nfunction getSessionSearchText(session: SessionInfo): string {\n\treturn `${session.id} ${session.name ?? \"\"} ${session.allMessagesText} ${session.cwd}`;\n}\n\nexport function hasSessionName(session: SessionInfo): boolean {\n\treturn Boolean(session.name?.trim());\n}\n\nfunction matchesNameFilter(session: SessionInfo, filter: NameFilter): boolean {\n\tif (filter === \"all\") return true;\n\treturn hasSessionName(session);\n}\n\nfunction parseSearchQuery(query: string): ParsedSearchQuery {\n\tconst trimmed = query.trim();\n\tif (!trimmed) {\n\t\treturn { mode: \"tokens\", tokens: [], regex: null };\n\t}\n\n\t// Regex mode: re:<pattern>\n\tif (trimmed.startsWith(\"re:\")) {\n\t\tconst pattern = trimmed.slice(3).trim();\n\t\tif (!pattern) {\n\t\t\treturn { mode: \"regex\", tokens: [], regex: null, error: \"Empty regex\" };\n\t\t}\n\t\ttry {\n\t\t\treturn { mode: \"regex\", tokens: [], regex: new RegExp(pattern, \"i\") };\n\t\t} catch (err) {\n\t\t\tconst msg = err instanceof Error ? err.message : String(err);\n\t\t\treturn { mode: \"regex\", tokens: [], regex: null, error: msg };\n\t\t}\n\t}\n\n\t// Token mode with quote support.\n\t// Example: foo \"node cve\" bar\n\tconst tokens: { kind: \"fuzzy\" | \"phrase\"; value: string }[] = [];\n\tlet buf = \"\";\n\tlet inQuote = false;\n\tlet hadUnclosedQuote = false;\n\n\tconst flush = (kind: \"fuzzy\" | \"phrase\"): void => {\n\t\tconst v = buf.trim();\n\t\tbuf = \"\";\n\t\tif (!v) return;\n\t\ttokens.push({ kind, value: v });\n\t};\n\n\tfor (let i = 0; i < trimmed.length; i++) {\n\t\tconst ch = trimmed[i]!;\n\t\tif (ch === '\"') {\n\t\t\tif (inQuote) {\n\t\t\t\tflush(\"phrase\");\n\t\t\t\tinQuote = false;\n\t\t\t} else {\n\t\t\t\tflush(\"fuzzy\");\n\t\t\t\tinQuote = true;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!inQuote && /\\s/.test(ch)) {\n\t\t\tflush(\"fuzzy\");\n\t\t\tcontinue;\n\t\t}\n\n\t\tbuf += ch;\n\t}\n\n\tif (inQuote) {\n\t\thadUnclosedQuote = true;\n\t}\n\n\t// If quotes were unbalanced, fall back to plain whitespace tokenization.\n\tif (hadUnclosedQuote) {\n\t\treturn {\n\t\t\tmode: \"tokens\",\n\t\t\ttokens: trimmed\n\t\t\t\t.split(/\\s+/)\n\t\t\t\t.map((t) => t.trim())\n\t\t\t\t.filter((t) => t.length > 0)\n\t\t\t\t.map((t) => ({ kind: \"fuzzy\" as const, value: t })),\n\t\t\tregex: null,\n\t\t};\n\t}\n\n\tflush(inQuote ? \"phrase\" : \"fuzzy\");\n\n\treturn { mode: \"tokens\", tokens, regex: null };\n}\n\nfunction matchSession(session: SessionInfo, parsed: ParsedSearchQuery): MatchResult {\n\tconst text = getSessionSearchText(session);\n\n\tif (parsed.mode === \"regex\") {\n\t\tif (!parsed.regex) {\n\t\t\treturn { matches: false, score: 0 };\n\t\t}\n\t\tconst idx = text.search(parsed.regex);\n\t\tif (idx < 0) return { matches: false, score: 0 };\n\t\treturn { matches: true, score: idx * 0.1 };\n\t}\n\n\tif (parsed.tokens.length === 0) {\n\t\treturn { matches: true, score: 0 };\n\t}\n\n\tlet totalScore = 0;\n\tlet normalizedText: string | null = null;\n\n\tfor (const token of parsed.tokens) {\n\t\tif (token.kind === \"phrase\") {\n\t\t\tif (normalizedText === null) {\n\t\t\t\tnormalizedText = normalizeWhitespaceLower(text);\n\t\t\t}\n\t\t\tconst phrase = normalizeWhitespaceLower(token.value);\n\t\t\tif (!phrase) continue;\n\t\t\tconst idx = normalizedText.indexOf(phrase);\n\t\t\tif (idx < 0) return { matches: false, score: 0 };\n\t\t\ttotalScore += idx * 0.1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst m = fuzzyMatch(token.value, text);\n\t\tif (!m.matches) return { matches: false, score: 0 };\n\t\ttotalScore += m.score;\n\t}\n\n\treturn { matches: true, score: totalScore };\n}\n\nexport function filterAndSortSessions(\n\tsessions: SessionInfo[],\n\tquery: string,\n\tsortMode: SortMode,\n\tnameFilter: NameFilter = \"all\",\n): SessionInfo[] {\n\tconst nameFiltered =\n\t\tnameFilter === \"all\" ? sessions : sessions.filter((session) => matchesNameFilter(session, nameFilter));\n\tconst trimmed = query.trim();\n\tif (!trimmed) return nameFiltered;\n\n\tconst parsed = parseSearchQuery(query);\n\tif (parsed.error) return [];\n\n\t// Recent mode: filter only, keep incoming order.\n\tif (sortMode === \"recent\") {\n\t\tconst filtered: SessionInfo[] = [];\n\t\tfor (const s of nameFiltered) {\n\t\t\tconst res = matchSession(s, parsed);\n\t\t\tif (res.matches) filtered.push(s);\n\t\t}\n\t\treturn filtered;\n\t}\n\n\t// Relevance mode: sort by score, tie-break by modified desc.\n\tconst scored: { session: SessionInfo; score: number }[] = [];\n\tfor (const s of nameFiltered) {\n\t\tconst res = matchSession(s, parsed);\n\t\tif (!res.matches) continue;\n\t\tscored.push({ session: s, score: res.score });\n\t}\n\n\tscored.sort((a, b) => {\n\t\tif (a.score !== b.score) return a.score - b.score;\n\t\treturn b.session.modified.getTime() - a.session.modified.getTime();\n\t});\n\n\treturn scored.map((r) => r.session);\n}\n"]}
@@ -0,0 +1,97 @@
1
+ import { type Component, Container, type Focusable } from "@gsd/pi-tui";
2
+ import { KeybindingsManager } from "@gsd/agent-core";
3
+ import type { SessionInfo } from "@gsd/agent-types";
4
+ /** Progress callback for session list loading (not exported from pi-coding-agent index). */
5
+ type SessionListProgress = (loaded: number, total: number) => void;
6
+ import { type NameFilter, type SortMode } from "./session-selector-search.js";
7
+ /**
8
+ * Custom session list component with multi-line items and search
9
+ */
10
+ declare class SessionList implements Component, Focusable {
11
+ getSelectedSessionPath(): string | undefined;
12
+ private allSessions;
13
+ private filteredSessions;
14
+ private selectedIndex;
15
+ private searchInput;
16
+ private showCwd;
17
+ private sortMode;
18
+ private nameFilter;
19
+ private keybindings;
20
+ private showPath;
21
+ private confirmingDeletePath;
22
+ private currentSessionFilePath?;
23
+ onSelect?: (sessionPath: string) => void;
24
+ onCancel?: () => void;
25
+ onExit: () => void;
26
+ onToggleScope?: () => void;
27
+ onToggleSort?: () => void;
28
+ onToggleNameFilter?: () => void;
29
+ onTogglePath?: (showPath: boolean) => void;
30
+ onDeleteConfirmationChange?: (path: string | null) => void;
31
+ onDeleteSession?: (sessionPath: string) => Promise<void>;
32
+ onRenameSession?: (sessionPath: string) => void;
33
+ onError?: (message: string) => void;
34
+ private maxVisible;
35
+ private _focused;
36
+ get focused(): boolean;
37
+ set focused(value: boolean);
38
+ constructor(sessions: SessionInfo[], showCwd: boolean, sortMode: SortMode, nameFilter: NameFilter, keybindings: KeybindingsManager, currentSessionFilePath?: string);
39
+ setSortMode(sortMode: SortMode): void;
40
+ setNameFilter(nameFilter: NameFilter): void;
41
+ setSessions(sessions: SessionInfo[], showCwd: boolean): void;
42
+ private filterSessions;
43
+ private setConfirmingDeletePath;
44
+ private startDeleteConfirmationForSelectedSession;
45
+ invalidate(): void;
46
+ render(width: number): string[];
47
+ private buildNodeTreePrefix;
48
+ handleInput(keyData: string): void;
49
+ }
50
+ type SessionsLoader = (onProgress?: SessionListProgress) => Promise<SessionInfo[]>;
51
+ /**
52
+ * Component that renders a session selector
53
+ */
54
+ export declare class SessionSelectorComponent extends Container implements Focusable {
55
+ handleInput(data: string): void;
56
+ private canRename;
57
+ private sessionList;
58
+ private header;
59
+ private keybindings;
60
+ private scope;
61
+ private sortMode;
62
+ private nameFilter;
63
+ private currentSessions;
64
+ private allSessions;
65
+ private currentSessionsLoader;
66
+ private allSessionsLoader;
67
+ private onCancel;
68
+ private requestRender;
69
+ private renameSession?;
70
+ private currentLoading;
71
+ private allLoading;
72
+ private allLoadSeq;
73
+ private mode;
74
+ private renameInput;
75
+ private renameTargetPath;
76
+ private _focused;
77
+ get focused(): boolean;
78
+ set focused(value: boolean);
79
+ private buildBaseLayout;
80
+ constructor(currentSessionsLoader: SessionsLoader, allSessionsLoader: SessionsLoader, onSelect: (sessionPath: string) => void, onCancel: () => void, onExit: () => void, requestRender: () => void, options?: {
81
+ renameSession?: (sessionPath: string, currentName: string | undefined) => Promise<void>;
82
+ showRenameHint?: boolean;
83
+ keybindings?: KeybindingsManager;
84
+ }, currentSessionFilePath?: string);
85
+ private loadCurrentSessions;
86
+ private enterRenameMode;
87
+ private exitRenameMode;
88
+ private confirmRename;
89
+ private loadScope;
90
+ private toggleSortMode;
91
+ private toggleNameFilter;
92
+ private refreshSessionsAfterMutation;
93
+ private toggleScope;
94
+ getSessionList(): SessionList;
95
+ }
96
+ export {};
97
+ //# sourceMappingURL=session-selector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-selector.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/session-selector.ts"],"names":[],"mappings":"AAGA,OAAO,EACN,KAAK,SAAS,EACd,SAAS,EACT,KAAK,SAAS,EAOd,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGpD,4FAA4F;AAC5F,KAAK,mBAAmB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;AAInE,OAAO,EAAyC,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAiPrH;;GAEG;AACH,cAAM,WAAY,YAAW,SAAS,EAAE,SAAS;IACzC,sBAAsB,IAAI,MAAM,GAAG,SAAS;IAInD,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,gBAAgB,CAAyB;IACjD,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,oBAAoB,CAAuB;IACnD,OAAO,CAAC,sBAAsB,CAAC,CAAS;IACjC,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,IAAI,CAAY;IAC9B,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,0BAA0B,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3D,eAAe,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,eAAe,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,OAAO,CAAC,UAAU,CAAc;IAGhC,OAAO,CAAC,QAAQ,CAAS;IACzB,IAAI,OAAO,IAAI,OAAO,CAErB;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAGzB;gBAGA,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,kBAAkB,EAC/B,sBAAsB,CAAC,EAAE,MAAM;IAuBhC,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAKrC,aAAa,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IAK3C,WAAW,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAM5D,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,uBAAuB;IAK/B,OAAO,CAAC,yCAAyC;IAajD,UAAU,IAAI,IAAI;IAElB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IA0G/B,OAAO,CAAC,mBAAmB;IAI3B,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CA2GlC;AAED,KAAK,cAAc,GAAG,CAAC,UAAU,CAAC,EAAE,mBAAmB,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;AA0CnF;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,SAAU,YAAW,SAAS;IAC3E,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAc/B,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,eAAe,CAA8B;IACrD,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,qBAAqB,CAAiB;IAC9C,OAAO,CAAC,iBAAiB,CAAiB;IAC1C,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,aAAa,CAAC,CAA0E;IAChG,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAK;IAEvB,OAAO,CAAC,IAAI,CAA6B;IACzC,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,gBAAgB,CAAuB;IAG/C,OAAO,CAAC,QAAQ,CAAS;IACzB,IAAI,OAAO,IAAI,OAAO,CAErB;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAOzB;IAED,OAAO,CAAC,eAAe;gBAetB,qBAAqB,EAAE,cAAc,EACrC,iBAAiB,EAAE,cAAc,EACjC,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,EACvC,QAAQ,EAAE,MAAM,IAAI,EACpB,MAAM,EAAE,MAAM,IAAI,EAClB,aAAa,EAAE,MAAM,IAAI,EACzB,OAAO,CAAC,EAAE;QACT,aAAa,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACxF,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,WAAW,CAAC,EAAE,kBAAkB,CAAC;KACjC,EACD,sBAAsB,CAAC,EAAE,MAAM;IA4GhC,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,cAAc;YASR,aAAa;YAwBb,SAAS;IAkEvB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,gBAAgB;YAOV,4BAA4B;IAI1C,OAAO,CAAC,WAAW;IAyBnB,cAAc,IAAI,WAAW;CAG7B"}