gsd-pi 2.59.0 → 2.60.0-dev.2580e65
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.
- package/dist/resources/extensions/ask-user-questions.js +7 -4
- package/dist/resources/extensions/gsd/auto/phases.js +62 -1
- package/dist/resources/extensions/gsd/auto-dashboard.js +21 -8
- package/dist/resources/extensions/gsd/auto-dispatch.js +6 -3
- package/dist/resources/extensions/gsd/auto-model-selection.js +57 -3
- package/dist/resources/extensions/gsd/auto-post-unit.js +43 -3
- package/dist/resources/extensions/gsd/auto-prompts.js +49 -20
- package/dist/resources/extensions/gsd/auto-recovery.js +37 -18
- package/dist/resources/extensions/gsd/auto-start.js +9 -5
- package/dist/resources/extensions/gsd/auto-timers.js +11 -5
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +5 -3
- package/dist/resources/extensions/gsd/auto-verification.js +3 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +120 -55
- package/dist/resources/extensions/gsd/auto.js +39 -17
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +6 -3
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +72 -2
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +4 -10
- package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +2 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +58 -5
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +11 -10
- package/dist/resources/extensions/gsd/captures.js +54 -1
- package/dist/resources/extensions/gsd/commands/catalog.js +2 -0
- package/dist/resources/extensions/gsd/commands-codebase.js +48 -21
- package/dist/resources/extensions/gsd/commands-inspect.js +2 -1
- package/dist/resources/extensions/gsd/commands-maintenance.js +32 -19
- package/dist/resources/extensions/gsd/complexity-classifier.js +9 -5
- package/dist/resources/extensions/gsd/context-masker.js +68 -0
- package/dist/resources/extensions/gsd/custom-verification.js +3 -2
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +7 -0
- package/dist/resources/extensions/gsd/gsd-db.js +35 -15
- package/dist/resources/extensions/gsd/guided-flow.js +19 -9
- package/dist/resources/extensions/gsd/init-wizard.js +12 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +11 -9
- package/dist/resources/extensions/gsd/md-importer.js +5 -4
- package/dist/resources/extensions/gsd/milestone-actions.js +3 -2
- package/dist/resources/extensions/gsd/milestone-ids.js +2 -1
- package/dist/resources/extensions/gsd/model-router.js +199 -45
- package/dist/resources/extensions/gsd/parallel-merge.js +5 -3
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +26 -14
- package/dist/resources/extensions/gsd/phase-anchor.js +56 -0
- package/dist/resources/extensions/gsd/preferences-types.js +2 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +91 -0
- package/dist/resources/extensions/gsd/preferences.js +15 -3
- package/dist/resources/extensions/gsd/prompt-loader.js +3 -2
- package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/dist/resources/extensions/gsd/prompts/rethink.md +7 -0
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +6 -1
- package/dist/resources/extensions/gsd/rethink.js +5 -2
- package/dist/resources/extensions/gsd/rule-registry.js +7 -6
- package/dist/resources/extensions/gsd/safe-fs.js +6 -8
- package/dist/resources/extensions/gsd/state.js +1 -1
- package/dist/resources/extensions/gsd/status-guards.js +4 -3
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-task.js +3 -2
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/plan-slice.js +3 -2
- package/dist/resources/extensions/gsd/tools/plan-task.js +2 -1
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +4 -4
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -1
- package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -1
- package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -1
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +2 -1
- package/dist/resources/extensions/gsd/triage-resolution.js +135 -1
- package/dist/resources/extensions/gsd/triage-ui.js +12 -3
- package/dist/resources/extensions/gsd/workflow-events.js +2 -1
- package/dist/resources/extensions/gsd/workflow-logger.js +37 -4
- package/dist/resources/extensions/gsd/workflow-migration.js +14 -12
- package/dist/resources/extensions/gsd/workflow-projections.js +2 -2
- package/dist/resources/extensions/gsd/workflow-reconcile.js +2 -2
- package/dist/resources/extensions/gsd/worktree-manager.js +26 -14
- package/dist/resources/extensions/shared/interview-ui.js +3 -1
- package/dist/resources/skills/btw/SKILL.md +42 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +17 -17
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/required-server-files.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +17 -17
- package/dist/web/standalone/.next/server/chunks/2229.js +1 -1
- package/dist/web/standalone/.next/server/chunks/7471.js +3 -3
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +2 -2
- package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-0c485498795110d6.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +5 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +2 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +16 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +26 -0
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/config.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/config.js +6 -1
- package/packages/pi-coding-agent/dist/core/lsp/config.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/defaults.json +2 -2
- package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.js +47 -0
- package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +6 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +122 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +30 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +1 -7
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +6 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +19 -0
- package/packages/pi-coding-agent/src/core/extensions/types.ts +26 -0
- package/packages/pi-coding-agent/src/core/lsp/config.ts +7 -1
- package/packages/pi-coding-agent/src/core/lsp/defaults.json +2 -2
- package/packages/pi-coding-agent/src/core/lsp/lsp-legacy-alias.test.ts +70 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +156 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +7 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +38 -0
- package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +1 -8
- package/pkg/package.json +1 -1
- package/src/resources/extensions/ask-user-questions.ts +7 -3
- package/src/resources/extensions/gsd/auto/phases.ts +70 -1
- package/src/resources/extensions/gsd/auto-dashboard.ts +22 -8
- package/src/resources/extensions/gsd/auto-dispatch.ts +7 -3
- package/src/resources/extensions/gsd/auto-model-selection.ts +77 -6
- package/src/resources/extensions/gsd/auto-post-unit.ts +52 -5
- package/src/resources/extensions/gsd/auto-prompts.ts +54 -20
- package/src/resources/extensions/gsd/auto-recovery.ts +38 -18
- package/src/resources/extensions/gsd/auto-start.ts +10 -9
- package/src/resources/extensions/gsd/auto-timers.ts +12 -5
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +6 -2
- package/src/resources/extensions/gsd/auto-verification.ts +3 -6
- package/src/resources/extensions/gsd/auto-worktree.ts +121 -55
- package/src/resources/extensions/gsd/auto.ts +40 -17
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +4 -3
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +80 -2
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +4 -16
- package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +2 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +61 -4
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +11 -10
- package/src/resources/extensions/gsd/captures.ts +71 -2
- package/src/resources/extensions/gsd/commands/catalog.ts +2 -0
- package/src/resources/extensions/gsd/commands-codebase.ts +52 -20
- package/src/resources/extensions/gsd/commands-inspect.ts +2 -1
- package/src/resources/extensions/gsd/commands-maintenance.ts +28 -19
- package/src/resources/extensions/gsd/complexity-classifier.ts +10 -5
- package/src/resources/extensions/gsd/context-masker.ts +74 -0
- package/src/resources/extensions/gsd/custom-verification.ts +3 -2
- package/src/resources/extensions/gsd/docs/preferences-reference.md +7 -0
- package/src/resources/extensions/gsd/gsd-db.ts +14 -16
- package/src/resources/extensions/gsd/guided-flow.ts +9 -8
- package/src/resources/extensions/gsd/init-wizard.ts +12 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +11 -17
- package/src/resources/extensions/gsd/md-importer.ts +5 -4
- package/src/resources/extensions/gsd/milestone-actions.ts +3 -2
- package/src/resources/extensions/gsd/milestone-ids.ts +2 -1
- package/src/resources/extensions/gsd/model-router.ts +245 -56
- package/src/resources/extensions/gsd/parallel-merge.ts +5 -3
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +18 -14
- package/src/resources/extensions/gsd/phase-anchor.ts +71 -0
- package/src/resources/extensions/gsd/preferences-types.ts +22 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +83 -0
- package/src/resources/extensions/gsd/preferences.ts +16 -3
- package/src/resources/extensions/gsd/prompt-loader.ts +3 -2
- package/src/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/src/resources/extensions/gsd/prompts/rethink.md +7 -0
- package/src/resources/extensions/gsd/prompts/triage-captures.md +6 -1
- package/src/resources/extensions/gsd/rethink.ts +5 -2
- package/src/resources/extensions/gsd/rule-registry.ts +7 -6
- package/src/resources/extensions/gsd/safe-fs.ts +6 -5
- package/src/resources/extensions/gsd/state.ts +1 -1
- package/src/resources/extensions/gsd/status-guards.ts +4 -3
- package/src/resources/extensions/gsd/tests/capability-router.test.ts +347 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/complexity-classifier.test.ts +27 -2
- package/src/resources/extensions/gsd/tests/context-masker.test.ts +122 -0
- package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +1188 -0
- package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +841 -0
- package/src/resources/extensions/gsd/tests/model-router.test.ts +488 -2
- package/src/resources/extensions/gsd/tests/phase-anchor.test.ts +83 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/remote-questions.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/silent-catch-diagnostics.test.ts +284 -0
- package/src/resources/extensions/gsd/tests/status-guards.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/stop-backtrack.test.ts +216 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-logger-audit.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +6 -6
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -6
- package/src/resources/extensions/gsd/tools/complete-slice.ts +3 -6
- package/src/resources/extensions/gsd/tools/complete-task.ts +3 -6
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +3 -6
- package/src/resources/extensions/gsd/tools/plan-slice.ts +3 -6
- package/src/resources/extensions/gsd/tools/plan-task.ts +2 -3
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +4 -6
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -3
- package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -3
- package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -3
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +2 -3
- package/src/resources/extensions/gsd/triage-resolution.ts +151 -1
- package/src/resources/extensions/gsd/triage-ui.ts +12 -3
- package/src/resources/extensions/gsd/types.ts +1 -0
- package/src/resources/extensions/gsd/workflow-events.ts +2 -1
- package/src/resources/extensions/gsd/workflow-logger.ts +52 -5
- package/src/resources/extensions/gsd/workflow-migration.ts +14 -12
- package/src/resources/extensions/gsd/workflow-projections.ts +2 -2
- package/src/resources/extensions/gsd/workflow-reconcile.ts +2 -2
- package/src/resources/extensions/gsd/worktree-manager.ts +16 -14
- package/src/resources/extensions/shared/interview-ui.ts +3 -1
- package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +144 -0
- package/src/resources/skills/btw/SKILL.md +42 -0
- package/dist/web/standalone/.next/static/chunks/app/page-62be3b5fa91e4c8f.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
- /package/dist/web/standalone/.next/static/{DGvT_c5Vb7Wu3X-fEOVUU → ogyMN7M-3bGGuRY08L5HR}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{DGvT_c5Vb7Wu3X-fEOVUU → ogyMN7M-3bGGuRY08L5HR}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slash-command-handlers.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/slash-command-handlers.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"slash-command-handlers.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/slash-command-handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -44,7 +44,7 @@ export async function dispatchSlashCommand(text, ctx) {
|
|
|
44
44
|
await ctx.handleModelCommand(searchTerm);
|
|
45
45
|
return true;
|
|
46
46
|
}
|
|
47
|
-
if (text.startsWith("/export")) {
|
|
47
|
+
if (text === "/export" || text.startsWith("/export ")) {
|
|
48
48
|
await handleExportCommand(text, ctx);
|
|
49
49
|
return true;
|
|
50
50
|
}
|
|
@@ -143,12 +143,6 @@ export async function dispatchSlashCommand(text, ctx) {
|
|
|
143
143
|
await ctx.handleBashCommand(command, { loginShell: true });
|
|
144
144
|
return true;
|
|
145
145
|
}
|
|
146
|
-
// If input starts with "/" but no command matched, show unknown command feedback
|
|
147
|
-
if (text.startsWith("/")) {
|
|
148
|
-
const command = text.split(/\s/)[0];
|
|
149
|
-
ctx.showError(`Unknown command: ${command}. Type /help for available commands.`);
|
|
150
|
-
return true;
|
|
151
|
-
}
|
|
152
146
|
return false;
|
|
153
147
|
}
|
|
154
148
|
// ---------------------------------------------------------------------------
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slash-command-handlers.js","sourceRoot":"","sources":["../../../src/modes/interactive/slash-command-handlers.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Slash command dispatch and handler implementations extracted from InteractiveMode.\n *\n * The `dispatchSlashCommand` function contains the dispatch logic (routing text\n * to handlers), and individual handler functions implement each command.\n *\n * Handlers that are also invoked from keybindings or other subsystems remain on\n * InteractiveMode and are called through the `SlashCommandContext` interface.\n */\n\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { ThinkingLevel } from \"@gsd/pi-agent-core\";\nimport type {\n\tEditorAction,\n\tEditorComponent,\n\tMarkdownTheme,\n} from \"@gsd/pi-tui\";\nimport {\n\ttype Component,\n\tContainer,\n\tMarkdown,\n\tSpacer,\n\tText,\n} from \"@gsd/pi-tui\";\nimport { spawn, spawnSync } from \"child_process\";\nimport {\n\tgetShareViewerUrl,\n} from \"../../config.js\";\nimport type { AgentSession } from \"../../core/agent-session.js\";\nimport type { AppAction, KeybindingsManager } from \"../../core/keybindings.js\";\nimport type { SessionManager } from \"../../core/session-manager.js\";\nimport type { SettingsManager } from \"../../core/settings-manager.js\";\nimport { copyToClipboard } from \"../../utils/clipboard.js\";\nimport { getChangelogPath, parseChangelog } from \"../../utils/changelog.js\";\nimport { ArminComponent } from \"./components/armin.js\";\nimport { BorderedLoader } from \"./components/bordered-loader.js\";\nimport { DynamicBorder } from \"./components/dynamic-border.js\";\nimport { appKey, editorKey, formatKeyForDisplay } from \"./components/keybinding-hints.js\";\nimport { SelectSubmenu, THINKING_DESCRIPTIONS } from \"./components/settings-selector.js\";\nimport { theme } from \"./theme/theme.js\";\n\nimport type { TUI } from \"@gsd/pi-tui\";\n\n// ---------------------------------------------------------------------------\n// Context interface — the subset of InteractiveMode needed by slash commands\n// ---------------------------------------------------------------------------\n\n/**\n * Provides slash command handlers with access to the parts of InteractiveMode\n * they need without coupling them to the entire class.\n */\nexport interface SlashCommandContext {\n\t// Core objects\n\treadonly session: AgentSession;\n\treadonly ui: TUI;\n\treadonly keybindings: KeybindingsManager;\n\n\t// Containers\n\treadonly chatContainer: Container;\n\treadonly statusContainer: Container;\n\treadonly editorContainer: Container;\n\treadonly headerContainer: Container;\n\treadonly pendingMessagesContainer: Container;\n\n\t// Editor\n\treadonly editor: EditorComponent;\n\treadonly defaultEditor: EditorComponent & {\n\t\tonEscape?: () => void;\n\t};\n\n\t// Accessors\n\treadonly sessionManager: SessionManager;\n\treadonly settingsManager: SettingsManager;\n\n\t// Footer\n\tinvalidateFooter(): void;\n\n\t// UI helpers\n\tshowStatus(message: string): void;\n\tshowError(message: string): void;\n\tshowWarning(message: string): void;\n\tshowSelector(create: (done: () => void) => { component: Component; focus: Component }): void;\n\tupdateEditorBorderColor(): void;\n\tgetMarkdownThemeWithSettings(): MarkdownTheme;\n\trequestRender(): void;\n\n\tupdateTerminalTitle(): void;\n\n\t// Methods that stay on InteractiveMode (called from both dispatch and keybindings/events)\n\tshowSettingsSelector(): void;\n\tshowModelsSelector(): Promise<void>;\n\thandleModelCommand(searchTerm?: string): Promise<void>;\n\tshowUserMessageSelector(): void;\n\tshowTreeSelector(): void;\n\tshowProviderManager(): void;\n\tshowOAuthSelector(mode: \"login\" | \"logout\"): Promise<void>;\n\tshowSessionSelector(): void;\n\thandleClearCommand(): Promise<void>;\n\thandleReloadCommand(): Promise<void>;\n\thandleDebugCommand(): void;\n\tshutdown(): Promise<void>;\n\n\t// For compaction\n\texecuteCompaction(customInstructions?: string, isAuto?: boolean): Promise<unknown>;\n\n\t// Bash execution\n\thandleBashCommand(command: string, options?: { excludeFromContext?: boolean; displayCommand?: string; loginShell?: boolean }): Promise<void>;\n}\n\n// ---------------------------------------------------------------------------\n// Dispatch\n// ---------------------------------------------------------------------------\n\n/**\n * Routes a slash command string to the appropriate handler.\n *\n * @returns `true` if the text was handled as a slash command (caller should\n * not process it further), `false` otherwise.\n */\nexport async function dispatchSlashCommand(\n\ttext: string,\n\tctx: SlashCommandContext,\n): Promise<boolean> {\n\tif (text === \"/settings\") {\n\t\tctx.showSettingsSelector();\n\t\treturn true;\n\t}\n\tif (text === \"/scoped-models\") {\n\t\tawait ctx.showModelsSelector();\n\t\treturn true;\n\t}\n\tif (text === \"/model\" || text.startsWith(\"/model \")) {\n\t\tconst searchTerm = text.startsWith(\"/model \") ? text.slice(7).trim() : undefined;\n\t\tawait ctx.handleModelCommand(searchTerm);\n\t\treturn true;\n\t}\n\tif (text.startsWith(\"/export\")) {\n\t\tawait handleExportCommand(text, ctx);\n\t\treturn true;\n\t}\n\tif (text === \"/share\") {\n\t\tawait handleShareCommand(ctx);\n\t\treturn true;\n\t}\n\tif (text === \"/copy\") {\n\t\thandleCopyCommand(ctx);\n\t\treturn true;\n\t}\n\tif (text === \"/name\" || text.startsWith(\"/name \")) {\n\t\thandleNameCommand(text, ctx);\n\t\treturn true;\n\t}\n\tif (text === \"/session\") {\n\t\thandleSessionCommand(ctx);\n\t\treturn true;\n\t}\n\tif (text === \"/changelog\") {\n\t\thandleChangelogCommand(ctx);\n\t\treturn true;\n\t}\n\tif (text === \"/hotkeys\") {\n\t\thandleHotkeysCommand(ctx);\n\t\treturn true;\n\t}\n\tif (text === \"/fork\") {\n\t\tctx.showUserMessageSelector();\n\t\treturn true;\n\t}\n\tif (text === \"/tree\") {\n\t\tctx.showTreeSelector();\n\t\treturn true;\n\t}\n\tif (text === \"/provider\") {\n\t\tctx.showProviderManager();\n\t\treturn true;\n\t}\n\tif (text === \"/login\") {\n\t\tawait ctx.showOAuthSelector(\"login\");\n\t\treturn true;\n\t}\n\tif (text === \"/logout\") {\n\t\tawait ctx.showOAuthSelector(\"logout\");\n\t\treturn true;\n\t}\n\tif (text === \"/new\") {\n\t\tawait ctx.handleClearCommand();\n\t\treturn true;\n\t}\n\tif (text === \"/compact\" || text.startsWith(\"/compact \")) {\n\t\tconst customInstructions = text.startsWith(\"/compact \") ? text.slice(9).trim() : undefined;\n\t\tawait handleCompactCommand(customInstructions, ctx);\n\t\treturn true;\n\t}\n\tif (text === \"/reload\") {\n\t\tawait ctx.handleReloadCommand();\n\t\treturn true;\n\t}\n\tif (text === \"/thinking\" || text.startsWith(\"/thinking \")) {\n\t\tconst arg = text.startsWith(\"/thinking \") ? text.slice(10).trim() : undefined;\n\t\thandleThinkingCommand(arg, ctx);\n\t\treturn true;\n\t}\n\tif (text === \"/edit-mode\" || text.startsWith(\"/edit-mode \")) {\n\t\tconst arg = text.startsWith(\"/edit-mode \") ? text.slice(11).trim() : undefined;\n\t\thandleEditModeCommand(arg, ctx);\n\t\treturn true;\n\t}\n\tif (text === \"/debug\") {\n\t\tctx.handleDebugCommand();\n\t\treturn true;\n\t}\n\tif (text === \"/arminsayshi\") {\n\t\thandleArminSaysHi(ctx);\n\t\treturn true;\n\t}\n\tif (text === \"/resume\") {\n\t\tctx.showSessionSelector();\n\t\treturn true;\n\t}\n\tif (text === \"/quit\") {\n\t\tawait ctx.shutdown();\n\t\treturn true;\n\t}\n\tif (text === \"/terminal\" || text.startsWith(\"/terminal \")) {\n\t\tconst command = text.startsWith(\"/terminal \") ? text.slice(10).trim() : \"\";\n\t\tif (!command) {\n\t\t\tctx.showWarning(\"Usage: /terminal <command> (e.g. /terminal ping -c3 1.1.1.1)\");\n\t\t\treturn true;\n\t\t}\n\t\t// Run in the user's login shell ($SHELL -l -c) so PATH additions\n\t\t// and env vars from shell profiles (.zprofile/.profile) are available.\n\t\t// Note: shell aliases are not loaded (requires -i which has side effects).\n\t\tawait ctx.handleBashCommand(command, { loginShell: true });\n\t\treturn true;\n\t}\n\n\t// If input starts with \"/\" but no command matched, show unknown command feedback\n\tif (text.startsWith(\"/\")) {\n\t\tconst command = text.split(/\\s/)[0];\n\t\tctx.showError(`Unknown command: ${command}. Type /help for available commands.`);\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n// ---------------------------------------------------------------------------\n// Individual command handlers\n// ---------------------------------------------------------------------------\n\nasync function handleExportCommand(text: string, ctx: SlashCommandContext): Promise<void> {\n\tconst parts = text.split(/\\s+/);\n\tconst outputPath = parts.length > 1 ? parts[1] : undefined;\n\n\ttry {\n\t\tconst filePath = await ctx.session.exportToHtml(outputPath);\n\t\tctx.showStatus(`Session exported to: ${filePath}`);\n\t} catch (error: unknown) {\n\t\tctx.showError(`Failed to export session: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n\t}\n}\n\nasync function handleShareCommand(ctx: SlashCommandContext): Promise<void> {\n\t// Check if gh is available and logged in\n\ttry {\n\t\tconst authResult = spawnSync(\"gh\", [\"auth\", \"status\"], { encoding: \"utf-8\" });\n\t\tif (authResult.status !== 0) {\n\t\t\tctx.showError(\"GitHub CLI is not logged in. Run 'gh auth login' first.\");\n\t\t\treturn;\n\t\t}\n\t} catch {\n\t\tctx.showError(\"GitHub CLI (gh) is not installed. Install it from https://cli.github.com/\");\n\t\treturn;\n\t}\n\n\t// Export to a temp file\n\tconst tmpFile = path.join(os.tmpdir(), \"session.html\");\n\ttry {\n\t\tawait ctx.session.exportToHtml(tmpFile);\n\t} catch (error: unknown) {\n\t\tctx.showError(`Failed to export session: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n\t\treturn;\n\t}\n\n\t// Show cancellable loader, replacing the editor\n\tconst loader = new BorderedLoader(ctx.ui, theme, \"Creating gist...\");\n\tctx.editorContainer.clear();\n\tctx.editorContainer.addChild(loader);\n\tctx.ui.setFocus(loader);\n\tctx.requestRender();\n\n\tconst restoreEditor = () => {\n\t\tloader.dispose();\n\t\tctx.editorContainer.clear();\n\t\tctx.editorContainer.addChild(ctx.editor);\n\t\tctx.ui.setFocus(ctx.editor);\n\t\ttry {\n\t\t\tfs.unlinkSync(tmpFile);\n\t\t} catch {\n\t\t\t// Ignore cleanup errors\n\t\t}\n\t};\n\n\t// Create a secret gist asynchronously\n\tlet proc: ReturnType<typeof spawn> | null = null;\n\n\tloader.onAbort = () => {\n\t\tproc?.kill();\n\t\trestoreEditor();\n\t\tctx.showStatus(\"Share cancelled\");\n\t};\n\n\ttry {\n\t\tconst result = await new Promise<{ stdout: string; stderr: string; code: number | null }>((resolve) => {\n\t\t\tproc = spawn(\"gh\", [\"gist\", \"create\", \"--public=false\", tmpFile]);\n\t\t\tlet stdout = \"\";\n\t\t\tlet stderr = \"\";\n\t\t\tproc.stdout?.on(\"data\", (data) => {\n\t\t\t\tstdout += data.toString();\n\t\t\t});\n\t\t\tproc.stderr?.on(\"data\", (data) => {\n\t\t\t\tstderr += data.toString();\n\t\t\t});\n\t\t\tproc.on(\"close\", (code) => resolve({ stdout, stderr, code }));\n\t\t});\n\n\t\tif (loader.signal.aborted) return;\n\n\t\trestoreEditor();\n\n\t\tif (result.code !== 0) {\n\t\t\tconst errorMsg = result.stderr?.trim() || \"Unknown error\";\n\t\t\tctx.showError(`Failed to create gist: ${errorMsg}`);\n\t\t\treturn;\n\t\t}\n\n\t\t// Extract gist ID from the URL returned by gh\n\t\t// gh returns something like: https://gist.github.com/username/GIST_ID\n\t\tconst gistUrl = result.stdout?.trim();\n\t\tconst gistId = gistUrl?.split(\"/\").pop();\n\t\tif (!gistId) {\n\t\t\tctx.showError(\"Failed to parse gist ID from gh output\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Create the preview URL\n\t\tconst previewUrl = getShareViewerUrl(gistId);\n\t\tctx.showStatus(`Share URL: ${previewUrl}\\nGist: ${gistUrl}`);\n\t} catch (error: unknown) {\n\t\tif (!loader.signal.aborted) {\n\t\t\trestoreEditor();\n\t\t\tctx.showError(`Failed to create gist: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n\t\t}\n\t}\n}\n\nfunction handleCopyCommand(ctx: SlashCommandContext): void {\n\tconst text = ctx.session.getLastAssistantText();\n\tif (!text) {\n\t\tctx.showError(\"No agent messages to copy yet.\");\n\t\treturn;\n\t}\n\n\ttry {\n\t\tcopyToClipboard(text);\n\t\tctx.showStatus(\"Copied last agent message to clipboard\");\n\t} catch (error) {\n\t\tctx.showError(error instanceof Error ? error.message : String(error));\n\t}\n}\n\nfunction handleNameCommand(text: string, ctx: SlashCommandContext): void {\n\tconst name = text.replace(/^\\/name\\s*/, \"\").trim();\n\tif (!name) {\n\t\tconst currentName = ctx.sessionManager.getSessionName();\n\t\tif (currentName) {\n\t\t\tctx.chatContainer.addChild(new Spacer(1));\n\t\t\tctx.chatContainer.addChild(new Text(theme.fg(\"dim\", `Session name: ${currentName}`), 1, 0));\n\t\t} else {\n\t\t\tctx.showWarning(\"Usage: /name <name>\");\n\t\t}\n\t\tctx.requestRender();\n\t\treturn;\n\t}\n\n\tctx.sessionManager.appendSessionInfo(name);\n\tctx.updateTerminalTitle();\n\tctx.chatContainer.addChild(new Spacer(1));\n\tctx.chatContainer.addChild(new Text(theme.fg(\"dim\", `Session name set: ${name}`), 1, 0));\n\tctx.requestRender();\n}\n\nfunction handleSessionCommand(ctx: SlashCommandContext): void {\n\tconst stats = ctx.session.getSessionStats();\n\tconst sessionName = ctx.sessionManager.getSessionName();\n\n\tlet info = `${theme.bold(\"Session Info\")}\\n\\n`;\n\tif (sessionName) {\n\t\tinfo += `${theme.fg(\"dim\", \"Name:\")} ${sessionName}\\n`;\n\t}\n\tinfo += `${theme.fg(\"dim\", \"File:\")} ${stats.sessionFile ?? \"In-memory\"}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"ID:\")} ${stats.sessionId}\\n\\n`;\n\tinfo += `${theme.bold(\"Messages\")}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"User:\")} ${stats.userMessages}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"Assistant:\")} ${stats.assistantMessages}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"Tool Calls:\")} ${stats.toolCalls}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"Tool Results:\")} ${stats.toolResults}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"Total:\")} ${stats.totalMessages}\\n\\n`;\n\tinfo += `${theme.bold(\"Tokens\")}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"Input:\")} ${stats.tokens.input.toLocaleString()}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"Output:\")} ${stats.tokens.output.toLocaleString()}\\n`;\n\tif (stats.tokens.cacheRead > 0) {\n\t\tinfo += `${theme.fg(\"dim\", \"Cache Read:\")} ${stats.tokens.cacheRead.toLocaleString()}\\n`;\n\t}\n\tif (stats.tokens.cacheWrite > 0) {\n\t\tinfo += `${theme.fg(\"dim\", \"Cache Write:\")} ${stats.tokens.cacheWrite.toLocaleString()}\\n`;\n\t}\n\tinfo += `${theme.fg(\"dim\", \"Total:\")} ${stats.tokens.total.toLocaleString()}\\n`;\n\n\tif (stats.cost > 0) {\n\t\tinfo += `\\n${theme.bold(\"Cost\")}\\n`;\n\t\tinfo += `${theme.fg(\"dim\", \"Total:\")} ${stats.cost.toFixed(4)}`;\n\t}\n\n\tctx.chatContainer.addChild(new Spacer(1));\n\tctx.chatContainer.addChild(new Text(info, 1, 0));\n\tctx.requestRender();\n}\n\nfunction handleChangelogCommand(ctx: SlashCommandContext): void {\n\tconst changelogPath = getChangelogPath();\n\tconst allEntries = parseChangelog(changelogPath);\n\n\tconst changelogMarkdown =\n\t\tallEntries.length > 0\n\t\t\t? allEntries\n\t\t\t\t\t.reverse()\n\t\t\t\t\t.map((e) => e.content)\n\t\t\t\t\t.join(\"\\n\\n\")\n\t\t\t: \"No changelog entries found.\";\n\n\tctx.chatContainer.addChild(new Spacer(1));\n\tctx.chatContainer.addChild(new DynamicBorder());\n\tctx.chatContainer.addChild(new Text(theme.bold(theme.fg(\"accent\", \"What's New\")), 1, 0));\n\tctx.chatContainer.addChild(new Spacer(1));\n\tctx.chatContainer.addChild(new Markdown(changelogMarkdown, 1, 1, ctx.getMarkdownThemeWithSettings()));\n\tctx.chatContainer.addChild(new DynamicBorder());\n\tctx.requestRender();\n}\n\n// ---------------------------------------------------------------------------\n// /hotkeys helpers\n// ---------------------------------------------------------------------------\n\nexport function capitalizeKey(key: string): string {\n\treturn key\n\t\t.split(\"/\")\n\t\t.map((k) =>\n\t\t\tk\n\t\t\t\t.split(\"+\")\n\t\t\t\t.map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n\t\t\t\t.join(\"+\"),\n\t\t)\n\t\t.join(\"/\");\n}\n\nexport function getAppKeyDisplay(keybindings: KeybindingsManager, action: AppAction): string {\n\treturn capitalizeKey(appKey(keybindings, action));\n}\n\nfunction getEditorKeyDisplay(action: EditorAction): string {\n\treturn capitalizeKey(editorKey(action));\n}\n\nfunction handleHotkeysCommand(ctx: SlashCommandContext): void {\n\t// Navigation keybindings\n\tconst cursorWordLeft = getEditorKeyDisplay(\"cursorWordLeft\");\n\tconst cursorWordRight = getEditorKeyDisplay(\"cursorWordRight\");\n\tconst cursorLineStart = getEditorKeyDisplay(\"cursorLineStart\");\n\tconst cursorLineEnd = getEditorKeyDisplay(\"cursorLineEnd\");\n\tconst jumpForward = getEditorKeyDisplay(\"jumpForward\");\n\tconst jumpBackward = getEditorKeyDisplay(\"jumpBackward\");\n\tconst pageUp = getEditorKeyDisplay(\"pageUp\");\n\tconst pageDown = getEditorKeyDisplay(\"pageDown\");\n\n\t// Editing keybindings\n\tconst submit = getEditorKeyDisplay(\"submit\");\n\tconst newLine = getEditorKeyDisplay(\"newLine\");\n\tconst deleteWordBackward = getEditorKeyDisplay(\"deleteWordBackward\");\n\tconst deleteWordForward = getEditorKeyDisplay(\"deleteWordForward\");\n\tconst deleteToLineStart = getEditorKeyDisplay(\"deleteToLineStart\");\n\tconst deleteToLineEnd = getEditorKeyDisplay(\"deleteToLineEnd\");\n\tconst yank = getEditorKeyDisplay(\"yank\");\n\tconst yankPop = getEditorKeyDisplay(\"yankPop\");\n\tconst undo = getEditorKeyDisplay(\"undo\");\n\tconst tab = getEditorKeyDisplay(\"tab\");\n\n\t// App keybindings\n\tconst interrupt = getAppKeyDisplay(ctx.keybindings, \"interrupt\");\n\tconst clear = getAppKeyDisplay(ctx.keybindings, \"clear\");\n\tconst exit = getAppKeyDisplay(ctx.keybindings, \"exit\");\n\tconst suspend = getAppKeyDisplay(ctx.keybindings, \"suspend\");\n\tconst cycleThinkingLevel = getAppKeyDisplay(ctx.keybindings, \"cycleThinkingLevel\");\n\tconst cycleModelForward = getAppKeyDisplay(ctx.keybindings, \"cycleModelForward\");\n\tconst selectModel = getAppKeyDisplay(ctx.keybindings, \"selectModel\");\n\tconst expandTools = getAppKeyDisplay(ctx.keybindings, \"expandTools\");\n\tconst toggleThinking = getAppKeyDisplay(ctx.keybindings, \"toggleThinking\");\n\tconst externalEditor = getAppKeyDisplay(ctx.keybindings, \"externalEditor\");\n\tconst followUp = getAppKeyDisplay(ctx.keybindings, \"followUp\");\n\tconst dequeue = getAppKeyDisplay(ctx.keybindings, \"dequeue\");\n\n\tlet hotkeys = `\n**Navigation**\n| Key | Action |\n|-----|--------|\n| \\`Arrow keys\\` | Move cursor / browse history (Up when empty) |\n| \\`${cursorWordLeft}\\` / \\`${cursorWordRight}\\` | Move by word |\n| \\`${cursorLineStart}\\` | Start of line |\n| \\`${cursorLineEnd}\\` | End of line |\n| \\`${jumpForward}\\` | Jump forward to character |\n| \\`${jumpBackward}\\` | Jump backward to character |\n| \\`${pageUp}\\` / \\`${pageDown}\\` | Scroll by page |\n\n**Editing**\n| Key | Action |\n|-----|--------|\n| \\`${submit}\\` | Send message |\n| \\`${newLine}\\` | New line${process.platform === \"win32\" ? \" (Ctrl+Enter on Windows Terminal)\" : \"\"} |\n| \\`${deleteWordBackward}\\` | Delete word backwards |\n| \\`${deleteWordForward}\\` | Delete word forwards |\n| \\`${deleteToLineStart}\\` | Delete to start of line |\n| \\`${deleteToLineEnd}\\` | Delete to end of line |\n| \\`${yank}\\` | Paste the most-recently-deleted text |\n| \\`${yankPop}\\` | Cycle through the deleted text after pasting |\n| \\`${undo}\\` | Undo |\n\n**Other**\n| Key | Action |\n|-----|--------|\n| \\`${tab}\\` | Path completion / accept autocomplete |\n| \\`${interrupt}\\` | Cancel autocomplete / abort streaming |\n| \\`${clear}\\` | Clear editor (first) / exit (second) |\n| \\`${exit}\\` | Exit (when editor is empty) |\n| \\`${suspend}\\` | Suspend to background |\n| \\`${cycleThinkingLevel}\\` | Cycle thinking level |\n| \\`${cycleModelForward}\\` | Cycle models |\n| \\`${selectModel}\\` | Open model selector |\n| \\`${expandTools}\\` | Toggle tool output expansion |\n| \\`${toggleThinking}\\` | Toggle thinking block visibility |\n| \\`${externalEditor}\\` | Edit message in external editor |\n| \\`${followUp}\\` | Queue follow-up message |\n| \\`${dequeue}\\` | Restore queued messages |\n| \\`Ctrl+V\\` | Paste image from clipboard |\n| \\`/\\` | Slash commands |\n| \\`!\\` | Run bash command |\n| \\`!!\\` | Run bash command (excluded from context) |\n`;\n\n\t// Add extension-registered shortcuts\n\tconst extensionRunner = ctx.session.extensionRunner;\n\tif (extensionRunner) {\n\t\tconst shortcuts = extensionRunner.getShortcuts(ctx.keybindings.getEffectiveConfig());\n\t\tif (shortcuts.size > 0) {\n\t\t\thotkeys += `\n**Extensions**\n| Key | Action |\n|-----|--------|\n`;\n\t\t\tfor (const [key, shortcut] of shortcuts) {\n\t\t\t\tconst description = shortcut.description ?? shortcut.extensionPath;\n\t\t\t\tconst keyDisplay = formatKeyForDisplay(key).replace(/\\b\\w/g, (c) => c.toUpperCase());\n\t\t\t\thotkeys += `| \\`${keyDisplay}\\` | ${description} |\\n`;\n\t\t\t}\n\t\t}\n\t}\n\n\tctx.chatContainer.addChild(new Spacer(1));\n\tctx.chatContainer.addChild(new DynamicBorder());\n\tctx.chatContainer.addChild(new Text(theme.bold(theme.fg(\"accent\", \"Keyboard Shortcuts\")), 1, 0));\n\tctx.chatContainer.addChild(new Spacer(1));\n\tctx.chatContainer.addChild(new Markdown(hotkeys.trim(), 1, 1, ctx.getMarkdownThemeWithSettings()));\n\tctx.chatContainer.addChild(new DynamicBorder());\n\tctx.requestRender();\n}\n\nasync function handleCompactCommand(customInstructions: string | undefined, ctx: SlashCommandContext): Promise<void> {\n\tconst entries = ctx.sessionManager.getEntries();\n\tconst messageCount = entries.filter((e) => e.type === \"message\").length;\n\n\tif (messageCount < 2) {\n\t\tctx.showWarning(\"Nothing to compact (no messages yet)\");\n\t\treturn;\n\t}\n\n\tawait ctx.executeCompaction(customInstructions, false);\n}\n\nfunction handleThinkingCommand(arg: string | undefined, ctx: SlashCommandContext): void {\n\tif (!ctx.session.supportsThinking()) {\n\t\tctx.showStatus(\"Current model does not support thinking\");\n\t\treturn;\n\t}\n\n\tconst availableLevels = ctx.session.getAvailableThinkingLevels();\n\n\tif (arg) {\n\t\tconst level = arg.toLowerCase();\n\t\tif (!availableLevels.includes(level as ThinkingLevel)) {\n\t\t\tctx.showStatus(`Invalid thinking level \"${arg}\". Available: ${availableLevels.join(\", \")}`);\n\t\t\treturn;\n\t\t}\n\t\tctx.session.setThinkingLevel(level as ThinkingLevel);\n\t\tctx.invalidateFooter();\n\t\tctx.updateEditorBorderColor();\n\t\tctx.showStatus(`Thinking level: ${level}`);\n\t\treturn;\n\t}\n\n\tshowThinkingSelector(ctx, availableLevels);\n}\n\nfunction showThinkingSelector(ctx: SlashCommandContext, availableLevels: readonly ThinkingLevel[]): void {\n\tctx.showSelector((done) => {\n\t\tconst selector = new SelectSubmenu(\n\t\t\t\"Thinking Level\",\n\t\t\t\"Select reasoning depth for thinking-capable models\",\n\t\t\tavailableLevels.map((level) => ({\n\t\t\t\tvalue: level,\n\t\t\t\tlabel: level,\n\t\t\t\tdescription: THINKING_DESCRIPTIONS[level],\n\t\t\t})),\n\t\t\tctx.session.thinkingLevel,\n\t\t\t(value) => {\n\t\t\t\tctx.session.setThinkingLevel(value as ThinkingLevel);\n\t\t\t\tctx.invalidateFooter();\n\t\t\t\tctx.updateEditorBorderColor();\n\t\t\t\tdone();\n\t\t\t\tctx.showStatus(`Thinking level: ${value}`);\n\t\t\t},\n\t\t\t() => {\n\t\t\t\tdone();\n\t\t\t},\n\t\t);\n\t\treturn { component: selector, focus: selector };\n\t});\n}\n\nfunction handleEditModeCommand(arg: string | undefined, ctx: SlashCommandContext): void {\n\tconst modes = [\"standard\", \"hashline\"] as const;\n\n\tif (arg) {\n\t\tconst mode = arg.toLowerCase();\n\t\tif (!modes.includes(mode as typeof modes[number])) {\n\t\t\tctx.showStatus(`Invalid edit mode \"${arg}\". Available: standard, hashline`);\n\t\t\treturn;\n\t\t}\n\t\tctx.session.setEditMode(mode as \"standard\" | \"hashline\");\n\t\tctx.showStatus(`Edit mode: ${mode}${mode === \"hashline\" ? \" (LINE#ID anchored edits)\" : \" (text-match edits)\"}`);\n\t\treturn;\n\t}\n\n\t// Toggle\n\tconst current = ctx.session.editMode;\n\tconst next = current === \"standard\" ? \"hashline\" : \"standard\";\n\tctx.session.setEditMode(next);\n\tctx.showStatus(`Edit mode: ${next}${next === \"hashline\" ? \" (LINE#ID anchored edits)\" : \" (text-match edits)\"}`);\n}\n\nfunction handleArminSaysHi(ctx: SlashCommandContext): void {\n\tctx.chatContainer.addChild(new Spacer(1));\n\tctx.chatContainer.addChild(new ArminComponent(ctx.ui));\n\tctx.requestRender();\n}\n"]}
|
|
1
|
+
{"version":3,"file":"slash-command-handlers.js","sourceRoot":"","sources":["../../../src/modes/interactive/slash-command-handlers.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Slash command dispatch and handler implementations extracted from InteractiveMode.\n *\n * The `dispatchSlashCommand` function contains the dispatch logic (routing text\n * to handlers), and individual handler functions implement each command.\n *\n * Handlers that are also invoked from keybindings or other subsystems remain on\n * InteractiveMode and are called through the `SlashCommandContext` interface.\n */\n\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { ThinkingLevel } from \"@gsd/pi-agent-core\";\nimport type {\n\tEditorAction,\n\tEditorComponent,\n\tMarkdownTheme,\n} from \"@gsd/pi-tui\";\nimport {\n\ttype Component,\n\tContainer,\n\tMarkdown,\n\tSpacer,\n\tText,\n} from \"@gsd/pi-tui\";\nimport { spawn, spawnSync } from \"child_process\";\nimport {\n\tgetShareViewerUrl,\n} from \"../../config.js\";\nimport type { AgentSession } from \"../../core/agent-session.js\";\nimport type { AppAction, KeybindingsManager } from \"../../core/keybindings.js\";\nimport type { SessionManager } from \"../../core/session-manager.js\";\nimport type { SettingsManager } from \"../../core/settings-manager.js\";\nimport { copyToClipboard } from \"../../utils/clipboard.js\";\nimport { getChangelogPath, parseChangelog } from \"../../utils/changelog.js\";\nimport { ArminComponent } from \"./components/armin.js\";\nimport { BorderedLoader } from \"./components/bordered-loader.js\";\nimport { DynamicBorder } from \"./components/dynamic-border.js\";\nimport { appKey, editorKey, formatKeyForDisplay } from \"./components/keybinding-hints.js\";\nimport { SelectSubmenu, THINKING_DESCRIPTIONS } from \"./components/settings-selector.js\";\nimport { theme } from \"./theme/theme.js\";\n\nimport type { TUI } from \"@gsd/pi-tui\";\n\n// ---------------------------------------------------------------------------\n// Context interface — the subset of InteractiveMode needed by slash commands\n// ---------------------------------------------------------------------------\n\n/**\n * Provides slash command handlers with access to the parts of InteractiveMode\n * they need without coupling them to the entire class.\n */\nexport interface SlashCommandContext {\n\t// Core objects\n\treadonly session: AgentSession;\n\treadonly ui: TUI;\n\treadonly keybindings: KeybindingsManager;\n\n\t// Containers\n\treadonly chatContainer: Container;\n\treadonly statusContainer: Container;\n\treadonly editorContainer: Container;\n\treadonly headerContainer: Container;\n\treadonly pendingMessagesContainer: Container;\n\n\t// Editor\n\treadonly editor: EditorComponent;\n\treadonly defaultEditor: EditorComponent & {\n\t\tonEscape?: () => void;\n\t};\n\n\t// Accessors\n\treadonly sessionManager: SessionManager;\n\treadonly settingsManager: SettingsManager;\n\n\t// Footer\n\tinvalidateFooter(): void;\n\n\t// UI helpers\n\tshowStatus(message: string): void;\n\tshowError(message: string): void;\n\tshowWarning(message: string): void;\n\tshowSelector(create: (done: () => void) => { component: Component; focus: Component }): void;\n\tupdateEditorBorderColor(): void;\n\tgetMarkdownThemeWithSettings(): MarkdownTheme;\n\trequestRender(): void;\n\n\tupdateTerminalTitle(): void;\n\n\t// Methods that stay on InteractiveMode (called from both dispatch and keybindings/events)\n\tshowSettingsSelector(): void;\n\tshowModelsSelector(): Promise<void>;\n\thandleModelCommand(searchTerm?: string): Promise<void>;\n\tshowUserMessageSelector(): void;\n\tshowTreeSelector(): void;\n\tshowProviderManager(): void;\n\tshowOAuthSelector(mode: \"login\" | \"logout\"): Promise<void>;\n\tshowSessionSelector(): void;\n\thandleClearCommand(): Promise<void>;\n\thandleReloadCommand(): Promise<void>;\n\thandleDebugCommand(): void;\n\tshutdown(): Promise<void>;\n\n\t// For compaction\n\texecuteCompaction(customInstructions?: string, isAuto?: boolean): Promise<unknown>;\n\n\t// Bash execution\n\thandleBashCommand(command: string, options?: { excludeFromContext?: boolean; displayCommand?: string; loginShell?: boolean }): Promise<void>;\n}\n\n// ---------------------------------------------------------------------------\n// Dispatch\n// ---------------------------------------------------------------------------\n\n/**\n * Routes a slash command string to the appropriate handler.\n *\n * @returns `true` if the text was handled as a slash command (caller should\n * not process it further), `false` otherwise.\n */\nexport async function dispatchSlashCommand(\n\ttext: string,\n\tctx: SlashCommandContext,\n): Promise<boolean> {\n\tif (text === \"/settings\") {\n\t\tctx.showSettingsSelector();\n\t\treturn true;\n\t}\n\tif (text === \"/scoped-models\") {\n\t\tawait ctx.showModelsSelector();\n\t\treturn true;\n\t}\n\tif (text === \"/model\" || text.startsWith(\"/model \")) {\n\t\tconst searchTerm = text.startsWith(\"/model \") ? text.slice(7).trim() : undefined;\n\t\tawait ctx.handleModelCommand(searchTerm);\n\t\treturn true;\n\t}\n\tif (text === \"/export\" || text.startsWith(\"/export \")) {\n\t\tawait handleExportCommand(text, ctx);\n\t\treturn true;\n\t}\n\tif (text === \"/share\") {\n\t\tawait handleShareCommand(ctx);\n\t\treturn true;\n\t}\n\tif (text === \"/copy\") {\n\t\thandleCopyCommand(ctx);\n\t\treturn true;\n\t}\n\tif (text === \"/name\" || text.startsWith(\"/name \")) {\n\t\thandleNameCommand(text, ctx);\n\t\treturn true;\n\t}\n\tif (text === \"/session\") {\n\t\thandleSessionCommand(ctx);\n\t\treturn true;\n\t}\n\tif (text === \"/changelog\") {\n\t\thandleChangelogCommand(ctx);\n\t\treturn true;\n\t}\n\tif (text === \"/hotkeys\") {\n\t\thandleHotkeysCommand(ctx);\n\t\treturn true;\n\t}\n\tif (text === \"/fork\") {\n\t\tctx.showUserMessageSelector();\n\t\treturn true;\n\t}\n\tif (text === \"/tree\") {\n\t\tctx.showTreeSelector();\n\t\treturn true;\n\t}\n\tif (text === \"/provider\") {\n\t\tctx.showProviderManager();\n\t\treturn true;\n\t}\n\tif (text === \"/login\") {\n\t\tawait ctx.showOAuthSelector(\"login\");\n\t\treturn true;\n\t}\n\tif (text === \"/logout\") {\n\t\tawait ctx.showOAuthSelector(\"logout\");\n\t\treturn true;\n\t}\n\tif (text === \"/new\") {\n\t\tawait ctx.handleClearCommand();\n\t\treturn true;\n\t}\n\tif (text === \"/compact\" || text.startsWith(\"/compact \")) {\n\t\tconst customInstructions = text.startsWith(\"/compact \") ? text.slice(9).trim() : undefined;\n\t\tawait handleCompactCommand(customInstructions, ctx);\n\t\treturn true;\n\t}\n\tif (text === \"/reload\") {\n\t\tawait ctx.handleReloadCommand();\n\t\treturn true;\n\t}\n\tif (text === \"/thinking\" || text.startsWith(\"/thinking \")) {\n\t\tconst arg = text.startsWith(\"/thinking \") ? text.slice(10).trim() : undefined;\n\t\thandleThinkingCommand(arg, ctx);\n\t\treturn true;\n\t}\n\tif (text === \"/edit-mode\" || text.startsWith(\"/edit-mode \")) {\n\t\tconst arg = text.startsWith(\"/edit-mode \") ? text.slice(11).trim() : undefined;\n\t\thandleEditModeCommand(arg, ctx);\n\t\treturn true;\n\t}\n\tif (text === \"/debug\") {\n\t\tctx.handleDebugCommand();\n\t\treturn true;\n\t}\n\tif (text === \"/arminsayshi\") {\n\t\thandleArminSaysHi(ctx);\n\t\treturn true;\n\t}\n\tif (text === \"/resume\") {\n\t\tctx.showSessionSelector();\n\t\treturn true;\n\t}\n\tif (text === \"/quit\") {\n\t\tawait ctx.shutdown();\n\t\treturn true;\n\t}\n\tif (text === \"/terminal\" || text.startsWith(\"/terminal \")) {\n\t\tconst command = text.startsWith(\"/terminal \") ? text.slice(10).trim() : \"\";\n\t\tif (!command) {\n\t\t\tctx.showWarning(\"Usage: /terminal <command> (e.g. /terminal ping -c3 1.1.1.1)\");\n\t\t\treturn true;\n\t\t}\n\t\t// Run in the user's login shell ($SHELL -l -c) so PATH additions\n\t\t// and env vars from shell profiles (.zprofile/.profile) are available.\n\t\t// Note: shell aliases are not loaded (requires -i which has side effects).\n\t\tawait ctx.handleBashCommand(command, { loginShell: true });\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n// ---------------------------------------------------------------------------\n// Individual command handlers\n// ---------------------------------------------------------------------------\n\nasync function handleExportCommand(text: string, ctx: SlashCommandContext): Promise<void> {\n\tconst parts = text.split(/\\s+/);\n\tconst outputPath = parts.length > 1 ? parts[1] : undefined;\n\n\ttry {\n\t\tconst filePath = await ctx.session.exportToHtml(outputPath);\n\t\tctx.showStatus(`Session exported to: ${filePath}`);\n\t} catch (error: unknown) {\n\t\tctx.showError(`Failed to export session: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n\t}\n}\n\nasync function handleShareCommand(ctx: SlashCommandContext): Promise<void> {\n\t// Check if gh is available and logged in\n\ttry {\n\t\tconst authResult = spawnSync(\"gh\", [\"auth\", \"status\"], { encoding: \"utf-8\" });\n\t\tif (authResult.status !== 0) {\n\t\t\tctx.showError(\"GitHub CLI is not logged in. Run 'gh auth login' first.\");\n\t\t\treturn;\n\t\t}\n\t} catch {\n\t\tctx.showError(\"GitHub CLI (gh) is not installed. Install it from https://cli.github.com/\");\n\t\treturn;\n\t}\n\n\t// Export to a temp file\n\tconst tmpFile = path.join(os.tmpdir(), \"session.html\");\n\ttry {\n\t\tawait ctx.session.exportToHtml(tmpFile);\n\t} catch (error: unknown) {\n\t\tctx.showError(`Failed to export session: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n\t\treturn;\n\t}\n\n\t// Show cancellable loader, replacing the editor\n\tconst loader = new BorderedLoader(ctx.ui, theme, \"Creating gist...\");\n\tctx.editorContainer.clear();\n\tctx.editorContainer.addChild(loader);\n\tctx.ui.setFocus(loader);\n\tctx.requestRender();\n\n\tconst restoreEditor = () => {\n\t\tloader.dispose();\n\t\tctx.editorContainer.clear();\n\t\tctx.editorContainer.addChild(ctx.editor);\n\t\tctx.ui.setFocus(ctx.editor);\n\t\ttry {\n\t\t\tfs.unlinkSync(tmpFile);\n\t\t} catch {\n\t\t\t// Ignore cleanup errors\n\t\t}\n\t};\n\n\t// Create a secret gist asynchronously\n\tlet proc: ReturnType<typeof spawn> | null = null;\n\n\tloader.onAbort = () => {\n\t\tproc?.kill();\n\t\trestoreEditor();\n\t\tctx.showStatus(\"Share cancelled\");\n\t};\n\n\ttry {\n\t\tconst result = await new Promise<{ stdout: string; stderr: string; code: number | null }>((resolve) => {\n\t\t\tproc = spawn(\"gh\", [\"gist\", \"create\", \"--public=false\", tmpFile]);\n\t\t\tlet stdout = \"\";\n\t\t\tlet stderr = \"\";\n\t\t\tproc.stdout?.on(\"data\", (data) => {\n\t\t\t\tstdout += data.toString();\n\t\t\t});\n\t\t\tproc.stderr?.on(\"data\", (data) => {\n\t\t\t\tstderr += data.toString();\n\t\t\t});\n\t\t\tproc.on(\"close\", (code) => resolve({ stdout, stderr, code }));\n\t\t});\n\n\t\tif (loader.signal.aborted) return;\n\n\t\trestoreEditor();\n\n\t\tif (result.code !== 0) {\n\t\t\tconst errorMsg = result.stderr?.trim() || \"Unknown error\";\n\t\t\tctx.showError(`Failed to create gist: ${errorMsg}`);\n\t\t\treturn;\n\t\t}\n\n\t\t// Extract gist ID from the URL returned by gh\n\t\t// gh returns something like: https://gist.github.com/username/GIST_ID\n\t\tconst gistUrl = result.stdout?.trim();\n\t\tconst gistId = gistUrl?.split(\"/\").pop();\n\t\tif (!gistId) {\n\t\t\tctx.showError(\"Failed to parse gist ID from gh output\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Create the preview URL\n\t\tconst previewUrl = getShareViewerUrl(gistId);\n\t\tctx.showStatus(`Share URL: ${previewUrl}\\nGist: ${gistUrl}`);\n\t} catch (error: unknown) {\n\t\tif (!loader.signal.aborted) {\n\t\t\trestoreEditor();\n\t\t\tctx.showError(`Failed to create gist: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n\t\t}\n\t}\n}\n\nfunction handleCopyCommand(ctx: SlashCommandContext): void {\n\tconst text = ctx.session.getLastAssistantText();\n\tif (!text) {\n\t\tctx.showError(\"No agent messages to copy yet.\");\n\t\treturn;\n\t}\n\n\ttry {\n\t\tcopyToClipboard(text);\n\t\tctx.showStatus(\"Copied last agent message to clipboard\");\n\t} catch (error) {\n\t\tctx.showError(error instanceof Error ? error.message : String(error));\n\t}\n}\n\nfunction handleNameCommand(text: string, ctx: SlashCommandContext): void {\n\tconst name = text.replace(/^\\/name\\s*/, \"\").trim();\n\tif (!name) {\n\t\tconst currentName = ctx.sessionManager.getSessionName();\n\t\tif (currentName) {\n\t\t\tctx.chatContainer.addChild(new Spacer(1));\n\t\t\tctx.chatContainer.addChild(new Text(theme.fg(\"dim\", `Session name: ${currentName}`), 1, 0));\n\t\t} else {\n\t\t\tctx.showWarning(\"Usage: /name <name>\");\n\t\t}\n\t\tctx.requestRender();\n\t\treturn;\n\t}\n\n\tctx.sessionManager.appendSessionInfo(name);\n\tctx.updateTerminalTitle();\n\tctx.chatContainer.addChild(new Spacer(1));\n\tctx.chatContainer.addChild(new Text(theme.fg(\"dim\", `Session name set: ${name}`), 1, 0));\n\tctx.requestRender();\n}\n\nfunction handleSessionCommand(ctx: SlashCommandContext): void {\n\tconst stats = ctx.session.getSessionStats();\n\tconst sessionName = ctx.sessionManager.getSessionName();\n\n\tlet info = `${theme.bold(\"Session Info\")}\\n\\n`;\n\tif (sessionName) {\n\t\tinfo += `${theme.fg(\"dim\", \"Name:\")} ${sessionName}\\n`;\n\t}\n\tinfo += `${theme.fg(\"dim\", \"File:\")} ${stats.sessionFile ?? \"In-memory\"}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"ID:\")} ${stats.sessionId}\\n\\n`;\n\tinfo += `${theme.bold(\"Messages\")}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"User:\")} ${stats.userMessages}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"Assistant:\")} ${stats.assistantMessages}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"Tool Calls:\")} ${stats.toolCalls}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"Tool Results:\")} ${stats.toolResults}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"Total:\")} ${stats.totalMessages}\\n\\n`;\n\tinfo += `${theme.bold(\"Tokens\")}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"Input:\")} ${stats.tokens.input.toLocaleString()}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"Output:\")} ${stats.tokens.output.toLocaleString()}\\n`;\n\tif (stats.tokens.cacheRead > 0) {\n\t\tinfo += `${theme.fg(\"dim\", \"Cache Read:\")} ${stats.tokens.cacheRead.toLocaleString()}\\n`;\n\t}\n\tif (stats.tokens.cacheWrite > 0) {\n\t\tinfo += `${theme.fg(\"dim\", \"Cache Write:\")} ${stats.tokens.cacheWrite.toLocaleString()}\\n`;\n\t}\n\tinfo += `${theme.fg(\"dim\", \"Total:\")} ${stats.tokens.total.toLocaleString()}\\n`;\n\n\tif (stats.cost > 0) {\n\t\tinfo += `\\n${theme.bold(\"Cost\")}\\n`;\n\t\tinfo += `${theme.fg(\"dim\", \"Total:\")} ${stats.cost.toFixed(4)}`;\n\t}\n\n\tctx.chatContainer.addChild(new Spacer(1));\n\tctx.chatContainer.addChild(new Text(info, 1, 0));\n\tctx.requestRender();\n}\n\nfunction handleChangelogCommand(ctx: SlashCommandContext): void {\n\tconst changelogPath = getChangelogPath();\n\tconst allEntries = parseChangelog(changelogPath);\n\n\tconst changelogMarkdown =\n\t\tallEntries.length > 0\n\t\t\t? allEntries\n\t\t\t\t\t.reverse()\n\t\t\t\t\t.map((e) => e.content)\n\t\t\t\t\t.join(\"\\n\\n\")\n\t\t\t: \"No changelog entries found.\";\n\n\tctx.chatContainer.addChild(new Spacer(1));\n\tctx.chatContainer.addChild(new DynamicBorder());\n\tctx.chatContainer.addChild(new Text(theme.bold(theme.fg(\"accent\", \"What's New\")), 1, 0));\n\tctx.chatContainer.addChild(new Spacer(1));\n\tctx.chatContainer.addChild(new Markdown(changelogMarkdown, 1, 1, ctx.getMarkdownThemeWithSettings()));\n\tctx.chatContainer.addChild(new DynamicBorder());\n\tctx.requestRender();\n}\n\n// ---------------------------------------------------------------------------\n// /hotkeys helpers\n// ---------------------------------------------------------------------------\n\nexport function capitalizeKey(key: string): string {\n\treturn key\n\t\t.split(\"/\")\n\t\t.map((k) =>\n\t\t\tk\n\t\t\t\t.split(\"+\")\n\t\t\t\t.map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n\t\t\t\t.join(\"+\"),\n\t\t)\n\t\t.join(\"/\");\n}\n\nexport function getAppKeyDisplay(keybindings: KeybindingsManager, action: AppAction): string {\n\treturn capitalizeKey(appKey(keybindings, action));\n}\n\nfunction getEditorKeyDisplay(action: EditorAction): string {\n\treturn capitalizeKey(editorKey(action));\n}\n\nfunction handleHotkeysCommand(ctx: SlashCommandContext): void {\n\t// Navigation keybindings\n\tconst cursorWordLeft = getEditorKeyDisplay(\"cursorWordLeft\");\n\tconst cursorWordRight = getEditorKeyDisplay(\"cursorWordRight\");\n\tconst cursorLineStart = getEditorKeyDisplay(\"cursorLineStart\");\n\tconst cursorLineEnd = getEditorKeyDisplay(\"cursorLineEnd\");\n\tconst jumpForward = getEditorKeyDisplay(\"jumpForward\");\n\tconst jumpBackward = getEditorKeyDisplay(\"jumpBackward\");\n\tconst pageUp = getEditorKeyDisplay(\"pageUp\");\n\tconst pageDown = getEditorKeyDisplay(\"pageDown\");\n\n\t// Editing keybindings\n\tconst submit = getEditorKeyDisplay(\"submit\");\n\tconst newLine = getEditorKeyDisplay(\"newLine\");\n\tconst deleteWordBackward = getEditorKeyDisplay(\"deleteWordBackward\");\n\tconst deleteWordForward = getEditorKeyDisplay(\"deleteWordForward\");\n\tconst deleteToLineStart = getEditorKeyDisplay(\"deleteToLineStart\");\n\tconst deleteToLineEnd = getEditorKeyDisplay(\"deleteToLineEnd\");\n\tconst yank = getEditorKeyDisplay(\"yank\");\n\tconst yankPop = getEditorKeyDisplay(\"yankPop\");\n\tconst undo = getEditorKeyDisplay(\"undo\");\n\tconst tab = getEditorKeyDisplay(\"tab\");\n\n\t// App keybindings\n\tconst interrupt = getAppKeyDisplay(ctx.keybindings, \"interrupt\");\n\tconst clear = getAppKeyDisplay(ctx.keybindings, \"clear\");\n\tconst exit = getAppKeyDisplay(ctx.keybindings, \"exit\");\n\tconst suspend = getAppKeyDisplay(ctx.keybindings, \"suspend\");\n\tconst cycleThinkingLevel = getAppKeyDisplay(ctx.keybindings, \"cycleThinkingLevel\");\n\tconst cycleModelForward = getAppKeyDisplay(ctx.keybindings, \"cycleModelForward\");\n\tconst selectModel = getAppKeyDisplay(ctx.keybindings, \"selectModel\");\n\tconst expandTools = getAppKeyDisplay(ctx.keybindings, \"expandTools\");\n\tconst toggleThinking = getAppKeyDisplay(ctx.keybindings, \"toggleThinking\");\n\tconst externalEditor = getAppKeyDisplay(ctx.keybindings, \"externalEditor\");\n\tconst followUp = getAppKeyDisplay(ctx.keybindings, \"followUp\");\n\tconst dequeue = getAppKeyDisplay(ctx.keybindings, \"dequeue\");\n\n\tlet hotkeys = `\n**Navigation**\n| Key | Action |\n|-----|--------|\n| \\`Arrow keys\\` | Move cursor / browse history (Up when empty) |\n| \\`${cursorWordLeft}\\` / \\`${cursorWordRight}\\` | Move by word |\n| \\`${cursorLineStart}\\` | Start of line |\n| \\`${cursorLineEnd}\\` | End of line |\n| \\`${jumpForward}\\` | Jump forward to character |\n| \\`${jumpBackward}\\` | Jump backward to character |\n| \\`${pageUp}\\` / \\`${pageDown}\\` | Scroll by page |\n\n**Editing**\n| Key | Action |\n|-----|--------|\n| \\`${submit}\\` | Send message |\n| \\`${newLine}\\` | New line${process.platform === \"win32\" ? \" (Ctrl+Enter on Windows Terminal)\" : \"\"} |\n| \\`${deleteWordBackward}\\` | Delete word backwards |\n| \\`${deleteWordForward}\\` | Delete word forwards |\n| \\`${deleteToLineStart}\\` | Delete to start of line |\n| \\`${deleteToLineEnd}\\` | Delete to end of line |\n| \\`${yank}\\` | Paste the most-recently-deleted text |\n| \\`${yankPop}\\` | Cycle through the deleted text after pasting |\n| \\`${undo}\\` | Undo |\n\n**Other**\n| Key | Action |\n|-----|--------|\n| \\`${tab}\\` | Path completion / accept autocomplete |\n| \\`${interrupt}\\` | Cancel autocomplete / abort streaming |\n| \\`${clear}\\` | Clear editor (first) / exit (second) |\n| \\`${exit}\\` | Exit (when editor is empty) |\n| \\`${suspend}\\` | Suspend to background |\n| \\`${cycleThinkingLevel}\\` | Cycle thinking level |\n| \\`${cycleModelForward}\\` | Cycle models |\n| \\`${selectModel}\\` | Open model selector |\n| \\`${expandTools}\\` | Toggle tool output expansion |\n| \\`${toggleThinking}\\` | Toggle thinking block visibility |\n| \\`${externalEditor}\\` | Edit message in external editor |\n| \\`${followUp}\\` | Queue follow-up message |\n| \\`${dequeue}\\` | Restore queued messages |\n| \\`Ctrl+V\\` | Paste image from clipboard |\n| \\`/\\` | Slash commands |\n| \\`!\\` | Run bash command |\n| \\`!!\\` | Run bash command (excluded from context) |\n`;\n\n\t// Add extension-registered shortcuts\n\tconst extensionRunner = ctx.session.extensionRunner;\n\tif (extensionRunner) {\n\t\tconst shortcuts = extensionRunner.getShortcuts(ctx.keybindings.getEffectiveConfig());\n\t\tif (shortcuts.size > 0) {\n\t\t\thotkeys += `\n**Extensions**\n| Key | Action |\n|-----|--------|\n`;\n\t\t\tfor (const [key, shortcut] of shortcuts) {\n\t\t\t\tconst description = shortcut.description ?? shortcut.extensionPath;\n\t\t\t\tconst keyDisplay = formatKeyForDisplay(key).replace(/\\b\\w/g, (c) => c.toUpperCase());\n\t\t\t\thotkeys += `| \\`${keyDisplay}\\` | ${description} |\\n`;\n\t\t\t}\n\t\t}\n\t}\n\n\tctx.chatContainer.addChild(new Spacer(1));\n\tctx.chatContainer.addChild(new DynamicBorder());\n\tctx.chatContainer.addChild(new Text(theme.bold(theme.fg(\"accent\", \"Keyboard Shortcuts\")), 1, 0));\n\tctx.chatContainer.addChild(new Spacer(1));\n\tctx.chatContainer.addChild(new Markdown(hotkeys.trim(), 1, 1, ctx.getMarkdownThemeWithSettings()));\n\tctx.chatContainer.addChild(new DynamicBorder());\n\tctx.requestRender();\n}\n\nasync function handleCompactCommand(customInstructions: string | undefined, ctx: SlashCommandContext): Promise<void> {\n\tconst entries = ctx.sessionManager.getEntries();\n\tconst messageCount = entries.filter((e) => e.type === \"message\").length;\n\n\tif (messageCount < 2) {\n\t\tctx.showWarning(\"Nothing to compact (no messages yet)\");\n\t\treturn;\n\t}\n\n\tawait ctx.executeCompaction(customInstructions, false);\n}\n\nfunction handleThinkingCommand(arg: string | undefined, ctx: SlashCommandContext): void {\n\tif (!ctx.session.supportsThinking()) {\n\t\tctx.showStatus(\"Current model does not support thinking\");\n\t\treturn;\n\t}\n\n\tconst availableLevels = ctx.session.getAvailableThinkingLevels();\n\n\tif (arg) {\n\t\tconst level = arg.toLowerCase();\n\t\tif (!availableLevels.includes(level as ThinkingLevel)) {\n\t\t\tctx.showStatus(`Invalid thinking level \"${arg}\". Available: ${availableLevels.join(\", \")}`);\n\t\t\treturn;\n\t\t}\n\t\tctx.session.setThinkingLevel(level as ThinkingLevel);\n\t\tctx.invalidateFooter();\n\t\tctx.updateEditorBorderColor();\n\t\tctx.showStatus(`Thinking level: ${level}`);\n\t\treturn;\n\t}\n\n\tshowThinkingSelector(ctx, availableLevels);\n}\n\nfunction showThinkingSelector(ctx: SlashCommandContext, availableLevels: readonly ThinkingLevel[]): void {\n\tctx.showSelector((done) => {\n\t\tconst selector = new SelectSubmenu(\n\t\t\t\"Thinking Level\",\n\t\t\t\"Select reasoning depth for thinking-capable models\",\n\t\t\tavailableLevels.map((level) => ({\n\t\t\t\tvalue: level,\n\t\t\t\tlabel: level,\n\t\t\t\tdescription: THINKING_DESCRIPTIONS[level],\n\t\t\t})),\n\t\t\tctx.session.thinkingLevel,\n\t\t\t(value) => {\n\t\t\t\tctx.session.setThinkingLevel(value as ThinkingLevel);\n\t\t\t\tctx.invalidateFooter();\n\t\t\t\tctx.updateEditorBorderColor();\n\t\t\t\tdone();\n\t\t\t\tctx.showStatus(`Thinking level: ${value}`);\n\t\t\t},\n\t\t\t() => {\n\t\t\t\tdone();\n\t\t\t},\n\t\t);\n\t\treturn { component: selector, focus: selector };\n\t});\n}\n\nfunction handleEditModeCommand(arg: string | undefined, ctx: SlashCommandContext): void {\n\tconst modes = [\"standard\", \"hashline\"] as const;\n\n\tif (arg) {\n\t\tconst mode = arg.toLowerCase();\n\t\tif (!modes.includes(mode as typeof modes[number])) {\n\t\t\tctx.showStatus(`Invalid edit mode \"${arg}\". Available: standard, hashline`);\n\t\t\treturn;\n\t\t}\n\t\tctx.session.setEditMode(mode as \"standard\" | \"hashline\");\n\t\tctx.showStatus(`Edit mode: ${mode}${mode === \"hashline\" ? \" (LINE#ID anchored edits)\" : \" (text-match edits)\"}`);\n\t\treturn;\n\t}\n\n\t// Toggle\n\tconst current = ctx.session.editMode;\n\tconst next = current === \"standard\" ? \"hashline\" : \"standard\";\n\tctx.session.setEditMode(next);\n\tctx.showStatus(`Edit mode: ${next}${next === \"hashline\" ? \" (LINE#ID anchored edits)\" : \" (text-match edits)\"}`);\n}\n\nfunction handleArminSaysHi(ctx: SlashCommandContext): void {\n\tctx.chatContainer.addChild(new Spacer(1));\n\tctx.chatContainer.addChild(new ArminComponent(ctx.ui));\n\tctx.requestRender();\n}\n"]}
|
|
@@ -428,6 +428,8 @@ export function createExtensionRuntime(): ExtensionRuntime {
|
|
|
428
428
|
unregisterProvider: (name) => {
|
|
429
429
|
runtime.pendingProviderRegistrations = runtime.pendingProviderRegistrations.filter((r) => r.name !== name);
|
|
430
430
|
},
|
|
431
|
+
// Stub replaced by ExtensionRunner at construction time via bindEmitMethods().
|
|
432
|
+
emitBeforeModelSelect: async () => undefined,
|
|
431
433
|
};
|
|
432
434
|
|
|
433
435
|
return runtime;
|
|
@@ -579,6 +581,10 @@ function createExtensionAPI(
|
|
|
579
581
|
runtime.unregisterProvider(name);
|
|
580
582
|
},
|
|
581
583
|
|
|
584
|
+
async emitBeforeModelSelect(event: Omit<import("./types.js").BeforeModelSelectEvent, "type">): Promise<import("./types.js").BeforeModelSelectResult | undefined> {
|
|
585
|
+
return runtime.emitBeforeModelSelect(event);
|
|
586
|
+
},
|
|
587
|
+
|
|
582
588
|
events: eventBus,
|
|
583
589
|
} as ExtensionAPI;
|
|
584
590
|
|
|
@@ -13,6 +13,8 @@ import type { SessionManager } from "../session-manager.js";
|
|
|
13
13
|
import type {
|
|
14
14
|
BeforeAgentStartEvent,
|
|
15
15
|
BeforeAgentStartEventResult,
|
|
16
|
+
BeforeModelSelectEvent,
|
|
17
|
+
BeforeModelSelectResult,
|
|
16
18
|
BeforeProviderRequestEvent,
|
|
17
19
|
CompactOptions,
|
|
18
20
|
ContextEvent,
|
|
@@ -230,6 +232,8 @@ export class ExtensionRunner {
|
|
|
230
232
|
this.cwd = cwd;
|
|
231
233
|
this.sessionManager = sessionManager;
|
|
232
234
|
this.modelRegistry = modelRegistry;
|
|
235
|
+
// Bind emit methods into the shared runtime so createExtensionAPI can delegate to them.
|
|
236
|
+
this.runtime.emitBeforeModelSelect = (event) => this.emitBeforeModelSelect(event);
|
|
233
237
|
}
|
|
234
238
|
|
|
235
239
|
bindCore(actions: ExtensionActions, contextActions: ExtensionContextActions): void {
|
|
@@ -694,6 +698,21 @@ export class ExtensionRunner {
|
|
|
694
698
|
return currentPayload;
|
|
695
699
|
}
|
|
696
700
|
|
|
701
|
+
async emitBeforeModelSelect(event: Omit<BeforeModelSelectEvent, "type">): Promise<BeforeModelSelectResult | undefined> {
|
|
702
|
+
let result: BeforeModelSelectResult | undefined;
|
|
703
|
+
await this.invokeHandlers("before_model_select", () => ({
|
|
704
|
+
type: "before_model_select" as const,
|
|
705
|
+
...event,
|
|
706
|
+
} satisfies BeforeModelSelectEvent), (handlerResult) => {
|
|
707
|
+
if (handlerResult) {
|
|
708
|
+
result = handlerResult as BeforeModelSelectResult;
|
|
709
|
+
return { done: true }; // first override wins
|
|
710
|
+
}
|
|
711
|
+
return { done: false };
|
|
712
|
+
});
|
|
713
|
+
return result;
|
|
714
|
+
}
|
|
715
|
+
|
|
697
716
|
async emitBeforeAgentStart(
|
|
698
717
|
prompt: string,
|
|
699
718
|
images: ImageContent[] | undefined,
|
|
@@ -603,6 +603,22 @@ export interface ModelSelectEvent {
|
|
|
603
603
|
source: ModelSelectSource;
|
|
604
604
|
}
|
|
605
605
|
|
|
606
|
+
/** Fired before model selection runs capability scoring. Extensions can override the selected model. */
|
|
607
|
+
export interface BeforeModelSelectEvent {
|
|
608
|
+
type: "before_model_select";
|
|
609
|
+
unitType: string;
|
|
610
|
+
unitId: string;
|
|
611
|
+
classification: { tier: string; reason: string; downgraded: boolean };
|
|
612
|
+
taskMetadata?: Record<string, unknown>;
|
|
613
|
+
eligibleModels: string[];
|
|
614
|
+
phaseConfig?: { primary: string; fallbacks: string[] };
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
/** Result from before_model_select event handler. Return { modelId } to override selection. */
|
|
618
|
+
export interface BeforeModelSelectResult {
|
|
619
|
+
modelId: string;
|
|
620
|
+
}
|
|
621
|
+
|
|
606
622
|
// ============================================================================
|
|
607
623
|
// User Bash Events
|
|
608
624
|
// ============================================================================
|
|
@@ -1052,6 +1068,14 @@ export interface ExtensionAPI {
|
|
|
1052
1068
|
on(event: "tool_result", handler: ExtensionHandler<ToolResultEvent, ToolResultEventResult>): void;
|
|
1053
1069
|
on(event: "user_bash", handler: ExtensionHandler<UserBashEvent, UserBashEventResult>): void;
|
|
1054
1070
|
on(event: "input", handler: ExtensionHandler<InputEvent, InputEventResult>): void;
|
|
1071
|
+
on(event: "before_model_select", handler: ExtensionHandler<BeforeModelSelectEvent, BeforeModelSelectResult>): void;
|
|
1072
|
+
|
|
1073
|
+
// =========================================================================
|
|
1074
|
+
// Event Emission (for host extensions that orchestrate model selection)
|
|
1075
|
+
// =========================================================================
|
|
1076
|
+
|
|
1077
|
+
/** Emit before_model_select event. Returns override model ID or undefined. */
|
|
1078
|
+
emitBeforeModelSelect(event: Omit<BeforeModelSelectEvent, "type">): Promise<BeforeModelSelectResult | undefined>;
|
|
1055
1079
|
|
|
1056
1080
|
// =========================================================================
|
|
1057
1081
|
// Tool Registration
|
|
@@ -1367,6 +1391,8 @@ export interface ExtensionRuntimeState {
|
|
|
1367
1391
|
*/
|
|
1368
1392
|
registerProvider: (name: string, config: ProviderConfig) => void;
|
|
1369
1393
|
unregisterProvider: (name: string) => void;
|
|
1394
|
+
/** Emit before_model_select event to all registered handlers. Bound by ExtensionRunner. */
|
|
1395
|
+
emitBeforeModelSelect: (event: Omit<BeforeModelSelectEvent, "type">) => Promise<BeforeModelSelectResult | undefined>;
|
|
1370
1396
|
}
|
|
1371
1397
|
|
|
1372
1398
|
/**
|
|
@@ -12,6 +12,11 @@ import type { ServerConfig } from "./types.js";
|
|
|
12
12
|
const require = createRequire(import.meta.url);
|
|
13
13
|
const DEFAULTS = require("./defaults.json") as Record<string, Partial<ServerConfig>>;
|
|
14
14
|
|
|
15
|
+
/** Map legacy server keys to their current names so user overrides still merge. */
|
|
16
|
+
const LEGACY_ALIASES: Record<string, string> = {
|
|
17
|
+
"kotlin-language-server": "kotlin-lsp",
|
|
18
|
+
};
|
|
19
|
+
|
|
15
20
|
export interface LspConfig {
|
|
16
21
|
servers: Record<string, ServerConfig>;
|
|
17
22
|
/** Idle timeout in milliseconds. If set, LSP clients will be shutdown after this period of inactivity. Disabled by default. */
|
|
@@ -109,7 +114,8 @@ function mergeServers(
|
|
|
109
114
|
overrides: Record<string, Partial<ServerConfig>>,
|
|
110
115
|
): Record<string, ServerConfig> {
|
|
111
116
|
const merged: Record<string, ServerConfig> = { ...base };
|
|
112
|
-
for (const [
|
|
117
|
+
for (const [rawName, config] of Object.entries(overrides)) {
|
|
118
|
+
const name = LEGACY_ALIASES[rawName] ?? rawName;
|
|
113
119
|
if (merged[name]) {
|
|
114
120
|
const candidate = { ...merged[name], ...config };
|
|
115
121
|
const normalized = normalizeServerConfig(name, candidate);
|
|
@@ -189,8 +189,8 @@
|
|
|
189
189
|
"fileTypes": [".java"],
|
|
190
190
|
"rootMarkers": ["pom.xml", "build.gradle", "build.gradle.kts", "settings.gradle", ".project"]
|
|
191
191
|
},
|
|
192
|
-
"kotlin-
|
|
193
|
-
"command": "kotlin-
|
|
192
|
+
"kotlin-lsp": {
|
|
193
|
+
"command": "kotlin-lsp",
|
|
194
194
|
"args": [],
|
|
195
195
|
"fileTypes": [".kt", ".kts"],
|
|
196
196
|
"rootMarkers": ["build.gradle", "build.gradle.kts", "pom.xml", "settings.gradle", "settings.gradle.kts"]
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// GSD2 — Regression test for LSP legacy server key aliases
|
|
2
|
+
// Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* When a default server key is renamed (e.g., kotlin-language-server → kotlin-lsp),
|
|
6
|
+
* user overrides referencing the old key must still merge correctly via LEGACY_ALIASES.
|
|
7
|
+
*
|
|
8
|
+
* This test exercises the merge path through loadConfig() with a temp project
|
|
9
|
+
* containing an lsp.json that uses the legacy key.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { describe, it, beforeEach, afterEach } from "node:test";
|
|
13
|
+
import assert from "node:assert/strict";
|
|
14
|
+
import * as fs from "node:fs";
|
|
15
|
+
import * as path from "node:path";
|
|
16
|
+
import * as os from "node:os";
|
|
17
|
+
import { loadConfig } from "./config.js";
|
|
18
|
+
|
|
19
|
+
describe("LSP legacy server key aliases", () => {
|
|
20
|
+
let tmpDir: string;
|
|
21
|
+
|
|
22
|
+
beforeEach(() => {
|
|
23
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "lsp-alias-test-"));
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
afterEach(() => {
|
|
27
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it("merges user override with legacy key 'kotlin-language-server' into 'kotlin-lsp'", () => {
|
|
31
|
+
// Write an lsp.json that uses the old key name with a command that exists (node)
|
|
32
|
+
// so resolveCommand doesn't filter it out.
|
|
33
|
+
const overrideConfig = {
|
|
34
|
+
servers: {
|
|
35
|
+
"kotlin-language-server": {
|
|
36
|
+
command: "node",
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
fs.writeFileSync(
|
|
41
|
+
path.join(tmpDir, "lsp.json"),
|
|
42
|
+
JSON.stringify(overrideConfig),
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
// Also add root markers so the server is detected
|
|
46
|
+
fs.writeFileSync(path.join(tmpDir, "build.gradle.kts"), "");
|
|
47
|
+
|
|
48
|
+
const config = loadConfig(tmpDir);
|
|
49
|
+
|
|
50
|
+
// The merged config should have kotlin-lsp (new key) with the user's command override
|
|
51
|
+
const kotlinServer = config.servers["kotlin-lsp"];
|
|
52
|
+
assert.ok(kotlinServer, "kotlin-lsp should exist in merged config");
|
|
53
|
+
assert.equal(
|
|
54
|
+
kotlinServer.command,
|
|
55
|
+
"node",
|
|
56
|
+
"command should be overridden from user config via legacy alias",
|
|
57
|
+
);
|
|
58
|
+
assert.ok(
|
|
59
|
+
kotlinServer.fileTypes.includes(".kt"),
|
|
60
|
+
"fileTypes should be inherited from defaults",
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
// The old key should NOT appear as a separate entry
|
|
64
|
+
assert.equal(
|
|
65
|
+
config.servers["kotlin-language-server"],
|
|
66
|
+
undefined,
|
|
67
|
+
"legacy key should not appear as separate server",
|
|
68
|
+
);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import test from "node:test";
|
|
3
|
+
|
|
4
|
+
import { setupEditorSubmitHandler } from "./input-controller.js";
|
|
5
|
+
|
|
6
|
+
type HostOptions = {
|
|
7
|
+
knownSlashCommands?: string[];
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
function getSlashCommandName(text: string): string {
|
|
11
|
+
const trimmed = text.trim();
|
|
12
|
+
const spaceIndex = trimmed.indexOf(" ");
|
|
13
|
+
return spaceIndex === -1 ? trimmed.slice(1) : trimmed.slice(1, spaceIndex);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function createHost(options: HostOptions = {}) {
|
|
17
|
+
const prompted: string[] = [];
|
|
18
|
+
const errors: string[] = [];
|
|
19
|
+
const warnings: string[] = [];
|
|
20
|
+
const history: string[] = [];
|
|
21
|
+
const knownSlashCommands = new Set(options.knownSlashCommands ?? []);
|
|
22
|
+
let editorText = "";
|
|
23
|
+
let settingsOpened = 0;
|
|
24
|
+
|
|
25
|
+
const editor = {
|
|
26
|
+
setText(text: string) {
|
|
27
|
+
editorText = text;
|
|
28
|
+
},
|
|
29
|
+
getText() {
|
|
30
|
+
return editorText;
|
|
31
|
+
},
|
|
32
|
+
addToHistory(text: string) {
|
|
33
|
+
history.push(text);
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const host = {
|
|
38
|
+
defaultEditor: editor as typeof editor & { onSubmit?: (text: string) => Promise<void> },
|
|
39
|
+
editor,
|
|
40
|
+
session: {
|
|
41
|
+
isBashRunning: false,
|
|
42
|
+
isCompacting: false,
|
|
43
|
+
isStreaming: false,
|
|
44
|
+
prompt: async (text: string) => {
|
|
45
|
+
prompted.push(text);
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
ui: {
|
|
49
|
+
requestRender() {},
|
|
50
|
+
},
|
|
51
|
+
getSlashCommandContext: () => ({
|
|
52
|
+
showSettingsSelector: () => {
|
|
53
|
+
settingsOpened += 1;
|
|
54
|
+
},
|
|
55
|
+
}),
|
|
56
|
+
handleBashCommand: async () => {},
|
|
57
|
+
showWarning(message: string) {
|
|
58
|
+
warnings.push(message);
|
|
59
|
+
},
|
|
60
|
+
showError(message: string) {
|
|
61
|
+
errors.push(message);
|
|
62
|
+
},
|
|
63
|
+
updateEditorBorderColor() {},
|
|
64
|
+
isExtensionCommand() {
|
|
65
|
+
return false;
|
|
66
|
+
},
|
|
67
|
+
isKnownSlashCommand(text: string) {
|
|
68
|
+
return knownSlashCommands.has(getSlashCommandName(text));
|
|
69
|
+
},
|
|
70
|
+
queueCompactionMessage() {},
|
|
71
|
+
updatePendingMessagesDisplay() {},
|
|
72
|
+
flushPendingBashComponents() {},
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
setupEditorSubmitHandler(host as any);
|
|
76
|
+
|
|
77
|
+
return {
|
|
78
|
+
host: host as typeof host & { defaultEditor: typeof editor & { onSubmit: (text: string) => Promise<void> } },
|
|
79
|
+
prompted,
|
|
80
|
+
errors,
|
|
81
|
+
warnings,
|
|
82
|
+
history,
|
|
83
|
+
getEditorText: () => editorText,
|
|
84
|
+
getSettingsOpened: () => settingsOpened,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
test("input-controller: built-in slash commands stay in TUI dispatch", async () => {
|
|
89
|
+
const { host, prompted, errors, getSettingsOpened, getEditorText } = createHost();
|
|
90
|
+
|
|
91
|
+
await host.defaultEditor.onSubmit("/settings");
|
|
92
|
+
|
|
93
|
+
assert.equal(getSettingsOpened(), 1, "built-in /settings should open the settings selector");
|
|
94
|
+
assert.deepEqual(prompted, [], "built-in slash commands should not reach session.prompt");
|
|
95
|
+
assert.deepEqual(errors, [], "built-in slash commands should not show errors");
|
|
96
|
+
assert.equal(getEditorText(), "", "built-in slash commands should clear the editor after handling");
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
test("input-controller: extension slash commands fall through to session.prompt", async () => {
|
|
100
|
+
const { host, prompted, errors, history } = createHost({ knownSlashCommands: ["gsd"] });
|
|
101
|
+
|
|
102
|
+
await host.defaultEditor.onSubmit("/gsd help");
|
|
103
|
+
|
|
104
|
+
assert.deepEqual(prompted, ["/gsd help"], "known extension slash commands should reach session.prompt");
|
|
105
|
+
assert.deepEqual(errors, [], "known extension slash commands should not show unknown-command errors");
|
|
106
|
+
assert.deepEqual(history, ["/gsd help"], "known extension slash commands should still be added to history");
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
test("input-controller: prompt template slash commands fall through to session.prompt", async () => {
|
|
110
|
+
const { host, prompted, errors } = createHost({ knownSlashCommands: ["daily"] });
|
|
111
|
+
|
|
112
|
+
await host.defaultEditor.onSubmit("/daily focus area");
|
|
113
|
+
|
|
114
|
+
assert.deepEqual(prompted, ["/daily focus area"]);
|
|
115
|
+
assert.deepEqual(errors, []);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
test("input-controller: skill slash commands fall through to session.prompt", async () => {
|
|
119
|
+
const { host, prompted, errors } = createHost({ knownSlashCommands: ["skill:create-skill"] });
|
|
120
|
+
|
|
121
|
+
await host.defaultEditor.onSubmit("/skill:create-skill routing bug");
|
|
122
|
+
|
|
123
|
+
assert.deepEqual(prompted, ["/skill:create-skill routing bug"]);
|
|
124
|
+
assert.deepEqual(errors, []);
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
test("input-controller: disabled skill slash commands stay unknown", async () => {
|
|
128
|
+
const { host, prompted, errors } = createHost();
|
|
129
|
+
|
|
130
|
+
await host.defaultEditor.onSubmit("/skill:create-skill routing bug");
|
|
131
|
+
|
|
132
|
+
assert.deepEqual(prompted, []);
|
|
133
|
+
assert.deepEqual(errors, ["Unknown command: /skill:create-skill. Use slash autocomplete to see available commands."]);
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
test("input-controller: /export prefix does not swallow unrelated slash commands", async () => {
|
|
137
|
+
const { host, prompted, errors } = createHost();
|
|
138
|
+
|
|
139
|
+
await host.defaultEditor.onSubmit("/exportfoo");
|
|
140
|
+
|
|
141
|
+
assert.deepEqual(prompted, []);
|
|
142
|
+
assert.deepEqual(errors, ["Unknown command: /exportfoo. Use slash autocomplete to see available commands."]);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
test("input-controller: truly unknown slash commands stop before session.prompt", async () => {
|
|
146
|
+
const { host, prompted, errors, getEditorText } = createHost();
|
|
147
|
+
|
|
148
|
+
await host.defaultEditor.onSubmit("/definitely-not-a-command");
|
|
149
|
+
|
|
150
|
+
assert.deepEqual(prompted, [], "unknown slash commands should not reach session.prompt");
|
|
151
|
+
assert.deepEqual(
|
|
152
|
+
errors,
|
|
153
|
+
["Unknown command: /definitely-not-a-command. Use slash autocomplete to see available commands."],
|
|
154
|
+
);
|
|
155
|
+
assert.equal(getEditorText(), "", "unknown slash commands should clear the editor after showing the error");
|
|
156
|
+
});
|