gsd-pi 2.34.0 → 2.35.0-dev.cd3b7ea

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 (418) hide show
  1. package/dist/resources/extensions/gsd/changelog.js +162 -0
  2. package/dist/resources/extensions/gsd/commands-bootstrap.js +1 -0
  3. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +5 -1
  4. package/dist/resources/extensions/gsd/commands.js +8 -1
  5. package/dist/resources/extensions/gsd/docs/preferences-reference.md +10 -0
  6. package/dist/resources/extensions/gsd/doctor-checks.js +113 -5
  7. package/dist/resources/extensions/gsd/doctor-proactive.js +22 -0
  8. package/dist/resources/extensions/gsd/doctor.js +36 -0
  9. package/dist/resources/extensions/gsd/guided-flow.js +4 -2
  10. package/dist/resources/extensions/gsd/preferences-validation.js +38 -0
  11. package/dist/resources/extensions/gsd/preferences.js +2 -0
  12. package/dist/resources/extensions/mcp-client/index.js +2 -1
  13. package/dist/resources/skills/create-gsd-extension/references/events-reference.md +4 -4
  14. package/package.json +1 -1
  15. package/packages/native/dist/native.d.ts +0 -2
  16. package/packages/native/dist/native.js +0 -2
  17. package/packages/native/src/native.ts +0 -3
  18. package/packages/pi-agent-core/dist/agent-loop.d.ts +14 -0
  19. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  20. package/packages/pi-agent-core/dist/agent-loop.js +24 -27
  21. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  22. package/packages/pi-agent-core/dist/agent.d.ts +1 -0
  23. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  24. package/packages/pi-agent-core/dist/agent.js +11 -22
  25. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  26. package/packages/pi-agent-core/dist/proxy.d.ts +1 -25
  27. package/packages/pi-agent-core/dist/proxy.d.ts.map +1 -1
  28. package/packages/pi-agent-core/dist/proxy.js +3 -9
  29. package/packages/pi-agent-core/dist/proxy.js.map +1 -1
  30. package/packages/pi-agent-core/src/agent-loop.ts +30 -27
  31. package/packages/pi-agent-core/src/agent.ts +12 -23
  32. package/packages/pi-agent-core/src/proxy.ts +3 -9
  33. package/packages/pi-ai/dist/api-registry.d.ts +0 -2
  34. package/packages/pi-ai/dist/api-registry.d.ts.map +1 -1
  35. package/packages/pi-ai/dist/api-registry.js +0 -10
  36. package/packages/pi-ai/dist/api-registry.js.map +1 -1
  37. package/packages/pi-ai/dist/providers/anthropic.d.ts +0 -8
  38. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  39. package/packages/pi-ai/dist/providers/anthropic.js +1 -1
  40. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  41. package/packages/pi-ai/dist/providers/azure-openai-responses.d.ts.map +1 -1
  42. package/packages/pi-ai/dist/providers/azure-openai-responses.js +5 -41
  43. package/packages/pi-ai/dist/providers/azure-openai-responses.js.map +1 -1
  44. package/packages/pi-ai/dist/providers/github-copilot-headers.d.ts +0 -1
  45. package/packages/pi-ai/dist/providers/github-copilot-headers.d.ts.map +1 -1
  46. package/packages/pi-ai/dist/providers/github-copilot-headers.js +1 -1
  47. package/packages/pi-ai/dist/providers/github-copilot-headers.js.map +1 -1
  48. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts +1 -43
  49. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  50. package/packages/pi-ai/dist/providers/google-gemini-cli.js +2 -2
  51. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  52. package/packages/pi-ai/dist/providers/google-shared.d.ts +0 -4
  53. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  54. package/packages/pi-ai/dist/providers/google-shared.js +1 -1
  55. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  56. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  57. package/packages/pi-ai/dist/providers/openai-completions.js +10 -73
  58. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  59. package/packages/pi-ai/dist/providers/openai-responses.d.ts.map +1 -1
  60. package/packages/pi-ai/dist/providers/openai-responses.js +8 -79
  61. package/packages/pi-ai/dist/providers/openai-responses.js.map +1 -1
  62. package/packages/pi-ai/dist/providers/openai-shared.d.ts +65 -0
  63. package/packages/pi-ai/dist/providers/openai-shared.d.ts.map +1 -0
  64. package/packages/pi-ai/dist/providers/openai-shared.js +146 -0
  65. package/packages/pi-ai/dist/providers/openai-shared.js.map +1 -0
  66. package/packages/pi-ai/dist/providers/register-builtins.d.ts +0 -1
  67. package/packages/pi-ai/dist/providers/register-builtins.d.ts.map +1 -1
  68. package/packages/pi-ai/dist/providers/register-builtins.js +1 -1
  69. package/packages/pi-ai/dist/providers/register-builtins.js.map +1 -1
  70. package/packages/pi-ai/dist/utils/event-stream.d.ts +0 -2
  71. package/packages/pi-ai/dist/utils/event-stream.d.ts.map +1 -1
  72. package/packages/pi-ai/dist/utils/event-stream.js +0 -4
  73. package/packages/pi-ai/dist/utils/event-stream.js.map +1 -1
  74. package/packages/pi-ai/dist/utils/oauth/google-antigravity.d.ts.map +1 -1
  75. package/packages/pi-ai/dist/utils/oauth/google-antigravity.js +7 -135
  76. package/packages/pi-ai/dist/utils/oauth/google-antigravity.js.map +1 -1
  77. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.d.ts.map +1 -1
  78. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.js +7 -135
  79. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.js.map +1 -1
  80. package/packages/pi-ai/dist/utils/oauth/google-oauth-utils.d.ts +46 -0
  81. package/packages/pi-ai/dist/utils/oauth/google-oauth-utils.d.ts.map +1 -0
  82. package/packages/pi-ai/dist/utils/oauth/google-oauth-utils.js +160 -0
  83. package/packages/pi-ai/dist/utils/oauth/google-oauth-utils.js.map +1 -0
  84. package/packages/pi-ai/dist/utils/overflow.d.ts +0 -4
  85. package/packages/pi-ai/dist/utils/overflow.d.ts.map +1 -1
  86. package/packages/pi-ai/dist/utils/overflow.js +0 -6
  87. package/packages/pi-ai/dist/utils/overflow.js.map +1 -1
  88. package/packages/pi-ai/dist/utils/validation.d.ts +0 -8
  89. package/packages/pi-ai/dist/utils/validation.d.ts.map +1 -1
  90. package/packages/pi-ai/dist/utils/validation.js +0 -14
  91. package/packages/pi-ai/dist/utils/validation.js.map +1 -1
  92. package/packages/pi-ai/src/api-registry.ts +0 -12
  93. package/packages/pi-ai/src/providers/anthropic.ts +1 -1
  94. package/packages/pi-ai/src/providers/azure-openai-responses.ts +11 -45
  95. package/packages/pi-ai/src/providers/github-copilot-headers.ts +1 -1
  96. package/packages/pi-ai/src/providers/google-gemini-cli.ts +2 -2
  97. package/packages/pi-ai/src/providers/google-shared.ts +1 -1
  98. package/packages/pi-ai/src/providers/openai-completions.ts +16 -86
  99. package/packages/pi-ai/src/providers/openai-responses.ts +15 -95
  100. package/packages/pi-ai/src/providers/openai-shared.ts +193 -0
  101. package/packages/pi-ai/src/providers/register-builtins.ts +1 -1
  102. package/packages/pi-ai/src/utils/event-stream.ts +0 -5
  103. package/packages/pi-ai/src/utils/oauth/google-antigravity.ts +14 -162
  104. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.ts +13 -161
  105. package/packages/pi-ai/src/utils/oauth/google-oauth-utils.ts +201 -0
  106. package/packages/pi-ai/src/utils/overflow.ts +1 -8
  107. package/packages/pi-ai/src/utils/validation.ts +0 -15
  108. package/packages/pi-coding-agent/dist/config.d.ts +0 -9
  109. package/packages/pi-coding-agent/dist/config.d.ts.map +1 -1
  110. package/packages/pi-coding-agent/dist/config.js +4 -8
  111. package/packages/pi-coding-agent/dist/config.js.map +1 -1
  112. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +16 -63
  113. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  114. package/packages/pi-coding-agent/dist/core/agent-session.js +104 -641
  115. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  116. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +0 -1
  117. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  118. package/packages/pi-coding-agent/dist/core/auth-storage.js +4 -35
  119. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  120. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  121. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js +5 -43
  122. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js.map +1 -1
  123. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  124. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +11 -69
  125. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  126. package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts +40 -0
  127. package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts.map +1 -1
  128. package/packages/pi-coding-agent/dist/core/compaction/utils.js +78 -0
  129. package/packages/pi-coding-agent/dist/core/compaction/utils.js.map +1 -1
  130. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts +77 -0
  131. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts.map +1 -0
  132. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +331 -0
  133. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -0
  134. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.d.ts +0 -4
  135. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  136. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.js +1 -1
  137. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.js.map +1 -1
  138. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +2 -2
  139. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  140. package/packages/pi-coding-agent/dist/core/extensions/index.js +1 -1
  141. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  142. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +15 -5
  143. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  144. package/packages/pi-coding-agent/dist/core/extensions/runner.js +129 -256
  145. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  146. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +49 -42
  147. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  148. package/packages/pi-coding-agent/dist/core/extensions/types.js +2 -21
  149. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  150. package/packages/pi-coding-agent/dist/core/keybindings.d.ts +0 -8
  151. package/packages/pi-coding-agent/dist/core/keybindings.d.ts.map +1 -1
  152. package/packages/pi-coding-agent/dist/core/keybindings.js +2 -2
  153. package/packages/pi-coding-agent/dist/core/keybindings.js.map +1 -1
  154. package/packages/pi-coding-agent/dist/core/lock-utils.d.ts +39 -0
  155. package/packages/pi-coding-agent/dist/core/lock-utils.d.ts.map +1 -0
  156. package/packages/pi-coding-agent/dist/core/lock-utils.js +89 -0
  157. package/packages/pi-coding-agent/dist/core/lock-utils.js.map +1 -0
  158. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts +0 -17
  159. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
  160. package/packages/pi-coding-agent/dist/core/lsp/client.js +3 -62
  161. package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
  162. package/packages/pi-coding-agent/dist/core/lsp/config.d.ts +1 -1
  163. package/packages/pi-coding-agent/dist/core/lsp/config.d.ts.map +1 -1
  164. package/packages/pi-coding-agent/dist/core/lsp/config.js +2 -6
  165. package/packages/pi-coding-agent/dist/core/lsp/config.js.map +1 -1
  166. package/packages/pi-coding-agent/dist/core/lsp/edits.d.ts +0 -5
  167. package/packages/pi-coding-agent/dist/core/lsp/edits.d.ts.map +1 -1
  168. package/packages/pi-coding-agent/dist/core/lsp/edits.js +1 -1
  169. package/packages/pi-coding-agent/dist/core/lsp/edits.js.map +1 -1
  170. package/packages/pi-coding-agent/dist/core/lsp/index.d.ts.map +1 -1
  171. package/packages/pi-coding-agent/dist/core/lsp/index.js +52 -107
  172. package/packages/pi-coding-agent/dist/core/lsp/index.js.map +1 -1
  173. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts +0 -1
  174. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -1
  175. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +3 -22
  176. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -1
  177. package/packages/pi-coding-agent/dist/core/lsp/types.d.ts +0 -1
  178. package/packages/pi-coding-agent/dist/core/lsp/types.d.ts.map +1 -1
  179. package/packages/pi-coding-agent/dist/core/lsp/types.js +0 -28
  180. package/packages/pi-coding-agent/dist/core/lsp/types.js.map +1 -1
  181. package/packages/pi-coding-agent/dist/core/lsp/utils.d.ts +1 -6
  182. package/packages/pi-coding-agent/dist/core/lsp/utils.d.ts.map +1 -1
  183. package/packages/pi-coding-agent/dist/core/lsp/utils.js +1 -28
  184. package/packages/pi-coding-agent/dist/core/lsp/utils.js.map +1 -1
  185. package/packages/pi-coding-agent/dist/core/messages.d.ts +0 -8
  186. package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
  187. package/packages/pi-coding-agent/dist/core/messages.js +5 -5
  188. package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
  189. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +0 -3
  190. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  191. package/packages/pi-coding-agent/dist/core/model-registry.js +1 -3
  192. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  193. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts +1 -26
  194. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  195. package/packages/pi-coding-agent/dist/core/model-resolver.js +3 -59
  196. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  197. package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
  198. package/packages/pi-coding-agent/dist/core/package-manager.js +2 -4
  199. package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
  200. package/packages/pi-coding-agent/dist/core/prompt-templates.d.ts +0 -17
  201. package/packages/pi-coding-agent/dist/core/prompt-templates.d.ts.map +1 -1
  202. package/packages/pi-coding-agent/dist/core/prompt-templates.js +2 -2
  203. package/packages/pi-coding-agent/dist/core/prompt-templates.js.map +1 -1
  204. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +2 -4
  205. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
  206. package/packages/pi-coding-agent/dist/core/resource-loader.js +33 -58
  207. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  208. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +87 -0
  209. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -0
  210. package/packages/pi-coding-agent/dist/core/retry-handler.js +295 -0
  211. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -0
  212. package/packages/pi-coding-agent/dist/core/session-manager.d.ts +0 -5
  213. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  214. package/packages/pi-coding-agent/dist/core/session-manager.js +5 -32
  215. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  216. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +8 -12
  217. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  218. package/packages/pi-coding-agent/dist/core/settings-manager.js +78 -168
  219. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  220. package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
  221. package/packages/pi-coding-agent/dist/core/skills.js +1 -3
  222. package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
  223. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  224. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  225. package/packages/pi-coding-agent/dist/index.js +1 -1
  226. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  227. package/packages/pi-coding-agent/dist/migrations.d.ts +0 -16
  228. package/packages/pi-coding-agent/dist/migrations.d.ts.map +1 -1
  229. package/packages/pi-coding-agent/dist/migrations.js +2 -2
  230. package/packages/pi-coding-agent/dist/migrations.js.map +1 -1
  231. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.d.ts +0 -2
  232. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  233. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.js +2 -2
  234. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  235. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.d.ts +1 -1
  236. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  237. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.js +9 -26
  238. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.js.map +1 -1
  239. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  240. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -13
  241. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  242. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-render-utils.d.ts +44 -0
  243. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-render-utils.d.ts.map +1 -0
  244. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-render-utils.js +61 -0
  245. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-render-utils.js.map +1 -0
  246. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  247. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-selector.js +6 -9
  248. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-selector.js.map +1 -1
  249. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +1 -24
  250. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  251. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +50 -512
  252. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  253. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts +71 -0
  254. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -0
  255. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +514 -0
  256. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -0
  257. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +65 -4
  258. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  259. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +6 -23
  260. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  261. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts +12 -0
  262. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -0
  263. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +175 -0
  264. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -0
  265. package/packages/pi-coding-agent/dist/modes/interactive/utils/shorten-path.d.ts +6 -0
  266. package/packages/pi-coding-agent/dist/modes/interactive/utils/shorten-path.d.ts.map +1 -0
  267. package/packages/pi-coding-agent/dist/modes/interactive/utils/shorten-path.js +15 -0
  268. package/packages/pi-coding-agent/dist/modes/interactive/utils/shorten-path.js.map +1 -0
  269. package/packages/pi-coding-agent/dist/modes/print-mode.d.ts.map +1 -1
  270. package/packages/pi-coding-agent/dist/modes/print-mode.js +2 -30
  271. package/packages/pi-coding-agent/dist/modes/print-mode.js.map +1 -1
  272. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  273. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +2 -28
  274. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  275. package/packages/pi-coding-agent/dist/modes/shared/command-context-actions.d.ts +19 -0
  276. package/packages/pi-coding-agent/dist/modes/shared/command-context-actions.d.ts.map +1 -0
  277. package/packages/pi-coding-agent/dist/modes/shared/command-context-actions.js +45 -0
  278. package/packages/pi-coding-agent/dist/modes/shared/command-context-actions.js.map +1 -0
  279. package/packages/pi-coding-agent/dist/utils/changelog.d.ts +0 -4
  280. package/packages/pi-coding-agent/dist/utils/changelog.d.ts.map +1 -1
  281. package/packages/pi-coding-agent/dist/utils/changelog.js +1 -1
  282. package/packages/pi-coding-agent/dist/utils/changelog.js.map +1 -1
  283. package/packages/pi-coding-agent/dist/utils/clipboard-image.d.ts +0 -1
  284. package/packages/pi-coding-agent/dist/utils/clipboard-image.d.ts.map +1 -1
  285. package/packages/pi-coding-agent/dist/utils/clipboard-image.js +1 -1
  286. package/packages/pi-coding-agent/dist/utils/clipboard-image.js.map +1 -1
  287. package/packages/pi-coding-agent/dist/utils/error.d.ts +5 -0
  288. package/packages/pi-coding-agent/dist/utils/error.d.ts.map +1 -0
  289. package/packages/pi-coding-agent/dist/utils/error.js +7 -0
  290. package/packages/pi-coding-agent/dist/utils/error.js.map +1 -0
  291. package/packages/pi-coding-agent/dist/utils/photon.d.ts +0 -19
  292. package/packages/pi-coding-agent/dist/utils/photon.d.ts.map +1 -1
  293. package/packages/pi-coding-agent/dist/utils/photon.js +1 -120
  294. package/packages/pi-coding-agent/dist/utils/photon.js.map +1 -1
  295. package/packages/pi-coding-agent/dist/utils/tools-manager.d.ts +0 -1
  296. package/packages/pi-coding-agent/dist/utils/tools-manager.d.ts.map +1 -1
  297. package/packages/pi-coding-agent/dist/utils/tools-manager.js +1 -1
  298. package/packages/pi-coding-agent/dist/utils/tools-manager.js.map +1 -1
  299. package/packages/pi-coding-agent/package.json +1 -1
  300. package/packages/pi-coding-agent/src/config.ts +5 -10
  301. package/packages/pi-coding-agent/src/core/agent-session.ts +117 -745
  302. package/packages/pi-coding-agent/src/core/auth-storage.ts +4 -38
  303. package/packages/pi-coding-agent/src/core/compaction/branch-summarization.ts +7 -53
  304. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +14 -74
  305. package/packages/pi-coding-agent/src/core/compaction/utils.ts +100 -0
  306. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +424 -0
  307. package/packages/pi-coding-agent/src/core/export-html/ansi-to-html.ts +1 -1
  308. package/packages/pi-coding-agent/src/core/extensions/index.ts +1 -21
  309. package/packages/pi-coding-agent/src/core/extensions/runner.ts +119 -256
  310. package/packages/pi-coding-agent/src/core/extensions/types.ts +50 -69
  311. package/packages/pi-coding-agent/src/core/keybindings.ts +2 -2
  312. package/packages/pi-coding-agent/src/core/lock-utils.ts +113 -0
  313. package/packages/pi-coding-agent/src/core/lsp/client.ts +3 -73
  314. package/packages/pi-coding-agent/src/core/lsp/config.ts +2 -10
  315. package/packages/pi-coding-agent/src/core/lsp/edits.ts +1 -1
  316. package/packages/pi-coding-agent/src/core/lsp/index.ts +83 -152
  317. package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +3 -23
  318. package/packages/pi-coding-agent/src/core/lsp/types.ts +0 -29
  319. package/packages/pi-coding-agent/src/core/lsp/utils.ts +1 -33
  320. package/packages/pi-coding-agent/src/core/messages.ts +5 -5
  321. package/packages/pi-coding-agent/src/core/model-registry.ts +0 -2
  322. package/packages/pi-coding-agent/src/core/model-resolver.ts +3 -77
  323. package/packages/pi-coding-agent/src/core/package-manager.ts +1 -4
  324. package/packages/pi-coding-agent/src/core/prompt-templates.ts +2 -2
  325. package/packages/pi-coding-agent/src/core/resource-loader.ts +43 -67
  326. package/packages/pi-coding-agent/src/core/retry-handler.ts +359 -0
  327. package/packages/pi-coding-agent/src/core/session-manager.ts +5 -34
  328. package/packages/pi-coding-agent/src/core/settings-manager.ts +87 -166
  329. package/packages/pi-coding-agent/src/core/skills.ts +1 -4
  330. package/packages/pi-coding-agent/src/index.ts +1 -7
  331. package/packages/pi-coding-agent/src/migrations.ts +2 -2
  332. package/packages/pi-coding-agent/src/modes/interactive/components/session-selector-search.ts +2 -2
  333. package/packages/pi-coding-agent/src/modes/interactive/components/session-selector.ts +17 -29
  334. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -13
  335. package/packages/pi-coding-agent/src/modes/interactive/components/tree-render-utils.ts +81 -0
  336. package/packages/pi-coding-agent/src/modes/interactive/components/tree-selector.ts +14 -19
  337. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +50 -561
  338. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +653 -0
  339. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +7 -26
  340. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +196 -0
  341. package/packages/pi-coding-agent/src/modes/interactive/utils/shorten-path.ts +14 -0
  342. package/packages/pi-coding-agent/src/modes/print-mode.ts +2 -30
  343. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +2 -28
  344. package/packages/pi-coding-agent/src/modes/shared/command-context-actions.ts +53 -0
  345. package/packages/pi-coding-agent/src/utils/changelog.ts +1 -1
  346. package/packages/pi-coding-agent/src/utils/clipboard-image.ts +1 -1
  347. package/packages/pi-coding-agent/src/utils/error.ts +6 -0
  348. package/packages/pi-coding-agent/src/utils/photon.ts +0 -137
  349. package/packages/pi-coding-agent/src/utils/tools-manager.ts +1 -1
  350. package/packages/pi-tui/dist/components/editor.d.ts +0 -10
  351. package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
  352. package/packages/pi-tui/dist/components/editor.js +1 -1
  353. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  354. package/packages/pi-tui/dist/components/markdown.d.ts +5 -0
  355. package/packages/pi-tui/dist/components/markdown.d.ts.map +1 -1
  356. package/packages/pi-tui/dist/components/markdown.js +25 -31
  357. package/packages/pi-tui/dist/components/markdown.js.map +1 -1
  358. package/packages/pi-tui/dist/keys.d.ts +0 -4
  359. package/packages/pi-tui/dist/keys.d.ts.map +1 -1
  360. package/packages/pi-tui/dist/keys.js +94 -162
  361. package/packages/pi-tui/dist/keys.js.map +1 -1
  362. package/packages/pi-tui/dist/overlay-layout.d.ts +55 -0
  363. package/packages/pi-tui/dist/overlay-layout.d.ts.map +1 -0
  364. package/packages/pi-tui/dist/overlay-layout.js +288 -0
  365. package/packages/pi-tui/dist/overlay-layout.js.map +1 -0
  366. package/packages/pi-tui/dist/tui.d.ts +0 -22
  367. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  368. package/packages/pi-tui/dist/tui.js +6 -272
  369. package/packages/pi-tui/dist/tui.js.map +1 -1
  370. package/packages/pi-tui/dist/utils.d.ts +0 -7
  371. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  372. package/packages/pi-tui/dist/utils.js +0 -44
  373. package/packages/pi-tui/dist/utils.js.map +1 -1
  374. package/packages/pi-tui/src/components/editor.ts +1 -1
  375. package/packages/pi-tui/src/components/markdown.ts +25 -29
  376. package/packages/pi-tui/src/keys.ts +94 -173
  377. package/packages/pi-tui/src/overlay-layout.ts +372 -0
  378. package/packages/pi-tui/src/tui.ts +11 -312
  379. package/packages/pi-tui/src/utils.ts +0 -43
  380. package/pkg/dist/core/export-html/ansi-to-html.d.ts +0 -4
  381. package/pkg/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  382. package/pkg/dist/core/export-html/ansi-to-html.js +1 -1
  383. package/pkg/dist/core/export-html/ansi-to-html.js.map +1 -1
  384. package/pkg/dist/modes/interactive/theme/theme.d.ts +65 -4
  385. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  386. package/pkg/dist/modes/interactive/theme/theme.js +6 -23
  387. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  388. package/pkg/dist/modes/interactive/theme/themes.d.ts +12 -0
  389. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -0
  390. package/pkg/dist/modes/interactive/theme/themes.js +175 -0
  391. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -0
  392. package/pkg/package.json +1 -1
  393. package/src/resources/extensions/gsd/changelog.ts +213 -0
  394. package/src/resources/extensions/gsd/commands-bootstrap.ts +1 -0
  395. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +5 -1
  396. package/src/resources/extensions/gsd/commands.ts +9 -1
  397. package/src/resources/extensions/gsd/docs/preferences-reference.md +10 -0
  398. package/src/resources/extensions/gsd/doctor-checks.ts +107 -5
  399. package/src/resources/extensions/gsd/doctor-proactive.ts +24 -0
  400. package/src/resources/extensions/gsd/doctor-types.ts +9 -1
  401. package/src/resources/extensions/gsd/doctor.ts +35 -0
  402. package/src/resources/extensions/gsd/guided-flow.ts +4 -2
  403. package/src/resources/extensions/gsd/preferences-validation.ts +38 -0
  404. package/src/resources/extensions/gsd/preferences.ts +2 -0
  405. package/src/resources/extensions/gsd/tests/doctor-git.test.ts +98 -2
  406. package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +59 -3
  407. package/src/resources/extensions/gsd/tests/preferences.test.ts +28 -0
  408. package/src/resources/extensions/mcp-client/index.ts +2 -1
  409. package/src/resources/skills/create-gsd-extension/references/events-reference.md +4 -4
  410. package/packages/pi-coding-agent/dist/modes/interactive/theme/dark.json +0 -85
  411. package/packages/pi-coding-agent/dist/modes/interactive/theme/light.json +0 -84
  412. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.json +0 -335
  413. package/packages/pi-coding-agent/src/modes/interactive/theme/dark.json +0 -85
  414. package/packages/pi-coding-agent/src/modes/interactive/theme/light.json +0 -84
  415. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.json +0 -335
  416. package/pkg/dist/modes/interactive/theme/dark.json +0 -85
  417. package/pkg/dist/modes/interactive/theme/light.json +0 -84
  418. package/pkg/dist/modes/interactive/theme/theme-schema.json +0 -335
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Slash command dispatch and handler implementations extracted from InteractiveMode.
3
+ *
4
+ * The `dispatchSlashCommand` function contains the dispatch logic (routing text
5
+ * to handlers), and individual handler functions implement each command.
6
+ *
7
+ * Handlers that are also invoked from keybindings or other subsystems remain on
8
+ * InteractiveMode and are called through the `SlashCommandContext` interface.
9
+ */
10
+ import type { EditorComponent, MarkdownTheme } from "@gsd/pi-tui";
11
+ import { type Component, Container } from "@gsd/pi-tui";
12
+ import type { AgentSession } from "../../core/agent-session.js";
13
+ import type { AppAction, KeybindingsManager } from "../../core/keybindings.js";
14
+ import type { SessionManager } from "../../core/session-manager.js";
15
+ import type { SettingsManager } from "../../core/settings-manager.js";
16
+ import type { TUI } from "@gsd/pi-tui";
17
+ /**
18
+ * Provides slash command handlers with access to the parts of InteractiveMode
19
+ * they need without coupling them to the entire class.
20
+ */
21
+ export interface SlashCommandContext {
22
+ readonly session: AgentSession;
23
+ readonly ui: TUI;
24
+ readonly keybindings: KeybindingsManager;
25
+ readonly chatContainer: Container;
26
+ readonly statusContainer: Container;
27
+ readonly editorContainer: Container;
28
+ readonly headerContainer: Container;
29
+ readonly pendingMessagesContainer: Container;
30
+ readonly editor: EditorComponent;
31
+ readonly defaultEditor: EditorComponent & {
32
+ onEscape?: () => void;
33
+ };
34
+ readonly sessionManager: SessionManager;
35
+ readonly settingsManager: SettingsManager;
36
+ invalidateFooter(): void;
37
+ showStatus(message: string): void;
38
+ showError(message: string): void;
39
+ showWarning(message: string): void;
40
+ showSelector(create: (done: () => void) => {
41
+ component: Component;
42
+ focus: Component;
43
+ }): void;
44
+ updateEditorBorderColor(): void;
45
+ getMarkdownThemeWithSettings(): MarkdownTheme;
46
+ requestRender(): void;
47
+ updateTerminalTitle(): void;
48
+ showSettingsSelector(): void;
49
+ showModelsSelector(): Promise<void>;
50
+ handleModelCommand(searchTerm?: string): Promise<void>;
51
+ showUserMessageSelector(): void;
52
+ showTreeSelector(): void;
53
+ showProviderManager(): void;
54
+ showOAuthSelector(mode: "login" | "logout"): Promise<void>;
55
+ showSessionSelector(): void;
56
+ handleClearCommand(): Promise<void>;
57
+ handleReloadCommand(): Promise<void>;
58
+ handleDebugCommand(): void;
59
+ shutdown(): Promise<void>;
60
+ executeCompaction(customInstructions?: string, isAuto?: boolean): Promise<unknown>;
61
+ }
62
+ /**
63
+ * Routes a slash command string to the appropriate handler.
64
+ *
65
+ * @returns `true` if the text was handled as a slash command (caller should
66
+ * not process it further), `false` otherwise.
67
+ */
68
+ export declare function dispatchSlashCommand(text: string, ctx: SlashCommandContext): Promise<boolean>;
69
+ export declare function capitalizeKey(key: string): string;
70
+ export declare function getAppKeyDisplay(keybindings: KeybindingsManager, action: AppAction): string;
71
+ //# sourceMappingURL=slash-command-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slash-command-handlers.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/slash-command-handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,KAAK,EAEX,eAAe,EACf,aAAa,EACb,MAAM,aAAa,CAAC;AACrB,OAAO,EACN,KAAK,SAAS,EACd,SAAS,EAIT,MAAM,aAAa,CAAC;AAKrB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAUtE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAMvC;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAEnC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC;IACjB,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;IAGzC,QAAQ,CAAC,aAAa,EAAE,SAAS,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,SAAS,CAAC;IACpC,QAAQ,CAAC,eAAe,EAAE,SAAS,CAAC;IACpC,QAAQ,CAAC,eAAe,EAAE,SAAS,CAAC;IACpC,QAAQ,CAAC,wBAAwB,EAAE,SAAS,CAAC;IAG7C,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,eAAe,GAAG;QACzC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;KACtB,CAAC;IAGF,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAG1C,gBAAgB,IAAI,IAAI,CAAC;IAGzB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,YAAY,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,IAAI,KAAK;QAAE,SAAS,EAAE,SAAS,CAAC;QAAC,KAAK,EAAE,SAAS,CAAA;KAAE,GAAG,IAAI,CAAC;IAC7F,uBAAuB,IAAI,IAAI,CAAC;IAChC,4BAA4B,IAAI,aAAa,CAAC;IAC9C,aAAa,IAAI,IAAI,CAAC;IAEtB,mBAAmB,IAAI,IAAI,CAAC;IAG5B,oBAAoB,IAAI,IAAI,CAAC;IAC7B,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,uBAAuB,IAAI,IAAI,CAAC;IAChC,gBAAgB,IAAI,IAAI,CAAC;IACzB,mBAAmB,IAAI,IAAI,CAAC;IAC5B,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,mBAAmB,IAAI,IAAI,CAAC;IAC5B,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,kBAAkB,IAAI,IAAI,CAAC;IAC3B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAG1B,iBAAiB,CAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACnF;AAMD;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACzC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,mBAAmB,GACtB,OAAO,CAAC,OAAO,CAAC,CAuGlB;AAkND,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAUjD;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,kBAAkB,EAAE,MAAM,EAAE,SAAS,GAAG,MAAM,CAE3F"}
@@ -0,0 +1,514 @@
1
+ /**
2
+ * Slash command dispatch and handler implementations extracted from InteractiveMode.
3
+ *
4
+ * The `dispatchSlashCommand` function contains the dispatch logic (routing text
5
+ * to handlers), and individual handler functions implement each command.
6
+ *
7
+ * Handlers that are also invoked from keybindings or other subsystems remain on
8
+ * InteractiveMode and are called through the `SlashCommandContext` interface.
9
+ */
10
+ import * as fs from "node:fs";
11
+ import * as os from "node:os";
12
+ import * as path from "node:path";
13
+ import { Markdown, Spacer, Text, } from "@gsd/pi-tui";
14
+ import { spawn, spawnSync } from "child_process";
15
+ import { getShareViewerUrl, } from "../../config.js";
16
+ import { copyToClipboard } from "../../utils/clipboard.js";
17
+ import { getChangelogPath, parseChangelog } from "../../utils/changelog.js";
18
+ import { ArminComponent } from "./components/armin.js";
19
+ import { BorderedLoader } from "./components/bordered-loader.js";
20
+ import { DynamicBorder } from "./components/dynamic-border.js";
21
+ import { appKey, editorKey, formatKeyForDisplay } from "./components/keybinding-hints.js";
22
+ import { SelectSubmenu, THINKING_DESCRIPTIONS } from "./components/settings-selector.js";
23
+ import { theme } from "./theme/theme.js";
24
+ // ---------------------------------------------------------------------------
25
+ // Dispatch
26
+ // ---------------------------------------------------------------------------
27
+ /**
28
+ * Routes a slash command string to the appropriate handler.
29
+ *
30
+ * @returns `true` if the text was handled as a slash command (caller should
31
+ * not process it further), `false` otherwise.
32
+ */
33
+ export async function dispatchSlashCommand(text, ctx) {
34
+ if (text === "/settings") {
35
+ ctx.showSettingsSelector();
36
+ return true;
37
+ }
38
+ if (text === "/scoped-models") {
39
+ await ctx.showModelsSelector();
40
+ return true;
41
+ }
42
+ if (text === "/model" || text.startsWith("/model ")) {
43
+ const searchTerm = text.startsWith("/model ") ? text.slice(7).trim() : undefined;
44
+ await ctx.handleModelCommand(searchTerm);
45
+ return true;
46
+ }
47
+ if (text.startsWith("/export")) {
48
+ await handleExportCommand(text, ctx);
49
+ return true;
50
+ }
51
+ if (text === "/share") {
52
+ await handleShareCommand(ctx);
53
+ return true;
54
+ }
55
+ if (text === "/copy") {
56
+ handleCopyCommand(ctx);
57
+ return true;
58
+ }
59
+ if (text === "/name" || text.startsWith("/name ")) {
60
+ handleNameCommand(text, ctx);
61
+ return true;
62
+ }
63
+ if (text === "/session") {
64
+ handleSessionCommand(ctx);
65
+ return true;
66
+ }
67
+ if (text === "/changelog") {
68
+ handleChangelogCommand(ctx);
69
+ return true;
70
+ }
71
+ if (text === "/hotkeys") {
72
+ handleHotkeysCommand(ctx);
73
+ return true;
74
+ }
75
+ if (text === "/fork") {
76
+ ctx.showUserMessageSelector();
77
+ return true;
78
+ }
79
+ if (text === "/tree") {
80
+ ctx.showTreeSelector();
81
+ return true;
82
+ }
83
+ if (text === "/provider") {
84
+ ctx.showProviderManager();
85
+ return true;
86
+ }
87
+ if (text === "/login") {
88
+ await ctx.showOAuthSelector("login");
89
+ return true;
90
+ }
91
+ if (text === "/logout") {
92
+ await ctx.showOAuthSelector("logout");
93
+ return true;
94
+ }
95
+ if (text === "/new") {
96
+ await ctx.handleClearCommand();
97
+ return true;
98
+ }
99
+ if (text === "/compact" || text.startsWith("/compact ")) {
100
+ const customInstructions = text.startsWith("/compact ") ? text.slice(9).trim() : undefined;
101
+ await handleCompactCommand(customInstructions, ctx);
102
+ return true;
103
+ }
104
+ if (text === "/reload") {
105
+ await ctx.handleReloadCommand();
106
+ return true;
107
+ }
108
+ if (text === "/thinking" || text.startsWith("/thinking ")) {
109
+ const arg = text.startsWith("/thinking ") ? text.slice(10).trim() : undefined;
110
+ handleThinkingCommand(arg, ctx);
111
+ return true;
112
+ }
113
+ if (text === "/edit-mode" || text.startsWith("/edit-mode ")) {
114
+ const arg = text.startsWith("/edit-mode ") ? text.slice(11).trim() : undefined;
115
+ handleEditModeCommand(arg, ctx);
116
+ return true;
117
+ }
118
+ if (text === "/debug") {
119
+ ctx.handleDebugCommand();
120
+ return true;
121
+ }
122
+ if (text === "/arminsayshi") {
123
+ handleArminSaysHi(ctx);
124
+ return true;
125
+ }
126
+ if (text === "/resume") {
127
+ ctx.showSessionSelector();
128
+ return true;
129
+ }
130
+ if (text === "/quit") {
131
+ await ctx.shutdown();
132
+ return true;
133
+ }
134
+ return false;
135
+ }
136
+ // ---------------------------------------------------------------------------
137
+ // Individual command handlers
138
+ // ---------------------------------------------------------------------------
139
+ async function handleExportCommand(text, ctx) {
140
+ const parts = text.split(/\s+/);
141
+ const outputPath = parts.length > 1 ? parts[1] : undefined;
142
+ try {
143
+ const filePath = await ctx.session.exportToHtml(outputPath);
144
+ ctx.showStatus(`Session exported to: ${filePath}`);
145
+ }
146
+ catch (error) {
147
+ ctx.showError(`Failed to export session: ${error instanceof Error ? error.message : "Unknown error"}`);
148
+ }
149
+ }
150
+ async function handleShareCommand(ctx) {
151
+ // Check if gh is available and logged in
152
+ try {
153
+ const authResult = spawnSync("gh", ["auth", "status"], { encoding: "utf-8" });
154
+ if (authResult.status !== 0) {
155
+ ctx.showError("GitHub CLI is not logged in. Run 'gh auth login' first.");
156
+ return;
157
+ }
158
+ }
159
+ catch {
160
+ ctx.showError("GitHub CLI (gh) is not installed. Install it from https://cli.github.com/");
161
+ return;
162
+ }
163
+ // Export to a temp file
164
+ const tmpFile = path.join(os.tmpdir(), "session.html");
165
+ try {
166
+ await ctx.session.exportToHtml(tmpFile);
167
+ }
168
+ catch (error) {
169
+ ctx.showError(`Failed to export session: ${error instanceof Error ? error.message : "Unknown error"}`);
170
+ return;
171
+ }
172
+ // Show cancellable loader, replacing the editor
173
+ const loader = new BorderedLoader(ctx.ui, theme, "Creating gist...");
174
+ ctx.editorContainer.clear();
175
+ ctx.editorContainer.addChild(loader);
176
+ ctx.ui.setFocus(loader);
177
+ ctx.requestRender();
178
+ const restoreEditor = () => {
179
+ loader.dispose();
180
+ ctx.editorContainer.clear();
181
+ ctx.editorContainer.addChild(ctx.editor);
182
+ ctx.ui.setFocus(ctx.editor);
183
+ try {
184
+ fs.unlinkSync(tmpFile);
185
+ }
186
+ catch {
187
+ // Ignore cleanup errors
188
+ }
189
+ };
190
+ // Create a secret gist asynchronously
191
+ let proc = null;
192
+ loader.onAbort = () => {
193
+ proc?.kill();
194
+ restoreEditor();
195
+ ctx.showStatus("Share cancelled");
196
+ };
197
+ try {
198
+ const result = await new Promise((resolve) => {
199
+ proc = spawn("gh", ["gist", "create", "--public=false", tmpFile]);
200
+ let stdout = "";
201
+ let stderr = "";
202
+ proc.stdout?.on("data", (data) => {
203
+ stdout += data.toString();
204
+ });
205
+ proc.stderr?.on("data", (data) => {
206
+ stderr += data.toString();
207
+ });
208
+ proc.on("close", (code) => resolve({ stdout, stderr, code }));
209
+ });
210
+ if (loader.signal.aborted)
211
+ return;
212
+ restoreEditor();
213
+ if (result.code !== 0) {
214
+ const errorMsg = result.stderr?.trim() || "Unknown error";
215
+ ctx.showError(`Failed to create gist: ${errorMsg}`);
216
+ return;
217
+ }
218
+ // Extract gist ID from the URL returned by gh
219
+ // gh returns something like: https://gist.github.com/username/GIST_ID
220
+ const gistUrl = result.stdout?.trim();
221
+ const gistId = gistUrl?.split("/").pop();
222
+ if (!gistId) {
223
+ ctx.showError("Failed to parse gist ID from gh output");
224
+ return;
225
+ }
226
+ // Create the preview URL
227
+ const previewUrl = getShareViewerUrl(gistId);
228
+ ctx.showStatus(`Share URL: ${previewUrl}\nGist: ${gistUrl}`);
229
+ }
230
+ catch (error) {
231
+ if (!loader.signal.aborted) {
232
+ restoreEditor();
233
+ ctx.showError(`Failed to create gist: ${error instanceof Error ? error.message : "Unknown error"}`);
234
+ }
235
+ }
236
+ }
237
+ function handleCopyCommand(ctx) {
238
+ const text = ctx.session.getLastAssistantText();
239
+ if (!text) {
240
+ ctx.showError("No agent messages to copy yet.");
241
+ return;
242
+ }
243
+ try {
244
+ copyToClipboard(text);
245
+ ctx.showStatus("Copied last agent message to clipboard");
246
+ }
247
+ catch (error) {
248
+ ctx.showError(error instanceof Error ? error.message : String(error));
249
+ }
250
+ }
251
+ function handleNameCommand(text, ctx) {
252
+ const name = text.replace(/^\/name\s*/, "").trim();
253
+ if (!name) {
254
+ const currentName = ctx.sessionManager.getSessionName();
255
+ if (currentName) {
256
+ ctx.chatContainer.addChild(new Spacer(1));
257
+ ctx.chatContainer.addChild(new Text(theme.fg("dim", `Session name: ${currentName}`), 1, 0));
258
+ }
259
+ else {
260
+ ctx.showWarning("Usage: /name <name>");
261
+ }
262
+ ctx.requestRender();
263
+ return;
264
+ }
265
+ ctx.sessionManager.appendSessionInfo(name);
266
+ ctx.updateTerminalTitle();
267
+ ctx.chatContainer.addChild(new Spacer(1));
268
+ ctx.chatContainer.addChild(new Text(theme.fg("dim", `Session name set: ${name}`), 1, 0));
269
+ ctx.requestRender();
270
+ }
271
+ function handleSessionCommand(ctx) {
272
+ const stats = ctx.session.getSessionStats();
273
+ const sessionName = ctx.sessionManager.getSessionName();
274
+ let info = `${theme.bold("Session Info")}\n\n`;
275
+ if (sessionName) {
276
+ info += `${theme.fg("dim", "Name:")} ${sessionName}\n`;
277
+ }
278
+ info += `${theme.fg("dim", "File:")} ${stats.sessionFile ?? "In-memory"}\n`;
279
+ info += `${theme.fg("dim", "ID:")} ${stats.sessionId}\n\n`;
280
+ info += `${theme.bold("Messages")}\n`;
281
+ info += `${theme.fg("dim", "User:")} ${stats.userMessages}\n`;
282
+ info += `${theme.fg("dim", "Assistant:")} ${stats.assistantMessages}\n`;
283
+ info += `${theme.fg("dim", "Tool Calls:")} ${stats.toolCalls}\n`;
284
+ info += `${theme.fg("dim", "Tool Results:")} ${stats.toolResults}\n`;
285
+ info += `${theme.fg("dim", "Total:")} ${stats.totalMessages}\n\n`;
286
+ info += `${theme.bold("Tokens")}\n`;
287
+ info += `${theme.fg("dim", "Input:")} ${stats.tokens.input.toLocaleString()}\n`;
288
+ info += `${theme.fg("dim", "Output:")} ${stats.tokens.output.toLocaleString()}\n`;
289
+ if (stats.tokens.cacheRead > 0) {
290
+ info += `${theme.fg("dim", "Cache Read:")} ${stats.tokens.cacheRead.toLocaleString()}\n`;
291
+ }
292
+ if (stats.tokens.cacheWrite > 0) {
293
+ info += `${theme.fg("dim", "Cache Write:")} ${stats.tokens.cacheWrite.toLocaleString()}\n`;
294
+ }
295
+ info += `${theme.fg("dim", "Total:")} ${stats.tokens.total.toLocaleString()}\n`;
296
+ if (stats.cost > 0) {
297
+ info += `\n${theme.bold("Cost")}\n`;
298
+ info += `${theme.fg("dim", "Total:")} ${stats.cost.toFixed(4)}`;
299
+ }
300
+ ctx.chatContainer.addChild(new Spacer(1));
301
+ ctx.chatContainer.addChild(new Text(info, 1, 0));
302
+ ctx.requestRender();
303
+ }
304
+ function handleChangelogCommand(ctx) {
305
+ const changelogPath = getChangelogPath();
306
+ const allEntries = parseChangelog(changelogPath);
307
+ const changelogMarkdown = allEntries.length > 0
308
+ ? allEntries
309
+ .reverse()
310
+ .map((e) => e.content)
311
+ .join("\n\n")
312
+ : "No changelog entries found.";
313
+ ctx.chatContainer.addChild(new Spacer(1));
314
+ ctx.chatContainer.addChild(new DynamicBorder());
315
+ ctx.chatContainer.addChild(new Text(theme.bold(theme.fg("accent", "What's New")), 1, 0));
316
+ ctx.chatContainer.addChild(new Spacer(1));
317
+ ctx.chatContainer.addChild(new Markdown(changelogMarkdown, 1, 1, ctx.getMarkdownThemeWithSettings()));
318
+ ctx.chatContainer.addChild(new DynamicBorder());
319
+ ctx.requestRender();
320
+ }
321
+ // ---------------------------------------------------------------------------
322
+ // /hotkeys helpers
323
+ // ---------------------------------------------------------------------------
324
+ export function capitalizeKey(key) {
325
+ return key
326
+ .split("/")
327
+ .map((k) => k
328
+ .split("+")
329
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
330
+ .join("+"))
331
+ .join("/");
332
+ }
333
+ export function getAppKeyDisplay(keybindings, action) {
334
+ return capitalizeKey(appKey(keybindings, action));
335
+ }
336
+ function getEditorKeyDisplay(action) {
337
+ return capitalizeKey(editorKey(action));
338
+ }
339
+ function handleHotkeysCommand(ctx) {
340
+ // Navigation keybindings
341
+ const cursorWordLeft = getEditorKeyDisplay("cursorWordLeft");
342
+ const cursorWordRight = getEditorKeyDisplay("cursorWordRight");
343
+ const cursorLineStart = getEditorKeyDisplay("cursorLineStart");
344
+ const cursorLineEnd = getEditorKeyDisplay("cursorLineEnd");
345
+ const jumpForward = getEditorKeyDisplay("jumpForward");
346
+ const jumpBackward = getEditorKeyDisplay("jumpBackward");
347
+ const pageUp = getEditorKeyDisplay("pageUp");
348
+ const pageDown = getEditorKeyDisplay("pageDown");
349
+ // Editing keybindings
350
+ const submit = getEditorKeyDisplay("submit");
351
+ const newLine = getEditorKeyDisplay("newLine");
352
+ const deleteWordBackward = getEditorKeyDisplay("deleteWordBackward");
353
+ const deleteWordForward = getEditorKeyDisplay("deleteWordForward");
354
+ const deleteToLineStart = getEditorKeyDisplay("deleteToLineStart");
355
+ const deleteToLineEnd = getEditorKeyDisplay("deleteToLineEnd");
356
+ const yank = getEditorKeyDisplay("yank");
357
+ const yankPop = getEditorKeyDisplay("yankPop");
358
+ const undo = getEditorKeyDisplay("undo");
359
+ const tab = getEditorKeyDisplay("tab");
360
+ // App keybindings
361
+ const interrupt = getAppKeyDisplay(ctx.keybindings, "interrupt");
362
+ const clear = getAppKeyDisplay(ctx.keybindings, "clear");
363
+ const exit = getAppKeyDisplay(ctx.keybindings, "exit");
364
+ const suspend = getAppKeyDisplay(ctx.keybindings, "suspend");
365
+ const cycleThinkingLevel = getAppKeyDisplay(ctx.keybindings, "cycleThinkingLevel");
366
+ const cycleModelForward = getAppKeyDisplay(ctx.keybindings, "cycleModelForward");
367
+ const selectModel = getAppKeyDisplay(ctx.keybindings, "selectModel");
368
+ const expandTools = getAppKeyDisplay(ctx.keybindings, "expandTools");
369
+ const toggleThinking = getAppKeyDisplay(ctx.keybindings, "toggleThinking");
370
+ const externalEditor = getAppKeyDisplay(ctx.keybindings, "externalEditor");
371
+ const followUp = getAppKeyDisplay(ctx.keybindings, "followUp");
372
+ const dequeue = getAppKeyDisplay(ctx.keybindings, "dequeue");
373
+ let hotkeys = `
374
+ **Navigation**
375
+ | Key | Action |
376
+ |-----|--------|
377
+ | \`Arrow keys\` | Move cursor / browse history (Up when empty) |
378
+ | \`${cursorWordLeft}\` / \`${cursorWordRight}\` | Move by word |
379
+ | \`${cursorLineStart}\` | Start of line |
380
+ | \`${cursorLineEnd}\` | End of line |
381
+ | \`${jumpForward}\` | Jump forward to character |
382
+ | \`${jumpBackward}\` | Jump backward to character |
383
+ | \`${pageUp}\` / \`${pageDown}\` | Scroll by page |
384
+
385
+ **Editing**
386
+ | Key | Action |
387
+ |-----|--------|
388
+ | \`${submit}\` | Send message |
389
+ | \`${newLine}\` | New line${process.platform === "win32" ? " (Ctrl+Enter on Windows Terminal)" : ""} |
390
+ | \`${deleteWordBackward}\` | Delete word backwards |
391
+ | \`${deleteWordForward}\` | Delete word forwards |
392
+ | \`${deleteToLineStart}\` | Delete to start of line |
393
+ | \`${deleteToLineEnd}\` | Delete to end of line |
394
+ | \`${yank}\` | Paste the most-recently-deleted text |
395
+ | \`${yankPop}\` | Cycle through the deleted text after pasting |
396
+ | \`${undo}\` | Undo |
397
+
398
+ **Other**
399
+ | Key | Action |
400
+ |-----|--------|
401
+ | \`${tab}\` | Path completion / accept autocomplete |
402
+ | \`${interrupt}\` | Cancel autocomplete / abort streaming |
403
+ | \`${clear}\` | Clear editor (first) / exit (second) |
404
+ | \`${exit}\` | Exit (when editor is empty) |
405
+ | \`${suspend}\` | Suspend to background |
406
+ | \`${cycleThinkingLevel}\` | Cycle thinking level |
407
+ | \`${cycleModelForward}\` | Cycle models |
408
+ | \`${selectModel}\` | Open model selector |
409
+ | \`${expandTools}\` | Toggle tool output expansion |
410
+ | \`${toggleThinking}\` | Toggle thinking block visibility |
411
+ | \`${externalEditor}\` | Edit message in external editor |
412
+ | \`${followUp}\` | Queue follow-up message |
413
+ | \`${dequeue}\` | Restore queued messages |
414
+ | \`Ctrl+V\` | Paste image from clipboard |
415
+ | \`/\` | Slash commands |
416
+ | \`!\` | Run bash command |
417
+ | \`!!\` | Run bash command (excluded from context) |
418
+ `;
419
+ // Add extension-registered shortcuts
420
+ const extensionRunner = ctx.session.extensionRunner;
421
+ if (extensionRunner) {
422
+ const shortcuts = extensionRunner.getShortcuts(ctx.keybindings.getEffectiveConfig());
423
+ if (shortcuts.size > 0) {
424
+ hotkeys += `
425
+ **Extensions**
426
+ | Key | Action |
427
+ |-----|--------|
428
+ `;
429
+ for (const [key, shortcut] of shortcuts) {
430
+ const description = shortcut.description ?? shortcut.extensionPath;
431
+ const keyDisplay = formatKeyForDisplay(key).replace(/\b\w/g, (c) => c.toUpperCase());
432
+ hotkeys += `| \`${keyDisplay}\` | ${description} |\n`;
433
+ }
434
+ }
435
+ }
436
+ ctx.chatContainer.addChild(new Spacer(1));
437
+ ctx.chatContainer.addChild(new DynamicBorder());
438
+ ctx.chatContainer.addChild(new Text(theme.bold(theme.fg("accent", "Keyboard Shortcuts")), 1, 0));
439
+ ctx.chatContainer.addChild(new Spacer(1));
440
+ ctx.chatContainer.addChild(new Markdown(hotkeys.trim(), 1, 1, ctx.getMarkdownThemeWithSettings()));
441
+ ctx.chatContainer.addChild(new DynamicBorder());
442
+ ctx.requestRender();
443
+ }
444
+ async function handleCompactCommand(customInstructions, ctx) {
445
+ const entries = ctx.sessionManager.getEntries();
446
+ const messageCount = entries.filter((e) => e.type === "message").length;
447
+ if (messageCount < 2) {
448
+ ctx.showWarning("Nothing to compact (no messages yet)");
449
+ return;
450
+ }
451
+ await ctx.executeCompaction(customInstructions, false);
452
+ }
453
+ function handleThinkingCommand(arg, ctx) {
454
+ if (!ctx.session.supportsThinking()) {
455
+ ctx.showStatus("Current model does not support thinking");
456
+ return;
457
+ }
458
+ const availableLevels = ctx.session.getAvailableThinkingLevels();
459
+ if (arg) {
460
+ const level = arg.toLowerCase();
461
+ if (!availableLevels.includes(level)) {
462
+ ctx.showStatus(`Invalid thinking level "${arg}". Available: ${availableLevels.join(", ")}`);
463
+ return;
464
+ }
465
+ ctx.session.setThinkingLevel(level);
466
+ ctx.invalidateFooter();
467
+ ctx.updateEditorBorderColor();
468
+ ctx.showStatus(`Thinking level: ${level}`);
469
+ return;
470
+ }
471
+ showThinkingSelector(ctx, availableLevels);
472
+ }
473
+ function showThinkingSelector(ctx, availableLevels) {
474
+ ctx.showSelector((done) => {
475
+ const selector = new SelectSubmenu("Thinking Level", "Select reasoning depth for thinking-capable models", availableLevels.map((level) => ({
476
+ value: level,
477
+ label: level,
478
+ description: THINKING_DESCRIPTIONS[level],
479
+ })), ctx.session.thinkingLevel, (value) => {
480
+ ctx.session.setThinkingLevel(value);
481
+ ctx.invalidateFooter();
482
+ ctx.updateEditorBorderColor();
483
+ done();
484
+ ctx.showStatus(`Thinking level: ${value}`);
485
+ }, () => {
486
+ done();
487
+ });
488
+ return { component: selector, focus: selector };
489
+ });
490
+ }
491
+ function handleEditModeCommand(arg, ctx) {
492
+ const modes = ["standard", "hashline"];
493
+ if (arg) {
494
+ const mode = arg.toLowerCase();
495
+ if (!modes.includes(mode)) {
496
+ ctx.showStatus(`Invalid edit mode "${arg}". Available: standard, hashline`);
497
+ return;
498
+ }
499
+ ctx.session.setEditMode(mode);
500
+ ctx.showStatus(`Edit mode: ${mode}${mode === "hashline" ? " (LINE#ID anchored edits)" : " (text-match edits)"}`);
501
+ return;
502
+ }
503
+ // Toggle
504
+ const current = ctx.session.editMode;
505
+ const next = current === "standard" ? "hashline" : "standard";
506
+ ctx.session.setEditMode(next);
507
+ ctx.showStatus(`Edit mode: ${next}${next === "hashline" ? " (LINE#ID anchored edits)" : " (text-match edits)"}`);
508
+ }
509
+ function handleArminSaysHi(ctx) {
510
+ ctx.chatContainer.addChild(new Spacer(1));
511
+ ctx.chatContainer.addChild(new ArminComponent(ctx.ui));
512
+ ctx.requestRender();
513
+ }
514
+ //# sourceMappingURL=slash-command-handlers.js.map