gsd-pi 2.67.0-dev.1cd1e0f → 2.67.0-dev.2367d7e
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/resources/extensions/claude-code-cli/stream-adapter.js +155 -70
- package/dist/resources/extensions/gsd/auto/phases.js +17 -0
- package/dist/resources/extensions/gsd/auto/session.js +10 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +12 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +1 -1
- package/dist/resources/extensions/gsd/auto-start.js +16 -30
- package/dist/resources/extensions/gsd/auto-worktree.js +62 -15
- package/dist/resources/extensions/gsd/auto.js +121 -59
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +11 -435
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +1 -4
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +7 -64
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +7 -2
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +88 -8
- package/dist/resources/extensions/gsd/commands/catalog.js +2 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +39 -25
- package/dist/resources/extensions/gsd/commands/index.js +8 -1
- package/dist/resources/extensions/gsd/commands-mcp-status.js +43 -7
- package/dist/resources/extensions/gsd/doctor-git-checks.js +4 -4
- package/dist/resources/extensions/gsd/doctor-proactive.js +3 -3
- package/dist/resources/extensions/gsd/doctor.js +8 -4
- package/dist/resources/extensions/gsd/gsd-db.js +11 -0
- package/dist/resources/extensions/gsd/guided-flow.js +56 -31
- package/dist/resources/extensions/gsd/init-wizard.js +37 -0
- package/dist/resources/extensions/gsd/interrupted-session.js +146 -0
- package/dist/resources/extensions/gsd/mcp-project-config.js +83 -0
- package/dist/resources/extensions/gsd/state.js +7 -2
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +508 -0
- package/dist/resources/extensions/gsd/workflow-logger.js +18 -3
- package/dist/resources/extensions/gsd/workflow-mcp.js +261 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +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/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
- 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/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/2826.821e01b07d92e948.js +9 -0
- package/dist/web/standalone/.next/static/chunks/app/{page-0c485498795110d6.js → page-f1e30ab6bb269149.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-b49b09f97429b5d0.js → webpack-6e4d7e9a4f57bed4.js} +1 -1
- package/package.json +4 -2
- package/packages/mcp-server/README.md +38 -0
- package/packages/mcp-server/dist/cli.d.ts +9 -0
- package/packages/mcp-server/dist/cli.d.ts.map +1 -0
- package/packages/mcp-server/dist/cli.js +58 -0
- package/packages/mcp-server/dist/cli.js.map +1 -0
- package/packages/mcp-server/dist/index.d.ts +20 -0
- package/packages/mcp-server/dist/index.d.ts.map +1 -0
- package/packages/mcp-server/dist/index.js +14 -0
- package/packages/mcp-server/dist/index.js.map +1 -0
- package/packages/mcp-server/dist/readers/captures.d.ts +25 -0
- package/packages/mcp-server/dist/readers/captures.d.ts.map +1 -0
- package/packages/mcp-server/dist/readers/captures.js +67 -0
- package/packages/mcp-server/dist/readers/captures.js.map +1 -0
- package/packages/mcp-server/dist/readers/doctor-lite.d.ts +20 -0
- package/packages/mcp-server/dist/readers/doctor-lite.d.ts.map +1 -0
- package/packages/mcp-server/dist/readers/doctor-lite.js +173 -0
- package/packages/mcp-server/dist/readers/doctor-lite.js.map +1 -0
- package/packages/mcp-server/dist/readers/index.d.ts +14 -0
- package/packages/mcp-server/dist/readers/index.d.ts.map +1 -0
- package/packages/mcp-server/dist/readers/index.js +10 -0
- package/packages/mcp-server/dist/readers/index.js.map +1 -0
- package/packages/mcp-server/dist/readers/knowledge.d.ts +18 -0
- package/packages/mcp-server/dist/readers/knowledge.d.ts.map +1 -0
- package/packages/mcp-server/dist/readers/knowledge.js +82 -0
- package/packages/mcp-server/dist/readers/knowledge.js.map +1 -0
- package/packages/mcp-server/dist/readers/metrics.d.ts +32 -0
- package/packages/mcp-server/dist/readers/metrics.d.ts.map +1 -0
- package/packages/mcp-server/dist/readers/metrics.js +74 -0
- package/packages/mcp-server/dist/readers/metrics.js.map +1 -0
- package/packages/mcp-server/dist/readers/paths.d.ts +42 -0
- package/packages/mcp-server/dist/readers/paths.d.ts.map +1 -0
- package/packages/mcp-server/dist/readers/paths.js +199 -0
- package/packages/mcp-server/dist/readers/paths.js.map +1 -0
- package/packages/mcp-server/dist/readers/roadmap.d.ts +26 -0
- package/packages/mcp-server/dist/readers/roadmap.d.ts.map +1 -0
- package/packages/mcp-server/dist/readers/roadmap.js +194 -0
- package/packages/mcp-server/dist/readers/roadmap.js.map +1 -0
- package/packages/mcp-server/dist/readers/state.d.ts +43 -0
- package/packages/mcp-server/dist/readers/state.d.ts.map +1 -0
- package/packages/mcp-server/dist/readers/state.js +184 -0
- package/packages/mcp-server/dist/readers/state.js.map +1 -0
- package/packages/mcp-server/dist/server.d.ts +28 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -0
- package/packages/mcp-server/dist/server.js +319 -0
- package/packages/mcp-server/dist/server.js.map +1 -0
- package/packages/mcp-server/dist/session-manager.d.ts +54 -0
- package/packages/mcp-server/dist/session-manager.d.ts.map +1 -0
- package/packages/mcp-server/dist/session-manager.js +284 -0
- package/packages/mcp-server/dist/session-manager.js.map +1 -0
- package/packages/mcp-server/dist/types.d.ts +61 -0
- package/packages/mcp-server/dist/types.d.ts.map +1 -0
- package/packages/mcp-server/dist/types.js +11 -0
- package/packages/mcp-server/dist/types.js.map +1 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts +9 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -0
- package/packages/mcp-server/dist/workflow-tools.js +532 -0
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -0
- package/packages/mcp-server/src/server.ts +6 -2
- package/packages/mcp-server/src/workflow-tools.test.ts +976 -0
- package/packages/mcp-server/src/workflow-tools.ts +997 -0
- package/packages/mcp-server/tsconfig.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +14 -6
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/src/agent-loop.test.ts +53 -0
- package/packages/pi-agent-core/src/agent-loop.ts +20 -6
- package/packages/pi-coding-agent/dist/core/contextual-tips.d.ts +43 -0
- package/packages/pi-coding-agent/dist/core/contextual-tips.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/contextual-tips.js +208 -0
- package/packages/pi-coding-agent/dist/core/contextual-tips.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/contextual-tips.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/contextual-tips.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/contextual-tips.test.js +227 -0
- package/packages/pi-coding-agent/dist/core/contextual-tips.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/index.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/index.js +1 -0
- package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +28 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +17 -12
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +19 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts +4 -0
- 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 +14 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +3 -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 +15 -12
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/src/core/contextual-tips.test.ts +259 -0
- package/packages/pi-coding-agent/src/core/contextual-tips.ts +232 -0
- package/packages/pi-coding-agent/src/core/index.ts +2 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +54 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +18 -12
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +21 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +19 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +19 -15
- package/packages/rpc-client/dist/index.d.ts +10 -0
- package/packages/rpc-client/dist/index.d.ts.map +1 -0
- package/packages/rpc-client/dist/index.js +9 -0
- package/packages/rpc-client/dist/index.js.map +1 -0
- package/packages/rpc-client/dist/jsonl.d.ts +17 -0
- package/packages/rpc-client/dist/jsonl.d.ts.map +1 -0
- package/packages/rpc-client/dist/jsonl.js +54 -0
- package/packages/rpc-client/dist/jsonl.js.map +1 -0
- package/packages/rpc-client/dist/rpc-client.d.ts +259 -0
- package/packages/rpc-client/dist/rpc-client.d.ts.map +1 -0
- package/packages/rpc-client/dist/rpc-client.js +541 -0
- package/packages/rpc-client/dist/rpc-client.js.map +1 -0
- package/packages/rpc-client/dist/rpc-client.test.d.ts +2 -0
- package/packages/rpc-client/dist/rpc-client.test.d.ts.map +1 -0
- package/packages/rpc-client/dist/rpc-client.test.js +477 -0
- package/packages/rpc-client/dist/rpc-client.test.js.map +1 -0
- package/packages/rpc-client/dist/rpc-types.d.ts +566 -0
- package/packages/rpc-client/dist/rpc-types.d.ts.map +1 -0
- package/packages/rpc-client/dist/rpc-types.js +12 -0
- package/packages/rpc-client/dist/rpc-types.js.map +1 -0
- package/scripts/ensure-workspace-builds.cjs +2 -0
- package/scripts/link-workspace-packages.cjs +21 -14
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +193 -93
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +173 -79
- package/src/resources/extensions/gsd/auto/phases.ts +25 -0
- package/src/resources/extensions/gsd/auto/session.ts +10 -0
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +20 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +1 -1
- package/src/resources/extensions/gsd/auto-start.ts +23 -55
- package/src/resources/extensions/gsd/auto-worktree.ts +59 -15
- package/src/resources/extensions/gsd/auto.ts +133 -64
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +22 -435
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -5
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +7 -72
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +8 -2
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +122 -6
- package/src/resources/extensions/gsd/commands/catalog.ts +2 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +53 -26
- package/src/resources/extensions/gsd/commands/index.ts +7 -1
- package/src/resources/extensions/gsd/commands-mcp-status.ts +53 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +4 -4
- package/src/resources/extensions/gsd/doctor-proactive.ts +3 -3
- package/src/resources/extensions/gsd/doctor.ts +9 -5
- package/src/resources/extensions/gsd/gsd-db.ts +12 -0
- package/src/resources/extensions/gsd/guided-flow.ts +66 -36
- package/src/resources/extensions/gsd/init-wizard.ts +40 -0
- package/src/resources/extensions/gsd/interrupted-session.ts +224 -0
- package/src/resources/extensions/gsd/mcp-project-config.ts +128 -0
- package/src/resources/extensions/gsd/state.ts +7 -1
- package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +668 -2
- package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +14 -4
- package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/core-overlay-fallback.test.ts +101 -0
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +380 -2
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/integration/doctor-fixlevel.test.ts +52 -1
- package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +2 -9
- package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +0 -33
- package/src/resources/extensions/gsd/tests/integration/merge-cwd-restore.test.ts +169 -0
- package/src/resources/extensions/gsd/tests/interrupted-session-auto.test.ts +146 -0
- package/src/resources/extensions/gsd/tests/interrupted-session-ui.test.ts +136 -0
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +11 -0
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +500 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +625 -0
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +629 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +19 -3
- package/src/resources/extensions/gsd/workflow-mcp.ts +320 -0
- package/dist/web/standalone/.next/static/chunks/6502.b804e48b7919f55e.js +0 -9
- package/packages/pi-coding-agent/dist/modes/interactive/provider-auth-setup.d.ts +0 -13
- package/packages/pi-coding-agent/dist/modes/interactive/provider-auth-setup.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/modes/interactive/provider-auth-setup.js +0 -27
- package/packages/pi-coding-agent/dist/modes/interactive/provider-auth-setup.js.map +0 -1
- package/packages/pi-coding-agent/src/modes/interactive/provider-auth-setup.ts +0 -40
- /package/dist/web/standalone/.next/static/{PHqEommYRR8CRn3i84CGM → WMDT_0C0XDkBKtsAI_AX4}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{PHqEommYRR8CRn3i84CGM → WMDT_0C0XDkBKtsAI_AX4}/_ssgManifest.js +0 -0
|
@@ -19,6 +19,11 @@ import type {
|
|
|
19
19
|
import { deriveState } from "./state.js";
|
|
20
20
|
import { parseUnitId } from "./unit-id.js";
|
|
21
21
|
import type { GSDState } from "./types.js";
|
|
22
|
+
import {
|
|
23
|
+
assessInterruptedSession,
|
|
24
|
+
readPausedSessionMetadata,
|
|
25
|
+
type InterruptedSessionAssessment,
|
|
26
|
+
} from "./interrupted-session.js";
|
|
22
27
|
import { getManifestStatus } from "./files.js";
|
|
23
28
|
export { inlinePriorMilestoneSummary } from "./files.js";
|
|
24
29
|
import { collectSecretsFromManifest } from "../get-secrets-from-user.js";
|
|
@@ -46,6 +51,7 @@ import {
|
|
|
46
51
|
clearLock,
|
|
47
52
|
readCrashLock,
|
|
48
53
|
isLockProcessAlive,
|
|
54
|
+
formatCrashInfo,
|
|
49
55
|
} from "./crash-recovery.js";
|
|
50
56
|
import {
|
|
51
57
|
acquireSessionLock,
|
|
@@ -118,6 +124,7 @@ import {
|
|
|
118
124
|
formatTokenCount,
|
|
119
125
|
} from "./metrics.js";
|
|
120
126
|
import { setLogBasePath, logWarning, logError } from "./workflow-logger.js";
|
|
127
|
+
import { homedir } from "node:os";
|
|
121
128
|
import { join } from "node:path";
|
|
122
129
|
import { readFileSync, existsSync, mkdirSync, writeFileSync, unlinkSync } from "node:fs";
|
|
123
130
|
import { atomicWriteSync } from "./atomic-write.js";
|
|
@@ -241,6 +248,29 @@ const s = new AutoSession();
|
|
|
241
248
|
/** Throttle STATE.md rebuilds — at most once per 30 seconds */
|
|
242
249
|
const STATE_REBUILD_MIN_INTERVAL_MS = 30_000;
|
|
243
250
|
|
|
251
|
+
function captureProjectRootEnv(projectRoot: string): void {
|
|
252
|
+
if (!s.projectRootEnvCaptured) {
|
|
253
|
+
s.hadProjectRootEnv = Object.prototype.hasOwnProperty.call(process.env, "GSD_PROJECT_ROOT");
|
|
254
|
+
s.previousProjectRootEnv = process.env.GSD_PROJECT_ROOT ?? null;
|
|
255
|
+
s.projectRootEnvCaptured = true;
|
|
256
|
+
}
|
|
257
|
+
process.env.GSD_PROJECT_ROOT = projectRoot;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
function restoreProjectRootEnv(): void {
|
|
261
|
+
if (!s.projectRootEnvCaptured) return;
|
|
262
|
+
|
|
263
|
+
if (s.hadProjectRootEnv && s.previousProjectRootEnv !== null) {
|
|
264
|
+
process.env.GSD_PROJECT_ROOT = s.previousProjectRootEnv;
|
|
265
|
+
} else {
|
|
266
|
+
delete process.env.GSD_PROJECT_ROOT;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
s.previousProjectRootEnv = null;
|
|
270
|
+
s.hadProjectRootEnv = false;
|
|
271
|
+
s.projectRootEnvCaptured = false;
|
|
272
|
+
}
|
|
273
|
+
|
|
244
274
|
export function shouldUseWorktreeIsolation(): boolean {
|
|
245
275
|
const prefs = loadEffectiveGSDPreferences()?.preferences?.git;
|
|
246
276
|
if (prefs?.isolation === "worktree") return true;
|
|
@@ -542,6 +572,7 @@ function handleLostSessionLock(
|
|
|
542
572
|
s.active = false;
|
|
543
573
|
s.paused = false;
|
|
544
574
|
clearUnitTimeout();
|
|
575
|
+
restoreProjectRootEnv();
|
|
545
576
|
deregisterSigtermHandler();
|
|
546
577
|
clearCmuxSidebar(loadEffectiveGSDPreferences()?.preferences);
|
|
547
578
|
const base = lockBase();
|
|
@@ -577,6 +608,7 @@ function cleanupAfterLoopExit(ctx: ExtensionContext): void {
|
|
|
577
608
|
s.currentUnit = null;
|
|
578
609
|
s.active = false;
|
|
579
610
|
clearUnitTimeout();
|
|
611
|
+
restoreProjectRootEnv();
|
|
580
612
|
|
|
581
613
|
// Clear crash lock and release session lock so the next `/gsd next` does
|
|
582
614
|
// not see a stale lock with the current PID and treat it as a "remote"
|
|
@@ -846,6 +878,7 @@ export async function stopAuto(
|
|
|
846
878
|
ctx?.ui.setStatus("gsd-auto", undefined);
|
|
847
879
|
ctx?.ui.setWidget("gsd-progress", undefined);
|
|
848
880
|
ctx?.ui.setFooter(undefined);
|
|
881
|
+
restoreProjectRootEnv();
|
|
849
882
|
|
|
850
883
|
// Reset all session state in one call
|
|
851
884
|
s.reset();
|
|
@@ -894,6 +927,8 @@ export async function pauseAuto(
|
|
|
894
927
|
stepMode: s.stepMode,
|
|
895
928
|
pausedAt: new Date().toISOString(),
|
|
896
929
|
sessionFile: s.pausedSessionFile,
|
|
930
|
+
unitType: s.currentUnit?.type ?? undefined,
|
|
931
|
+
unitId: s.currentUnit?.id ?? undefined,
|
|
897
932
|
activeEngineId: s.activeEngineId,
|
|
898
933
|
activeRunDir: s.activeRunDir,
|
|
899
934
|
autoStartTime: s.autoStartTime,
|
|
@@ -934,6 +969,7 @@ export async function pauseAuto(
|
|
|
934
969
|
|
|
935
970
|
s.active = false;
|
|
936
971
|
s.paused = true;
|
|
972
|
+
restoreProjectRootEnv();
|
|
937
973
|
s.pendingVerificationRetry = null;
|
|
938
974
|
s.verificationRetryCount.clear();
|
|
939
975
|
ctx?.ui.setStatus("gsd-auto", "paused");
|
|
@@ -1114,7 +1150,10 @@ export async function startAuto(
|
|
|
1114
1150
|
pi: ExtensionAPI,
|
|
1115
1151
|
base: string,
|
|
1116
1152
|
verboseMode: boolean,
|
|
1117
|
-
options?: {
|
|
1153
|
+
options?: {
|
|
1154
|
+
step?: boolean;
|
|
1155
|
+
interrupted?: InterruptedSessionAssessment;
|
|
1156
|
+
},
|
|
1118
1157
|
): Promise<void> {
|
|
1119
1158
|
if (s.active) {
|
|
1120
1159
|
debugLog("startAuto", { phase: "already-active", skipping: true });
|
|
@@ -1122,41 +1161,60 @@ export async function startAuto(
|
|
|
1122
1161
|
}
|
|
1123
1162
|
|
|
1124
1163
|
const requestedStepMode = options?.step ?? false;
|
|
1164
|
+
const interruptedAssessment = options?.interrupted ?? null;
|
|
1125
1165
|
|
|
1126
1166
|
// Escape stale worktree cwd from a previous milestone (#608).
|
|
1127
1167
|
base = escapeStaleWorktree(base);
|
|
1128
1168
|
|
|
1169
|
+
const freshStartAssessment = interruptedAssessment
|
|
1170
|
+
?? await assessInterruptedSession(base);
|
|
1171
|
+
|
|
1172
|
+
if (freshStartAssessment.classification === "running") {
|
|
1173
|
+
const pid = freshStartAssessment.lock?.pid;
|
|
1174
|
+
ctx.ui.notify(
|
|
1175
|
+
pid
|
|
1176
|
+
? `Another auto-mode session (PID ${pid}) appears to be running.\nStop it with \`kill ${pid}\` before starting a new session.`
|
|
1177
|
+
: "Another auto-mode session appears to be running.",
|
|
1178
|
+
"error",
|
|
1179
|
+
);
|
|
1180
|
+
return;
|
|
1181
|
+
}
|
|
1182
|
+
|
|
1129
1183
|
// If resuming from paused state, just re-activate and dispatch next unit.
|
|
1130
1184
|
// Check persisted paused-session first (#1383) — survives /exit.
|
|
1131
1185
|
if (!s.paused) {
|
|
1132
1186
|
try {
|
|
1187
|
+
const meta = freshStartAssessment.pausedSession ?? readPausedSessionMetadata(base);
|
|
1133
1188
|
const pausedPath = join(gsdRoot(base), "runtime", "paused-session.json");
|
|
1134
|
-
if (
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1189
|
+
if (meta?.activeEngineId && meta.activeEngineId !== "dev") {
|
|
1190
|
+
// Custom workflow resume — restore engine state
|
|
1191
|
+
s.activeEngineId = meta.activeEngineId;
|
|
1192
|
+
s.activeRunDir = meta.activeRunDir ?? null;
|
|
1193
|
+
s.originalBasePath = meta.originalBasePath || base;
|
|
1194
|
+
s.stepMode = meta.stepMode ?? requestedStepMode;
|
|
1195
|
+
s.autoStartTime = meta.autoStartTime || Date.now();
|
|
1196
|
+
s.paused = true;
|
|
1197
|
+
try { unlinkSync(pausedPath); } catch (e) { logWarning("session", `pause file cleanup failed: ${e instanceof Error ? e.message : String(e)}`, { file: "auto.ts" }); }
|
|
1198
|
+
ctx.ui.notify(
|
|
1199
|
+
`Resuming paused custom workflow${meta.activeRunDir ? ` (${meta.activeRunDir})` : ""}.`,
|
|
1200
|
+
"info",
|
|
1201
|
+
);
|
|
1202
|
+
} else if (meta?.milestoneId) {
|
|
1203
|
+
const shouldResumePausedSession =
|
|
1204
|
+
freshStartAssessment.classification === "recoverable"
|
|
1205
|
+
&& (
|
|
1206
|
+
freshStartAssessment.hasResumableDiskState
|
|
1207
|
+
|| !!freshStartAssessment.recoveryPrompt
|
|
1208
|
+
|| !!freshStartAssessment.lock
|
|
1150
1209
|
);
|
|
1151
|
-
|
|
1210
|
+
if (shouldResumePausedSession) {
|
|
1152
1211
|
// Validate the milestone still exists and isn't already complete (#1664).
|
|
1153
1212
|
const mDir = resolveMilestonePath(base, meta.milestoneId);
|
|
1154
1213
|
const summaryFile = resolveMilestoneFile(base, meta.milestoneId, "SUMMARY");
|
|
1155
1214
|
if (!mDir || summaryFile) {
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
}
|
|
1215
|
+
try { unlinkSync(pausedPath); } catch (err) {
|
|
1216
|
+
logWarning("session", `pause file cleanup failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
|
|
1217
|
+
}
|
|
1160
1218
|
ctx.ui.notify(
|
|
1161
1219
|
`Paused milestone ${meta.milestoneId} is ${!mDir ? "missing" : "already complete"}. Starting fresh.`,
|
|
1162
1220
|
"info",
|
|
@@ -1165,22 +1223,54 @@ export async function startAuto(
|
|
|
1165
1223
|
s.currentMilestoneId = meta.milestoneId;
|
|
1166
1224
|
s.originalBasePath = meta.originalBasePath || base;
|
|
1167
1225
|
s.stepMode = meta.stepMode ?? requestedStepMode;
|
|
1226
|
+
s.pausedSessionFile = meta.sessionFile ?? null;
|
|
1227
|
+
s.pausedUnitType = meta.unitType ?? null;
|
|
1228
|
+
s.pausedUnitId = meta.unitId ?? null;
|
|
1168
1229
|
s.autoStartTime = meta.autoStartTime || Date.now();
|
|
1169
1230
|
s.paused = true;
|
|
1170
|
-
|
|
1171
|
-
// If lock fails, the file must survive for retry.
|
|
1172
|
-
s.pausedSessionFile = pausedPath;
|
|
1231
|
+
try { unlinkSync(pausedPath); } catch (e) { logWarning("session", `pause file cleanup failed: ${e instanceof Error ? e.message : String(e)}`, { file: "auto.ts" }); }
|
|
1173
1232
|
ctx.ui.notify(
|
|
1174
|
-
`Resuming paused session for ${meta.milestoneId}${meta.worktreePath ? ` (worktree)` : ""}.`,
|
|
1233
|
+
`Resuming paused session for ${meta.milestoneId}${meta.worktreePath && existsSync(meta.worktreePath) ? ` (worktree)` : ""}.`,
|
|
1175
1234
|
"info",
|
|
1176
1235
|
);
|
|
1177
1236
|
}
|
|
1237
|
+
} else if (existsSync(pausedPath)) {
|
|
1238
|
+
try { unlinkSync(pausedPath); } catch (e) { logWarning("session", `stale pause file cleanup failed: ${e instanceof Error ? e.message : String(e)}`, { file: "auto.ts" }); }
|
|
1178
1239
|
}
|
|
1179
1240
|
}
|
|
1180
1241
|
} catch (err) {
|
|
1181
1242
|
// Malformed or missing — proceed with fresh bootstrap
|
|
1182
1243
|
logWarning("session", `paused-session restore failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
|
|
1183
1244
|
}
|
|
1245
|
+
// Guard against zero/missing autoStartTime after resume (#3585)
|
|
1246
|
+
if (!s.autoStartTime || s.autoStartTime <= 0) s.autoStartTime = Date.now();
|
|
1247
|
+
}
|
|
1248
|
+
|
|
1249
|
+
if (!s.paused) {
|
|
1250
|
+
s.stepMode = requestedStepMode;
|
|
1251
|
+
}
|
|
1252
|
+
|
|
1253
|
+
if (freshStartAssessment.lock) {
|
|
1254
|
+
clearLock(base);
|
|
1255
|
+
}
|
|
1256
|
+
|
|
1257
|
+
if (!s.paused) {
|
|
1258
|
+
s.pendingCrashRecovery =
|
|
1259
|
+
freshStartAssessment.classification === "recoverable"
|
|
1260
|
+
? freshStartAssessment.recoveryPrompt
|
|
1261
|
+
: null;
|
|
1262
|
+
|
|
1263
|
+
if (freshStartAssessment.classification === "recoverable" && freshStartAssessment.lock) {
|
|
1264
|
+
const info = formatCrashInfo(freshStartAssessment.lock);
|
|
1265
|
+
if (freshStartAssessment.recoveryToolCallCount > 0) {
|
|
1266
|
+
ctx.ui.notify(
|
|
1267
|
+
`${info}\nRecovered ${freshStartAssessment.recoveryToolCallCount} tool calls from crashed session. Resuming with full context.`,
|
|
1268
|
+
"warning",
|
|
1269
|
+
);
|
|
1270
|
+
} else if (freshStartAssessment.hasResumableDiskState) {
|
|
1271
|
+
ctx.ui.notify(`${info}\nResuming from disk state.`, "warning");
|
|
1272
|
+
}
|
|
1273
|
+
}
|
|
1184
1274
|
}
|
|
1185
1275
|
|
|
1186
1276
|
if (s.paused) {
|
|
@@ -1205,26 +1295,19 @@ export async function startAuto(
|
|
|
1205
1295
|
s.active = true;
|
|
1206
1296
|
s.verbose = verboseMode;
|
|
1207
1297
|
s.stepMode = requestedStepMode;
|
|
1208
|
-
|
|
1209
|
-
// when resuming from a provider-error pause. The resume callback receives
|
|
1210
|
-
// an ExtensionContext (from the agent_end hook) which lacks newSession —
|
|
1211
|
-
// using it would crash runUnit with "newSession is not a function".
|
|
1212
|
-
// Only override if the new ctx actually has newSession (user-initiated resume).
|
|
1213
|
-
if ("newSession" in ctx && typeof (ctx as any).newSession === "function") {
|
|
1214
|
-
s.cmdCtx = ctx;
|
|
1215
|
-
} else if (!s.cmdCtx) {
|
|
1216
|
-
// No saved cmdCtx — this shouldn't happen, but handle gracefully
|
|
1217
|
-
s.cmdCtx = ctx as ExtensionCommandContext;
|
|
1218
|
-
}
|
|
1219
|
-
// else: keep existing s.cmdCtx which has the real newSession
|
|
1298
|
+
s.cmdCtx = ctx;
|
|
1220
1299
|
s.basePath = base;
|
|
1221
|
-
setLogBasePath(base);
|
|
1222
|
-
if (!s.autoStartTime || s.autoStartTime <= 0) s.autoStartTime = Date.now();
|
|
1223
1300
|
s.unitDispatchCount.clear();
|
|
1224
1301
|
s.unitLifetimeDispatches.clear();
|
|
1225
1302
|
if (!getLedger()) initMetrics(base);
|
|
1226
1303
|
if (s.currentMilestoneId) setActiveMilestoneId(base, s.currentMilestoneId);
|
|
1227
1304
|
|
|
1305
|
+
// Re-register health level notification callback lost across process restart
|
|
1306
|
+
setLevelChangeCallback((_from, to, summary) => {
|
|
1307
|
+
const level = to === "red" ? "error" : to === "yellow" ? "warning" : "info";
|
|
1308
|
+
ctx.ui.notify(summary, level as "info" | "warning" | "error");
|
|
1309
|
+
});
|
|
1310
|
+
|
|
1228
1311
|
// ── Auto-worktree: re-enter worktree on resume ──
|
|
1229
1312
|
if (
|
|
1230
1313
|
s.currentMilestoneId &&
|
|
@@ -1248,6 +1331,11 @@ export async function startAuto(
|
|
|
1248
1331
|
"info",
|
|
1249
1332
|
);
|
|
1250
1333
|
restoreHookState(s.basePath);
|
|
1334
|
+
// Re-sync managed resources on resume so long-lived auto sessions pick up
|
|
1335
|
+
// bundled extension updates before resume-time verification/state logic runs.
|
|
1336
|
+
const agentDir = process.env.GSD_CODING_AGENT_DIR || join(process.env.GSD_HOME || homedir(), ".gsd", "agent");
|
|
1337
|
+
const { initResources } = await import("../../../" + "resource-loader.js");
|
|
1338
|
+
initResources(agentDir);
|
|
1251
1339
|
// Open the project DB before rebuild/derive so resume uses DB-backed
|
|
1252
1340
|
// state instead of falling back to stale markdown parsing (#2940).
|
|
1253
1341
|
await openProjectDbIfPresent(s.basePath);
|
|
@@ -1278,8 +1366,8 @@ export async function startAuto(
|
|
|
1278
1366
|
const activityDir = join(gsdRoot(s.basePath), "activity");
|
|
1279
1367
|
const recovery = synthesizeCrashRecovery(
|
|
1280
1368
|
s.basePath,
|
|
1281
|
-
s.currentUnit?.type ?? "unknown",
|
|
1282
|
-
s.currentUnit?.id ?? "unknown",
|
|
1369
|
+
s.currentUnit?.type ?? s.pausedUnitType ?? "unknown",
|
|
1370
|
+
s.currentUnit?.id ?? s.pausedUnitId ?? "unknown",
|
|
1283
1371
|
s.pausedSessionFile ?? undefined,
|
|
1284
1372
|
activityDir,
|
|
1285
1373
|
);
|
|
@@ -1305,6 +1393,7 @@ export async function startAuto(
|
|
|
1305
1393
|
);
|
|
1306
1394
|
logCmuxEvent(loadEffectiveGSDPreferences()?.preferences, s.stepMode ? "Step-mode resumed." : "Auto-mode resumed.", "progress");
|
|
1307
1395
|
|
|
1396
|
+
captureProjectRootEnv(s.originalBasePath || s.basePath);
|
|
1308
1397
|
await autoLoop(ctx, pi, s, buildLoopDeps());
|
|
1309
1398
|
cleanupAfterLoopExit(ctx);
|
|
1310
1399
|
return;
|
|
@@ -1326,9 +1415,11 @@ export async function startAuto(
|
|
|
1326
1415
|
verboseMode,
|
|
1327
1416
|
requestedStepMode,
|
|
1328
1417
|
bootstrapDeps,
|
|
1418
|
+
freshStartAssessment,
|
|
1329
1419
|
);
|
|
1330
1420
|
if (!ready) return;
|
|
1331
1421
|
|
|
1422
|
+
captureProjectRootEnv(s.originalBasePath || s.basePath);
|
|
1332
1423
|
try {
|
|
1333
1424
|
syncCmuxSidebar(loadEffectiveGSDPreferences()?.preferences, await deriveState(s.basePath));
|
|
1334
1425
|
} catch (err) {
|
|
@@ -1438,27 +1529,6 @@ function ensurePreconditions(
|
|
|
1438
1529
|
}
|
|
1439
1530
|
}
|
|
1440
1531
|
|
|
1441
|
-
// ─── Diagnostics ──────────────────────────────────────────────────────────────
|
|
1442
|
-
|
|
1443
|
-
/** Build recovery context from module state for recoverTimedOutUnit */
|
|
1444
|
-
function buildRecoveryContext(): import("./auto-timeout-recovery.js").RecoveryContext {
|
|
1445
|
-
return {
|
|
1446
|
-
basePath: s.basePath,
|
|
1447
|
-
verbose: s.verbose,
|
|
1448
|
-
currentUnitStartedAt: s.currentUnit?.startedAt ?? Date.now(),
|
|
1449
|
-
unitRecoveryCount: s.unitRecoveryCount,
|
|
1450
|
-
};
|
|
1451
|
-
}
|
|
1452
|
-
|
|
1453
|
-
/**
|
|
1454
|
-
* Test-only: expose skip-loop state for unit tests.
|
|
1455
|
-
* Not part of the public API.
|
|
1456
|
-
*/
|
|
1457
|
-
|
|
1458
|
-
/**
|
|
1459
|
-
* Dispatch a hook unit directly, bypassing normal pre-dispatch hooks.
|
|
1460
|
-
* Used for manual hook triggers via /gsd run-hook.
|
|
1461
|
-
*/
|
|
1462
1532
|
export async function dispatchHookUnit(
|
|
1463
1533
|
ctx: ExtensionContext,
|
|
1464
1534
|
pi: ExtensionAPI,
|
|
@@ -1569,4 +1639,3 @@ export {
|
|
|
1569
1639
|
buildLoopRemediationSteps,
|
|
1570
1640
|
} from "./auto-recovery.js";
|
|
1571
1641
|
export { resolveExpectedArtifactPath } from "./auto-artifact-paths.js";
|
|
1572
|
-
|