gsd-pi 2.77.0-dev.58d3d4d6c → 2.77.0-dev.cfd69e714
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 +1 -1
- package/dist/claude-cli-check.js +5 -1
- package/dist/headless.js +49 -4
- package/dist/resource-loader.d.ts +40 -0
- package/dist/resource-loader.js +32 -13
- package/dist/resources/extensions/browser-tools/capture.js +9 -0
- package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
- package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
- package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
- package/dist/resources/extensions/browser-tools/tools/forms.js +5 -1
- package/dist/resources/extensions/browser-tools/tools/intent.js +5 -1
- package/dist/resources/extensions/claude-code-cli/readiness.js +5 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +481 -17
- package/dist/resources/extensions/gsd/auto/loop.js +43 -0
- package/dist/resources/extensions/gsd/auto/phases.js +15 -21
- package/dist/resources/extensions/gsd/auto/session.js +0 -2
- package/dist/resources/extensions/gsd/auto-dispatch.js +102 -24
- package/dist/resources/extensions/gsd/auto-model-selection.js +124 -4
- package/dist/resources/extensions/gsd/auto-post-unit.js +71 -64
- package/dist/resources/extensions/gsd/auto-prompts.js +329 -102
- package/dist/resources/extensions/gsd/auto-recovery.js +195 -23
- package/dist/resources/extensions/gsd/auto-start.js +34 -24
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +47 -7
- package/dist/resources/extensions/gsd/auto-worktree.js +122 -26
- package/dist/resources/extensions/gsd/auto.js +31 -20
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +9 -1
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +209 -0
- package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +3 -6
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +7 -3
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +127 -9
- package/dist/resources/extensions/gsd/component-loader.js +447 -0
- package/dist/resources/extensions/gsd/component-types.js +69 -0
- package/dist/resources/extensions/gsd/detection.js +49 -1
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
- package/dist/resources/extensions/gsd/gate-registry.js +2 -2
- package/dist/resources/extensions/gsd/git-constants.js +28 -1
- package/dist/resources/extensions/gsd/git-self-heal.js +27 -0
- package/dist/resources/extensions/gsd/git-service.js +126 -2
- package/dist/resources/extensions/gsd/gsd-db.js +6 -3
- package/dist/resources/extensions/gsd/guided-flow.js +17 -5
- package/dist/resources/extensions/gsd/memory-extractor.js +7 -1
- package/dist/resources/extensions/gsd/milestone-scope-classifier.js +299 -0
- package/dist/resources/extensions/gsd/model-cost-table.js +3 -0
- package/dist/resources/extensions/gsd/model-router.js +6 -0
- package/dist/resources/extensions/gsd/native-git-bridge.js +34 -4
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +6 -2
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +15 -2
- package/dist/resources/extensions/gsd/safety/git-checkpoint.js +11 -0
- package/dist/resources/extensions/gsd/service-tier.js +5 -2
- package/dist/resources/extensions/gsd/session-lock.js +19 -10
- package/dist/resources/extensions/gsd/skill-manifest.js +168 -0
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +278 -8
- package/dist/resources/extensions/gsd/state.js +44 -33
- package/dist/resources/extensions/gsd/sync-lock.js +98 -42
- package/dist/resources/extensions/gsd/unit-context-composer.js +147 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +370 -0
- package/dist/resources/extensions/gsd/uok/gate-runner.js +53 -5
- package/dist/resources/extensions/gsd/workflow-mcp.js +6 -0
- package/dist/resources/extensions/gsd/worktree-manager.js +34 -8
- package/dist/resources/extensions/mcp-client/index.js +3 -1
- package/dist/resources/extensions/ollama/index.js +5 -1
- package/dist/resources/extensions/remote-questions/manager.js +11 -5
- 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 +5 -5
- 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/git/route.js +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 +5 -5
- package/dist/web/standalone/.next/server/chunks/1926.js +1 -1
- package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
- 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/package.json +2 -3
- package/packages/daemon/src/logger.ts +4 -3
- package/packages/mcp-server/dist/server.d.ts +24 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +88 -87
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/src/mcp-server.test.ts +25 -3
- package/packages/mcp-server/src/readers/graph.test.ts +87 -15
- package/packages/mcp-server/src/secure-env-collect.test.ts +232 -237
- package/packages/mcp-server/src/server.ts +131 -105
- package/packages/mcp-server/src/workflow-tools.test.ts +80 -39
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +1 -1
- package/packages/native/src/__tests__/_test-coverage-guard.test.mjs +98 -0
- package/packages/native/src/__tests__/module-compat.test.mjs +59 -27
- package/packages/native/src/__tests__/ps.test.mjs +14 -8
- package/packages/native/src/__tests__/stream-process.test.mjs +23 -2
- package/packages/native/src/__tests__/truncate.test.mjs +17 -2
- package/packages/pi-agent-core/src/agent-loop.test.ts +5 -15
- package/packages/pi-agent-core/src/agent.test.ts +96 -102
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/capability-patches.js +9 -2
- package/packages/pi-ai/dist/models/capability-patches.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/index.d.ts +34 -0
- package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai.js +17 -0
- package/packages/pi-ai/dist/models/generated/openai.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.test.js +43 -70
- package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
- package/packages/pi-ai/dist/models.test.js +36 -11
- package/packages/pi-ai/dist/models.test.js.map +1 -1
- package/packages/pi-ai/scripts/generate-models.ts +44 -0
- package/packages/pi-ai/src/models/capability-patches.ts +10 -2
- package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
- package/packages/pi-ai/src/models/generated/openai.ts +17 -0
- package/packages/pi-ai/src/models.generated.test.ts +46 -73
- package/packages/pi-ai/src/models.test.ts +48 -11
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +96 -32
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js +75 -12
- package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +99 -31
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +5 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +61 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js +30 -4
- package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +17 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js +76 -18
- package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js +2 -6
- package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js +5 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts +18 -0
- package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/retryable-error-regex.js +18 -0
- package/packages/pi-coding-agent/dist/core/retryable-error-regex.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +20 -0
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +16 -2
- package/packages/pi-coding-agent/dist/core/system-prompt.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/dist/modes/interactive/components/dynamic-border.test.js +20 -13
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +18 -3
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +125 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +4 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +105 -13
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js +130 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js.map +1 -0
- package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +113 -37
- package/packages/pi-coding-agent/src/core/agent-session-model-switch.test.ts +89 -17
- package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +112 -43
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +58 -0
- package/packages/pi-coding-agent/src/core/lsp/lsp-integration.test.ts +35 -4
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +20 -0
- package/packages/pi-coding-agent/src/core/resource-loader-cache-reset.test.ts +93 -28
- package/packages/pi-coding-agent/src/core/retry-handler.test.ts +5 -1
- package/packages/pi-coding-agent/src/core/retry-handler.ts +2 -8
- package/packages/pi-coding-agent/src/core/retryable-error-regex.ts +18 -0
- package/packages/pi-coding-agent/src/core/system-prompt.ts +35 -1
- package/packages/pi-coding-agent/src/index.ts +1 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +26 -20
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +146 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +20 -3
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +2 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +119 -13
- package/packages/pi-coding-agent/src/tests/system-prompt-skill-filter.test.ts +157 -0
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js +18 -8
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +128 -17
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
- package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js +36 -12
- package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js.map +1 -1
- package/packages/pi-tui/dist/__tests__/tui.test.js +18 -30
- package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
- package/packages/pi-tui/dist/components/__tests__/input.test.js +10 -3
- package/packages/pi-tui/dist/components/__tests__/input.test.js.map +1 -1
- package/packages/pi-tui/dist/components/__tests__/loader.test.js +53 -9
- package/packages/pi-tui/dist/components/__tests__/loader.test.js.map +1 -1
- package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js +6 -2
- package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js.map +1 -1
- package/packages/pi-tui/dist/components/editor.d.ts +14 -0
- package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/editor.js +19 -0
- package/packages/pi-tui/dist/components/editor.js.map +1 -1
- package/packages/pi-tui/dist/components/image.test.js +6 -5
- package/packages/pi-tui/dist/components/image.test.js.map +1 -1
- package/packages/pi-tui/dist/editor-component.d.ts +2 -0
- package/packages/pi-tui/dist/editor-component.d.ts.map +1 -1
- package/packages/pi-tui/dist/editor-component.js.map +1 -1
- package/packages/pi-tui/src/__tests__/autocomplete.test.ts +24 -8
- package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +140 -17
- package/packages/pi-tui/src/__tests__/stdin-buffer.test.ts +41 -12
- package/packages/pi-tui/src/__tests__/tui.test.ts +18 -37
- package/packages/pi-tui/src/components/__tests__/input.test.ts +19 -3
- package/packages/pi-tui/src/components/__tests__/loader.test.ts +112 -35
- package/packages/pi-tui/src/components/__tests__/markdown-maxlines.test.ts +9 -2
- package/packages/pi-tui/src/components/editor.ts +22 -0
- package/packages/pi-tui/src/components/image.test.ts +10 -5
- package/packages/pi-tui/src/editor-component.ts +3 -0
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/dist/rpc-client.test.js +101 -51
- package/packages/rpc-client/dist/rpc-client.test.js.map +1 -1
- package/packages/rpc-client/src/rpc-client.test.ts +109 -52
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
- package/scripts/install.js +15 -1
- package/src/resources/extensions/browser-tools/capture.ts +12 -0
- package/src/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
- package/src/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
- package/src/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
- package/src/resources/extensions/browser-tools/tools/forms.ts +5 -1
- package/src/resources/extensions/browser-tools/tools/intent.ts +5 -1
- package/src/resources/extensions/claude-code-cli/readiness.ts +5 -1
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +518 -19
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +919 -75
- package/src/resources/extensions/github-sync/tests/cli.test.ts +76 -7
- package/src/resources/extensions/github-sync/tests/templates.test.ts +33 -1
- package/src/resources/extensions/gsd/auto/loop.ts +47 -0
- package/src/resources/extensions/gsd/auto/phases.ts +16 -20
- package/src/resources/extensions/gsd/auto/session.ts +0 -2
- package/src/resources/extensions/gsd/auto-dispatch.ts +113 -24
- package/src/resources/extensions/gsd/auto-model-selection.ts +131 -4
- package/src/resources/extensions/gsd/auto-post-unit.ts +82 -73
- package/src/resources/extensions/gsd/auto-prompts.ts +330 -90
- package/src/resources/extensions/gsd/auto-recovery.ts +225 -24
- package/src/resources/extensions/gsd/auto-start.ts +54 -6
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +51 -7
- package/src/resources/extensions/gsd/auto-worktree.ts +130 -26
- package/src/resources/extensions/gsd/auto.ts +43 -22
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +9 -1
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +221 -0
- package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +3 -7
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +7 -3
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +158 -9
- package/src/resources/extensions/gsd/component-loader.ts +598 -0
- package/src/resources/extensions/gsd/component-types.ts +362 -0
- package/src/resources/extensions/gsd/detection.ts +58 -1
- package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
- package/src/resources/extensions/gsd/gate-registry.ts +2 -2
- package/src/resources/extensions/gsd/git-constants.ts +30 -1
- package/src/resources/extensions/gsd/git-self-heal.ts +31 -0
- package/src/resources/extensions/gsd/git-service.ts +133 -2
- package/src/resources/extensions/gsd/gsd-db.ts +6 -3
- package/src/resources/extensions/gsd/guided-flow.ts +20 -5
- package/src/resources/extensions/gsd/memory-extractor.ts +11 -3
- package/src/resources/extensions/gsd/milestone-scope-classifier.ts +366 -0
- package/src/resources/extensions/gsd/model-cost-table.ts +3 -0
- package/src/resources/extensions/gsd/model-router.ts +6 -0
- package/src/resources/extensions/gsd/native-git-bridge.ts +34 -4
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +6 -2
- package/src/resources/extensions/gsd/prompts/plan-slice.md +15 -2
- package/src/resources/extensions/gsd/safety/git-checkpoint.ts +15 -0
- package/src/resources/extensions/gsd/service-tier.ts +5 -2
- package/src/resources/extensions/gsd/session-lock.ts +20 -10
- package/src/resources/extensions/gsd/skill-manifest.ts +175 -0
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +309 -8
- package/src/resources/extensions/gsd/state.ts +49 -44
- package/src/resources/extensions/gsd/sync-lock.ts +97 -39
- package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +270 -0
- package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +341 -0
- package/src/resources/extensions/gsd/tests/auto-discuss-milestone-deadlock-4973.test.ts +264 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +94 -289
- package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +742 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +78 -0
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +61 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +8 -197
- package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +15 -58
- package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +17 -21
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +263 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +192 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +16 -8
- package/src/resources/extensions/gsd/tests/component-loader.test.ts +589 -0
- package/src/resources/extensions/gsd/tests/component-types.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +50 -1
- package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +91 -3
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +139 -129
- package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +9 -105
- package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/gate-storage.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +4 -55
- package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +7 -57
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +18 -2
- package/src/resources/extensions/gsd/tests/integration/queue-completed-milestone-perf.test.ts +10 -4
- package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +144 -7
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +2 -16
- package/src/resources/extensions/gsd/tests/interrupted-session-ui.test.ts +6 -9
- package/src/resources/extensions/gsd/tests/mcp-client-security.test.ts +8 -37
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +5 -15
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +227 -62
- package/src/resources/extensions/gsd/tests/milestone-scope-classifier.test.ts +187 -0
- package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +9 -1
- package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +6 -49
- package/src/resources/extensions/gsd/tests/notification-widget.test.ts +6 -3
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +273 -133
- package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +301 -0
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +23 -24
- package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +75 -2
- package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +8 -40
- package/src/resources/extensions/gsd/tests/regex-hardening.test.ts +136 -256
- package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +114 -0
- package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/service-tier.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/silent-catch-diagnostics.test.ts +55 -95
- package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +158 -0
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +120 -1
- package/src/resources/extensions/gsd/tests/skill-manifest.test.ts +112 -0
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +164 -1
- package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +5 -5
- package/src/resources/extensions/gsd/tests/structured-data-formatter.test.ts +11 -92
- package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +102 -101
- package/src/resources/extensions/gsd/tests/sync-lock.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/test-helpers.test.ts +12 -61
- package/src/resources/extensions/gsd/tests/test-helpers.ts +21 -8
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +61 -1
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +8 -1
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +355 -0
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +258 -0
- package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +49 -26
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +144 -81
- package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -54
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +342 -277
- package/src/resources/extensions/gsd/tests/worker-model-override.test.ts +37 -29
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +226 -266
- package/src/resources/extensions/gsd/tests/worktree-health-monorepo.test.ts +103 -67
- package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +92 -90
- package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +238 -59
- package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +113 -161
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +262 -0
- package/src/resources/extensions/gsd/tests/write-gate-predicates.test.ts +186 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +7 -5
- package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +80 -96
- package/src/resources/extensions/gsd/types.ts +3 -3
- package/src/resources/extensions/gsd/unit-context-composer.ts +218 -0
- package/src/resources/extensions/gsd/unit-context-manifest.ts +574 -0
- package/src/resources/extensions/gsd/uok/gate-runner.ts +65 -5
- package/src/resources/extensions/gsd/workflow-mcp.ts +6 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +55 -7
- package/src/resources/extensions/mcp-client/index.ts +3 -1
- package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +70 -36
- package/src/resources/extensions/ollama/index.ts +5 -1
- package/src/resources/extensions/ollama/ollama-auth-mode.test.ts +123 -15
- package/src/resources/extensions/ollama/ollama-status-indicator.test.ts +206 -19
- package/src/resources/extensions/remote-questions/manager.ts +36 -4
- package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +200 -190
- package/src/resources/extensions/shared/tests/interview-preview.test.ts +11 -3
- package/src/resources/extensions/voice/tests/linux-ready.test.ts +129 -113
- package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts +0 -2
- package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts.map +0 -1
- package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js +0 -289
- package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js.map +0 -1
- package/packages/pi-ai/src/utils/oauth/oauth-providers.test.ts +0 -363
- package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +0 -144
- package/src/resources/extensions/gsd/tests/complete-milestone-false-merge.test.ts +0 -157
- package/src/resources/extensions/gsd/tests/dashboard-model-label-ordering.test.ts +0 -107
- package/src/resources/extensions/gsd/tests/find-missing-summaries-closed.test.ts +0 -48
- package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +0 -159
- package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +0 -96
- package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +0 -79
- package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +0 -75
- package/src/resources/extensions/gsd/tests/forensics-journal.test.ts +0 -162
- package/src/resources/extensions/gsd/tests/forensics-worktree-telemetry.test.ts +0 -145
- package/src/resources/extensions/gsd/tests/gitignore-bg-shell.test.ts +0 -38
- package/src/resources/extensions/gsd/tests/gsd-no-project-error.test.ts +0 -73
- package/src/resources/extensions/gsd/tests/idle-watchdog-stall-override.test.ts +0 -130
- package/src/resources/extensions/gsd/tests/import-done-milestones.test.ts +0 -43
- /package/dist/web/standalone/.next/static/{Cev5xrAYA3ZGTRLyjR2fX → SvCJDZPQW104bR1KnBQg1}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{Cev5xrAYA3ZGTRLyjR2fX → SvCJDZPQW104bR1KnBQg1}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
// GSD-2 — UnitContextManifest (#4782 phase 1).
|
|
2
|
+
//
|
|
3
|
+
// Declarative description of what context each auto-mode unit type needs
|
|
4
|
+
// in its system prompt. Establishes the contract that later phases will
|
|
5
|
+
// use to drive a single composeSystemPromptForUnit() — replacing the
|
|
6
|
+
// per-unit-type branching currently spread across `auto-prompts.ts`.
|
|
7
|
+
//
|
|
8
|
+
// **Phase 1 ships the type + the data + a CI coverage guard.** It adds
|
|
9
|
+
// zero wiring — no caller reads a manifest yet. Every unit type gets a
|
|
10
|
+
// manifest that describes today's behavior as faithfully as possible, so
|
|
11
|
+
// when the composer lands in phase 2 the migration can proceed manifest-
|
|
12
|
+
// by-manifest without behavior change.
|
|
13
|
+
//
|
|
14
|
+
// Phased rollout tracking:
|
|
15
|
+
// - Phase 1 (this PR): schema + manifests + coverage test.
|
|
16
|
+
// - Phase 2: add composeSystemPromptForUnit(); migrate one low-risk
|
|
17
|
+
// unit type (e.g. reassess-roadmap) as the pilot.
|
|
18
|
+
// - Phase 3: migrate remaining unit types, tighten manifests per
|
|
19
|
+
// empirical usage, introduce skipWhen predicates absorbing the
|
|
20
|
+
// reassess opt-in gate from #4778.
|
|
21
|
+
// - Phase 4: introduce pipeline variants as declared sequences,
|
|
22
|
+
// absorbing the scope-classifier gates from #4781.
|
|
23
|
+
//
|
|
24
|
+
// Naming:
|
|
25
|
+
// - Artifact keys are STABLE strings (not paths). Path resolution is
|
|
26
|
+
// the composer's job; manifests describe intent, not disk layout.
|
|
27
|
+
// - Char budgets are nominal — blown budgets log a telemetry event,
|
|
28
|
+
// they do not truncate or error (the composer decides fallback).
|
|
29
|
+
// ─── Artifact registry ────────────────────────────────────────────────────
|
|
30
|
+
/**
|
|
31
|
+
* Stable identifiers for every artifact class a unit might inline, excerpt,
|
|
32
|
+
* or reference on-demand. Adding a new artifact class requires (a) a key
|
|
33
|
+
* here, (b) path/body resolution in the composer, and (c) updates to any
|
|
34
|
+
* manifest that should surface it.
|
|
35
|
+
*/
|
|
36
|
+
export const ARTIFACT_KEYS = [
|
|
37
|
+
// Milestone-scoped
|
|
38
|
+
"roadmap",
|
|
39
|
+
"milestone-context",
|
|
40
|
+
"milestone-summary",
|
|
41
|
+
"milestone-validation",
|
|
42
|
+
"milestone-research",
|
|
43
|
+
"milestone-plan",
|
|
44
|
+
// Slice-scoped
|
|
45
|
+
"slice-context",
|
|
46
|
+
"slice-research",
|
|
47
|
+
"slice-plan",
|
|
48
|
+
"slice-summary",
|
|
49
|
+
"slice-uat",
|
|
50
|
+
"slice-assessment",
|
|
51
|
+
// Task-scoped
|
|
52
|
+
"task-plan",
|
|
53
|
+
"task-summary",
|
|
54
|
+
"prior-task-summaries",
|
|
55
|
+
"dependency-summaries",
|
|
56
|
+
// Project-scoped
|
|
57
|
+
"requirements",
|
|
58
|
+
"decisions",
|
|
59
|
+
"project",
|
|
60
|
+
"templates",
|
|
61
|
+
];
|
|
62
|
+
// ─── Manifests ────────────────────────────────────────────────────────────
|
|
63
|
+
// Phase 1 policy: every manifest encodes today's behavior. Skills = "all"
|
|
64
|
+
// unless the unit type was already narrowed via the existing skill-manifest
|
|
65
|
+
// resolver (#4779). Memory/knowledge policies reflect the defaults in
|
|
66
|
+
// `bootstrap/system-context.ts`. Artifact classifications follow what
|
|
67
|
+
// `auto-prompts.ts` inlines today for each unit type.
|
|
68
|
+
const COMMON_BUDGET_LARGE = 1_500_000; // ~400K tokens
|
|
69
|
+
const COMMON_BUDGET_MEDIUM = 750_000; // ~200K tokens
|
|
70
|
+
const COMMON_BUDGET_SMALL = 250_000; // ~65K tokens
|
|
71
|
+
// ─── Tool policy constants (#4934) ────────────────────────────────────────
|
|
72
|
+
// Reused across manifests so per-unit assignment stays declarative and the
|
|
73
|
+
// allowed-path set for the docs policy lives in one reviewable place.
|
|
74
|
+
const TOOLS_ALL = { mode: "all" };
|
|
75
|
+
const TOOLS_PLANNING = { mode: "planning" };
|
|
76
|
+
const TOOLS_DOCS = {
|
|
77
|
+
mode: "docs",
|
|
78
|
+
// Globs are resolved relative to project basePath. The set is intentionally
|
|
79
|
+
// narrow: top-level docs/, README, CHANGELOG, and any markdown at the
|
|
80
|
+
// project root. Projects with non-standard layouts (e.g. mintlify-docs/)
|
|
81
|
+
// will need this list extended in a follow-up; landed conservative now,
|
|
82
|
+
// expand on demand.
|
|
83
|
+
allowedPathGlobs: [
|
|
84
|
+
"docs/**",
|
|
85
|
+
"README.md",
|
|
86
|
+
"README.*.md",
|
|
87
|
+
"CHANGELOG.md",
|
|
88
|
+
"*.md",
|
|
89
|
+
],
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Canonical unit types handled by auto-mode dispatch. The coverage test
|
|
93
|
+
* enumerates these against `UNIT_MANIFESTS` to catch manifest drift when
|
|
94
|
+
* a new unit type lands.
|
|
95
|
+
*/
|
|
96
|
+
export const KNOWN_UNIT_TYPES = [
|
|
97
|
+
"research-milestone",
|
|
98
|
+
"plan-milestone",
|
|
99
|
+
"discuss-milestone",
|
|
100
|
+
"validate-milestone",
|
|
101
|
+
"complete-milestone",
|
|
102
|
+
"research-slice",
|
|
103
|
+
"plan-slice",
|
|
104
|
+
"refine-slice",
|
|
105
|
+
"replan-slice",
|
|
106
|
+
"complete-slice",
|
|
107
|
+
"reassess-roadmap",
|
|
108
|
+
"execute-task",
|
|
109
|
+
"reactive-execute",
|
|
110
|
+
"run-uat",
|
|
111
|
+
"gate-evaluate",
|
|
112
|
+
"rewrite-docs",
|
|
113
|
+
];
|
|
114
|
+
export const UNIT_MANIFESTS = {
|
|
115
|
+
// ─── Milestone-scoped ────────────────────────────────────────────────
|
|
116
|
+
"research-milestone": {
|
|
117
|
+
skills: { mode: "all" },
|
|
118
|
+
knowledge: "full",
|
|
119
|
+
memory: "prompt-relevant",
|
|
120
|
+
codebaseMap: true,
|
|
121
|
+
preferences: "active-only",
|
|
122
|
+
tools: TOOLS_PLANNING,
|
|
123
|
+
artifacts: {
|
|
124
|
+
// Phase 3 migration (#4782): matches today's actual
|
|
125
|
+
// buildResearchMilestonePrompt inlining order.
|
|
126
|
+
inline: ["milestone-context", "project", "requirements", "decisions", "templates"],
|
|
127
|
+
excerpt: [],
|
|
128
|
+
onDemand: [],
|
|
129
|
+
},
|
|
130
|
+
maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
|
|
131
|
+
},
|
|
132
|
+
"plan-milestone": {
|
|
133
|
+
skills: { mode: "all" },
|
|
134
|
+
knowledge: "full",
|
|
135
|
+
memory: "prompt-relevant",
|
|
136
|
+
codebaseMap: true,
|
|
137
|
+
preferences: "active-only",
|
|
138
|
+
tools: TOOLS_PLANNING,
|
|
139
|
+
artifacts: {
|
|
140
|
+
inline: ["project", "requirements", "decisions", "milestone-research", "templates"],
|
|
141
|
+
excerpt: [],
|
|
142
|
+
onDemand: [],
|
|
143
|
+
},
|
|
144
|
+
maxSystemPromptChars: COMMON_BUDGET_LARGE,
|
|
145
|
+
},
|
|
146
|
+
"discuss-milestone": {
|
|
147
|
+
skills: { mode: "all" },
|
|
148
|
+
knowledge: "full",
|
|
149
|
+
memory: "prompt-relevant",
|
|
150
|
+
codebaseMap: true,
|
|
151
|
+
preferences: "active-only",
|
|
152
|
+
tools: TOOLS_PLANNING,
|
|
153
|
+
artifacts: {
|
|
154
|
+
inline: ["project", "requirements", "decisions", "milestone-context", "templates"],
|
|
155
|
+
excerpt: [],
|
|
156
|
+
onDemand: [],
|
|
157
|
+
},
|
|
158
|
+
maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
|
|
159
|
+
},
|
|
160
|
+
"validate-milestone": {
|
|
161
|
+
skills: { mode: "all" },
|
|
162
|
+
knowledge: "scoped",
|
|
163
|
+
memory: "prompt-relevant",
|
|
164
|
+
codebaseMap: false,
|
|
165
|
+
preferences: "active-only",
|
|
166
|
+
tools: TOOLS_PLANNING,
|
|
167
|
+
artifacts: {
|
|
168
|
+
inline: ["roadmap", "slice-summary", "slice-uat", "requirements", "decisions", "templates"],
|
|
169
|
+
excerpt: [],
|
|
170
|
+
onDemand: [],
|
|
171
|
+
},
|
|
172
|
+
maxSystemPromptChars: COMMON_BUDGET_LARGE,
|
|
173
|
+
},
|
|
174
|
+
"complete-milestone": {
|
|
175
|
+
skills: { mode: "all" },
|
|
176
|
+
knowledge: "scoped",
|
|
177
|
+
memory: "prompt-relevant",
|
|
178
|
+
codebaseMap: false,
|
|
179
|
+
preferences: "active-only",
|
|
180
|
+
tools: TOOLS_PLANNING,
|
|
181
|
+
artifacts: {
|
|
182
|
+
// #4780 landed slice-summary as excerpt for this unit; phase 2 of
|
|
183
|
+
// the architecture will read this manifest as the source of truth
|
|
184
|
+
// and retire the special-case wiring in auto-prompts.ts.
|
|
185
|
+
inline: ["roadmap", "milestone-context", "requirements", "decisions", "project", "templates"],
|
|
186
|
+
excerpt: ["slice-summary"],
|
|
187
|
+
onDemand: ["slice-summary"],
|
|
188
|
+
},
|
|
189
|
+
maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
|
|
190
|
+
},
|
|
191
|
+
// ─── Slice-scoped ────────────────────────────────────────────────────
|
|
192
|
+
"research-slice": {
|
|
193
|
+
skills: { mode: "all" },
|
|
194
|
+
knowledge: "full",
|
|
195
|
+
memory: "prompt-relevant",
|
|
196
|
+
codebaseMap: true,
|
|
197
|
+
preferences: "active-only",
|
|
198
|
+
tools: TOOLS_PLANNING,
|
|
199
|
+
artifacts: {
|
|
200
|
+
inline: ["roadmap", "milestone-research", "dependency-summaries", "templates"],
|
|
201
|
+
excerpt: [],
|
|
202
|
+
onDemand: [],
|
|
203
|
+
},
|
|
204
|
+
maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
|
|
205
|
+
},
|
|
206
|
+
"plan-slice": {
|
|
207
|
+
skills: { mode: "all" },
|
|
208
|
+
knowledge: "full",
|
|
209
|
+
memory: "prompt-relevant",
|
|
210
|
+
codebaseMap: true,
|
|
211
|
+
preferences: "active-only",
|
|
212
|
+
tools: TOOLS_PLANNING,
|
|
213
|
+
artifacts: {
|
|
214
|
+
inline: ["roadmap", "slice-research", "dependency-summaries", "requirements", "decisions", "templates"],
|
|
215
|
+
excerpt: [],
|
|
216
|
+
onDemand: [],
|
|
217
|
+
},
|
|
218
|
+
maxSystemPromptChars: COMMON_BUDGET_LARGE,
|
|
219
|
+
},
|
|
220
|
+
"refine-slice": {
|
|
221
|
+
skills: { mode: "all" },
|
|
222
|
+
knowledge: "scoped",
|
|
223
|
+
memory: "prompt-relevant",
|
|
224
|
+
codebaseMap: true,
|
|
225
|
+
preferences: "active-only",
|
|
226
|
+
tools: TOOLS_PLANNING,
|
|
227
|
+
artifacts: {
|
|
228
|
+
inline: ["slice-plan", "slice-research", "dependency-summaries", "templates"],
|
|
229
|
+
excerpt: [],
|
|
230
|
+
onDemand: [],
|
|
231
|
+
},
|
|
232
|
+
maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
|
|
233
|
+
},
|
|
234
|
+
"replan-slice": {
|
|
235
|
+
skills: { mode: "all" },
|
|
236
|
+
knowledge: "scoped",
|
|
237
|
+
memory: "prompt-relevant",
|
|
238
|
+
codebaseMap: true,
|
|
239
|
+
preferences: "active-only",
|
|
240
|
+
tools: TOOLS_PLANNING,
|
|
241
|
+
artifacts: {
|
|
242
|
+
inline: ["slice-plan", "slice-research", "dependency-summaries", "prior-task-summaries", "templates"],
|
|
243
|
+
excerpt: [],
|
|
244
|
+
onDemand: [],
|
|
245
|
+
},
|
|
246
|
+
maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
|
|
247
|
+
},
|
|
248
|
+
"complete-slice": {
|
|
249
|
+
skills: { mode: "all" },
|
|
250
|
+
knowledge: "scoped",
|
|
251
|
+
memory: "prompt-relevant",
|
|
252
|
+
codebaseMap: false,
|
|
253
|
+
preferences: "active-only",
|
|
254
|
+
tools: TOOLS_PLANNING,
|
|
255
|
+
artifacts: {
|
|
256
|
+
// Phase 3 migration (#4782): matches today's actual
|
|
257
|
+
// buildCompleteSlicePrompt inlining order. Overrides prepend +
|
|
258
|
+
// knowledge splice stay in the builder imperatively (see RFC
|
|
259
|
+
// #4924 — computed/prepend blocks are phase-4 composer work).
|
|
260
|
+
inline: ["roadmap", "slice-context", "slice-plan", "requirements", "prior-task-summaries", "templates"],
|
|
261
|
+
excerpt: [],
|
|
262
|
+
onDemand: [],
|
|
263
|
+
},
|
|
264
|
+
maxSystemPromptChars: COMMON_BUDGET_LARGE,
|
|
265
|
+
},
|
|
266
|
+
"reassess-roadmap": {
|
|
267
|
+
skills: { mode: "all" },
|
|
268
|
+
knowledge: "scoped",
|
|
269
|
+
memory: "critical-only",
|
|
270
|
+
codebaseMap: false,
|
|
271
|
+
preferences: "none",
|
|
272
|
+
tools: TOOLS_PLANNING,
|
|
273
|
+
artifacts: {
|
|
274
|
+
// Phase 2 pilot (#4782): manifest now matches today's actual
|
|
275
|
+
// buildReassessRoadmapPrompt behavior for equivalence. Phase 3
|
|
276
|
+
// will tighten this list once the composer reports real telemetry.
|
|
277
|
+
inline: ["roadmap", "slice-context", "slice-summary", "project", "requirements", "decisions"],
|
|
278
|
+
excerpt: [],
|
|
279
|
+
onDemand: [],
|
|
280
|
+
},
|
|
281
|
+
maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
|
|
282
|
+
},
|
|
283
|
+
// ─── Task-scoped ─────────────────────────────────────────────────────
|
|
284
|
+
"execute-task": {
|
|
285
|
+
skills: { mode: "all" },
|
|
286
|
+
knowledge: "scoped",
|
|
287
|
+
memory: "prompt-relevant",
|
|
288
|
+
codebaseMap: true,
|
|
289
|
+
preferences: "active-only",
|
|
290
|
+
tools: TOOLS_ALL,
|
|
291
|
+
artifacts: {
|
|
292
|
+
inline: ["task-plan", "slice-plan", "prior-task-summaries", "templates"],
|
|
293
|
+
excerpt: [],
|
|
294
|
+
onDemand: ["slice-research"],
|
|
295
|
+
},
|
|
296
|
+
maxSystemPromptChars: COMMON_BUDGET_LARGE,
|
|
297
|
+
},
|
|
298
|
+
"reactive-execute": {
|
|
299
|
+
skills: { mode: "all" },
|
|
300
|
+
knowledge: "scoped",
|
|
301
|
+
memory: "prompt-relevant",
|
|
302
|
+
codebaseMap: true,
|
|
303
|
+
preferences: "active-only",
|
|
304
|
+
tools: TOOLS_ALL,
|
|
305
|
+
artifacts: {
|
|
306
|
+
inline: ["slice-plan", "prior-task-summaries", "templates"],
|
|
307
|
+
excerpt: [],
|
|
308
|
+
onDemand: ["slice-research"],
|
|
309
|
+
},
|
|
310
|
+
maxSystemPromptChars: COMMON_BUDGET_LARGE,
|
|
311
|
+
},
|
|
312
|
+
// ─── Ancillary units ─────────────────────────────────────────────────
|
|
313
|
+
"run-uat": {
|
|
314
|
+
skills: { mode: "all" },
|
|
315
|
+
knowledge: "critical-only",
|
|
316
|
+
memory: "critical-only",
|
|
317
|
+
codebaseMap: false,
|
|
318
|
+
preferences: "active-only",
|
|
319
|
+
tools: TOOLS_PLANNING,
|
|
320
|
+
artifacts: {
|
|
321
|
+
// Phase 3 migration (#4782): manifest matches today's actual
|
|
322
|
+
// buildRunUatPrompt inlining. Prior phase-1 entry listed
|
|
323
|
+
// `slice-plan` aspirationally — the real builder inlines the UAT
|
|
324
|
+
// file, the slice SUMMARY (optional), and the project row.
|
|
325
|
+
inline: ["slice-uat", "slice-summary", "project"],
|
|
326
|
+
excerpt: [],
|
|
327
|
+
onDemand: [],
|
|
328
|
+
},
|
|
329
|
+
maxSystemPromptChars: COMMON_BUDGET_SMALL,
|
|
330
|
+
},
|
|
331
|
+
"gate-evaluate": {
|
|
332
|
+
skills: { mode: "all" },
|
|
333
|
+
knowledge: "critical-only",
|
|
334
|
+
memory: "critical-only",
|
|
335
|
+
codebaseMap: false,
|
|
336
|
+
preferences: "active-only",
|
|
337
|
+
tools: TOOLS_PLANNING,
|
|
338
|
+
artifacts: {
|
|
339
|
+
inline: ["slice-plan", "prior-task-summaries"],
|
|
340
|
+
excerpt: [],
|
|
341
|
+
onDemand: [],
|
|
342
|
+
},
|
|
343
|
+
maxSystemPromptChars: COMMON_BUDGET_SMALL,
|
|
344
|
+
},
|
|
345
|
+
"rewrite-docs": {
|
|
346
|
+
skills: { mode: "all" },
|
|
347
|
+
knowledge: "scoped",
|
|
348
|
+
memory: "prompt-relevant",
|
|
349
|
+
codebaseMap: true,
|
|
350
|
+
preferences: "active-only",
|
|
351
|
+
tools: TOOLS_DOCS,
|
|
352
|
+
artifacts: {
|
|
353
|
+
inline: ["project", "requirements", "decisions", "templates"],
|
|
354
|
+
excerpt: [],
|
|
355
|
+
onDemand: [],
|
|
356
|
+
},
|
|
357
|
+
maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
|
|
358
|
+
},
|
|
359
|
+
};
|
|
360
|
+
// ─── Lookup helper ────────────────────────────────────────────────────────
|
|
361
|
+
/**
|
|
362
|
+
* Return the manifest for a unit type, or null when the type is unknown.
|
|
363
|
+
*
|
|
364
|
+
* Callers MUST treat null as "fall through to today's default behavior"
|
|
365
|
+
* rather than erroring — unknown unit types may be experimental and
|
|
366
|
+
* should not crash the composer.
|
|
367
|
+
*/
|
|
368
|
+
export function resolveManifest(unitType) {
|
|
369
|
+
return UNIT_MANIFESTS[unitType] ?? null;
|
|
370
|
+
}
|
|
@@ -24,7 +24,8 @@ export class UokGateRunner {
|
|
|
24
24
|
async run(id, ctx) {
|
|
25
25
|
const gate = this.registry.get(id);
|
|
26
26
|
if (!gate) {
|
|
27
|
-
|
|
27
|
+
const now = new Date().toISOString();
|
|
28
|
+
const unknownResult = {
|
|
28
29
|
gateId: id,
|
|
29
30
|
gateType: "unknown",
|
|
30
31
|
outcome: "manual-attention",
|
|
@@ -33,16 +34,63 @@ export class UokGateRunner {
|
|
|
33
34
|
attempt: 1,
|
|
34
35
|
maxAttempts: 1,
|
|
35
36
|
retryable: false,
|
|
36
|
-
evaluatedAt:
|
|
37
|
+
evaluatedAt: now,
|
|
37
38
|
};
|
|
39
|
+
insertGateRun({
|
|
40
|
+
traceId: ctx.traceId,
|
|
41
|
+
turnId: ctx.turnId,
|
|
42
|
+
gateId: unknownResult.gateId,
|
|
43
|
+
gateType: unknownResult.gateType,
|
|
44
|
+
unitType: ctx.unitType,
|
|
45
|
+
unitId: ctx.unitId,
|
|
46
|
+
milestoneId: ctx.milestoneId,
|
|
47
|
+
sliceId: ctx.sliceId,
|
|
48
|
+
taskId: ctx.taskId,
|
|
49
|
+
outcome: unknownResult.outcome,
|
|
50
|
+
failureClass: unknownResult.failureClass,
|
|
51
|
+
rationale: unknownResult.rationale,
|
|
52
|
+
findings: unknownResult.findings,
|
|
53
|
+
attempt: unknownResult.attempt,
|
|
54
|
+
maxAttempts: unknownResult.maxAttempts,
|
|
55
|
+
retryable: unknownResult.retryable,
|
|
56
|
+
evaluatedAt: unknownResult.evaluatedAt,
|
|
57
|
+
});
|
|
58
|
+
emitUokAuditEvent(ctx.basePath, buildAuditEnvelope({
|
|
59
|
+
traceId: ctx.traceId,
|
|
60
|
+
turnId: ctx.turnId,
|
|
61
|
+
category: "gate",
|
|
62
|
+
type: "gate-run",
|
|
63
|
+
payload: {
|
|
64
|
+
gateId: unknownResult.gateId,
|
|
65
|
+
gateType: unknownResult.gateType,
|
|
66
|
+
outcome: unknownResult.outcome,
|
|
67
|
+
failureClass: unknownResult.failureClass,
|
|
68
|
+
attempt: unknownResult.attempt,
|
|
69
|
+
maxAttempts: unknownResult.maxAttempts,
|
|
70
|
+
retryable: unknownResult.retryable,
|
|
71
|
+
},
|
|
72
|
+
}));
|
|
73
|
+
return unknownResult;
|
|
38
74
|
}
|
|
39
75
|
let attempt = 0;
|
|
40
76
|
let final = null;
|
|
41
77
|
const maxAttemptsByFailureClass = RETRY_MATRIX;
|
|
42
|
-
|
|
78
|
+
const maxAttemptsCeiling = Math.max(...Object.values(RETRY_MATRIX)) + 1;
|
|
79
|
+
while (attempt < maxAttemptsCeiling) {
|
|
43
80
|
attempt += 1;
|
|
44
81
|
const now = new Date().toISOString();
|
|
45
|
-
|
|
82
|
+
let result;
|
|
83
|
+
try {
|
|
84
|
+
result = await gate.execute(ctx, attempt);
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
88
|
+
result = {
|
|
89
|
+
outcome: "fail",
|
|
90
|
+
failureClass: "unknown",
|
|
91
|
+
rationale: message,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
46
94
|
const failureClass = result.failureClass ?? (result.outcome === "pass" ? "none" : "unknown");
|
|
47
95
|
const retryBudget = maxAttemptsByFailureClass[failureClass] ?? 0;
|
|
48
96
|
const retryable = result.outcome !== "pass" && attempt <= retryBudget;
|
|
@@ -54,7 +102,7 @@ export class UokGateRunner {
|
|
|
54
102
|
rationale: result.rationale,
|
|
55
103
|
findings: result.findings,
|
|
56
104
|
attempt,
|
|
57
|
-
maxAttempts:
|
|
105
|
+
maxAttempts: retryBudget + 1,
|
|
58
106
|
retryable,
|
|
59
107
|
evaluatedAt: now,
|
|
60
108
|
};
|
|
@@ -15,6 +15,7 @@ const MCP_WORKFLOW_TOOL_SURFACE = new Set([
|
|
|
15
15
|
"gsd_journal_query",
|
|
16
16
|
"gsd_milestone_complete",
|
|
17
17
|
"gsd_milestone_generate_id",
|
|
18
|
+
"gsd_milestone_reopen",
|
|
18
19
|
"gsd_checkpoint_db",
|
|
19
20
|
"gsd_milestone_status",
|
|
20
21
|
"gsd_milestone_validate",
|
|
@@ -23,6 +24,9 @@ const MCP_WORKFLOW_TOOL_SURFACE = new Set([
|
|
|
23
24
|
"gsd_plan_slice",
|
|
24
25
|
"gsd_replan_slice",
|
|
25
26
|
"gsd_reassess_roadmap",
|
|
27
|
+
"gsd_reopen_milestone",
|
|
28
|
+
"gsd_reopen_slice",
|
|
29
|
+
"gsd_reopen_task",
|
|
26
30
|
"gsd_requirement_save",
|
|
27
31
|
"gsd_requirement_update",
|
|
28
32
|
"gsd_roadmap_reassess",
|
|
@@ -32,9 +36,11 @@ const MCP_WORKFLOW_TOOL_SURFACE = new Set([
|
|
|
32
36
|
"gsd_skip_slice",
|
|
33
37
|
"gsd_slice_replan",
|
|
34
38
|
"gsd_slice_complete",
|
|
39
|
+
"gsd_slice_reopen",
|
|
35
40
|
"gsd_summary_save",
|
|
36
41
|
"gsd_task_plan",
|
|
37
42
|
"gsd_task_complete",
|
|
43
|
+
"gsd_task_reopen",
|
|
38
44
|
"gsd_update_requirement",
|
|
39
45
|
"gsd_validate_milestone",
|
|
40
46
|
]);
|
|
@@ -19,7 +19,7 @@ import { execFileSync } from "node:child_process";
|
|
|
19
19
|
import { join, resolve, sep } from "node:path";
|
|
20
20
|
import { GSDError, GSD_PARSE_ERROR, GSD_STALE_STATE, GSD_LOCK_HELD, GSD_GIT_ERROR, GSD_MERGE_CONFLICT } from "./errors.js";
|
|
21
21
|
import { logWarning } from "./workflow-logger.js";
|
|
22
|
-
import { nativeBranchDelete, nativeBranchExists, nativeBranchForceReset, nativeCommit, nativeDetectMainBranch, nativeDiffContent, nativeDiffNameStatus, nativeDiffNumstat, nativeGetCurrentBranch, nativeLogOneline, nativeMergeSquash, nativeWorktreeAdd, nativeWorktreeList, nativeWorktreePrune, nativeWorktreeRemove, } from "./native-git-bridge.js";
|
|
22
|
+
import { nativeBranchDelete, nativeBranchExists, nativeBranchForceReset, nativeCommit, nativeDetectMainBranch, nativeDiffContent, nativeDiffNameStatus, nativeDiffNumstat, nativeGetCurrentBranch, nativeIsAncestor, nativeLogOneline, nativeMergeSquash, nativeWorktreeAdd, nativeWorktreeList, nativeWorktreePrune, nativeWorktreeRemove, } from "./native-git-bridge.js";
|
|
23
23
|
import { emitCanonicalRootRedirect } from "./worktree-telemetry.js";
|
|
24
24
|
// ─── Path Helpers ──────────────────────────────────────────────────────────
|
|
25
25
|
function normalizePathForComparison(path) {
|
|
@@ -171,6 +171,13 @@ export function createWorktree(basePath, name, opts = {}) {
|
|
|
171
171
|
// Use the explicit start point (e.g. integration branch) if provided,
|
|
172
172
|
// otherwise fall back to the repo's detected main branch.
|
|
173
173
|
const startPoint = opts.startPoint ?? nativeDetectMainBranch(basePath);
|
|
174
|
+
// Reject early if startPoint resolves to an empty/invalid ref. On an
|
|
175
|
+
// unborn branch (zero-commit repo) nativeDetectMainBranch returns "",
|
|
176
|
+
// which would flow into `git worktree add ... ""` and crash with
|
|
177
|
+
// `fatal: not a valid object name`. (Issue #4980 HIGH-9)
|
|
178
|
+
if (!startPoint || startPoint.length === 0) {
|
|
179
|
+
throw new GSDError(GSD_GIT_ERROR, "Repository has no commits yet (unborn branch). Make an initial commit before creating worktrees.");
|
|
180
|
+
}
|
|
174
181
|
// Check if the branch already exists (leftover from a previous worktree)
|
|
175
182
|
const branchAlreadyExists = nativeBranchExists(basePath, branch);
|
|
176
183
|
if (branchAlreadyExists) {
|
|
@@ -188,6 +195,18 @@ export function createWorktree(basePath, name, opts = {}) {
|
|
|
188
195
|
nativeWorktreeAdd(basePath, wtPath, branch);
|
|
189
196
|
}
|
|
190
197
|
else {
|
|
198
|
+
// Ancestry guard: refuse to force-reset a branch that has commits not
|
|
199
|
+
// reachable from startPoint. A crash-then-resume cycle that didn't
|
|
200
|
+
// write the resume file would silently orphan prior-session commits
|
|
201
|
+
// (recoverable from reflog for 90d, then gone — branch is also
|
|
202
|
+
// deleted at teardown). (Issue #4980 HIGH-3)
|
|
203
|
+
const branchIsAncestor = nativeIsAncestor(basePath, branch, startPoint);
|
|
204
|
+
if (!branchIsAncestor) {
|
|
205
|
+
throw new GSDError(GSD_GIT_ERROR, `Branch "${branch}" already exists with commits not reachable from "${startPoint}". ` +
|
|
206
|
+
`Refusing to force-reset — would orphan prior work. ` +
|
|
207
|
+
`If you intend to keep those commits, retry with reuseExistingBranch=true. ` +
|
|
208
|
+
`If you intend to discard, run \`git branch -D ${branch}\` manually first.`);
|
|
209
|
+
}
|
|
191
210
|
// Reset the stale branch to the start point, then attach worktree to it
|
|
192
211
|
nativeBranchForceReset(basePath, branch, startPoint);
|
|
193
212
|
nativeWorktreeAdd(basePath, wtPath, branch);
|
|
@@ -419,15 +438,22 @@ export function removeWorktree(basePath, name, opts = {}) {
|
|
|
419
438
|
// Lines starting with '+' indicate uncommitted submodule changes
|
|
420
439
|
hasSubmoduleChanges = submoduleStatus.split("\n").some((line) => line.startsWith("+") || line.startsWith("-"));
|
|
421
440
|
if (hasSubmoduleChanges) {
|
|
422
|
-
//
|
|
423
|
-
//
|
|
441
|
+
// Save submodule changes to a labeled rescue branch instead of the
|
|
442
|
+
// shared stash list. Stash is per-repo (not per-worktree), so an
|
|
443
|
+
// entry created here would appear in the user's main-tree stash
|
|
444
|
+
// list and reference paths that disappear after worktree removal.
|
|
445
|
+
// A branch persists in the shared .git refs after worktree removal
|
|
446
|
+
// and is discoverable via `git branch --list 'gsd/submodule-rescue/*'`.
|
|
447
|
+
// (Issue #4980 HIGH-11)
|
|
448
|
+
const rescueBranch = `gsd/submodule-rescue/${name}-${Date.now()}`;
|
|
424
449
|
try {
|
|
425
|
-
execFileSync("git", ["
|
|
426
|
-
|
|
450
|
+
execFileSync("git", ["add", "-A"], { cwd: resolvedWtPath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" });
|
|
451
|
+
execFileSync("git", ["commit", "-m", `gsd: rescue submodule changes from worktree ${name}`, "--allow-empty"], { cwd: resolvedWtPath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" });
|
|
452
|
+
execFileSync("git", ["branch", rescueBranch, "HEAD"], { cwd: resolvedWtPath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" });
|
|
453
|
+
logWarning("reconcile", `Saved uncommitted submodule changes to rescue branch ${rescueBranch}`, { worktree: name, path: resolvedWtPath, rescueBranch });
|
|
427
454
|
}
|
|
428
|
-
catch {
|
|
429
|
-
|
|
430
|
-
logWarning("reconcile", `Submodule changes detected — stash failed, changes may be lost during force removal`, { worktree: name, path: resolvedWtPath });
|
|
455
|
+
catch (err) {
|
|
456
|
+
logWarning("reconcile", `Submodule rescue branch creation failed — changes may be lost during force removal: ${err instanceof Error ? err.message : String(err)}`, { worktree: name, path: resolvedWtPath });
|
|
431
457
|
}
|
|
432
458
|
}
|
|
433
459
|
}
|
|
@@ -145,7 +145,9 @@ async function assertTrustedStdioServer(config, ctx, signal) {
|
|
|
145
145
|
}
|
|
146
146
|
return trustKey;
|
|
147
147
|
}
|
|
148
|
-
|
|
148
|
+
// Exported for tests (see tests/server-name-spaces.test.ts).
|
|
149
|
+
// Production call sites treat this as module-private.
|
|
150
|
+
export function getServerConfig(name) {
|
|
149
151
|
const trimmed = name.trim();
|
|
150
152
|
return readConfigs().find((s) => s.name === trimmed ||
|
|
151
153
|
s.name.toLowerCase() === trimmed.toLowerCase());
|
|
@@ -38,8 +38,12 @@ let providerRegistered = false;
|
|
|
38
38
|
/**
|
|
39
39
|
* Probe Ollama and register discovered models.
|
|
40
40
|
* Safe to call multiple times — re-discovers and re-registers.
|
|
41
|
+
*
|
|
42
|
+
* Exported for tests (see ollama-auth-mode.test.ts, ollama-status-indicator.test.ts)
|
|
43
|
+
* so a fake HTTP endpoint can drive the registration/unregistration paths.
|
|
44
|
+
* Production callers always go through the session_start handler below.
|
|
41
45
|
*/
|
|
42
|
-
async function probeAndRegister(pi) {
|
|
46
|
+
export async function probeAndRegister(pi) {
|
|
43
47
|
const running = await client.isRunning();
|
|
44
48
|
if (!running) {
|
|
45
49
|
if (providerRegistered) {
|
|
@@ -16,21 +16,27 @@ const COMMAND_POLLING_INTERVAL_MS = 5000;
|
|
|
16
16
|
*
|
|
17
17
|
* @param basePath - Project root, forwarded to command handlers (e.g. /status).
|
|
18
18
|
* @param intervalMs - Polling interval in milliseconds (default 5 s).
|
|
19
|
+
* @param deps - Test-only overrides. Omit in production.
|
|
19
20
|
* @returns A cleanup function that stops the polling interval.
|
|
20
21
|
*/
|
|
21
|
-
export function startCommandPolling(basePath, intervalMs = COMMAND_POLLING_INTERVAL_MS) {
|
|
22
|
-
const
|
|
22
|
+
export function startCommandPolling(basePath, intervalMs = COMMAND_POLLING_INTERVAL_MS, deps = {}) {
|
|
23
|
+
const resolveConfig = deps.resolveConfig ?? resolveRemoteConfig;
|
|
24
|
+
const createAdapter = deps.createAdapter ??
|
|
25
|
+
((c, b) => new TelegramAdapter(c.token, c.channelId, b));
|
|
26
|
+
const setIntervalFn = deps.setIntervalFn ?? setInterval;
|
|
27
|
+
const clearIntervalFn = deps.clearIntervalFn ?? clearInterval;
|
|
28
|
+
const config = resolveConfig();
|
|
23
29
|
if (!config || config.channel !== "telegram") {
|
|
24
30
|
// Non-Telegram channels have no command polling support — return a no-op cleanup.
|
|
25
31
|
return () => { };
|
|
26
32
|
}
|
|
27
|
-
const adapter =
|
|
28
|
-
const timer =
|
|
33
|
+
const adapter = createAdapter(config, basePath);
|
|
34
|
+
const timer = setIntervalFn(() => {
|
|
29
35
|
void adapter.pollAndHandleCommands(basePath).catch(() => {
|
|
30
36
|
// Non-fatal: network hiccup or rate-limit — best-effort polling
|
|
31
37
|
});
|
|
32
38
|
}, intervalMs);
|
|
33
|
-
return () =>
|
|
39
|
+
return () => clearIntervalFn(timer);
|
|
34
40
|
}
|
|
35
41
|
/**
|
|
36
42
|
* Check whether a remote channel is configured without triggering any
|