gsd-pi 2.34.0 → 2.35.0-dev.39eee32

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 (505) hide show
  1. package/dist/cli.js +7 -2
  2. package/dist/resource-loader.d.ts +1 -1
  3. package/dist/resource-loader.js +13 -1
  4. package/dist/resources/extensions/async-jobs/await-tool.js +0 -2
  5. package/dist/resources/extensions/async-jobs/job-manager.js +0 -6
  6. package/dist/resources/extensions/bg-shell/output-formatter.js +1 -19
  7. package/dist/resources/extensions/bg-shell/process-manager.js +0 -4
  8. package/dist/resources/extensions/bg-shell/types.js +0 -2
  9. package/dist/resources/extensions/context7/index.js +5 -0
  10. package/dist/resources/extensions/get-secrets-from-user.js +2 -30
  11. package/dist/resources/extensions/google-search/index.js +5 -0
  12. package/dist/resources/extensions/gsd/auto-dispatch.js +43 -1
  13. package/dist/resources/extensions/gsd/auto-loop.js +10 -1
  14. package/dist/resources/extensions/gsd/auto-recovery.js +35 -0
  15. package/dist/resources/extensions/gsd/auto-start.js +35 -2
  16. package/dist/resources/extensions/gsd/auto.js +59 -4
  17. package/dist/resources/extensions/gsd/changelog.js +162 -0
  18. package/dist/resources/extensions/gsd/commands-bootstrap.js +1 -0
  19. package/dist/resources/extensions/gsd/commands-handlers.js +2 -2
  20. package/dist/resources/extensions/gsd/commands-inspect.js +10 -3
  21. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +5 -1
  22. package/dist/resources/extensions/gsd/commands.js +8 -1
  23. package/dist/resources/extensions/gsd/docs/preferences-reference.md +10 -0
  24. package/dist/resources/extensions/gsd/doctor-checks.js +113 -5
  25. package/dist/resources/extensions/gsd/doctor-environment.js +26 -17
  26. package/dist/resources/extensions/gsd/doctor-proactive.js +22 -0
  27. package/dist/resources/extensions/gsd/doctor.js +36 -0
  28. package/dist/resources/extensions/gsd/files.js +11 -2
  29. package/dist/resources/extensions/gsd/gitignore.js +54 -7
  30. package/dist/resources/extensions/gsd/guided-flow.js +5 -3
  31. package/dist/resources/extensions/gsd/health-widget-core.js +96 -0
  32. package/dist/resources/extensions/gsd/health-widget.js +97 -46
  33. package/dist/resources/extensions/gsd/index.js +10 -1
  34. package/dist/resources/extensions/gsd/migrate-external.js +55 -2
  35. package/dist/resources/extensions/gsd/milestone-ids.js +3 -2
  36. package/dist/resources/extensions/gsd/paths.js +74 -7
  37. package/dist/resources/extensions/gsd/post-unit-hooks.js +4 -1
  38. package/dist/resources/extensions/gsd/preferences-validation.js +54 -1
  39. package/dist/resources/extensions/gsd/preferences.js +2 -0
  40. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +2 -0
  41. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -0
  42. package/dist/resources/extensions/gsd/roadmap-mutations.js +55 -0
  43. package/dist/resources/extensions/gsd/session-lock.js +26 -2
  44. package/dist/resources/extensions/gsd/state.js +2 -1
  45. package/dist/resources/extensions/gsd/templates/plan.md +8 -0
  46. package/dist/resources/extensions/gsd/worktree-resolver.js +12 -0
  47. package/dist/resources/extensions/mcp-client/index.js +2 -1
  48. package/dist/resources/extensions/remote-questions/remote-command.js +2 -22
  49. package/dist/resources/extensions/shared/mod.js +1 -1
  50. package/dist/resources/extensions/shared/sanitize.js +30 -0
  51. package/dist/resources/extensions/subagent/index.js +6 -14
  52. package/dist/resources/skills/create-gsd-extension/references/events-reference.md +4 -4
  53. package/package.json +2 -1
  54. package/packages/native/dist/native.d.ts +0 -2
  55. package/packages/native/dist/native.js +0 -2
  56. package/packages/native/src/native.ts +0 -3
  57. package/packages/pi-agent-core/dist/agent-loop.d.ts +14 -0
  58. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  59. package/packages/pi-agent-core/dist/agent-loop.js +24 -27
  60. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  61. package/packages/pi-agent-core/dist/agent.d.ts +1 -0
  62. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  63. package/packages/pi-agent-core/dist/agent.js +11 -22
  64. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  65. package/packages/pi-agent-core/dist/proxy.d.ts +1 -25
  66. package/packages/pi-agent-core/dist/proxy.d.ts.map +1 -1
  67. package/packages/pi-agent-core/dist/proxy.js +3 -9
  68. package/packages/pi-agent-core/dist/proxy.js.map +1 -1
  69. package/packages/pi-agent-core/src/agent-loop.ts +30 -27
  70. package/packages/pi-agent-core/src/agent.ts +12 -23
  71. package/packages/pi-agent-core/src/proxy.ts +3 -9
  72. package/packages/pi-ai/dist/api-registry.d.ts +0 -2
  73. package/packages/pi-ai/dist/api-registry.d.ts.map +1 -1
  74. package/packages/pi-ai/dist/api-registry.js +0 -10
  75. package/packages/pi-ai/dist/api-registry.js.map +1 -1
  76. package/packages/pi-ai/dist/providers/anthropic.d.ts +0 -8
  77. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  78. package/packages/pi-ai/dist/providers/anthropic.js +1 -1
  79. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  80. package/packages/pi-ai/dist/providers/azure-openai-responses.d.ts.map +1 -1
  81. package/packages/pi-ai/dist/providers/azure-openai-responses.js +5 -41
  82. package/packages/pi-ai/dist/providers/azure-openai-responses.js.map +1 -1
  83. package/packages/pi-ai/dist/providers/github-copilot-headers.d.ts +0 -1
  84. package/packages/pi-ai/dist/providers/github-copilot-headers.d.ts.map +1 -1
  85. package/packages/pi-ai/dist/providers/github-copilot-headers.js +1 -1
  86. package/packages/pi-ai/dist/providers/github-copilot-headers.js.map +1 -1
  87. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts +1 -43
  88. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  89. package/packages/pi-ai/dist/providers/google-gemini-cli.js +2 -2
  90. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  91. package/packages/pi-ai/dist/providers/google-shared.d.ts +0 -4
  92. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  93. package/packages/pi-ai/dist/providers/google-shared.js +1 -1
  94. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  95. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  96. package/packages/pi-ai/dist/providers/openai-completions.js +10 -73
  97. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  98. package/packages/pi-ai/dist/providers/openai-responses.d.ts.map +1 -1
  99. package/packages/pi-ai/dist/providers/openai-responses.js +9 -80
  100. package/packages/pi-ai/dist/providers/openai-responses.js.map +1 -1
  101. package/packages/pi-ai/dist/providers/openai-shared.d.ts +65 -0
  102. package/packages/pi-ai/dist/providers/openai-shared.d.ts.map +1 -0
  103. package/packages/pi-ai/dist/providers/openai-shared.js +146 -0
  104. package/packages/pi-ai/dist/providers/openai-shared.js.map +1 -0
  105. package/packages/pi-ai/dist/providers/register-builtins.d.ts +0 -1
  106. package/packages/pi-ai/dist/providers/register-builtins.d.ts.map +1 -1
  107. package/packages/pi-ai/dist/providers/register-builtins.js +1 -1
  108. package/packages/pi-ai/dist/providers/register-builtins.js.map +1 -1
  109. package/packages/pi-ai/dist/utils/event-stream.d.ts +0 -2
  110. package/packages/pi-ai/dist/utils/event-stream.d.ts.map +1 -1
  111. package/packages/pi-ai/dist/utils/event-stream.js +0 -4
  112. package/packages/pi-ai/dist/utils/event-stream.js.map +1 -1
  113. package/packages/pi-ai/dist/utils/oauth/google-antigravity.d.ts.map +1 -1
  114. package/packages/pi-ai/dist/utils/oauth/google-antigravity.js +7 -135
  115. package/packages/pi-ai/dist/utils/oauth/google-antigravity.js.map +1 -1
  116. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.d.ts.map +1 -1
  117. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.js +7 -135
  118. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.js.map +1 -1
  119. package/packages/pi-ai/dist/utils/oauth/google-oauth-utils.d.ts +46 -0
  120. package/packages/pi-ai/dist/utils/oauth/google-oauth-utils.d.ts.map +1 -0
  121. package/packages/pi-ai/dist/utils/oauth/google-oauth-utils.js +160 -0
  122. package/packages/pi-ai/dist/utils/oauth/google-oauth-utils.js.map +1 -0
  123. package/packages/pi-ai/dist/utils/overflow.d.ts +0 -4
  124. package/packages/pi-ai/dist/utils/overflow.d.ts.map +1 -1
  125. package/packages/pi-ai/dist/utils/overflow.js +0 -6
  126. package/packages/pi-ai/dist/utils/overflow.js.map +1 -1
  127. package/packages/pi-ai/dist/utils/validation.d.ts +0 -8
  128. package/packages/pi-ai/dist/utils/validation.d.ts.map +1 -1
  129. package/packages/pi-ai/dist/utils/validation.js +0 -14
  130. package/packages/pi-ai/dist/utils/validation.js.map +1 -1
  131. package/packages/pi-ai/src/api-registry.ts +0 -12
  132. package/packages/pi-ai/src/providers/anthropic.ts +1 -1
  133. package/packages/pi-ai/src/providers/azure-openai-responses.ts +11 -45
  134. package/packages/pi-ai/src/providers/github-copilot-headers.ts +1 -1
  135. package/packages/pi-ai/src/providers/google-gemini-cli.ts +2 -2
  136. package/packages/pi-ai/src/providers/google-shared.ts +1 -1
  137. package/packages/pi-ai/src/providers/openai-completions.ts +16 -86
  138. package/packages/pi-ai/src/providers/openai-responses.ts +16 -96
  139. package/packages/pi-ai/src/providers/openai-shared.ts +193 -0
  140. package/packages/pi-ai/src/providers/register-builtins.ts +1 -1
  141. package/packages/pi-ai/src/utils/event-stream.ts +0 -5
  142. package/packages/pi-ai/src/utils/oauth/google-antigravity.ts +14 -162
  143. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.ts +13 -161
  144. package/packages/pi-ai/src/utils/oauth/google-oauth-utils.ts +201 -0
  145. package/packages/pi-ai/src/utils/overflow.ts +1 -8
  146. package/packages/pi-ai/src/utils/validation.ts +0 -15
  147. package/packages/pi-coding-agent/dist/config.d.ts +0 -9
  148. package/packages/pi-coding-agent/dist/config.d.ts.map +1 -1
  149. package/packages/pi-coding-agent/dist/config.js +4 -8
  150. package/packages/pi-coding-agent/dist/config.js.map +1 -1
  151. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +16 -63
  152. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  153. package/packages/pi-coding-agent/dist/core/agent-session.js +104 -641
  154. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  155. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +0 -1
  156. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  157. package/packages/pi-coding-agent/dist/core/auth-storage.js +4 -35
  158. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  159. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  160. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js +5 -43
  161. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js.map +1 -1
  162. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  163. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +11 -69
  164. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  165. package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts +40 -0
  166. package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts.map +1 -1
  167. package/packages/pi-coding-agent/dist/core/compaction/utils.js +78 -0
  168. package/packages/pi-coding-agent/dist/core/compaction/utils.js.map +1 -1
  169. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts +77 -0
  170. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts.map +1 -0
  171. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +331 -0
  172. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -0
  173. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.d.ts +0 -4
  174. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  175. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.js +1 -1
  176. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.js.map +1 -1
  177. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +2 -2
  178. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  179. package/packages/pi-coding-agent/dist/core/extensions/index.js +1 -1
  180. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  181. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +15 -5
  182. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  183. package/packages/pi-coding-agent/dist/core/extensions/runner.js +129 -256
  184. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  185. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +49 -42
  186. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  187. package/packages/pi-coding-agent/dist/core/extensions/types.js +2 -21
  188. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  189. package/packages/pi-coding-agent/dist/core/keybindings.d.ts +0 -8
  190. package/packages/pi-coding-agent/dist/core/keybindings.d.ts.map +1 -1
  191. package/packages/pi-coding-agent/dist/core/keybindings.js +2 -2
  192. package/packages/pi-coding-agent/dist/core/keybindings.js.map +1 -1
  193. package/packages/pi-coding-agent/dist/core/lock-utils.d.ts +39 -0
  194. package/packages/pi-coding-agent/dist/core/lock-utils.d.ts.map +1 -0
  195. package/packages/pi-coding-agent/dist/core/lock-utils.js +89 -0
  196. package/packages/pi-coding-agent/dist/core/lock-utils.js.map +1 -0
  197. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts +0 -17
  198. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
  199. package/packages/pi-coding-agent/dist/core/lsp/client.js +3 -62
  200. package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
  201. package/packages/pi-coding-agent/dist/core/lsp/config.d.ts +1 -1
  202. package/packages/pi-coding-agent/dist/core/lsp/config.d.ts.map +1 -1
  203. package/packages/pi-coding-agent/dist/core/lsp/config.js +2 -6
  204. package/packages/pi-coding-agent/dist/core/lsp/config.js.map +1 -1
  205. package/packages/pi-coding-agent/dist/core/lsp/edits.d.ts +0 -5
  206. package/packages/pi-coding-agent/dist/core/lsp/edits.d.ts.map +1 -1
  207. package/packages/pi-coding-agent/dist/core/lsp/edits.js +1 -1
  208. package/packages/pi-coding-agent/dist/core/lsp/edits.js.map +1 -1
  209. package/packages/pi-coding-agent/dist/core/lsp/index.d.ts.map +1 -1
  210. package/packages/pi-coding-agent/dist/core/lsp/index.js +52 -107
  211. package/packages/pi-coding-agent/dist/core/lsp/index.js.map +1 -1
  212. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts +0 -1
  213. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -1
  214. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +3 -22
  215. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -1
  216. package/packages/pi-coding-agent/dist/core/lsp/types.d.ts +0 -1
  217. package/packages/pi-coding-agent/dist/core/lsp/types.d.ts.map +1 -1
  218. package/packages/pi-coding-agent/dist/core/lsp/types.js +0 -28
  219. package/packages/pi-coding-agent/dist/core/lsp/types.js.map +1 -1
  220. package/packages/pi-coding-agent/dist/core/lsp/utils.d.ts +1 -6
  221. package/packages/pi-coding-agent/dist/core/lsp/utils.d.ts.map +1 -1
  222. package/packages/pi-coding-agent/dist/core/lsp/utils.js +1 -28
  223. package/packages/pi-coding-agent/dist/core/lsp/utils.js.map +1 -1
  224. package/packages/pi-coding-agent/dist/core/messages.d.ts +0 -8
  225. package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
  226. package/packages/pi-coding-agent/dist/core/messages.js +5 -5
  227. package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
  228. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +0 -3
  229. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  230. package/packages/pi-coding-agent/dist/core/model-registry.js +1 -3
  231. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  232. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts +1 -26
  233. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  234. package/packages/pi-coding-agent/dist/core/model-resolver.js +3 -59
  235. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  236. package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
  237. package/packages/pi-coding-agent/dist/core/package-manager.js +2 -4
  238. package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
  239. package/packages/pi-coding-agent/dist/core/prompt-templates.d.ts +0 -17
  240. package/packages/pi-coding-agent/dist/core/prompt-templates.d.ts.map +1 -1
  241. package/packages/pi-coding-agent/dist/core/prompt-templates.js +2 -2
  242. package/packages/pi-coding-agent/dist/core/prompt-templates.js.map +1 -1
  243. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +2 -4
  244. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
  245. package/packages/pi-coding-agent/dist/core/resource-loader.js +46 -60
  246. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  247. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +87 -0
  248. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -0
  249. package/packages/pi-coding-agent/dist/core/retry-handler.js +295 -0
  250. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -0
  251. package/packages/pi-coding-agent/dist/core/session-manager.d.ts +0 -5
  252. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  253. package/packages/pi-coding-agent/dist/core/session-manager.js +5 -32
  254. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  255. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +8 -12
  256. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  257. package/packages/pi-coding-agent/dist/core/settings-manager.js +78 -168
  258. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  259. package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
  260. package/packages/pi-coding-agent/dist/core/skills.js +1 -3
  261. package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
  262. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  263. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  264. package/packages/pi-coding-agent/dist/index.js +1 -1
  265. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  266. package/packages/pi-coding-agent/dist/migrations.d.ts +0 -16
  267. package/packages/pi-coding-agent/dist/migrations.d.ts.map +1 -1
  268. package/packages/pi-coding-agent/dist/migrations.js +2 -2
  269. package/packages/pi-coding-agent/dist/migrations.js.map +1 -1
  270. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.d.ts +0 -2
  271. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  272. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.js +2 -2
  273. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  274. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.d.ts +1 -1
  275. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  276. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.js +9 -26
  277. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.js.map +1 -1
  278. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  279. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -13
  280. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  281. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-render-utils.d.ts +44 -0
  282. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-render-utils.d.ts.map +1 -0
  283. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-render-utils.js +61 -0
  284. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-render-utils.js.map +1 -0
  285. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  286. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-selector.js +6 -9
  287. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-selector.js.map +1 -1
  288. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +1 -24
  289. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  290. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +50 -512
  291. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  292. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts +71 -0
  293. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -0
  294. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +514 -0
  295. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -0
  296. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +65 -4
  297. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  298. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +6 -23
  299. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  300. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts +12 -0
  301. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -0
  302. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +175 -0
  303. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -0
  304. package/packages/pi-coding-agent/dist/modes/interactive/utils/shorten-path.d.ts +6 -0
  305. package/packages/pi-coding-agent/dist/modes/interactive/utils/shorten-path.d.ts.map +1 -0
  306. package/packages/pi-coding-agent/dist/modes/interactive/utils/shorten-path.js +15 -0
  307. package/packages/pi-coding-agent/dist/modes/interactive/utils/shorten-path.js.map +1 -0
  308. package/packages/pi-coding-agent/dist/modes/print-mode.d.ts.map +1 -1
  309. package/packages/pi-coding-agent/dist/modes/print-mode.js +2 -30
  310. package/packages/pi-coding-agent/dist/modes/print-mode.js.map +1 -1
  311. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  312. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +2 -28
  313. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  314. package/packages/pi-coding-agent/dist/modes/shared/command-context-actions.d.ts +19 -0
  315. package/packages/pi-coding-agent/dist/modes/shared/command-context-actions.d.ts.map +1 -0
  316. package/packages/pi-coding-agent/dist/modes/shared/command-context-actions.js +45 -0
  317. package/packages/pi-coding-agent/dist/modes/shared/command-context-actions.js.map +1 -0
  318. package/packages/pi-coding-agent/dist/utils/changelog.d.ts +0 -4
  319. package/packages/pi-coding-agent/dist/utils/changelog.d.ts.map +1 -1
  320. package/packages/pi-coding-agent/dist/utils/changelog.js +1 -1
  321. package/packages/pi-coding-agent/dist/utils/changelog.js.map +1 -1
  322. package/packages/pi-coding-agent/dist/utils/clipboard-image.d.ts +0 -1
  323. package/packages/pi-coding-agent/dist/utils/clipboard-image.d.ts.map +1 -1
  324. package/packages/pi-coding-agent/dist/utils/clipboard-image.js +1 -1
  325. package/packages/pi-coding-agent/dist/utils/clipboard-image.js.map +1 -1
  326. package/packages/pi-coding-agent/dist/utils/error.d.ts +5 -0
  327. package/packages/pi-coding-agent/dist/utils/error.d.ts.map +1 -0
  328. package/packages/pi-coding-agent/dist/utils/error.js +7 -0
  329. package/packages/pi-coding-agent/dist/utils/error.js.map +1 -0
  330. package/packages/pi-coding-agent/dist/utils/photon.d.ts +0 -19
  331. package/packages/pi-coding-agent/dist/utils/photon.d.ts.map +1 -1
  332. package/packages/pi-coding-agent/dist/utils/photon.js +1 -120
  333. package/packages/pi-coding-agent/dist/utils/photon.js.map +1 -1
  334. package/packages/pi-coding-agent/dist/utils/tools-manager.d.ts +0 -1
  335. package/packages/pi-coding-agent/dist/utils/tools-manager.d.ts.map +1 -1
  336. package/packages/pi-coding-agent/dist/utils/tools-manager.js +1 -1
  337. package/packages/pi-coding-agent/dist/utils/tools-manager.js.map +1 -1
  338. package/packages/pi-coding-agent/package.json +1 -1
  339. package/packages/pi-coding-agent/src/config.ts +5 -10
  340. package/packages/pi-coding-agent/src/core/agent-session.ts +117 -745
  341. package/packages/pi-coding-agent/src/core/auth-storage.ts +4 -38
  342. package/packages/pi-coding-agent/src/core/compaction/branch-summarization.ts +7 -53
  343. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +14 -74
  344. package/packages/pi-coding-agent/src/core/compaction/utils.ts +100 -0
  345. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +424 -0
  346. package/packages/pi-coding-agent/src/core/export-html/ansi-to-html.ts +1 -1
  347. package/packages/pi-coding-agent/src/core/extensions/index.ts +1 -21
  348. package/packages/pi-coding-agent/src/core/extensions/runner.ts +119 -256
  349. package/packages/pi-coding-agent/src/core/extensions/types.ts +50 -69
  350. package/packages/pi-coding-agent/src/core/keybindings.ts +2 -2
  351. package/packages/pi-coding-agent/src/core/lock-utils.ts +113 -0
  352. package/packages/pi-coding-agent/src/core/lsp/client.ts +3 -73
  353. package/packages/pi-coding-agent/src/core/lsp/config.ts +2 -10
  354. package/packages/pi-coding-agent/src/core/lsp/edits.ts +1 -1
  355. package/packages/pi-coding-agent/src/core/lsp/index.ts +83 -152
  356. package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +3 -23
  357. package/packages/pi-coding-agent/src/core/lsp/types.ts +0 -29
  358. package/packages/pi-coding-agent/src/core/lsp/utils.ts +1 -33
  359. package/packages/pi-coding-agent/src/core/messages.ts +5 -5
  360. package/packages/pi-coding-agent/src/core/model-registry.ts +0 -2
  361. package/packages/pi-coding-agent/src/core/model-resolver.ts +3 -77
  362. package/packages/pi-coding-agent/src/core/package-manager.ts +1 -4
  363. package/packages/pi-coding-agent/src/core/prompt-templates.ts +2 -2
  364. package/packages/pi-coding-agent/src/core/resource-loader.ts +56 -69
  365. package/packages/pi-coding-agent/src/core/retry-handler.ts +359 -0
  366. package/packages/pi-coding-agent/src/core/session-manager.ts +5 -34
  367. package/packages/pi-coding-agent/src/core/settings-manager.ts +87 -166
  368. package/packages/pi-coding-agent/src/core/skills.ts +1 -4
  369. package/packages/pi-coding-agent/src/index.ts +1 -7
  370. package/packages/pi-coding-agent/src/migrations.ts +2 -2
  371. package/packages/pi-coding-agent/src/modes/interactive/components/session-selector-search.ts +2 -2
  372. package/packages/pi-coding-agent/src/modes/interactive/components/session-selector.ts +17 -29
  373. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -13
  374. package/packages/pi-coding-agent/src/modes/interactive/components/tree-render-utils.ts +81 -0
  375. package/packages/pi-coding-agent/src/modes/interactive/components/tree-selector.ts +14 -19
  376. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +50 -561
  377. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +653 -0
  378. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +7 -26
  379. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +196 -0
  380. package/packages/pi-coding-agent/src/modes/interactive/utils/shorten-path.ts +14 -0
  381. package/packages/pi-coding-agent/src/modes/print-mode.ts +2 -30
  382. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +2 -28
  383. package/packages/pi-coding-agent/src/modes/shared/command-context-actions.ts +53 -0
  384. package/packages/pi-coding-agent/src/utils/changelog.ts +1 -1
  385. package/packages/pi-coding-agent/src/utils/clipboard-image.ts +1 -1
  386. package/packages/pi-coding-agent/src/utils/error.ts +6 -0
  387. package/packages/pi-coding-agent/src/utils/photon.ts +0 -137
  388. package/packages/pi-coding-agent/src/utils/tools-manager.ts +1 -1
  389. package/packages/pi-tui/dist/components/editor.d.ts +0 -10
  390. package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
  391. package/packages/pi-tui/dist/components/editor.js +1 -1
  392. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  393. package/packages/pi-tui/dist/components/markdown.d.ts +5 -0
  394. package/packages/pi-tui/dist/components/markdown.d.ts.map +1 -1
  395. package/packages/pi-tui/dist/components/markdown.js +25 -31
  396. package/packages/pi-tui/dist/components/markdown.js.map +1 -1
  397. package/packages/pi-tui/dist/keys.d.ts +0 -4
  398. package/packages/pi-tui/dist/keys.d.ts.map +1 -1
  399. package/packages/pi-tui/dist/keys.js +94 -162
  400. package/packages/pi-tui/dist/keys.js.map +1 -1
  401. package/packages/pi-tui/dist/overlay-layout.d.ts +55 -0
  402. package/packages/pi-tui/dist/overlay-layout.d.ts.map +1 -0
  403. package/packages/pi-tui/dist/overlay-layout.js +288 -0
  404. package/packages/pi-tui/dist/overlay-layout.js.map +1 -0
  405. package/packages/pi-tui/dist/tui.d.ts +0 -22
  406. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  407. package/packages/pi-tui/dist/tui.js +6 -272
  408. package/packages/pi-tui/dist/tui.js.map +1 -1
  409. package/packages/pi-tui/dist/utils.d.ts +0 -7
  410. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  411. package/packages/pi-tui/dist/utils.js +0 -44
  412. package/packages/pi-tui/dist/utils.js.map +1 -1
  413. package/packages/pi-tui/src/components/editor.ts +1 -1
  414. package/packages/pi-tui/src/components/markdown.ts +25 -29
  415. package/packages/pi-tui/src/keys.ts +94 -173
  416. package/packages/pi-tui/src/overlay-layout.ts +372 -0
  417. package/packages/pi-tui/src/tui.ts +11 -312
  418. package/packages/pi-tui/src/utils.ts +0 -43
  419. package/pkg/dist/core/export-html/ansi-to-html.d.ts +0 -4
  420. package/pkg/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  421. package/pkg/dist/core/export-html/ansi-to-html.js +1 -1
  422. package/pkg/dist/core/export-html/ansi-to-html.js.map +1 -1
  423. package/pkg/dist/modes/interactive/theme/theme.d.ts +65 -4
  424. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  425. package/pkg/dist/modes/interactive/theme/theme.js +6 -23
  426. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  427. package/pkg/dist/modes/interactive/theme/themes.d.ts +12 -0
  428. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -0
  429. package/pkg/dist/modes/interactive/theme/themes.js +175 -0
  430. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -0
  431. package/pkg/package.json +1 -1
  432. package/src/resources/extensions/async-jobs/await-tool.ts +0 -2
  433. package/src/resources/extensions/async-jobs/job-manager.ts +0 -7
  434. package/src/resources/extensions/bg-shell/output-formatter.ts +0 -17
  435. package/src/resources/extensions/bg-shell/process-manager.ts +0 -4
  436. package/src/resources/extensions/bg-shell/types.ts +0 -12
  437. package/src/resources/extensions/context7/index.ts +7 -0
  438. package/src/resources/extensions/get-secrets-from-user.ts +2 -35
  439. package/src/resources/extensions/google-search/index.ts +7 -0
  440. package/src/resources/extensions/gsd/auto-dispatch.ts +49 -1
  441. package/src/resources/extensions/gsd/auto-loop.ts +11 -1
  442. package/src/resources/extensions/gsd/auto-recovery.ts +39 -0
  443. package/src/resources/extensions/gsd/auto-start.ts +42 -2
  444. package/src/resources/extensions/gsd/auto.ts +61 -3
  445. package/src/resources/extensions/gsd/changelog.ts +213 -0
  446. package/src/resources/extensions/gsd/commands-bootstrap.ts +1 -0
  447. package/src/resources/extensions/gsd/commands-handlers.ts +2 -2
  448. package/src/resources/extensions/gsd/commands-inspect.ts +10 -3
  449. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +5 -1
  450. package/src/resources/extensions/gsd/commands.ts +9 -1
  451. package/src/resources/extensions/gsd/docs/preferences-reference.md +10 -0
  452. package/src/resources/extensions/gsd/doctor-checks.ts +107 -5
  453. package/src/resources/extensions/gsd/doctor-environment.ts +26 -16
  454. package/src/resources/extensions/gsd/doctor-proactive.ts +24 -0
  455. package/src/resources/extensions/gsd/doctor-types.ts +9 -1
  456. package/src/resources/extensions/gsd/doctor.ts +35 -0
  457. package/src/resources/extensions/gsd/files.ts +12 -2
  458. package/src/resources/extensions/gsd/gitignore.ts +54 -7
  459. package/src/resources/extensions/gsd/guided-flow.ts +5 -3
  460. package/src/resources/extensions/gsd/health-widget-core.ts +129 -0
  461. package/src/resources/extensions/gsd/health-widget.ts +103 -59
  462. package/src/resources/extensions/gsd/index.ts +10 -1
  463. package/src/resources/extensions/gsd/migrate-external.ts +47 -2
  464. package/src/resources/extensions/gsd/milestone-ids.ts +3 -2
  465. package/src/resources/extensions/gsd/paths.ts +73 -7
  466. package/src/resources/extensions/gsd/post-unit-hooks.ts +5 -1
  467. package/src/resources/extensions/gsd/preferences-validation.ts +54 -1
  468. package/src/resources/extensions/gsd/preferences.ts +2 -0
  469. package/src/resources/extensions/gsd/prompts/complete-milestone.md +2 -0
  470. package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -0
  471. package/src/resources/extensions/gsd/roadmap-mutations.ts +66 -0
  472. package/src/resources/extensions/gsd/session-lock.ts +29 -2
  473. package/src/resources/extensions/gsd/state.ts +2 -1
  474. package/src/resources/extensions/gsd/templates/plan.md +8 -0
  475. package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +46 -0
  476. package/src/resources/extensions/gsd/tests/doctor-git.test.ts +98 -2
  477. package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +59 -3
  478. package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +20 -0
  479. package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +214 -0
  480. package/src/resources/extensions/gsd/tests/health-widget.test.ts +158 -0
  481. package/src/resources/extensions/gsd/tests/paths.test.ts +113 -0
  482. package/src/resources/extensions/gsd/tests/preferences.test.ts +40 -2
  483. package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +26 -0
  484. package/src/resources/extensions/gsd/tests/test-utils.ts +165 -0
  485. package/src/resources/extensions/gsd/tests/validate-directory.test.ts +15 -0
  486. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +7 -0
  487. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +32 -0
  488. package/src/resources/extensions/gsd/worktree-resolver.ts +11 -0
  489. package/src/resources/extensions/mcp-client/index.ts +2 -1
  490. package/src/resources/extensions/remote-questions/remote-command.ts +2 -23
  491. package/src/resources/extensions/shared/mod.ts +1 -1
  492. package/src/resources/extensions/shared/sanitize.ts +36 -0
  493. package/src/resources/extensions/subagent/index.ts +6 -12
  494. package/src/resources/skills/create-gsd-extension/references/events-reference.md +4 -4
  495. package/dist/resources/extensions/shared/wizard-ui.js +0 -478
  496. package/packages/pi-coding-agent/dist/modes/interactive/theme/dark.json +0 -85
  497. package/packages/pi-coding-agent/dist/modes/interactive/theme/light.json +0 -84
  498. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.json +0 -335
  499. package/packages/pi-coding-agent/src/modes/interactive/theme/dark.json +0 -85
  500. package/packages/pi-coding-agent/src/modes/interactive/theme/light.json +0 -84
  501. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.json +0 -335
  502. package/pkg/dist/modes/interactive/theme/dark.json +0 -85
  503. package/pkg/dist/modes/interactive/theme/light.json +0 -84
  504. package/pkg/dist/modes/interactive/theme/theme-schema.json +0 -335
  505. package/src/resources/extensions/shared/wizard-ui.ts +0 -551
