@opengsd/gsd-pi 1.9.0 → 1.10.0-dev.a5e42e99
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 +10 -9
- package/dist/headless.js +2 -1
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +2 -2
- package/dist/resources/extensions/gsd/artifact-verification.js +3 -4
- package/dist/resources/extensions/gsd/auto/loop.js +24 -4
- package/dist/resources/extensions/gsd/auto/run-unit.js +19 -1
- package/dist/resources/extensions/gsd/auto/unit-phase.js +37 -5
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +14 -8
- package/dist/resources/extensions/gsd/auto-dispatch.js +2 -0
- package/dist/resources/extensions/gsd/auto-model-selection.js +1 -0
- package/dist/resources/extensions/gsd/auto-prompts.js +102 -21
- package/dist/resources/extensions/gsd/auto-recovery.js +10 -5
- package/dist/resources/extensions/gsd/auto-runtime-state.js +5 -5
- package/dist/resources/extensions/gsd/auto-start.js +30 -10
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +40 -0
- package/dist/resources/extensions/gsd/auto-verification.js +25 -12
- package/dist/resources/extensions/gsd/auto-worktree-cleanup.js +4 -0
- package/dist/resources/extensions/gsd/auto-worktree-sync.js +7 -3
- package/dist/resources/extensions/gsd/auto-worktree-teardown.js +1 -1
- package/dist/resources/extensions/gsd/auto.js +15 -5
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +2 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +33 -7
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +10 -3
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +7 -26
- package/dist/resources/extensions/gsd/commands-verdict.js +10 -9
- package/dist/resources/extensions/gsd/compat/compat-marker.js +80 -5
- package/dist/resources/extensions/gsd/constants.js +12 -13
- package/dist/resources/extensions/gsd/context-masker.js +97 -21
- package/dist/resources/extensions/gsd/db/engine.js +5 -2
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +33 -2
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +40 -12
- package/dist/resources/extensions/gsd/error-classifier.js +12 -2
- package/dist/resources/extensions/gsd/exec-sandbox.js +1 -0
- package/dist/resources/extensions/gsd/flat-phase-migration.js +12 -0
- package/dist/resources/extensions/gsd/git-service.js +19 -7
- package/dist/resources/extensions/gsd/gsd-db.js +75 -31
- package/dist/resources/extensions/gsd/guided-flow.js +11 -5
- package/dist/resources/extensions/gsd/markdown-renderer.js +5 -21
- package/dist/resources/extensions/gsd/md-importer.js +5 -6
- package/dist/resources/extensions/gsd/model-cost-table.js +6 -1
- package/dist/resources/extensions/gsd/model-router.js +16 -0
- package/dist/resources/extensions/gsd/paths.js +66 -15
- package/dist/resources/extensions/gsd/planning-subagent-policy.js +37 -0
- package/dist/resources/extensions/gsd/planning-subagent-registry.js +33 -0
- package/dist/resources/extensions/gsd/preferences-models.js +50 -10
- package/dist/resources/extensions/gsd/preferences-types.js +6 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +86 -4
- package/dist/resources/extensions/gsd/preferences.js +24 -0
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +5 -5
- package/dist/resources/extensions/gsd/provider-payload-policy.js +16 -5
- package/dist/resources/extensions/gsd/safety/destructive-guard.js +1 -1
- package/dist/resources/extensions/gsd/skill-activation.js +17 -3
- package/dist/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.js +98 -2
- package/dist/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.js +4 -1
- package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +5 -2
- package/dist/resources/extensions/gsd/stop-notice.js +9 -0
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +8 -0
- package/dist/resources/extensions/gsd/tools/complete-task.js +12 -5
- package/dist/resources/extensions/gsd/tools/plan-slice.js +5 -1
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +14 -5
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +15 -5
- package/dist/resources/extensions/gsd/tools/reopen-task.js +16 -10
- package/dist/resources/extensions/gsd/unit-context-composer.js +28 -5
- package/dist/resources/extensions/gsd/verification-evidence.js +5 -3
- package/dist/resources/extensions/gsd/workflow-projections.js +2 -3
- package/dist/resources/extensions/gsd/workspace.js +2 -1
- package/dist/resources/extensions/gsd/worktree-state-projection.js +20 -18
- package/dist/resources/extensions/ollama/ollama-chat-provider.js +2 -2
- package/dist/resources/extensions/shared/interview-ui.js +43 -6
- package/dist/resources/extensions/subagent/index.js +1 -1
- package/dist/startup-model-validation.d.ts +1 -1
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/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/mcp-connections/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/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 +4 -4
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
- package/dist/web/standalone/.next/server/chunks/1991.js +2 -2
- package/dist/web/standalone/.next/server/chunks/2842.js +4 -4
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/8357.js +3 -3
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +3 -3
- 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/app/_not-found/page-a6fb1847f67f167c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/{layout-b35cbfff38aaf4cf.js → layout-4ae2d68984392bbf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-72a856634ad14c10.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{main-app-590a74400e35f685.js → main-app-90d1d8d5e5d2dc6b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-1115d46ac61b9823.js +1 -0
- package/dist/web/standalone/node_modules/@gsd/native/package.json +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/server.js +1 -1
- package/integrations/hermes/open_gsd_hermes/gsd_client.py +1 -1
- package/integrations/hermes/pyproject.toml +1 -1
- package/package.json +8 -6
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/rpc.d.ts +1 -1
- package/packages/contracts/dist/rpc.d.ts.map +1 -1
- package/packages/contracts/dist/rpc.js +1 -1
- package/packages/contracts/dist/rpc.js.map +1 -1
- package/packages/contracts/dist/rpc.test.js +1 -1
- package/packages/contracts/dist/rpc.test.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/compaction/compaction.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.js +36 -4
- package/packages/gsd-agent-core/dist/compaction/compaction.js.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.js +1 -0
- package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/cli/args.js +2 -2
- package/packages/gsd-agent-modes/dist/cli/args.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/thinking-selector.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/gsd-cloud/README.md +21 -5
- package/packages/gsd-cloud/dist/background-cli.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/background-cli.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/background-cli.test.js +325 -0
- package/packages/gsd-cloud/dist/background-cli.test.js.map +1 -0
- package/packages/gsd-cloud/dist/cli.d.ts.map +1 -1
- package/packages/gsd-cloud/dist/cli.js +146 -16
- package/packages/gsd-cloud/dist/cli.js.map +1 -1
- package/packages/gsd-cloud/dist/cloud-config.d.ts +1 -1
- package/packages/gsd-cloud/dist/cloud-config.d.ts.map +1 -1
- package/packages/gsd-cloud/dist/cloud-config.js +7 -1
- package/packages/gsd-cloud/dist/cloud-config.js.map +1 -1
- package/packages/gsd-cloud/dist/cloud-runtime.d.ts +7 -4
- package/packages/gsd-cloud/dist/cloud-runtime.d.ts.map +1 -1
- package/packages/gsd-cloud/dist/cloud-runtime.js +115 -31
- package/packages/gsd-cloud/dist/cloud-runtime.js.map +1 -1
- package/packages/gsd-cloud/dist/cloud-runtime.test.js +224 -59
- package/packages/gsd-cloud/dist/cloud-runtime.test.js.map +1 -1
- package/packages/gsd-cloud/dist/runtime-artifacts.d.ts +3 -0
- package/packages/gsd-cloud/dist/runtime-artifacts.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/runtime-artifacts.js +36 -0
- package/packages/gsd-cloud/dist/runtime-artifacts.js.map +1 -0
- package/packages/gsd-cloud/dist/runtime-process.d.ts +32 -0
- package/packages/gsd-cloud/dist/runtime-process.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/runtime-process.js +640 -0
- package/packages/gsd-cloud/dist/runtime-process.js.map +1 -0
- package/packages/gsd-cloud/dist/runtime-process.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/runtime-process.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/runtime-process.test.js +543 -0
- package/packages/gsd-cloud/dist/runtime-process.test.js.map +1 -0
- package/packages/gsd-cloud/dist/runtime-telemetry.d.ts +117 -0
- package/packages/gsd-cloud/dist/runtime-telemetry.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/runtime-telemetry.js +291 -0
- package/packages/gsd-cloud/dist/runtime-telemetry.js.map +1 -0
- package/packages/gsd-cloud/dist/runtime-telemetry.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/runtime-telemetry.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/runtime-telemetry.test.js +434 -0
- package/packages/gsd-cloud/dist/runtime-telemetry.test.js.map +1 -0
- package/packages/gsd-cloud/package.json +2 -2
- package/packages/mcp-server/README.md +7 -2
- package/packages/mcp-server/dist/cli-runner.d.ts +3 -0
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -1
- package/packages/mcp-server/dist/cli-runner.js +119 -33
- package/packages/mcp-server/dist/cli-runner.js.map +1 -1
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +5 -5
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +4 -3
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +4 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent.d.ts +5 -1
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +2 -0
- package/packages/pi-agent-core/dist/agent.js.map +1 -1
- package/packages/pi-agent-core/dist/types.d.ts +2 -2
- 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-ai/dist/models.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +187 -0
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +145 -0
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/models.js +18 -6
- package/packages/pi-ai/dist/models.js.map +1 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.js +3 -2
- package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +6 -1
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/azure-openai-responses.d.ts +1 -1
- package/packages/pi-ai/dist/providers/azure-openai-responses.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/azure-openai-responses.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-vertex.js.map +1 -1
- package/packages/pi-ai/dist/providers/google.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.d.ts +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.js +103 -0
- package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-responses.d.ts +1 -1
- package/packages/pi-ai/dist/providers/openai-responses.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-responses.js +1 -1
- package/packages/pi-ai/dist/providers/openai-responses.js.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.d.ts +1 -1
- package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.js +1 -1
- package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +9 -1
- 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/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +2 -2
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +14 -4
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +8 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.d.ts +5 -0
- package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.js +54 -0
- package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.d.ts +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.js +1 -0
- package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/theme.d.ts +1 -1
- package/pkg/dist/theme/theme.d.ts.map +1 -1
- package/pkg/dist/theme/theme.js +1 -0
- package/pkg/dist/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +2 -2
- package/src/resources/extensions/gsd/artifact-verification.ts +3 -8
- package/src/resources/extensions/gsd/auto/loop.ts +48 -4
- package/src/resources/extensions/gsd/auto/run-unit.ts +20 -1
- package/src/resources/extensions/gsd/auto/unit-phase.ts +41 -5
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +14 -7
- package/src/resources/extensions/gsd/auto-dispatch.ts +1 -0
- package/src/resources/extensions/gsd/auto-model-selection.ts +1 -0
- package/src/resources/extensions/gsd/auto-prompts.ts +118 -19
- package/src/resources/extensions/gsd/auto-recovery.ts +10 -8
- package/src/resources/extensions/gsd/auto-runtime-state.ts +12 -7
- package/src/resources/extensions/gsd/auto-start.ts +32 -9
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +56 -0
- package/src/resources/extensions/gsd/auto-verification.ts +46 -12
- package/src/resources/extensions/gsd/auto-worktree-cleanup.ts +4 -0
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +10 -3
- package/src/resources/extensions/gsd/auto-worktree-teardown.ts +1 -1
- package/src/resources/extensions/gsd/auto.ts +20 -7
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +1 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +41 -12
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +11 -3
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +10 -31
- package/src/resources/extensions/gsd/commands-verdict.ts +16 -9
- package/src/resources/extensions/gsd/compat/compat-marker.ts +99 -5
- package/src/resources/extensions/gsd/constants.ts +14 -13
- package/src/resources/extensions/gsd/context-masker.ts +98 -2
- package/src/resources/extensions/gsd/db/engine.ts +5 -2
- package/src/resources/extensions/gsd/docs/preferences-reference.md +33 -2
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +45 -11
- package/src/resources/extensions/gsd/error-classifier.ts +13 -2
- package/src/resources/extensions/gsd/exec-sandbox.ts +1 -0
- package/src/resources/extensions/gsd/flat-phase-migration.ts +14 -0
- package/src/resources/extensions/gsd/git-service.ts +19 -6
- package/src/resources/extensions/gsd/gsd-db.ts +85 -33
- package/src/resources/extensions/gsd/guided-flow.ts +11 -4
- package/src/resources/extensions/gsd/markdown-renderer.ts +5 -23
- package/src/resources/extensions/gsd/md-importer.ts +5 -5
- package/src/resources/extensions/gsd/model-cost-table.ts +14 -1
- package/src/resources/extensions/gsd/model-router.ts +17 -0
- package/src/resources/extensions/gsd/paths.ts +73 -15
- package/src/resources/extensions/gsd/planning-subagent-policy.ts +58 -0
- package/src/resources/extensions/gsd/planning-subagent-registry.ts +45 -0
- package/src/resources/extensions/gsd/preferences-models.ts +54 -10
- package/src/resources/extensions/gsd/preferences-types.ts +26 -2
- package/src/resources/extensions/gsd/preferences-validation.ts +108 -3
- package/src/resources/extensions/gsd/preferences.ts +38 -0
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +5 -5
- package/src/resources/extensions/gsd/provider-payload-policy.ts +18 -4
- package/src/resources/extensions/gsd/safety/destructive-guard.ts +1 -1
- package/src/resources/extensions/gsd/skill-activation.ts +17 -3
- package/src/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.ts +132 -2
- package/src/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.ts +4 -1
- package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +4 -2
- package/src/resources/extensions/gsd/stop-notice.ts +11 -0
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +8 -0
- package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +7 -7
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +264 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +21 -1
- package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +74 -1
- package/src/resources/extensions/gsd/tests/before-provider-context-management.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/compat-marker.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +76 -1
- package/src/resources/extensions/gsd/tests/context-masker.test.ts +204 -8
- package/src/resources/extensions/gsd/tests/db-engine-cjs-compat.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/db-tools-alias-suppression.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/destructive-guard.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +147 -0
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/external-markdown-edit.test.ts +38 -1
- package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +8 -9
- package/src/resources/extensions/gsd/tests/flat-phase-validation-path.test.ts +20 -1
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +13 -0
- package/src/resources/extensions/gsd/tests/integration/paths.test.ts +22 -4
- package/src/resources/extensions/gsd/tests/integration-branch-meta-location.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +5 -5
- package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/model-isolation.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +7 -5
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +38 -1
- package/src/resources/extensions/gsd/tests/preferences.test.ts +151 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +121 -1
- package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/service-tier.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +33 -7
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -16
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +52 -0
- package/src/resources/extensions/gsd/tests/stop-notice.test.ts +21 -1
- package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +13 -7
- package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/thinking-level-resolution.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/workflow-authority-faults.test.ts +238 -0
- package/src/resources/extensions/gsd/tests/workflow-authority-fixture.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/workflow-authority-fixture.ts +141 -0
- package/src/resources/extensions/gsd/tests/workflow-authority-projection-conflict.test.ts +177 -0
- package/src/resources/extensions/gsd/tests/workflow-fault-harness.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/workflow-fault-harness.ts +72 -0
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +60 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +74 -0
- package/src/resources/extensions/gsd/tools/complete-task.ts +20 -5
- package/src/resources/extensions/gsd/tools/plan-slice.ts +5 -1
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +24 -5
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +25 -5
- package/src/resources/extensions/gsd/tools/reopen-task.ts +23 -9
- package/src/resources/extensions/gsd/unit-context-composer.ts +34 -8
- package/src/resources/extensions/gsd/verification-evidence.ts +5 -2
- package/src/resources/extensions/gsd/workflow-projections.ts +2 -3
- package/src/resources/extensions/gsd/workspace.ts +2 -1
- package/src/resources/extensions/gsd/worktree-state-projection.ts +21 -24
- package/src/resources/extensions/ollama/ollama-chat-provider.ts +2 -2
- package/src/resources/extensions/ollama/tests/ollama-chat-provider-think.test.ts +4 -0
- package/src/resources/extensions/shared/interview-ui.ts +47 -8
- package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +29 -0
- package/src/resources/extensions/subagent/index.ts +1 -1
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-49f565245e1e4afe.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-bc4c723c6a19c6f0.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ec3eaffc9785ba48.js +0 -1
- /package/dist/web/standalone/.next/static/{BE5XoklToI6lZjRzpXih8 → xwUaOqui04jIIFVsIBLiL}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{BE5XoklToI6lZjRzpXih8 → xwUaOqui04jIIFVsIBLiL}/_ssgManifest.js +0 -0
|
@@ -15,7 +15,7 @@ import { isClosedStatus } from "../status-guards.js";
|
|
|
15
15
|
import { transaction, insertMilestone, insertSlice, insertTask, insertVerificationEvidence, getMilestone, getSlice, getTask, updateTaskStatus, deleteVerificationEvidence, saveGateResult, getPendingGatesForTurn, getUnresolvedBlockingReworkFindingsForTask, getBlockingReworkFindingsForTask, applyReworkResolutions, } from "../gsd-db.js";
|
|
16
16
|
import { getWorkflowDatabasePath, ensureWorkflowDbAtPath } from "../db-workspace.js";
|
|
17
17
|
import { getGatesForTurn } from "../gate-registry.js";
|
|
18
|
-
import { gsdProjectionRoot, clearPathCache, resolveMilestonePath, resolveSlicePath } from "../paths.js";
|
|
18
|
+
import { buildFlatTaskFileName, buildTaskFileName, gsdProjectionRoot, clearPathCache, legacyMilestonesDir, resolveMilestonePath, resolveSlicePath, } from "../paths.js";
|
|
19
19
|
import { resolveCanonicalMilestoneRoot } from "../worktree-manager.js";
|
|
20
20
|
import { checkOwnership, taskUnitKey } from "../unit-ownership.js";
|
|
21
21
|
import { saveFile, clearParseCache } from "../files.js";
|
|
@@ -34,13 +34,20 @@ function taskSummaryPath(basePath, milestoneId, sliceId, taskId) {
|
|
|
34
34
|
// a legacy layout and breaks all subsequent path resolution for the session.
|
|
35
35
|
const slicePath = resolveSlicePath(basePath, milestoneId, sliceId);
|
|
36
36
|
const phaseDir = resolveMilestonePath(basePath, milestoneId);
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
38
|
+
const isLegacy = phaseDir
|
|
39
|
+
? phaseDir.startsWith(legacyBase + "/") || phaseDir.startsWith(legacyBase + "\\")
|
|
40
|
+
: false;
|
|
41
|
+
if (isLegacy && phaseDir) {
|
|
42
|
+
// Legacy layout: the slice has its own slices/SID/ subdir → tasks/ subdir.
|
|
43
|
+
const legacySlicePath = slicePath && slicePath !== phaseDir
|
|
44
|
+
? slicePath
|
|
45
|
+
: join(phaseDir, "slices", sliceId);
|
|
46
|
+
return join(legacySlicePath, "tasks", buildTaskFileName(taskId, "SUMMARY"));
|
|
40
47
|
}
|
|
41
48
|
if (phaseDir) {
|
|
42
49
|
// Flat-phase: task summaries go in the phase dir (no tasks/ subdir)
|
|
43
|
-
return join(phaseDir,
|
|
50
|
+
return join(phaseDir, buildFlatTaskFileName(sliceId, taskId, "SUMMARY"));
|
|
44
51
|
}
|
|
45
52
|
// Fallback: legacy hardcoded path (milestone/slice dir not on disk yet)
|
|
46
53
|
return join(gsdProjectionRoot(basePath), "milestones", milestoneId, "slices", sliceId, "tasks", `${taskId}-SUMMARY.md`);
|
|
@@ -6,7 +6,7 @@ import { isNonEmptyString, validateStringArray } from "../validation.js";
|
|
|
6
6
|
import { getGateIdsForTurn } from "../gate-registry.js";
|
|
7
7
|
import { transaction, getMilestone, getSlice, getSliceTasks, insertTask, upsertSlicePlanning, upsertTaskPlanning, insertGateRow, updateSliceStatus, setSliceSketchFlag, deleteTask, deleteArtifactByPath, } from "../gsd-db.js";
|
|
8
8
|
import { invalidateStateCache } from "../state.js";
|
|
9
|
-
import { renderPlanFromDb } from "../markdown-renderer.js";
|
|
9
|
+
import { renderPlanCheckboxes, renderPlanFromDb } from "../markdown-renderer.js";
|
|
10
10
|
import { writeManifest } from "../workflow-manifest.js";
|
|
11
11
|
import { appendEvent } from "../workflow-events.js";
|
|
12
12
|
import { logWarning } from "../workflow-logger.js";
|
|
@@ -371,9 +371,13 @@ export async function handlePlanSlice(rawParams, basePath) {
|
|
|
371
371
|
deleteArtifactByPath(artifactPath);
|
|
372
372
|
}
|
|
373
373
|
const sliceTasks = getSliceTasks(params.milestoneId, params.sliceId);
|
|
374
|
+
const hasClosedTasks = sliceTasks.some((task) => isClosedStatus(task.status));
|
|
374
375
|
const renderResult = sliceTasks.length === 0
|
|
375
376
|
? { planPath: "", taskPlanPaths: [] }
|
|
376
377
|
: await renderPlanFromDb(basePath, params.milestoneId, params.sliceId);
|
|
378
|
+
if (sliceTasks.length > 0 && hasClosedTasks) {
|
|
379
|
+
await renderPlanCheckboxes(basePath, params.milestoneId, params.sliceId);
|
|
380
|
+
}
|
|
377
381
|
if (sliceTasks.length > 0) {
|
|
378
382
|
setSliceSketchFlag(params.milestoneId, params.sliceId, false);
|
|
379
383
|
}
|
|
@@ -16,7 +16,7 @@ import { logWarning } from "../workflow-logger.js";
|
|
|
16
16
|
import { debugLog } from "../debug-logger.js";
|
|
17
17
|
import { existsSync, unlinkSync } from "node:fs";
|
|
18
18
|
import { join } from "node:path";
|
|
19
|
-
import { resolveMilestonePath, resolveSlicePath, resolveTasksDir, clearPathCache } from "../paths.js";
|
|
19
|
+
import { buildFlatTaskFileName, buildTaskFileName, legacyMilestonesDir, resolveMilestonePath, resolveSlicePath, resolveTasksDir, clearPathCache, } from "../paths.js";
|
|
20
20
|
export async function handleReopenMilestone(params, basePath) {
|
|
21
21
|
// ── Validate required fields ────────────────────────────────────────────
|
|
22
22
|
if (!params.milestoneId || typeof params.milestoneId !== "string" || params.milestoneId.trim() === "") {
|
|
@@ -41,6 +41,8 @@ export async function handleReopenMilestone(params, basePath) {
|
|
|
41
41
|
// auto-corrects entities back to "complete", making reopen a no-op (#3161).
|
|
42
42
|
try {
|
|
43
43
|
const milestoneDir = resolveMilestonePath(basePath, params.milestoneId);
|
|
44
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
45
|
+
const isLegacy = !!milestoneDir && (milestoneDir.startsWith(legacyBase + "/") || milestoneDir.startsWith(legacyBase + "\\"));
|
|
44
46
|
if (milestoneDir) {
|
|
45
47
|
const milestoneSummary = join(milestoneDir, `${params.milestoneId}-SUMMARY.md`);
|
|
46
48
|
if (existsSync(milestoneSummary))
|
|
@@ -58,10 +60,17 @@ export async function handleReopenMilestone(params, basePath) {
|
|
|
58
60
|
unlinkSync(sliceUat);
|
|
59
61
|
}
|
|
60
62
|
const tasksDir = resolveTasksDir(basePath, params.milestoneId, slice.id);
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
63
|
+
const tasks = getSliceTasks(params.milestoneId, slice.id);
|
|
64
|
+
for (const task of tasks) {
|
|
65
|
+
const taskSummaries = isLegacy
|
|
66
|
+
? (tasksDir ? [join(tasksDir, buildTaskFileName(task.id, "SUMMARY"))] : [])
|
|
67
|
+
: milestoneDir
|
|
68
|
+
? [
|
|
69
|
+
join(milestoneDir, buildFlatTaskFileName(slice.id, task.id, "SUMMARY")),
|
|
70
|
+
join(milestoneDir, buildTaskFileName(task.id, "SUMMARY")),
|
|
71
|
+
]
|
|
72
|
+
: [];
|
|
73
|
+
for (const taskSummary of taskSummaries) {
|
|
65
74
|
if (existsSync(taskSummary))
|
|
66
75
|
unlinkSync(taskSummary);
|
|
67
76
|
}
|
|
@@ -22,7 +22,7 @@ import { appendEvent } from "../workflow-events.js";
|
|
|
22
22
|
import { logWarning } from "../workflow-logger.js";
|
|
23
23
|
import { existsSync, unlinkSync } from "node:fs";
|
|
24
24
|
import { join } from "node:path";
|
|
25
|
-
import { resolveTasksDir, resolveSlicePath, clearPathCache } from "../paths.js";
|
|
25
|
+
import { buildFlatTaskFileName, buildTaskFileName, legacyMilestonesDir, resolveMilestonePath, resolveTasksDir, resolveSlicePath, clearPathCache, } from "../paths.js";
|
|
26
26
|
export async function handleReopenSlice(params, basePath) {
|
|
27
27
|
// ── Validate required fields ────────────────────────────────────────────
|
|
28
28
|
if (!params.sliceId || typeof params.sliceId !== "string" || params.sliceId.trim() === "") {
|
|
@@ -52,11 +52,21 @@ export async function handleReopenSlice(params, basePath) {
|
|
|
52
52
|
// Without this, the DB-filesystem reconciler sees SUMMARY.md files and
|
|
53
53
|
// auto-corrects tasks back to "complete", making reopen a no-op (#3161).
|
|
54
54
|
try {
|
|
55
|
+
const milestoneDir = resolveMilestonePath(basePath, params.milestoneId);
|
|
56
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
57
|
+
const isLegacy = !!milestoneDir && (milestoneDir.startsWith(legacyBase + "/") || milestoneDir.startsWith(legacyBase + "\\"));
|
|
55
58
|
const tasksDir = resolveTasksDir(basePath, params.milestoneId, params.sliceId);
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
59
|
+
const tasks = getSliceTasks(params.milestoneId, params.sliceId);
|
|
60
|
+
for (const task of tasks) {
|
|
61
|
+
const summaryPaths = isLegacy
|
|
62
|
+
? (tasksDir ? [join(tasksDir, buildTaskFileName(task.id, "SUMMARY"))] : [])
|
|
63
|
+
: milestoneDir
|
|
64
|
+
? [
|
|
65
|
+
join(milestoneDir, buildFlatTaskFileName(params.sliceId, task.id, "SUMMARY")),
|
|
66
|
+
join(milestoneDir, buildTaskFileName(task.id, "SUMMARY")),
|
|
67
|
+
]
|
|
68
|
+
: [];
|
|
69
|
+
for (const summaryPath of summaryPaths) {
|
|
60
70
|
if (existsSync(summaryPath))
|
|
61
71
|
unlinkSync(summaryPath);
|
|
62
72
|
}
|
|
@@ -17,8 +17,8 @@ import { appendEvent } from "../workflow-events.js";
|
|
|
17
17
|
import { logWarning } from "../workflow-logger.js";
|
|
18
18
|
import { writeReopenReason } from "../reopen-reason.js";
|
|
19
19
|
import { existsSync, unlinkSync } from "node:fs";
|
|
20
|
-
import { join
|
|
21
|
-
import { resolveTasksDir, resolveSlicePath, clearPathCache } from "../paths.js";
|
|
20
|
+
import { join } from "node:path";
|
|
21
|
+
import { buildFlatTaskFileName, buildTaskFileName, legacyMilestonesDir, resolveMilestonePath, resolveTasksDir, resolveSlicePath, clearPathCache, } from "../paths.js";
|
|
22
22
|
export async function handleReopenTask(params, basePath) {
|
|
23
23
|
// ── Validate required fields ────────────────────────────────────────────
|
|
24
24
|
if (!params.taskId || typeof params.taskId !== "string" || params.taskId.trim() === "") {
|
|
@@ -76,14 +76,20 @@ export async function handleReopenTask(params, basePath) {
|
|
|
76
76
|
// summary cleanup into tasks/ (#1208).
|
|
77
77
|
try {
|
|
78
78
|
const slicePath = resolveSlicePath(basePath, params.milestoneId, params.sliceId);
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
79
|
+
const milestonePath = resolveMilestonePath(basePath, params.milestoneId);
|
|
80
|
+
if (milestonePath) {
|
|
81
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
82
|
+
const isLegacy = milestonePath.startsWith(legacyBase + "/") || milestonePath.startsWith(legacyBase + "\\");
|
|
83
|
+
const summaryPaths = isLegacy
|
|
84
|
+
? [join(resolveTasksDir(basePath, params.milestoneId, params.sliceId) ?? slicePath ?? join(milestonePath, "slices", params.sliceId, "tasks"), buildTaskFileName(params.taskId, "SUMMARY"))]
|
|
85
|
+
: [
|
|
86
|
+
join(milestonePath, buildFlatTaskFileName(params.sliceId, params.taskId, "SUMMARY")),
|
|
87
|
+
join(milestonePath, buildTaskFileName(params.taskId, "SUMMARY")),
|
|
88
|
+
];
|
|
89
|
+
for (const summaryPath of summaryPaths) {
|
|
90
|
+
if (existsSync(summaryPath))
|
|
91
|
+
unlinkSync(summaryPath);
|
|
92
|
+
}
|
|
87
93
|
}
|
|
88
94
|
}
|
|
89
95
|
catch (cleanupErr) {
|
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
// owned by the unit, not in the composer. Reviews must enforce this — it
|
|
37
37
|
// is the difference between an orchestrator and a runaway DSL.
|
|
38
38
|
import { resolveManifest, } from "./unit-context-manifest.js";
|
|
39
|
+
import { resolveEffectivePlanningToolsPolicy } from "./planning-subagent-policy.js";
|
|
39
40
|
import { getUnitToolSurfaceContract } from "./unit-tool-contracts.js";
|
|
40
41
|
/**
|
|
41
42
|
* Produce the inlined-context portion of a unit's system prompt by
|
|
@@ -148,11 +149,32 @@ const TOOL_SURFACE_GUIDANCE_BY_UNIT = {
|
|
|
148
149
|
"validate-milestone": "Dispatch reviewer subagents in parallel, then persist the verdict via `gsd_validate_milestone`. Do not query `.gsd/gsd.db` directly — use `gsd_milestone_status` and inlined context.",
|
|
149
150
|
"complete-milestone": "Persist completion only through `gsd_complete_milestone` after verification passes. Do not query `.gsd/gsd.db` directly. Do not write `.gsd/PROJECT.md` or `.gsd/REQUIREMENTS.md` by hand — use `gsd_summary_save` and `gsd_requirement_update`.",
|
|
150
151
|
"replan-slice": "Persist replans through `gsd_replan_slice` only. Do not edit `PLAN.md` or task plans directly.",
|
|
151
|
-
"plan-slice": "Persist planning through `gsd_plan_slice` only. Dispatch subagents only to **scout** or **planner** for reconnaissance — not implementation agents. Do not edit user source files outside `.gsd/**`.",
|
|
152
|
-
"refine-slice": "Persist refinements through `gsd_plan_slice` only. Dispatch subagents only to **scout** or **planner**. Do not edit user source files outside `.gsd/**`.",
|
|
153
|
-
"plan-milestone": "Persist milestone planning through `gsd_plan_milestone` / `gsd_plan_slice`. Do not edit user source files outside `.gsd/**`.",
|
|
154
152
|
"research-slice": "Dispatch subagents only to **scout** or **planner** for reconnaissance. Do not edit user source files outside `.gsd/**`.",
|
|
155
153
|
};
|
|
154
|
+
function formatAllowedAgents(agents) {
|
|
155
|
+
return agents.map((agent) => `**${agent}**`).join(", ");
|
|
156
|
+
}
|
|
157
|
+
function guidanceForUnitToolsPolicy(unitType, policy) {
|
|
158
|
+
if (unitType === "plan-slice") {
|
|
159
|
+
const dispatch = policy.mode === "planning-dispatch"
|
|
160
|
+
? ` Dispatch subagents only to ${formatAllowedAgents(policy.allowedSubagents)} for reconnaissance — not implementation agents.`
|
|
161
|
+
: " Do not dispatch subagents.";
|
|
162
|
+
return `Persist planning through \`gsd_plan_slice\` only.${dispatch} Do not edit user source files outside \`.gsd/**\`.`;
|
|
163
|
+
}
|
|
164
|
+
if (unitType === "refine-slice") {
|
|
165
|
+
const dispatch = policy.mode === "planning-dispatch"
|
|
166
|
+
? ` Dispatch subagents only to ${formatAllowedAgents(policy.allowedSubagents)}.`
|
|
167
|
+
: " Do not dispatch subagents.";
|
|
168
|
+
return `Persist refinements through \`gsd_plan_slice\` only.${dispatch} Do not edit user source files outside \`.gsd/**\`.`;
|
|
169
|
+
}
|
|
170
|
+
if (unitType === "plan-milestone") {
|
|
171
|
+
const dispatch = policy.mode === "planning-dispatch"
|
|
172
|
+
? ` Dispatch subagents only to ${formatAllowedAgents(policy.allowedSubagents)}.`
|
|
173
|
+
: "";
|
|
174
|
+
return `Persist milestone planning through \`gsd_plan_milestone\` / \`gsd_plan_slice\`.${dispatch} Do not edit user source files outside \`.gsd/**\`.`;
|
|
175
|
+
}
|
|
176
|
+
return undefined;
|
|
177
|
+
}
|
|
156
178
|
function guidanceForToolsPolicy(policy) {
|
|
157
179
|
switch (policy.mode) {
|
|
158
180
|
case "planning":
|
|
@@ -191,8 +213,9 @@ export function composeToolSurfaceInstructions(unitType, opts) {
|
|
|
191
213
|
const manifest = resolveManifest(unitType);
|
|
192
214
|
if (!manifest)
|
|
193
215
|
return "";
|
|
194
|
-
const
|
|
195
|
-
const
|
|
216
|
+
const effectiveTools = resolveEffectivePlanningToolsPolicy(unitType, manifest.tools, opts.basePath) ?? manifest.tools;
|
|
217
|
+
const unitGuidance = guidanceForUnitToolsPolicy(unitType, effectiveTools) ?? TOOL_SURFACE_GUIDANCE_BY_UNIT[unitType];
|
|
218
|
+
const policyGuidance = unitGuidance ? null : guidanceForToolsPolicy(effectiveTools);
|
|
196
219
|
const forbiddenLine = formatForbiddenWorkflowToolsLine(unitType, unitGuidance);
|
|
197
220
|
const parts = [unitGuidance, policyGuidance, forbiddenLine].filter((part) => typeof part === "string" && part.length > 0);
|
|
198
221
|
if (parts.length === 0)
|
|
@@ -11,13 +11,14 @@
|
|
|
11
11
|
import { mkdirSync, writeFileSync } from "node:fs";
|
|
12
12
|
import { join } from "node:path";
|
|
13
13
|
/**
|
|
14
|
-
* Write a T##-VERIFY.json artifact to the
|
|
14
|
+
* Write a T##-VERIFY.json artifact to the evidence directory.
|
|
15
15
|
* Creates the directory with mkdirSync({ recursive: true }) if it doesn't exist.
|
|
16
|
+
* Flat-phase callers can pass sliceId to write S##-T##-VERIFY.json.
|
|
16
17
|
*
|
|
17
18
|
* stdout/stderr are excluded from the JSON — the full output lives in VerificationResult
|
|
18
19
|
* in memory and is logged to stderr during the gate run.
|
|
19
20
|
*/
|
|
20
|
-
export function writeVerificationJSON(result, tasksDir, taskId, unitId, retryAttempt, maxRetries) {
|
|
21
|
+
export function writeVerificationJSON(result, tasksDir, taskId, unitId, retryAttempt, maxRetries, sliceId) {
|
|
21
22
|
mkdirSync(tasksDir, { recursive: true });
|
|
22
23
|
const evidence = {
|
|
23
24
|
schemaVersion: 1,
|
|
@@ -52,7 +53,8 @@ export function writeVerificationJSON(result, tasksDir, taskId, unitId, retryAtt
|
|
|
52
53
|
fixAvailable: w.fixAvailable,
|
|
53
54
|
}));
|
|
54
55
|
}
|
|
55
|
-
const
|
|
56
|
+
const fileName = sliceId ? `${sliceId}-${taskId}-VERIFY.json` : `${taskId}-VERIFY.json`;
|
|
57
|
+
const filePath = join(tasksDir, fileName);
|
|
56
58
|
writeFileSync(filePath, JSON.stringify(evidence, null, 2) + "\n", "utf-8");
|
|
57
59
|
}
|
|
58
60
|
/**
|
|
@@ -13,7 +13,7 @@ import { isClosedStatus } from "./status-guards.js";
|
|
|
13
13
|
import { deriveState } from "./state.js";
|
|
14
14
|
import { renderPlanFromDb, renderRoadmapFromDb } from "./markdown-renderer.js";
|
|
15
15
|
import { readManifest } from "./workflow-manifest.js";
|
|
16
|
-
import { gsdRoot, resolveMilestoneFile, resolveSliceFile, resolveTaskFile,
|
|
16
|
+
import { gsdRoot, resolveMilestoneFile, resolveSliceFile, resolveTaskFile, targetTaskFile } from "./paths.js";
|
|
17
17
|
// ─── Helpers ─────────────────────────────────────────────────────────────
|
|
18
18
|
/**
|
|
19
19
|
* Strip a leading ID prefix (e.g. "M001: " or "S04: ") from a title
|
|
@@ -276,8 +276,7 @@ export function renderSummaryProjection(basePath, milestoneId, sliceId, taskId)
|
|
|
276
276
|
return;
|
|
277
277
|
const evidenceRows = getVerificationEvidence(milestoneId, sliceId, taskId);
|
|
278
278
|
const content = renderSummaryContent(taskRow, sliceId, milestoneId, evidenceRows);
|
|
279
|
-
const summaryPath =
|
|
280
|
-
?? join(basePath, relTaskFile(basePath, milestoneId, sliceId, taskId, "SUMMARY", getMilestone(milestoneId)?.title));
|
|
279
|
+
const summaryPath = targetTaskFile(basePath, milestoneId, sliceId, taskId, "SUMMARY", getMilestone(milestoneId)?.title);
|
|
281
280
|
mkdirSync(dirname(summaryPath), { recursive: true });
|
|
282
281
|
atomicWriteSync(summaryPath, content);
|
|
283
282
|
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { dirname, join, resolve } from "node:path";
|
|
3
3
|
import { resolveGsdPathContract, resolveMilestoneFile, resolveMilestonePath, targetMilestoneFile, normalizeRealPath, } from "./paths.js";
|
|
4
4
|
import { isGsdWorktreePath, resolveWorktreeProjectRoot } from "./worktree-root.js";
|
|
5
|
+
import { milestoneMetaPath } from "./git-service.js";
|
|
5
6
|
function tryRealpath(p) {
|
|
6
7
|
return normalizeRealPath(p);
|
|
7
8
|
}
|
|
@@ -63,7 +64,7 @@ export function scopeMilestone(workspace, milestoneId) {
|
|
|
63
64
|
stateFile: () => join(gsd, "STATE.md"),
|
|
64
65
|
dbPath: () => contract.projectDb,
|
|
65
66
|
milestoneDir: () => scopeMilestoneDir(basePath, milestoneId),
|
|
66
|
-
metaJson: () =>
|
|
67
|
+
metaJson: () => milestoneMetaPath(basePath, milestoneId),
|
|
67
68
|
});
|
|
68
69
|
return scope;
|
|
69
70
|
}
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
import { cpSync, existsSync, mkdirSync, readdirSync, readFileSync, realpathSync, statSync, unlinkSync, } from "node:fs";
|
|
22
22
|
import { join } from "node:path";
|
|
23
23
|
import { reconcileWorktreeDb } from "./gsd-db.js";
|
|
24
|
-
import { resolveGsdPathContract } from "./paths.js";
|
|
24
|
+
import { dirIsContentBearingLegacyMilestone, resolveGsdPathContract } from "./paths.js";
|
|
25
25
|
import { safeCopy, safeCopyRecursive } from "./safe-fs.js";
|
|
26
26
|
import { logError, logWarning } from "./workflow-logger.js";
|
|
27
27
|
// ─── Private helpers ──────────────────────────────────────────────────────
|
|
@@ -129,6 +129,8 @@ function syncOtherMilestoneArtifacts(srcMilestonesDir, dstMilestonesDir, current
|
|
|
129
129
|
if (milestoneEntry.name === currentMilestoneId)
|
|
130
130
|
continue;
|
|
131
131
|
const srcMilestoneDir = join(srcMilestonesDir, milestoneEntry.name);
|
|
132
|
+
if (!dirIsContentBearingLegacyMilestone(srcMilestoneDir))
|
|
133
|
+
continue;
|
|
132
134
|
const dstMilestoneDir = join(dstMilestonesDir, milestoneEntry.name);
|
|
133
135
|
// Additively project the entire milestone subtree (force:false), not just
|
|
134
136
|
// top-level files. Prior completed milestones keep their per-slice and
|
|
@@ -219,25 +221,25 @@ export function _projectRootToWorktreeImpl(projectRoot, worktreePath_, milestone
|
|
|
219
221
|
// Without this, worktree-local files (e.g. VALIDATION.md written
|
|
220
222
|
// by validate-milestone) get clobbered by stale project root copies,
|
|
221
223
|
// causing an infinite re-validation loop (#1886).
|
|
222
|
-
safeCopyRecursive(join(prGsd, "milestones", milestoneId), join(wtGsd, "milestones", milestoneId), { force: false });
|
|
223
|
-
// Additively project the full subtree of every OTHER milestone so
|
|
224
|
-
// worktree-bound units can read prior-milestone context artifacts and so
|
|
225
|
-
// completed milestones retain their per-slice/per-task SUMMARY.md and
|
|
226
|
-
// UAT.md on the worktree filesystem (otherwise the stale-render detector
|
|
227
|
-
// flags them as "complete in DB but missing on disk").
|
|
228
|
-
syncOtherMilestoneArtifacts(join(prGsd, "milestones"), join(wtGsd, "milestones"), milestoneId);
|
|
229
|
-
// Force-sync ASSESSMENT files that have a verdict from project root (#2821).
|
|
230
|
-
// The additive-only copy above preserves worktree-local files, but
|
|
231
|
-
// ASSESSMENT files are special: after run-uat writes a verdict and post-unit
|
|
232
|
-
// syncs it to the project root, the worktree may retain a stale copy (e.g.
|
|
233
|
-
// verdict:fail while the project root has verdict:pass from a retry). On
|
|
234
|
-
// session resume the DB is rebuilt from disk, and if the stale ASSESSMENT
|
|
235
|
-
// persists, checkNeedsRunUat finds no passing verdict → re-dispatches
|
|
236
|
-
// run-uat indefinitely (stuck-loop ×9).
|
|
237
224
|
const prMilestoneDir = join(prGsd, "milestones", milestoneId);
|
|
238
225
|
const wtMilestoneDir = join(wtGsd, "milestones", milestoneId);
|
|
239
|
-
|
|
240
|
-
|
|
226
|
+
if (dirIsContentBearingLegacyMilestone(prMilestoneDir)) {
|
|
227
|
+
safeCopyRecursive(prMilestoneDir, wtMilestoneDir, { force: false });
|
|
228
|
+
// Force-sync ASSESSMENT files that have a verdict from project root (#2821).
|
|
229
|
+
// The additive-only copy above preserves worktree-local files, but
|
|
230
|
+
// ASSESSMENT files are special: after run-uat writes a verdict and post-unit
|
|
231
|
+
// syncs it to the project root, the worktree may retain a stale copy (e.g.
|
|
232
|
+
// verdict:fail while the project root has verdict:pass from a retry). On
|
|
233
|
+
// session resume the DB is rebuilt from disk, and if the stale ASSESSMENT
|
|
234
|
+
// persists, checkNeedsRunUat finds no passing verdict → re-dispatches
|
|
235
|
+
// run-uat indefinitely (stuck-loop ×9).
|
|
236
|
+
forceOverwriteValidationWithVerdict(prMilestoneDir, wtMilestoneDir, milestoneId);
|
|
237
|
+
forceOverwriteAssessmentsWithVerdict(prMilestoneDir, wtMilestoneDir);
|
|
238
|
+
}
|
|
239
|
+
// Additively project the full subtree of every OTHER content-bearing legacy
|
|
240
|
+
// milestone so worktree-bound units can read prior-milestone context artifacts
|
|
241
|
+
// without recreating empty/meta-only milestones/ scaffolds in flat-phase projects.
|
|
242
|
+
syncOtherMilestoneArtifacts(join(prGsd, "milestones"), join(wtGsd, "milestones"), milestoneId);
|
|
241
243
|
// Forward-sync completed-units.json from project root to worktree.
|
|
242
244
|
// Project root is authoritative for completion state after crash recovery;
|
|
243
245
|
// without this, the worktree re-dispatches already-completed units (#1886).
|
|
@@ -160,7 +160,7 @@ export function streamOllamaChat(model, context, options) {
|
|
|
160
160
|
* - `"low" | "medium" | "high"` are passed through as strings; gpt-oss honors
|
|
161
161
|
* them as strength levels, other thinking models treat any present value
|
|
162
162
|
* as "thinking enabled".
|
|
163
|
-
* - `"xhigh"`
|
|
163
|
+
* - `"xhigh"` and `"max"` are collapsed to `"high"` (ollama caps strength at high).
|
|
164
164
|
*/
|
|
165
165
|
export function buildThinkParam(model, options) {
|
|
166
166
|
if (!model.reasoning)
|
|
@@ -170,7 +170,7 @@ export function buildThinkParam(model, options) {
|
|
|
170
170
|
return undefined;
|
|
171
171
|
if (level === "minimal")
|
|
172
172
|
return false;
|
|
173
|
-
if (level === "xhigh")
|
|
173
|
+
if (level === "xhigh" || level === "max")
|
|
174
174
|
return "high";
|
|
175
175
|
return level;
|
|
176
176
|
}
|
|
@@ -144,6 +144,10 @@ export async function showInterviewRound(questions, opts, ctx) {
|
|
|
144
144
|
let previewViewport = 0;
|
|
145
145
|
let previewTotal = 0;
|
|
146
146
|
function resetPreviewScroll() { previewScroll = 0; }
|
|
147
|
+
let optionsScroll = 0;
|
|
148
|
+
let optionsViewport = 0;
|
|
149
|
+
let optionsTotal = 0;
|
|
150
|
+
function resetOptionsScroll() { optionsScroll = 0; }
|
|
147
151
|
function finish(result) {
|
|
148
152
|
if (completed)
|
|
149
153
|
return;
|
|
@@ -203,6 +207,7 @@ export async function showInterviewRound(questions, opts, ctx) {
|
|
|
203
207
|
saveEditorToState();
|
|
204
208
|
currentIdx = newIdx;
|
|
205
209
|
resetPreviewScroll();
|
|
210
|
+
resetOptionsScroll();
|
|
206
211
|
loadStateToEditor();
|
|
207
212
|
focusNotes = states[currentIdx].notesVisible && states[currentIdx].notes.length > 0;
|
|
208
213
|
refresh();
|
|
@@ -376,32 +381,49 @@ export async function showInterviewRound(questions, opts, ctx) {
|
|
|
376
381
|
return;
|
|
377
382
|
}
|
|
378
383
|
}
|
|
379
|
-
// ──
|
|
384
|
+
// ── Side-by-side panel scrolling ─────────────────────────────
|
|
380
385
|
if (matchesKey(data, Key.pageUp)) {
|
|
386
|
+
let didScroll = false;
|
|
387
|
+
if (optionsScroll > 0) {
|
|
388
|
+
optionsScroll = Math.max(0, optionsScroll - optionsViewport);
|
|
389
|
+
didScroll = true;
|
|
390
|
+
}
|
|
381
391
|
if (previewScroll > 0) {
|
|
382
392
|
previewScroll = Math.max(0, previewScroll - previewViewport);
|
|
383
|
-
|
|
393
|
+
didScroll = true;
|
|
384
394
|
}
|
|
395
|
+
if (didScroll)
|
|
396
|
+
refresh();
|
|
385
397
|
return;
|
|
386
398
|
}
|
|
387
399
|
if (matchesKey(data, Key.pageDown)) {
|
|
400
|
+
let didScroll = false;
|
|
401
|
+
const maxOptionsScroll = Math.max(0, optionsTotal - optionsViewport);
|
|
402
|
+
if (optionsScroll < maxOptionsScroll) {
|
|
403
|
+
optionsScroll = Math.min(maxOptionsScroll, optionsScroll + optionsViewport);
|
|
404
|
+
didScroll = true;
|
|
405
|
+
}
|
|
388
406
|
const maxScroll = Math.max(0, previewTotal - previewViewport);
|
|
389
407
|
if (previewScroll < maxScroll) {
|
|
390
408
|
previewScroll = Math.min(maxScroll, previewScroll + previewViewport);
|
|
391
|
-
|
|
409
|
+
didScroll = true;
|
|
392
410
|
}
|
|
411
|
+
if (didScroll)
|
|
412
|
+
refresh();
|
|
393
413
|
return;
|
|
394
414
|
}
|
|
395
415
|
// ── Cursor navigation ────────────────────────────────────────
|
|
396
416
|
if (matchesKey(data, Key.up)) {
|
|
397
417
|
st.cursorIndex = (st.cursorIndex - 1 + optCount) % optCount;
|
|
398
418
|
resetPreviewScroll();
|
|
419
|
+
resetOptionsScroll();
|
|
399
420
|
refresh();
|
|
400
421
|
return;
|
|
401
422
|
}
|
|
402
423
|
if (matchesKey(data, Key.down)) {
|
|
403
424
|
st.cursorIndex = (st.cursorIndex + 1) % optCount;
|
|
404
425
|
resetPreviewScroll();
|
|
426
|
+
resetOptionsScroll();
|
|
405
427
|
refresh();
|
|
406
428
|
return;
|
|
407
429
|
}
|
|
@@ -637,6 +659,8 @@ export async function showInterviewRound(questions, opts, ctx) {
|
|
|
637
659
|
// No scrollable preview unless the side-by-side path sets these below.
|
|
638
660
|
previewTotal = 0;
|
|
639
661
|
previewViewport = 0;
|
|
662
|
+
optionsTotal = 0;
|
|
663
|
+
optionsViewport = 0;
|
|
640
664
|
if (useSideBySide) {
|
|
641
665
|
// ── Preview path ──────────────────────────────────────
|
|
642
666
|
const ui = makeUI(theme, contentWidth);
|
|
@@ -672,10 +696,21 @@ export async function showInterviewRound(questions, opts, ctx) {
|
|
|
672
696
|
const previewWidth = Math.max(MIN_PREVIEW_WIDTH, Math.min(contentWidth - MIN_OPTIONS_WIDTH - DIVIDER_WIDTH, Math.floor(contentWidth * PREVIEW_RATIO)));
|
|
673
697
|
const leftWidth = Math.max(MIN_OPTIONS_WIDTH, contentWidth - previewWidth - DIVIDER_WIDTH);
|
|
674
698
|
const fullLeft = renderOptionsColumn(leftWidth);
|
|
675
|
-
|
|
699
|
+
optionsTotal = fullLeft.length;
|
|
700
|
+
optionsViewport = maxBody;
|
|
701
|
+
const maxOptionsScroll = Math.max(0, fullLeft.length - maxBody);
|
|
702
|
+
if (optionsScroll > maxOptionsScroll)
|
|
703
|
+
optionsScroll = maxOptionsScroll;
|
|
704
|
+
const leftLines = fullLeft.slice(optionsScroll, optionsScroll + maxBody);
|
|
676
705
|
if (fullLeft.length > maxBody) {
|
|
677
|
-
const
|
|
678
|
-
|
|
706
|
+
const hiddenAbove = optionsScroll;
|
|
707
|
+
const hiddenBelow = fullLeft.length - (optionsScroll + maxBody);
|
|
708
|
+
if (hiddenAbove > 0) {
|
|
709
|
+
leftLines[0] = scrollIndicator(`▲ ${hiddenAbove} more`, leftWidth);
|
|
710
|
+
}
|
|
711
|
+
if (hiddenBelow > 0) {
|
|
712
|
+
leftLines[leftLines.length - 1] = scrollIndicator(`▼ ${hiddenBelow} more · PgUp/PgDn`, leftWidth);
|
|
713
|
+
}
|
|
679
714
|
}
|
|
680
715
|
const preview = getCurrentPreview();
|
|
681
716
|
const fullRight = preview ? renderPreviewColumn(preview, previewWidth) : [];
|
|
@@ -734,6 +769,8 @@ export async function showInterviewRound(questions, opts, ctx) {
|
|
|
734
769
|
}
|
|
735
770
|
if (previewTotal > previewViewport)
|
|
736
771
|
hints.push("pgup/pgdn scroll preview");
|
|
772
|
+
if (optionsTotal > optionsViewport)
|
|
773
|
+
hints.push("pgup/pgdn scroll options");
|
|
737
774
|
hints.push("esc to exit");
|
|
738
775
|
const footer = ui.hints(hints)[0] ?? "";
|
|
739
776
|
cachedLines = renderSharedDialogFrame(theme, title, lines, width, { footer });
|
|
@@ -591,7 +591,7 @@ thinkingOverride) {
|
|
|
591
591
|
}
|
|
592
592
|
}
|
|
593
593
|
}
|
|
594
|
-
const ThinkingLevelSchema = StringEnum(["off", "minimal", "low", "medium", "high", "xhigh"], {
|
|
594
|
+
const ThinkingLevelSchema = StringEnum(["off", "minimal", "low", "medium", "high", "xhigh", "max"], {
|
|
595
595
|
description: "Reasoning effort override for the subagent (forwarded as --thinking). " +
|
|
596
596
|
"Independent of model choice; unsupported levels are clamped to the model at dispatch.",
|
|
597
597
|
});
|
|
@@ -15,7 +15,7 @@ interface MinimalModel {
|
|
|
15
15
|
interface MinimalModelRegistry {
|
|
16
16
|
getAvailable(): MinimalModel[];
|
|
17
17
|
}
|
|
18
|
-
type ThinkingLevel = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';
|
|
18
|
+
type ThinkingLevel = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';
|
|
19
19
|
interface MinimalSettingsManager {
|
|
20
20
|
getDefaultProvider(): string | undefined;
|
|
21
21
|
getDefaultModel(): string | undefined;
|