gsd-pi 2.76.0-dev.fe143342a → 2.77.0-dev.1d17f366c
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/README.md +17 -35
- package/dist/claude-cli-check.js +32 -3
- package/dist/cli-web-branch.d.ts +1 -0
- package/dist/cli-web-branch.js +3 -0
- package/dist/cli.js +38 -2
- package/dist/extension-discovery.d.ts +6 -0
- package/dist/extension-discovery.js +37 -0
- package/dist/extension-registry.d.ts +3 -0
- package/dist/extension-sort.d.ts +18 -0
- package/dist/extension-sort.js +114 -0
- package/dist/extension-validator.d.ts +47 -0
- package/dist/extension-validator.js +127 -0
- package/dist/loader.js +35 -7
- package/dist/onboarding.js +45 -0
- package/dist/provider-migrations.d.ts +18 -0
- package/dist/provider-migrations.js +14 -0
- package/dist/resources/extensions/claude-code-cli/readiness.js +4 -3
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +78 -59
- package/dist/resources/extensions/cmux/index.js +20 -0
- package/dist/resources/extensions/github-sync/templates.js +103 -0
- package/dist/resources/extensions/google-search/extension-manifest.json +5 -4
- package/dist/resources/extensions/google-search/index.js +3 -375
- package/dist/resources/extensions/gsd/abandon-detect.js +44 -0
- package/dist/resources/extensions/gsd/auto/loop.js +90 -2
- package/dist/resources/extensions/gsd/auto/phases.js +95 -21
- package/dist/resources/extensions/gsd/auto/resolve.js +24 -0
- package/dist/resources/extensions/gsd/auto/run-unit.js +48 -4
- package/dist/resources/extensions/gsd/auto/session.js +18 -1
- package/dist/resources/extensions/gsd/auto/turn-epoch.js +95 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +115 -17
- package/dist/resources/extensions/gsd/auto-loop.js +1 -1
- package/dist/resources/extensions/gsd/auto-model-selection.js +1 -1
- package/dist/resources/extensions/gsd/auto-post-unit.js +90 -2
- package/dist/resources/extensions/gsd/auto-prompts.js +14 -0
- package/dist/resources/extensions/gsd/auto-recovery.js +46 -1
- package/dist/resources/extensions/gsd/auto-start.js +45 -39
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +11 -5
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +11 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +109 -61
- package/dist/resources/extensions/gsd/auto.js +97 -31
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +27 -1
- package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +4 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +11 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +17 -6
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +11 -6
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +34 -2
- package/dist/resources/extensions/gsd/clean-root-preflight.js +93 -0
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +31 -4
- package/dist/resources/extensions/gsd/commands-cmux.js +9 -6
- package/dist/resources/extensions/gsd/commands-extensions.js +634 -43
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +968 -23
- package/dist/resources/extensions/gsd/dispatch-guard.js +29 -3
- package/dist/resources/extensions/gsd/file-lock.js +49 -9
- package/dist/resources/extensions/gsd/git-service.js +1 -0
- package/dist/resources/extensions/gsd/gitignore.js +2 -0
- package/dist/resources/extensions/gsd/gsd-db.js +90 -30
- package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -1
- package/dist/resources/extensions/gsd/guided-flow.js +212 -9
- package/dist/resources/extensions/gsd/health-widget.js +4 -1
- package/dist/resources/extensions/gsd/journal.js +17 -2
- package/dist/resources/extensions/gsd/key-manager.js +22 -0
- package/dist/resources/extensions/gsd/milestone-actions.js +15 -0
- package/dist/resources/extensions/gsd/milestone-summary-classifier.js +37 -0
- package/dist/resources/extensions/gsd/model-router.js +36 -3
- package/dist/resources/extensions/gsd/notifications.js +30 -16
- package/dist/resources/extensions/gsd/pre-execution-checks.js +31 -6
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +29 -2
- package/dist/resources/extensions/gsd/prompts/discuss.md +29 -2
- package/dist/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
- package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +5 -2
- package/dist/resources/extensions/gsd/prompts/system.md +1 -0
- package/dist/resources/extensions/gsd/reports.js +5 -4
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +96 -0
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +12 -4
- package/dist/resources/extensions/gsd/safety/safety-harness.js +5 -1
- package/dist/resources/extensions/gsd/state-transition-matrix.js +118 -0
- package/dist/resources/extensions/gsd/state.js +25 -25
- package/dist/resources/extensions/gsd/token-counter.js +22 -5
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +16 -10
- package/dist/resources/extensions/gsd/tools/complete-slice.js +21 -0
- package/dist/resources/extensions/gsd/tools/complete-task.js +31 -0
- package/dist/resources/extensions/gsd/uok/audit.js +18 -2
- package/dist/resources/extensions/gsd/uok/dispatch-envelope.js +33 -0
- package/dist/resources/extensions/gsd/uok/execution-graph.js +10 -0
- package/dist/resources/extensions/gsd/uok/gitops.js +2 -1
- package/dist/resources/extensions/gsd/uok/loop-adapter.js +37 -10
- package/dist/resources/extensions/gsd/uok/parity-report.js +58 -0
- package/dist/resources/extensions/gsd/uok/plan-v2.js +30 -7
- package/dist/resources/extensions/gsd/uok/writer.js +82 -0
- package/dist/resources/extensions/gsd/workflow-logger.js +10 -2
- package/dist/resources/extensions/gsd/worktree-manager.js +1 -0
- package/dist/resources/extensions/gsd/worktree-resolver.js +50 -10
- package/dist/resources/extensions/mcp-client/auth.js +10 -1
- package/dist/resources/extensions/mcp-client/index.js +118 -9
- package/dist/resources/extensions/shared/cmux-events.js +12 -0
- package/dist/resources/extensions/shared/rtk-session-stats.js +1 -2
- package/dist/resources/skills/create-skill/SKILL.md +2 -2
- package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +4 -4
- package/dist/resources/skills/create-skill/workflows/audit-skill.md +4 -4
- package/dist/resources/skills/create-skill/workflows/create-new-skill.md +5 -5
- package/dist/resources/skills/verify-before-complete/SKILL.md +2 -1
- package/dist/resources/skills/write-docs/SKILL.md +2 -1
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
- 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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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/notifications/route.js +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 +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 +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 +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 +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 +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 +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 +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 +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/skill-health/route.js +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 +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 +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 +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 +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 +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/visualizer/route.js +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 +9 -9
- package/dist/web/standalone/.next/server/chunks/1926.js +1 -0
- package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
- 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/2826.e9f5195e91f9cad2.js +11 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-5fc74f13a25fa1bb.js → webpack-2e68521d7c82f7c2.js} +1 -1
- package/dist/welcome-screen.js +6 -1
- package/dist/wizard.js +2 -0
- package/package.json +16 -14
- package/packages/daemon/package.json +2 -2
- package/packages/mcp-server/README.md +3 -3
- package/packages/mcp-server/dist/env-writer.d.ts +1 -0
- package/packages/mcp-server/dist/env-writer.d.ts.map +1 -1
- package/packages/mcp-server/dist/env-writer.js +74 -6
- package/packages/mcp-server/dist/env-writer.js.map +1 -1
- package/packages/mcp-server/dist/remote-questions.d.ts +45 -0
- package/packages/mcp-server/dist/remote-questions.d.ts.map +1 -0
- package/packages/mcp-server/dist/remote-questions.js +732 -0
- package/packages/mcp-server/dist/remote-questions.js.map +1 -0
- package/packages/mcp-server/dist/server.d.ts +7 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +95 -10
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/session-manager.d.ts +14 -0
- package/packages/mcp-server/dist/session-manager.d.ts.map +1 -1
- package/packages/mcp-server/dist/session-manager.js +49 -1
- package/packages/mcp-server/dist/session-manager.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +15 -6
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +9 -3
- package/packages/mcp-server/src/env-writer.test.ts +79 -1
- package/packages/mcp-server/src/env-writer.ts +76 -6
- package/packages/mcp-server/src/mcp-server.test.ts +67 -0
- package/packages/mcp-server/src/readers/readers.test.ts +5 -1
- package/packages/mcp-server/src/remote-questions.test.ts +294 -0
- package/packages/mcp-server/src/remote-questions.ts +916 -0
- package/packages/mcp-server/src/server.ts +118 -16
- package/packages/mcp-server/src/session-manager.ts +43 -1
- package/packages/mcp-server/src/workflow-tools.test.ts +44 -0
- package/packages/mcp-server/src/workflow-tools.ts +19 -6
- package/packages/mcp-server/tsconfig.test.json +19 -0
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +6 -1
- package/packages/native/src/__tests__/clipboard.test.mjs +69 -23
- package/packages/native/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/package.json +6 -1
- package/packages/pi-agent-core/src/agent-loop.test.ts +220 -15
- package/packages/pi-ai/dist/models/custom.d.ts +38 -0
- package/packages/pi-ai/dist/models/custom.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/custom.js +41 -0
- package/packages/pi-ai/dist/models/custom.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js +1 -1
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.js +27 -4
- package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +8 -3
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +80 -0
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/simple-options.d.ts +10 -0
- package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.js +16 -1
- package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
- package/packages/pi-ai/package.json +6 -1
- package/packages/pi-ai/src/models/custom.ts +42 -0
- package/packages/pi-ai/src/providers/anthropic-auth.test.ts +1 -1
- package/packages/pi-ai/src/providers/anthropic-shared.ts +26 -5
- package/packages/pi-ai/src/providers/anthropic.ts +9 -3
- package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +98 -0
- package/packages/pi-ai/src/providers/simple-options.ts +17 -1
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +3 -2
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +7 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +25 -0
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js +105 -6
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +230 -28
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts +30 -2
- package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/utils.js +113 -12
- package/packages/pi-coding-agent/dist/core/compaction/utils.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +29 -18
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js +130 -0
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/compaction-utils.test.js +56 -1
- package/packages/pi-coding-agent/dist/core/compaction-utils.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/discovery-cache.test.js +8 -15
- package/packages/pi-coding-agent/dist/core/discovery-cache.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.d.ts +25 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.js +109 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-registry.d.ts +67 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-registry.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-registry.js +167 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-registry.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +3 -2
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +24 -8
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +14 -0
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js +11 -0
- package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +2 -2
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.js +203 -0
- package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +14 -0
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +4 -1
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.test.js +19 -1
- package/packages/pi-coding-agent/dist/core/sdk.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.js +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.test.js +21 -1
- package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +3 -3
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/path-utils.test.js +2 -1
- package/packages/pi-coding-agent/dist/core/tools/path-utils.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js +15 -6
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +14 -5
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts +7 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js +31 -9
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +14 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +13 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/package.json +6 -1
- package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +3 -2
- package/packages/pi-coding-agent/src/core/agent-session.ts +11 -0
- package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +368 -28
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +122 -6
- package/packages/pi-coding-agent/src/core/compaction/utils.ts +111 -13
- package/packages/pi-coding-agent/src/core/compaction-orchestrator.test.ts +154 -0
- package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +32 -18
- package/packages/pi-coding-agent/src/core/compaction-utils.test.ts +68 -1
- package/packages/pi-coding-agent/src/core/discovery-cache.test.ts +9 -18
- package/packages/pi-coding-agent/src/core/extensions/extension-discovery.ts +119 -0
- package/packages/pi-coding-agent/src/core/extensions/extension-registry.ts +222 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +24 -11
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +2 -0
- package/packages/pi-coding-agent/src/core/extensions/types.ts +15 -0
- package/packages/pi-coding-agent/src/core/lsp/lsp-integration.test.ts +13 -0
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +2 -2
- package/packages/pi-coding-agent/src/core/model-registry-custom-caps.test.ts +245 -0
- package/packages/pi-coding-agent/src/core/model-registry.ts +16 -0
- package/packages/pi-coding-agent/src/core/resource-loader.ts +1 -1
- package/packages/pi-coding-agent/src/core/sdk.test.ts +25 -1
- package/packages/pi-coding-agent/src/core/sdk.ts +10 -3
- package/packages/pi-coding-agent/src/core/session-manager.test.ts +30 -1
- package/packages/pi-coding-agent/src/core/session-manager.ts +1 -1
- package/packages/pi-coding-agent/src/core/system-prompt.ts +3 -3
- package/packages/pi-coding-agent/src/core/tools/path-utils.test.ts +2 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/provider-display-name.test.ts +17 -7
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +14 -5
- package/packages/pi-coding-agent/src/modes/interactive/components/model-selector.ts +45 -11
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +14 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +13 -1
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js +12 -5
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
- package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js +21 -0
- package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.d.ts +7 -0
- package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.js +20 -0
- package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
- package/packages/pi-tui/package.json +6 -1
- package/packages/pi-tui/src/__tests__/autocomplete.test.ts +20 -5
- package/packages/pi-tui/src/__tests__/stdin-buffer.test.ts +27 -0
- package/packages/pi-tui/src/stdin-buffer.ts +26 -0
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/package.json +6 -1
- package/pkg/package.json +1 -1
- package/scripts/install.js +512 -0
- package/scripts/lib/workspace-manifest.cjs +86 -0
- package/scripts/link-workspace-packages.cjs +5 -17
- package/scripts/postinstall.js +9 -178
- package/src/resources/extensions/claude-code-cli/readiness.ts +4 -3
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +91 -63
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +114 -12
- package/src/resources/extensions/cmux/index.ts +35 -10
- package/src/resources/extensions/github-sync/templates.ts +151 -0
- package/src/resources/extensions/github-sync/tests/templates.test.ts +59 -0
- package/src/resources/extensions/google-search/extension-manifest.json +5 -4
- package/src/resources/extensions/google-search/index.ts +9 -470
- package/src/resources/extensions/gsd/abandon-detect.ts +62 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +14 -1
- package/src/resources/extensions/gsd/auto/loop.ts +104 -2
- package/src/resources/extensions/gsd/auto/phases.ts +123 -21
- package/src/resources/extensions/gsd/auto/resolve.ts +29 -0
- package/src/resources/extensions/gsd/auto/run-unit.ts +56 -4
- package/src/resources/extensions/gsd/auto/session.ts +28 -1
- package/src/resources/extensions/gsd/auto/turn-epoch.ts +108 -0
- package/src/resources/extensions/gsd/auto/types.ts +1 -1
- package/src/resources/extensions/gsd/auto-dispatch.ts +117 -16
- package/src/resources/extensions/gsd/auto-loop.ts +1 -1
- package/src/resources/extensions/gsd/auto-model-selection.ts +1 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +92 -3
- package/src/resources/extensions/gsd/auto-prompts.ts +28 -1
- package/src/resources/extensions/gsd/auto-recovery.ts +40 -1
- package/src/resources/extensions/gsd/auto-start.ts +48 -52
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +12 -5
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +14 -3
- package/src/resources/extensions/gsd/auto-worktree.ts +122 -68
- package/src/resources/extensions/gsd/auto.ts +105 -35
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +34 -1
- package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +6 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +11 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +18 -6
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +13 -9
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +35 -2
- package/src/resources/extensions/gsd/clean-root-preflight.ts +111 -0
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +27 -8
- package/src/resources/extensions/gsd/commands-cmux.ts +10 -6
- package/src/resources/extensions/gsd/commands-extensions.ts +747 -41
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +898 -32
- package/src/resources/extensions/gsd/dispatch-guard.ts +26 -2
- package/src/resources/extensions/gsd/file-lock.ts +84 -11
- package/src/resources/extensions/gsd/git-service.ts +1 -0
- package/src/resources/extensions/gsd/gitignore.ts +2 -1
- package/src/resources/extensions/gsd/gsd-db.ts +92 -32
- package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -1
- package/src/resources/extensions/gsd/guided-flow.ts +259 -10
- package/src/resources/extensions/gsd/health-widget.ts +3 -1
- package/src/resources/extensions/gsd/journal.ts +29 -3
- package/src/resources/extensions/gsd/key-manager.ts +22 -0
- package/src/resources/extensions/gsd/milestone-actions.ts +18 -0
- package/src/resources/extensions/gsd/milestone-summary-classifier.ts +42 -0
- package/src/resources/extensions/gsd/model-router.ts +42 -1
- package/src/resources/extensions/gsd/notifications.ts +27 -15
- package/src/resources/extensions/gsd/pre-execution-checks.ts +33 -7
- package/src/resources/extensions/gsd/preferences-types.ts +8 -0
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +29 -2
- package/src/resources/extensions/gsd/prompts/discuss.md +29 -2
- package/src/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
- package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +5 -2
- package/src/resources/extensions/gsd/prompts/system.md +1 -0
- package/src/resources/extensions/gsd/reports.ts +5 -4
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +119 -0
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +16 -3
- package/src/resources/extensions/gsd/safety/safety-harness.ts +9 -0
- package/src/resources/extensions/gsd/state-transition-matrix.ts +152 -0
- package/src/resources/extensions/gsd/state.ts +35 -30
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +238 -4
- package/src/resources/extensions/gsd/tests/auto-mode-guards.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +122 -0
- package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +141 -0
- package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +186 -0
- package/src/resources/extensions/gsd/tests/cmux.test.ts +5 -9
- package/src/resources/extensions/gsd/tests/complete-milestone-false-merge.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +61 -1
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +161 -0
- package/src/resources/extensions/gsd/tests/db-access-guardrails.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +1 -2
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +14 -9
- package/src/resources/extensions/gsd/tests/dispatch-guard-summary-db-mismatch.test.ts +77 -0
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/escalation.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/exec-history.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +173 -0
- package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/file-lock.test.ts +86 -12
- package/src/resources/extensions/gsd/tests/google-search-stub.test.ts +131 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +296 -1
- package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +117 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/integration/gitignore-tracked-gsd.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/integration/worktree-e2e.test.ts +11 -0
- package/src/resources/extensions/gsd/tests/issue-4540-regressions.test.ts +288 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/key-manager.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/mcp-client-security.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/milestone-summary-classifier.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +150 -0
- package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/pre-exec-gate-loop.test.ts +272 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +337 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +39 -25
- package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +181 -0
- package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +13 -7
- package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +388 -0
- package/src/resources/extensions/gsd/tests/require-slice-discussion-dispatch.test.ts +170 -0
- package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +9 -3
- package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +230 -0
- package/src/resources/extensions/gsd/tests/rewrite-docs-abandon-detect.test.ts +195 -0
- package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/schema-v21-sequence.test.ts +413 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +32 -40
- package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +112 -0
- package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/token-counter.test.ts +105 -1
- package/src/resources/extensions/gsd/tests/tool-compatibility.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +50 -2
- package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +162 -0
- package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/uok-loop-adapter-writer.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/uok-parity-report.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +42 -2
- package/src/resources/extensions/gsd/tests/uok-writer.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/validate-extension-package.test.ts +168 -0
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +138 -5
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +25 -2
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +65 -2
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +78 -5
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +64 -0
- package/src/resources/extensions/gsd/token-counter.ts +22 -5
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +15 -9
- package/src/resources/extensions/gsd/tools/complete-slice.ts +38 -0
- package/src/resources/extensions/gsd/tools/complete-task.ts +49 -0
- package/src/resources/extensions/gsd/uok/audit.ts +20 -2
- package/src/resources/extensions/gsd/uok/contracts.ts +65 -0
- package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +56 -0
- package/src/resources/extensions/gsd/uok/execution-graph.ts +22 -0
- package/src/resources/extensions/gsd/uok/gitops.ts +6 -1
- package/src/resources/extensions/gsd/uok/loop-adapter.ts +45 -10
- package/src/resources/extensions/gsd/uok/parity-report.ts +84 -0
- package/src/resources/extensions/gsd/uok/plan-v2.ts +39 -8
- package/src/resources/extensions/gsd/uok/writer.ts +113 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +23 -3
- package/src/resources/extensions/gsd/worktree-manager.ts +1 -0
- package/src/resources/extensions/gsd/worktree-resolver.ts +54 -9
- package/src/resources/extensions/mcp-client/auth.ts +12 -1
- package/src/resources/extensions/mcp-client/index.ts +129 -10
- package/src/resources/extensions/shared/cmux-events.ts +59 -0
- package/src/resources/extensions/shared/rtk-session-stats.ts +1 -2
- package/src/resources/skills/create-skill/SKILL.md +2 -2
- package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +4 -4
- package/src/resources/skills/create-skill/workflows/audit-skill.md +4 -4
- package/src/resources/skills/create-skill/workflows/create-new-skill.md +5 -5
- package/src/resources/skills/verify-before-complete/SKILL.md +2 -1
- package/src/resources/skills/write-docs/SKILL.md +2 -1
- package/dist/web/standalone/.next/server/chunks/7461.js +0 -1
- package/dist/web/standalone/.next/static/chunks/2826.e59e8578e2e28639.js +0 -9
- /package/dist/web/standalone/.next/static/{n21VtX2hZlkpdEUO_nU4z → vidAVJkURvTJ0_V2-64ro}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{n21VtX2hZlkpdEUO_nU4z → vidAVJkURvTJ0_V2-64ro}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regression tests for #4563:
|
|
3
|
+
* Bug 1 — custom/Anthropic-compatible models were hard-capped to 32 k output tokens
|
|
4
|
+
* Bug 2 — custom models in models.json could not declare capabilities.supportsXhigh
|
|
5
|
+
*/
|
|
6
|
+
import assert from "node:assert/strict";
|
|
7
|
+
import { mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
8
|
+
import { tmpdir } from "node:os";
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
import { afterEach, beforeEach, describe, it } from "node:test";
|
|
11
|
+
import { AuthStorage } from "./auth-storage.js";
|
|
12
|
+
import { ModelRegistry } from "./model-registry.js";
|
|
13
|
+
|
|
14
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
15
|
+
|
|
16
|
+
let testDir: string;
|
|
17
|
+
|
|
18
|
+
beforeEach(() => {
|
|
19
|
+
testDir = join(
|
|
20
|
+
tmpdir(),
|
|
21
|
+
`model-registry-custom-caps-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
22
|
+
);
|
|
23
|
+
mkdirSync(testDir, { recursive: true });
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
afterEach(() => {
|
|
27
|
+
try {
|
|
28
|
+
rmSync(testDir, { recursive: true, force: true });
|
|
29
|
+
} catch {
|
|
30
|
+
// best-effort cleanup
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
function createRegistry(modelsJson: object): ModelRegistry {
|
|
35
|
+
const path = join(testDir, "models.json");
|
|
36
|
+
writeFileSync(path, JSON.stringify(modelsJson));
|
|
37
|
+
return new ModelRegistry(AuthStorage.inMemory(), path);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function writeModelsJson(obj: object): string {
|
|
41
|
+
const path = join(testDir, "models.json");
|
|
42
|
+
writeFileSync(path, JSON.stringify(obj));
|
|
43
|
+
return path;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// ─── Bug 1: 32 k cap must not apply to custom/OpenAI-compatible models ────────
|
|
47
|
+
|
|
48
|
+
describe("Bug 1 — maxTokens cap (#4563)", () => {
|
|
49
|
+
it("custom openai-completions model with maxTokens > 32 k is not capped", () => {
|
|
50
|
+
const registry = createRegistry({
|
|
51
|
+
providers: {
|
|
52
|
+
"kimi-custom": {
|
|
53
|
+
baseUrl: "https://api.example.com/v1",
|
|
54
|
+
apiKey: "sk-test",
|
|
55
|
+
api: "openai-completions",
|
|
56
|
+
models: [
|
|
57
|
+
{
|
|
58
|
+
id: "kimi-k2.6-code-preview",
|
|
59
|
+
name: "Kimi K2.6 Code Preview",
|
|
60
|
+
maxTokens: 131072,
|
|
61
|
+
contextWindow: 262144,
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
const model = registry.getAll().find((m) => m.id === "kimi-k2.6-code-preview");
|
|
69
|
+
assert.ok(model, "model should be registered");
|
|
70
|
+
assert.equal(
|
|
71
|
+
model.maxTokens,
|
|
72
|
+
131072,
|
|
73
|
+
"maxTokens must be preserved as declared — not capped to 32 000",
|
|
74
|
+
);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it("custom model with maxTokens exactly 32 k is not affected", () => {
|
|
78
|
+
const registry = createRegistry({
|
|
79
|
+
providers: {
|
|
80
|
+
"custom-provider": {
|
|
81
|
+
baseUrl: "https://api.example.com/v1",
|
|
82
|
+
apiKey: "sk-test",
|
|
83
|
+
api: "openai-completions",
|
|
84
|
+
models: [{ id: "model-32k", maxTokens: 32000, contextWindow: 128000 }],
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
const model = registry.getAll().find((m) => m.id === "model-32k");
|
|
90
|
+
assert.ok(model);
|
|
91
|
+
assert.equal(model.maxTokens, 32000);
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it("custom model with maxTokens 65 k is stored at full value", () => {
|
|
95
|
+
const registry = createRegistry({
|
|
96
|
+
providers: {
|
|
97
|
+
"dashscope-custom": {
|
|
98
|
+
baseUrl: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
|
|
99
|
+
apiKey: "sk-test",
|
|
100
|
+
api: "openai-completions",
|
|
101
|
+
models: [
|
|
102
|
+
{
|
|
103
|
+
id: "qwen3.5-plus",
|
|
104
|
+
name: "Qwen3.5 Plus",
|
|
105
|
+
maxTokens: 65536,
|
|
106
|
+
contextWindow: 1000000,
|
|
107
|
+
},
|
|
108
|
+
],
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
const model = registry.getAll().find((m) => m.id === "qwen3.5-plus" && m.provider === "dashscope-custom");
|
|
114
|
+
assert.ok(model);
|
|
115
|
+
assert.equal(model.maxTokens, 65536);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
// ─── Bug 2: capabilities.supportsXhigh must be declarable in models.json ──────
|
|
120
|
+
|
|
121
|
+
describe("Bug 2 — capabilities.supportsXhigh in models.json (#4563)", () => {
|
|
122
|
+
it("model with capabilities.supportsXhigh: true surfaces the flag", () => {
|
|
123
|
+
const registry = createRegistry({
|
|
124
|
+
providers: {
|
|
125
|
+
"kimi-custom": {
|
|
126
|
+
baseUrl: "https://api.example.com/v1",
|
|
127
|
+
apiKey: "sk-test",
|
|
128
|
+
api: "anthropic-messages",
|
|
129
|
+
models: [
|
|
130
|
+
{
|
|
131
|
+
id: "kimi-k2.6-code-preview",
|
|
132
|
+
name: "Kimi K2.6 Code Preview",
|
|
133
|
+
maxTokens: 131072,
|
|
134
|
+
contextWindow: 262144,
|
|
135
|
+
capabilities: { supportsXhigh: true },
|
|
136
|
+
},
|
|
137
|
+
],
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
const model = registry.getAll().find((m) => m.id === "kimi-k2.6-code-preview");
|
|
143
|
+
assert.ok(model, "model should be registered");
|
|
144
|
+
assert.equal(
|
|
145
|
+
model.capabilities?.supportsXhigh,
|
|
146
|
+
true,
|
|
147
|
+
"supportsXhigh must be true as declared in models.json",
|
|
148
|
+
);
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
it("model without capabilities declaration has no supportsXhigh", () => {
|
|
152
|
+
const registry = createRegistry({
|
|
153
|
+
providers: {
|
|
154
|
+
"plain-provider": {
|
|
155
|
+
baseUrl: "https://api.example.com/v1",
|
|
156
|
+
apiKey: "sk-test",
|
|
157
|
+
api: "openai-completions",
|
|
158
|
+
models: [{ id: "plain-model", maxTokens: 16384, contextWindow: 128000 }],
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
const model = registry.getAll().find((m) => m.id === "plain-model");
|
|
164
|
+
assert.ok(model);
|
|
165
|
+
// supportsXhigh should be absent or explicitly false — never implicitly true
|
|
166
|
+
assert.ok(
|
|
167
|
+
!model.capabilities?.supportsXhigh,
|
|
168
|
+
"supportsXhigh must not be set for models that don't declare it",
|
|
169
|
+
);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
it("capabilities.supportsXhigh: false is respected", () => {
|
|
173
|
+
const registry = createRegistry({
|
|
174
|
+
providers: {
|
|
175
|
+
"explicit-provider": {
|
|
176
|
+
baseUrl: "https://api.example.com/v1",
|
|
177
|
+
apiKey: "sk-test",
|
|
178
|
+
api: "openai-completions",
|
|
179
|
+
models: [
|
|
180
|
+
{
|
|
181
|
+
id: "no-xhigh-model",
|
|
182
|
+
capabilities: { supportsXhigh: false },
|
|
183
|
+
},
|
|
184
|
+
],
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
const model = registry.getAll().find((m) => m.id === "no-xhigh-model");
|
|
190
|
+
assert.ok(model);
|
|
191
|
+
assert.equal(model.capabilities?.supportsXhigh, false);
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
it("supportsXhigh declared in models.json is not overwritten by capability patches", () => {
|
|
195
|
+
// The capability-patches system must not overwrite an explicit declaration in models.json.
|
|
196
|
+
// applyCapabilityPatches uses spread: { ...patch.caps, ...model.capabilities }
|
|
197
|
+
// so model.capabilities wins. This test verifies the precedence end-to-end.
|
|
198
|
+
const registry = createRegistry({
|
|
199
|
+
providers: {
|
|
200
|
+
"compat-provider": {
|
|
201
|
+
baseUrl: "https://api.example.com/v1",
|
|
202
|
+
apiKey: "sk-test",
|
|
203
|
+
api: "openai-completions",
|
|
204
|
+
models: [
|
|
205
|
+
{
|
|
206
|
+
id: "custom-xhigh-model",
|
|
207
|
+
capabilities: { supportsXhigh: true },
|
|
208
|
+
},
|
|
209
|
+
],
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
const model = registry.getAll().find((m) => m.id === "custom-xhigh-model");
|
|
215
|
+
assert.ok(model);
|
|
216
|
+
assert.equal(model.capabilities?.supportsXhigh, true);
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
it("modelOverrides can set capabilities.supportsXhigh on built-in models", () => {
|
|
220
|
+
// A user-facing override in models.json should be able to add supportsXhigh
|
|
221
|
+
// to a built-in model that doesn't declare it.
|
|
222
|
+
const path = writeModelsJson({
|
|
223
|
+
providers: {
|
|
224
|
+
anthropic: {
|
|
225
|
+
modelOverrides: {
|
|
226
|
+
"claude-3-5-haiku-20241022": {
|
|
227
|
+
capabilities: { supportsXhigh: true },
|
|
228
|
+
},
|
|
229
|
+
},
|
|
230
|
+
},
|
|
231
|
+
},
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
const registry = new ModelRegistry(AuthStorage.inMemory(), path);
|
|
235
|
+
const model = registry.getAll().find(
|
|
236
|
+
(m) => m.provider === "anthropic" && m.id === "claude-3-5-haiku-20241022",
|
|
237
|
+
);
|
|
238
|
+
assert.ok(model, "built-in model must still be present");
|
|
239
|
+
assert.equal(
|
|
240
|
+
model.capabilities?.supportsXhigh,
|
|
241
|
+
true,
|
|
242
|
+
"modelOverrides must be able to set capabilities.supportsXhigh",
|
|
243
|
+
);
|
|
244
|
+
});
|
|
245
|
+
});
|
|
@@ -48,6 +48,14 @@ const VercelGatewayRoutingSchema = Type.Object({
|
|
|
48
48
|
order: Type.Optional(Type.Array(Type.String())),
|
|
49
49
|
});
|
|
50
50
|
|
|
51
|
+
// Schema for model capability declarations (mirrors ModelCapabilities in pi-ai types)
|
|
52
|
+
const ModelCapabilitiesSchema = Type.Object({
|
|
53
|
+
supportsXhigh: Type.Optional(Type.Boolean()),
|
|
54
|
+
requiresToolCallId: Type.Optional(Type.Boolean()),
|
|
55
|
+
supportsServiceTier: Type.Optional(Type.Boolean()),
|
|
56
|
+
charsPerToken: Type.Optional(Type.Number()),
|
|
57
|
+
});
|
|
58
|
+
|
|
51
59
|
// Schema for OpenAI compatibility settings
|
|
52
60
|
const OpenAICompletionsCompatSchema = Type.Object({
|
|
53
61
|
supportsStore: Type.Optional(Type.Boolean()),
|
|
@@ -91,6 +99,7 @@ const ModelDefinitionSchema = Type.Object({
|
|
|
91
99
|
maxTokens: Type.Optional(Type.Number()),
|
|
92
100
|
headers: Type.Optional(Type.Record(Type.String(), Type.String())),
|
|
93
101
|
compat: Type.Optional(OpenAICompatSchema),
|
|
102
|
+
capabilities: Type.Optional(ModelCapabilitiesSchema),
|
|
94
103
|
});
|
|
95
104
|
|
|
96
105
|
// Schema for per-model overrides (all fields optional, merged with built-in model)
|
|
@@ -110,6 +119,7 @@ const ModelOverrideSchema = Type.Object({
|
|
|
110
119
|
maxTokens: Type.Optional(Type.Number()),
|
|
111
120
|
headers: Type.Optional(Type.Record(Type.String(), Type.String())),
|
|
112
121
|
compat: Type.Optional(OpenAICompatSchema),
|
|
122
|
+
capabilities: Type.Optional(ModelCapabilitiesSchema),
|
|
113
123
|
});
|
|
114
124
|
|
|
115
125
|
type ModelOverride = Static<typeof ModelOverrideSchema>;
|
|
@@ -219,6 +229,11 @@ function applyModelOverride(model: Model<Api>, override: ModelOverride): Model<A
|
|
|
219
229
|
// Deep merge compat
|
|
220
230
|
result.compat = mergeCompat(model.compat, override.compat);
|
|
221
231
|
|
|
232
|
+
// Merge capabilities (override wins per-field)
|
|
233
|
+
if (override.capabilities) {
|
|
234
|
+
result.capabilities = { ...model.capabilities, ...override.capabilities };
|
|
235
|
+
}
|
|
236
|
+
|
|
222
237
|
return result;
|
|
223
238
|
}
|
|
224
239
|
|
|
@@ -514,6 +529,7 @@ export class ModelRegistry {
|
|
|
514
529
|
maxTokens: modelDef.maxTokens ?? 16384,
|
|
515
530
|
headers,
|
|
516
531
|
compat: modelDef.compat,
|
|
532
|
+
capabilities: modelDef.capabilities,
|
|
517
533
|
} as Model<Api>);
|
|
518
534
|
}
|
|
519
535
|
}
|
|
@@ -242,7 +242,7 @@ export class DefaultResourceLoader implements ResourceLoader {
|
|
|
242
242
|
this.systemPromptOverride = options.systemPromptOverride;
|
|
243
243
|
this.appendSystemPromptOverride = options.appendSystemPromptOverride;
|
|
244
244
|
|
|
245
|
-
this.extensionsResult = { extensions: [], errors: [], runtime: createExtensionRuntime() };
|
|
245
|
+
this.extensionsResult = { extensions: [], errors: [], warnings: [], runtime: createExtensionRuntime() };
|
|
246
246
|
this.skills = [];
|
|
247
247
|
this.skillDiagnostics = [];
|
|
248
248
|
this.prompts = [];
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
|
|
4
4
|
import { describe, it } from "node:test";
|
|
5
5
|
import assert from "node:assert/strict";
|
|
6
|
-
import { CredentialCooldownError } from "./sdk.js";
|
|
6
|
+
import { canRestoreSessionModel, CredentialCooldownError } from "./sdk.js";
|
|
7
|
+
import type { Model } from "@gsd/pi-ai";
|
|
7
8
|
|
|
8
9
|
// ─── CredentialCooldownError ──────────────────────────────────────────────────
|
|
9
10
|
|
|
@@ -87,3 +88,26 @@ describe("CredentialCooldownError", () => {
|
|
|
87
88
|
assert.equal(plain.retryAfterMs, 15_000);
|
|
88
89
|
});
|
|
89
90
|
});
|
|
91
|
+
|
|
92
|
+
describe("canRestoreSessionModel", () => {
|
|
93
|
+
const model = {
|
|
94
|
+
provider: "claude-code",
|
|
95
|
+
id: "claude-sonnet",
|
|
96
|
+
} as Model<any>;
|
|
97
|
+
|
|
98
|
+
it("allows keyless external providers when the provider is request-ready", () => {
|
|
99
|
+
const registry = {
|
|
100
|
+
isProviderRequestReady: (provider: string) => provider === "claude-code",
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
assert.equal(canRestoreSessionModel(registry, model), true);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it("blocks restore when the provider is not request-ready", () => {
|
|
107
|
+
const registry = {
|
|
108
|
+
isProviderRequestReady: () => false,
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
assert.equal(canRestoreSessionModel(registry, model), false);
|
|
112
|
+
});
|
|
113
|
+
});
|
|
@@ -31,6 +31,13 @@ export class CredentialCooldownError extends Error {
|
|
|
31
31
|
this.retryAfterMs = retryAfterMs;
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
|
+
|
|
35
|
+
export function canRestoreSessionModel(
|
|
36
|
+
modelRegistry: Pick<ModelRegistry, "isProviderRequestReady">,
|
|
37
|
+
model: Model<any>,
|
|
38
|
+
): boolean {
|
|
39
|
+
return modelRegistry.isProviderRequestReady(model.provider);
|
|
40
|
+
}
|
|
34
41
|
import { Agent, type AgentMessage, type ThinkingLevel } from "@gsd/pi-agent-core";
|
|
35
42
|
import type { Message, Model } from "@gsd/pi-ai";
|
|
36
43
|
import { getAgentDir, getDocsPath } from "../config.js";
|
|
@@ -262,9 +269,9 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
|
|
|
262
269
|
// If session has data, try to restore model from it
|
|
263
270
|
if (!model && hasExistingSession && existingSession.model) {
|
|
264
271
|
const restoredModel = modelRegistry.find(existingSession.model.provider, existingSession.model.modelId);
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
272
|
+
if (restoredModel && canRestoreSessionModel(modelRegistry, restoredModel)) {
|
|
273
|
+
model = restoredModel;
|
|
274
|
+
}
|
|
268
275
|
if (!model) {
|
|
269
276
|
modelFallbackMessage = `Could not restore model ${existingSession.model.provider}/${existingSession.model.modelId}`;
|
|
270
277
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import { describe, it, afterEach } from "node:test";
|
|
3
|
-
import { mkdtempSync, readFileSync, rmSync } from "node:fs";
|
|
3
|
+
import { mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import { tmpdir } from "node:os";
|
|
6
6
|
|
|
@@ -97,4 +97,33 @@ describe("SessionManager secret redaction on persistence", () => {
|
|
|
97
97
|
"redaction placeholder must appear in persisted JSONL",
|
|
98
98
|
);
|
|
99
99
|
});
|
|
100
|
+
|
|
101
|
+
it("scrubs secrets from JSONL rewritten by _rewriteFile() during migration", () => {
|
|
102
|
+
// Write a v1 session file (no id/parentId on entries) containing a secret.
|
|
103
|
+
// setSessionFile() will detect version < 3, run migration, and call _rewriteFile()
|
|
104
|
+
// which previously serialised entries without passing them through redaction.
|
|
105
|
+
dir = mkdtempSync(join(tmpdir(), "gsd-session-rewrite-redact-test-"));
|
|
106
|
+
const leakedKey = "sk-ant-api03-abcDEF1234567890abcDEF1234567890xYz";
|
|
107
|
+
const v1Header = JSON.stringify({ type: "session", version: 1, id: "test-session-id", timestamp: new Date().toISOString(), cwd: dir });
|
|
108
|
+
const v1UserMsg = JSON.stringify({ type: "message", message: { role: "user", content: [{ type: "text", text: `secret: ${leakedKey}` }] } });
|
|
109
|
+
const v1AssistantMsg = JSON.stringify({ type: "message", message: { role: "assistant", content: [{ type: "text", text: "ok" }], usage: { input: 1, output: 1, cacheRead: 0, cacheWrite: 0, total: 2, cost: { total: 0 } } } });
|
|
110
|
+
const sessionFile = join(dir, "test-session.jsonl");
|
|
111
|
+
writeFileSync(sessionFile, [v1Header, v1UserMsg, v1AssistantMsg].join("\n") + "\n", "utf8");
|
|
112
|
+
|
|
113
|
+
// Loading this file triggers migrateToCurrentVersion() which returns true (v1 → v3),
|
|
114
|
+
// causing _rewriteFile() to rewrite the file. The bug: _rewriteFile() called
|
|
115
|
+
// JSON.stringify(e) without redaction, so the secret would survive on disk.
|
|
116
|
+
const manager = SessionManager.create(dir, dir);
|
|
117
|
+
manager.setSessionFile(sessionFile);
|
|
118
|
+
|
|
119
|
+
const contents = readFileSync(sessionFile, "utf8");
|
|
120
|
+
assert.ok(
|
|
121
|
+
!contents.includes(leakedKey),
|
|
122
|
+
"raw secret must not appear in JSONL rewritten by _rewriteFile()",
|
|
123
|
+
);
|
|
124
|
+
assert.ok(
|
|
125
|
+
contents.includes("[REDACTED:anthropic]"),
|
|
126
|
+
"redaction placeholder must appear in JSONL rewritten by _rewriteFile()",
|
|
127
|
+
);
|
|
128
|
+
});
|
|
100
129
|
});
|
|
@@ -959,7 +959,7 @@ export class SessionManager {
|
|
|
959
959
|
|
|
960
960
|
private _rewriteFile(): void {
|
|
961
961
|
if (!this.persist || !this.sessionFile) return;
|
|
962
|
-
const content = `${this.fileEntries.map((e) => JSON.stringify(e)).join("\n")}\n`;
|
|
962
|
+
const content = `${this.fileEntries.map((e) => JSON.stringify(prepareForPersistence(e, this.blobStore))).join("\n")}\n`;
|
|
963
963
|
let release: (() => void) | undefined;
|
|
964
964
|
try {
|
|
965
965
|
release = tryAcquireLockSync(this.sessionFile);
|
|
@@ -109,9 +109,9 @@ export function buildSystemPrompt(options: BuildSystemPromptOptions = {}): strin
|
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
// Get absolute paths to documentation and examples
|
|
112
|
-
const readmePath = getReadmePath();
|
|
113
|
-
const docsPath = getDocsPath();
|
|
114
|
-
const examplesPath = getExamplesPath();
|
|
112
|
+
const readmePath = toPosixPath(getReadmePath());
|
|
113
|
+
const docsPath = toPosixPath(getDocsPath());
|
|
114
|
+
const examplesPath = toPosixPath(getExamplesPath());
|
|
115
115
|
|
|
116
116
|
// Build tools list based on selected tools.
|
|
117
117
|
// Built-ins use toolDescriptions. Custom tools can provide one-line snippets.
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { describe, it, mock, afterEach } from "node:test";
|
|
2
2
|
import assert from "node:assert/strict";
|
|
3
|
+
import { resolve as resolvePath } from "node:path";
|
|
3
4
|
import { resolveToCwd, expandPath } from "./path-utils.js";
|
|
4
5
|
|
|
5
6
|
describe("resolveToCwd", () => {
|
|
6
7
|
it("resolves relative paths against cwd", () => {
|
|
7
8
|
const result = resolveToCwd("foo/bar.txt", "/home/user/project");
|
|
8
|
-
assert.equal(result, "/home/user/project
|
|
9
|
+
assert.equal(result, resolvePath("/home/user/project", "foo/bar.txt"));
|
|
9
10
|
});
|
|
10
11
|
|
|
11
12
|
it("returns absolute paths unchanged", () => {
|
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
// GSD-2 — Provider display name
|
|
1
|
+
// GSD-2 — Provider display name + auth badge tests
|
|
2
2
|
import { test, describe } from "node:test";
|
|
3
3
|
import assert from "node:assert/strict";
|
|
4
|
-
import { providerDisplayName } from "../model-selector.js";
|
|
4
|
+
import { providerAuthBadge, providerDisplayName } from "../model-selector.js";
|
|
5
5
|
|
|
6
6
|
describe("providerDisplayName", () => {
|
|
7
|
-
test("
|
|
8
|
-
assert.equal(providerDisplayName("anthropic"), "anthropic
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
test("passes through unmapped providers unchanged", () => {
|
|
7
|
+
test("passes providers through unchanged", () => {
|
|
8
|
+
assert.equal(providerDisplayName("anthropic"), "anthropic");
|
|
12
9
|
assert.equal(providerDisplayName("claude-code"), "claude-code");
|
|
13
10
|
assert.equal(providerDisplayName("openai"), "openai");
|
|
14
11
|
assert.equal(providerDisplayName("bedrock"), "bedrock");
|
|
@@ -16,3 +13,16 @@ describe("providerDisplayName", () => {
|
|
|
16
13
|
assert.equal(providerDisplayName("openrouter"), "openrouter");
|
|
17
14
|
});
|
|
18
15
|
});
|
|
16
|
+
|
|
17
|
+
describe("providerAuthBadge", () => {
|
|
18
|
+
test("returns human-readable labels for each auth mode", () => {
|
|
19
|
+
assert.equal(providerAuthBadge("apiKey"), "API key");
|
|
20
|
+
assert.equal(providerAuthBadge("oauth"), "OAuth");
|
|
21
|
+
assert.equal(providerAuthBadge("externalCli"), "CLI");
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test("returns empty string for 'none' and undefined", () => {
|
|
25
|
+
assert.equal(providerAuthBadge("none"), "");
|
|
26
|
+
assert.equal(providerAuthBadge(undefined), "");
|
|
27
|
+
});
|
|
28
|
+
});
|
|
@@ -2,7 +2,7 @@ import { type Component, truncateToWidth, visibleWidth } from "@gsd/pi-tui";
|
|
|
2
2
|
import type { AgentSession } from "../../../core/agent-session.js";
|
|
3
3
|
import type { ReadonlyFooterDataProvider } from "../../../core/footer-data-provider.js";
|
|
4
4
|
import { theme } from "../theme/theme.js";
|
|
5
|
-
import { providerDisplayName } from "./model-selector.js";
|
|
5
|
+
import { providerAuthBadge, providerDisplayName } from "./model-selector.js";
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Sanitize text for display in a single-line status.
|
|
@@ -199,13 +199,22 @@ export class FooterComponent implements Component {
|
|
|
199
199
|
thinkingLevel === "off" ? `${modelName} • thinking off` : `${modelName} • ${thinkingLevel}`;
|
|
200
200
|
}
|
|
201
201
|
|
|
202
|
-
// Prepend the provider in parentheses if there are multiple providers and there's enough room
|
|
202
|
+
// Prepend the provider in parentheses if there are multiple providers and there's enough room.
|
|
203
|
+
// Include the auth mode so users can tell at a glance whether the active model is
|
|
204
|
+
// API-key-backed, OAuth-backed, or delegated to a third-party CLI.
|
|
203
205
|
let rightSide = rightSideWithoutProvider;
|
|
204
206
|
if (this.footerData.getAvailableProviderCount() > 1 && displayModel) {
|
|
205
|
-
|
|
207
|
+
const authMode = this.session.modelRegistry.getProviderAuthMode(displayModel.provider);
|
|
208
|
+
const authLabel = providerAuthBadge(authMode);
|
|
209
|
+
const providerLabel = providerDisplayName(displayModel.provider);
|
|
210
|
+
const parenthetical = authLabel ? `${providerLabel} · ${authLabel}` : providerLabel;
|
|
211
|
+
rightSide = `(${parenthetical}) ${rightSideWithoutProvider}`;
|
|
206
212
|
if (statsLeftWidth + minPadding + visibleWidth(rightSide) > width) {
|
|
207
|
-
// Too wide, fall back
|
|
208
|
-
rightSide = rightSideWithoutProvider
|
|
213
|
+
// Too wide: drop the auth suffix first, then fall back to no parenthetical.
|
|
214
|
+
rightSide = `(${providerLabel}) ${rightSideWithoutProvider}`;
|
|
215
|
+
if (statsLeftWidth + minPadding + visibleWidth(rightSide) > width) {
|
|
216
|
+
rightSide = rightSideWithoutProvider;
|
|
217
|
+
}
|
|
209
218
|
}
|
|
210
219
|
}
|
|
211
220
|
|
|
@@ -9,19 +9,32 @@ import {
|
|
|
9
9
|
Text,
|
|
10
10
|
type TUI,
|
|
11
11
|
} from "@gsd/pi-tui";
|
|
12
|
-
import type { ModelRegistry } from "../../../core/model-registry.js";
|
|
12
|
+
import type { ModelRegistry, ProviderAuthMode } from "../../../core/model-registry.js";
|
|
13
13
|
import type { SettingsManager } from "../../../core/settings-manager.js";
|
|
14
14
|
import { theme } from "../theme/theme.js";
|
|
15
15
|
import { DynamicBorder } from "./dynamic-border.js";
|
|
16
16
|
import { keyHint } from "./keybinding-hints.js";
|
|
17
17
|
|
|
18
|
-
/** Display names for providers in the model selector UI. */
|
|
19
|
-
const PROVIDER_DISPLAY_NAMES: Record<string, string> = {
|
|
20
|
-
anthropic: "anthropic-api",
|
|
21
|
-
};
|
|
22
|
-
|
|
23
18
|
export function providerDisplayName(provider: string): string {
|
|
24
|
-
return
|
|
19
|
+
return provider;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Short, user-facing label for a provider's auth mode. Returned strings are
|
|
24
|
+
* suitable for use as a suffix/badge alongside the provider name.
|
|
25
|
+
* Returns an empty string for modes that don't need a badge (e.g. "none").
|
|
26
|
+
*/
|
|
27
|
+
export function providerAuthBadge(authMode?: ProviderAuthMode): string {
|
|
28
|
+
switch (authMode) {
|
|
29
|
+
case "apiKey":
|
|
30
|
+
return "API key";
|
|
31
|
+
case "oauth":
|
|
32
|
+
return "OAuth";
|
|
33
|
+
case "externalCli":
|
|
34
|
+
return "CLI";
|
|
35
|
+
default:
|
|
36
|
+
return "";
|
|
37
|
+
}
|
|
25
38
|
}
|
|
26
39
|
|
|
27
40
|
function formatTokenCount(count: number): string {
|
|
@@ -140,7 +153,8 @@ export class ModelSelectorComponent extends Container implements Focusable {
|
|
|
140
153
|
this.scopeHintText = new Text(this.getScopeHintText(), 0, 0);
|
|
141
154
|
this.addChild(this.scopeHintText);
|
|
142
155
|
} else {
|
|
143
|
-
const hintText =
|
|
156
|
+
const hintText =
|
|
157
|
+
"Only showing models with configured credentials (API key, OAuth, or CLI). See README for details.";
|
|
144
158
|
this.addChild(new Text(theme.fg("warning", hintText), 0, 0));
|
|
145
159
|
}
|
|
146
160
|
this.addChild(new Spacer(1));
|
|
@@ -409,7 +423,12 @@ export class ModelSelectorComponent extends Container implements Focusable {
|
|
|
409
423
|
|
|
410
424
|
const ctx = formatTokenCount(item.model.contextWindow);
|
|
411
425
|
const ctxBadge = theme.fg("muted", `${ctx}`);
|
|
412
|
-
const
|
|
426
|
+
const authMode = this.modelRegistry.getProviderAuthMode(item.provider);
|
|
427
|
+
const authLabel = providerAuthBadge(authMode);
|
|
428
|
+
const providerBadgeText = authLabel
|
|
429
|
+
? `[${providerDisplayName(item.provider)} · ${authLabel}]`
|
|
430
|
+
: `[${providerDisplayName(item.provider)}]`;
|
|
431
|
+
const providerBadge = theme.fg("muted", providerBadgeText);
|
|
413
432
|
const checkmark = isCurrent ? theme.fg("success", " ✓") : "";
|
|
414
433
|
|
|
415
434
|
let line: string;
|
|
@@ -445,7 +464,19 @@ export class ModelSelectorComponent extends Container implements Focusable {
|
|
|
445
464
|
const maxVisible = 12;
|
|
446
465
|
|
|
447
466
|
if (this.groupedRows.length === 0) {
|
|
448
|
-
this.listContainer.addChild(
|
|
467
|
+
this.listContainer.addChild(
|
|
468
|
+
new Text(theme.fg("muted", " No providers configured."), 0, 0),
|
|
469
|
+
);
|
|
470
|
+
this.listContainer.addChild(
|
|
471
|
+
new Text(
|
|
472
|
+
theme.fg(
|
|
473
|
+
"muted",
|
|
474
|
+
" Run /login (OAuth), set an API key, or install a CLI provider. See README.",
|
|
475
|
+
),
|
|
476
|
+
0,
|
|
477
|
+
0,
|
|
478
|
+
),
|
|
479
|
+
);
|
|
449
480
|
return;
|
|
450
481
|
}
|
|
451
482
|
|
|
@@ -467,11 +498,14 @@ export class ModelSelectorComponent extends Container implements Focusable {
|
|
|
467
498
|
// Provider group header — always unselectable
|
|
468
499
|
const providerLabel = theme.fg("borderAccent", providerDisplayName(row.provider));
|
|
469
500
|
const count = theme.fg("muted", ` (${row.count})`);
|
|
501
|
+
const authMode = this.modelRegistry.getProviderAuthMode(row.provider);
|
|
502
|
+
const authLabel = providerAuthBadge(authMode);
|
|
503
|
+
const authText = authLabel ? theme.fg("muted", ` · via ${authLabel}`) : "";
|
|
470
504
|
// Add blank line before header if not the very first visible row
|
|
471
505
|
if (i > startIndex) {
|
|
472
506
|
this.listContainer.addChild(new Text("", 0, 0));
|
|
473
507
|
}
|
|
474
|
-
this.listContainer.addChild(new Text(` ${providerLabel}${count}`, 0, 0));
|
|
508
|
+
this.listContainer.addChild(new Text(` ${providerLabel}${count}${authText}`, 0, 0));
|
|
475
509
|
} else {
|
|
476
510
|
// Model row
|
|
477
511
|
const isSelected = i === this.selectedGroupIndex;
|
|
@@ -17,6 +17,7 @@ function createHost(options: HostOptions = {}) {
|
|
|
17
17
|
const prompted: string[] = [];
|
|
18
18
|
const errors: string[] = [];
|
|
19
19
|
const warnings: string[] = [];
|
|
20
|
+
const tips: string[] = [];
|
|
20
21
|
const history: string[] = [];
|
|
21
22
|
const knownSlashCommands = new Set(options.knownSlashCommands ?? []);
|
|
22
23
|
let editorText = "";
|
|
@@ -60,6 +61,9 @@ function createHost(options: HostOptions = {}) {
|
|
|
60
61
|
showError(message: string) {
|
|
61
62
|
errors.push(message);
|
|
62
63
|
},
|
|
64
|
+
showTip(message: string) {
|
|
65
|
+
tips.push(message);
|
|
66
|
+
},
|
|
63
67
|
updateEditorBorderColor() {},
|
|
64
68
|
isExtensionCommand() {
|
|
65
69
|
return false;
|
|
@@ -70,6 +74,15 @@ function createHost(options: HostOptions = {}) {
|
|
|
70
74
|
queueCompactionMessage() {},
|
|
71
75
|
updatePendingMessagesDisplay() {},
|
|
72
76
|
flushPendingBashComponents() {},
|
|
77
|
+
contextualTips: {
|
|
78
|
+
recordBashIncluded() {},
|
|
79
|
+
evaluate() {
|
|
80
|
+
return undefined;
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
getContextPercent() {
|
|
84
|
+
return undefined;
|
|
85
|
+
},
|
|
73
86
|
};
|
|
74
87
|
|
|
75
88
|
setupEditorSubmitHandler(host as any);
|
|
@@ -79,6 +92,7 @@ function createHost(options: HostOptions = {}) {
|
|
|
79
92
|
prompted,
|
|
80
93
|
errors,
|
|
81
94
|
warnings,
|
|
95
|
+
tips,
|
|
82
96
|
history,
|
|
83
97
|
getEditorText: () => editorText,
|
|
84
98
|
getSettingsOpened: () => settingsOpened,
|