@opengsd/gsd-pi 1.5.0 → 1.6.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 +10 -10
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/ask-user-questions.js +1 -1
- package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +114 -36
- package/dist/resources/extensions/gsd/activity-log.js +1 -1
- package/dist/resources/extensions/gsd/auto/closeout.js +97 -5
- package/dist/resources/extensions/gsd/auto/orchestrator.js +20 -13
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +6 -3
- package/dist/resources/extensions/gsd/auto/unit-phase.js +5 -9
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +14 -5
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -7
- package/dist/resources/extensions/gsd/auto-dispatch.js +69 -17
- package/dist/resources/extensions/gsd/auto-model-selection.js +28 -1
- package/dist/resources/extensions/gsd/auto-post-unit.js +4 -3
- package/dist/resources/extensions/gsd/auto-prompts.js +29 -117
- package/dist/resources/extensions/gsd/auto-recovery.js +50 -6
- package/dist/resources/extensions/gsd/auto-start.js +57 -33
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +12 -2
- package/dist/resources/extensions/gsd/auto-timers.js +9 -2
- package/dist/resources/extensions/gsd/auto-worktree-branch-lifecycle.js +189 -0
- package/dist/resources/extensions/gsd/auto-worktree-cleanup.js +133 -0
- package/dist/resources/extensions/gsd/auto-worktree-conflict-auto-resolve.js +35 -0
- package/dist/resources/extensions/gsd/auto-worktree-creation.js +130 -0
- package/dist/resources/extensions/gsd/auto-worktree-entry.js +118 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-already-merged.js +98 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-branch-head.js +52 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-cleanup.js +87 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-code-changes.js +46 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-db-ready.js +68 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-integration-branch.js +51 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-message.js +106 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-pre-teardown.js +64 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-stash.js +168 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge.js +302 -0
- package/dist/resources/extensions/gsd/auto-worktree-milestone-shelter.js +119 -0
- package/dist/resources/extensions/gsd/auto-worktree-path-resolution.js +5 -0
- package/dist/resources/extensions/gsd/auto-worktree-path-utils.js +5 -0
- package/dist/resources/extensions/gsd/auto-worktree-resource-version.js +41 -0
- package/dist/resources/extensions/gsd/auto-worktree-runtime-cleanup.js +99 -0
- package/dist/resources/extensions/gsd/auto-worktree-session-registry.js +57 -0
- package/dist/resources/extensions/gsd/auto-worktree-sync.js +249 -0
- package/dist/resources/extensions/gsd/auto-worktree-teardown.js +120 -0
- package/dist/resources/extensions/gsd/auto-worktree.js +20 -2073
- package/dist/resources/extensions/gsd/auto.js +106 -34
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +20 -2
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +185 -27
- package/dist/resources/extensions/gsd/codebase-generator.js +7 -1
- package/dist/resources/extensions/gsd/commands-handlers.js +1 -1
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +3 -3
- package/dist/resources/extensions/gsd/compat/compat-marker.js +44 -0
- package/dist/resources/extensions/gsd/config-overlay.js +7 -2
- package/dist/resources/extensions/gsd/db/engine.js +33 -0
- package/dist/resources/extensions/gsd/db/queries.js +9 -9
- package/dist/resources/extensions/gsd/db/writers/cascades.js +20 -2
- package/dist/resources/extensions/gsd/db-adapter.js +30 -3
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +3 -3
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +93 -11
- package/dist/resources/extensions/gsd/flat-phase-migration.js +32 -3
- package/dist/resources/extensions/gsd/forensics.js +1 -1
- package/dist/resources/extensions/gsd/git-conflict-resolve.js +2 -2
- package/dist/resources/extensions/gsd/git-service.js +45 -0
- package/dist/resources/extensions/gsd/gsd-db.js +23 -11
- package/dist/resources/extensions/gsd/guided-flow.js +22 -17
- package/dist/resources/extensions/gsd/journal.js +1 -1
- package/dist/resources/extensions/gsd/markdown-renderer.js +34 -79
- package/dist/resources/extensions/gsd/md-importer.js +89 -23
- package/dist/resources/extensions/gsd/metrics.js +2 -2
- package/dist/resources/extensions/gsd/migration-auto-check.js +30 -3
- package/dist/resources/extensions/gsd/milestone-merge-transaction.js +11 -0
- package/dist/resources/extensions/gsd/milestone-settlement.js +1 -1
- package/dist/resources/extensions/gsd/parallel-merge.js +1 -1
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -1
- package/dist/resources/extensions/gsd/paths.js +87 -52
- package/dist/resources/extensions/gsd/post-unit-hooks.js +27 -0
- package/dist/resources/extensions/gsd/preferences-models.js +66 -15
- package/dist/resources/extensions/gsd/preferences-skills.js +10 -16
- package/dist/resources/extensions/gsd/preferences-types.js +1 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +148 -10
- package/dist/resources/extensions/gsd/preferences.js +20 -0
- package/dist/resources/extensions/gsd/prompts/system.md +6 -6
- package/dist/resources/extensions/gsd/quick.js +12 -3
- package/dist/resources/extensions/gsd/rule-registry.js +106 -10
- package/dist/resources/extensions/gsd/skill-discovery.js +36 -23
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +2 -1
- package/dist/resources/extensions/gsd/state/derive/from-db.js +88 -153
- package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +1 -10
- package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +3 -24
- package/dist/resources/extensions/gsd/state-reconciliation/index.js +10 -0
- package/dist/resources/extensions/gsd/tool-contract.js +14 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -5
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +16 -10
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +5 -0
- package/dist/resources/extensions/gsd/tools/reopen-task.js +13 -5
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +3 -8
- package/dist/resources/extensions/gsd/uat-dispatch.js +94 -0
- package/dist/resources/extensions/gsd/unit-registry.js +12 -2
- package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +1 -1
- package/dist/resources/extensions/gsd/uok/audit-toggle.js +31 -2
- package/dist/resources/extensions/gsd/uok/audit.js +3 -0
- package/dist/resources/extensions/gsd/uok/gate-runner.js +22 -30
- package/dist/resources/extensions/gsd/uok/gitops.js +18 -15
- package/dist/resources/extensions/gsd/uok/kernel.js +120 -46
- package/dist/resources/extensions/gsd/uok/model-policy.js +17 -14
- package/dist/resources/extensions/gsd/validation-block-guard.js +2 -1
- package/dist/resources/extensions/gsd/workflow-event-ledger.js +1 -1
- package/dist/resources/extensions/gsd/workflow-logger.js +1 -1
- package/dist/resources/extensions/gsd/workflow-projections.js +9 -26
- package/dist/resources/extensions/gsd/workspace-git-preflight.js +2 -2
- package/dist/resources/extensions/gsd/workspace.js +5 -14
- package/dist/resources/extensions/gsd/worktree-command.js +1 -1
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +14 -9
- package/dist/resources/extensions/gsd/worktree-reentry.js +2 -1
- package/dist/resources/extensions/shared/gsd-browser-cli.js +29 -0
- package/dist/resources/extensions/shared/interview-ui.js +62 -9
- 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 +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
- package/dist/web/standalone/.next/server/chunks/{1128.js → 1991.js} +1 -1
- package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/worktree-cli-create.d.ts +10 -0
- package/dist/worktree-cli-create.js +11 -0
- package/dist/worktree-cli-format.d.ts +12 -0
- package/dist/worktree-cli-format.js +38 -0
- package/dist/worktree-cli-plan.d.ts +16 -0
- package/dist/worktree-cli-plan.js +19 -0
- package/dist/worktree-cli-session.d.ts +13 -0
- package/dist/worktree-cli-session.js +18 -0
- package/dist/worktree-cli-status.d.ts +35 -0
- package/dist/worktree-cli-status.js +54 -0
- package/dist/worktree-cli.d.ts +1 -16
- package/dist/worktree-cli.js +28 -122
- package/integrations/hermes/open_gsd_hermes/gsd_client.py +25 -36
- package/integrations/hermes/pyproject.toml +1 -1
- package/integrations/hermes/tests/test_gsd_client_timeout.py +4 -4
- package/package.json +6 -6
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/dist/orchestrator-agent.d.ts +21 -0
- package/packages/daemon/dist/orchestrator-agent.d.ts.map +1 -0
- package/packages/daemon/dist/orchestrator-agent.js +113 -0
- package/packages/daemon/dist/orchestrator-agent.js.map +1 -0
- package/packages/daemon/dist/orchestrator-tools.d.ts +12 -0
- package/packages/daemon/dist/orchestrator-tools.d.ts.map +1 -0
- package/packages/daemon/dist/orchestrator-tools.js +137 -0
- package/packages/daemon/dist/orchestrator-tools.js.map +1 -0
- package/packages/daemon/dist/orchestrator.d.ts +4 -56
- package/packages/daemon/dist/orchestrator.d.ts.map +1 -1
- package/packages/daemon/dist/orchestrator.js +13 -303
- package/packages/daemon/dist/orchestrator.js.map +1 -1
- package/packages/daemon/dist/orchestrator.test.js +11 -1
- package/packages/daemon/dist/orchestrator.test.js.map +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/export-html/template.js +53 -4
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +3 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/package.json +4 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +14 -9
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/index.d.ts +1 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +1 -0
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/transform-messages.js +7 -3
- package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
- package/packages/pi-ai/dist/tool-result-content.d.ts +3 -0
- package/packages/pi-ai/dist/tool-result-content.d.ts.map +1 -0
- package/packages/pi-ai/dist/tool-result-content.js +62 -0
- package/packages/pi-ai/dist/tool-result-content.js.map +1 -0
- package/packages/pi-ai/dist/types.d.ts +8 -20
- 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/package-manager.d.ts +9 -0
- package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-manager.js +74 -53
- package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +6 -0
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js +30 -2
- package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skill-directories.d.ts +66 -0
- package/packages/pi-coding-agent/dist/core/skill-directories.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/skill-directories.js +138 -0
- package/packages/pi-coding-agent/dist/core/skill-directories.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/skills.d.ts +4 -1
- package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.js +4 -1
- package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -0
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -0
- package/packages/pi-coding-agent/dist/index.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/core/export-html/template.js +53 -4
- package/pkg/package.json +1 -1
- package/src/resources/extensions/ask-user-questions.ts +1 -1
- package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +146 -33
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +25 -0
- package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +93 -0
- package/src/resources/extensions/gsd/activity-log.ts +1 -1
- package/src/resources/extensions/gsd/auto/closeout.ts +114 -7
- package/src/resources/extensions/gsd/auto/orchestrator.ts +21 -14
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +6 -3
- package/src/resources/extensions/gsd/auto/unit-phase.ts +5 -9
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +14 -4
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +13 -7
- package/src/resources/extensions/gsd/auto-dispatch.ts +77 -16
- package/src/resources/extensions/gsd/auto-model-selection.ts +33 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +4 -2
- package/src/resources/extensions/gsd/auto-prompts.ts +53 -113
- package/src/resources/extensions/gsd/auto-recovery.ts +50 -6
- package/src/resources/extensions/gsd/auto-start.ts +62 -31
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +12 -2
- package/src/resources/extensions/gsd/auto-timers.ts +9 -2
- package/src/resources/extensions/gsd/auto-worktree-branch-lifecycle.ts +237 -0
- package/src/resources/extensions/gsd/auto-worktree-cleanup.ts +166 -0
- package/src/resources/extensions/gsd/auto-worktree-conflict-auto-resolve.ts +37 -0
- package/src/resources/extensions/gsd/auto-worktree-creation.ts +171 -0
- package/src/resources/extensions/gsd/auto-worktree-entry.ts +154 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-already-merged.ts +161 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-branch-head.ts +83 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-cleanup.ts +132 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-code-changes.ts +71 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-db-ready.ts +112 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-integration-branch.ts +99 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-message.ts +166 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-pre-teardown.ts +93 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-stash.ts +213 -0
- package/src/resources/extensions/gsd/auto-worktree-merge.ts +391 -0
- package/src/resources/extensions/gsd/auto-worktree-milestone-shelter.ts +159 -0
- package/src/resources/extensions/gsd/auto-worktree-path-resolution.ts +6 -0
- package/src/resources/extensions/gsd/auto-worktree-path-utils.ts +10 -0
- package/src/resources/extensions/gsd/auto-worktree-resource-version.ts +44 -0
- package/src/resources/extensions/gsd/auto-worktree-runtime-cleanup.ts +119 -0
- package/src/resources/extensions/gsd/auto-worktree-session-registry.ts +71 -0
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +370 -0
- package/src/resources/extensions/gsd/auto-worktree-teardown.ts +161 -0
- package/src/resources/extensions/gsd/auto-worktree.ts +69 -2429
- package/src/resources/extensions/gsd/auto.ts +114 -47
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +20 -2
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +218 -27
- package/src/resources/extensions/gsd/codebase-generator.ts +7 -1
- package/src/resources/extensions/gsd/commands-handlers.ts +1 -1
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +3 -3
- package/src/resources/extensions/gsd/compat/compat-marker.ts +47 -0
- package/src/resources/extensions/gsd/config-overlay.ts +7 -1
- package/src/resources/extensions/gsd/db/engine.ts +36 -0
- package/src/resources/extensions/gsd/db/queries.ts +9 -9
- package/src/resources/extensions/gsd/db/writers/cascades.ts +23 -1
- package/src/resources/extensions/gsd/db-adapter.ts +29 -3
- package/src/resources/extensions/gsd/docs/preferences-reference.md +3 -3
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +109 -10
- package/src/resources/extensions/gsd/flat-phase-migration.ts +34 -3
- package/src/resources/extensions/gsd/forensics.ts +1 -1
- package/src/resources/extensions/gsd/git-conflict-resolve.ts +2 -2
- package/src/resources/extensions/gsd/git-service.ts +53 -0
- package/src/resources/extensions/gsd/gsd-db.ts +33 -11
- package/src/resources/extensions/gsd/guided-flow.ts +26 -18
- package/src/resources/extensions/gsd/journal.ts +1 -1
- package/src/resources/extensions/gsd/markdown-renderer.ts +52 -91
- package/src/resources/extensions/gsd/md-importer.ts +93 -22
- package/src/resources/extensions/gsd/metrics.ts +2 -2
- package/src/resources/extensions/gsd/migration-auto-check.ts +32 -3
- package/src/resources/extensions/gsd/milestone-merge-transaction.ts +15 -0
- package/src/resources/extensions/gsd/milestone-settlement.ts +1 -1
- package/src/resources/extensions/gsd/parallel-merge.ts +1 -1
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -1
- package/src/resources/extensions/gsd/paths.ts +108 -51
- package/src/resources/extensions/gsd/post-unit-hooks.ts +32 -0
- package/src/resources/extensions/gsd/preferences-models.ts +74 -20
- package/src/resources/extensions/gsd/preferences-skills.ts +10 -16
- package/src/resources/extensions/gsd/preferences-types.ts +54 -1
- package/src/resources/extensions/gsd/preferences-validation.ts +146 -9
- package/src/resources/extensions/gsd/preferences.ts +20 -0
- package/src/resources/extensions/gsd/prompts/system.md +6 -6
- package/src/resources/extensions/gsd/quick.ts +11 -3
- package/src/resources/extensions/gsd/rule-registry.ts +111 -9
- package/src/resources/extensions/gsd/skill-discovery.ts +47 -23
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +3 -1
- package/src/resources/extensions/gsd/state/derive/from-db.ts +201 -157
- package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +1 -9
- package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +2 -22
- package/src/resources/extensions/gsd/state-reconciliation/index.ts +14 -0
- package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +169 -1
- package/src/resources/extensions/gsd/tests/auto-loop-no-copy-artifacts.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +41 -2
- package/src/resources/extensions/gsd/tests/auto-post-unit-artifact-diagnostic.test.ts +48 -1
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +57 -0
- package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-start-project-milestone-reconcile.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/auto-timeout-recovery-supervisor-inflight-guard.test.ts +159 -0
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-already-merged.test.ts +177 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-branch-head.test.ts +118 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-cleanup.test.ts +115 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-code-changes.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-db-ready.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-integration-branch.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-message.test.ts +114 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-pre-teardown.test.ts +84 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-stash.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-shelter.test.ts +52 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/auto-worktree-resource-version.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-untracked-content.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/compat-marker.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-adapter.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/db-writable-probe.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +174 -0
- package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +71 -1
- package/src/resources/extensions/gsd/tests/flat-phase-renderer.test.ts +46 -1
- package/src/resources/extensions/gsd/tests/flat-phase-validation-path.test.ts +72 -32
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/import-completion-lost-update.test.ts +196 -0
- package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +4 -6
- package/src/resources/extensions/gsd/tests/integration/auto-stash-merge.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +7 -8
- package/src/resources/extensions/gsd/tests/integration/feature-branch-lifecycle-integration.test.ts +2 -5
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/integration/merge-cwd-restore.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/integration/merge-preserve-worktree-on-preteardown-error.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/integration/merge-strategy-regular.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +5 -7
- package/src/resources/extensions/gsd/tests/integration/paths.test.ts +88 -1
- package/src/resources/extensions/gsd/tests/integration/workspace-collapse-integration.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +16 -15
- package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +439 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/parallel-worker-lock-contention.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +0 -1
- package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +269 -0
- package/src/resources/extensions/gsd/tests/post-unit-retry-on-orchestrator-bridge.test.ts +8 -1
- package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +1 -4
- package/src/resources/extensions/gsd/tests/preferences.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/read-uat-gate-verdict.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +49 -1
- package/src/resources/extensions/gsd/tests/reopen-slice.test.ts +52 -0
- package/src/resources/extensions/gsd/tests/rule-registry.test.ts +95 -1
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/sibling-model-fallbacks.test.ts +189 -0
- package/src/resources/extensions/gsd/tests/single-field-model-thinking.test.ts +156 -0
- package/src/resources/extensions/gsd/tests/skill-discovery.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +3 -5
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/stash-pop-gsd-conflict.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/steer-worktree-path.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/supervisor-model-swap-inflight-guard.test.ts +181 -0
- package/src/resources/extensions/gsd/tests/supervisor-model-swap-thinking-clamp.test.ts +122 -0
- package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/system-flat-phase-layout.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/teardown-cleanup-parity.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/teardown-failure-clears-registry.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +196 -0
- package/src/resources/extensions/gsd/tests/uat-dispatch.test.ts +211 -0
- package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +26 -1
- package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +226 -2
- package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +213 -2
- package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +1 -3
- package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +5 -2
- package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-sync-tasks.test.ts +1 -1
- package/src/resources/extensions/gsd/tool-contract.ts +29 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +9 -5
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +19 -8
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +5 -0
- package/src/resources/extensions/gsd/tools/reopen-task.ts +13 -5
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +13 -9
- package/src/resources/extensions/gsd/types.ts +23 -4
- package/src/resources/extensions/gsd/uat-dispatch.ts +176 -0
- package/src/resources/extensions/gsd/unit-registry.ts +16 -2
- package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +1 -1
- package/src/resources/extensions/gsd/uok/audit-toggle.ts +32 -2
- package/src/resources/extensions/gsd/uok/audit.ts +2 -0
- package/src/resources/extensions/gsd/uok/gate-runner.ts +26 -36
- package/src/resources/extensions/gsd/uok/gitops.ts +21 -18
- package/src/resources/extensions/gsd/uok/kernel.ts +169 -48
- package/src/resources/extensions/gsd/uok/model-policy.ts +20 -17
- package/src/resources/extensions/gsd/validation-block-guard.ts +2 -1
- package/src/resources/extensions/gsd/workflow-event-ledger.ts +1 -1
- package/src/resources/extensions/gsd/workflow-logger.ts +1 -1
- package/src/resources/extensions/gsd/workflow-projections.ts +9 -24
- package/src/resources/extensions/gsd/workspace-git-preflight.ts +2 -2
- package/src/resources/extensions/gsd/workspace.ts +5 -21
- package/src/resources/extensions/gsd/worktree-command.ts +1 -1
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +19 -15
- package/src/resources/extensions/gsd/worktree-reentry.ts +2 -1
- package/src/resources/extensions/shared/gsd-browser-cli.ts +29 -0
- package/src/resources/extensions/shared/interview-ui.ts +58 -11
- package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +32 -0
- /package/dist/web/standalone/.next/static/{bCg3aYrFN1DKZr2dqgE7L → 6xYMOzxVhsQgryneJ5KRc}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{bCg3aYrFN1DKZr2dqgE7L → 6xYMOzxVhsQgryneJ5KRc}/_ssgManifest.js +0 -0
|
@@ -4,6 +4,7 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import json
|
|
6
6
|
import os
|
|
7
|
+
import shutil
|
|
7
8
|
import subprocess
|
|
8
9
|
import threading
|
|
9
10
|
import time
|
|
@@ -62,7 +63,12 @@ class GsdMcpClient:
|
|
|
62
63
|
|
|
63
64
|
def _env(self) -> dict[str, str]:
|
|
64
65
|
env = os.environ.copy()
|
|
65
|
-
|
|
66
|
+
# Resolve cli_path to an absolute path so the MCP server's
|
|
67
|
+
# resolveCLIPath() does not resolve a bare command name (e.g. "gsd")
|
|
68
|
+
# against the project directory, producing a non-existent
|
|
69
|
+
# project-relative path that hangs gsd_execute until timeout.
|
|
70
|
+
resolved = shutil.which(self._config.cli_path) or self._config.cli_path
|
|
71
|
+
env["GSD_CLI_PATH"] = resolved
|
|
66
72
|
return env
|
|
67
73
|
|
|
68
74
|
def ensure_version(self) -> None:
|
|
@@ -134,9 +140,11 @@ class GsdMcpClient:
|
|
|
134
140
|
def _send(self, payload: dict[str, Any], *, project_dir: str | None = None) -> None:
|
|
135
141
|
proc = self._ensure_process(project_dir)
|
|
136
142
|
assert proc.stdin is not None
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
143
|
+
# gsd-mcp-server uses the @modelcontextprotocol/sdk stdio transport,
|
|
144
|
+
# which is newline-delimited JSON (NDJSON), not the Content-Length
|
|
145
|
+
# framing from the LSP-style MCP spec. Emit one JSON object per line.
|
|
146
|
+
data = json.dumps(payload, ensure_ascii=False).encode("utf-8") + b"\n"
|
|
147
|
+
proc.stdin.write(data)
|
|
140
148
|
proc.stdin.flush()
|
|
141
149
|
|
|
142
150
|
def _read_stdout_chunk(self, deadline: float) -> None:
|
|
@@ -179,42 +187,23 @@ class GsdMcpClient:
|
|
|
179
187
|
f"{self._config.mcp_read_timeout_seconds:g}s"
|
|
180
188
|
)
|
|
181
189
|
|
|
182
|
-
def
|
|
190
|
+
def _read_line(self, deadline: float) -> bytes:
|
|
183
191
|
while True:
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
if idx >= 0
|
|
190
|
-
]
|
|
191
|
-
if candidates:
|
|
192
|
-
idx, sep_len = min(candidates)
|
|
193
|
-
header = self._stdout_buffer[:idx]
|
|
194
|
-
self._stdout_buffer = self._stdout_buffer[idx + sep_len :]
|
|
195
|
-
return header
|
|
192
|
+
idx = self._stdout_buffer.find(b"\n")
|
|
193
|
+
if idx >= 0:
|
|
194
|
+
raw = self._stdout_buffer[:idx]
|
|
195
|
+
self._stdout_buffer = self._stdout_buffer[idx + 1 :]
|
|
196
|
+
return raw.rstrip(b"\r")
|
|
196
197
|
self._read_stdout_chunk(deadline)
|
|
197
198
|
|
|
198
|
-
def _read_exact(self, length: int, deadline: float) -> bytes:
|
|
199
|
-
while len(self._stdout_buffer) < length:
|
|
200
|
-
self._read_stdout_chunk(deadline)
|
|
201
|
-
body = self._stdout_buffer[:length]
|
|
202
|
-
self._stdout_buffer = self._stdout_buffer[length:]
|
|
203
|
-
return body
|
|
204
|
-
|
|
205
199
|
def _read_message(self) -> dict[str, Any]:
|
|
206
200
|
deadline = time.monotonic() + self._config.mcp_read_timeout_seconds
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
if
|
|
212
|
-
|
|
213
|
-
key, _, val = decoded.partition(":")
|
|
214
|
-
headers[key.strip().lower()] = val.strip()
|
|
215
|
-
length = int(headers.get("content-length", "0"))
|
|
216
|
-
body = self._read_exact(length, deadline)
|
|
217
|
-
return json.loads(body.decode("utf-8"))
|
|
201
|
+
# gsd-mcp-server emits newline-delimited JSON (NDJSON); each line is a
|
|
202
|
+
# complete JSON-RPC message. Skip blank keep-alive lines.
|
|
203
|
+
while True:
|
|
204
|
+
line = self._read_line(deadline)
|
|
205
|
+
if line.strip():
|
|
206
|
+
return json.loads(line.decode("utf-8"))
|
|
218
207
|
|
|
219
208
|
def _initialize(self) -> None:
|
|
220
209
|
self._request_id += 1
|
|
@@ -226,7 +215,7 @@ class GsdMcpClient:
|
|
|
226
215
|
"params": {
|
|
227
216
|
"protocolVersion": "2024-11-05",
|
|
228
217
|
"capabilities": {},
|
|
229
|
-
"clientInfo": {"name": "open-gsd-hermes", "version": "1.
|
|
218
|
+
"clientInfo": {"name": "open-gsd-hermes", "version": "1.6.0"},
|
|
230
219
|
},
|
|
231
220
|
}
|
|
232
221
|
)
|
|
@@ -31,7 +31,7 @@ def test_read_message_times_out_waiting_for_headers() -> None:
|
|
|
31
31
|
proc.kill()
|
|
32
32
|
|
|
33
33
|
|
|
34
|
-
def
|
|
34
|
+
def test_read_message_times_out_waiting_for_newline() -> None:
|
|
35
35
|
client = GsdMcpClient(GsdConfig(mcp_read_timeout_seconds=0.05))
|
|
36
36
|
proc = subprocess.Popen(
|
|
37
37
|
[
|
|
@@ -39,7 +39,7 @@ def test_read_message_times_out_waiting_for_body() -> None:
|
|
|
39
39
|
"-c",
|
|
40
40
|
(
|
|
41
41
|
"import sys, time; "
|
|
42
|
-
"sys.stdout.buffer.write(b'
|
|
42
|
+
"sys.stdout.buffer.write(b'{\"jsonrpc\":\"2.0\"'); "
|
|
43
43
|
"sys.stdout.flush(); "
|
|
44
44
|
"time.sleep(10)"
|
|
45
45
|
),
|
|
@@ -59,7 +59,7 @@ def test_read_message_times_out_waiting_for_body() -> None:
|
|
|
59
59
|
proc.kill()
|
|
60
60
|
|
|
61
61
|
|
|
62
|
-
def
|
|
62
|
+
def test_read_message_fails_without_respawning_when_stdout_closes_mid_line(
|
|
63
63
|
tmp_path,
|
|
64
64
|
) -> None:
|
|
65
65
|
client = GsdMcpClient(GsdConfig(mcp_read_timeout_seconds=1))
|
|
@@ -69,7 +69,7 @@ def test_read_message_fails_without_respawning_when_stdout_closes_mid_body(
|
|
|
69
69
|
"-c",
|
|
70
70
|
(
|
|
71
71
|
"import sys; "
|
|
72
|
-
"sys.stdout.buffer.write(b'
|
|
72
|
+
"sys.stdout.buffer.write(b'{\"jsonrpc\":\"2.0\"'); "
|
|
73
73
|
"sys.stdout.flush()"
|
|
74
74
|
),
|
|
75
75
|
],
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opengsd/gsd-pi",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"description": "GSD Pi local-first coding agent",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -210,11 +210,11 @@
|
|
|
210
210
|
},
|
|
211
211
|
"optionalDependencies": {
|
|
212
212
|
"@mariozechner/clipboard": "0.3.6",
|
|
213
|
-
"@opengsd/engine-darwin-arm64": "1.
|
|
214
|
-
"@opengsd/engine-darwin-x64": "1.
|
|
215
|
-
"@opengsd/engine-linux-arm64-gnu": "1.
|
|
216
|
-
"@opengsd/engine-linux-x64-gnu": "1.
|
|
217
|
-
"@opengsd/engine-win32-x64-msvc": "1.
|
|
213
|
+
"@opengsd/engine-darwin-arm64": "1.6.0",
|
|
214
|
+
"@opengsd/engine-darwin-x64": "1.6.0",
|
|
215
|
+
"@opengsd/engine-linux-arm64-gnu": "1.6.0",
|
|
216
|
+
"@opengsd/engine-linux-x64-gnu": "1.6.0",
|
|
217
|
+
"@opengsd/engine-win32-x64-msvc": "1.6.0",
|
|
218
218
|
"fsevents": "~2.3.3",
|
|
219
219
|
"koffi": "^2.9.0"
|
|
220
220
|
},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opengsd/cloud-mcp-gateway",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"description": "Cloud MCP gateway for brokering remote MCP clients to local GSD runtimes",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
32
|
-
"@opengsd/mcp-server": "^1.
|
|
32
|
+
"@opengsd/mcp-server": "^1.6.0",
|
|
33
33
|
"ws": "^8.20.0",
|
|
34
34
|
"zod": "^4.0.0"
|
|
35
35
|
},
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type Anthropic from '@anthropic-ai/sdk';
|
|
2
|
+
import type { MessageParam } from '@anthropic-ai/sdk/resources/messages/messages';
|
|
3
|
+
import { type OrchestratorToolContext } from './orchestrator-tools.js';
|
|
4
|
+
export interface OrchestratorAgentConfig {
|
|
5
|
+
model: string;
|
|
6
|
+
max_tokens: number;
|
|
7
|
+
}
|
|
8
|
+
export declare class OrchestratorAgent {
|
|
9
|
+
private readonly config;
|
|
10
|
+
private readonly toolContext;
|
|
11
|
+
private client;
|
|
12
|
+
private history;
|
|
13
|
+
constructor(config: OrchestratorAgentConfig, toolContext: OrchestratorToolContext, client?: Anthropic);
|
|
14
|
+
run(content: string): Promise<string>;
|
|
15
|
+
getHistory(): MessageParam[];
|
|
16
|
+
stop(): void;
|
|
17
|
+
private getClient;
|
|
18
|
+
private runToolLoop;
|
|
19
|
+
private trimHistory;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=orchestrator-agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator-agent.d.ts","sourceRoot":"","sources":["../src/orchestrator-agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EACV,YAAY,EAKb,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAGL,KAAK,uBAAuB,EAC7B,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAqCD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0B;IACtD,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,OAAO,CAAsB;gBAGnC,MAAM,EAAE,uBAAuB,EAC/B,WAAW,EAAE,uBAAuB,EACpC,MAAM,CAAC,EAAE,SAAS;IAOd,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmB3C,UAAU,IAAI,YAAY,EAAE;IAI5B,IAAI,IAAI,IAAI;YAKE,SAAS;YAQT,WAAW;IAkDzB,OAAO,CAAC,WAAW;CAKpB"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { ORCHESTRATOR_TOOLS, executeOrchestratorTool, } from './orchestrator-tools.js';
|
|
2
|
+
const SYSTEM_PROMPT = `You are GSD Control — a concise, capable orchestrator for managing GSD (Git Ship Done) coding agent sessions via Discord.
|
|
3
|
+
|
|
4
|
+
You have tools to list projects, start sessions, get status, stop sessions, and inspect session details. Use them to fulfill the user's requests.
|
|
5
|
+
|
|
6
|
+
Response guidelines:
|
|
7
|
+
- Be terse and direct. No filler, no performed enthusiasm.
|
|
8
|
+
- When reporting status, use bullet points with project name, status, duration, and cost.
|
|
9
|
+
- When starting a session, confirm with the project name and session ID.
|
|
10
|
+
- When stopping a session, confirm which session was stopped.
|
|
11
|
+
- If something fails, say what went wrong plainly.
|
|
12
|
+
- Use Discord markdown formatting (bold, code blocks) for readability.
|
|
13
|
+
- Never expose internal error stack traces to the user — summarize the issue.`;
|
|
14
|
+
const MAX_HISTORY = 30;
|
|
15
|
+
const MAX_TOOL_ITERATIONS = 10;
|
|
16
|
+
function resolveAnthropicApiKey() {
|
|
17
|
+
const apiKey = process.env.ANTHROPIC_API_KEY;
|
|
18
|
+
if (!apiKey) {
|
|
19
|
+
throw new Error('ANTHROPIC_API_KEY is required. Set it in your environment or run `gsd config`.');
|
|
20
|
+
}
|
|
21
|
+
return apiKey;
|
|
22
|
+
}
|
|
23
|
+
function isAuthError(message) {
|
|
24
|
+
return (message.includes('authentication') ||
|
|
25
|
+
message.includes('apiKey') ||
|
|
26
|
+
message.includes('authToken') ||
|
|
27
|
+
message.includes('401'));
|
|
28
|
+
}
|
|
29
|
+
export class OrchestratorAgent {
|
|
30
|
+
config;
|
|
31
|
+
toolContext;
|
|
32
|
+
client;
|
|
33
|
+
history = [];
|
|
34
|
+
constructor(config, toolContext, client) {
|
|
35
|
+
this.config = config;
|
|
36
|
+
this.toolContext = toolContext;
|
|
37
|
+
this.client = client ?? null;
|
|
38
|
+
}
|
|
39
|
+
async run(content) {
|
|
40
|
+
this.history.push({ role: 'user', content });
|
|
41
|
+
try {
|
|
42
|
+
const responseText = await this.runToolLoop();
|
|
43
|
+
this.history.push({ role: 'assistant', content: responseText });
|
|
44
|
+
return responseText;
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
48
|
+
if (isAuthError(errorMsg)) {
|
|
49
|
+
this.client = null;
|
|
50
|
+
}
|
|
51
|
+
this.history.push({ role: 'assistant', content: '[error — see logs]' });
|
|
52
|
+
throw err;
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
this.trimHistory();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
getHistory() {
|
|
59
|
+
return [...this.history];
|
|
60
|
+
}
|
|
61
|
+
stop() {
|
|
62
|
+
this.history = [];
|
|
63
|
+
this.client = null;
|
|
64
|
+
}
|
|
65
|
+
async getClient() {
|
|
66
|
+
if (this.client)
|
|
67
|
+
return this.client;
|
|
68
|
+
const apiKey = resolveAnthropicApiKey();
|
|
69
|
+
const { default: AnthropicSDK } = await import('@anthropic-ai/sdk');
|
|
70
|
+
this.client = new AnthropicSDK({ apiKey });
|
|
71
|
+
return this.client;
|
|
72
|
+
}
|
|
73
|
+
async runToolLoop() {
|
|
74
|
+
const client = await this.getClient();
|
|
75
|
+
const { model, max_tokens } = this.config;
|
|
76
|
+
let loopMessages = [...this.history];
|
|
77
|
+
for (let i = 0; i < MAX_TOOL_ITERATIONS; i++) {
|
|
78
|
+
const response = await client.messages.create({
|
|
79
|
+
model,
|
|
80
|
+
max_tokens,
|
|
81
|
+
system: SYSTEM_PROMPT,
|
|
82
|
+
tools: ORCHESTRATOR_TOOLS,
|
|
83
|
+
messages: loopMessages,
|
|
84
|
+
});
|
|
85
|
+
if (response.stop_reason !== 'tool_use') {
|
|
86
|
+
const textBlocks = response.content.filter((b) => b.type === 'text');
|
|
87
|
+
return textBlocks.map((b) => b.text).join('\n') || '(No response)';
|
|
88
|
+
}
|
|
89
|
+
const toolUseBlocks = response.content.filter((b) => b.type === 'tool_use');
|
|
90
|
+
const toolResults = [];
|
|
91
|
+
for (const toolUse of toolUseBlocks) {
|
|
92
|
+
const result = await executeOrchestratorTool(this.toolContext, toolUse.name, toolUse.input);
|
|
93
|
+
toolResults.push({
|
|
94
|
+
type: 'tool_result',
|
|
95
|
+
tool_use_id: toolUse.id,
|
|
96
|
+
content: result,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
loopMessages = [
|
|
100
|
+
...loopMessages,
|
|
101
|
+
{ role: 'assistant', content: response.content },
|
|
102
|
+
{ role: 'user', content: toolResults },
|
|
103
|
+
];
|
|
104
|
+
}
|
|
105
|
+
return 'I hit the maximum number of tool iterations. Please try a simpler request.';
|
|
106
|
+
}
|
|
107
|
+
trimHistory() {
|
|
108
|
+
while (this.history.length > MAX_HISTORY) {
|
|
109
|
+
this.history.splice(0, 2);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=orchestrator-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator-agent.js","sourceRoot":"","sources":["../src/orchestrator-agent.ts"],"names":[],"mappings":"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","sourcesContent":["import type Anthropic from '@anthropic-ai/sdk';\nimport type {\n MessageParam,\n ContentBlockParam,\n ToolResultBlockParam,\n ToolUseBlock,\n TextBlock,\n} from '@anthropic-ai/sdk/resources/messages/messages';\nimport {\n ORCHESTRATOR_TOOLS,\n executeOrchestratorTool,\n type OrchestratorToolContext,\n} from './orchestrator-tools.js';\n\nexport interface OrchestratorAgentConfig {\n model: string;\n max_tokens: number;\n}\n\nconst SYSTEM_PROMPT = `You are GSD Control — a concise, capable orchestrator for managing GSD (Git Ship Done) coding agent sessions via Discord.\n\nYou have tools to list projects, start sessions, get status, stop sessions, and inspect session details. Use them to fulfill the user's requests.\n\nResponse guidelines:\n- Be terse and direct. No filler, no performed enthusiasm.\n- When reporting status, use bullet points with project name, status, duration, and cost.\n- When starting a session, confirm with the project name and session ID.\n- When stopping a session, confirm which session was stopped.\n- If something fails, say what went wrong plainly.\n- Use Discord markdown formatting (bold, code blocks) for readability.\n- Never expose internal error stack traces to the user — summarize the issue.`;\n\nconst MAX_HISTORY = 30;\nconst MAX_TOOL_ITERATIONS = 10;\n\nfunction resolveAnthropicApiKey(): string {\n const apiKey = process.env.ANTHROPIC_API_KEY;\n if (!apiKey) {\n throw new Error(\n 'ANTHROPIC_API_KEY is required. Set it in your environment or run `gsd config`.',\n );\n }\n return apiKey;\n}\n\nfunction isAuthError(message: string): boolean {\n return (\n message.includes('authentication') ||\n message.includes('apiKey') ||\n message.includes('authToken') ||\n message.includes('401')\n );\n}\n\nexport class OrchestratorAgent {\n private readonly config: OrchestratorAgentConfig;\n private readonly toolContext: OrchestratorToolContext;\n private client: Anthropic | null;\n private history: MessageParam[] = [];\n\n constructor(\n config: OrchestratorAgentConfig,\n toolContext: OrchestratorToolContext,\n client?: Anthropic,\n ) {\n this.config = config;\n this.toolContext = toolContext;\n this.client = client ?? null;\n }\n\n async run(content: string): Promise<string> {\n this.history.push({ role: 'user', content });\n\n try {\n const responseText = await this.runToolLoop();\n this.history.push({ role: 'assistant', content: responseText });\n return responseText;\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n if (isAuthError(errorMsg)) {\n this.client = null;\n }\n this.history.push({ role: 'assistant', content: '[error — see logs]' });\n throw err;\n } finally {\n this.trimHistory();\n }\n }\n\n getHistory(): MessageParam[] {\n return [...this.history];\n }\n\n stop(): void {\n this.history = [];\n this.client = null;\n }\n\n private async getClient(): Promise<Anthropic> {\n if (this.client) return this.client;\n const apiKey = resolveAnthropicApiKey();\n const { default: AnthropicSDK } = await import('@anthropic-ai/sdk');\n this.client = new AnthropicSDK({ apiKey });\n return this.client;\n }\n\n private async runToolLoop(): Promise<string> {\n const client = await this.getClient();\n const { model, max_tokens } = this.config;\n\n let loopMessages: MessageParam[] = [...this.history];\n\n for (let i = 0; i < MAX_TOOL_ITERATIONS; i++) {\n const response = await client.messages.create({\n model,\n max_tokens,\n system: SYSTEM_PROMPT,\n tools: ORCHESTRATOR_TOOLS,\n messages: loopMessages,\n });\n\n if (response.stop_reason !== 'tool_use') {\n const textBlocks = response.content.filter(\n (b): b is TextBlock => b.type === 'text',\n );\n return textBlocks.map((b) => b.text).join('\\n') || '(No response)';\n }\n\n const toolUseBlocks = response.content.filter(\n (b): b is ToolUseBlock => b.type === 'tool_use',\n );\n\n const toolResults: ToolResultBlockParam[] = [];\n for (const toolUse of toolUseBlocks) {\n const result = await executeOrchestratorTool(\n this.toolContext,\n toolUse.name,\n toolUse.input as Record<string, unknown>,\n );\n toolResults.push({\n type: 'tool_result',\n tool_use_id: toolUse.id,\n content: result,\n });\n }\n\n loopMessages = [\n ...loopMessages,\n { role: 'assistant', content: response.content as ContentBlockParam[] },\n { role: 'user', content: toolResults },\n ];\n }\n\n return 'I hit the maximum number of tool iterations. Please try a simpler request.';\n }\n\n private trimHistory(): void {\n while (this.history.length > MAX_HISTORY) {\n this.history.splice(0, 2);\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Tool } from '@anthropic-ai/sdk/resources/messages/messages';
|
|
2
|
+
import type { SessionManager } from './session-manager.js';
|
|
3
|
+
import type { ProjectInfo } from './types.js';
|
|
4
|
+
import type { Logger } from './logger.js';
|
|
5
|
+
export interface OrchestratorToolContext {
|
|
6
|
+
sessionManager: SessionManager;
|
|
7
|
+
scanProjects: () => Promise<ProjectInfo[]>;
|
|
8
|
+
logger: Logger;
|
|
9
|
+
}
|
|
10
|
+
export declare const ORCHESTRATOR_TOOLS: Tool[];
|
|
11
|
+
export declare function executeOrchestratorTool(context: OrchestratorToolContext, name: string, input: Record<string, unknown>): Promise<string>;
|
|
12
|
+
//# sourceMappingURL=orchestrator-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator-tools.d.ts","sourceRoot":"","sources":["../src/orchestrator-tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,+CAA+C,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,YAAY,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,uBAAuB;IACtC,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3C,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,kBAAkB,EAAE,IAAI,EAqDpC,CAAC;AAeF,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,uBAAuB,EAChC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,MAAM,CAAC,CAqBjB"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export const ORCHESTRATOR_TOOLS = [
|
|
3
|
+
{
|
|
4
|
+
name: 'list_projects',
|
|
5
|
+
description: 'List all detected projects across configured scan roots. Returns project names, paths, and detected markers (git, node, gsd, etc.).',
|
|
6
|
+
input_schema: {
|
|
7
|
+
type: 'object',
|
|
8
|
+
properties: {},
|
|
9
|
+
required: [],
|
|
10
|
+
},
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
name: 'start_session',
|
|
14
|
+
description: 'Start a new GSD auto-mode session for a project. Provide the absolute project path. Optionally provide a command to run instead of the default "/gsd auto".',
|
|
15
|
+
input_schema: {
|
|
16
|
+
type: 'object',
|
|
17
|
+
properties: {
|
|
18
|
+
projectPath: { type: 'string', description: 'Absolute path to the project directory' },
|
|
19
|
+
command: { type: 'string', description: 'Optional command to send instead of "/gsd auto"' },
|
|
20
|
+
},
|
|
21
|
+
required: ['projectPath'],
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: 'get_status',
|
|
26
|
+
description: 'Get the current status of all active GSD sessions. Shows project name, status, duration, and cost for each.',
|
|
27
|
+
input_schema: {
|
|
28
|
+
type: 'object',
|
|
29
|
+
properties: {},
|
|
30
|
+
required: [],
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'stop_session',
|
|
35
|
+
description: 'Stop a running GSD session. Provide a session ID or project name — fuzzy matching is used to find the session.',
|
|
36
|
+
input_schema: {
|
|
37
|
+
type: 'object',
|
|
38
|
+
properties: {
|
|
39
|
+
identifier: { type: 'string', description: 'Session ID or project name to match' },
|
|
40
|
+
},
|
|
41
|
+
required: ['identifier'],
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: 'get_session_detail',
|
|
46
|
+
description: 'Get detailed information about a specific session including cost breakdown, recent events, pending blockers, and error state.',
|
|
47
|
+
input_schema: {
|
|
48
|
+
type: 'object',
|
|
49
|
+
properties: {
|
|
50
|
+
sessionId: { type: 'string', description: 'The session ID to inspect' },
|
|
51
|
+
},
|
|
52
|
+
required: ['sessionId'],
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
];
|
|
56
|
+
const StartSessionInput = z.object({
|
|
57
|
+
projectPath: z.string(),
|
|
58
|
+
command: z.string().optional(),
|
|
59
|
+
});
|
|
60
|
+
const StopSessionInput = z.object({
|
|
61
|
+
identifier: z.string(),
|
|
62
|
+
});
|
|
63
|
+
const GetSessionDetailInput = z.object({
|
|
64
|
+
sessionId: z.string(),
|
|
65
|
+
});
|
|
66
|
+
export async function executeOrchestratorTool(context, name, input) {
|
|
67
|
+
try {
|
|
68
|
+
switch (name) {
|
|
69
|
+
case 'list_projects':
|
|
70
|
+
return await listProjects(context);
|
|
71
|
+
case 'start_session':
|
|
72
|
+
return await startSession(context, input);
|
|
73
|
+
case 'get_status':
|
|
74
|
+
return getStatus(context);
|
|
75
|
+
case 'get_session_detail':
|
|
76
|
+
return getSessionDetail(context, input);
|
|
77
|
+
case 'stop_session':
|
|
78
|
+
return await stopSession(context, input);
|
|
79
|
+
default:
|
|
80
|
+
return `Unknown tool: ${name}`;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
85
|
+
context.logger.error('tool execution error', { tool: name, error: msg });
|
|
86
|
+
return `Error: ${msg}`;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async function listProjects(context) {
|
|
90
|
+
const projects = await context.scanProjects();
|
|
91
|
+
if (projects.length === 0)
|
|
92
|
+
return 'No projects found.';
|
|
93
|
+
return JSON.stringify(projects.map((p) => ({ name: p.name, path: p.path, markers: p.markers })), null, 2);
|
|
94
|
+
}
|
|
95
|
+
async function startSession(context, input) {
|
|
96
|
+
const parsed = StartSessionInput.parse(input);
|
|
97
|
+
const sessionId = await context.sessionManager.startSession({
|
|
98
|
+
projectDir: parsed.projectPath,
|
|
99
|
+
command: parsed.command,
|
|
100
|
+
});
|
|
101
|
+
return `Session started: ${sessionId} for ${parsed.projectPath}`;
|
|
102
|
+
}
|
|
103
|
+
function getStatus(context) {
|
|
104
|
+
const sessions = context.sessionManager.getAllSessions();
|
|
105
|
+
if (sessions.length === 0)
|
|
106
|
+
return 'No active sessions.';
|
|
107
|
+
return sessions
|
|
108
|
+
.map((s) => {
|
|
109
|
+
const durationMin = Math.floor((Date.now() - s.startTime) / 60_000);
|
|
110
|
+
const cost = s.cost.totalCost.toFixed(4);
|
|
111
|
+
return `• ${s.projectName} — ${s.status} (${durationMin}m, $${cost})`;
|
|
112
|
+
})
|
|
113
|
+
.join('\n');
|
|
114
|
+
}
|
|
115
|
+
async function stopSession(context, input) {
|
|
116
|
+
const parsed = StopSessionInput.parse(input);
|
|
117
|
+
const { identifier } = parsed;
|
|
118
|
+
const byId = context.sessionManager.getSession(identifier);
|
|
119
|
+
if (byId) {
|
|
120
|
+
await context.sessionManager.cancelSession(identifier);
|
|
121
|
+
return `Stopped session ${identifier} (${byId.projectName})`;
|
|
122
|
+
}
|
|
123
|
+
const normalizedIdentifier = identifier.toLowerCase();
|
|
124
|
+
const match = context.sessionManager.getAllSessions().find((s) => s.projectName.toLowerCase().includes(normalizedIdentifier) ||
|
|
125
|
+
s.projectDir.toLowerCase().includes(normalizedIdentifier));
|
|
126
|
+
if (match) {
|
|
127
|
+
await context.sessionManager.cancelSession(match.sessionId);
|
|
128
|
+
return `Stopped session ${match.sessionId} (${match.projectName})`;
|
|
129
|
+
}
|
|
130
|
+
return `No session found matching "${identifier}"`;
|
|
131
|
+
}
|
|
132
|
+
function getSessionDetail(context, input) {
|
|
133
|
+
const parsed = GetSessionDetailInput.parse(input);
|
|
134
|
+
const result = context.sessionManager.getResult(parsed.sessionId);
|
|
135
|
+
return JSON.stringify(result, null, 2);
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=orchestrator-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator-tools.js","sourceRoot":"","sources":["../src/orchestrator-tools.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod';\nimport type { Tool } from '@anthropic-ai/sdk/resources/messages/messages';\nimport type { SessionManager } from './session-manager.js';\nimport type { ProjectInfo, ManagedSession } from './types.js';\nimport type { Logger } from './logger.js';\n\nexport interface OrchestratorToolContext {\n sessionManager: SessionManager;\n scanProjects: () => Promise<ProjectInfo[]>;\n logger: Logger;\n}\n\nexport const ORCHESTRATOR_TOOLS: Tool[] = [\n {\n name: 'list_projects',\n description: 'List all detected projects across configured scan roots. Returns project names, paths, and detected markers (git, node, gsd, etc.).',\n input_schema: {\n type: 'object' as const,\n properties: {},\n required: [],\n },\n },\n {\n name: 'start_session',\n description: 'Start a new GSD auto-mode session for a project. Provide the absolute project path. Optionally provide a command to run instead of the default \"/gsd auto\".',\n input_schema: {\n type: 'object' as const,\n properties: {\n projectPath: { type: 'string', description: 'Absolute path to the project directory' },\n command: { type: 'string', description: 'Optional command to send instead of \"/gsd auto\"' },\n },\n required: ['projectPath'],\n },\n },\n {\n name: 'get_status',\n description: 'Get the current status of all active GSD sessions. Shows project name, status, duration, and cost for each.',\n input_schema: {\n type: 'object' as const,\n properties: {},\n required: [],\n },\n },\n {\n name: 'stop_session',\n description: 'Stop a running GSD session. Provide a session ID or project name — fuzzy matching is used to find the session.',\n input_schema: {\n type: 'object' as const,\n properties: {\n identifier: { type: 'string', description: 'Session ID or project name to match' },\n },\n required: ['identifier'],\n },\n },\n {\n name: 'get_session_detail',\n description: 'Get detailed information about a specific session including cost breakdown, recent events, pending blockers, and error state.',\n input_schema: {\n type: 'object' as const,\n properties: {\n sessionId: { type: 'string', description: 'The session ID to inspect' },\n },\n required: ['sessionId'],\n },\n },\n];\n\nconst StartSessionInput = z.object({\n projectPath: z.string(),\n command: z.string().optional(),\n});\n\nconst StopSessionInput = z.object({\n identifier: z.string(),\n});\n\nconst GetSessionDetailInput = z.object({\n sessionId: z.string(),\n});\n\nexport async function executeOrchestratorTool(\n context: OrchestratorToolContext,\n name: string,\n input: Record<string, unknown>,\n): Promise<string> {\n try {\n switch (name) {\n case 'list_projects':\n return await listProjects(context);\n case 'start_session':\n return await startSession(context, input);\n case 'get_status':\n return getStatus(context);\n case 'get_session_detail':\n return getSessionDetail(context, input);\n case 'stop_session':\n return await stopSession(context, input);\n default:\n return `Unknown tool: ${name}`;\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n context.logger.error('tool execution error', { tool: name, error: msg });\n return `Error: ${msg}`;\n }\n}\n\nasync function listProjects(context: OrchestratorToolContext): Promise<string> {\n const projects = await context.scanProjects();\n if (projects.length === 0) return 'No projects found.';\n return JSON.stringify(\n projects.map((p) => ({ name: p.name, path: p.path, markers: p.markers })),\n null,\n 2,\n );\n}\n\nasync function startSession(\n context: OrchestratorToolContext,\n input: Record<string, unknown>,\n): Promise<string> {\n const parsed = StartSessionInput.parse(input);\n const sessionId = await context.sessionManager.startSession({\n projectDir: parsed.projectPath,\n command: parsed.command,\n });\n return `Session started: ${sessionId} for ${parsed.projectPath}`;\n}\n\nfunction getStatus(context: OrchestratorToolContext): string {\n const sessions = context.sessionManager.getAllSessions();\n if (sessions.length === 0) return 'No active sessions.';\n\n return sessions\n .map((s: ManagedSession) => {\n const durationMin = Math.floor((Date.now() - s.startTime) / 60_000);\n const cost = s.cost.totalCost.toFixed(4);\n return `• ${s.projectName} — ${s.status} (${durationMin}m, $${cost})`;\n })\n .join('\\n');\n}\n\nasync function stopSession(\n context: OrchestratorToolContext,\n input: Record<string, unknown>,\n): Promise<string> {\n const parsed = StopSessionInput.parse(input);\n const { identifier } = parsed;\n\n const byId = context.sessionManager.getSession(identifier);\n if (byId) {\n await context.sessionManager.cancelSession(identifier);\n return `Stopped session ${identifier} (${byId.projectName})`;\n }\n\n const normalizedIdentifier = identifier.toLowerCase();\n const match = context.sessionManager.getAllSessions().find(\n (s: ManagedSession) =>\n s.projectName.toLowerCase().includes(normalizedIdentifier) ||\n s.projectDir.toLowerCase().includes(normalizedIdentifier),\n );\n if (match) {\n await context.sessionManager.cancelSession(match.sessionId);\n return `Stopped session ${match.sessionId} (${match.projectName})`;\n }\n\n return `No session found matching \"${identifier}\"`;\n}\n\nfunction getSessionDetail(\n context: OrchestratorToolContext,\n input: Record<string, unknown>,\n): string {\n const parsed = GetSessionDetailInput.parse(input);\n const result = context.sessionManager.getResult(parsed.sessionId);\n return JSON.stringify(result, null, 2);\n}\n"]}
|
|
@@ -1,14 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Orchestrator —
|
|
2
|
+
* Orchestrator — Discord-facing controller for the #gsd-control channel.
|
|
3
3
|
*
|
|
4
|
-
* Receives Discord messages,
|
|
5
|
-
*
|
|
6
|
-
* get_status, stop_session, get_session_detail), and sends the LLM's response
|
|
7
|
-
* back to Discord.
|
|
8
|
-
*
|
|
9
|
-
* Uses the standard messages.create() tool-use loop (not betaZodTool helpers,
|
|
10
|
-
* which don't exist in SDK v0.52). Zod schemas are used for input validation
|
|
11
|
-
* at the tool execution layer.
|
|
4
|
+
* Receives Discord messages, filters them by channel/owner/bot guards, delegates
|
|
5
|
+
* valid user content to OrchestratorAgent, and sends the response back to Discord.
|
|
12
6
|
*/
|
|
13
7
|
import type Anthropic from '@anthropic-ai/sdk';
|
|
14
8
|
import type { MessageParam } from '@anthropic-ai/sdk/resources/messages/messages';
|
|
@@ -31,58 +25,12 @@ export interface OrchestratorDeps {
|
|
|
31
25
|
}
|
|
32
26
|
export declare class Orchestrator {
|
|
33
27
|
private readonly deps;
|
|
34
|
-
private
|
|
35
|
-
private history;
|
|
36
|
-
/**
|
|
37
|
-
* @param deps - orchestrator dependencies (session manager, channel manager, etc.)
|
|
38
|
-
* @param client - optional Anthropic client for testability; if omitted, created from env
|
|
39
|
-
*/
|
|
28
|
+
private readonly agent;
|
|
40
29
|
constructor(deps: OrchestratorDeps, client?: Anthropic);
|
|
41
|
-
/**
|
|
42
|
-
* Lazily initialise the Anthropic client. Dynamic import handles K007 module resolution.
|
|
43
|
-
* Requires ANTHROPIC_API_KEY environment variable.
|
|
44
|
-
*/
|
|
45
|
-
private getClient;
|
|
46
|
-
/**
|
|
47
|
-
* Handle an incoming Discord message. Entry point called by the bot's
|
|
48
|
-
* message handler for every message in every channel.
|
|
49
|
-
*
|
|
50
|
-
* Guards: ignores bot messages, non-owner messages, and non-control-channel messages.
|
|
51
|
-
*/
|
|
52
30
|
handleMessage(message: DiscordMessageLike): Promise<void>;
|
|
53
|
-
/**
|
|
54
|
-
* Run the tool-use loop: call messages.create(), execute any tool calls,
|
|
55
|
-
* feed results back, repeat until the model produces a final text response.
|
|
56
|
-
*/
|
|
57
|
-
private runAgentLoop;
|
|
58
|
-
/**
|
|
59
|
-
* Execute a single tool by name. Returns a string result for the LLM.
|
|
60
|
-
* All errors are caught and returned as error strings (the LLM can reason about them).
|
|
61
|
-
*/
|
|
62
|
-
private executeTool;
|
|
63
|
-
private toolListProjects;
|
|
64
|
-
private toolStartSession;
|
|
65
|
-
private toolGetStatus;
|
|
66
|
-
private toolStopSession;
|
|
67
|
-
private toolGetSessionDetail;
|
|
68
|
-
/**
|
|
69
|
-
* Trim conversation history to MAX_HISTORY entries.
|
|
70
|
-
* Removes the oldest user+assistant pair from the front to keep pairs aligned.
|
|
71
|
-
*/
|
|
72
|
-
private trimHistory;
|
|
73
|
-
/**
|
|
74
|
-
* Return a copy of the conversation history (for debugging / observability).
|
|
75
|
-
*/
|
|
76
31
|
getHistory(): MessageParam[];
|
|
77
|
-
/**
|
|
78
|
-
* Stop the orchestrator — clears history and nulls client reference.
|
|
79
|
-
*/
|
|
80
32
|
stop(): void;
|
|
81
33
|
}
|
|
82
|
-
/**
|
|
83
|
-
* Minimal Discord message interface — avoids importing discord.js directly,
|
|
84
|
-
* making the orchestrator testable without full discord.js mocking.
|
|
85
|
-
*/
|
|
86
34
|
export interface DiscordMessageLike {
|
|
87
35
|
author: {
|
|
88
36
|
id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,cAAc,CAAC;IAC/B,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3C,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmB;IACxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoB;gBAE9B,IAAI,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,SAAS;IAahD,aAAa,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IA+C/D,UAAU,IAAI,YAAY,EAAE;IAI5B,IAAI,IAAI,IAAI;CAGb;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,OAAO,CAAA;KAAE,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE;QACP,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5C,UAAU,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;KACpC,CAAC;CACH"}
|