@opengsd/gsd-pi 1.2.0-dev.b1abb545 → 1.2.0-dev.e8563f58
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/cli-style.d.ts +17 -0
- package/dist/cli-style.js +28 -0
- package/dist/cli.js +1 -1
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +14 -34
- package/dist/mcp-server.js +2 -1
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/resource-loader.js +2 -14
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +5 -4
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
- package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
- package/dist/resources/extensions/async-jobs/index.js +65 -0
- package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
- package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
- package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
- package/dist/resources/extensions/bg-shell/overlay.js +9 -6
- package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
- package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
- package/dist/resources/extensions/bg-shell/utilities.js +5 -2
- package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
- package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
- package/dist/resources/extensions/browser-tools/index.js +69 -12
- package/dist/resources/extensions/claude-code-cli/models.js +9 -0
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +38 -6
- package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +105 -0
- package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
- package/dist/resources/extensions/gsd/auto/loop.js +4 -1
- package/dist/resources/extensions/gsd/auto/orchestrator.js +122 -58
- package/dist/resources/extensions/gsd/auto/phases.js +8 -3
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +8 -32
- package/dist/resources/extensions/gsd/auto-dispatch.js +40 -57
- package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
- package/dist/resources/extensions/gsd/auto-post-unit.js +31 -14
- package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
- package/dist/resources/extensions/gsd/auto-start.js +24 -26
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
- package/dist/resources/extensions/gsd/auto-verification.js +9 -28
- package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +35 -352
- package/dist/resources/extensions/gsd/auto.js +15 -20
- package/dist/resources/extensions/gsd/blocked-models.js +28 -0
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -12
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +229 -36
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +319 -71
- package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
- package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
- package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
- package/dist/resources/extensions/gsd/captures.js +5 -15
- package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
- package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
- package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
- package/dist/resources/extensions/gsd/consent-question.js +353 -0
- package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
- package/dist/resources/extensions/gsd/constants.js +0 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +4 -12
- package/dist/resources/extensions/gsd/db/engine.js +755 -0
- package/dist/resources/extensions/gsd/db/queries.js +398 -0
- package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
- package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
- package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
- package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
- package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
- package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
- package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
- package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
- package/dist/resources/extensions/gsd/doctor-format.js +9 -6
- package/dist/resources/extensions/gsd/doctor-git-checks.js +6 -21
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
- package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
- package/dist/resources/extensions/gsd/error-classifier.js +9 -0
- package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
- package/dist/resources/extensions/gsd/files.js +33 -19
- package/dist/resources/extensions/gsd/git-service.js +1 -0
- package/dist/resources/extensions/gsd/gitignore.js +3 -0
- package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
- package/dist/resources/extensions/gsd/gsd-db.js +172 -2048
- package/dist/resources/extensions/gsd/guidance.js +158 -0
- package/dist/resources/extensions/gsd/guided-flow.js +51 -5
- package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
- package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
- package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
- package/dist/resources/extensions/gsd/migrate/safety.js +20 -9
- package/dist/resources/extensions/gsd/migration-auto-check.js +24 -3
- package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
- package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
- package/dist/resources/extensions/gsd/model-router.js +3 -0
- package/dist/resources/extensions/gsd/notification-store.js +11 -4
- package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
- package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
- package/dist/resources/extensions/gsd/paths.js +37 -24
- package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
- package/dist/resources/extensions/gsd/preferences-models.js +14 -48
- package/dist/resources/extensions/gsd/preferences.js +14 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +6 -4
- package/dist/resources/extensions/gsd/prompts/system.md +5 -2
- package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
- package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
- package/dist/resources/extensions/gsd/publication.js +87 -0
- package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
- package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
- package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
- package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
- package/dist/resources/extensions/gsd/state.js +6 -20
- package/dist/resources/extensions/gsd/status-guards.js +56 -8
- package/dist/resources/extensions/gsd/stop-notice.js +57 -0
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +44 -53
- package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
- package/dist/resources/extensions/gsd/tools/plan-slice.js +12 -6
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +11 -29
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +14 -33
- package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
- package/dist/resources/extensions/gsd/uat-policy.js +42 -16
- package/dist/resources/extensions/gsd/undo.js +8 -7
- package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
- package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
- package/dist/resources/extensions/gsd/unit-registry.js +337 -0
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
- package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
- package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
- package/dist/resources/extensions/gsd/worktree-manager.js +45 -28
- package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
- package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
- package/dist/resources/extensions/gsd/worktree-root.js +28 -6
- package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
- package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
- package/dist/resources/extensions/search-the-web/native-search.js +5 -3
- package/dist/resources/extensions/shared/browser-contract.js +59 -0
- package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
- package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
- package/dist/resources/shared/package-manager-detection.js +1 -1
- package/dist/resources/shared/package.json +3 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
- package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/dist/resources/skills/gsd-browser/SKILL.md +1 -1
- package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.d.ts +2 -0
- package/dist/update-check.js +24 -1
- package/dist/update-cmd.js +20 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
- 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/react-loadable-manifest.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- 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.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- 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.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
- package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/package.json +1 -1
- package/dist/worktree-cli.js +3 -6
- package/dist/worktree-status-banner.js +7 -11
- package/package.json +1 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/rpc.d.ts +1 -0
- package/packages/contracts/dist/rpc.d.ts.map +1 -1
- package/packages/contracts/dist/rpc.js.map +1 -1
- package/packages/contracts/dist/workflow.d.ts +4 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +8 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/cli.js +6 -3
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +4 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +145 -59
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +5 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
- package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +3 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/README.md +1 -0
- package/packages/pi-ai/dist/index.d.ts +2 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +2 -0
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +192 -0
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +166 -0
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +12 -7
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
- package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.js +12 -3
- package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
- package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
- package/packages/pi-ai/package.json +3 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
- package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
- package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
- package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +9 -0
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +5 -4
- package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
- package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
- package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
- package/src/resources/extensions/async-jobs/index.ts +79 -0
- package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
- package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
- package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
- package/src/resources/extensions/bg-shell/overlay.ts +9 -5
- package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
- package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
- package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
- package/src/resources/extensions/bg-shell/utilities.ts +5 -2
- package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
- package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
- package/src/resources/extensions/browser-tools/index.ts +71 -13
- package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
- package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
- package/src/resources/extensions/claude-code-cli/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +40 -4
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +28 -0
- package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +152 -0
- package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
- package/src/resources/extensions/gsd/auto/loop.ts +4 -1
- package/src/resources/extensions/gsd/auto/orchestrator.ts +137 -61
- package/src/resources/extensions/gsd/auto/phases.ts +12 -3
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -32
- package/src/resources/extensions/gsd/auto-dispatch.ts +38 -52
- package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
- package/src/resources/extensions/gsd/auto-post-unit.ts +37 -13
- package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
- package/src/resources/extensions/gsd/auto-start.ts +24 -29
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
- package/src/resources/extensions/gsd/auto-verification.ts +8 -26
- package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +41 -364
- package/src/resources/extensions/gsd/auto.ts +28 -24
- package/src/resources/extensions/gsd/blocked-models.ts +49 -0
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +33 -12
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +270 -37
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +368 -78
- package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
- package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
- package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
- package/src/resources/extensions/gsd/captures.ts +5 -16
- package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
- package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
- package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
- package/src/resources/extensions/gsd/consent-question.ts +431 -0
- package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
- package/src/resources/extensions/gsd/constants.ts +0 -3
- package/src/resources/extensions/gsd/crash-recovery.ts +3 -9
- package/src/resources/extensions/gsd/db/engine.ts +809 -0
- package/src/resources/extensions/gsd/db/queries.ts +490 -0
- package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
- package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
- package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
- package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
- package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
- package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
- package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
- package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
- package/src/resources/extensions/gsd/doctor-format.ts +12 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -22
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
- package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
- package/src/resources/extensions/gsd/error-classifier.ts +11 -0
- package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
- package/src/resources/extensions/gsd/files.ts +33 -12
- package/src/resources/extensions/gsd/git-service.ts +1 -0
- package/src/resources/extensions/gsd/gitignore.ts +3 -0
- package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
- package/src/resources/extensions/gsd/gsd-db.ts +176 -2375
- package/src/resources/extensions/gsd/guidance.ts +217 -0
- package/src/resources/extensions/gsd/guided-flow.ts +50 -5
- package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
- package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
- package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
- package/src/resources/extensions/gsd/migrate/safety.ts +18 -7
- package/src/resources/extensions/gsd/migration-auto-check.ts +28 -3
- package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
- package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
- package/src/resources/extensions/gsd/model-router.ts +3 -0
- package/src/resources/extensions/gsd/notification-store.ts +26 -3
- package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
- package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
- package/src/resources/extensions/gsd/paths.ts +42 -22
- package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
- package/src/resources/extensions/gsd/preferences-models.ts +12 -47
- package/src/resources/extensions/gsd/preferences.ts +18 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +6 -4
- package/src/resources/extensions/gsd/prompts/system.md +5 -2
- package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
- package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
- package/src/resources/extensions/gsd/publication.ts +122 -0
- package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
- package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
- package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
- package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
- package/src/resources/extensions/gsd/state.ts +9 -21
- package/src/resources/extensions/gsd/status-guards.ts +59 -8
- package/src/resources/extensions/gsd/stop-notice.ts +75 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +198 -26
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
- package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
- package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +10 -10
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
- package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +74 -59
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +199 -0
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +85 -1
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +248 -1
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +43 -6
- package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
- package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +22 -1
- package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +109 -1
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +43 -68
- package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
- package/src/resources/extensions/gsd/tools/plan-slice.ts +12 -6
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +11 -38
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +14 -42
- package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
- package/src/resources/extensions/gsd/uat-policy.ts +62 -16
- package/src/resources/extensions/gsd/undo.ts +9 -8
- package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
- package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
- package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
- package/src/resources/extensions/gsd/unit-registry.ts +412 -0
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
- package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
- package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +13 -9
- package/src/resources/extensions/gsd/worktree-manager.ts +47 -28
- package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
- package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
- package/src/resources/extensions/gsd/worktree-root.ts +29 -6
- package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
- package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
- package/src/resources/extensions/search-the-web/native-search.ts +5 -3
- package/src/resources/extensions/shared/browser-contract.ts +66 -0
- package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
- package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
- package/src/resources/shared/package-manager-detection.ts +1 -1
- package/src/resources/shared/package.json +3 -0
- package/src/resources/skills/create-skill/references/executable-code.md +1 -1
- package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/src/resources/skills/gsd-browser/SKILL.md +1 -1
- package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
- package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
- /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → LDHRKiRBIVZmiuMjrL1Vy}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → LDHRKiRBIVZmiuMjrL1Vy}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input-controller.js","sourceRoot":"","sources":["../../../../src/modes/interactive/controllers/input-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ImageContent } from \"@gsd/pi-ai\";\nimport { dispatchSlashCommand } from \"../slash-command-handlers.js\";\nimport type { InteractiveModeStateHost } from \"../interactive-mode-state.js\";\nimport type { ContextualTips } from \"@gsd/agent-core\";\n\n/**\n * Consume and clear any pending pasted images from the host.\n * Returns undefined if there are no pending images.\n */\nfunction consumePendingImages(host: InteractiveModeStateHost): ImageContent[] | undefined {\n\tif (host.pendingImages.length === 0) return undefined;\n\tconst images = [...host.pendingImages];\n\thost.pendingImages.length = 0;\n\treturn images;\n}\n\nfunction markEditorSubmitLatency(host: InteractiveModeStateHost, images: ImageContent[] | undefined): void {\n\thost.session.beginTurnLatency?.({ source: \"tui\", trigger: \"editor_submit\" });\n\thost.session.markTurnLatency?.(\"tui.editor_submit\", { images: images?.length ?? 0 });\n}\n\nexport function setupEditorSubmitHandler(host: InteractiveModeStateHost & {\n\tgetSlashCommandContext: () => any;\n\thandleBashCommand: (command: string, excludeFromContext?: boolean) => Promise<void>;\n\tshowWarning: (message: string) => void;\n\tshowError: (message: string) => void;\n\tshowTip: (message: string) => void;\n\tupdateEditorBorderColor: () => void;\n\tisExtensionCommand: (text: string) => boolean;\n\tisKnownSlashCommand: (text: string) => boolean;\n\tqueueCompactionMessage: (text: string, mode: \"steer\" | \"followUp\") => void;\n\tupdatePendingMessagesDisplay: () => void;\n\tflushPendingBashComponents: () => void;\n\tcontextualTips: ContextualTips;\n\tgetContextPercent: () => number | undefined;\n\toptions?: { submitPromptsDirectly?: boolean };\n}): void {\n\thost.defaultEditor.onSubmit = async (text: string) => {\n\t\ttext = text.trim();\n\t\tif (!text) return;\n\n\t\tif (text.startsWith(\"/\") && !looksLikeFilePath(text)) {\n\t\t\tconst handled = await dispatchSlashCommand(text, host.getSlashCommandContext());\n\t\t\tif (handled) {\n\t\t\t\thost.editor.setText(\"\");\n\t\t\t\tconsumePendingImages(host); // discard images on slash command\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!host.isKnownSlashCommand(text)) {\n\t\t\t\tconst command = text.split(/\\s/)[0];\n\t\t\t\thost.showError(`Unknown command: ${command}. Use slash autocomplete to see available commands.`);\n\t\t\t\thost.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (text.startsWith(\"!\")) {\n\t\t\tconst isExcluded = text.startsWith(\"!!\");\n\t\t\tconst command = isExcluded ? text.slice(2).trim() : text.slice(1).trim();\n\t\t\tif (command) {\n\t\t\t\tif (host.session.isBashRunning) {\n\t\t\t\t\thost.showWarning(\"A bash command is already running. Press Esc to cancel it first.\");\n\t\t\t\t\thost.editor.setText(text);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Track included bash commands for double-bang tip\n\t\t\t\tif (!isExcluded) {\n\t\t\t\t\thost.contextualTips.recordBashIncluded();\n\t\t\t\t}\n\t\t\t\thost.editor.addToHistory?.(text);\n\t\t\t\tawait host.handleBashCommand(command, isExcluded);\n\t\t\t\thost.isBashMode = false;\n\t\t\t\thost.updateEditorBorderColor();\n\t\t\t\tconsumePendingImages(host); // discard images on bash command\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Evaluate contextual tips before sending to agent\n\t\tconst tip = host.contextualTips.evaluate({\n\t\t\tinput: text,\n\t\t\tisStreaming: host.session.isStreaming,\n\t\t\tthinkingLevel: host.session.thinkingLevel,\n\t\t\tcontextPercent: host.getContextPercent(),\n\t\t});\n\t\tif (tip) {\n\t\t\thost.showTip(tip);\n\t\t}\n\n\t\tif (host.onInputCallback) {\n\t\t\thost.onInputCallback(text);\n\t\t\thost.editor.addToHistory?.(text);\n\t\t\treturn;\n\t\t}\n\n\t\t// Consume pending images for prompt submissions\n\t\tconst images = consumePendingImages(host);\n\n\t\tif (host.session.isCompacting) {\n\t\t\tif (host.isExtensionCommand(text)) {\n\t\t\t\thost.editor.addToHistory?.(text);\n\t\t\t\thost.editor.setText(\"\");\n\t\t\t\ttry {\n\t\t\t\t\tawait host.session.prompt(text, { images });\n\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\tconst errorMessage = error instanceof Error ? error.message : \"Unknown error occurred\";\n\t\t\t\t\thost.showError(errorMessage);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\thost.queueCompactionMessage(text, \"steer\");\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (host.session.isStreaming) {\n\t\t\thost.editor.addToHistory?.(text);\n\t\t\thost.editor.setText(\"\");\n\t\t\tawait host.session.prompt(text, { streamingBehavior: \"steer\", images });\n\t\t\thost.updatePendingMessagesDisplay();\n\t\t\thost.ui.requestRender();\n\t\t\treturn;\n\t\t}\n\n\t\thost.flushPendingBashComponents();\n\n\t\tif (host.options?.submitPromptsDirectly) {\n\t\t\thost.editor.addToHistory?.(text);\n\t\t\ttry {\n\t\t\t\tmarkEditorSubmitLatency(host, images);\n\t\t\t\tawait host.session.prompt(text, { images });\n\t\t\t} catch (error: unknown) {\n\t\t\t\tconst errorMessage = error instanceof Error ? error.message : \"Unknown error occurred\";\n\t\t\t\thost.showError(errorMessage);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\thost.editor.addToHistory?.(text);\n\t\t// submitPromptsDirectly is false; still dispatch via session.prompt so user input\n\t\t// is not silently discarded.\n\t\ttry {\n\t\t\tmarkEditorSubmitLatency(host, images);\n\t\t\tawait host.session.prompt(text, { images });\n\t\t} catch (error: unknown) {\n\t\t\tconst errorMessage = error instanceof Error ? error.message : \"Unknown error occurred\";\n\t\t\thost.showError(errorMessage);\n\t\t}\n\t};\n}\n\n/**\n * Distinguish absolute file paths from slash commands (#3478).\n * Drag-and-drop inserts paths like \"/Users/name/Desktop/file.png\" which\n * should be treated as plain text input, not a /Users command.\n *\n * Heuristic: a slash command is a single token like \"/help\" or \"/gsd auto\".\n * File paths have a second \"/\" within the first token (e.g., \"/Users/...\").\n */\nfunction looksLikeFilePath(text: string): boolean {\n\tconst firstToken = text.split(/\\s/)[0];\n\t// Slash commands: /help, /gsd, /commit — single \"/\" at start only.\n\t// File paths: /Users/name/file, /home/user/file, /tmp/x — contain \"/\" after position 0.\n\treturn firstToken.indexOf(\"/\", 1) !== -1;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"input-controller.js","sourceRoot":"","sources":["../../../../src/modes/interactive/controllers/input-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ImageContent } from \"@gsd/pi-ai\";\nimport { dispatchSlashCommand } from \"../slash-command-handlers.js\";\nimport type { InteractiveModeStateHost } from \"../interactive-mode-state.js\";\nimport type { ContextualTips } from \"@gsd/agent-core\";\n\n/**\n * Consume and clear any pending pasted images from the host.\n * Returns undefined if there are no pending images.\n */\nfunction consumePendingImages(host: InteractiveModeStateHost): ImageContent[] | undefined {\n\tif (host.pendingImages.length === 0) return undefined;\n\tconst images = [...host.pendingImages];\n\thost.pendingImages.length = 0;\n\treturn images;\n}\n\nfunction markEditorSubmitLatency(host: InteractiveModeStateHost, images: ImageContent[] | undefined): void {\n\thost.session.beginTurnLatency?.({ source: \"tui\", trigger: \"editor_submit\" });\n\thost.session.markTurnLatency?.(\"tui.editor_submit\", { images: images?.length ?? 0 });\n}\n\nfunction wireEditorSubmitHandler(\n\thost: InteractiveModeStateHost & { editor: { onSubmit?: (text: string) => void | Promise<void> } },\n\thandler: (text: string) => Promise<void>,\n): void {\n\thost.defaultEditor.onSubmit = handler;\n\tif (host.editor !== host.defaultEditor) {\n\t\thost.editor.onSubmit = handler;\n\t}\n}\n\nexport function setupEditorSubmitHandler(host: InteractiveModeStateHost & {\n\tgetSlashCommandContext: () => any;\n\thandleBashCommand: (command: string, excludeFromContext?: boolean) => Promise<void>;\n\tshowWarning: (message: string) => void;\n\tshowError: (message: string) => void;\n\tshowTip: (message: string) => void;\n\tupdateEditorBorderColor: () => void;\n\tisExtensionCommand: (text: string) => boolean;\n\tisKnownSlashCommand: (text: string) => boolean;\n\tqueueCompactionMessage: (text: string, mode: \"steer\" | \"followUp\") => void;\n\tupdatePendingMessagesDisplay: () => void;\n\tflushPendingBashComponents: () => void;\n\tcontextualTips: ContextualTips;\n\tgetContextPercent: () => number | undefined;\n\toptions?: { submitPromptsDirectly?: boolean };\n}): void {\n\tconst onSubmit = async (text: string) => {\n\t\ttext = text.trim();\n\t\tif (!text) return;\n\n\t\tif (text.startsWith(\"/\") && !looksLikeFilePath(text)) {\n\t\t\tconst handled = await dispatchSlashCommand(text, host.getSlashCommandContext());\n\t\t\tif (handled) {\n\t\t\t\thost.editor.setText(\"\");\n\t\t\t\tconsumePendingImages(host); // discard images on slash command\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!host.isKnownSlashCommand(text)) {\n\t\t\t\tconst command = text.split(/\\s/)[0];\n\t\t\t\thost.showError(`Unknown command: ${command}. Use slash autocomplete to see available commands.`);\n\t\t\t\thost.editor.setText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (text.startsWith(\"!\")) {\n\t\t\tconst isExcluded = text.startsWith(\"!!\");\n\t\t\tconst command = isExcluded ? text.slice(2).trim() : text.slice(1).trim();\n\t\t\tif (command) {\n\t\t\t\tif (host.session.isBashRunning) {\n\t\t\t\t\thost.showWarning(\"A bash command is already running. Press Esc to cancel it first.\");\n\t\t\t\t\thost.editor.setText(text);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Track included bash commands for double-bang tip\n\t\t\t\tif (!isExcluded) {\n\t\t\t\t\thost.contextualTips.recordBashIncluded();\n\t\t\t\t}\n\t\t\t\thost.editor.addToHistory?.(text);\n\t\t\t\tawait host.handleBashCommand(command, isExcluded);\n\t\t\t\thost.isBashMode = false;\n\t\t\t\thost.updateEditorBorderColor();\n\t\t\t\tconsumePendingImages(host); // discard images on bash command\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Evaluate contextual tips before sending to agent\n\t\tconst tip = host.contextualTips.evaluate({\n\t\t\tinput: text,\n\t\t\tisStreaming: host.session.isStreaming,\n\t\t\tthinkingLevel: host.session.thinkingLevel,\n\t\t\tcontextPercent: host.getContextPercent(),\n\t\t});\n\t\tif (tip) {\n\t\t\thost.showTip(tip);\n\t\t}\n\n\t\tif (host.onInputCallback) {\n\t\t\thost.onInputCallback(text);\n\t\t\thost.editor.addToHistory?.(text);\n\t\t\treturn;\n\t\t}\n\n\t\t// Consume pending images for prompt submissions\n\t\tconst images = consumePendingImages(host);\n\n\t\tif (host.session.isCompacting) {\n\t\t\tif (host.isExtensionCommand(text)) {\n\t\t\t\thost.editor.addToHistory?.(text);\n\t\t\t\thost.editor.setText(\"\");\n\t\t\t\ttry {\n\t\t\t\t\tawait host.session.prompt(text, { images });\n\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\tconst errorMessage = error instanceof Error ? error.message : \"Unknown error occurred\";\n\t\t\t\t\thost.showError(errorMessage);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\thost.queueCompactionMessage(text, \"steer\");\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (host.session.isStreaming) {\n\t\t\thost.editor.addToHistory?.(text);\n\t\t\thost.editor.setText(\"\");\n\t\t\tawait host.session.prompt(text, { streamingBehavior: \"steer\", images });\n\t\t\thost.updatePendingMessagesDisplay();\n\t\t\thost.ui.requestRender();\n\t\t\treturn;\n\t\t}\n\n\t\thost.flushPendingBashComponents();\n\n\t\tif (host.options?.submitPromptsDirectly) {\n\t\t\thost.editor.addToHistory?.(text);\n\t\t\ttry {\n\t\t\t\tmarkEditorSubmitLatency(host, images);\n\t\t\t\tawait host.session.prompt(text, { images });\n\t\t\t} catch (error: unknown) {\n\t\t\t\tconst errorMessage = error instanceof Error ? error.message : \"Unknown error occurred\";\n\t\t\t\thost.showError(errorMessage);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\thost.editor.addToHistory?.(text);\n\t\t// submitPromptsDirectly is false; still dispatch via session.prompt so user input\n\t\t// is not silently discarded.\n\t\ttry {\n\t\t\tmarkEditorSubmitLatency(host, images);\n\t\t\tawait host.session.prompt(text, { images });\n\t\t} catch (error: unknown) {\n\t\t\tconst errorMessage = error instanceof Error ? error.message : \"Unknown error occurred\";\n\t\t\thost.showError(errorMessage);\n\t\t}\n\t};\n\n\twireEditorSubmitHandler(host, onSubmit);\n}\n\n/**\n * Distinguish absolute file paths from slash commands (#3478).\n * Drag-and-drop inserts paths like \"/Users/name/Desktop/file.png\" which\n * should be treated as plain text input, not a /Users command.\n *\n * Heuristic: a slash command is a single token like \"/help\" or \"/gsd auto\".\n * File paths have a second \"/\" within the first token (e.g., \"/Users/...\").\n */\nfunction looksLikeFilePath(text: string): boolean {\n\tconst firstToken = text.split(/\\s/)[0];\n\t// Slash commands: /help, /gsd, /commit — single \"/\" at start only.\n\t// File paths: /Users/name/file, /home/user/file, /tmp/x — contain \"/\" after position 0.\n\treturn firstToken.indexOf(\"/\", 1) !== -1;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-chat-render.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-chat-render.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAoB,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8CAA8C,CAAC;AAiBnF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAEtF,+CAA+C;AAChD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,2BAA2B,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAO7F;AAED;;;;;GAKG;AACJ,wBAAgB,UAAU,CAAC,IAAI,EAAE,2BAA2B,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAmBlH;AAmBF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,2BAA2B,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAkGvI;AAED;;;GAGG;AACJ,wBAAgB,eAAe,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAKtE;AAED;;;;;GAKG;AACJ,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,2BAA2B,EACpE,cAAc,EAAE,cAAc,EAC9B,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CAAO,GACjE,IAAI,
|
|
1
|
+
{"version":3,"file":"interactive-chat-render.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-chat-render.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAoB,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8CAA8C,CAAC;AAiBnF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAEtF,+CAA+C;AAChD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,2BAA2B,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAO7F;AAED;;;;;GAKG;AACJ,wBAAgB,UAAU,CAAC,IAAI,EAAE,2BAA2B,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAmBlH;AAmBF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,2BAA2B,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAkGvI;AAED;;;GAGG;AACJ,wBAAgB,eAAe,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAKtE;AAED;;;;;GAKG;AACJ,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,2BAA2B,EACpE,cAAc,EAAE,cAAc,EAC9B,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CAAO,GACjE,IAAI,CA6IN;AAEF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAc5E;AAEF,wBAAsB,YAAY,CAAC,IAAI,EAAE,2BAA2B,GAAG,OAAO,CAAC,MAAM,CAAC,CAOpF;AAEF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAS9E;AAED;;;GAGG;AACJ,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,2BAA2B,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAI,CAyC3G"}
|
|
@@ -195,7 +195,17 @@ export function renderSessionContext(host, sessionContext, options = {}) {
|
|
|
195
195
|
const component = new ToolExecutionComponent(content.name, content.arguments, { showImages: host.settingsManager.getShowImages() }, host.getRegisteredToolDefinition(content.name), host.ui);
|
|
196
196
|
component.setExpanded(host.toolOutputExpanded);
|
|
197
197
|
host.chatContainer.addChild(component);
|
|
198
|
-
|
|
198
|
+
// On an aborted/errored turn, only the tool calls that never
|
|
199
|
+
// produced a result should render as interrupted. A tool that
|
|
200
|
+
// actually completed has its result in a later `toolResult`
|
|
201
|
+
// message (keyed by toolCallId) — register it as pending so the
|
|
202
|
+
// normal toolResult handler below renders the TRUE result with
|
|
203
|
+
// its real isError flag. Otherwise the successful result would be
|
|
204
|
+
// silently discarded and the row shown red.
|
|
205
|
+
const turnAbortedOrErrored = message.stopReason === "aborted" || message.stopReason === "error";
|
|
206
|
+
const hasRealResult = turnAbortedOrErrored &&
|
|
207
|
+
sessionContext.messages.some((m) => m.role === "toolResult" && m.toolCallId === content.id);
|
|
208
|
+
if (turnAbortedOrErrored && !hasRealResult) {
|
|
199
209
|
let errorMessage;
|
|
200
210
|
if (message.stopReason === "aborted") {
|
|
201
211
|
const retryAttempt = host.session.retryAttempt;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-chat-render.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-chat-render.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Extracted from interactive-mode.ts (Phase E2 seam remediation).\n\nimport type { AgentMessage } from \"@gsd/pi-agent-core\";\nimport type { AssistantMessage, Message } from \"@gsd/pi-ai\";\nimport { parseSkillBlock } from \"@gsd/agent-core\";\nimport type { SessionContext } from \"@gsd/pi-coding-agent/core/session-manager.js\";\nimport type { TruncationResult } from \"@gsd/pi-coding-agent/core/tools/truncate.js\";\nimport { Container, Markdown, Spacer, Text } from \"@gsd/pi-tui\";\nimport { theme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport { AssistantMessageComponent } from \"./components/assistant-message.js\";\nimport { chatTurnFollowsUser, reconcileChatTurnConnections } from \"./components/chat-turn-connect.js\";\nimport { BashExecutionComponent } from \"./components/bash-execution.js\";\nimport { BranchSummaryMessageComponent } from \"./components/branch-summary-message.js\";\nimport { CompactionSummaryMessageComponent } from \"./components/compaction-summary-message.js\";\nimport { CustomMessageComponent } from \"./components/custom-message.js\";\nimport { DynamicBorder } from \"./components/dynamic-border.js\";\nimport { SkillInvocationMessageComponent } from \"./components/skill-invocation-message.js\";\nimport { ToolExecutionComponent } from \"./components/tool-execution.js\";\nimport { UserMessageComponent } from \"./components/user-message.js\";\nimport { asServerToolUse, asWebSearchResult, isToolContentBlock } from \"./gsd-content-blocks.js\";\nimport { buildAssistantReplaySegments } from \"./interactive-notify-render.js\";\nimport { MAX_CHAT_COMPONENTS } from \"./interactive-mode-class-constants.js\";\nimport type { InteractiveModeDelegateHost } from \"./interactive-mode-delegate-host.js\";\n\n\t/** Extract text content from a user message */\nexport function getUserMessageText(host: InteractiveModeDelegateHost, message: Message): string {\n\t\tif (message.role !== \"user\") return \"\";\n\t\tconst textBlocks =\n\t\t\ttypeof message.content === \"string\"\n\t\t\t\t? [{ type: \"text\", text: message.content }]\n\t\t\t\t: message.content.filter((c: { type: string }) => c.type === \"text\");\n\t\treturn textBlocks.map((c) => (c as { text: string }).text).join(\"\");\n\t}\n\n\t/**\n\t * Show a status message in the chat.\n\t *\n\t * If multiple status messages are emitted back-to-back (without anything else being added to the chat),\n\t * we update the previous status line instead of appending new ones to avoid log spam.\n\t */\nexport function showStatus(host: InteractiveModeDelegateHost, message: string, options?: { append?: boolean }): void {\n\t\tconst append = options?.append ?? false;\n\t\tconst children = host.chatContainer.children;\n\t\tconst last = children.length > 0 ? children[children.length - 1] : undefined;\n\t\tconst secondLast = children.length > 1 ? children[children.length - 2] : undefined;\n\n\t\tif (!append && last && secondLast && last === host.lastStatusText && secondLast === host.lastStatusSpacer) {\n\t\t\thost.lastStatusText.setText(theme.fg(\"dim\", message));\n\t\t\thost.ui.requestRender();\n\t\t\treturn;\n\t\t}\n\n\t\tconst spacer = new Spacer(1);\n\t\tconst text = new Text(theme.fg(\"dim\", message), 1, 0);\n\t\thost.chatContainer.addChild(spacer);\n\t\thost.chatContainer.addChild(text);\n\t\thost.lastStatusSpacer = spacer;\n\t\thost.lastStatusText = text;\n\t\thost.ui.requestRender();\n\t}\n\nfunction addUserMessageComponent(host: InteractiveModeDelegateHost, userComponent: UserMessageComponent): void {\n\thost.chatContainer.addChild(userComponent);\n}\n\nfunction hasAssistantVisibleContent(content: Array<any>, hideThinkingBlock: boolean): boolean {\n\treturn content.some((c: any) => {\n\t\tif (c?.type === \"text\" && typeof c.text === \"string\" && c.text.trim().length > 0) return true;\n\t\tif (!hideThinkingBlock && c?.type === \"thinking\" && typeof c.thinking === \"string\" && c.thinking.trim().length > 0) return true;\n\t\treturn false;\n\t});\n}\n\nfunction finalizeChatMutation(host: InteractiveModeDelegateHost): void {\n\ttrimChatHistory(host);\n\treconcileChatTurnConnections(host.chatContainer.children);\n}\n\nexport function addMessageToChat(host: InteractiveModeDelegateHost, message: AgentMessage, options?: { populateHistory?: boolean }): void {\n\t\tconst timestampFormat = host.settingsManager.getTimestampFormat();\n\t\tswitch (message.role) {\n\t\t\tcase \"bashExecution\": {\n\t\t\t\tconst component = new BashExecutionComponent(message.command, host.ui, message.excludeFromContext);\n\t\t\t\tif (message.output) {\n\t\t\t\t\tcomponent.appendOutput(message.output);\n\t\t\t\t}\n\t\t\t\tcomponent.setComplete(\n\t\t\t\t\tmessage.exitCode,\n\t\t\t\t\tmessage.cancelled,\n\t\t\t\t\tmessage.truncated ? ({ truncated: true } as TruncationResult) : undefined,\n\t\t\t\t\tmessage.fullOutputPath,\n\t\t\t\t);\n\t\t\t\thost.chatContainer.addChild(component);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"custom\": {\n\t\t\t\tif (message.display) {\n\t\t\t\t\tconst renderer = host.session.extensionRunner?.getMessageRenderer(message.customType);\n\t\t\t\t\tconst component = new CustomMessageComponent(message, renderer, host.getMarkdownThemeWithSettings());\n\t\t\t\t\tcomponent.setExpanded(host.toolOutputExpanded);\n\t\t\t\t\thost.chatContainer.addChild(component);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"compactionSummary\": {\n\t\t\t\thost.chatContainer.addChild(new Spacer(1));\n\t\t\t\tconst component = new CompactionSummaryMessageComponent(message, host.getMarkdownThemeWithSettings());\n\t\t\t\tcomponent.setExpanded(host.toolOutputExpanded);\n\t\t\t\thost.chatContainer.addChild(component);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"branchSummary\": {\n\t\t\t\thost.chatContainer.addChild(new Spacer(1));\n\t\t\t\tconst component = new BranchSummaryMessageComponent(message, host.getMarkdownThemeWithSettings());\n\t\t\t\tcomponent.setExpanded(host.toolOutputExpanded);\n\t\t\t\thost.chatContainer.addChild(component);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"user\": {\n\t\t\t\tconst textContent = getUserMessageText(host, message);\n\t\t\t\tif (textContent) {\n\t\t\t\t\tconst skillBlock = parseSkillBlock(textContent);\n\t\t\t\t\tif (skillBlock) {\n\t\t\t\t\t\t// Render skill block (collapsible)\n\t\t\t\t\t\thost.chatContainer.addChild(new Spacer(1));\n\t\t\t\t\t\tconst component = new SkillInvocationMessageComponent(\n\t\t\t\t\t\t\tskillBlock,\n\t\t\t\t\t\t\thost.getMarkdownThemeWithSettings(),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcomponent.setExpanded(host.toolOutputExpanded);\n\t\t\t\t\t\thost.chatContainer.addChild(component);\n\t\t\t\t\t\t// Render user message separately if present\n\t\t\t\t\t\tif (skillBlock.userMessage) {\n\t\t\t\t\t\t\tconst userComponent = new UserMessageComponent(\n\t\t\t\t\t\t\t\tskillBlock.userMessage,\n\t\t\t\t\t\t\t\thost.getMarkdownThemeWithSettings(),\n\t\t\t\t\t\t\t\tmessage.timestamp,\n\t\t\t\t\t\t\t\ttimestampFormat,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\taddUserMessageComponent(host, userComponent);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst userComponent = new UserMessageComponent(textContent, host.getMarkdownThemeWithSettings(), message.timestamp, timestampFormat);\n\t\t\t\t\t\taddUserMessageComponent(host, userComponent);\n\t\t\t\t\t}\n\t\t\t\t\tif (options?.populateHistory) {\n\t\t\t\t\t\thost.editor.addToHistory?.(textContent);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"assistant\": {\n\t\t\t\tconst hasToolBlocks = message.content.some((c: any) => isToolContentBlock(c));\n\t\t\t\tconst isAbortOrError = message.stopReason === \"aborted\" || message.stopReason === \"error\";\n\t\t\t\tif (!hasAssistantVisibleContent(message.content, host.hideThinkingBlock) && !(isAbortOrError && !hasToolBlocks)) break;\n\t\t\t\tconst connectedToUser = chatTurnFollowsUser(host.chatContainer.children);\n\t\t\t\tconst assistantComponent = new AssistantMessageComponent(\n\t\t\t\t\tmessage,\n\t\t\t\t\thost.hideThinkingBlock,\n\t\t\t\t\thost.getMarkdownThemeWithSettings(),\n\t\t\t\t\ttimestampFormat,\n\t\t\t\t\tundefined,\n\t\t\t\t\tconnectedToUser,\n\t\t\t\t);\n\t\t\t\thost.chatContainer.addChild(assistantComponent);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"toolResult\": {\n\t\t\t\t// Tool results are rendered inline with tool calls, handled separately\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tconst _exhaustive: never = message;\n\t\t\t}\n\t\t}\n\t\tfinalizeChatMutation(host);\n\t}\n\n\t/**\n\t * Remove oldest components when chat exceeds MAX_CHAT_COMPONENTS.\n\t * Only render-components are removed — session data stays in SessionManager.\n\t */\nexport function trimChatHistory(host: InteractiveModeDelegateHost): void {\n\t\twhile (host.chatContainer.children.length > MAX_CHAT_COMPONENTS) {\n\t\t\tconst oldest = host.chatContainer.children[0];\n\t\t\thost.chatContainer.removeChild(oldest);\n\t\t}\n\t}\n\n\t/**\n\t * Render session context to chat. Used for initial load and rebuild after compaction.\n\t * @param sessionContext Session context to render\n\t * @param options.updateFooter Update footer state\n\t * @param options.populateHistory Add user messages to editor history\n\t */\nexport function renderSessionContext(host: InteractiveModeDelegateHost, \n\t\tsessionContext: SessionContext,\n\t\toptions: { updateFooter?: boolean; populateHistory?: boolean } = {},\n\t): void {\n\t\thost.pendingTools.clear();\n\t\tconst timestampFormat = host.settingsManager.getTimestampFormat();\n\n\t\tif (options.updateFooter) {\n\t\t\thost.footer.invalidate();\n\t\t\thost.updateEditorBorderColor();\n\t\t}\n\n\t\tfor (const message of sessionContext.messages) {\n\t\t\t// Assistant messages need special handling for tool calls\n\t\t\tif (message.role === \"assistant\") {\n\t\t\t\tconst hasToolBlocks = message.content.some((c) => isToolContentBlock(c));\n\t\t\t\tif (!hasToolBlocks) {\n\t\t\t\t\taddMessageToChat(host, message);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst assistantSegments: AssistantMessageComponent[] = [];\n\t\t\t\tconst replaySegments = buildAssistantReplaySegments(message.content);\n\n\t\t\t\tfor (const segment of replaySegments) {\n\t\t\t\t\tif (segment.kind === \"assistant\") {\n\t\t\t\t\t\tconst segContent = message.content.slice(segment.startIndex, segment.endIndex + 1);\n\t\t\t\t\t\tif (!hasAssistantVisibleContent(segContent, host.hideThinkingBlock)) continue;\n\t\t\t\t\t\tconst connectedToUser = chatTurnFollowsUser(host.chatContainer.children);\n\t\t\t\t\t\tconst assistantComponent = new AssistantMessageComponent(\n\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t\thost.hideThinkingBlock,\n\t\t\t\t\t\t\thost.getMarkdownThemeWithSettings(),\n\t\t\t\t\t\t\ttimestampFormat,\n\t\t\t\t\t\t\t{ startIndex: segment.startIndex, endIndex: segment.endIndex },\n\t\t\t\t\t\t\tconnectedToUser,\n\t\t\t\t\t\t);\n\t\t\t\t\t\thost.chatContainer.addChild(assistantComponent);\n\t\t\t\t\t\tassistantSegments.push(assistantComponent);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst content = message.content[segment.contentIndex];\n\t\t\t\t\tif (content.type === \"toolCall\") {\n\t\t\t\t\t\tconst component = new ToolExecutionComponent(\n\t\t\t\t\t\t\tcontent.name,\n\t\t\t\t\t\t\tcontent.arguments,\n\t\t\t\t\t\t\t{ showImages: host.settingsManager.getShowImages() },\n\t\t\t\t\t\t\thost.getRegisteredToolDefinition(content.name),\n\t\t\t\t\t\t\thost.ui,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcomponent.setExpanded(host.toolOutputExpanded);\n\t\t\t\t\t\thost.chatContainer.addChild(component);\n\n\t\t\t\t\t\tif (message.stopReason === \"aborted\" || message.stopReason === \"error\") {\n\t\t\t\t\t\t\tlet errorMessage: string;\n\t\t\t\t\t\t\tif (message.stopReason === \"aborted\") {\n\t\t\t\t\t\t\t\tconst retryAttempt = host.session.retryAttempt;\n\t\t\t\t\t\t\t\terrorMessage =\n\t\t\t\t\t\t\t\t\tretryAttempt > 0\n\t\t\t\t\t\t\t\t\t\t? `Aborted after ${retryAttempt} retry attempt${retryAttempt > 1 ? \"s\" : \"\"}`\n\t\t\t\t\t\t\t\t\t\t: \"Operation aborted\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\terrorMessage = message.errorMessage || \"Error\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcomponent.updateResult({ content: [{ type: \"text\", text: errorMessage }], isError: true });\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\thost.pendingTools.set(content.id, component);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst serverTool = asServerToolUse(content);\n\t\t\t\t\t\tif (serverTool) {\n\t\t\t\t\t\t// Server-side tool (e.g., native web search)\n\t\t\t\t\t\tconst component = new ToolExecutionComponent(\n\t\t\t\t\t\t\tserverTool.name,\n\t\t\t\t\t\t\tserverTool.input ?? {},\n\t\t\t\t\t\t\t{ showImages: host.settingsManager.getShowImages() },\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\thost.ui,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcomponent.setExpanded(host.toolOutputExpanded);\n\t\t\t\t\t\thost.chatContainer.addChild(component);\n\t\t\t\t\t\t// Find matching webSearchResult in host message's content\n\t\t\t\t\t\tconst resultBlock = message.content\n\t\t\t\t\t\t\t.map(asWebSearchResult)\n\t\t\t\t\t\t\t.find((block) => block && block.toolUseId === serverTool.id);\n\t\t\t\t\t\tif (resultBlock) {\n\t\t\t\t\t\t\tconst searchContent = resultBlock.content;\n\t\t\t\t\t\t\tconst isError = searchContent && typeof searchContent === \"object\" && \"type\" in (searchContent as any) && (searchContent as any).type === \"web_search_tool_result_error\";\n\t\t\t\t\t\t\tconst resultText = host.formatWebSearchResult(searchContent);\n\t\t\t\t\t\t\tcomponent.updateResult({\n\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: resultText }],\n\t\t\t\t\t\t\t\tisError: !!isError,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// No result yet (aborted stream?) — show as pending\n\t\t\t\t\t\t\thost.pendingTools.set(serverTool.id, component);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Match streaming-mode behavior: show metadata once on the final\n\t\t\t\t// assistant prose segment for host message.\n\t\t\t\tconst lastAssistantSegment = assistantSegments[assistantSegments.length - 1];\n\t\t\t\tlastAssistantSegment?.setShowMetadata(true);\n\t\t\t} else if (message.role === \"toolResult\") {\n\t\t\t\t// Match tool results to pending tool components\n\t\t\t\tconst component = host.pendingTools.get(message.toolCallId);\n\t\t\t\tif (component) {\n\t\t\t\t\tcomponent.updateResult(message);\n\t\t\t\t\thost.pendingTools.delete(message.toolCallId);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// All other messages use standard rendering\n\t\t\t\taddMessageToChat(host, message, options);\n\t\t\t}\n\t\t}\n\n\t\t// Any pendingTools entries left over after replay are historical tool\n\t\t// calls whose results were squashed out of session context (commonly by\n\t\t// compaction). Mark them finished so the frame stops showing \"Running\".\n\t\tfor (const component of host.pendingTools.values()) {\n\t\t\tcomponent.markHistoricalNoResult();\n\t\t}\n\t\thost.pendingTools.clear();\n\t\ttrimChatHistory(host);\n\t\treconcileChatTurnConnections(host.chatContainer.children);\n\t\thost.ui.requestRender();\n\t}\n\nexport function renderInitialMessages(host: InteractiveModeDelegateHost): void {\n\t\tconst context = host.sessionManager.buildSessionContext();\n\t\trenderSessionContext(host, context, {\n\t\t\tupdateFooter: true,\n\t\t\tpopulateHistory: true,\n\t\t});\n\t\tpopulatePinnedFromMessages(host, context.messages);\n\n\t\tconst allEntries = host.sessionManager.getEntries();\n\t\tconst compactionCount = allEntries.filter((e: { type: string }) => e.type === \"compaction\").length;\n\t\tif (compactionCount > 0) {\n\t\t\tconst times = compactionCount === 1 ? \"1 time\" : `${compactionCount} times`;\n\t\t\tshowStatus(host, `Session compacted ${times}`);\n\t\t}\n\t}\n\nexport async function getUserInput(host: InteractiveModeDelegateHost): Promise<string> {\n\t\treturn new Promise((resolve) => {\n\t\t\thost.onInputCallback = (text: string) => {\n\t\t\t\thost.onInputCallback = undefined;\n\t\t\t\tresolve(text);\n\t\t\t};\n\t\t});\n\t}\n\nexport function rebuildChatFromMessages(host: InteractiveModeDelegateHost): void {\n\t\thost.chatContainer.clear();\n\t\thost.pinnedMessageContainer.clear();\n\t\tconst context = host.sessionManager.buildSessionContext();\n\t\trenderSessionContext(host, context);\n\t\t// Pinned content NOT re-populated here — the streaming lifecycle in\n\t\t// chat-controller.ts manages the pinned zone during active work.\n\t\t// populatePinnedFromMessages() remains in renderInitialMessages()\n\t\t// for the session-resume case at startup.\n\t}\n\n\t/**\n\t * After rebuilding chat from messages, pin the last assistant text above the\n\t * editor if tool results would otherwise push it out of the viewport.\n\t */\nexport function populatePinnedFromMessages(host: InteractiveModeDelegateHost, messages: AgentMessage[]): void {\n\t\thost.pinnedMessageContainer.clear();\n\n\t\t// Walk backwards to find the last assistant message\n\t\tlet lastAssistant: AssistantMessage | undefined;\n\t\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\t\tconst msg = messages[i];\n\t\t\tif (msg && \"role\" in msg && msg.role === \"assistant\") {\n\t\t\t\tlastAssistant = msg as AssistantMessage;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (!lastAssistant) return;\n\n\t\t// Check if any tool calls follow the last text block\n\t\tconst content = lastAssistant.content;\n\t\tlet lastTextIndex = -1;\n\t\tlet hasToolAfterText = false;\n\t\tfor (let i = 0; i < content.length; i++) {\n\t\t\tif (content[i].type === \"text\") lastTextIndex = i;\n\t\t}\n\t\tif (lastTextIndex >= 0) {\n\t\t\tfor (let i = lastTextIndex + 1; i < content.length; i++) {\n\t\t\t\tif (isToolContentBlock(content[i])) {\n\t\t\t\t\thasToolAfterText = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!hasToolAfterText || lastTextIndex < 0) return;\n\n\t\tconst textBlock = content[lastTextIndex] as { type: \"text\"; text: string };\n\t\tconst text = textBlock.text?.trim();\n\t\tif (!text) return;\n\n\t\thost.pinnedMessageContainer.addChild(\n\t\t\tnew DynamicBorder((str: string) => theme.fg(\"dim\", str), \"Latest Output\"),\n\t\t);\n\t\thost.pinnedMessageContainer.addChild(\n\t\t\tnew Markdown(text, 1, 0, host.getMarkdownThemeWithSettings()),\n\t\t);\n\t}\n"]}
|
|
1
|
+
{"version":3,"file":"interactive-chat-render.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-chat-render.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Extracted from interactive-mode.ts (Phase E2 seam remediation).\n\nimport type { AgentMessage } from \"@gsd/pi-agent-core\";\nimport type { AssistantMessage, Message } from \"@gsd/pi-ai\";\nimport { parseSkillBlock } from \"@gsd/agent-core\";\nimport type { SessionContext } from \"@gsd/pi-coding-agent/core/session-manager.js\";\nimport type { TruncationResult } from \"@gsd/pi-coding-agent/core/tools/truncate.js\";\nimport { Container, Markdown, Spacer, Text } from \"@gsd/pi-tui\";\nimport { theme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport { AssistantMessageComponent } from \"./components/assistant-message.js\";\nimport { chatTurnFollowsUser, reconcileChatTurnConnections } from \"./components/chat-turn-connect.js\";\nimport { BashExecutionComponent } from \"./components/bash-execution.js\";\nimport { BranchSummaryMessageComponent } from \"./components/branch-summary-message.js\";\nimport { CompactionSummaryMessageComponent } from \"./components/compaction-summary-message.js\";\nimport { CustomMessageComponent } from \"./components/custom-message.js\";\nimport { DynamicBorder } from \"./components/dynamic-border.js\";\nimport { SkillInvocationMessageComponent } from \"./components/skill-invocation-message.js\";\nimport { ToolExecutionComponent } from \"./components/tool-execution.js\";\nimport { UserMessageComponent } from \"./components/user-message.js\";\nimport { asServerToolUse, asWebSearchResult, isToolContentBlock } from \"./gsd-content-blocks.js\";\nimport { buildAssistantReplaySegments } from \"./interactive-notify-render.js\";\nimport { MAX_CHAT_COMPONENTS } from \"./interactive-mode-class-constants.js\";\nimport type { InteractiveModeDelegateHost } from \"./interactive-mode-delegate-host.js\";\n\n\t/** Extract text content from a user message */\nexport function getUserMessageText(host: InteractiveModeDelegateHost, message: Message): string {\n\t\tif (message.role !== \"user\") return \"\";\n\t\tconst textBlocks =\n\t\t\ttypeof message.content === \"string\"\n\t\t\t\t? [{ type: \"text\", text: message.content }]\n\t\t\t\t: message.content.filter((c: { type: string }) => c.type === \"text\");\n\t\treturn textBlocks.map((c) => (c as { text: string }).text).join(\"\");\n\t}\n\n\t/**\n\t * Show a status message in the chat.\n\t *\n\t * If multiple status messages are emitted back-to-back (without anything else being added to the chat),\n\t * we update the previous status line instead of appending new ones to avoid log spam.\n\t */\nexport function showStatus(host: InteractiveModeDelegateHost, message: string, options?: { append?: boolean }): void {\n\t\tconst append = options?.append ?? false;\n\t\tconst children = host.chatContainer.children;\n\t\tconst last = children.length > 0 ? children[children.length - 1] : undefined;\n\t\tconst secondLast = children.length > 1 ? children[children.length - 2] : undefined;\n\n\t\tif (!append && last && secondLast && last === host.lastStatusText && secondLast === host.lastStatusSpacer) {\n\t\t\thost.lastStatusText.setText(theme.fg(\"dim\", message));\n\t\t\thost.ui.requestRender();\n\t\t\treturn;\n\t\t}\n\n\t\tconst spacer = new Spacer(1);\n\t\tconst text = new Text(theme.fg(\"dim\", message), 1, 0);\n\t\thost.chatContainer.addChild(spacer);\n\t\thost.chatContainer.addChild(text);\n\t\thost.lastStatusSpacer = spacer;\n\t\thost.lastStatusText = text;\n\t\thost.ui.requestRender();\n\t}\n\nfunction addUserMessageComponent(host: InteractiveModeDelegateHost, userComponent: UserMessageComponent): void {\n\thost.chatContainer.addChild(userComponent);\n}\n\nfunction hasAssistantVisibleContent(content: Array<any>, hideThinkingBlock: boolean): boolean {\n\treturn content.some((c: any) => {\n\t\tif (c?.type === \"text\" && typeof c.text === \"string\" && c.text.trim().length > 0) return true;\n\t\tif (!hideThinkingBlock && c?.type === \"thinking\" && typeof c.thinking === \"string\" && c.thinking.trim().length > 0) return true;\n\t\treturn false;\n\t});\n}\n\nfunction finalizeChatMutation(host: InteractiveModeDelegateHost): void {\n\ttrimChatHistory(host);\n\treconcileChatTurnConnections(host.chatContainer.children);\n}\n\nexport function addMessageToChat(host: InteractiveModeDelegateHost, message: AgentMessage, options?: { populateHistory?: boolean }): void {\n\t\tconst timestampFormat = host.settingsManager.getTimestampFormat();\n\t\tswitch (message.role) {\n\t\t\tcase \"bashExecution\": {\n\t\t\t\tconst component = new BashExecutionComponent(message.command, host.ui, message.excludeFromContext);\n\t\t\t\tif (message.output) {\n\t\t\t\t\tcomponent.appendOutput(message.output);\n\t\t\t\t}\n\t\t\t\tcomponent.setComplete(\n\t\t\t\t\tmessage.exitCode,\n\t\t\t\t\tmessage.cancelled,\n\t\t\t\t\tmessage.truncated ? ({ truncated: true } as TruncationResult) : undefined,\n\t\t\t\t\tmessage.fullOutputPath,\n\t\t\t\t);\n\t\t\t\thost.chatContainer.addChild(component);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"custom\": {\n\t\t\t\tif (message.display) {\n\t\t\t\t\tconst renderer = host.session.extensionRunner?.getMessageRenderer(message.customType);\n\t\t\t\t\tconst component = new CustomMessageComponent(message, renderer, host.getMarkdownThemeWithSettings());\n\t\t\t\t\tcomponent.setExpanded(host.toolOutputExpanded);\n\t\t\t\t\thost.chatContainer.addChild(component);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"compactionSummary\": {\n\t\t\t\thost.chatContainer.addChild(new Spacer(1));\n\t\t\t\tconst component = new CompactionSummaryMessageComponent(message, host.getMarkdownThemeWithSettings());\n\t\t\t\tcomponent.setExpanded(host.toolOutputExpanded);\n\t\t\t\thost.chatContainer.addChild(component);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"branchSummary\": {\n\t\t\t\thost.chatContainer.addChild(new Spacer(1));\n\t\t\t\tconst component = new BranchSummaryMessageComponent(message, host.getMarkdownThemeWithSettings());\n\t\t\t\tcomponent.setExpanded(host.toolOutputExpanded);\n\t\t\t\thost.chatContainer.addChild(component);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"user\": {\n\t\t\t\tconst textContent = getUserMessageText(host, message);\n\t\t\t\tif (textContent) {\n\t\t\t\t\tconst skillBlock = parseSkillBlock(textContent);\n\t\t\t\t\tif (skillBlock) {\n\t\t\t\t\t\t// Render skill block (collapsible)\n\t\t\t\t\t\thost.chatContainer.addChild(new Spacer(1));\n\t\t\t\t\t\tconst component = new SkillInvocationMessageComponent(\n\t\t\t\t\t\t\tskillBlock,\n\t\t\t\t\t\t\thost.getMarkdownThemeWithSettings(),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcomponent.setExpanded(host.toolOutputExpanded);\n\t\t\t\t\t\thost.chatContainer.addChild(component);\n\t\t\t\t\t\t// Render user message separately if present\n\t\t\t\t\t\tif (skillBlock.userMessage) {\n\t\t\t\t\t\t\tconst userComponent = new UserMessageComponent(\n\t\t\t\t\t\t\t\tskillBlock.userMessage,\n\t\t\t\t\t\t\t\thost.getMarkdownThemeWithSettings(),\n\t\t\t\t\t\t\t\tmessage.timestamp,\n\t\t\t\t\t\t\t\ttimestampFormat,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\taddUserMessageComponent(host, userComponent);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst userComponent = new UserMessageComponent(textContent, host.getMarkdownThemeWithSettings(), message.timestamp, timestampFormat);\n\t\t\t\t\t\taddUserMessageComponent(host, userComponent);\n\t\t\t\t\t}\n\t\t\t\t\tif (options?.populateHistory) {\n\t\t\t\t\t\thost.editor.addToHistory?.(textContent);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"assistant\": {\n\t\t\t\tconst hasToolBlocks = message.content.some((c: any) => isToolContentBlock(c));\n\t\t\t\tconst isAbortOrError = message.stopReason === \"aborted\" || message.stopReason === \"error\";\n\t\t\t\tif (!hasAssistantVisibleContent(message.content, host.hideThinkingBlock) && !(isAbortOrError && !hasToolBlocks)) break;\n\t\t\t\tconst connectedToUser = chatTurnFollowsUser(host.chatContainer.children);\n\t\t\t\tconst assistantComponent = new AssistantMessageComponent(\n\t\t\t\t\tmessage,\n\t\t\t\t\thost.hideThinkingBlock,\n\t\t\t\t\thost.getMarkdownThemeWithSettings(),\n\t\t\t\t\ttimestampFormat,\n\t\t\t\t\tundefined,\n\t\t\t\t\tconnectedToUser,\n\t\t\t\t);\n\t\t\t\thost.chatContainer.addChild(assistantComponent);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"toolResult\": {\n\t\t\t\t// Tool results are rendered inline with tool calls, handled separately\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tconst _exhaustive: never = message;\n\t\t\t}\n\t\t}\n\t\tfinalizeChatMutation(host);\n\t}\n\n\t/**\n\t * Remove oldest components when chat exceeds MAX_CHAT_COMPONENTS.\n\t * Only render-components are removed — session data stays in SessionManager.\n\t */\nexport function trimChatHistory(host: InteractiveModeDelegateHost): void {\n\t\twhile (host.chatContainer.children.length > MAX_CHAT_COMPONENTS) {\n\t\t\tconst oldest = host.chatContainer.children[0];\n\t\t\thost.chatContainer.removeChild(oldest);\n\t\t}\n\t}\n\n\t/**\n\t * Render session context to chat. Used for initial load and rebuild after compaction.\n\t * @param sessionContext Session context to render\n\t * @param options.updateFooter Update footer state\n\t * @param options.populateHistory Add user messages to editor history\n\t */\nexport function renderSessionContext(host: InteractiveModeDelegateHost, \n\t\tsessionContext: SessionContext,\n\t\toptions: { updateFooter?: boolean; populateHistory?: boolean } = {},\n\t): void {\n\t\thost.pendingTools.clear();\n\t\tconst timestampFormat = host.settingsManager.getTimestampFormat();\n\n\t\tif (options.updateFooter) {\n\t\t\thost.footer.invalidate();\n\t\t\thost.updateEditorBorderColor();\n\t\t}\n\n\t\tfor (const message of sessionContext.messages) {\n\t\t\t// Assistant messages need special handling for tool calls\n\t\t\tif (message.role === \"assistant\") {\n\t\t\t\tconst hasToolBlocks = message.content.some((c) => isToolContentBlock(c));\n\t\t\t\tif (!hasToolBlocks) {\n\t\t\t\t\taddMessageToChat(host, message);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst assistantSegments: AssistantMessageComponent[] = [];\n\t\t\t\tconst replaySegments = buildAssistantReplaySegments(message.content);\n\n\t\t\t\tfor (const segment of replaySegments) {\n\t\t\t\t\tif (segment.kind === \"assistant\") {\n\t\t\t\t\t\tconst segContent = message.content.slice(segment.startIndex, segment.endIndex + 1);\n\t\t\t\t\t\tif (!hasAssistantVisibleContent(segContent, host.hideThinkingBlock)) continue;\n\t\t\t\t\t\tconst connectedToUser = chatTurnFollowsUser(host.chatContainer.children);\n\t\t\t\t\t\tconst assistantComponent = new AssistantMessageComponent(\n\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t\thost.hideThinkingBlock,\n\t\t\t\t\t\t\thost.getMarkdownThemeWithSettings(),\n\t\t\t\t\t\t\ttimestampFormat,\n\t\t\t\t\t\t\t{ startIndex: segment.startIndex, endIndex: segment.endIndex },\n\t\t\t\t\t\t\tconnectedToUser,\n\t\t\t\t\t\t);\n\t\t\t\t\t\thost.chatContainer.addChild(assistantComponent);\n\t\t\t\t\t\tassistantSegments.push(assistantComponent);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst content = message.content[segment.contentIndex];\n\t\t\t\t\tif (content.type === \"toolCall\") {\n\t\t\t\t\t\tconst component = new ToolExecutionComponent(\n\t\t\t\t\t\t\tcontent.name,\n\t\t\t\t\t\t\tcontent.arguments,\n\t\t\t\t\t\t\t{ showImages: host.settingsManager.getShowImages() },\n\t\t\t\t\t\t\thost.getRegisteredToolDefinition(content.name),\n\t\t\t\t\t\t\thost.ui,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcomponent.setExpanded(host.toolOutputExpanded);\n\t\t\t\t\t\thost.chatContainer.addChild(component);\n\n\t\t\t\t\t\t// On an aborted/errored turn, only the tool calls that never\n\t\t\t\t\t\t// produced a result should render as interrupted. A tool that\n\t\t\t\t\t\t// actually completed has its result in a later `toolResult`\n\t\t\t\t\t\t// message (keyed by toolCallId) — register it as pending so the\n\t\t\t\t\t\t// normal toolResult handler below renders the TRUE result with\n\t\t\t\t\t\t// its real isError flag. Otherwise the successful result would be\n\t\t\t\t\t\t// silently discarded and the row shown red.\n\t\t\t\t\t\tconst turnAbortedOrErrored =\n\t\t\t\t\t\t\tmessage.stopReason === \"aborted\" || message.stopReason === \"error\";\n\t\t\t\t\t\tconst hasRealResult =\n\t\t\t\t\t\t\tturnAbortedOrErrored &&\n\t\t\t\t\t\t\tsessionContext.messages.some(\n\t\t\t\t\t\t\t\t(m) => m.role === \"toolResult\" && m.toolCallId === content.id,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (turnAbortedOrErrored && !hasRealResult) {\n\t\t\t\t\t\t\tlet errorMessage: string;\n\t\t\t\t\t\t\tif (message.stopReason === \"aborted\") {\n\t\t\t\t\t\t\t\tconst retryAttempt = host.session.retryAttempt;\n\t\t\t\t\t\t\t\terrorMessage =\n\t\t\t\t\t\t\t\t\tretryAttempt > 0\n\t\t\t\t\t\t\t\t\t\t? `Aborted after ${retryAttempt} retry attempt${retryAttempt > 1 ? \"s\" : \"\"}`\n\t\t\t\t\t\t\t\t\t\t: \"Operation aborted\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\terrorMessage = message.errorMessage || \"Error\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcomponent.updateResult({ content: [{ type: \"text\", text: errorMessage }], isError: true });\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\thost.pendingTools.set(content.id, component);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst serverTool = asServerToolUse(content);\n\t\t\t\t\t\tif (serverTool) {\n\t\t\t\t\t\t// Server-side tool (e.g., native web search)\n\t\t\t\t\t\tconst component = new ToolExecutionComponent(\n\t\t\t\t\t\t\tserverTool.name,\n\t\t\t\t\t\t\tserverTool.input ?? {},\n\t\t\t\t\t\t\t{ showImages: host.settingsManager.getShowImages() },\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\thost.ui,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcomponent.setExpanded(host.toolOutputExpanded);\n\t\t\t\t\t\thost.chatContainer.addChild(component);\n\t\t\t\t\t\t// Find matching webSearchResult in host message's content\n\t\t\t\t\t\tconst resultBlock = message.content\n\t\t\t\t\t\t\t.map(asWebSearchResult)\n\t\t\t\t\t\t\t.find((block) => block && block.toolUseId === serverTool.id);\n\t\t\t\t\t\tif (resultBlock) {\n\t\t\t\t\t\t\tconst searchContent = resultBlock.content;\n\t\t\t\t\t\t\tconst isError = searchContent && typeof searchContent === \"object\" && \"type\" in (searchContent as any) && (searchContent as any).type === \"web_search_tool_result_error\";\n\t\t\t\t\t\t\tconst resultText = host.formatWebSearchResult(searchContent);\n\t\t\t\t\t\t\tcomponent.updateResult({\n\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: resultText }],\n\t\t\t\t\t\t\t\tisError: !!isError,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// No result yet (aborted stream?) — show as pending\n\t\t\t\t\t\t\thost.pendingTools.set(serverTool.id, component);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Match streaming-mode behavior: show metadata once on the final\n\t\t\t\t// assistant prose segment for host message.\n\t\t\t\tconst lastAssistantSegment = assistantSegments[assistantSegments.length - 1];\n\t\t\t\tlastAssistantSegment?.setShowMetadata(true);\n\t\t\t} else if (message.role === \"toolResult\") {\n\t\t\t\t// Match tool results to pending tool components\n\t\t\t\tconst component = host.pendingTools.get(message.toolCallId);\n\t\t\t\tif (component) {\n\t\t\t\t\tcomponent.updateResult(message);\n\t\t\t\t\thost.pendingTools.delete(message.toolCallId);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// All other messages use standard rendering\n\t\t\t\taddMessageToChat(host, message, options);\n\t\t\t}\n\t\t}\n\n\t\t// Any pendingTools entries left over after replay are historical tool\n\t\t// calls whose results were squashed out of session context (commonly by\n\t\t// compaction). Mark them finished so the frame stops showing \"Running\".\n\t\tfor (const component of host.pendingTools.values()) {\n\t\t\tcomponent.markHistoricalNoResult();\n\t\t}\n\t\thost.pendingTools.clear();\n\t\ttrimChatHistory(host);\n\t\treconcileChatTurnConnections(host.chatContainer.children);\n\t\thost.ui.requestRender();\n\t}\n\nexport function renderInitialMessages(host: InteractiveModeDelegateHost): void {\n\t\tconst context = host.sessionManager.buildSessionContext();\n\t\trenderSessionContext(host, context, {\n\t\t\tupdateFooter: true,\n\t\t\tpopulateHistory: true,\n\t\t});\n\t\tpopulatePinnedFromMessages(host, context.messages);\n\n\t\tconst allEntries = host.sessionManager.getEntries();\n\t\tconst compactionCount = allEntries.filter((e: { type: string }) => e.type === \"compaction\").length;\n\t\tif (compactionCount > 0) {\n\t\t\tconst times = compactionCount === 1 ? \"1 time\" : `${compactionCount} times`;\n\t\t\tshowStatus(host, `Session compacted ${times}`);\n\t\t}\n\t}\n\nexport async function getUserInput(host: InteractiveModeDelegateHost): Promise<string> {\n\t\treturn new Promise((resolve) => {\n\t\t\thost.onInputCallback = (text: string) => {\n\t\t\t\thost.onInputCallback = undefined;\n\t\t\t\tresolve(text);\n\t\t\t};\n\t\t});\n\t}\n\nexport function rebuildChatFromMessages(host: InteractiveModeDelegateHost): void {\n\t\thost.chatContainer.clear();\n\t\thost.pinnedMessageContainer.clear();\n\t\tconst context = host.sessionManager.buildSessionContext();\n\t\trenderSessionContext(host, context);\n\t\t// Pinned content NOT re-populated here — the streaming lifecycle in\n\t\t// chat-controller.ts manages the pinned zone during active work.\n\t\t// populatePinnedFromMessages() remains in renderInitialMessages()\n\t\t// for the session-resume case at startup.\n\t}\n\n\t/**\n\t * After rebuilding chat from messages, pin the last assistant text above the\n\t * editor if tool results would otherwise push it out of the viewport.\n\t */\nexport function populatePinnedFromMessages(host: InteractiveModeDelegateHost, messages: AgentMessage[]): void {\n\t\thost.pinnedMessageContainer.clear();\n\n\t\t// Walk backwards to find the last assistant message\n\t\tlet lastAssistant: AssistantMessage | undefined;\n\t\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\t\tconst msg = messages[i];\n\t\t\tif (msg && \"role\" in msg && msg.role === \"assistant\") {\n\t\t\t\tlastAssistant = msg as AssistantMessage;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (!lastAssistant) return;\n\n\t\t// Check if any tool calls follow the last text block\n\t\tconst content = lastAssistant.content;\n\t\tlet lastTextIndex = -1;\n\t\tlet hasToolAfterText = false;\n\t\tfor (let i = 0; i < content.length; i++) {\n\t\t\tif (content[i].type === \"text\") lastTextIndex = i;\n\t\t}\n\t\tif (lastTextIndex >= 0) {\n\t\t\tfor (let i = lastTextIndex + 1; i < content.length; i++) {\n\t\t\t\tif (isToolContentBlock(content[i])) {\n\t\t\t\t\thasToolAfterText = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!hasToolAfterText || lastTextIndex < 0) return;\n\n\t\tconst textBlock = content[lastTextIndex] as { type: \"text\"; text: string };\n\t\tconst text = textBlock.text?.trim();\n\t\tif (!text) return;\n\n\t\thost.pinnedMessageContainer.addChild(\n\t\t\tnew DynamicBorder((str: string) => theme.fg(\"dim\", str), \"Latest Output\"),\n\t\t);\n\t\thost.pinnedMessageContainer.addChild(\n\t\t\tnew Markdown(text, 1, 0, host.getMarkdownThemeWithSettings()),\n\t\t);\n\t}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-selectors-auth.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-selectors-auth.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,oBAAoB,EAA0B,MAAM,gCAAgC,CAAC;AACnG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AA6CvF,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG;IACjF,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB,CAOA;AAMD,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,2BAA2B,GAAG,oBAAoB,EAAE,
|
|
1
|
+
{"version":3,"file":"interactive-selectors-auth.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-selectors-auth.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,oBAAoB,EAA0B,MAAM,gCAAgC,CAAC;AACnG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AA6CvF,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG;IACjF,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB,CAOA;AAMD,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,2BAA2B,GAAG,oBAAoB,EAAE,CA2CnG;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,2BAA2B,EAAE,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAkElH;AAED,wBAAsB,4BAA4B,CAAC,IAAI,EAAE,2BAA2B,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBvH;AAoED,wBAAsB,eAAe,CAAC,IAAI,EAAE,2BAA2B,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsF1G"}
|
|
@@ -66,10 +66,10 @@ function getApiKeyProviderDisplayName(host, providerId) {
|
|
|
66
66
|
}
|
|
67
67
|
export function buildLoginProviderOptions(host) {
|
|
68
68
|
const modelRegistry = host.session.modelRegistry;
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
.filter((provider) => isBrowserOAuthProviderAllowed(provider.id));
|
|
69
|
+
const allOAuthProviders = modelRegistry.authStorage.getOAuthProviders();
|
|
70
|
+
const oauthProviders = allOAuthProviders.filter((provider) => isBrowserOAuthProviderAllowed(provider.id));
|
|
72
71
|
const oauthProviderIds = new Set(oauthProviders.map((provider) => provider.id));
|
|
72
|
+
const apiKeyOnlyOAuthProviderIds = new Set(allOAuthProviders.filter((provider) => !isBrowserOAuthProviderAllowed(provider.id)).map((provider) => provider.id));
|
|
73
73
|
const modelProviderIds = Array.from(new Set(modelRegistry.getAll().map((model) => model.provider))).sort();
|
|
74
74
|
const externalCliProviders = modelProviderIds
|
|
75
75
|
.filter((providerId) => modelRegistry.getProviderAuthMode(providerId) === "externalCli")
|
|
@@ -80,7 +80,7 @@ export function buildLoginProviderOptions(host) {
|
|
|
80
80
|
statusLabel: modelRegistry.isProviderRequestReady(providerId) ? "✓ ready" : undefined,
|
|
81
81
|
}));
|
|
82
82
|
const apiKeyProviders = modelProviderIds
|
|
83
|
-
.filter((providerId) => modelRegistry.getProviderAuthMode(providerId) === "apiKey")
|
|
83
|
+
.filter((providerId) => modelRegistry.getProviderAuthMode(providerId) === "apiKey" || apiKeyOnlyOAuthProviderIds.has(providerId))
|
|
84
84
|
.filter((providerId) => !oauthProviderIds.has(providerId))
|
|
85
85
|
.map((providerId) => ({
|
|
86
86
|
id: providerId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-selectors-auth.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-selectors-auth.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,6FAA6F;AAC7F,cAAc;AAGd,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,+BAA+B,EAAE,MAAM,qDAAqD,CAAC;AACtG,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAA6B,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAGnG,MAAM,+BAA+B,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AAE/D,SAAS,6BAA6B,CAAC,UAAkB;IACxD,OAAO,CAAC,+BAA+B,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,eAAe,CAAC,SAAiC;IACzD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAE,SAAS;QACpC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAuD;IAChF,IAAI,CAAC,MAAM,EAAE,MAAM;QAAE,OAAO,SAAS,CAAC;IACtC,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,cAAc,CAAC;IACtD,IAAI,MAAM,CAAC,MAAM,KAAK,aAAa,IAAI,MAAM,CAAC,KAAK;QAAE,OAAO,UAAU,MAAM,CAAC,KAAK,EAAE,CAAC;IACrF,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK;QAAE,OAAO,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC;IAC5E,IAAI,MAAM,CAAC,MAAM,KAAK,qBAAqB;QAAE,OAAO,0BAA0B,CAAC;IAC/E,IAAI,MAAM,CAAC,MAAM,KAAK,iBAAiB;QAAE,OAAO,sBAAsB,CAAC;IACvE,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU;QAAE,OAAO,cAAc,CAAC;IACxD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,aAAa,CAAC,OAAsC;IAC5D,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAChD,OAAO,YAAY,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AAC3C,CAAC;AAED,SAAS,qBAAqB,CAAC,UAAkB;IAChD,IAAI,UAAU,KAAK,aAAa;QAAE,OAAO,mBAAmB,CAAC;IAC7D,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,iBAAiB,CAAC,UAAkB;IAC5C,IAAI,UAAU,KAAK,aAAa;QAAE,OAAO,QAAQ,CAAC;IAClD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,UAAkB,EAAE,YAAoB;IAI9E,MAAM,eAAe,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,aAAa,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC;IAC5D,OAAO;QACN,OAAO,EAAE,cAAc,YAAY,IAAI,eAAe,GAAG,OAAO,GAAG;QACnE,WAAW,EAAE,iBAAiB,CAAC,UAAU,CAAC;KAC1C,CAAC;AACH,CAAC;AAED,SAAS,4BAA4B,CAAC,IAAiC,EAAE,UAAkB;IAC1F,OAAO,+BAA+B,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC;AACrH,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,IAAiC;IAC1E,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;IACjD,MAAM,cAAc,GAAG,aAAa,CAAC,WAAW;SAC9C,iBAAiB,EAAE;SACnB,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,6BAA6B,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IACnE,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAChF,MAAM,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAE3G,MAAM,oBAAoB,GAAG,gBAAgB;SAC3C,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,aAAa,CAAC,mBAAmB,CAAC,UAAU,CAAC,KAAK,aAAa,CAAC;SACvF,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACrB,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,aAAa,CAAC,sBAAsB,CAAC,UAAU,CAAC;QACtD,QAAQ,EAAE,cAAuB;QACjC,WAAW,EAAE,aAAa,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;KACrF,CAAC,CAAC,CAAC;IAEL,MAAM,eAAe,GAAG,gBAAgB;SACtC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,aAAa,CAAC,mBAAmB,CAAC,UAAU,CAAC,KAAK,QAAQ,CAAC;SAClF,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;SACzD,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACrB,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,4BAA4B,CAAC,IAAI,EAAE,UAAU,CAAC;QACpD,QAAQ,EAAE,SAAkB;QAC5B,WAAW,EAAE,gBAAgB,CAAC,aAAa,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;KAC9E,CAAC,CAAC,CAAC;IAEL,MAAM,qBAAqB,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC/D,GAAG,QAAQ;QACX,QAAQ,EAAE,OAAgB;QAC1B,WAAW,EAAE,gBAAgB,CAAC,aAAa,CAAC,qBAAqB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;KAC/E,CAAC,CAAC,CAAC;IAEJ,OAAO,eAAe,CAAC;QACtB,GAAG,oBAAoB;QACvB,GAAG,eAAe;QAClB,GAAG,qBAAqB;KACxB,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAiC,EAAE,IAAwB;IAClG,MAAM,cAAc,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEtF,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QAChE,MAAM,iBAAiB,GAAG,SAAS,CAAC,MAAM,CACzC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,OAAO,CACtE,CAAC;QACF,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,UAAU,CAAC,iDAAiD,CAAC,CAAC;YACnE,OAAO;QACR,CAAC;IACF,CAAC;IAED,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE;QAC1B,MAAM,QAAQ,GAAG,IAAI,sBAAsB,CAC1C,IAAI,EACJ,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,WAAW,EACtC,CAAC,UAAkB,EAAE,EAAE;YACtB,IAAI,EAAE,CAAC;YAEP,MAAM,WAAW,GAAG,KAAK,IAAI,EAAE;gBAC9B,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;oBACtB,MAAM,4BAA4B,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;gBACtD,CAAC;qBAAM,CAAC;oBACP,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,WAAW;yBACzD,iBAAiB,EAAE;yBACnB,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;oBACnC,MAAM,YAAY,GAAG,YAAY,EAAE,IAAI,IAAI,UAAU,CAAC;oBAEtD,IAAI,CAAC;wBACJ,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;wBAC1D,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;wBACrC,MAAM,IAAI,CAAC,4BAA4B,EAAE,CAAC;wBAE1C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;wBACxC,IAAI,YAAY,EAAE,QAAQ,KAAK,UAAU,EAAE,CAAC;4BAC3C,IAAI,CAAC;gCACJ,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;gCAC5D,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC;gCAClE,IAAI,QAAQ,EAAE,CAAC;oCACd,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gCACvC,CAAC;4BACF,CAAC;4BAAC,MAAM,CAAC;gCACR,4DAA4D;4BAC7D,CAAC;wBACF,CAAC;wBAED,IAAI,CAAC,UAAU,CAAC,iBAAiB,YAAY,EAAE,CAAC,CAAC;oBAClD,CAAC;oBAAC,OAAO,KAAc,EAAE,CAAC;wBACzB,IAAI,CAAC,SAAS,CAAC,kBAAkB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBAC5F,CAAC;gBACF,CAAC;YACF,CAAC,CAAC;YACF,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;gBACxB,4DAA4D;YAC7D,CAAC,CAAC,CAAC;QACJ,CAAC,EACD,GAAG,EAAE;YACJ,IAAI,EAAE,CAAC;YACP,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;QACzB,CAAC,EACD,cAAc,CACd,CAAC;QACF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,IAAiC,EAAE,UAAkB;IACvG,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;IACjD,MAAM,QAAQ,GAAG,aAAa,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAE/D,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;QAChC,MAAM,2BAA2B,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACpD,OAAO;IACR,CAAC;IAED,MAAM,aAAa,GAAG,aAAa,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;IACnH,IAAI,aAAa,IAAI,6BAA6B,CAAC,UAAU,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QACvC,OAAO;IACR,CAAC;IAED,MAAM,qBAAqB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AAC/C,CAAC;AAED,KAAK,UAAU,2BAA2B,CAAC,IAAiC,EAAE,UAAkB;IAC/F,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;IACjD,MAAM,YAAY,GAAG,aAAa,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAEtE,IAAI,CAAC,aAAa,CAAC,sBAAsB,CAAC,UAAU,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC,SAAS,CAAC,GAAG,YAAY,6EAA6E,CAAC,CAAC;QAC7G,OAAO;IACR,CAAC;IAED,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3E,aAAa,CAAC,OAAO,EAAE,CAAC;IACxB,MAAM,IAAI,CAAC,4BAA4B,EAAE,CAAC;IAE1C,MAAM,WAAW,GAAG,aAAa,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC;IAChG,IAAI,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACzC,IAAI,CAAC,UAAU,CAAC,SAAS,YAAY,KAAK,UAAU,IAAI,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3E,CAAC;SAAM,CAAC;QACP,IAAI,CAAC,UAAU,CAAC,GAAG,YAAY,0CAA0C,CAAC,CAAC;IAC5E,CAAC;AACF,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,IAAiC,EAAE,UAAkB;IACzF,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC;IACnF,MAAM,MAAM,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,GAAE,CAAC,EAAE,YAAY,CAAC,CAAC;IAEvG,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;IAC7B,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzB,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;IAExB,MAAM,aAAa,GAAG,GAAG,EAAE;QAC1B,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9B,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC,CAAC;IAEF,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,sBAAsB,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACpF,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;QACzF,aAAa,EAAE,CAAC;QAChB,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,IAAI,CAAC,4BAA4B,EAAE,CAAC;QAE1C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC;QAC7G,IAAI,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,SAAS,YAAY,eAAe,WAAW,EAAE,EAAE,CAAC,CAAC;IACtE,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACzB,aAAa,EAAE,CAAC;QAChB,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxE,IAAI,QAAQ,KAAK,iBAAiB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1G,IAAI,CAAC,SAAS,CAAC,kBAAkB,YAAY,aAAa,QAAQ,EAAE,CAAC,CAAC;QACvE,CAAC;IACF,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAiC,EAAE,UAAkB;IAC1F,IAAI,CAAC,6BAA6B,CAAC,UAAU,CAAC,EAAE,CAAC;QAChD,MAAM,qBAAqB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC9C,OAAO;IACR,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;IACjH,MAAM,YAAY,GAAG,YAAY,EAAE,IAAI,IAAI,UAAU,CAAC;IACtD,MAAM,kBAAkB,GAAG,YAAY,EAAE,kBAAkB,IAAI,KAAK,CAAC;IAErE,MAAM,MAAM,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,GAAE,CAAC,CAAC,CAAC;IAEzF,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;IAC7B,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzB,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;IAExB,MAAM,aAAa,GAAG,GAAG,EAAE;QAC1B,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9B,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC,CAAC;IAEF,IAAI,CAAC;QACJ,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC,UAA6B,EAAE;YACjF,MAAM,EAAE,CAAC,IAA4C,EAAE,EAAE;gBACxD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;gBAE7C,IAAI,CAAC,kBAAkB,IAAI,UAAU,KAAK,gBAAgB,EAAE,CAAC;oBAC5D,MAAM,CAAC,WAAW,CAAC,uCAAuC,CAAC,CAAC;gBAC7D,CAAC;YACF,CAAC;YAED,QAAQ,EAAE,KAAK,EAAE,MAAuE,EAAE,EAAE;gBAC3F,OAAO,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;YACjG,CAAC;YAED,UAAU,EAAE,CAAC,OAAe,EAAE,EAAE;gBAC/B,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;YAED,iBAAiB,EAAE,kBAAkB;gBACpC,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,yDAAyD,CAAC;gBACzF,CAAC,CAAC,SAAS;YAEZ,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE;gBACtB,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;gBAC5B,MAAM,CAAC,WAAW,CAAC,uCAAuC,CAAC,CAAC;YAC7D,CAAC;YACD,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YAEjD,MAAM,EAAE,MAAM,CAAC,MAAM;SACrB,CAAC,CAAC;QAEH,aAAa,EAAE,CAAC;QAChB,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,IAAI,CAAC,4BAA4B,EAAE,CAAC;QAE1C,IAAI,CAAC;YACJ,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;YACxC,IAAI,YAAY,EAAE,CAAC;gBAClB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;gBAC5E,IAAI,CAAC,UAAU,EAAE,CAAC;oBACjB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;oBAC5D,MAAM,gBAAgB,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC;oBAC1E,IAAI,gBAAgB,EAAE,CAAC;wBACtB,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;oBAC/C,CAAC;yBAAM,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACjC,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC3C,CAAC;gBACF,CAAC;YACF,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,4DAA4D;QAC7D,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,gBAAgB,YAAY,0BAA0B,WAAW,EAAE,EAAE,CAAC,CAAC;IACxF,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACzB,aAAa,EAAE,CAAC;QAChB,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxE,IAAI,QAAQ,KAAK,iBAAiB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1G,IAAI,CAAC,SAAS,CAAC,sBAAsB,YAAY,KAAK,QAAQ,EAAE,CAAC,CAAC;QACnE,CAAC;IACF,CAAC;AACF,CAAC","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Extracted from interactive-selectors-session.ts (Phase E2 seam remediation).\n// @ts-nocheck\n\nimport type { OAuthProviderId } from \"@gsd/pi-ai\";\nimport { getApiKeyEnvVars } from \"@gsd/pi-ai\";\nimport { getAuthPath } from \"@gsd/pi-coding-agent/config.js\";\nimport { BUILT_IN_PROVIDER_DISPLAY_NAMES } from \"@gsd/pi-coding-agent/core/provider-display-names.js\";\nimport { LoginDialogComponent } from \"./components/login-dialog.js\";\nimport { type AuthSelectorProvider, OAuthSelectorComponent } from \"./components/oauth-selector.js\";\nimport type { InteractiveModeDelegateHost } from \"./interactive-mode-delegate-host.js\";\n\nconst BLOCKED_BROWSER_OAUTH_PROVIDERS = new Set([\"anthropic\"]);\n\nfunction isBrowserOAuthProviderAllowed(providerId: string): boolean {\n\treturn !BLOCKED_BROWSER_OAUTH_PROVIDERS.has(providerId);\n}\n\nfunction uniqueProviders(providers: AuthSelectorProvider[]): AuthSelectorProvider[] {\n\tconst seen = new Set<string>();\n\tconst unique: AuthSelectorProvider[] = [];\n\tfor (const provider of providers) {\n\t\tif (seen.has(provider.id)) continue;\n\t\tseen.add(provider.id);\n\t\tunique.push(provider);\n\t}\n\treturn unique;\n}\n\nfunction formatAuthStatus(status: { source?: string; label?: string } | undefined): string | undefined {\n\tif (!status?.source) return undefined;\n\tif (status.source === \"stored\") return \"✓ configured\";\n\tif (status.source === \"environment\" && status.label) return `✓ env: ${status.label}`;\n\tif (status.source === \"runtime\" && status.label) return `✓ ${status.label}`;\n\tif (status.source === \"models_json_command\") return \"✓ command in models.json\";\n\tif (status.source === \"models_json_key\") return \"✓ key in models.json\";\n\tif (status.source === \"fallback\") return \"✓ configured\";\n\treturn undefined;\n}\n\nfunction formatEnvHint(envVars: readonly string[] | undefined): string {\n\tif (!envVars || envVars.length === 0) return \"\";\n\treturn ` (or set ${envVars.join(\" / \")})`;\n}\n\nfunction apiKeyCredentialLabel(providerId: string): string {\n\tif (providerId === \"huggingface\") return \"user access token\";\n\treturn \"API key\";\n}\n\nfunction apiKeyPlaceholder(providerId: string): string | undefined {\n\tif (providerId === \"huggingface\") return \"hf_...\";\n\treturn undefined;\n}\n\nexport function buildApiKeyLoginPrompt(providerId: string, providerName: string): {\n\tmessage: string;\n\tplaceholder?: string;\n} {\n\tconst credentialLabel = apiKeyCredentialLabel(providerId);\n\tconst envHint = formatEnvHint(getApiKeyEnvVars(providerId));\n\treturn {\n\t\tmessage: `Paste your ${providerName} ${credentialLabel}${envHint}:`,\n\t\tplaceholder: apiKeyPlaceholder(providerId),\n\t};\n}\n\nfunction getApiKeyProviderDisplayName(host: InteractiveModeDelegateHost, providerId: string): string {\n\treturn BUILT_IN_PROVIDER_DISPLAY_NAMES[providerId] ?? host.session.modelRegistry.getProviderDisplayName(providerId);\n}\n\nexport function buildLoginProviderOptions(host: InteractiveModeDelegateHost): AuthSelectorProvider[] {\n\tconst modelRegistry = host.session.modelRegistry;\n\tconst oauthProviders = modelRegistry.authStorage\n\t\t.getOAuthProviders()\n\t\t.filter((provider) => isBrowserOAuthProviderAllowed(provider.id));\n\tconst oauthProviderIds = new Set(oauthProviders.map((provider) => provider.id));\n\tconst modelProviderIds = Array.from(new Set(modelRegistry.getAll().map((model) => model.provider))).sort();\n\n\tconst externalCliProviders = modelProviderIds\n\t\t.filter((providerId) => modelRegistry.getProviderAuthMode(providerId) === \"externalCli\")\n\t\t.map((providerId) => ({\n\t\t\tid: providerId,\n\t\t\tname: modelRegistry.getProviderDisplayName(providerId),\n\t\t\tauthType: \"external_cli\" as const,\n\t\t\tstatusLabel: modelRegistry.isProviderRequestReady(providerId) ? \"✓ ready\" : undefined,\n\t\t}));\n\n\tconst apiKeyProviders = modelProviderIds\n\t\t.filter((providerId) => modelRegistry.getProviderAuthMode(providerId) === \"apiKey\")\n\t\t.filter((providerId) => !oauthProviderIds.has(providerId))\n\t\t.map((providerId) => ({\n\t\t\tid: providerId,\n\t\t\tname: getApiKeyProviderDisplayName(host, providerId),\n\t\t\tauthType: \"api_key\" as const,\n\t\t\tstatusLabel: formatAuthStatus(modelRegistry.getProviderAuthStatus(providerId)),\n\t\t}));\n\n\tconst browserOAuthProviders = oauthProviders.map((provider) => ({\n\t\t...provider,\n\t\tauthType: \"oauth\" as const,\n\t\tstatusLabel: formatAuthStatus(modelRegistry.getProviderAuthStatus(provider.id)),\n\t}));\n\n\treturn uniqueProviders([\n\t\t...externalCliProviders,\n\t\t...apiKeyProviders,\n\t\t...browserOAuthProviders,\n\t]);\n}\n\nexport async function showOAuthSelector(host: InteractiveModeDelegateHost, mode: \"login\" | \"logout\"): Promise<void> {\n\tconst loginProviders = mode === \"login\" ? buildLoginProviderOptions(host) : undefined;\n\n\tif (mode === \"logout\") {\n\t\tconst providers = host.session.modelRegistry.authStorage.list();\n\t\tconst loggedInProviders = providers.filter(\n\t\t\t(p) => host.session.modelRegistry.authStorage.get(p)?.type === \"oauth\",\n\t\t);\n\t\tif (loggedInProviders.length === 0) {\n\t\t\thost.showStatus(\"No OAuth providers logged in. Use /login first.\");\n\t\t\treturn;\n\t\t}\n\t}\n\n\thost.showSelector((done) => {\n\t\tconst selector = new OAuthSelectorComponent(\n\t\t\tmode,\n\t\t\thost.session.modelRegistry.authStorage,\n\t\t\t(providerId: string) => {\n\t\t\t\tdone();\n\n\t\t\t\tconst handleAsync = async () => {\n\t\t\t\t\tif (mode === \"login\") {\n\t\t\t\t\t\tawait handleLoginProviderSelection(host, providerId);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst providerInfo = host.session.modelRegistry.authStorage\n\t\t\t\t\t\t\t.getOAuthProviders()\n\t\t\t\t\t\t\t.find((p) => p.id === providerId);\n\t\t\t\t\t\tconst providerName = providerInfo?.name || providerId;\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\thost.session.modelRegistry.authStorage.logout(providerId);\n\t\t\t\t\t\t\thost.session.modelRegistry.refresh();\n\t\t\t\t\t\t\tawait host.updateAvailableProviderCount();\n\n\t\t\t\t\t\t\tconst currentModel = host.session.model;\n\t\t\t\t\t\t\tif (currentModel?.provider === providerId) {\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tconst available = host.session.modelRegistry.getAvailable();\n\t\t\t\t\t\t\t\t\tconst fallback = available.find((m) => m.provider !== providerId);\n\t\t\t\t\t\t\t\t\tif (fallback) {\n\t\t\t\t\t\t\t\t\t\tawait host.session.setModel(fallback);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\t\t// Model switch failed — user can manually switch via /model\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\thost.showStatus(`Logged out of ${providerName}`);\n\t\t\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\t\t\thost.showError(`Logout failed: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\thandleAsync().catch(() => {\n\t\t\t\t\t// Swallow — showLoginDialog already handles its own errors.\n\t\t\t\t});\n\t\t\t},\n\t\t\t() => {\n\t\t\t\tdone();\n\t\t\t\thost.ui.requestRender();\n\t\t\t},\n\t\t\tloginProviders,\n\t\t);\n\t\treturn { component: selector, focus: selector };\n\t});\n}\n\nexport async function handleLoginProviderSelection(host: InteractiveModeDelegateHost, providerId: string): Promise<void> {\n\tconst modelRegistry = host.session.modelRegistry;\n\tconst authMode = modelRegistry.getProviderAuthMode(providerId);\n\n\tif (authMode === \"externalCli\") {\n\t\tawait activateExternalCliProvider(host, providerId);\n\t\treturn;\n\t}\n\n\tconst oauthProvider = modelRegistry.authStorage.getOAuthProviders().find((provider) => provider.id === providerId);\n\tif (oauthProvider && isBrowserOAuthProviderAllowed(providerId)) {\n\t\tawait host.showLoginDialog(providerId);\n\t\treturn;\n\t}\n\n\tawait showApiKeyLoginDialog(host, providerId);\n}\n\nasync function activateExternalCliProvider(host: InteractiveModeDelegateHost, providerId: string): Promise<void> {\n\tconst modelRegistry = host.session.modelRegistry;\n\tconst providerName = modelRegistry.getProviderDisplayName(providerId);\n\n\tif (!modelRegistry.isProviderRequestReady(providerId)) {\n\t\thost.showError(`${providerName} is not ready. Run the provider's own login command, then try /login again.`);\n\t\treturn;\n\t}\n\n\tmodelRegistry.authStorage.set(providerId, { type: \"api_key\", key: \"cli\" });\n\tmodelRegistry.refresh();\n\tawait host.updateAvailableProviderCount();\n\n\tconst targetModel = modelRegistry.getAvailable().find((model) => model.provider === providerId);\n\tif (targetModel) {\n\t\tawait host.session.setModel(targetModel);\n\t\thost.showStatus(`Using ${providerName}: ${providerId}/${targetModel.id}`);\n\t} else {\n\t\thost.showStatus(`${providerName} is ready. Use /model to choose a model.`);\n\t}\n}\n\nasync function showApiKeyLoginDialog(host: InteractiveModeDelegateHost, providerId: string): Promise<void> {\n\tconst providerName = host.session.modelRegistry.getProviderDisplayName(providerId);\n\tconst dialog = new LoginDialogComponent(host.ui, providerId, (_success, _message) => {}, providerName);\n\n\thost.editorContainer.clear();\n\thost.editorContainer.addChild(dialog);\n\thost.ui.setFocus(dialog);\n\thost.ui.requestRender();\n\n\tconst restoreEditor = () => {\n\t\tdialog.dispose();\n\t\thost.editorContainer.clear();\n\t\thost.editorContainer.addChild(host.editor);\n\t\thost.ui.setFocus(host.editor);\n\t\thost.ui.requestRender();\n\t};\n\n\ttry {\n\t\tconst prompt = buildApiKeyLoginPrompt(providerId, providerName);\n\t\tconst apiKey = (await dialog.showPrompt(prompt.message, prompt.placeholder)).trim();\n\t\tif (!apiKey) {\n\t\t\tthrow new Error(\"API key is required\");\n\t\t}\n\n\t\thost.session.modelRegistry.authStorage.set(providerId, { type: \"api_key\", key: apiKey });\n\t\trestoreEditor();\n\t\thost.session.modelRegistry.refresh();\n\t\tawait host.updateAvailableProviderCount();\n\n\t\tconst targetModel = host.session.modelRegistry.getAvailable().find((model) => model.provider === providerId);\n\t\tif (targetModel) {\n\t\t\tawait host.session.setModel(targetModel);\n\t\t}\n\n\t\thost.showStatus(`Saved ${providerName} API key to ${getAuthPath()}`);\n\t} catch (error: unknown) {\n\t\trestoreEditor();\n\t\tconst errorMsg = error instanceof Error ? error.message : String(error);\n\t\tif (errorMsg !== \"Login cancelled\" && !errorMsg.includes(\"Superseded\") && !errorMsg.includes(\"disposed\")) {\n\t\t\thost.showError(`Failed to save ${providerName} API key: ${errorMsg}`);\n\t\t}\n\t}\n}\n\nexport async function showLoginDialog(host: InteractiveModeDelegateHost, providerId: string): Promise<void> {\n\tif (!isBrowserOAuthProviderAllowed(providerId)) {\n\t\tawait showApiKeyLoginDialog(host, providerId);\n\t\treturn;\n\t}\n\n\tconst providerInfo = host.session.modelRegistry.authStorage.getOAuthProviders().find((p) => p.id === providerId);\n\tconst providerName = providerInfo?.name || providerId;\n\tconst usesCallbackServer = providerInfo?.usesCallbackServer ?? false;\n\n\tconst dialog = new LoginDialogComponent(host.ui, providerId, (_success, _message) => {});\n\n\thost.editorContainer.clear();\n\thost.editorContainer.addChild(dialog);\n\thost.ui.setFocus(dialog);\n\thost.ui.requestRender();\n\n\tconst restoreEditor = () => {\n\t\tdialog.dispose();\n\t\thost.editorContainer.clear();\n\t\thost.editorContainer.addChild(host.editor);\n\t\thost.ui.setFocus(host.editor);\n\t\thost.ui.requestRender();\n\t};\n\n\ttry {\n\t\tawait host.session.modelRegistry.authStorage.login(providerId as OAuthProviderId, {\n\t\t\tonAuth: (info: { url: string; instructions?: string }) => {\n\t\t\t\tdialog.showAuth(info.url, info.instructions);\n\n\t\t\t\tif (!usesCallbackServer && providerId === \"github-copilot\") {\n\t\t\t\t\tdialog.showWaiting(\"Waiting for browser authentication...\");\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tonPrompt: async (prompt: { message: string; placeholder?: string; allowEmpty?: boolean }) => {\n\t\t\t\treturn dialog.showPrompt(prompt.message, prompt.placeholder, { allowEmpty: prompt.allowEmpty });\n\t\t\t},\n\n\t\t\tonProgress: (message: string) => {\n\t\t\t\tdialog.showProgress(message);\n\t\t\t},\n\n\t\t\tonManualCodeInput: usesCallbackServer\n\t\t\t\t? () => dialog.showManualInput(\"Paste redirect URL below, or complete login in browser:\")\n\t\t\t\t: undefined,\n\n\t\t\tonDeviceCode: (info) => {\n\t\t\t\tdialog.showDeviceCode(info);\n\t\t\t\tdialog.showWaiting(\"Waiting for browser authentication...\");\n\t\t\t},\n\t\t\tonSelect: async (prompt) => prompt.options[0]?.id,\n\n\t\t\tsignal: dialog.signal,\n\t\t});\n\n\t\trestoreEditor();\n\t\thost.session.modelRegistry.refresh();\n\t\tawait host.updateAvailableProviderCount();\n\n\t\ttry {\n\t\t\tconst currentModel = host.session.model;\n\t\t\tif (currentModel) {\n\t\t\t\tconst currentKey = await host.session.modelRegistry.getApiKey(currentModel);\n\t\t\t\tif (!currentKey) {\n\t\t\t\t\tconst available = host.session.modelRegistry.getAvailable();\n\t\t\t\t\tconst newProviderModel = available.find((m) => m.provider === providerId);\n\t\t\t\t\tif (newProviderModel) {\n\t\t\t\t\t\tawait host.session.setModel(newProviderModel);\n\t\t\t\t\t} else if (available.length > 0) {\n\t\t\t\t\t\tawait host.session.setModel(available[0]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Model switch failed — user can manually switch via /model\n\t\t}\n\n\t\thost.showStatus(`Logged in to ${providerName}. Credentials saved to ${getAuthPath()}`);\n\t} catch (error: unknown) {\n\t\trestoreEditor();\n\t\tconst errorMsg = error instanceof Error ? error.message : String(error);\n\t\tif (errorMsg !== \"Login cancelled\" && !errorMsg.includes(\"Superseded\") && !errorMsg.includes(\"disposed\")) {\n\t\t\thost.showError(`Failed to login to ${providerName}: ${errorMsg}`);\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"interactive-selectors-auth.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-selectors-auth.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Extracted from interactive-selectors-session.ts (Phase E2 seam remediation).\n// @ts-nocheck\n\nimport type { OAuthProviderId } from \"@gsd/pi-ai\";\nimport { getApiKeyEnvVars } from \"@gsd/pi-ai\";\nimport { getAuthPath } from \"@gsd/pi-coding-agent/config.js\";\nimport { BUILT_IN_PROVIDER_DISPLAY_NAMES } from \"@gsd/pi-coding-agent/core/provider-display-names.js\";\nimport { LoginDialogComponent } from \"./components/login-dialog.js\";\nimport { type AuthSelectorProvider, OAuthSelectorComponent } from \"./components/oauth-selector.js\";\nimport type { InteractiveModeDelegateHost } from \"./interactive-mode-delegate-host.js\";\n\nconst BLOCKED_BROWSER_OAUTH_PROVIDERS = new Set([\"anthropic\"]);\n\nfunction isBrowserOAuthProviderAllowed(providerId: string): boolean {\n\treturn !BLOCKED_BROWSER_OAUTH_PROVIDERS.has(providerId);\n}\n\nfunction uniqueProviders(providers: AuthSelectorProvider[]): AuthSelectorProvider[] {\n\tconst seen = new Set<string>();\n\tconst unique: AuthSelectorProvider[] = [];\n\tfor (const provider of providers) {\n\t\tif (seen.has(provider.id)) continue;\n\t\tseen.add(provider.id);\n\t\tunique.push(provider);\n\t}\n\treturn unique;\n}\n\nfunction formatAuthStatus(status: { source?: string; label?: string } | undefined): string | undefined {\n\tif (!status?.source) return undefined;\n\tif (status.source === \"stored\") return \"✓ configured\";\n\tif (status.source === \"environment\" && status.label) return `✓ env: ${status.label}`;\n\tif (status.source === \"runtime\" && status.label) return `✓ ${status.label}`;\n\tif (status.source === \"models_json_command\") return \"✓ command in models.json\";\n\tif (status.source === \"models_json_key\") return \"✓ key in models.json\";\n\tif (status.source === \"fallback\") return \"✓ configured\";\n\treturn undefined;\n}\n\nfunction formatEnvHint(envVars: readonly string[] | undefined): string {\n\tif (!envVars || envVars.length === 0) return \"\";\n\treturn ` (or set ${envVars.join(\" / \")})`;\n}\n\nfunction apiKeyCredentialLabel(providerId: string): string {\n\tif (providerId === \"huggingface\") return \"user access token\";\n\treturn \"API key\";\n}\n\nfunction apiKeyPlaceholder(providerId: string): string | undefined {\n\tif (providerId === \"huggingface\") return \"hf_...\";\n\treturn undefined;\n}\n\nexport function buildApiKeyLoginPrompt(providerId: string, providerName: string): {\n\tmessage: string;\n\tplaceholder?: string;\n} {\n\tconst credentialLabel = apiKeyCredentialLabel(providerId);\n\tconst envHint = formatEnvHint(getApiKeyEnvVars(providerId));\n\treturn {\n\t\tmessage: `Paste your ${providerName} ${credentialLabel}${envHint}:`,\n\t\tplaceholder: apiKeyPlaceholder(providerId),\n\t};\n}\n\nfunction getApiKeyProviderDisplayName(host: InteractiveModeDelegateHost, providerId: string): string {\n\treturn BUILT_IN_PROVIDER_DISPLAY_NAMES[providerId] ?? host.session.modelRegistry.getProviderDisplayName(providerId);\n}\n\nexport function buildLoginProviderOptions(host: InteractiveModeDelegateHost): AuthSelectorProvider[] {\n\tconst modelRegistry = host.session.modelRegistry;\n\tconst allOAuthProviders = modelRegistry.authStorage.getOAuthProviders();\n\tconst oauthProviders = allOAuthProviders.filter((provider) => isBrowserOAuthProviderAllowed(provider.id));\n\tconst oauthProviderIds = new Set(oauthProviders.map((provider) => provider.id));\n\tconst apiKeyOnlyOAuthProviderIds = new Set(\n\t\tallOAuthProviders.filter((provider) => !isBrowserOAuthProviderAllowed(provider.id)).map((provider) => provider.id),\n\t);\n\tconst modelProviderIds = Array.from(new Set(modelRegistry.getAll().map((model) => model.provider))).sort();\n\n\tconst externalCliProviders = modelProviderIds\n\t\t.filter((providerId) => modelRegistry.getProviderAuthMode(providerId) === \"externalCli\")\n\t\t.map((providerId) => ({\n\t\t\tid: providerId,\n\t\t\tname: modelRegistry.getProviderDisplayName(providerId),\n\t\t\tauthType: \"external_cli\" as const,\n\t\t\tstatusLabel: modelRegistry.isProviderRequestReady(providerId) ? \"✓ ready\" : undefined,\n\t\t}));\n\n\tconst apiKeyProviders = modelProviderIds\n\t\t.filter(\n\t\t\t(providerId) =>\n\t\t\t\tmodelRegistry.getProviderAuthMode(providerId) === \"apiKey\" || apiKeyOnlyOAuthProviderIds.has(providerId),\n\t\t)\n\t\t.filter((providerId) => !oauthProviderIds.has(providerId))\n\t\t.map((providerId) => ({\n\t\t\tid: providerId,\n\t\t\tname: getApiKeyProviderDisplayName(host, providerId),\n\t\t\tauthType: \"api_key\" as const,\n\t\t\tstatusLabel: formatAuthStatus(modelRegistry.getProviderAuthStatus(providerId)),\n\t\t}));\n\n\tconst browserOAuthProviders = oauthProviders.map((provider) => ({\n\t\t...provider,\n\t\tauthType: \"oauth\" as const,\n\t\tstatusLabel: formatAuthStatus(modelRegistry.getProviderAuthStatus(provider.id)),\n\t}));\n\n\treturn uniqueProviders([\n\t\t...externalCliProviders,\n\t\t...apiKeyProviders,\n\t\t...browserOAuthProviders,\n\t]);\n}\n\nexport async function showOAuthSelector(host: InteractiveModeDelegateHost, mode: \"login\" | \"logout\"): Promise<void> {\n\tconst loginProviders = mode === \"login\" ? buildLoginProviderOptions(host) : undefined;\n\n\tif (mode === \"logout\") {\n\t\tconst providers = host.session.modelRegistry.authStorage.list();\n\t\tconst loggedInProviders = providers.filter(\n\t\t\t(p) => host.session.modelRegistry.authStorage.get(p)?.type === \"oauth\",\n\t\t);\n\t\tif (loggedInProviders.length === 0) {\n\t\t\thost.showStatus(\"No OAuth providers logged in. Use /login first.\");\n\t\t\treturn;\n\t\t}\n\t}\n\n\thost.showSelector((done) => {\n\t\tconst selector = new OAuthSelectorComponent(\n\t\t\tmode,\n\t\t\thost.session.modelRegistry.authStorage,\n\t\t\t(providerId: string) => {\n\t\t\t\tdone();\n\n\t\t\t\tconst handleAsync = async () => {\n\t\t\t\t\tif (mode === \"login\") {\n\t\t\t\t\t\tawait handleLoginProviderSelection(host, providerId);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst providerInfo = host.session.modelRegistry.authStorage\n\t\t\t\t\t\t\t.getOAuthProviders()\n\t\t\t\t\t\t\t.find((p) => p.id === providerId);\n\t\t\t\t\t\tconst providerName = providerInfo?.name || providerId;\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\thost.session.modelRegistry.authStorage.logout(providerId);\n\t\t\t\t\t\t\thost.session.modelRegistry.refresh();\n\t\t\t\t\t\t\tawait host.updateAvailableProviderCount();\n\n\t\t\t\t\t\t\tconst currentModel = host.session.model;\n\t\t\t\t\t\t\tif (currentModel?.provider === providerId) {\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tconst available = host.session.modelRegistry.getAvailable();\n\t\t\t\t\t\t\t\t\tconst fallback = available.find((m) => m.provider !== providerId);\n\t\t\t\t\t\t\t\t\tif (fallback) {\n\t\t\t\t\t\t\t\t\t\tawait host.session.setModel(fallback);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\t\t// Model switch failed — user can manually switch via /model\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\thost.showStatus(`Logged out of ${providerName}`);\n\t\t\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\t\t\thost.showError(`Logout failed: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\thandleAsync().catch(() => {\n\t\t\t\t\t// Swallow — showLoginDialog already handles its own errors.\n\t\t\t\t});\n\t\t\t},\n\t\t\t() => {\n\t\t\t\tdone();\n\t\t\t\thost.ui.requestRender();\n\t\t\t},\n\t\t\tloginProviders,\n\t\t);\n\t\treturn { component: selector, focus: selector };\n\t});\n}\n\nexport async function handleLoginProviderSelection(host: InteractiveModeDelegateHost, providerId: string): Promise<void> {\n\tconst modelRegistry = host.session.modelRegistry;\n\tconst authMode = modelRegistry.getProviderAuthMode(providerId);\n\n\tif (authMode === \"externalCli\") {\n\t\tawait activateExternalCliProvider(host, providerId);\n\t\treturn;\n\t}\n\n\tconst oauthProvider = modelRegistry.authStorage.getOAuthProviders().find((provider) => provider.id === providerId);\n\tif (oauthProvider && isBrowserOAuthProviderAllowed(providerId)) {\n\t\tawait host.showLoginDialog(providerId);\n\t\treturn;\n\t}\n\n\tawait showApiKeyLoginDialog(host, providerId);\n}\n\nasync function activateExternalCliProvider(host: InteractiveModeDelegateHost, providerId: string): Promise<void> {\n\tconst modelRegistry = host.session.modelRegistry;\n\tconst providerName = modelRegistry.getProviderDisplayName(providerId);\n\n\tif (!modelRegistry.isProviderRequestReady(providerId)) {\n\t\thost.showError(`${providerName} is not ready. Run the provider's own login command, then try /login again.`);\n\t\treturn;\n\t}\n\n\tmodelRegistry.authStorage.set(providerId, { type: \"api_key\", key: \"cli\" });\n\tmodelRegistry.refresh();\n\tawait host.updateAvailableProviderCount();\n\n\tconst targetModel = modelRegistry.getAvailable().find((model) => model.provider === providerId);\n\tif (targetModel) {\n\t\tawait host.session.setModel(targetModel);\n\t\thost.showStatus(`Using ${providerName}: ${providerId}/${targetModel.id}`);\n\t} else {\n\t\thost.showStatus(`${providerName} is ready. Use /model to choose a model.`);\n\t}\n}\n\nasync function showApiKeyLoginDialog(host: InteractiveModeDelegateHost, providerId: string): Promise<void> {\n\tconst providerName = host.session.modelRegistry.getProviderDisplayName(providerId);\n\tconst dialog = new LoginDialogComponent(host.ui, providerId, (_success, _message) => {}, providerName);\n\n\thost.editorContainer.clear();\n\thost.editorContainer.addChild(dialog);\n\thost.ui.setFocus(dialog);\n\thost.ui.requestRender();\n\n\tconst restoreEditor = () => {\n\t\tdialog.dispose();\n\t\thost.editorContainer.clear();\n\t\thost.editorContainer.addChild(host.editor);\n\t\thost.ui.setFocus(host.editor);\n\t\thost.ui.requestRender();\n\t};\n\n\ttry {\n\t\tconst prompt = buildApiKeyLoginPrompt(providerId, providerName);\n\t\tconst apiKey = (await dialog.showPrompt(prompt.message, prompt.placeholder)).trim();\n\t\tif (!apiKey) {\n\t\t\tthrow new Error(\"API key is required\");\n\t\t}\n\n\t\thost.session.modelRegistry.authStorage.set(providerId, { type: \"api_key\", key: apiKey });\n\t\trestoreEditor();\n\t\thost.session.modelRegistry.refresh();\n\t\tawait host.updateAvailableProviderCount();\n\n\t\tconst targetModel = host.session.modelRegistry.getAvailable().find((model) => model.provider === providerId);\n\t\tif (targetModel) {\n\t\t\tawait host.session.setModel(targetModel);\n\t\t}\n\n\t\thost.showStatus(`Saved ${providerName} API key to ${getAuthPath()}`);\n\t} catch (error: unknown) {\n\t\trestoreEditor();\n\t\tconst errorMsg = error instanceof Error ? error.message : String(error);\n\t\tif (errorMsg !== \"Login cancelled\" && !errorMsg.includes(\"Superseded\") && !errorMsg.includes(\"disposed\")) {\n\t\t\thost.showError(`Failed to save ${providerName} API key: ${errorMsg}`);\n\t\t}\n\t}\n}\n\nexport async function showLoginDialog(host: InteractiveModeDelegateHost, providerId: string): Promise<void> {\n\tif (!isBrowserOAuthProviderAllowed(providerId)) {\n\t\tawait showApiKeyLoginDialog(host, providerId);\n\t\treturn;\n\t}\n\n\tconst providerInfo = host.session.modelRegistry.authStorage.getOAuthProviders().find((p) => p.id === providerId);\n\tconst providerName = providerInfo?.name || providerId;\n\tconst usesCallbackServer = providerInfo?.usesCallbackServer ?? false;\n\n\tconst dialog = new LoginDialogComponent(host.ui, providerId, (_success, _message) => {});\n\n\thost.editorContainer.clear();\n\thost.editorContainer.addChild(dialog);\n\thost.ui.setFocus(dialog);\n\thost.ui.requestRender();\n\n\tconst restoreEditor = () => {\n\t\tdialog.dispose();\n\t\thost.editorContainer.clear();\n\t\thost.editorContainer.addChild(host.editor);\n\t\thost.ui.setFocus(host.editor);\n\t\thost.ui.requestRender();\n\t};\n\n\ttry {\n\t\tawait host.session.modelRegistry.authStorage.login(providerId as OAuthProviderId, {\n\t\t\tonAuth: (info: { url: string; instructions?: string }) => {\n\t\t\t\tdialog.showAuth(info.url, info.instructions);\n\n\t\t\t\tif (!usesCallbackServer && providerId === \"github-copilot\") {\n\t\t\t\t\tdialog.showWaiting(\"Waiting for browser authentication...\");\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tonPrompt: async (prompt: { message: string; placeholder?: string; allowEmpty?: boolean }) => {\n\t\t\t\treturn dialog.showPrompt(prompt.message, prompt.placeholder, { allowEmpty: prompt.allowEmpty });\n\t\t\t},\n\n\t\t\tonProgress: (message: string) => {\n\t\t\t\tdialog.showProgress(message);\n\t\t\t},\n\n\t\t\tonManualCodeInput: usesCallbackServer\n\t\t\t\t? () => dialog.showManualInput(\"Paste redirect URL below, or complete login in browser:\")\n\t\t\t\t: undefined,\n\n\t\t\tonDeviceCode: (info) => {\n\t\t\t\tdialog.showDeviceCode(info);\n\t\t\t\tdialog.showWaiting(\"Waiting for browser authentication...\");\n\t\t\t},\n\t\t\tonSelect: async (prompt) => prompt.options[0]?.id,\n\n\t\t\tsignal: dialog.signal,\n\t\t});\n\n\t\trestoreEditor();\n\t\thost.session.modelRegistry.refresh();\n\t\tawait host.updateAvailableProviderCount();\n\n\t\ttry {\n\t\t\tconst currentModel = host.session.model;\n\t\t\tif (currentModel) {\n\t\t\t\tconst currentKey = await host.session.modelRegistry.getApiKey(currentModel);\n\t\t\t\tif (!currentKey) {\n\t\t\t\t\tconst available = host.session.modelRegistry.getAvailable();\n\t\t\t\t\tconst newProviderModel = available.find((m) => m.provider === providerId);\n\t\t\t\t\tif (newProviderModel) {\n\t\t\t\t\t\tawait host.session.setModel(newProviderModel);\n\t\t\t\t\t} else if (available.length > 0) {\n\t\t\t\t\t\tawait host.session.setModel(available[0]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Model switch failed — user can manually switch via /model\n\t\t}\n\n\t\thost.showStatus(`Logged in to ${providerName}. Credentials saved to ${getAuthPath()}`);\n\t} catch (error: unknown) {\n\t\trestoreEditor();\n\t\tconst errorMsg = error instanceof Error ? error.message : String(error);\n\t\tif (errorMsg !== \"Login cancelled\" && !errorMsg.includes(\"Superseded\") && !errorMsg.includes(\"disposed\")) {\n\t\t\thost.showError(`Failed to login to ${providerName}: ${errorMsg}`);\n\t\t}\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc-mode.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-mode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAsBpD,YAAY,EACX,UAAU,EACV,qBAAqB,EACrB,sBAAsB,EACtB,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,UAAU,GACV,MAAM,gBAAgB,CAAC;AAExB;;;GAGG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"rpc-mode.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-mode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAsBpD,YAAY,EACX,UAAU,EACV,qBAAqB,EACrB,sBAAsB,EACtB,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,UAAU,GACV,MAAM,gBAAgB,CAAC;AAExB;;;GAGG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,CAi1BtE"}
|
|
@@ -551,7 +551,9 @@ export async function runRpcMode(session) {
|
|
|
551
551
|
// Bash
|
|
552
552
|
// =================================================================
|
|
553
553
|
case "bash": {
|
|
554
|
-
const result = await session.executeBash(command.command
|
|
554
|
+
const result = await session.executeBash(command.command, undefined, {
|
|
555
|
+
excludeFromContext: command.excludeFromContext,
|
|
556
|
+
});
|
|
555
557
|
return success(id, "bash", result);
|
|
556
558
|
}
|
|
557
559
|
case "abort_bash": {
|