@@ -7,11 +7,10 @@ import * as crypto from "node:crypto";
7
7
  import * as fs from "node:fs";
8
8
  import * as os from "node:os";
9
9
  import * as path from "node:path";
10
- import type { AgentMessage, ThinkingLevel } from "@gsd/pi-agent-core";
10
+ import type { AgentMessage } from "@gsd/pi-agent-core";
11
11
  import type { AssistantMessage, ImageContent, Message, Model, OAuthProviderId } from "@gsd/pi-ai";
12
12
  import type {
13
13
  AutocompleteItem,
14
- EditorAction,
15
14
  EditorComponent,
16
15
  EditorTheme,
17
16
  KeyId,
@@ -40,7 +39,6 @@ import {
40
39
  APP_NAME,
41
40
  getAuthPath,
42
41
  getDebugLogPath,
43
- getShareViewerUrl,
44
42
  getUpdateInstruction,
45
43
  VERSION,
46
44
  } from "../../config.js";
@@ -62,10 +60,8 @@ import { type SessionContext, SessionManager } from "../../core/session-manager.
62
60
  import { BUILTIN_SLASH_COMMANDS } from "../../core/slash-commands.js";
63
61
  import type { TruncationResult } from "../../core/tools/truncate.js";
64
62
  import { getChangelogPath, getNewEntries, parseChangelog } from "../../utils/changelog.js";
65
- import { copyToClipboard } from "../../utils/clipboard.js";
66
63
  import { extensionForImageMimeType, readClipboardImage } from "../../utils/clipboard-image.js";
67
64
  import { ensureTool } from "../../utils/tools-manager.js";
68
- import { ArminComponent } from "./components/armin.js";
69
65
  import { AssistantMessageComponent } from "./components/assistant-message.js";
70
66
  import { BashExecutionComponent } from "./components/bash-execution.js";
71
67
  import { BorderedLoader } from "./components/bordered-loader.js";
@@ -86,12 +82,13 @@ import { OAuthSelectorComponent } from "./components/oauth-selector.js";
86
82
  import { ProviderManagerComponent } from "./components/provider-manager.js";
87
83
  import { ScopedModelsSelectorComponent } from "./components/scoped-models-selector.js";
88
84
  import { SessionSelectorComponent } from "./components/session-selector.js";
89
- import { SelectSubmenu, SettingsSelectorComponent, THINKING_DESCRIPTIONS } from "./components/settings-selector.js";
85
+ import { SettingsSelectorComponent } from "./components/settings-selector.js";
90
86
  import { SkillInvocationMessageComponent } from "./components/skill-invocation-message.js";
91
87
  import { ToolExecutionComponent } from "./components/tool-execution.js";
92
88
  import { TreeSelectorComponent } from "./components/tree-selector.js";
93
89
  import { UserMessageComponent } from "./components/user-message.js";
94
90
  import { UserMessageSelectorComponent } from "./components/user-message-selector.js";
91
+ import { type SlashCommandContext, dispatchSlashCommand, getAppKeyDisplay } from "./slash-command-handlers.js";
95
92
  import {
96
93
  getAvailableThemes,
97
94
  getAvailableThemesWithPaths,
@@ -1980,135 +1977,57 @@ export class InteractiveMode {
1980
1977
  }
1981
1978
  }
1982
1979
 
1980
+ private getSlashCommandContext(): SlashCommandContext {
1981
+ return {
1982
+ session: this.session,
1983
+ ui: this.ui,
1984
+ keybindings: this.keybindings,
1985
+ chatContainer: this.chatContainer,
1986
+ statusContainer: this.statusContainer,
1987
+ editorContainer: this.editorContainer,
1988
+ headerContainer: this.headerContainer,
1989
+ pendingMessagesContainer: this.pendingMessagesContainer,
1990
+ editor: this.editor,
1991
+ defaultEditor: this.defaultEditor,
1992
+ sessionManager: this.sessionManager,
1993
+ settingsManager: this.settingsManager,
1994
+ invalidateFooter: () => this.footer.invalidate(),
1995
+ showStatus: (msg) => this.showStatus(msg),
1996
+ showError: (msg) => this.showError(msg),
1997
+ showWarning: (msg) => this.showWarning(msg),
1998
+ showSelector: (create) => this.showSelector(create),
1999
+ updateEditorBorderColor: () => this.updateEditorBorderColor(),
2000
+ getMarkdownThemeWithSettings: () => this.getMarkdownThemeWithSettings(),
2001
+ requestRender: () => this.ui.requestRender(),
2002
+ updateTerminalTitle: () => this.updateTerminalTitle(),
2003
+ showSettingsSelector: () => this.showSettingsSelector(),
2004
+ showModelsSelector: () => this.showModelsSelector(),
2005
+ handleModelCommand: (searchTerm) => this.handleModelCommand(searchTerm),
2006
+ showUserMessageSelector: () => this.showUserMessageSelector(),
2007
+ showTreeSelector: () => this.showTreeSelector(),
2008
+ showProviderManager: () => this.showProviderManager(),
2009
+ showOAuthSelector: (mode) => this.showOAuthSelector(mode),
2010
+ showSessionSelector: () => this.showSessionSelector(),
2011
+ handleClearCommand: () => this.handleClearCommand(),
2012
+ handleReloadCommand: () => this.handleReloadCommand(),
2013
+ handleDebugCommand: () => this.handleDebugCommand(),
2014
+ shutdown: () => this.shutdown(),
2015
+ executeCompaction: (instructions, isAuto) => this.executeCompaction(instructions, isAuto),
2016
+ };
2017
+ }
2018
+
1983
2019
  private setupEditorSubmitHandler(): void {
1984
2020
  this.defaultEditor.onSubmit = async (text: string) => {
1985
2021
  text = text.trim();
1986
2022
  if (!text) return;
1987
2023
 
1988
- // Handle commands
1989
- if (text === "/settings") {
1990
- this.showSettingsSelector();
1991
- this.editor.setText("");
1992
- return;
1993
- }
1994
- if (text === "/scoped-models") {
1995
- this.editor.setText("");
1996
- await this.showModelsSelector();
1997
- return;
1998
- }
1999
- if (text === "/model" || text.startsWith("/model ")) {
2000
- const searchTerm = text.startsWith("/model ") ? text.slice(7).trim() : undefined;
2001
- this.editor.setText("");
2002
- await this.handleModelCommand(searchTerm);
2003
- return;
2004
- }
2005
- if (text.startsWith("/export")) {
2006
- await this.handleExportCommand(text);
2007
- this.editor.setText("");
2008
- return;
2009
- }
2010
- if (text === "/share") {
2011
- await this.handleShareCommand();
2012
- this.editor.setText("");
2013
- return;
2014
- }
2015
- if (text === "/copy") {
2016
- this.handleCopyCommand();
2017
- this.editor.setText("");
2018
- return;
2019
- }
2020
- if (text === "/name" || text.startsWith("/name ")) {
2021
- this.handleNameCommand(text);
2022
- this.editor.setText("");
2023
- return;
2024
- }
2025
- if (text === "/session") {
2026
- this.handleSessionCommand();
2027
- this.editor.setText("");
2028
- return;
2029
- }
2030
- if (text === "/changelog") {
2031
- this.handleChangelogCommand();
2032
- this.editor.setText("");
2033
- return;
2034
- }
2035
- if (text === "/hotkeys") {
2036
- this.handleHotkeysCommand();
2037
- this.editor.setText("");
2038
- return;
2039
- }
2040
- if (text === "/fork") {
2041
- this.showUserMessageSelector();
2042
- this.editor.setText("");
2043
- return;
2044
- }
2045
- if (text === "/tree") {
2046
- this.showTreeSelector();
2047
- this.editor.setText("");
2048
- return;
2049
- }
2050
- if (text === "/provider") {
2051
- this.showProviderManager();
2052
- this.editor.setText("");
2053
- return;
2054
- }
2055
- if (text === "/login") {
2056
- this.showOAuthSelector("login");
2057
- this.editor.setText("");
2058
- return;
2059
- }
2060
- if (text === "/logout") {
2061
- this.showOAuthSelector("logout");
2062
- this.editor.setText("");
2063
- return;
2064
- }
2065
- if (text === "/new") {
2066
- this.editor.setText("");
2067
- await this.handleClearCommand();
2068
- return;
2069
- }
2070
- if (text === "/compact" || text.startsWith("/compact ")) {
2071
- const customInstructions = text.startsWith("/compact ") ? text.slice(9).trim() : undefined;
2072
- this.editor.setText("");
2073
- await this.handleCompactCommand(customInstructions);
2074
- return;
2075
- }
2076
- if (text === "/reload") {
2077
- this.editor.setText("");
2078
- await this.handleReloadCommand();
2079
- return;
2080
- }
2081
- if (text === "/thinking" || text.startsWith("/thinking ")) {
2082
- const arg = text.startsWith("/thinking ") ? text.slice(10).trim() : undefined;
2083
- this.editor.setText("");
2084
- this.handleThinkingCommand(arg);
2085
- return;
2086
- }
2087
- if (text === "/edit-mode" || text.startsWith("/edit-mode ")) {
2088
- const arg = text.startsWith("/edit-mode ") ? text.slice(11).trim() : undefined;
2089
- this.editor.setText("");
2090
- this.handleEditModeCommand(arg);
2091
- return;
2092
- }
2093
- if (text === "/debug") {
2094
- this.handleDebugCommand();
2095
- this.editor.setText("");
2096
- return;
2097
- }
2098
- if (text === "/arminsayshi") {
2099
- this.handleArminSaysHi();
2100
- this.editor.setText("");
2101
- return;
2102
- }
2103
- if (text === "/resume") {
2104
- this.showSessionSelector();
2105
- this.editor.setText("");
2106
- return;
2107
- }
2108
- if (text === "/quit") {
2109
- this.editor.setText("");
2110
- await this.shutdown();
2111
- return;
2024
+ // Handle slash commands
2025
+ if (text.startsWith("/")) {
2026
+ const handled = await dispatchSlashCommand(text, this.getSlashCommandContext());
2027
+ if (handled) {
2028
+ this.editor.setText("");
2029
+ return;
2030
+ }
2112
2031
  }
2113
2032
 
2114
2033
  // Handle bash command (! for normal, !! for excluded from context)
@@ -2897,78 +2816,6 @@ export class InteractiveMode {
2897
2816
  }
2898
2817
  }
2899
2818
 
2900
- private handleThinkingCommand(arg?: string): void {
2901
- if (!this.session.supportsThinking()) {
2902
- this.showStatus("Current model does not support thinking");
2903
- return;
2904
- }
2905
-
2906
- const availableLevels = this.session.getAvailableThinkingLevels();
2907
-
2908
- if (arg) {
2909
- const level = arg.toLowerCase();
2910
- if (!availableLevels.includes(level as ThinkingLevel)) {
2911
- this.showStatus(`Invalid thinking level "${arg}". Available: ${availableLevels.join(", ")}`);
2912
- return;
2913
- }
2914
- this.session.setThinkingLevel(level as ThinkingLevel);
2915
- this.footer.invalidate();
2916
- this.updateEditorBorderColor();
2917
- this.showStatus(`Thinking level: ${level}`);
2918
- return;
2919
- }
2920
-
2921
- this.showThinkingSelector();
2922
- }
2923
-
2924
- private handleEditModeCommand(arg?: string): void {
2925
- const modes = ["standard", "hashline"] as const;
2926
-
2927
- if (arg) {
2928
- const mode = arg.toLowerCase();
2929
- if (!modes.includes(mode as typeof modes[number])) {
2930
- this.showStatus(`Invalid edit mode "${arg}". Available: standard, hashline`);
2931
- return;
2932
- }
2933
- this.session.setEditMode(mode as "standard" | "hashline");
2934
- this.showStatus(`Edit mode: ${mode}${mode === "hashline" ? " (LINE#ID anchored edits)" : " (text-match edits)"}`);
2935
- return;
2936
- }
2937
-
2938
- // Toggle
2939
- const current = this.session.editMode;
2940
- const next = current === "standard" ? "hashline" : "standard";
2941
- this.session.setEditMode(next);
2942
- this.showStatus(`Edit mode: ${next}${next === "hashline" ? " (LINE#ID anchored edits)" : " (text-match edits)"}`);
2943
- }
2944
-
2945
- private showThinkingSelector(): void {
2946
- const availableLevels = this.session.getAvailableThinkingLevels();
2947
- this.showSelector((done) => {
2948
- const selector = new SelectSubmenu(
2949
- "Thinking Level",
2950
- "Select reasoning depth for thinking-capable models",
2951
- availableLevels.map((level) => ({
2952
- value: level,
2953
- label: level,
2954
- description: THINKING_DESCRIPTIONS[level],
2955
- })),
2956
- this.session.thinkingLevel,
2957
- (value) => {
2958
- this.session.setThinkingLevel(value as ThinkingLevel);
2959
- this.footer.invalidate();
2960
- this.updateEditorBorderColor();
2961
- done();
2962
- this.showStatus(`Thinking level: ${value}`);
2963
- },
2964
- () => {
2965
- done();
2966
- },
2967
- );
2968
- return { component: selector, focus: selector };
2969
- });
2970
- }
2971
-
2972
2819
  private async cycleModel(direction: "forward" | "backward"): Promise<void> {
2973
2820
  try {
2974
2821
  const result = await this.session.cycleModel(direction);
@@ -3159,7 +3006,7 @@ export class InteractiveMode {
3159
3006
  const text = theme.fg("dim", `Follow-up: ${message}`);
3160
3007
  this.pendingMessagesContainer.addChild(new TruncatedText(text, 1, 0));
3161
3008
  }
3162
- const dequeueHint = this.getAppKeyDisplay("dequeue");
3009
+ const dequeueHint = getAppKeyDisplay(this.keybindings, "dequeue");
3163
3010
  const hintText = theme.fg("dim", `↳ ${dequeueHint} to edit all queued messages`);
3164
3011
  this.pendingMessagesContainer.addChild(new TruncatedText(hintText, 1, 0));
3165
3012
  }
@@ -4191,346 +4038,6 @@ export class InteractiveMode {
4191
4038
  }
4192
4039
  }
4193
4040
 
4194
- private async handleExportCommand(text: string): Promise<void> {
4195
- const parts = text.split(/\s+/);
4196
- const outputPath = parts.length > 1 ? parts[1] : undefined;
4197
-
4198
- try {
4199
- const filePath = await this.session.exportToHtml(outputPath);
4200
- this.showStatus(`Session exported to: ${filePath}`);
4201
- } catch (error: unknown) {
4202
- this.showError(`Failed to export session: ${error instanceof Error ? error.message : "Unknown error"}`);
4203
- }
4204
- }
4205
-
4206
- private async handleShareCommand(): Promise<void> {
4207
- // Check if gh is available and logged in
4208
- try {
4209
- const authResult = spawnSync("gh", ["auth", "status"], { encoding: "utf-8" });
4210
- if (authResult.status !== 0) {
4211
- this.showError("GitHub CLI is not logged in. Run 'gh auth login' first.");
4212
- return;
4213
- }
4214
- } catch {
4215
- this.showError("GitHub CLI (gh) is not installed. Install it from https://cli.github.com/");
4216
- return;
4217
- }
4218
-
4219
- // Export to a temp file
4220
- const tmpFile = path.join(os.tmpdir(), "session.html");
4221
- try {
4222
- await this.session.exportToHtml(tmpFile);
4223
- } catch (error: unknown) {
4224
- this.showError(`Failed to export session: ${error instanceof Error ? error.message : "Unknown error"}`);
4225
- return;
4226
- }
4227
-
4228
- // Show cancellable loader, replacing the editor
4229
- const loader = new BorderedLoader(this.ui, theme, "Creating gist...");
4230
- this.editorContainer.clear();
4231
- this.editorContainer.addChild(loader);
4232
- this.ui.setFocus(loader);
4233
- this.ui.requestRender();
4234
-
4235
- const restoreEditor = () => {
4236
- loader.dispose();
4237
- this.editorContainer.clear();
4238
- this.editorContainer.addChild(this.editor);
4239
- this.ui.setFocus(this.editor);
4240
- try {
4241
- fs.unlinkSync(tmpFile);
4242
- } catch {
4243
- // Ignore cleanup errors
4244
- }
4245
- };
4246
-
4247
- // Create a secret gist asynchronously
4248
- let proc: ReturnType<typeof spawn> | null = null;
4249
-
4250
- loader.onAbort = () => {
4251
- proc?.kill();
4252
- restoreEditor();
4253
- this.showStatus("Share cancelled");
4254
- };
4255
-
4256
- try {
4257
- const result = await new Promise<{ stdout: string; stderr: string; code: number | null }>((resolve) => {
4258
- proc = spawn("gh", ["gist", "create", "--public=false", tmpFile]);
4259
- let stdout = "";
4260
- let stderr = "";
4261
- proc.stdout?.on("data", (data) => {
4262
- stdout += data.toString();
4263
- });
4264
- proc.stderr?.on("data", (data) => {
4265
- stderr += data.toString();
4266
- });
4267
- proc.on("close", (code) => resolve({ stdout, stderr, code }));
4268
- });
4269
-
4270
- if (loader.signal.aborted) return;
4271
-
4272
- restoreEditor();
4273
-
4274
- if (result.code !== 0) {
4275
- const errorMsg = result.stderr?.trim() || "Unknown error";
4276
- this.showError(`Failed to create gist: ${errorMsg}`);
4277
- return;
4278
- }
4279
-
4280
- // Extract gist ID from the URL returned by gh
4281
- // gh returns something like: https://gist.github.com/username/GIST_ID
4282
- const gistUrl = result.stdout?.trim();
4283
- const gistId = gistUrl?.split("/").pop();
4284
- if (!gistId) {
4285
- this.showError("Failed to parse gist ID from gh output");
4286
- return;
4287
- }
4288
-
4289
- // Create the preview URL
4290
- const previewUrl = getShareViewerUrl(gistId);
4291
- this.showStatus(`Share URL: ${previewUrl}\nGist: ${gistUrl}`);
4292
- } catch (error: unknown) {
4293
- if (!loader.signal.aborted) {
4294
- restoreEditor();
4295
- this.showError(`Failed to create gist: ${error instanceof Error ? error.message : "Unknown error"}`);
4296
- }
4297
- }
4298
- }
4299
-
4300
- private handleCopyCommand(): void {
4301
- const text = this.session.getLastAssistantText();
4302
- if (!text) {
4303
- this.showError("No agent messages to copy yet.");
4304
- return;
4305
- }
4306
-
4307
- try {
4308
- copyToClipboard(text);
4309
- this.showStatus("Copied last agent message to clipboard");
4310
- } catch (error) {
4311
- this.showError(error instanceof Error ? error.message : String(error));
4312
- }
4313
- }
4314
-
4315
- private handleNameCommand(text: string): void {
4316
- const name = text.replace(/^\/name\s*/, "").trim();
4317
- if (!name) {
4318
- const currentName = this.sessionManager.getSessionName();
4319
- if (currentName) {
4320
- this.chatContainer.addChild(new Spacer(1));
4321
- this.chatContainer.addChild(new Text(theme.fg("dim", `Session name: ${currentName}`), 1, 0));
4322
- } else {
4323
- this.showWarning("Usage: /name <name>");
4324
- }
4325
- this.ui.requestRender();
4326
- return;
4327
- }
4328
-
4329
- this.sessionManager.appendSessionInfo(name);
4330
- this.updateTerminalTitle();
4331
- this.chatContainer.addChild(new Spacer(1));
4332
- this.chatContainer.addChild(new Text(theme.fg("dim", `Session name set: ${name}`), 1, 0));
4333
- this.ui.requestRender();
4334
- }
4335
-
4336
- private handleSessionCommand(): void {
4337
- const stats = this.session.getSessionStats();
4338
- const sessionName = this.sessionManager.getSessionName();
4339
-
4340
- let info = `${theme.bold("Session Info")}\n\n`;
4341
- if (sessionName) {
4342
- info += `${theme.fg("dim", "Name:")} ${sessionName}\n`;
4343
- }
4344
- info += `${theme.fg("dim", "File:")} ${stats.sessionFile ?? "In-memory"}\n`;
4345
- info += `${theme.fg("dim", "ID:")} ${stats.sessionId}\n\n`;
4346
- info += `${theme.bold("Messages")}\n`;
4347
- info += `${theme.fg("dim", "User:")} ${stats.userMessages}\n`;
4348
- info += `${theme.fg("dim", "Assistant:")} ${stats.assistantMessages}\n`;
4349
- info += `${theme.fg("dim", "Tool Calls:")} ${stats.toolCalls}\n`;
4350
- info += `${theme.fg("dim", "Tool Results:")} ${stats.toolResults}\n`;
4351
- info += `${theme.fg("dim", "Total:")} ${stats.totalMessages}\n\n`;
4352
- info += `${theme.bold("Tokens")}\n`;
4353
- info += `${theme.fg("dim", "Input:")} ${stats.tokens.input.toLocaleString()}\n`;
4354
- info += `${theme.fg("dim", "Output:")} ${stats.tokens.output.toLocaleString()}\n`;
4355
- if (stats.tokens.cacheRead > 0) {
4356
- info += `${theme.fg("dim", "Cache Read:")} ${stats.tokens.cacheRead.toLocaleString()}\n`;
4357
- }
4358
- if (stats.tokens.cacheWrite > 0) {
4359
- info += `${theme.fg("dim", "Cache Write:")} ${stats.tokens.cacheWrite.toLocaleString()}\n`;
4360
- }
4361
- info += `${theme.fg("dim", "Total:")} ${stats.tokens.total.toLocaleString()}\n`;
4362
-
4363
- if (stats.cost > 0) {
4364
- info += `\n${theme.bold("Cost")}\n`;
4365
- info += `${theme.fg("dim", "Total:")} ${stats.cost.toFixed(4)}`;
4366
- }
4367
-
4368
- this.chatContainer.addChild(new Spacer(1));
4369
- this.chatContainer.addChild(new Text(info, 1, 0));
4370
- this.ui.requestRender();
4371
- }
4372
-
4373
- private handleChangelogCommand(): void {
4374
- const changelogPath = getChangelogPath();
4375
- const allEntries = parseChangelog(changelogPath);
4376
-
4377
- const changelogMarkdown =
4378
- allEntries.length > 0
4379
- ? allEntries
4380
- .reverse()
4381
- .map((e) => e.content)
4382
- .join("\n\n")
4383
- : "No changelog entries found.";
4384
-
4385
- this.chatContainer.addChild(new Spacer(1));
4386
- this.chatContainer.addChild(new DynamicBorder());
4387
- this.chatContainer.addChild(new Text(theme.bold(theme.fg("accent", "What's New")), 1, 0));
4388
- this.chatContainer.addChild(new Spacer(1));
4389
- this.chatContainer.addChild(new Markdown(changelogMarkdown, 1, 1, this.getMarkdownThemeWithSettings()));
4390
- this.chatContainer.addChild(new DynamicBorder());
4391
- this.ui.requestRender();
4392
- }
4393
-
4394
- /**
4395
- * Capitalize keybinding for display (e.g., "ctrl+c" -> "Ctrl+C").
4396
- */
4397
- private capitalizeKey(key: string): string {
4398
- return key
4399
- .split("/")
4400
- .map((k) =>
4401
- k
4402
- .split("+")
4403
- .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
4404
- .join("+"),
4405
- )
4406
- .join("/");
4407
- }
4408
-
4409
- /**
4410
- * Get capitalized display string for an app keybinding action.
4411
- */
4412
- private getAppKeyDisplay(action: AppAction): string {
4413
- return this.capitalizeKey(appKey(this.keybindings, action));
4414
- }
4415
-
4416
- /**
4417
- * Get capitalized display string for an editor keybinding action.
4418
- */
4419
- private getEditorKeyDisplay(action: EditorAction): string {
4420
- return this.capitalizeKey(editorKey(action));
4421
- }
4422
-
4423
- private handleHotkeysCommand(): void {
4424
- // Navigation keybindings
4425
- const cursorWordLeft = this.getEditorKeyDisplay("cursorWordLeft");
4426
- const cursorWordRight = this.getEditorKeyDisplay("cursorWordRight");
4427
- const cursorLineStart = this.getEditorKeyDisplay("cursorLineStart");
4428
- const cursorLineEnd = this.getEditorKeyDisplay("cursorLineEnd");
4429
- const jumpForward = this.getEditorKeyDisplay("jumpForward");
4430
- const jumpBackward = this.getEditorKeyDisplay("jumpBackward");
4431
- const pageUp = this.getEditorKeyDisplay("pageUp");
4432
- const pageDown = this.getEditorKeyDisplay("pageDown");
4433
-
4434
- // Editing keybindings
4435
- const submit = this.getEditorKeyDisplay("submit");
4436
- const newLine = this.getEditorKeyDisplay("newLine");
4437
- const deleteWordBackward = this.getEditorKeyDisplay("deleteWordBackward");
4438
- const deleteWordForward = this.getEditorKeyDisplay("deleteWordForward");
4439
- const deleteToLineStart = this.getEditorKeyDisplay("deleteToLineStart");
4440
- const deleteToLineEnd = this.getEditorKeyDisplay("deleteToLineEnd");
4441
- const yank = this.getEditorKeyDisplay("yank");
4442
- const yankPop = this.getEditorKeyDisplay("yankPop");
4443
- const undo = this.getEditorKeyDisplay("undo");
4444
- const tab = this.getEditorKeyDisplay("tab");
4445
-
4446
- // App keybindings
4447
- const interrupt = this.getAppKeyDisplay("interrupt");
4448
- const clear = this.getAppKeyDisplay("clear");
4449
- const exit = this.getAppKeyDisplay("exit");
4450
- const suspend = this.getAppKeyDisplay("suspend");
4451
- const cycleThinkingLevel = this.getAppKeyDisplay("cycleThinkingLevel");
4452
- const cycleModelForward = this.getAppKeyDisplay("cycleModelForward");
4453
- const selectModel = this.getAppKeyDisplay("selectModel");
4454
- const expandTools = this.getAppKeyDisplay("expandTools");
4455
- const toggleThinking = this.getAppKeyDisplay("toggleThinking");
4456
- const externalEditor = this.getAppKeyDisplay("externalEditor");
4457
- const followUp = this.getAppKeyDisplay("followUp");
4458
- const dequeue = this.getAppKeyDisplay("dequeue");
4459
-
4460
- let hotkeys = `
4461
- **Navigation**
4462
- | Key | Action |
4463
- |-----|--------|
4464
- | \`Arrow keys\` | Move cursor / browse history (Up when empty) |
4465
- | \`${cursorWordLeft}\` / \`${cursorWordRight}\` | Move by word |
4466
- | \`${cursorLineStart}\` | Start of line |
4467
- | \`${cursorLineEnd}\` | End of line |
4468
- | \`${jumpForward}\` | Jump forward to character |
4469
- | \`${jumpBackward}\` | Jump backward to character |
4470
- | \`${pageUp}\` / \`${pageDown}\` | Scroll by page |
4471
-
4472
- **Editing**
4473
- | Key | Action |
4474
- |-----|--------|
4475
- | \`${submit}\` | Send message |
4476
- | \`${newLine}\` | New line${process.platform === "win32" ? " (Ctrl+Enter on Windows Terminal)" : ""} |
4477
- | \`${deleteWordBackward}\` | Delete word backwards |
4478
- | \`${deleteWordForward}\` | Delete word forwards |
4479
- | \`${deleteToLineStart}\` | Delete to start of line |
4480
- | \`${deleteToLineEnd}\` | Delete to end of line |
4481
- | \`${yank}\` | Paste the most-recently-deleted text |
4482
- | \`${yankPop}\` | Cycle through the deleted text after pasting |
4483
- | \`${undo}\` | Undo |
4484
-
4485
- **Other**
4486
- | Key | Action |
4487
- |-----|--------|
4488
- | \`${tab}\` | Path completion / accept autocomplete |
4489
- | \`${interrupt}\` | Cancel autocomplete / abort streaming |
4490
- | \`${clear}\` | Clear editor (first) / exit (second) |
4491
- | \`${exit}\` | Exit (when editor is empty) |
4492
- | \`${suspend}\` | Suspend to background |
4493
- | \`${cycleThinkingLevel}\` | Cycle thinking level |
4494
- | \`${cycleModelForward}\` | Cycle models |
4495
- | \`${selectModel}\` | Open model selector |
4496
- | \`${expandTools}\` | Toggle tool output expansion |
4497
- | \`${toggleThinking}\` | Toggle thinking block visibility |
4498
- | \`${externalEditor}\` | Edit message in external editor |
4499
- | \`${followUp}\` | Queue follow-up message |
4500
- | \`${dequeue}\` | Restore queued messages |
4501
- | \`Ctrl+V\` | Paste image from clipboard |
4502
- | \`/\` | Slash commands |
4503
- | \`!\` | Run bash command |
4504
- | \`!!\` | Run bash command (excluded from context) |
4505
- `;
4506
-
4507
- // Add extension-registered shortcuts
4508
- const extensionRunner = this.session.extensionRunner;
4509
- if (extensionRunner) {
4510
- const shortcuts = extensionRunner.getShortcuts(this.keybindings.getEffectiveConfig());
4511
- if (shortcuts.size > 0) {
4512
- hotkeys += `
4513
- **Extensions**
4514
- | Key | Action |
4515
- |-----|--------|
4516
- `;
4517
- for (const [key, shortcut] of shortcuts) {
4518
- const description = shortcut.description ?? shortcut.extensionPath;
4519
- const keyDisplay = formatKeyForDisplay(key).replace(/\b\w/g, (c) => c.toUpperCase());
4520
- hotkeys += `| \`${keyDisplay}\` | ${description} |\n`;
4521
- }
4522
- }
4523
- }
4524
-
4525
- this.chatContainer.addChild(new Spacer(1));
4526
- this.chatContainer.addChild(new DynamicBorder());
4527
- this.chatContainer.addChild(new Text(theme.bold(theme.fg("accent", "Keyboard Shortcuts")), 1, 0));
4528
- this.chatContainer.addChild(new Spacer(1));
4529
- this.chatContainer.addChild(new Markdown(hotkeys.trim(), 1, 1, this.getMarkdownThemeWithSettings()));
4530
- this.chatContainer.addChild(new DynamicBorder());
4531
- this.ui.requestRender();
4532
- }
4533
-
4534
4041
  private async handleClearCommand(): Promise<void> {
4535
4042
  // Stop loading animation
4536
4043
  if (this.loadingAnimation) {
@@ -4589,12 +4096,6 @@ export class InteractiveMode {
4589
4096
  this.ui.requestRender();
4590
4097
  }
4591
4098
 
4592
- private handleArminSaysHi(): void {
4593
- this.chatContainer.addChild(new Spacer(1));
4594
- this.chatContainer.addChild(new ArminComponent(this.ui));
4595
- this.ui.requestRender();
4596
- }
4597
-
4598
4099
  private handleDaxnuts(): void {
4599
4100
  this.chatContainer.addChild(new Spacer(1));
4600
4101
  this.chatContainer.addChild(new DaxnutsComponent(this.ui));
@@ -4696,18 +4197,6 @@ export class InteractiveMode {
4696
4197
  this.ui.requestRender();
4697
4198
  }
4698
4199
 
4699
- private async handleCompactCommand(customInstructions?: string): Promise<void> {
4700
- const entries = this.sessionManager.getEntries();
4701
- const messageCount = entries.filter((e) => e.type === "message").length;
4702
-
4703
- if (messageCount < 2) {
4704
- this.showWarning("Nothing to compact (no messages yet)");
4705
- return;
4706
- }
4707
-
4708
- await this.executeCompaction(customInstructions, false);
4709
- }
4710
-
4711
4200
  private async executeCompaction(customInstructions?: string, isAuto = false): Promise<CompactionResult | undefined> {
4712
4201
  // Stop loading animation
4713
4202
  if (this.loadingAnimation) {