gsd-pi 2.38.0-dev.eeb3520 → 2.39.0-dev.20aba06

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 (346) hide show
  1. package/README.md +15 -11
  2. package/dist/app-paths.js +1 -1
  3. package/dist/cli.js +9 -0
  4. package/dist/extension-discovery.d.ts +5 -3
  5. package/dist/extension-discovery.js +14 -9
  6. package/dist/extension-registry.js +2 -2
  7. package/dist/remote-questions-config.js +2 -2
  8. package/dist/resource-loader.js +100 -3
  9. package/dist/resources/extensions/async-jobs/index.js +10 -0
  10. package/dist/resources/extensions/browser-tools/index.js +3 -1
  11. package/dist/resources/extensions/browser-tools/package.json +3 -1
  12. package/dist/resources/extensions/browser-tools/tools/verify.js +97 -0
  13. package/dist/resources/extensions/cmux/index.js +55 -1
  14. package/dist/resources/extensions/context7/package.json +1 -1
  15. package/dist/resources/extensions/get-secrets-from-user.js +5 -24
  16. package/dist/resources/extensions/github-sync/cli.js +284 -0
  17. package/dist/resources/extensions/github-sync/index.js +73 -0
  18. package/dist/resources/extensions/github-sync/mapping.js +67 -0
  19. package/dist/resources/extensions/github-sync/sync.js +424 -0
  20. package/dist/resources/extensions/github-sync/templates.js +118 -0
  21. package/dist/resources/extensions/github-sync/types.js +7 -0
  22. package/dist/resources/extensions/google-search/package.json +3 -1
  23. package/dist/resources/extensions/gsd/auto/session.js +6 -23
  24. package/dist/resources/extensions/gsd/auto-dashboard.js +7 -0
  25. package/dist/resources/extensions/gsd/auto-dispatch.js +8 -9
  26. package/dist/resources/extensions/gsd/auto-loop.js +923 -787
  27. package/dist/resources/extensions/gsd/auto-post-unit.js +107 -70
  28. package/dist/resources/extensions/gsd/auto-prompts.js +205 -51
  29. package/dist/resources/extensions/gsd/auto-start.js +19 -3
  30. package/dist/resources/extensions/gsd/auto-worktree-sync.js +13 -5
  31. package/dist/resources/extensions/gsd/auto-worktree.js +3 -3
  32. package/dist/resources/extensions/gsd/auto.js +149 -100
  33. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +126 -0
  34. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +233 -0
  35. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +59 -0
  36. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +38 -0
  37. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +156 -0
  38. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +46 -0
  39. package/dist/resources/extensions/gsd/bootstrap/system-context.js +300 -0
  40. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +38 -0
  41. package/dist/resources/extensions/gsd/captures.js +9 -1
  42. package/dist/resources/extensions/gsd/commands/catalog.js +278 -0
  43. package/dist/resources/extensions/gsd/commands/context.js +84 -0
  44. package/dist/resources/extensions/gsd/commands/dispatcher.js +21 -0
  45. package/dist/resources/extensions/gsd/commands/handlers/auto.js +72 -0
  46. package/dist/resources/extensions/gsd/commands/handlers/core.js +246 -0
  47. package/dist/resources/extensions/gsd/commands/handlers/ops.js +166 -0
  48. package/dist/resources/extensions/gsd/commands/handlers/parallel.js +94 -0
  49. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +102 -0
  50. package/dist/resources/extensions/gsd/commands/index.js +11 -0
  51. package/dist/resources/extensions/gsd/commands-extensions.js +3 -2
  52. package/dist/resources/extensions/gsd/commands-handlers.js +17 -4
  53. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +1 -1
  54. package/dist/resources/extensions/gsd/commands.js +8 -1169
  55. package/dist/resources/extensions/gsd/context-budget.js +2 -10
  56. package/dist/resources/extensions/gsd/dashboard-overlay.js +9 -0
  57. package/dist/resources/extensions/gsd/detection.js +1 -2
  58. package/dist/resources/extensions/gsd/docs/preferences-reference.md +0 -2
  59. package/dist/resources/extensions/gsd/doctor-checks.js +82 -0
  60. package/dist/resources/extensions/gsd/doctor-environment.js +78 -0
  61. package/dist/resources/extensions/gsd/doctor-format.js +15 -0
  62. package/dist/resources/extensions/gsd/doctor-proactive.js +80 -10
  63. package/dist/resources/extensions/gsd/doctor-providers.js +30 -11
  64. package/dist/resources/extensions/gsd/doctor.js +234 -12
  65. package/dist/resources/extensions/gsd/env-utils.js +29 -0
  66. package/dist/resources/extensions/gsd/exit-command.js +2 -1
  67. package/dist/resources/extensions/gsd/export-html.js +46 -0
  68. package/dist/resources/extensions/gsd/export.js +1 -1
  69. package/dist/resources/extensions/gsd/files.js +48 -9
  70. package/dist/resources/extensions/gsd/forensics.js +1 -1
  71. package/dist/resources/extensions/gsd/git-service.js +30 -12
  72. package/dist/resources/extensions/gsd/gitignore.js +16 -3
  73. package/dist/resources/extensions/gsd/guided-flow.js +149 -38
  74. package/dist/resources/extensions/gsd/health-widget-core.js +32 -70
  75. package/dist/resources/extensions/gsd/health-widget.js +4 -87
  76. package/dist/resources/extensions/gsd/index.js +4 -1111
  77. package/dist/resources/extensions/gsd/migrate/parsers.js +1 -1
  78. package/dist/resources/extensions/gsd/migrate-external.js +18 -1
  79. package/dist/resources/extensions/gsd/native-git-bridge.js +37 -0
  80. package/dist/resources/extensions/gsd/package.json +1 -1
  81. package/dist/resources/extensions/gsd/paths.js +3 -0
  82. package/dist/resources/extensions/gsd/preferences-models.js +0 -12
  83. package/dist/resources/extensions/gsd/preferences-types.js +1 -1
  84. package/dist/resources/extensions/gsd/preferences-validation.js +59 -11
  85. package/dist/resources/extensions/gsd/preferences.js +22 -11
  86. package/dist/resources/extensions/gsd/progress-score.js +20 -1
  87. package/dist/resources/extensions/gsd/prompt-loader.js +6 -2
  88. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  89. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  90. package/dist/resources/extensions/gsd/prompts/discuss.md +11 -14
  91. package/dist/resources/extensions/gsd/prompts/execute-task.md +5 -3
  92. package/dist/resources/extensions/gsd/prompts/forensics.md +121 -46
  93. package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
  94. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +11 -12
  95. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +8 -10
  96. package/dist/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
  97. package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
  98. package/dist/resources/extensions/gsd/prompts/guided-plan-slice.md +1 -1
  99. package/dist/resources/extensions/gsd/prompts/guided-research-slice.md +1 -1
  100. package/dist/resources/extensions/gsd/prompts/guided-resume-task.md +1 -1
  101. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  102. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  103. package/dist/resources/extensions/gsd/prompts/queue.md +4 -8
  104. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +11 -8
  105. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  106. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  107. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  108. package/dist/resources/extensions/gsd/prompts/run-uat.md +28 -11
  109. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -2
  110. package/dist/resources/extensions/gsd/repo-identity.js +21 -4
  111. package/dist/resources/extensions/gsd/resource-version.js +2 -1
  112. package/dist/resources/extensions/gsd/roadmap-mutations.js +24 -0
  113. package/dist/resources/extensions/gsd/state.js +42 -23
  114. package/dist/resources/extensions/gsd/templates/runtime.md +21 -0
  115. package/dist/resources/extensions/gsd/templates/task-plan.md +3 -0
  116. package/dist/resources/extensions/gsd/visualizer-data.js +27 -2
  117. package/dist/resources/extensions/gsd/visualizer-views.js +52 -0
  118. package/dist/resources/extensions/gsd/worktree.js +35 -16
  119. package/dist/resources/extensions/mcp-client/index.js +14 -1
  120. package/dist/resources/extensions/remote-questions/status.js +4 -1
  121. package/dist/resources/extensions/remote-questions/store.js +4 -1
  122. package/dist/resources/extensions/search-the-web/provider.js +2 -1
  123. package/dist/resources/extensions/shared/frontmatter.js +1 -1
  124. package/dist/resources/extensions/subagent/index.js +12 -3
  125. package/dist/resources/extensions/subagent/isolation.js +2 -1
  126. package/dist/resources/extensions/ttsr/rule-loader.js +2 -1
  127. package/dist/resources/extensions/universal-config/package.json +1 -1
  128. package/dist/welcome-screen.d.ts +13 -0
  129. package/dist/welcome-screen.js +97 -0
  130. package/package.json +1 -1
  131. package/packages/pi-ai/dist/utils/oauth/anthropic.js +2 -2
  132. package/packages/pi-ai/dist/utils/oauth/anthropic.js.map +1 -1
  133. package/packages/pi-ai/src/utils/oauth/anthropic.ts +2 -2
  134. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +12 -0
  135. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  136. package/packages/pi-coding-agent/dist/core/agent-session.js +107 -24
  137. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  138. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  139. package/packages/pi-coding-agent/dist/core/extensions/loader.js +205 -7
  140. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  141. package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
  142. package/packages/pi-coding-agent/dist/core/package-manager.js +8 -4
  143. package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
  144. package/packages/pi-coding-agent/dist/core/skill-tool.test.d.ts +2 -0
  145. package/packages/pi-coding-agent/dist/core/skill-tool.test.d.ts.map +1 -0
  146. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +70 -0
  147. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -0
  148. package/packages/pi-coding-agent/dist/core/skills.d.ts +1 -0
  149. package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
  150. package/packages/pi-coding-agent/dist/core/skills.js +8 -2
  151. package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
  152. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  153. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  154. package/packages/pi-coding-agent/dist/index.js +1 -1
  155. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  156. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts +17 -0
  157. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -0
  158. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +244 -0
  159. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -0
  160. package/packages/pi-coding-agent/dist/modes/interactive/controllers/extension-ui-controller.d.ts +3 -0
  161. package/packages/pi-coding-agent/dist/modes/interactive/controllers/extension-ui-controller.d.ts.map +1 -0
  162. package/packages/pi-coding-agent/dist/modes/interactive/controllers/extension-ui-controller.js +58 -0
  163. package/packages/pi-coding-agent/dist/modes/interactive/controllers/extension-ui-controller.js.map +1 -0
  164. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts +12 -0
  165. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -0
  166. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +54 -0
  167. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -0
  168. package/packages/pi-coding-agent/dist/modes/interactive/controllers/model-controller.d.ts +6 -0
  169. package/packages/pi-coding-agent/dist/modes/interactive/controllers/model-controller.d.ts.map +1 -0
  170. package/packages/pi-coding-agent/dist/modes/interactive/controllers/model-controller.js +63 -0
  171. package/packages/pi-coding-agent/dist/modes/interactive/controllers/model-controller.js.map +1 -0
  172. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts +38 -0
  173. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -0
  174. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js +2 -0
  175. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -0
  176. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +1 -1
  177. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  178. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +15 -457
  179. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  180. package/packages/pi-coding-agent/package.json +1 -1
  181. package/packages/pi-coding-agent/src/core/agent-session.ts +122 -23
  182. package/packages/pi-coding-agent/src/core/extensions/loader.ts +223 -7
  183. package/packages/pi-coding-agent/src/core/package-manager.ts +8 -4
  184. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +89 -0
  185. package/packages/pi-coding-agent/src/core/skills.ts +11 -2
  186. package/packages/pi-coding-agent/src/index.ts +1 -0
  187. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +302 -0
  188. package/packages/pi-coding-agent/src/modes/interactive/controllers/extension-ui-controller.ts +59 -0
  189. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +68 -0
  190. package/packages/pi-coding-agent/src/modes/interactive/controllers/model-controller.ts +71 -0
  191. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +37 -0
  192. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +18 -510
  193. package/pkg/package.json +1 -1
  194. package/src/resources/extensions/async-jobs/index.ts +11 -0
  195. package/src/resources/extensions/browser-tools/index.ts +3 -0
  196. package/src/resources/extensions/browser-tools/tools/verify.ts +117 -0
  197. package/src/resources/extensions/cmux/index.ts +57 -1
  198. package/src/resources/extensions/get-secrets-from-user.ts +5 -24
  199. package/src/resources/extensions/github-sync/cli.ts +364 -0
  200. package/src/resources/extensions/github-sync/index.ts +93 -0
  201. package/src/resources/extensions/github-sync/mapping.ts +81 -0
  202. package/src/resources/extensions/github-sync/sync.ts +556 -0
  203. package/src/resources/extensions/github-sync/templates.ts +183 -0
  204. package/src/resources/extensions/github-sync/tests/cli.test.ts +20 -0
  205. package/src/resources/extensions/github-sync/tests/commit-linking.test.ts +39 -0
  206. package/src/resources/extensions/github-sync/tests/mapping.test.ts +104 -0
  207. package/src/resources/extensions/github-sync/tests/templates.test.ts +110 -0
  208. package/src/resources/extensions/github-sync/types.ts +47 -0
  209. package/src/resources/extensions/gsd/auto/session.ts +7 -25
  210. package/src/resources/extensions/gsd/auto-dashboard.ts +10 -0
  211. package/src/resources/extensions/gsd/auto-dispatch.ts +7 -9
  212. package/src/resources/extensions/gsd/auto-loop.ts +1285 -1138
  213. package/src/resources/extensions/gsd/auto-post-unit.ts +90 -46
  214. package/src/resources/extensions/gsd/auto-prompts.ts +250 -53
  215. package/src/resources/extensions/gsd/auto-start.ts +24 -3
  216. package/src/resources/extensions/gsd/auto-worktree-sync.ts +15 -4
  217. package/src/resources/extensions/gsd/auto-worktree.ts +3 -3
  218. package/src/resources/extensions/gsd/auto.ts +152 -111
  219. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +142 -0
  220. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +238 -0
  221. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +90 -0
  222. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +46 -0
  223. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +167 -0
  224. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +55 -0
  225. package/src/resources/extensions/gsd/bootstrap/system-context.ts +340 -0
  226. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +51 -0
  227. package/src/resources/extensions/gsd/captures.ts +10 -1
  228. package/src/resources/extensions/gsd/commands/catalog.ts +301 -0
  229. package/src/resources/extensions/gsd/commands/context.ts +101 -0
  230. package/src/resources/extensions/gsd/commands/dispatcher.ts +32 -0
  231. package/src/resources/extensions/gsd/commands/handlers/auto.ts +74 -0
  232. package/src/resources/extensions/gsd/commands/handlers/core.ts +274 -0
  233. package/src/resources/extensions/gsd/commands/handlers/ops.ts +169 -0
  234. package/src/resources/extensions/gsd/commands/handlers/parallel.ts +118 -0
  235. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +109 -0
  236. package/src/resources/extensions/gsd/commands/index.ts +14 -0
  237. package/src/resources/extensions/gsd/commands-extensions.ts +4 -2
  238. package/src/resources/extensions/gsd/commands-handlers.ts +18 -3
  239. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1 -1
  240. package/src/resources/extensions/gsd/commands.ts +10 -1307
  241. package/src/resources/extensions/gsd/context-budget.ts +2 -12
  242. package/src/resources/extensions/gsd/dashboard-overlay.ts +10 -0
  243. package/src/resources/extensions/gsd/detection.ts +2 -2
  244. package/src/resources/extensions/gsd/docs/preferences-reference.md +0 -2
  245. package/src/resources/extensions/gsd/doctor-checks.ts +75 -0
  246. package/src/resources/extensions/gsd/doctor-environment.ts +82 -1
  247. package/src/resources/extensions/gsd/doctor-format.ts +20 -0
  248. package/src/resources/extensions/gsd/doctor-proactive.ts +106 -10
  249. package/src/resources/extensions/gsd/doctor-providers.ts +30 -9
  250. package/src/resources/extensions/gsd/doctor-types.ts +16 -1
  251. package/src/resources/extensions/gsd/doctor.ts +243 -14
  252. package/src/resources/extensions/gsd/env-utils.ts +31 -0
  253. package/src/resources/extensions/gsd/exit-command.ts +2 -2
  254. package/src/resources/extensions/gsd/export-html.ts +51 -0
  255. package/src/resources/extensions/gsd/export.ts +1 -1
  256. package/src/resources/extensions/gsd/files.ts +51 -11
  257. package/src/resources/extensions/gsd/forensics.ts +1 -1
  258. package/src/resources/extensions/gsd/git-service.ts +44 -10
  259. package/src/resources/extensions/gsd/gitignore.ts +17 -3
  260. package/src/resources/extensions/gsd/guided-flow.ts +177 -44
  261. package/src/resources/extensions/gsd/health-widget-core.ts +28 -80
  262. package/src/resources/extensions/gsd/health-widget.ts +4 -89
  263. package/src/resources/extensions/gsd/index.ts +12 -1307
  264. package/src/resources/extensions/gsd/migrate/parsers.ts +1 -1
  265. package/src/resources/extensions/gsd/migrate-external.ts +18 -1
  266. package/src/resources/extensions/gsd/native-git-bridge.ts +37 -0
  267. package/src/resources/extensions/gsd/paths.ts +4 -0
  268. package/src/resources/extensions/gsd/preferences-models.ts +0 -12
  269. package/src/resources/extensions/gsd/preferences-types.ts +4 -4
  270. package/src/resources/extensions/gsd/preferences-validation.ts +51 -11
  271. package/src/resources/extensions/gsd/preferences.ts +25 -11
  272. package/src/resources/extensions/gsd/progress-score.ts +23 -0
  273. package/src/resources/extensions/gsd/prompt-loader.ts +7 -2
  274. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  275. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  276. package/src/resources/extensions/gsd/prompts/discuss.md +11 -14
  277. package/src/resources/extensions/gsd/prompts/execute-task.md +5 -3
  278. package/src/resources/extensions/gsd/prompts/forensics.md +121 -46
  279. package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
  280. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +11 -12
  281. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +8 -10
  282. package/src/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
  283. package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
  284. package/src/resources/extensions/gsd/prompts/guided-plan-slice.md +1 -1
  285. package/src/resources/extensions/gsd/prompts/guided-research-slice.md +1 -1
  286. package/src/resources/extensions/gsd/prompts/guided-resume-task.md +1 -1
  287. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  288. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  289. package/src/resources/extensions/gsd/prompts/queue.md +4 -8
  290. package/src/resources/extensions/gsd/prompts/reactive-execute.md +11 -8
  291. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  292. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  293. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  294. package/src/resources/extensions/gsd/prompts/run-uat.md +28 -11
  295. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -2
  296. package/src/resources/extensions/gsd/repo-identity.ts +23 -4
  297. package/src/resources/extensions/gsd/resource-version.ts +3 -1
  298. package/src/resources/extensions/gsd/roadmap-mutations.ts +29 -0
  299. package/src/resources/extensions/gsd/state.ts +39 -21
  300. package/src/resources/extensions/gsd/templates/runtime.md +21 -0
  301. package/src/resources/extensions/gsd/templates/task-plan.md +3 -0
  302. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +21 -18
  303. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +135 -77
  304. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +4 -3
  305. package/src/resources/extensions/gsd/tests/cmux.test.ts +93 -0
  306. package/src/resources/extensions/gsd/tests/derive-state.test.ts +43 -0
  307. package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +266 -0
  308. package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +3 -3
  309. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +86 -3
  310. package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +50 -0
  311. package/src/resources/extensions/gsd/tests/health-widget.test.ts +16 -54
  312. package/src/resources/extensions/gsd/tests/parsers.test.ts +131 -14
  313. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +209 -0
  314. package/src/resources/extensions/gsd/tests/preferences.test.ts +2 -7
  315. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +59 -0
  316. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +16 -16
  317. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +21 -1
  318. package/src/resources/extensions/gsd/tests/run-uat.test.ts +16 -4
  319. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +140 -0
  320. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +10 -10
  321. package/src/resources/extensions/gsd/tests/worktree.test.ts +47 -0
  322. package/src/resources/extensions/gsd/types.ts +18 -1
  323. package/src/resources/extensions/gsd/verification-evidence.ts +16 -0
  324. package/src/resources/extensions/gsd/visualizer-data.ts +52 -2
  325. package/src/resources/extensions/gsd/visualizer-views.ts +58 -0
  326. package/src/resources/extensions/gsd/worktree.ts +35 -15
  327. package/src/resources/extensions/mcp-client/index.ts +17 -1
  328. package/src/resources/extensions/remote-questions/status.ts +5 -1
  329. package/src/resources/extensions/remote-questions/store.ts +5 -1
  330. package/src/resources/extensions/search-the-web/provider.ts +2 -1
  331. package/src/resources/extensions/shared/frontmatter.ts +1 -1
  332. package/src/resources/extensions/subagent/index.ts +12 -3
  333. package/src/resources/extensions/subagent/isolation.ts +3 -1
  334. package/src/resources/extensions/ttsr/rule-loader.ts +3 -1
  335. package/dist/resources/extensions/gsd/prompt-compressor.js +0 -393
  336. package/dist/resources/extensions/gsd/semantic-chunker.js +0 -254
  337. package/dist/resources/extensions/gsd/summary-distiller.js +0 -212
  338. package/src/resources/extensions/gsd/prompt-compressor.ts +0 -508
  339. package/src/resources/extensions/gsd/semantic-chunker.ts +0 -336
  340. package/src/resources/extensions/gsd/summary-distiller.ts +0 -258
  341. package/src/resources/extensions/gsd/tests/context-compression.test.ts +0 -193
  342. package/src/resources/extensions/gsd/tests/prompt-compressor.test.ts +0 -529
  343. package/src/resources/extensions/gsd/tests/semantic-chunker.test.ts +0 -426
  344. package/src/resources/extensions/gsd/tests/summary-distiller.test.ts +0 -323
  345. package/src/resources/extensions/gsd/tests/token-optimization-benchmark.test.ts +0 -1272
  346. package/src/resources/extensions/gsd/tests/token-optimization-prefs.test.ts +0 -164
