gsd-pi 2.80.0-dev.fbe7c8c6f → 2.81.0
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 +35 -59
- package/dist/claude-cli-check.d.ts +30 -0
- package/dist/claude-cli-check.js +18 -7
- package/dist/cli.js +0 -19
- package/dist/headless-query.d.ts +10 -0
- package/dist/headless-query.js +6 -4
- package/dist/loader-entrypoint.d.ts +8 -0
- package/dist/loader-entrypoint.js +27 -0
- package/dist/loader.js +2 -11
- package/dist/mcp-server.d.ts +1 -0
- package/dist/mcp-server.js +6 -3
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/claude-code-cli/readiness.js +18 -7
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +40 -3
- package/dist/resources/extensions/github-sync/sync.js +4 -1
- package/dist/resources/extensions/gsd/auto/contracts.js +2 -0
- package/dist/resources/extensions/gsd/auto/loop.js +103 -9
- package/dist/resources/extensions/gsd/auto/orchestrator.js +48 -4
- package/dist/resources/extensions/gsd/auto/phases.js +282 -132
- package/dist/resources/extensions/gsd/auto/resolve.js +29 -0
- package/dist/resources/extensions/gsd/auto/run-unit.js +22 -30
- package/dist/resources/extensions/gsd/auto/session.js +9 -1
- package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -0
- package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +33 -1
- package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +9 -1
- package/dist/resources/extensions/gsd/auto-dashboard.js +18 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
- package/dist/resources/extensions/gsd/auto-dispatch.js +16 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +112 -78
- package/dist/resources/extensions/gsd/auto-prompts.js +103 -16
- package/dist/resources/extensions/gsd/auto-recovery.js +43 -1
- package/dist/resources/extensions/gsd/auto-start.js +252 -14
- package/dist/resources/extensions/gsd/auto-supervisor.js +8 -1
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +2 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +229 -336
- package/dist/resources/extensions/gsd/auto.js +264 -86
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +122 -11
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +44 -37
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -10
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +30 -20
- package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +4 -1
- package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +6 -4
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +5 -3
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +330 -54
- package/dist/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.js +4 -0
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +19 -2
- package/dist/resources/extensions/gsd/clean-root-preflight.js +24 -6
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
- package/dist/resources/extensions/gsd/commands-config.js +1 -1
- package/dist/resources/extensions/gsd/commands-eval-review.js +2 -2
- package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
- package/dist/resources/extensions/gsd/context-budget.js +37 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +56 -10
- package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +92 -0
- package/dist/resources/extensions/gsd/db-base-schema.js +4 -2
- package/dist/resources/extensions/gsd/db-migration-steps.js +6 -0
- package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
- package/dist/resources/extensions/gsd/git-service.js +73 -5
- package/dist/resources/extensions/gsd/gsd-db.js +46 -13
- package/dist/resources/extensions/gsd/guided-flow.js +119 -42
- package/dist/resources/extensions/gsd/health-widget.js +3 -0
- package/dist/resources/extensions/gsd/init-wizard.js +4 -1
- package/dist/resources/extensions/gsd/memory-store.js +69 -12
- package/dist/resources/extensions/gsd/migrate/command.js +40 -1
- package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
- package/dist/resources/extensions/gsd/native-git-bridge.js +32 -8
- package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
- package/dist/resources/extensions/gsd/planning-path-scope.js +26 -0
- package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
- package/dist/resources/extensions/gsd/prompt-loader.js +28 -2
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +22 -17
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
- package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -5
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
- package/dist/resources/extensions/gsd/quick.js +34 -2
- package/dist/resources/extensions/gsd/recovery-classification.js +94 -0
- package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
- package/dist/resources/extensions/gsd/state-reconciliation.js +27 -0
- package/dist/resources/extensions/gsd/tool-contract.js +50 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -7
- package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
- package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +15 -0
- package/dist/resources/extensions/gsd/tools/exec-search-tool.js +5 -0
- package/dist/resources/extensions/gsd/tools/exec-tool.js +3 -15
- package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -0
- package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
- package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
- package/dist/resources/extensions/gsd/tools/resume-tool.js +5 -0
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
- package/dist/resources/extensions/gsd/unit-context-composer.js +12 -3
- package/dist/resources/extensions/gsd/unit-runtime.js +22 -0
- package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +958 -0
- package/dist/resources/extensions/gsd/worktree-safety.js +119 -0
- package/dist/resources/extensions/gsd/worktree-state-projection.js +317 -0
- package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
- 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 +14 -14
- package/dist/web/standalone/.next/build-manifest.json +4 -4
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
- package/dist/web/standalone/.next/required-server-files.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +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/page.js +2 -2
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +14 -14
- package/dist/web/standalone/.next/server/chunks/63.js +3 -3
- package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
- 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/middleware.js +3 -3
- package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +10 -0
- package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-f2a7482d42a5614b.js → page-2f24283c162b6ab3.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/{layout-a16c7a7ecdf0c2cf.js → layout-9ecfd95f343793f0.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-0481f1221120a7c6.js → webpack-de742b64187e13fe.js} +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/dist/welcome-screen.d.ts +2 -0
- package/dist/welcome-screen.js +9 -7
- package/package.json +3 -3
- package/packages/daemon/package.json +2 -2
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +22 -17
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +2 -2
- package/packages/mcp-server/src/workflow-tools.test.ts +75 -2
- package/packages/mcp-server/src/workflow-tools.ts +30 -16
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +1 -1
- package/packages/native/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +4 -1
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/agent.d.ts +9 -2
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +43 -11
- package/packages/pi-agent-core/dist/agent.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 +2 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
- package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
- package/packages/pi-agent-core/dist/token-audit.js +221 -0
- package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
- package/packages/pi-agent-core/dist/types.d.ts +31 -0
- package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/types.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
- package/packages/pi-agent-core/src/agent-loop.ts +4 -1
- package/packages/pi-agent-core/src/agent.ts +52 -11
- package/packages/pi-agent-core/src/index.ts +2 -0
- package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
- package/packages/pi-agent-core/src/token-audit.ts +287 -0
- package/packages/pi-agent-core/src/types.ts +26 -10
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
- package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +9 -7
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +2 -0
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
- package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
- package/packages/pi-ai/src/providers/anthropic.ts +22 -9
- package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
- package/packages/pi-ai/src/types.ts +3 -0
- package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
- package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
- package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +36 -1
- 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-tool-refresh.test.js +30 -1
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +21 -2
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +94 -16
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +6 -2
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +11 -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 +9 -0
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js +103 -0
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts +15 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +3 -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 +6 -6
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +5 -3
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +60 -4
- 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/hooks-runner.test.js +2 -0
- package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +81 -4
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +25 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +22 -56
- package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +1 -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 +3 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.js +12 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/find.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/find.js +14 -6
- package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/grep.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/grep.js +12 -3
- package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -1
- package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
- package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/ls.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/ls.js +10 -3
- package/packages/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.js +3 -1
- package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +7 -62
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +115 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts +19 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.js +20 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/write.d.ts +4 -0
- package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/write.js +9 -1
- package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +89 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +25 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +6 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +155 -7
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +31 -6
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +71 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +25 -3
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +28 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +40 -1
- package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +40 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +102 -16
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +6 -2
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +18 -0
- package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
- package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
- package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +5 -3
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +8 -5
- package/packages/pi-coding-agent/src/core/extensions/types.ts +63 -2
- package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
- package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
- package/packages/pi-coding-agent/src/core/sdk.ts +92 -4
- package/packages/pi-coding-agent/src/core/settings-manager.ts +39 -1
- package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
- package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
- package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +22 -66
- package/packages/pi-coding-agent/src/core/tools/bash.ts +4 -1
- package/packages/pi-coding-agent/src/core/tools/edit.ts +13 -1
- package/packages/pi-coding-agent/src/core/tools/find.ts +15 -6
- package/packages/pi-coding-agent/src/core/tools/grep.ts +13 -3
- package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +4 -1
- package/packages/pi-coding-agent/src/core/tools/index.ts +8 -0
- package/packages/pi-coding-agent/src/core/tools/ls.ts +11 -3
- package/packages/pi-coding-agent/src/core/tools/read.ts +4 -1
- package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +11 -72
- package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
- package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
- package/packages/pi-coding-agent/src/core/tools/write.ts +14 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +119 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +31 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +180 -7
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +75 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +39 -8
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +27 -3
- package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +1 -1
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +31 -0
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +18 -8
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/tui.ts +20 -8
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/README.md +7 -0
- package/packages/rpc-client/package.json +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +42 -3
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +67 -0
- package/src/resources/extensions/github-sync/sync.ts +8 -1
- package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
- package/src/resources/extensions/gsd/auto/contracts.ts +19 -2
- package/src/resources/extensions/gsd/auto/loop-deps.ts +10 -11
- package/src/resources/extensions/gsd/auto/loop.ts +134 -16
- package/src/resources/extensions/gsd/auto/orchestrator.ts +52 -4
- package/src/resources/extensions/gsd/auto/phases.ts +393 -200
- package/src/resources/extensions/gsd/auto/resolve.ts +42 -1
- package/src/resources/extensions/gsd/auto/run-unit.ts +28 -30
- package/src/resources/extensions/gsd/auto/session.ts +9 -1
- package/src/resources/extensions/gsd/auto/types.ts +3 -0
- package/src/resources/extensions/gsd/auto/unit-runner-events.ts +15 -0
- package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
- package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
- package/src/resources/extensions/gsd/auto-dashboard.ts +20 -0
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
- package/src/resources/extensions/gsd/auto-dispatch.ts +16 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +124 -80
- package/src/resources/extensions/gsd/auto-prompts.ts +112 -15
- package/src/resources/extensions/gsd/auto-recovery.ts +54 -0
- package/src/resources/extensions/gsd/auto-start.ts +319 -19
- package/src/resources/extensions/gsd/auto-supervisor.ts +7 -0
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +2 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +259 -360
- package/src/resources/extensions/gsd/auto.ts +324 -88
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +147 -11
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +45 -37
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +36 -10
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +32 -19
- package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +5 -1
- package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +7 -4
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +6 -3
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +379 -54
- package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +4 -0
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +19 -2
- package/src/resources/extensions/gsd/clean-root-preflight.ts +32 -7
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
- package/src/resources/extensions/gsd/commands-config.ts +1 -1
- package/src/resources/extensions/gsd/commands-eval-review.ts +2 -2
- package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
- package/src/resources/extensions/gsd/context-budget.ts +44 -2
- package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
- package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +107 -0
- package/src/resources/extensions/gsd/db-base-schema.ts +4 -2
- package/src/resources/extensions/gsd/db-migration-steps.ts +8 -0
- package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
- package/src/resources/extensions/gsd/git-service.ts +87 -10
- package/src/resources/extensions/gsd/gsd-db.ts +50 -13
- package/src/resources/extensions/gsd/guided-flow.ts +148 -49
- package/src/resources/extensions/gsd/health-widget.ts +3 -0
- package/src/resources/extensions/gsd/init-wizard.ts +5 -1
- package/src/resources/extensions/gsd/memory-store.ts +77 -12
- package/src/resources/extensions/gsd/migrate/command.ts +47 -1
- package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
- package/src/resources/extensions/gsd/native-git-bridge.ts +39 -6
- package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
- package/src/resources/extensions/gsd/planning-path-scope.ts +35 -0
- package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
- package/src/resources/extensions/gsd/preferences-types.ts +1 -1
- package/src/resources/extensions/gsd/prompt-loader.ts +27 -2
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +22 -17
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
- package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -5
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
- package/src/resources/extensions/gsd/quick.ts +37 -2
- package/src/resources/extensions/gsd/recovery-classification.ts +122 -0
- package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
- package/src/resources/extensions/gsd/state-reconciliation.ts +57 -0
- package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
- package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
- package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +35 -9
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +543 -40
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +119 -2
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +76 -18
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +175 -11
- package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -95
- package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +14 -1
- package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
- package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
- package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
- package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
- package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +142 -0
- package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
- package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
- package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
- package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +159 -213
- package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
- package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
- package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +15 -6
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
- package/src/resources/extensions/gsd/tests/cmux.test.ts +51 -53
- package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
- package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
- package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +14 -1
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
- package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
- package/src/resources/extensions/gsd/tests/context-budget.test.ts +10 -1
- package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +90 -31
- package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +18 -10
- package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +6 -11
- package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
- package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +58 -40
- package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
- package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +313 -0
- package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
- package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
- package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
- package/src/resources/extensions/gsd/tests/exec-history.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
- package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
- package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +151 -0
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
- package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
- package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
- package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -56
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +248 -10
- package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
- package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +21 -35
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +37 -7
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +267 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +88 -98
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
- package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
- package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
- package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +44 -9
- package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
- package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
- package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +95 -75
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
- package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +74 -4
- package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
- package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
- package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
- package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
- package/src/resources/extensions/gsd/tests/prompt-path-audit.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -106
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
- package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
- package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
- package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
- package/src/resources/extensions/gsd/tests/quick-external-gsd.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
- package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
- package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
- package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
- package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -69
- package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +32 -164
- package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
- package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
- package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
- package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +222 -0
- package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
- package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
- package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
- package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
- package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
- package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -77
- package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
- package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
- package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
- package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
- package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -1
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -4
- package/src/resources/extensions/gsd/tests/status-db-open.test.ts +35 -40
- package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +48 -46
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
- package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
- package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
- package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
- package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +291 -0
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
- package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +210 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +136 -4
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
- package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +80 -1
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -99
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
- package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
- package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -57
- package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
- package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +14 -13
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +50 -31
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +434 -0
- package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
- package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +373 -76
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +327 -0
- package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +40 -1
- package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
- package/src/resources/extensions/gsd/tool-contract.ts +82 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +14 -15
- package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
- package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +25 -0
- package/src/resources/extensions/gsd/tools/exec-search-tool.ts +7 -7
- package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -23
- package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
- package/src/resources/extensions/gsd/tools/resume-tool.ts +7 -7
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
- package/src/resources/extensions/gsd/unit-context-composer.ts +19 -4
- package/src/resources/extensions/gsd/unit-runtime.ts +25 -0
- package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +1255 -0
- package/src/resources/extensions/gsd/worktree-safety.ts +282 -0
- package/src/resources/extensions/gsd/worktree-state-projection.ts +404 -0
- package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
- package/src/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
- package/dist/resources/extensions/gsd/worktree-resolver.js +0 -733
- package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
- package/dist/web/standalone/.next/static/chunks/app/page-fab3ebb85b006001.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +0 -1
- package/src/resources/extensions/gsd/tests/sync-layer-scope.test.ts +0 -434
- package/src/resources/extensions/gsd/worktree-resolver.ts +0 -909
- /package/dist/web/standalone/.next/static/{yTuahMMuJzVnsov5PreWl → drLMkgfHQ8lzS229_HWYR}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{yTuahMMuJzVnsov5PreWl → drLMkgfHQ8lzS229_HWYR}/_ssgManifest.js +0 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// GSD2 - Agent session workspace-root refresh regression tests
|
|
1
2
|
// Regression test for #3616: newSession() must restore the full tool set
|
|
2
3
|
// when cwd is unchanged.
|
|
3
4
|
//
|
|
@@ -26,7 +27,7 @@ import { SettingsManager } from "./settings-manager.js";
|
|
|
26
27
|
|
|
27
28
|
let testDir: string;
|
|
28
29
|
|
|
29
|
-
async function createSession(): Promise<AgentSession> {
|
|
30
|
+
async function createSession(options: { workspaceRootRef?: { current: string } } = {}): Promise<AgentSession> {
|
|
30
31
|
const agentDir = join(testDir, "agent-home");
|
|
31
32
|
const authStorage = AuthStorage.inMemory({});
|
|
32
33
|
const modelRegistry = new ModelRegistry(authStorage, join(agentDir, "models.json"));
|
|
@@ -48,6 +49,7 @@ async function createSession(): Promise<AgentSession> {
|
|
|
48
49
|
cwd: testDir,
|
|
49
50
|
resourceLoader,
|
|
50
51
|
modelRegistry,
|
|
52
|
+
workspaceRootRef: options.workspaceRootRef,
|
|
51
53
|
});
|
|
52
54
|
}
|
|
53
55
|
|
|
@@ -130,4 +132,41 @@ describe("#3616 — newSession() restores narrowed tool set when cwd unchanged",
|
|
|
130
132
|
"cwd-changed branch must rebuild with includeAllExtensionTools: true",
|
|
131
133
|
);
|
|
132
134
|
});
|
|
135
|
+
|
|
136
|
+
it("uses explicit workspaceRoot option instead of process.cwd() when rebuilding runtime", async () => {
|
|
137
|
+
const session = await createSession();
|
|
138
|
+
const explicitWorkspaceRoot = mkdtempSync(join(testDir, "explicit-workspace-"));
|
|
139
|
+
(session as any)._cwd = process.cwd();
|
|
140
|
+
|
|
141
|
+
let buildRuntimeCalled = false;
|
|
142
|
+
let capturedBuildOptions: { includeAllExtensionTools?: boolean } | undefined;
|
|
143
|
+
const originalBuild = (session as any)._buildRuntime.bind(session);
|
|
144
|
+
(session as any)._buildRuntime = (options?: { includeAllExtensionTools?: boolean }) => {
|
|
145
|
+
buildRuntimeCalled = true;
|
|
146
|
+
capturedBuildOptions = options;
|
|
147
|
+
return originalBuild(options);
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
const ok = await session.newSession({ workspaceRoot: explicitWorkspaceRoot });
|
|
151
|
+
assert.equal(ok, true);
|
|
152
|
+
assert.equal((session as any)._cwd, explicitWorkspaceRoot);
|
|
153
|
+
assert.ok(buildRuntimeCalled, "explicit workspace root differing from prior root must rebuild runtime");
|
|
154
|
+
assert.strictEqual(
|
|
155
|
+
capturedBuildOptions?.includeAllExtensionTools,
|
|
156
|
+
true,
|
|
157
|
+
"explicit workspaceRoot rebuild must pass includeAllExtensionTools: true",
|
|
158
|
+
);
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
it("updates provider workspace root ref when newSession uses explicit workspaceRoot", async () => {
|
|
162
|
+
const workspaceRootRef = { current: "" };
|
|
163
|
+
const session = await createSession({ workspaceRootRef });
|
|
164
|
+
const explicitWorkspaceRoot = mkdtempSync(join(testDir, "provider-workspace-"));
|
|
165
|
+
|
|
166
|
+
assert.equal(workspaceRootRef.current, testDir);
|
|
167
|
+
|
|
168
|
+
const ok = await session.newSession({ workspaceRoot: explicitWorkspaceRoot });
|
|
169
|
+
assert.equal(ok, true);
|
|
170
|
+
assert.equal(workspaceRootRef.current, explicitWorkspaceRoot);
|
|
171
|
+
});
|
|
133
172
|
});
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// GSD2 - Agent session lifecycle and workspace runtime coordination
|
|
1
2
|
/**
|
|
2
3
|
* AgentSession - Core abstraction for agent lifecycle and session management.
|
|
3
4
|
*
|
|
@@ -17,6 +18,7 @@ import { readFileSync } from "node:fs";
|
|
|
17
18
|
import { basename, dirname, join } from "node:path";
|
|
18
19
|
import type {
|
|
19
20
|
Agent,
|
|
21
|
+
AgentAbortOrigin,
|
|
20
22
|
AgentEvent,
|
|
21
23
|
AgentMessage,
|
|
22
24
|
AgentState,
|
|
@@ -167,6 +169,8 @@ export interface AgentSessionConfig {
|
|
|
167
169
|
baseToolsOverride?: Record<string, AgentTool>;
|
|
168
170
|
/** Mutable ref used by Agent to access the current ExtensionRunner */
|
|
169
171
|
extensionRunnerRef?: { current?: ExtensionRunner };
|
|
172
|
+
/** Mutable ref used by providers to access the current workspace root. */
|
|
173
|
+
workspaceRootRef?: { current: string };
|
|
170
174
|
/** Optional: check if the claude-code CLI provider is ready (installed + authed).
|
|
171
175
|
* Passed through to RetryHandler for third-party block recovery (#3772). */
|
|
172
176
|
isClaudeCodeReady?: () => boolean;
|
|
@@ -284,6 +288,7 @@ export class AgentSession {
|
|
|
284
288
|
private _baseToolRegistry: Map<string, AgentTool> = new Map();
|
|
285
289
|
private _cwd: string;
|
|
286
290
|
private _extensionRunnerRef?: { current?: ExtensionRunner };
|
|
291
|
+
private _workspaceRootRef?: { current: string };
|
|
287
292
|
private _initialActiveToolNames?: string[];
|
|
288
293
|
private _baseToolsOverride?: Record<string, AgentTool>;
|
|
289
294
|
private _extensionUIContext?: ExtensionUIContext;
|
|
@@ -305,6 +310,8 @@ export class AgentSession {
|
|
|
305
310
|
|
|
306
311
|
// Base system prompt (without extension appends) - used to apply fresh appends each turn
|
|
307
312
|
private _baseSystemPrompt = "";
|
|
313
|
+
// Optional prompt-only skill catalog filter. Skills remain loaded and invocable by name.
|
|
314
|
+
private _visibleSkillNames: Set<string> | undefined = undefined;
|
|
308
315
|
|
|
309
316
|
constructor(config: AgentSessionConfig) {
|
|
310
317
|
this.agent = config.agent;
|
|
@@ -321,6 +328,10 @@ export class AgentSession {
|
|
|
321
328
|
this._modelRegistry,
|
|
322
329
|
);
|
|
323
330
|
this._extensionRunnerRef = config.extensionRunnerRef;
|
|
331
|
+
this._workspaceRootRef = config.workspaceRootRef;
|
|
332
|
+
if (this._workspaceRootRef) {
|
|
333
|
+
this._workspaceRootRef.current = this._cwd;
|
|
334
|
+
}
|
|
324
335
|
this._initialActiveToolNames = config.initialActiveToolNames;
|
|
325
336
|
this._baseToolsOverride = config.baseToolsOverride;
|
|
326
337
|
|
|
@@ -348,7 +359,7 @@ export class AgentSession {
|
|
|
348
359
|
emit: (event) => this._emit(event),
|
|
349
360
|
disconnectFromAgent: () => this._disconnectFromAgent(),
|
|
350
361
|
reconnectToAgent: () => this._reconnectToAgent(),
|
|
351
|
-
abort: () => this.abort(),
|
|
362
|
+
abort: () => this.abort({ origin: "user" }),
|
|
352
363
|
});
|
|
353
364
|
|
|
354
365
|
// Always subscribe to agent events for internal handling
|
|
@@ -655,11 +666,21 @@ export class AgentSession {
|
|
|
655
666
|
|
|
656
667
|
if (event.type === "agent_start") {
|
|
657
668
|
this._turnIndex = 0;
|
|
658
|
-
await extensionRunner.emit({
|
|
669
|
+
await extensionRunner.emit({
|
|
670
|
+
type: "agent_start",
|
|
671
|
+
sessionId: event.sessionId,
|
|
672
|
+
turnId: event.turnId,
|
|
673
|
+
});
|
|
659
674
|
} else if (event.type === "agent_end") {
|
|
660
675
|
this._processingAgentEnd = true;
|
|
661
676
|
try {
|
|
662
|
-
await extensionRunner.emit({
|
|
677
|
+
await extensionRunner.emit({
|
|
678
|
+
type: "agent_end",
|
|
679
|
+
messages: event.messages,
|
|
680
|
+
sessionId: event.sessionId,
|
|
681
|
+
turnId: event.turnId,
|
|
682
|
+
abortOrigin: event.abortOrigin,
|
|
683
|
+
});
|
|
663
684
|
// `stop` fires on true quiescence: the agent cleanly completed and is now
|
|
664
685
|
// waiting for the user. Use the last assistant message's stopReason to
|
|
665
686
|
// distinguish clean completion from error/cancellation.
|
|
@@ -672,7 +693,13 @@ export class AgentSession {
|
|
|
672
693
|
? "error"
|
|
673
694
|
: "completed"
|
|
674
695
|
: "completed";
|
|
675
|
-
await extensionRunner.emitStop({
|
|
696
|
+
await extensionRunner.emitStop({
|
|
697
|
+
reason: stopReason,
|
|
698
|
+
lastMessage: last,
|
|
699
|
+
sessionId: event.sessionId,
|
|
700
|
+
turnId: event.turnId,
|
|
701
|
+
abortOrigin: event.abortOrigin,
|
|
702
|
+
});
|
|
676
703
|
} finally {
|
|
677
704
|
this._processingAgentEnd = false;
|
|
678
705
|
}
|
|
@@ -681,6 +708,8 @@ export class AgentSession {
|
|
|
681
708
|
type: "turn_start",
|
|
682
709
|
turnIndex: this._turnIndex,
|
|
683
710
|
timestamp: Date.now(),
|
|
711
|
+
sessionId: event.sessionId,
|
|
712
|
+
turnId: event.turnId,
|
|
684
713
|
};
|
|
685
714
|
await extensionRunner.emit(extensionEvent);
|
|
686
715
|
} else if (event.type === "turn_end") {
|
|
@@ -689,6 +718,8 @@ export class AgentSession {
|
|
|
689
718
|
turnIndex: this._turnIndex,
|
|
690
719
|
message: event.message,
|
|
691
720
|
toolResults: event.toolResults,
|
|
721
|
+
sessionId: event.sessionId,
|
|
722
|
+
turnId: event.turnId,
|
|
692
723
|
};
|
|
693
724
|
await extensionRunner.emit(extensionEvent);
|
|
694
725
|
this._turnIndex++;
|
|
@@ -696,6 +727,8 @@ export class AgentSession {
|
|
|
696
727
|
const extensionEvent: MessageStartEvent = {
|
|
697
728
|
type: "message_start",
|
|
698
729
|
message: event.message,
|
|
730
|
+
sessionId: event.sessionId,
|
|
731
|
+
turnId: event.turnId,
|
|
699
732
|
};
|
|
700
733
|
await extensionRunner.emit(extensionEvent);
|
|
701
734
|
} else if (event.type === "message_update") {
|
|
@@ -703,12 +736,16 @@ export class AgentSession {
|
|
|
703
736
|
type: "message_update",
|
|
704
737
|
message: event.message,
|
|
705
738
|
assistantMessageEvent: event.assistantMessageEvent,
|
|
739
|
+
sessionId: event.sessionId,
|
|
740
|
+
turnId: event.turnId,
|
|
706
741
|
};
|
|
707
742
|
await extensionRunner.emit(extensionEvent);
|
|
708
743
|
} else if (event.type === "message_end") {
|
|
709
744
|
const extensionEvent: MessageEndEvent = {
|
|
710
745
|
type: "message_end",
|
|
711
746
|
message: event.message,
|
|
747
|
+
sessionId: event.sessionId,
|
|
748
|
+
turnId: event.turnId,
|
|
712
749
|
};
|
|
713
750
|
await extensionRunner.emit(extensionEvent);
|
|
714
751
|
} else if (event.type === "tool_execution_start") {
|
|
@@ -867,6 +904,25 @@ export class AgentSession {
|
|
|
867
904
|
this.agent.setSystemPrompt(this._baseSystemPrompt);
|
|
868
905
|
}
|
|
869
906
|
|
|
907
|
+
/**
|
|
908
|
+
* Set or clear a prompt-only filter for the <available_skills> catalog.
|
|
909
|
+
*
|
|
910
|
+
* This does not unload skills or disable the Skill tool. It only controls
|
|
911
|
+
* which loaded skills are advertised in the system prompt on rebuild.
|
|
912
|
+
*/
|
|
913
|
+
setVisibleSkillsByName(skillNames: string[] | undefined): void {
|
|
914
|
+
this._visibleSkillNames = skillNames === undefined
|
|
915
|
+
? undefined
|
|
916
|
+
: new Set(skillNames.map((name) => name.trim().toLowerCase()).filter(Boolean));
|
|
917
|
+
this._baseSystemPrompt = this._rebuildSystemPrompt(this.getActiveToolNames());
|
|
918
|
+
this.agent.setSystemPrompt(this._baseSystemPrompt);
|
|
919
|
+
}
|
|
920
|
+
|
|
921
|
+
/** Get the current prompt-only skill catalog filter, if one is active. */
|
|
922
|
+
getVisibleSkillNames(): string[] | undefined {
|
|
923
|
+
return this._visibleSkillNames ? [...this._visibleSkillNames] : undefined;
|
|
924
|
+
}
|
|
925
|
+
|
|
870
926
|
/** Whether compaction or branch summarization is currently running */
|
|
871
927
|
get isCompacting(): boolean {
|
|
872
928
|
return this._compactionOrchestrator.isCompacting;
|
|
@@ -1045,6 +1101,9 @@ export class AgentSession {
|
|
|
1045
1101
|
return buildSystemPrompt({
|
|
1046
1102
|
cwd: this._cwd,
|
|
1047
1103
|
skills: loadedSkills,
|
|
1104
|
+
skillFilter: this._visibleSkillNames
|
|
1105
|
+
? (skill) => this._visibleSkillNames!.has(skill.name.trim().toLowerCase())
|
|
1106
|
+
: undefined,
|
|
1048
1107
|
contextFiles: loadedContextFiles,
|
|
1049
1108
|
customPrompt: loaderSystemPrompt,
|
|
1050
1109
|
appendSystemPrompt,
|
|
@@ -1572,9 +1631,9 @@ export class AgentSession {
|
|
|
1572
1631
|
/**
|
|
1573
1632
|
* Abort current operation and wait for agent to become idle.
|
|
1574
1633
|
*/
|
|
1575
|
-
async abort(): Promise<void> {
|
|
1634
|
+
async abort(options?: { origin?: AgentAbortOrigin }): Promise<void> {
|
|
1576
1635
|
this._retryHandler.abortRetry();
|
|
1577
|
-
this.agent.abort();
|
|
1636
|
+
this.agent.abort(options?.origin);
|
|
1578
1637
|
await this.agent.waitForIdle();
|
|
1579
1638
|
// Ensure agent_end is emitted even when abort interrupts a tool call (#1414).
|
|
1580
1639
|
// The agent may go idle without emitting agent_end if the abort happens
|
|
@@ -1588,6 +1647,8 @@ export class AgentSession {
|
|
|
1588
1647
|
await this._extensionRunner.emit({
|
|
1589
1648
|
type: "agent_end",
|
|
1590
1649
|
messages,
|
|
1650
|
+
sessionId: this.sessionId,
|
|
1651
|
+
abortOrigin: options?.origin,
|
|
1591
1652
|
});
|
|
1592
1653
|
const last = messages[messages.length - 1];
|
|
1593
1654
|
const stopReason: "completed" | "cancelled" | "error" | "blocked" =
|
|
@@ -1598,7 +1659,12 @@ export class AgentSession {
|
|
|
1598
1659
|
? "error"
|
|
1599
1660
|
: "completed"
|
|
1600
1661
|
: "cancelled";
|
|
1601
|
-
await this._extensionRunner.emitStop({
|
|
1662
|
+
await this._extensionRunner.emitStop({
|
|
1663
|
+
reason: stopReason,
|
|
1664
|
+
lastMessage: last,
|
|
1665
|
+
sessionId: this.sessionId,
|
|
1666
|
+
abortOrigin: options?.origin,
|
|
1667
|
+
});
|
|
1602
1668
|
} finally {
|
|
1603
1669
|
this._processingAgentEnd = wasProcessingAgentEnd;
|
|
1604
1670
|
}
|
|
@@ -1626,7 +1692,12 @@ export class AgentSession {
|
|
|
1626
1692
|
// message_end/agent_end events fire while listeners are still connected.
|
|
1627
1693
|
// During agent_end handling the turn is already ending; aborting there can
|
|
1628
1694
|
// convert a successful auto-mode handoff into an aborted provider message.
|
|
1629
|
-
|
|
1695
|
+
if (!this.agent.state.isStreaming) {
|
|
1696
|
+
this._retryHandler.abortRetry();
|
|
1697
|
+
await this.agent.waitForIdle();
|
|
1698
|
+
return;
|
|
1699
|
+
}
|
|
1700
|
+
await this.abort({ origin: "session-transition" });
|
|
1630
1701
|
}
|
|
1631
1702
|
|
|
1632
1703
|
/**
|
|
@@ -1640,6 +1711,8 @@ export class AgentSession {
|
|
|
1640
1711
|
async newSession(options?: {
|
|
1641
1712
|
parentSession?: string;
|
|
1642
1713
|
setup?: (sessionManager: SessionManager) => Promise<void>;
|
|
1714
|
+
/** Explicit workspace root for the new session/tool runtime. */
|
|
1715
|
+
workspaceRoot?: string;
|
|
1643
1716
|
/** See ExtensionCommandContext.newSession for docs (#3731). */
|
|
1644
1717
|
abortSignal?: AbortSignal;
|
|
1645
1718
|
}): Promise<boolean> {
|
|
@@ -1661,10 +1734,10 @@ export class AgentSession {
|
|
|
1661
1734
|
try {
|
|
1662
1735
|
await this._settleCurrentTurnForSessionTransition();
|
|
1663
1736
|
|
|
1664
|
-
// #3731: If the caller aborted (e.g. runUnit() timed out
|
|
1665
|
-
//
|
|
1666
|
-
//
|
|
1667
|
-
//
|
|
1737
|
+
// #3731: If the caller aborted (e.g. runUnit() timed out while the
|
|
1738
|
+
// worktree was being torn down), discard this session before rebuilding
|
|
1739
|
+
// the tool runtime. Without this check, the late newSession() could
|
|
1740
|
+
// rebuild tools with a stale workspace root.
|
|
1668
1741
|
if (options?.abortSignal?.aborted) {
|
|
1669
1742
|
return false;
|
|
1670
1743
|
}
|
|
@@ -1674,15 +1747,21 @@ export class AgentSession {
|
|
|
1674
1747
|
} finally {
|
|
1675
1748
|
this._sessionSwitchPending = false;
|
|
1676
1749
|
}
|
|
1677
|
-
// Update
|
|
1678
|
-
//
|
|
1750
|
+
// Update the workspace root for the new tool runtime. Auto-mode passes
|
|
1751
|
+
// this explicitly so session routing does not depend on global
|
|
1752
|
+
// process.cwd() after worktree merge/teardown. Other callers keep the
|
|
1753
|
+
// historical default.
|
|
1679
1754
|
const previousCwd = this._cwd;
|
|
1680
|
-
this._cwd = process.cwd();
|
|
1755
|
+
this._cwd = options?.workspaceRoot ?? process.cwd();
|
|
1756
|
+
if (this._workspaceRootRef) {
|
|
1757
|
+
this._workspaceRootRef.current = this._cwd;
|
|
1758
|
+
}
|
|
1681
1759
|
this.sessionManager.newSession({ parentSession: options?.parentSession });
|
|
1682
1760
|
this.agent.sessionId = this.sessionManager.getSessionId();
|
|
1683
1761
|
this._steeringMessages = [];
|
|
1684
1762
|
this._followUpMessages = [];
|
|
1685
1763
|
this._pendingNextTurnMessages = [];
|
|
1764
|
+
this._visibleSkillNames = undefined;
|
|
1686
1765
|
|
|
1687
1766
|
this.sessionManager.appendThinkingLevelChange(this.thinkingLevel);
|
|
1688
1767
|
|
|
@@ -2180,6 +2259,8 @@ export class AgentSession {
|
|
|
2180
2259
|
getActiveTools: () => this.getActiveToolNames(),
|
|
2181
2260
|
getAllTools: () => this.getAllTools(),
|
|
2182
2261
|
setActiveTools: (toolNames) => this.setActiveToolsByName(toolNames),
|
|
2262
|
+
getVisibleSkills: () => this.getVisibleSkillNames(),
|
|
2263
|
+
setVisibleSkills: (skillNames) => this.setVisibleSkillsByName(skillNames),
|
|
2183
2264
|
refreshTools: () => this._refreshToolRegistry(),
|
|
2184
2265
|
getCommands,
|
|
2185
2266
|
setModel: async (model, options) => {
|
|
@@ -2193,7 +2274,7 @@ export class AgentSession {
|
|
|
2193
2274
|
{
|
|
2194
2275
|
getModel: () => this.model,
|
|
2195
2276
|
isIdle: () => !this.isStreaming,
|
|
2196
|
-
abort: () => this.abort(),
|
|
2277
|
+
abort: () => this.abort({ origin: "user" }),
|
|
2197
2278
|
hasPendingMessages: () => this.pendingMessageCount > 0,
|
|
2198
2279
|
shutdown: () => {
|
|
2199
2280
|
this._extensionShutdownHandler?.();
|
|
@@ -2211,6 +2292,9 @@ export class AgentSession {
|
|
|
2211
2292
|
})();
|
|
2212
2293
|
},
|
|
2213
2294
|
getSystemPrompt: () => this.systemPrompt,
|
|
2295
|
+
setCompactionThresholdOverride: (percent) => {
|
|
2296
|
+
this.settingsManager.setCompactionThresholdOverride(percent);
|
|
2297
|
+
},
|
|
2214
2298
|
},
|
|
2215
2299
|
);
|
|
2216
2300
|
}
|
|
@@ -2345,6 +2429,7 @@ export class AgentSession {
|
|
|
2345
2429
|
this.settingsManager.reload();
|
|
2346
2430
|
resetApiProviders();
|
|
2347
2431
|
await this._resourceLoader.reload();
|
|
2432
|
+
this._visibleSkillNames = undefined;
|
|
2348
2433
|
this._buildRuntime({
|
|
2349
2434
|
activeToolNames: this.getActiveToolNames(),
|
|
2350
2435
|
flagValues: previousFlagValues,
|
|
@@ -2534,6 +2619,7 @@ export class AgentSession {
|
|
|
2534
2619
|
this._steeringMessages = [];
|
|
2535
2620
|
this._followUpMessages = [];
|
|
2536
2621
|
this._pendingNextTurnMessages = [];
|
|
2622
|
+
this._visibleSkillNames = undefined;
|
|
2537
2623
|
|
|
2538
2624
|
// Set new session
|
|
2539
2625
|
this.sessionManager.setSessionFile(sessionPath);
|
|
@@ -1049,7 +1049,9 @@ test("chat-controller rolls up only contiguous low-signal tool runs on message_e
|
|
|
1049
1049
|
assert.equal(host.chatContainer.children[1]?.constructor?.name, "AssistantMessageComponent");
|
|
1050
1050
|
assert.equal(host.chatContainer.children[2]?.constructor?.name, "ToolPhaseSummaryComponent");
|
|
1051
1051
|
assert.match(host.chatContainer.children[0].render(120).join("\n"), /Setup \/ shell 2 actions/);
|
|
1052
|
-
|
|
1052
|
+
const readSummary = host.chatContainer.children[2].render(120).join("\n");
|
|
1053
|
+
assert.match(readSummary, /Context reads · 2 files/);
|
|
1054
|
+
assert.match(readSummary, /\/tmp\/a · \/tmp\/b/);
|
|
1053
1055
|
assert.equal(host.chatContainer._prevRender, null, "summary reposition must invalidate the chat container render cache");
|
|
1054
1056
|
});
|
|
1055
1057
|
|
|
@@ -1080,7 +1082,9 @@ test("chat-controller rolls up low-signal direct tool execution events on agent_
|
|
|
1080
1082
|
} as any);
|
|
1081
1083
|
}
|
|
1082
1084
|
|
|
1083
|
-
assert.equal(host.chatContainer.children.length,
|
|
1085
|
+
assert.equal(host.chatContainer.children.length, 1, "direct tool events roll up as they finish");
|
|
1086
|
+
assert.equal(host.chatContainer.children[0]?.constructor?.name, "ToolPhaseSummaryComponent");
|
|
1087
|
+
assert.match(host.chatContainer.children[0].render(120).join("\n"), /Setup \/ shell 3 actions/);
|
|
1084
1088
|
|
|
1085
1089
|
await handleAgentEvent(host, { type: "agent_end" } as any);
|
|
1086
1090
|
|
|
@@ -86,6 +86,13 @@ export interface CompactionSettings {
|
|
|
86
86
|
enabled: boolean;
|
|
87
87
|
reserveTokens: number;
|
|
88
88
|
keepRecentTokens: number;
|
|
89
|
+
/**
|
|
90
|
+
* Optional percent-of-context-window threshold (0 < value < 1). When set,
|
|
91
|
+
* `shouldCompact()` fires once `contextTokens > contextWindow * thresholdPercent`,
|
|
92
|
+
* overriding the absolute `reserveTokens` calculation. Lets host integrations
|
|
93
|
+
* (e.g. GSD) express compaction policy as a fraction independent of model size.
|
|
94
|
+
*/
|
|
95
|
+
thresholdPercent?: number;
|
|
89
96
|
}
|
|
90
97
|
|
|
91
98
|
export const DEFAULT_COMPACTION_SETTINGS: CompactionSettings = {
|
|
@@ -185,9 +192,20 @@ export function estimateContextTokens(messages: AgentMessage[]): ContextUsageEst
|
|
|
185
192
|
|
|
186
193
|
/**
|
|
187
194
|
* Check if compaction should trigger based on context usage.
|
|
195
|
+
*
|
|
196
|
+
* When `thresholdPercent` is set (and within (0, 1)), it overrides the absolute
|
|
197
|
+
* `reserveTokens` calculation: compaction fires at `contextWindow * thresholdPercent`.
|
|
198
|
+
* Otherwise the legacy `contextWindow - reserveTokens` headroom is used.
|
|
188
199
|
*/
|
|
189
200
|
export function shouldCompact(contextTokens: number, contextWindow: number, settings: CompactionSettings): boolean {
|
|
190
201
|
if (!settings.enabled) return false;
|
|
202
|
+
if (
|
|
203
|
+
settings.thresholdPercent !== undefined &&
|
|
204
|
+
settings.thresholdPercent > 0 &&
|
|
205
|
+
settings.thresholdPercent < 1
|
|
206
|
+
) {
|
|
207
|
+
return contextTokens > contextWindow * settings.thresholdPercent;
|
|
208
|
+
}
|
|
191
209
|
return contextTokens > contextWindow - settings.reserveTokens;
|
|
192
210
|
}
|
|
193
211
|
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// pi-coding-agent / Regression tests for compaction threshold percent (#5475)
|
|
2
|
+
|
|
3
|
+
import assert from "node:assert/strict";
|
|
4
|
+
import { describe, it } from "node:test";
|
|
5
|
+
|
|
6
|
+
import { shouldCompact, type CompactionSettings } from "./compaction/compaction.js";
|
|
7
|
+
import { SettingsManager } from "./settings-manager.js";
|
|
8
|
+
|
|
9
|
+
const REGISTRY_DEFAULTS: CompactionSettings = {
|
|
10
|
+
enabled: true,
|
|
11
|
+
reserveTokens: 16_384,
|
|
12
|
+
keepRecentTokens: 20_000,
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
describe("shouldCompact — thresholdPercent (#5475)", () => {
|
|
16
|
+
it("uses absolute reserveTokens when thresholdPercent is unset (legacy behavior)", () => {
|
|
17
|
+
// 200K window, 16384 reserve → fires at 183_617 tokens
|
|
18
|
+
assert.equal(shouldCompact(183_616, 200_000, REGISTRY_DEFAULTS), false);
|
|
19
|
+
assert.equal(shouldCompact(183_617, 200_000, REGISTRY_DEFAULTS), true);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it("uses thresholdPercent when set, ignoring reserveTokens", () => {
|
|
23
|
+
const settings: CompactionSettings = { ...REGISTRY_DEFAULTS, thresholdPercent: 0.7 };
|
|
24
|
+
// 200K * 0.7 = 140_000 → fires above that
|
|
25
|
+
assert.equal(shouldCompact(140_000, 200_000, settings), false);
|
|
26
|
+
assert.equal(shouldCompact(140_001, 200_000, settings), true);
|
|
27
|
+
// reserveTokens-based math would have said false at 183_616 — the percent override changes that
|
|
28
|
+
assert.equal(shouldCompact(150_000, 200_000, settings), true);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it("falls back to reserveTokens when thresholdPercent is out of range", () => {
|
|
32
|
+
// Defense in depth: reject 0, 1, negative, NaN, Infinity
|
|
33
|
+
for (const bad of [0, 1, -0.1, 1.5, Number.NaN, Number.POSITIVE_INFINITY]) {
|
|
34
|
+
const settings: CompactionSettings = { ...REGISTRY_DEFAULTS, thresholdPercent: bad };
|
|
35
|
+
assert.equal(
|
|
36
|
+
shouldCompact(183_616, 200_000, settings),
|
|
37
|
+
false,
|
|
38
|
+
`bad=${bad} should fall back to reserveTokens math`,
|
|
39
|
+
);
|
|
40
|
+
assert.equal(shouldCompact(183_617, 200_000, settings), true, `bad=${bad}`);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it("respects enabled=false regardless of thresholdPercent", () => {
|
|
45
|
+
const settings: CompactionSettings = {
|
|
46
|
+
...REGISTRY_DEFAULTS,
|
|
47
|
+
enabled: false,
|
|
48
|
+
thresholdPercent: 0.5,
|
|
49
|
+
};
|
|
50
|
+
assert.equal(shouldCompact(199_999, 200_000, settings), false);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it("scales with contextWindow — same percent, different windows", () => {
|
|
54
|
+
const settings: CompactionSettings = { ...REGISTRY_DEFAULTS, thresholdPercent: 0.8 };
|
|
55
|
+
// 100K window: fires above 80_000
|
|
56
|
+
assert.equal(shouldCompact(80_000, 100_000, settings), false);
|
|
57
|
+
assert.equal(shouldCompact(80_001, 100_000, settings), true);
|
|
58
|
+
// 1M window: fires above 800_000
|
|
59
|
+
assert.equal(shouldCompact(800_000, 1_000_000, settings), false);
|
|
60
|
+
assert.equal(shouldCompact(800_001, 1_000_000, settings), true);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
describe("SettingsManager — compaction threshold override (#5475)", () => {
|
|
65
|
+
it("getCompactionThresholdPercent returns undefined by default", () => {
|
|
66
|
+
const sm = SettingsManager.inMemory({});
|
|
67
|
+
assert.equal(sm.getCompactionThresholdPercent(), undefined);
|
|
68
|
+
assert.equal(sm.getCompactionSettings().thresholdPercent, undefined);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it("setCompactionThresholdOverride applies in-memory and is exposed via getCompactionSettings", () => {
|
|
72
|
+
const sm = SettingsManager.inMemory({});
|
|
73
|
+
sm.setCompactionThresholdOverride(0.7);
|
|
74
|
+
assert.equal(sm.getCompactionThresholdPercent(), 0.7);
|
|
75
|
+
assert.equal(sm.getCompactionSettings().thresholdPercent, 0.7);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it("setCompactionThresholdOverride(undefined) clears a prior override", () => {
|
|
79
|
+
const sm = SettingsManager.inMemory({});
|
|
80
|
+
sm.setCompactionThresholdOverride(0.7);
|
|
81
|
+
sm.setCompactionThresholdOverride(undefined);
|
|
82
|
+
assert.equal(sm.getCompactionThresholdPercent(), undefined);
|
|
83
|
+
assert.equal(sm.getCompactionSettings().thresholdPercent, undefined);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it("setCompactionThresholdOverride preserves other compaction fields (enabled, reserveTokens)", () => {
|
|
87
|
+
const sm = SettingsManager.inMemory({
|
|
88
|
+
compaction: { enabled: true, reserveTokens: 30_000, keepRecentTokens: 25_000 },
|
|
89
|
+
});
|
|
90
|
+
sm.setCompactionThresholdOverride(0.6);
|
|
91
|
+
const settings = sm.getCompactionSettings();
|
|
92
|
+
assert.equal(settings.enabled, true);
|
|
93
|
+
assert.equal(settings.reserveTokens, 30_000);
|
|
94
|
+
assert.equal(settings.keepRecentTokens, 25_000);
|
|
95
|
+
assert.equal(settings.thresholdPercent, 0.6);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it("setCompactionThresholdOverride works when no compaction config exists yet", () => {
|
|
99
|
+
const sm = SettingsManager.inMemory({});
|
|
100
|
+
sm.setCompactionThresholdOverride(0.85);
|
|
101
|
+
assert.equal(sm.getCompactionThresholdPercent(), 0.85);
|
|
102
|
+
// Other compaction fields fall back to their defaults
|
|
103
|
+
const settings = sm.getCompactionSettings();
|
|
104
|
+
assert.equal(settings.enabled, true);
|
|
105
|
+
assert.equal(typeof settings.reserveTokens, "number");
|
|
106
|
+
assert.equal(typeof settings.keepRecentTokens, "number");
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
describe("end-to-end — getCompactionSettings + shouldCompact (#5475)", () => {
|
|
111
|
+
it("70% threshold on a 200K window fires at the documented bug-report value (140_001 not 183_617)", () => {
|
|
112
|
+
const sm = SettingsManager.inMemory({});
|
|
113
|
+
sm.setCompactionThresholdOverride(0.7);
|
|
114
|
+
const settings = sm.getCompactionSettings();
|
|
115
|
+
|
|
116
|
+
assert.equal(shouldCompact(140_000, 200_000, settings), false);
|
|
117
|
+
assert.equal(shouldCompact(140_001, 200_000, settings), true);
|
|
118
|
+
// Pre-fix behavior would have required 183_617 — verify we no longer wait that long
|
|
119
|
+
assert.equal(shouldCompact(150_000, 200_000, settings), true);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { describe, it, afterEach } from "node:test";
|
|
3
|
+
import { existsSync, mkdtempSync, readFileSync, readdirSync, rmSync } from "node:fs";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
|
|
7
|
+
import { atomicWriteDbSnapshotSync } from "./db-snapshot.js";
|
|
8
|
+
|
|
9
|
+
describe("atomicWriteDbSnapshotSync", () => {
|
|
10
|
+
let dir: string;
|
|
11
|
+
|
|
12
|
+
afterEach(() => {
|
|
13
|
+
if (dir) {
|
|
14
|
+
rmSync(dir, { recursive: true, force: true });
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it("writes the full snapshot and leaves no temp file after success", () => {
|
|
19
|
+
dir = mkdtempSync(join(tmpdir(), "gsd-db-snapshot-test-"));
|
|
20
|
+
const dbPath = join(dir, "agent.db");
|
|
21
|
+
const snapshot = new Uint8Array([0x53, 0x51, 0x4c, 0x69, 0x74, 0x65]);
|
|
22
|
+
|
|
23
|
+
atomicWriteDbSnapshotSync(dbPath, snapshot);
|
|
24
|
+
|
|
25
|
+
assert.deepEqual(readFileSync(dbPath), Buffer.from(snapshot));
|
|
26
|
+
assert.equal(existsSync(`${dbPath}.tmp`), false);
|
|
27
|
+
assert.deepEqual(
|
|
28
|
+
readdirSync(dir).filter((entry) => entry.includes("agent.db") && entry.includes(".tmp")),
|
|
29
|
+
[],
|
|
30
|
+
);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { closeSync, fsyncSync, openSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { basename, dirname, join } from "node:path";
|
|
4
|
+
|
|
5
|
+
export type DbSnapshot = Buffer | Uint8Array;
|
|
6
|
+
|
|
7
|
+
function closeBestEffort(fd: number | null): void {
|
|
8
|
+
if (fd === null) return;
|
|
9
|
+
try {
|
|
10
|
+
closeSync(fd);
|
|
11
|
+
} catch {
|
|
12
|
+
// Preserve the original write/rename failure when cleaning up.
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function fsyncDirectoryBestEffort(dirPath: string): void {
|
|
17
|
+
let fd: number | null = null;
|
|
18
|
+
try {
|
|
19
|
+
fd = openSync(dirPath, "r");
|
|
20
|
+
fsyncSync(fd);
|
|
21
|
+
} catch {
|
|
22
|
+
// Directory fsync is unsupported on some platforms/filesystems.
|
|
23
|
+
} finally {
|
|
24
|
+
closeBestEffort(fd);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Persist a sql.js database export without exposing callers to a torn live file.
|
|
30
|
+
*
|
|
31
|
+
* The snapshot is written to a unique temp file in the same directory, flushed,
|
|
32
|
+
* then renamed over the target. A hard kill during the temp write leaves the
|
|
33
|
+
* previous target intact; after rename, readers see the complete new snapshot.
|
|
34
|
+
*
|
|
35
|
+
* The rename replaces the target inode: existing file mode/ownership is not
|
|
36
|
+
* preserved, and a symlink at dbPath is replaced rather than written through.
|
|
37
|
+
* Agent DB snapshots are owned runtime files, so this trade-off favors a
|
|
38
|
+
* private 0600 replacement over retaining prior target metadata.
|
|
39
|
+
*/
|
|
40
|
+
export function atomicWriteDbSnapshotSync(dbPath: string, snapshot: DbSnapshot): void {
|
|
41
|
+
const dirPath = dirname(dbPath);
|
|
42
|
+
const tmpPath = join(dirPath, `.${basename(dbPath)}.${process.pid}.${Date.now()}.${randomUUID()}.tmp`);
|
|
43
|
+
let fd: number | null = null;
|
|
44
|
+
let renamed = false;
|
|
45
|
+
|
|
46
|
+
try {
|
|
47
|
+
fd = openSync(tmpPath, "wx", 0o600);
|
|
48
|
+
writeFileSync(fd, Buffer.from(snapshot));
|
|
49
|
+
fsyncSync(fd);
|
|
50
|
+
closeSync(fd);
|
|
51
|
+
fd = null;
|
|
52
|
+
|
|
53
|
+
renameSync(tmpPath, dbPath);
|
|
54
|
+
renamed = true;
|
|
55
|
+
fsyncDirectoryBestEffort(dirPath);
|
|
56
|
+
} finally {
|
|
57
|
+
closeBestEffort(fd);
|
|
58
|
+
if (!renamed) {
|
|
59
|
+
try {
|
|
60
|
+
unlinkSync(tmpPath);
|
|
61
|
+
} catch {
|
|
62
|
+
// The temp file may not have been created yet.
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -415,6 +415,8 @@ export function createExtensionRuntime(): ExtensionRuntime {
|
|
|
415
415
|
getActiveTools: notInitialized,
|
|
416
416
|
getAllTools: notInitialized,
|
|
417
417
|
setActiveTools: notInitialized,
|
|
418
|
+
getVisibleSkills: notInitialized,
|
|
419
|
+
setVisibleSkills: notInitialized,
|
|
418
420
|
// registerTool() is valid during extension load; refresh is only needed post-bind.
|
|
419
421
|
refreshTools: () => {},
|
|
420
422
|
getCommands: notInitialized,
|
|
@@ -566,6 +568,14 @@ function createExtensionAPI(
|
|
|
566
568
|
runtime.setActiveTools(toolNames);
|
|
567
569
|
},
|
|
568
570
|
|
|
571
|
+
getVisibleSkills(): string[] | undefined {
|
|
572
|
+
return runtime.getVisibleSkills();
|
|
573
|
+
},
|
|
574
|
+
|
|
575
|
+
setVisibleSkills(skillNames: string[] | undefined): void {
|
|
576
|
+
runtime.setVisibleSkills(skillNames);
|
|
577
|
+
},
|
|
578
|
+
|
|
569
579
|
getCommands() {
|
|
570
580
|
return runtime.getCommands();
|
|
571
581
|
},
|