@@ -0,0 +1,302 @@
1
+ import { Loader, Spacer, Text } from "@gsd/pi-tui";
2
+
3
+ import type { InteractiveModeEvent, InteractiveModeStateHost } from "../interactive-mode-state.js";
4
+ import { theme } from "../theme/theme.js";
5
+ import { AssistantMessageComponent } from "../components/assistant-message.js";
6
+ import { ToolExecutionComponent } from "../components/tool-execution.js";
7
+ import { appKey } from "../components/keybinding-hints.js";
8
+
9
+ export async function handleAgentEvent(host: InteractiveModeStateHost & {
10
+ init: () => Promise<void>;
11
+ getMarkdownThemeWithSettings: () => any;
12
+ addMessageToChat: (message: any, options?: any) => void;
13
+ formatWebSearchResult: (content: unknown) => string;
14
+ getRegisteredToolDefinition: (toolName: string) => any;
15
+ checkShutdownRequested: () => Promise<void>;
16
+ rebuildChatFromMessages: () => void;
17
+ flushCompactionQueue: (options?: { willRetry?: boolean }) => Promise<void>;
18
+ showStatus: (message: string) => void;
19
+ showError: (message: string) => void;
20
+ updatePendingMessagesDisplay: () => void;
21
+ }, event: InteractiveModeEvent): Promise<void> {
22
+ if (!host.isInitialized) {
23
+ await host.init();
24
+ }
25
+
26
+ host.footer.invalidate();
27
+
28
+ switch (event.type) {
29
+ case "agent_start":
30
+ if (host.retryEscapeHandler) {
31
+ host.defaultEditor.onEscape = host.retryEscapeHandler;
32
+ host.retryEscapeHandler = undefined;
33
+ }
34
+ if (host.retryLoader) {
35
+ host.retryLoader.stop();
36
+ host.retryLoader = undefined;
37
+ }
38
+ if (host.loadingAnimation) {
39
+ host.loadingAnimation.stop();
40
+ }
41
+ host.statusContainer.clear();
42
+ host.loadingAnimation = new Loader(
43
+ host.ui,
44
+ (spinner) => theme.fg("accent", spinner),
45
+ (text) => theme.fg("muted", text),
46
+ host.defaultWorkingMessage,
47
+ );
48
+ host.statusContainer.addChild(host.loadingAnimation);
49
+ if (host.pendingWorkingMessage !== undefined) {
50
+ if (host.pendingWorkingMessage) {
51
+ host.loadingAnimation.setMessage(host.pendingWorkingMessage);
52
+ }
53
+ host.pendingWorkingMessage = undefined;
54
+ }
55
+ host.ui.requestRender();
56
+ break;
57
+
58
+ case "message_start":
59
+ if (event.message.role === "custom") {
60
+ host.addMessageToChat(event.message);
61
+ host.ui.requestRender();
62
+ } else if (event.message.role === "user") {
63
+ host.addMessageToChat(event.message);
64
+ host.updatePendingMessagesDisplay();
65
+ host.ui.requestRender();
66
+ } else if (event.message.role === "assistant") {
67
+ host.streamingComponent = new AssistantMessageComponent(
68
+ undefined,
69
+ host.hideThinkingBlock,
70
+ host.getMarkdownThemeWithSettings(),
71
+ );
72
+ host.streamingMessage = event.message;
73
+ host.chatContainer.addChild(host.streamingComponent);
74
+ host.streamingComponent.updateContent(host.streamingMessage);
75
+ host.ui.requestRender();
76
+ }
77
+ break;
78
+
79
+ case "message_update":
80
+ if (host.streamingComponent && event.message.role === "assistant") {
81
+ host.streamingMessage = event.message;
82
+ host.streamingComponent.updateContent(host.streamingMessage);
83
+ for (const content of host.streamingMessage.content) {
84
+ if (content.type === "toolCall") {
85
+ if (!host.pendingTools.has(content.id)) {
86
+ const component = new ToolExecutionComponent(
87
+ content.name,
88
+ content.arguments,
89
+ { showImages: host.settingsManager.getShowImages() },
90
+ host.getRegisteredToolDefinition(content.name),
91
+ host.ui,
92
+ );
93
+ component.setExpanded(host.toolOutputExpanded);
94
+ host.chatContainer.addChild(component);
95
+ host.pendingTools.set(content.id, component);
96
+ } else {
97
+ host.pendingTools.get(content.id)?.updateArgs(content.arguments);
98
+ }
99
+ } else if (content.type === "serverToolUse") {
100
+ if (!host.pendingTools.has(content.id)) {
101
+ const component = new ToolExecutionComponent(
102
+ content.name,
103
+ content.input ?? {},
104
+ { showImages: host.settingsManager.getShowImages() },
105
+ undefined,
106
+ host.ui,
107
+ );
108
+ component.setExpanded(host.toolOutputExpanded);
109
+ host.chatContainer.addChild(component);
110
+ host.pendingTools.set(content.id, component);
111
+ }
112
+ } else if (content.type === "webSearchResult") {
113
+ const component = host.pendingTools.get(content.toolUseId);
114
+ if (component) {
115
+ const searchContent = content.content;
116
+ const isError = searchContent && typeof searchContent === "object" && "type" in (searchContent as any) && (searchContent as any).type === "web_search_tool_result_error";
117
+ component.updateResult({
118
+ content: [{ type: "text", text: host.formatWebSearchResult(searchContent) }],
119
+ isError: !!isError,
120
+ });
121
+ host.pendingTools.delete(content.toolUseId);
122
+ }
123
+ }
124
+ }
125
+ host.ui.requestRender();
126
+ }
127
+ break;
128
+
129
+ case "message_end":
130
+ if (event.message.role === "user") break;
131
+ if (host.streamingComponent && event.message.role === "assistant") {
132
+ host.streamingMessage = event.message;
133
+ let errorMessage: string | undefined;
134
+ if (host.streamingMessage.stopReason === "aborted") {
135
+ const retryAttempt = host.session.retryAttempt;
136
+ errorMessage = retryAttempt > 0
137
+ ? `Aborted after ${retryAttempt} retry attempt${retryAttempt > 1 ? "s" : ""}`
138
+ : "Operation aborted";
139
+ host.streamingMessage.errorMessage = errorMessage;
140
+ }
141
+ host.streamingComponent.updateContent(host.streamingMessage);
142
+ if (host.streamingMessage.stopReason === "aborted" || host.streamingMessage.stopReason === "error") {
143
+ if (!errorMessage) {
144
+ errorMessage = host.streamingMessage.errorMessage || "Error";
145
+ }
146
+ for (const [, component] of host.pendingTools.entries()) {
147
+ component.updateResult({ content: [{ type: "text", text: errorMessage }], isError: true });
148
+ }
149
+ host.pendingTools.clear();
150
+ } else {
151
+ for (const [, component] of host.pendingTools.entries()) {
152
+ component.setArgsComplete();
153
+ }
154
+ }
155
+ host.streamingComponent = undefined;
156
+ host.streamingMessage = undefined;
157
+ host.footer.invalidate();
158
+ }
159
+ host.ui.requestRender();
160
+ break;
161
+
162
+ case "tool_execution_start":
163
+ if (!host.pendingTools.has(event.toolCallId)) {
164
+ const component = new ToolExecutionComponent(
165
+ event.toolName,
166
+ event.args,
167
+ { showImages: host.settingsManager.getShowImages() },
168
+ host.getRegisteredToolDefinition(event.toolName),
169
+ host.ui,
170
+ );
171
+ component.setExpanded(host.toolOutputExpanded);
172
+ host.chatContainer.addChild(component);
173
+ host.pendingTools.set(event.toolCallId, component);
174
+ host.ui.requestRender();
175
+ }
176
+ break;
177
+
178
+ case "tool_execution_update": {
179
+ const component = host.pendingTools.get(event.toolCallId);
180
+ if (component) {
181
+ component.updateResult({ ...event.partialResult, isError: false }, true);
182
+ host.ui.requestRender();
183
+ }
184
+ break;
185
+ }
186
+
187
+ case "tool_execution_end": {
188
+ const component = host.pendingTools.get(event.toolCallId);
189
+ if (component) {
190
+ component.updateResult({ ...event.result, isError: event.isError });
191
+ host.pendingTools.delete(event.toolCallId);
192
+ host.ui.requestRender();
193
+ }
194
+ break;
195
+ }
196
+
197
+ case "agent_end":
198
+ if (host.loadingAnimation) {
199
+ host.loadingAnimation.stop();
200
+ host.loadingAnimation = undefined;
201
+ host.statusContainer.clear();
202
+ }
203
+ if (host.streamingComponent) {
204
+ host.chatContainer.removeChild(host.streamingComponent);
205
+ host.streamingComponent = undefined;
206
+ host.streamingMessage = undefined;
207
+ }
208
+ host.pendingTools.clear();
209
+ await host.checkShutdownRequested();
210
+ host.ui.requestRender();
211
+ break;
212
+
213
+ case "auto_compaction_start":
214
+ host.autoCompactionEscapeHandler = host.defaultEditor.onEscape;
215
+ host.defaultEditor.onEscape = () => host.session.abortCompaction();
216
+ host.statusContainer.clear();
217
+ host.autoCompactionLoader = new Loader(
218
+ host.ui,
219
+ (spinner) => theme.fg("accent", spinner),
220
+ (text) => theme.fg("muted", text),
221
+ `${event.reason === "overflow" ? "Context overflow detected, " : ""}Auto-compacting... (${appKey(host.keybindings, "interrupt")} to cancel)`,
222
+ );
223
+ host.statusContainer.addChild(host.autoCompactionLoader);
224
+ host.ui.requestRender();
225
+ break;
226
+
227
+ case "auto_compaction_end":
228
+ if (host.autoCompactionEscapeHandler) {
229
+ host.defaultEditor.onEscape = host.autoCompactionEscapeHandler;
230
+ host.autoCompactionEscapeHandler = undefined;
231
+ }
232
+ if (host.autoCompactionLoader) {
233
+ host.autoCompactionLoader.stop();
234
+ host.autoCompactionLoader = undefined;
235
+ host.statusContainer.clear();
236
+ }
237
+ if (event.aborted) {
238
+ host.showStatus("Auto-compaction cancelled");
239
+ } else if (event.result) {
240
+ host.chatContainer.clear();
241
+ host.rebuildChatFromMessages();
242
+ host.addMessageToChat({
243
+ role: "compactionSummary",
244
+ tokensBefore: event.result.tokensBefore,
245
+ summary: event.result.summary,
246
+ timestamp: Date.now(),
247
+ });
248
+ host.footer.invalidate();
249
+ } else if (event.errorMessage) {
250
+ host.chatContainer.addChild(new Spacer(1));
251
+ host.chatContainer.addChild(new Text(theme.fg("error", event.errorMessage), 1, 0));
252
+ }
253
+ void host.flushCompactionQueue({ willRetry: event.willRetry });
254
+ host.ui.requestRender();
255
+ break;
256
+
257
+ case "auto_retry_start":
258
+ host.retryEscapeHandler = host.defaultEditor.onEscape;
259
+ host.defaultEditor.onEscape = () => host.session.abortRetry();
260
+ host.statusContainer.clear();
261
+ host.retryLoader = new Loader(
262
+ host.ui,
263
+ (spinner) => theme.fg("warning", spinner),
264
+ (text) => theme.fg("muted", text),
265
+ `Retrying (${event.attempt}/${event.maxAttempts}) in ${Math.round(event.delayMs / 1000)}s... (${appKey(host.keybindings, "interrupt")} to cancel)`,
266
+ );
267
+ host.statusContainer.addChild(host.retryLoader);
268
+ host.ui.requestRender();
269
+ break;
270
+
271
+ case "auto_retry_end":
272
+ if (host.retryEscapeHandler) {
273
+ host.defaultEditor.onEscape = host.retryEscapeHandler;
274
+ host.retryEscapeHandler = undefined;
275
+ }
276
+ if (host.retryLoader) {
277
+ host.retryLoader.stop();
278
+ host.retryLoader = undefined;
279
+ host.statusContainer.clear();
280
+ }
281
+ if (!event.success) {
282
+ host.showError(`Retry failed after ${event.attempt} attempts: ${event.finalError || "Unknown error"}`);
283
+ }
284
+ host.ui.requestRender();
285
+ break;
286
+
287
+ case "fallback_provider_switch":
288
+ host.showStatus(`Switched from ${event.from} → ${event.to} (${event.reason})`);
289
+ host.ui.requestRender();
290
+ break;
291
+
292
+ case "fallback_provider_restored":
293
+ host.showStatus(`Restored to ${event.provider}`);
294
+ host.ui.requestRender();
295
+ break;
296
+
297
+ case "fallback_chain_exhausted":
298
+ host.showError(event.reason);
299
+ host.ui.requestRender();
300
+ break;
301
+ }
302
+ }
@@ -0,0 +1,59 @@
1
+ import type { ExtensionUIContext } from "../../../core/extensions/index.js";
2
+
3
+ import { Theme, getAvailableThemesWithPaths, getThemeByName, setTheme, setThemeInstance, theme } from "../theme/theme.js";
4
+ import { appKey } from "../components/keybinding-hints.js";
5
+
6
+ export function createExtensionUIContext(host: any): ExtensionUIContext {
7
+ return {
8
+ select: (title, options, opts) => host.showExtensionSelector(title, options, opts),
9
+ confirm: (title, message, opts) => host.showExtensionConfirm(title, message, opts),
10
+ input: (title, placeholder, opts) => host.showExtensionInput(title, placeholder, opts),
11
+ notify: (message, type) => host.showExtensionNotify(message, type),
12
+ onTerminalInput: (handler) => host.addExtensionTerminalInputListener(handler),
13
+ setStatus: (key, text) => host.setExtensionStatus(key, text),
14
+ setWorkingMessage: (message) => {
15
+ if (host.loadingAnimation) {
16
+ if (message) {
17
+ host.loadingAnimation.setMessage(message);
18
+ } else {
19
+ host.loadingAnimation.setMessage(`${host.defaultWorkingMessage} (${appKey(host.keybindings, "interrupt")} to interrupt)`);
20
+ }
21
+ } else {
22
+ host.pendingWorkingMessage = message;
23
+ }
24
+ },
25
+ setWidget: (key, content, options) => host.setExtensionWidget(key, content, options),
26
+ setFooter: (factory) => host.setExtensionFooter(factory),
27
+ setHeader: (factory) => host.setExtensionHeader(factory),
28
+ setTitle: (title) => host.ui.terminal.setTitle(title),
29
+ custom: (factory, options) => host.showExtensionCustom(factory, options),
30
+ pasteToEditor: (text) => host.editor.handleInput(`\x1b[200~${text}\x1b[201~`),
31
+ setEditorText: (text) => host.editor.setText(text),
32
+ getEditorText: () => host.editor.getText(),
33
+ editor: (title, prefill) => host.showExtensionEditor(title, prefill),
34
+ setEditorComponent: (factory) => host.setCustomEditorComponent(factory),
35
+ get theme() {
36
+ return theme;
37
+ },
38
+ getAllThemes: () => getAvailableThemesWithPaths(),
39
+ getTheme: (name) => getThemeByName(name),
40
+ setTheme: (themeOrName) => {
41
+ if (themeOrName instanceof Theme) {
42
+ setThemeInstance(themeOrName);
43
+ host.ui.requestRender();
44
+ return { success: true };
45
+ }
46
+ const result = setTheme(themeOrName, true);
47
+ if (result.success) {
48
+ if (host.settingsManager.getTheme() !== themeOrName) {
49
+ host.settingsManager.setTheme(themeOrName);
50
+ }
51
+ host.ui.requestRender();
52
+ }
53
+ return result;
54
+ },
55
+ getToolsExpanded: () => host.toolOutputExpanded,
56
+ setToolsExpanded: (expanded) => host.setToolsExpanded(expanded),
57
+ };
58
+ }
59
+
@@ -0,0 +1,68 @@
1
+ import { dispatchSlashCommand } from "../slash-command-handlers.js";
2
+ import type { InteractiveModeStateHost } from "../interactive-mode-state.js";
3
+
4
+ export function setupEditorSubmitHandler(host: InteractiveModeStateHost & {
5
+ getSlashCommandContext: () => any;
6
+ handleBashCommand: (command: string, excludeFromContext?: boolean) => Promise<void>;
7
+ showWarning: (message: string) => void;
8
+ updateEditorBorderColor: () => void;
9
+ isExtensionCommand: (text: string) => boolean;
10
+ queueCompactionMessage: (text: string, mode: "steer" | "followUp") => void;
11
+ updatePendingMessagesDisplay: () => void;
12
+ flushPendingBashComponents: () => void;
13
+ }): void {
14
+ host.defaultEditor.onSubmit = async (text: string) => {
15
+ text = text.trim();
16
+ if (!text) return;
17
+
18
+ if (text.startsWith("/")) {
19
+ const handled = await dispatchSlashCommand(text, host.getSlashCommandContext());
20
+ if (handled) {
21
+ host.editor.setText("");
22
+ return;
23
+ }
24
+ }
25
+
26
+ if (text.startsWith("!")) {
27
+ const isExcluded = text.startsWith("!!");
28
+ const command = isExcluded ? text.slice(2).trim() : text.slice(1).trim();
29
+ if (command) {
30
+ if (host.session.isBashRunning) {
31
+ host.showWarning("A bash command is already running. Press Esc to cancel it first.");
32
+ host.editor.setText(text);
33
+ return;
34
+ }
35
+ host.editor.addToHistory?.(text);
36
+ await host.handleBashCommand(command, isExcluded);
37
+ host.isBashMode = false;
38
+ host.updateEditorBorderColor();
39
+ return;
40
+ }
41
+ }
42
+
43
+ if (host.session.isCompacting) {
44
+ if (host.isExtensionCommand(text)) {
45
+ host.editor.addToHistory?.(text);
46
+ host.editor.setText("");
47
+ await host.session.prompt(text);
48
+ } else {
49
+ host.queueCompactionMessage(text, "steer");
50
+ }
51
+ return;
52
+ }
53
+
54
+ if (host.session.isStreaming) {
55
+ host.editor.addToHistory?.(text);
56
+ host.editor.setText("");
57
+ await host.session.prompt(text, { streamingBehavior: "steer" });
58
+ host.updatePendingMessagesDisplay();
59
+ host.ui.requestRender();
60
+ return;
61
+ }
62
+
63
+ host.flushPendingBashComponents();
64
+ host.onInputCallback?.(text);
65
+ host.editor.addToHistory?.(text);
66
+ };
67
+ }
68
+
@@ -0,0 +1,71 @@
1
+ import type { Model } from "@gsd/pi-ai";
2
+
3
+ export async function handleModelCommand(host: any, searchTerm?: string): Promise<void> {
4
+ if (!searchTerm) {
5
+ host.showModelSelector();
6
+ return;
7
+ }
8
+
9
+ const model = await findExactModelMatch(host, searchTerm);
10
+ if (model) {
11
+ try {
12
+ await host.session.setModel(model);
13
+ host.footer.invalidate();
14
+ host.updateEditorBorderColor();
15
+ host.showStatus(`Model: ${model.id}`);
16
+ host.checkDaxnutsEasterEgg(model);
17
+ } catch (error) {
18
+ host.showError(error instanceof Error ? error.message : String(error));
19
+ }
20
+ return;
21
+ }
22
+
23
+ host.showModelSelector(searchTerm);
24
+ }
25
+
26
+ export async function findExactModelMatch(host: any, searchTerm: string): Promise<Model<any> | undefined> {
27
+ const term = searchTerm.trim();
28
+ if (!term) return undefined;
29
+
30
+ let targetProvider: string | undefined;
31
+ let targetModelId = "";
32
+
33
+ if (term.includes("/")) {
34
+ const parts = term.split("/", 2);
35
+ targetProvider = parts[0]?.trim().toLowerCase();
36
+ targetModelId = parts[1]?.trim().toLowerCase() ?? "";
37
+ } else {
38
+ targetModelId = term.toLowerCase();
39
+ }
40
+
41
+ if (!targetModelId) return undefined;
42
+
43
+ const models = await getModelCandidates(host);
44
+ const exactMatches = models.filter((item) => {
45
+ const idMatch = item.id.toLowerCase() === targetModelId;
46
+ const providerMatch = !targetProvider || item.provider.toLowerCase() === targetProvider;
47
+ return idMatch && providerMatch;
48
+ });
49
+
50
+ return exactMatches.length === 1 ? exactMatches[0] : undefined;
51
+ }
52
+
53
+ export async function getModelCandidates(host: any): Promise<Model<any>[]> {
54
+ if (host.session.scopedModels.length > 0) {
55
+ return host.session.scopedModels.map((scoped: any) => scoped.model);
56
+ }
57
+
58
+ host.session.modelRegistry.refresh();
59
+ try {
60
+ return await host.session.modelRegistry.getAvailable();
61
+ } catch {
62
+ return [];
63
+ }
64
+ }
65
+
66
+ export async function updateAvailableProviderCount(host: any): Promise<void> {
67
+ const models = await getModelCandidates(host);
68
+ const uniqueProviders = new Set(models.map((m) => m.provider));
69
+ host.footerDataProvider.setAvailableProviderCount(uniqueProviders.size);
70
+ }
71
+
@@ -0,0 +1,37 @@
1
+ import type { AgentSessionEvent } from "../../core/agent-session.js";
2
+
3
+ export interface InteractiveModeStateHost {
4
+ defaultEditor: any;
5
+ editor: any;
6
+ session: any;
7
+ ui: any;
8
+ footer: any;
9
+ keybindings: any;
10
+ statusContainer: any;
11
+ chatContainer: any;
12
+ settingsManager: any;
13
+ pendingTools: Map<string, any>;
14
+ toolOutputExpanded: boolean;
15
+ hideThinkingBlock: boolean;
16
+ isBashMode: boolean;
17
+ onInputCallback?: (text: string) => void;
18
+ isInitialized: boolean;
19
+ loadingAnimation?: any;
20
+ pendingWorkingMessage?: string;
21
+ defaultWorkingMessage: string;
22
+ streamingComponent?: any;
23
+ streamingMessage?: any;
24
+ retryEscapeHandler?: () => void;
25
+ retryLoader?: any;
26
+ autoCompactionLoader?: any;
27
+ autoCompactionEscapeHandler?: () => void;
28
+ compactionQueuedMessages: Array<{ text: string; mode: "steer" | "followUp" }>;
29
+ extensionSelector?: any;
30
+ extensionInput?: any;
31
+ extensionEditor?: any;
32
+ editorContainer: any;
33
+ keybindingsManager?: any;
34
+ }
35
+
36
+ export type InteractiveModeEvent = AgentSessionEvent;
37
+