gsd-pi 2.37.1 → 2.38.0-dev.29edcdc
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/app-paths.js +1 -1
- package/dist/cli.js +9 -0
- package/dist/extension-discovery.d.ts +5 -3
- package/dist/extension-discovery.js +14 -9
- package/dist/extension-registry.js +2 -2
- package/dist/onboarding.js +1 -0
- package/dist/remote-questions-config.js +2 -2
- package/dist/resource-loader.js +34 -1
- package/dist/resources/extensions/browser-tools/package.json +3 -1
- package/dist/resources/extensions/cmux/index.js +55 -1
- package/dist/resources/extensions/context7/package.json +1 -1
- package/dist/resources/extensions/env-utils.js +29 -0
- package/dist/resources/extensions/get-secrets-from-user.js +5 -24
- package/dist/resources/extensions/github-sync/cli.js +284 -0
- package/dist/resources/extensions/github-sync/index.js +73 -0
- package/dist/resources/extensions/github-sync/mapping.js +67 -0
- package/dist/resources/extensions/github-sync/sync.js +424 -0
- package/dist/resources/extensions/github-sync/templates.js +118 -0
- package/dist/resources/extensions/github-sync/types.js +7 -0
- package/dist/resources/extensions/google-search/package.json +3 -1
- package/dist/resources/extensions/gsd/auto/session.js +6 -23
- package/dist/resources/extensions/gsd/auto-dispatch.js +75 -10
- package/dist/resources/extensions/gsd/auto-loop.js +597 -588
- package/dist/resources/extensions/gsd/auto-post-unit.js +111 -68
- package/dist/resources/extensions/gsd/auto-prompts.js +114 -45
- package/dist/resources/extensions/gsd/auto-recovery.js +37 -1
- package/dist/resources/extensions/gsd/auto-start.js +13 -2
- package/dist/resources/extensions/gsd/auto-worktree-sync.js +13 -5
- package/dist/resources/extensions/gsd/auto-worktree.js +3 -3
- package/dist/resources/extensions/gsd/auto.js +143 -96
- package/dist/resources/extensions/gsd/captures.js +9 -1
- package/dist/resources/extensions/gsd/commands-extensions.js +3 -2
- package/dist/resources/extensions/gsd/commands-handlers.js +16 -3
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +1 -1
- package/dist/resources/extensions/gsd/commands.js +24 -3
- package/dist/resources/extensions/gsd/context-budget.js +2 -10
- package/dist/resources/extensions/gsd/detection.js +1 -2
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +0 -2
- package/dist/resources/extensions/gsd/doctor-checks.js +82 -0
- package/dist/resources/extensions/gsd/doctor-environment.js +78 -0
- package/dist/resources/extensions/gsd/doctor-format.js +15 -0
- package/dist/resources/extensions/gsd/doctor-providers.js +62 -12
- package/dist/resources/extensions/gsd/doctor.js +204 -12
- package/dist/resources/extensions/gsd/exit-command.js +2 -1
- package/dist/resources/extensions/gsd/export.js +1 -1
- package/dist/resources/extensions/gsd/files.js +47 -2
- package/dist/resources/extensions/gsd/forensics.js +1 -1
- package/dist/resources/extensions/gsd/git-service.js +15 -12
- package/dist/resources/extensions/gsd/guided-flow.js +82 -32
- package/dist/resources/extensions/gsd/index.js +24 -20
- package/dist/resources/extensions/gsd/migrate/parsers.js +1 -1
- package/dist/resources/extensions/gsd/native-git-bridge.js +37 -0
- package/dist/resources/extensions/gsd/observability-validator.js +24 -0
- package/dist/resources/extensions/gsd/package.json +1 -1
- package/dist/resources/extensions/gsd/preferences-models.js +0 -12
- package/dist/resources/extensions/gsd/preferences-types.js +3 -2
- package/dist/resources/extensions/gsd/preferences-validation.js +101 -11
- package/dist/resources/extensions/gsd/preferences.js +8 -5
- package/dist/resources/extensions/gsd/prompts/discuss.md +11 -14
- package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -2
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +11 -12
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +8 -10
- package/dist/resources/extensions/gsd/prompts/guided-resume-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -1
- package/dist/resources/extensions/gsd/prompts/queue.md +4 -8
- package/dist/resources/extensions/gsd/prompts/reactive-execute.md +44 -0
- package/dist/resources/extensions/gsd/prompts/run-uat.md +27 -10
- package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -2
- package/dist/resources/extensions/gsd/reactive-graph.js +227 -0
- package/dist/resources/extensions/gsd/repo-identity.js +21 -4
- package/dist/resources/extensions/gsd/resource-version.js +2 -1
- package/dist/resources/extensions/gsd/roadmap-mutations.js +24 -0
- package/dist/resources/extensions/gsd/state.js +1 -1
- package/dist/resources/extensions/gsd/templates/task-plan.md +11 -3
- package/dist/resources/extensions/gsd/visualizer-data.js +1 -1
- package/dist/resources/extensions/gsd/worktree.js +35 -16
- package/dist/resources/extensions/mcp-client/index.js +14 -1
- package/dist/resources/extensions/remote-questions/status.js +2 -1
- package/dist/resources/extensions/remote-questions/store.js +2 -1
- package/dist/resources/extensions/search-the-web/provider.js +2 -1
- package/dist/resources/extensions/subagent/index.js +12 -3
- package/dist/resources/extensions/subagent/isolation.js +2 -1
- package/dist/resources/extensions/ttsr/rule-loader.js +2 -1
- package/dist/resources/extensions/universal-config/package.json +1 -1
- package/dist/welcome-screen.d.ts +12 -0
- package/dist/welcome-screen.js +53 -0
- package/package.json +2 -1
- package/packages/pi-ai/dist/env-api-keys.js +13 -0
- package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +172 -0
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +172 -0
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts +64 -0
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/anthropic-shared.js +668 -0
- package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -0
- package/packages/pi-ai/dist/providers/anthropic-vertex.d.ts +5 -0
- package/packages/pi-ai/dist/providers/anthropic-vertex.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/anthropic-vertex.js +85 -0
- package/packages/pi-ai/dist/providers/anthropic-vertex.js.map +1 -0
- package/packages/pi-ai/dist/providers/anthropic.d.ts +4 -30
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +47 -764
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/register-builtins.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/register-builtins.js +6 -0
- package/packages/pi-ai/dist/providers/register-builtins.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +2 -2
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/anthropic.js +2 -2
- package/packages/pi-ai/dist/utils/oauth/anthropic.js.map +1 -1
- package/packages/pi-ai/package.json +1 -0
- package/packages/pi-ai/src/env-api-keys.ts +14 -0
- package/packages/pi-ai/src/models.generated.ts +172 -0
- package/packages/pi-ai/src/providers/anthropic-shared.ts +761 -0
- package/packages/pi-ai/src/providers/anthropic-vertex.ts +130 -0
- package/packages/pi-ai/src/providers/anthropic.ts +76 -868
- package/packages/pi-ai/src/providers/register-builtins.ts +7 -0
- package/packages/pi-ai/src/types.ts +2 -0
- package/packages/pi-ai/src/utils/oauth/anthropic.ts +2 -2
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +205 -7
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-manager.js +8 -4
- package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +223 -7
- package/packages/pi-coding-agent/src/core/model-resolver.ts +1 -0
- package/packages/pi-coding-agent/src/core/package-manager.ts +8 -4
- package/pkg/package.json +1 -1
- package/src/resources/extensions/cmux/index.ts +57 -1
- package/src/resources/extensions/env-utils.ts +31 -0
- package/src/resources/extensions/get-secrets-from-user.ts +5 -24
- package/src/resources/extensions/github-sync/cli.ts +364 -0
- package/src/resources/extensions/github-sync/index.ts +93 -0
- package/src/resources/extensions/github-sync/mapping.ts +81 -0
- package/src/resources/extensions/github-sync/sync.ts +556 -0
- package/src/resources/extensions/github-sync/templates.ts +183 -0
- package/src/resources/extensions/github-sync/tests/cli.test.ts +20 -0
- package/src/resources/extensions/github-sync/tests/commit-linking.test.ts +39 -0
- package/src/resources/extensions/github-sync/tests/mapping.test.ts +104 -0
- package/src/resources/extensions/github-sync/tests/templates.test.ts +110 -0
- package/src/resources/extensions/github-sync/types.ts +47 -0
- package/src/resources/extensions/gsd/auto/session.ts +7 -25
- package/src/resources/extensions/gsd/auto-dispatch.ts +100 -9
- package/src/resources/extensions/gsd/auto-loop.ts +484 -546
- package/src/resources/extensions/gsd/auto-post-unit.ts +92 -42
- package/src/resources/extensions/gsd/auto-prompts.ts +150 -48
- package/src/resources/extensions/gsd/auto-recovery.ts +42 -0
- package/src/resources/extensions/gsd/auto-start.ts +18 -2
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +15 -4
- package/src/resources/extensions/gsd/auto-worktree.ts +3 -3
- package/src/resources/extensions/gsd/auto.ts +139 -101
- package/src/resources/extensions/gsd/captures.ts +10 -1
- package/src/resources/extensions/gsd/commands-extensions.ts +4 -2
- package/src/resources/extensions/gsd/commands-handlers.ts +17 -2
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1 -1
- package/src/resources/extensions/gsd/commands.ts +26 -4
- package/src/resources/extensions/gsd/context-budget.ts +2 -12
- package/src/resources/extensions/gsd/detection.ts +2 -2
- package/src/resources/extensions/gsd/docs/preferences-reference.md +0 -2
- package/src/resources/extensions/gsd/doctor-checks.ts +75 -0
- package/src/resources/extensions/gsd/doctor-environment.ts +82 -1
- package/src/resources/extensions/gsd/doctor-format.ts +20 -0
- package/src/resources/extensions/gsd/doctor-providers.ts +64 -10
- package/src/resources/extensions/gsd/doctor-types.ts +16 -1
- package/src/resources/extensions/gsd/doctor.ts +199 -14
- package/src/resources/extensions/gsd/exit-command.ts +2 -2
- package/src/resources/extensions/gsd/export.ts +1 -1
- package/src/resources/extensions/gsd/files.ts +50 -3
- package/src/resources/extensions/gsd/forensics.ts +1 -1
- package/src/resources/extensions/gsd/git-service.ts +20 -10
- package/src/resources/extensions/gsd/guided-flow.ts +110 -38
- package/src/resources/extensions/gsd/index.ts +24 -17
- package/src/resources/extensions/gsd/migrate/parsers.ts +1 -1
- package/src/resources/extensions/gsd/native-git-bridge.ts +37 -0
- package/src/resources/extensions/gsd/observability-validator.ts +27 -0
- package/src/resources/extensions/gsd/preferences-models.ts +0 -12
- package/src/resources/extensions/gsd/preferences-types.ts +9 -5
- package/src/resources/extensions/gsd/preferences-validation.ts +92 -11
- package/src/resources/extensions/gsd/preferences.ts +8 -5
- package/src/resources/extensions/gsd/prompts/discuss.md +11 -14
- package/src/resources/extensions/gsd/prompts/execute-task.md +2 -2
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +11 -12
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +8 -10
- package/src/resources/extensions/gsd/prompts/guided-resume-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -1
- package/src/resources/extensions/gsd/prompts/queue.md +4 -8
- package/src/resources/extensions/gsd/prompts/reactive-execute.md +44 -0
- package/src/resources/extensions/gsd/prompts/run-uat.md +27 -10
- package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -2
- package/src/resources/extensions/gsd/reactive-graph.ts +289 -0
- package/src/resources/extensions/gsd/repo-identity.ts +23 -4
- package/src/resources/extensions/gsd/resource-version.ts +3 -1
- package/src/resources/extensions/gsd/roadmap-mutations.ts +29 -0
- package/src/resources/extensions/gsd/state.ts +1 -1
- package/src/resources/extensions/gsd/templates/task-plan.md +11 -3
- package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +21 -18
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +122 -68
- package/src/resources/extensions/gsd/tests/cmux.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +266 -0
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +191 -3
- package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +111 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +2 -7
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +511 -0
- package/src/resources/extensions/gsd/tests/reactive-graph.test.ts +299 -0
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +21 -1
- package/src/resources/extensions/gsd/tests/run-uat.test.ts +11 -3
- package/src/resources/extensions/gsd/tests/worktree.test.ts +47 -0
- package/src/resources/extensions/gsd/types.ts +43 -1
- package/src/resources/extensions/gsd/visualizer-data.ts +1 -1
- package/src/resources/extensions/gsd/worktree.ts +35 -15
- package/src/resources/extensions/mcp-client/index.ts +17 -1
- package/src/resources/extensions/remote-questions/status.ts +3 -1
- package/src/resources/extensions/remote-questions/store.ts +3 -1
- package/src/resources/extensions/search-the-web/provider.ts +2 -1
- package/src/resources/extensions/subagent/index.ts +12 -3
- package/src/resources/extensions/subagent/isolation.ts +3 -1
- package/src/resources/extensions/ttsr/rule-loader.ts +3 -1
- package/dist/resources/extensions/gsd/prompt-compressor.js +0 -393
- package/dist/resources/extensions/gsd/semantic-chunker.js +0 -254
- package/dist/resources/extensions/gsd/summary-distiller.js +0 -212
- package/src/resources/extensions/gsd/prompt-compressor.ts +0 -508
- package/src/resources/extensions/gsd/semantic-chunker.ts +0 -336
- package/src/resources/extensions/gsd/summary-distiller.ts +0 -258
- package/src/resources/extensions/gsd/tests/context-compression.test.ts +0 -193
- package/src/resources/extensions/gsd/tests/prompt-compressor.test.ts +0 -529
- package/src/resources/extensions/gsd/tests/semantic-chunker.test.ts +0 -426
- package/src/resources/extensions/gsd/tests/summary-distiller.test.ts +0 -323
- package/src/resources/extensions/gsd/tests/token-optimization-benchmark.test.ts +0 -1272
- package/src/resources/extensions/gsd/tests/token-optimization-prefs.test.ts +0 -164
|
@@ -60,6 +60,8 @@ export class AutoSession {
|
|
|
60
60
|
lastStateRebuildAt = 0;
|
|
61
61
|
// ── Sidecar queue ─────────────────────────────────────────────────────
|
|
62
62
|
sidecarQueue = [];
|
|
63
|
+
// ── Dispatch circuit breakers ──────────────────────────────────────
|
|
64
|
+
rewriteAttemptCount = 0;
|
|
63
65
|
// ── Metrics ──────────────────────────────────────────────────────────────
|
|
64
66
|
autoStartTime = 0;
|
|
65
67
|
lastPromptCharCount;
|
|
@@ -68,25 +70,8 @@ export class AutoSession {
|
|
|
68
70
|
// ── Signal handler ───────────────────────────────────────────────────────
|
|
69
71
|
sigtermHandler = null;
|
|
70
72
|
// ── Loop promise state ──────────────────────────────────────────────────
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
* emitted from the previous session's abort during this window must be
|
|
74
|
-
* ignored; they do not belong to the new unit.
|
|
75
|
-
*/
|
|
76
|
-
sessionSwitchInFlight = false;
|
|
77
|
-
/**
|
|
78
|
-
* One-shot resolver for the current unit's agent_end promise.
|
|
79
|
-
* Non-null only while a unit is in-flight (between sendMessage and agent_end).
|
|
80
|
-
* Scoped to the session to prevent concurrent session corruption.
|
|
81
|
-
*/
|
|
82
|
-
pendingResolve = null;
|
|
83
|
-
/**
|
|
84
|
-
* Queue for agent_end events that arrive when no pendingResolve exists.
|
|
85
|
-
* This happens when error-recovery sendMessage retries produce agent_end
|
|
86
|
-
* events between loop iterations. The next runUnit drains this queue
|
|
87
|
-
* instead of waiting for a new event.
|
|
88
|
-
*/
|
|
89
|
-
pendingAgentEndQueue = [];
|
|
73
|
+
// Per-unit resolve function and session-switch guard live at module level
|
|
74
|
+
// in auto-loop.ts (_currentResolve, _sessionSwitchInFlight).
|
|
90
75
|
// ── Methods ──────────────────────────────────────────────────────────────
|
|
91
76
|
clearTimers() {
|
|
92
77
|
if (this.unitTimeoutHandle) {
|
|
@@ -160,12 +145,10 @@ export class AutoSession {
|
|
|
160
145
|
this.lastBaselineCharCount = undefined;
|
|
161
146
|
this.pendingQuickTasks = [];
|
|
162
147
|
this.sidecarQueue = [];
|
|
148
|
+
this.rewriteAttemptCount = 0;
|
|
163
149
|
// Signal handler
|
|
164
150
|
this.sigtermHandler = null;
|
|
165
|
-
// Loop promise state
|
|
166
|
-
this.sessionSwitchInFlight = false;
|
|
167
|
-
this.pendingResolve = null;
|
|
168
|
-
this.pendingAgentEndQueue = [];
|
|
151
|
+
// Loop promise state lives in auto-loop.ts module scope
|
|
169
152
|
}
|
|
170
153
|
toJSON() {
|
|
171
154
|
return {
|
|
@@ -12,7 +12,7 @@ import { loadFile, loadActiveOverrides, parseRoadmap } from "./files.js";
|
|
|
12
12
|
import { resolveMilestoneFile, resolveMilestonePath, resolveSliceFile, resolveTaskFile, relSliceFile, buildMilestoneFileName, } from "./paths.js";
|
|
13
13
|
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
14
14
|
import { join } from "node:path";
|
|
15
|
-
import { buildResearchMilestonePrompt, buildPlanMilestonePrompt, buildResearchSlicePrompt, buildPlanSlicePrompt, buildExecuteTaskPrompt, buildCompleteSlicePrompt, buildCompleteMilestonePrompt, buildValidateMilestonePrompt, buildReplanSlicePrompt, buildRunUatPrompt, buildReassessRoadmapPrompt, buildRewriteDocsPrompt, checkNeedsReassessment, checkNeedsRunUat, } from "./auto-prompts.js";
|
|
15
|
+
import { buildResearchMilestonePrompt, buildPlanMilestonePrompt, buildResearchSlicePrompt, buildPlanSlicePrompt, buildExecuteTaskPrompt, buildCompleteSlicePrompt, buildCompleteMilestonePrompt, buildValidateMilestonePrompt, buildReplanSlicePrompt, buildRunUatPrompt, buildReassessRoadmapPrompt, buildRewriteDocsPrompt, buildReactiveExecutePrompt, checkNeedsReassessment, checkNeedsRunUat, } from "./auto-prompts.js";
|
|
16
16
|
function missingSliceStop(mid, phase) {
|
|
17
17
|
return {
|
|
18
18
|
action: "stop",
|
|
@@ -22,25 +22,24 @@ function missingSliceStop(mid, phase) {
|
|
|
22
22
|
}
|
|
23
23
|
// ─── Rewrite Circuit Breaker ──────────────────────────────────────────────
|
|
24
24
|
const MAX_REWRITE_ATTEMPTS = 3;
|
|
25
|
-
let rewriteAttemptCount = 0;
|
|
26
|
-
export function resetRewriteCircuitBreaker() {
|
|
27
|
-
rewriteAttemptCount = 0;
|
|
28
|
-
}
|
|
29
25
|
// ─── Rules ────────────────────────────────────────────────────────────────
|
|
30
26
|
const DISPATCH_RULES = [
|
|
31
27
|
{
|
|
32
28
|
name: "rewrite-docs (override gate)",
|
|
33
|
-
match: async ({ mid, midTitle, state, basePath }) => {
|
|
29
|
+
match: async ({ mid, midTitle, state, basePath, session }) => {
|
|
34
30
|
const pendingOverrides = await loadActiveOverrides(basePath);
|
|
35
31
|
if (pendingOverrides.length === 0)
|
|
36
32
|
return null;
|
|
37
|
-
|
|
33
|
+
const count = session?.rewriteAttemptCount ?? 0;
|
|
34
|
+
if (count >= MAX_REWRITE_ATTEMPTS) {
|
|
38
35
|
const { resolveAllOverrides } = await import("./files.js");
|
|
39
36
|
await resolveAllOverrides(basePath);
|
|
40
|
-
|
|
37
|
+
if (session)
|
|
38
|
+
session.rewriteAttemptCount = 0;
|
|
41
39
|
return null;
|
|
42
40
|
}
|
|
43
|
-
|
|
41
|
+
if (session)
|
|
42
|
+
session.rewriteAttemptCount++;
|
|
44
43
|
const unitId = state.activeSlice ? `${mid}/${state.activeSlice.id}` : mid;
|
|
45
44
|
return {
|
|
46
45
|
action: "dispatch",
|
|
@@ -81,7 +80,7 @@ const DISPATCH_RULES = [
|
|
|
81
80
|
unitType: "run-uat",
|
|
82
81
|
unitId: `${mid}/${sliceId}`,
|
|
83
82
|
prompt: await buildRunUatPrompt(mid, sliceId, relSliceFile(basePath, mid, sliceId, "UAT"), uatContent ?? "", basePath),
|
|
84
|
-
pauseAfterDispatch: uatType !== "artifact-driven",
|
|
83
|
+
pauseAfterDispatch: uatType !== "artifact-driven" && uatType !== "browser-executable" && uatType !== "runtime-executable",
|
|
85
84
|
};
|
|
86
85
|
},
|
|
87
86
|
},
|
|
@@ -223,6 +222,72 @@ const DISPATCH_RULES = [
|
|
|
223
222
|
};
|
|
224
223
|
},
|
|
225
224
|
},
|
|
225
|
+
{
|
|
226
|
+
name: "executing → reactive-execute (parallel dispatch)",
|
|
227
|
+
match: async ({ state, mid, midTitle, basePath, prefs }) => {
|
|
228
|
+
if (state.phase !== "executing" || !state.activeTask)
|
|
229
|
+
return null;
|
|
230
|
+
if (!state.activeSlice)
|
|
231
|
+
return null; // fall through
|
|
232
|
+
// Only activate when reactive_execution is explicitly enabled
|
|
233
|
+
const reactiveConfig = prefs?.reactive_execution;
|
|
234
|
+
if (!reactiveConfig?.enabled)
|
|
235
|
+
return null;
|
|
236
|
+
const sid = state.activeSlice.id;
|
|
237
|
+
const sTitle = state.activeSlice.title;
|
|
238
|
+
const maxParallel = reactiveConfig.max_parallel ?? 2;
|
|
239
|
+
// Dry-run mode: max_parallel=1 means graph is derived and logged but
|
|
240
|
+
// execution remains sequential
|
|
241
|
+
if (maxParallel <= 1)
|
|
242
|
+
return null;
|
|
243
|
+
try {
|
|
244
|
+
const { loadSliceTaskIO, deriveTaskGraph, isGraphAmbiguous, getReadyTasks, chooseNonConflictingSubset, graphMetrics, } = await import("./reactive-graph.js");
|
|
245
|
+
const taskIO = await loadSliceTaskIO(basePath, mid, sid);
|
|
246
|
+
if (taskIO.length < 2)
|
|
247
|
+
return null; // single task, no point
|
|
248
|
+
const graph = deriveTaskGraph(taskIO);
|
|
249
|
+
// Ambiguous graph → fall through to sequential
|
|
250
|
+
if (isGraphAmbiguous(graph))
|
|
251
|
+
return null;
|
|
252
|
+
const completed = new Set(graph.filter((n) => n.done).map((n) => n.id));
|
|
253
|
+
const readyIds = getReadyTasks(graph, completed, new Set());
|
|
254
|
+
// Only activate reactive dispatch when >1 task is ready
|
|
255
|
+
if (readyIds.length <= 1)
|
|
256
|
+
return null;
|
|
257
|
+
const selected = chooseNonConflictingSubset(readyIds, graph, maxParallel, new Set());
|
|
258
|
+
if (selected.length <= 1)
|
|
259
|
+
return null;
|
|
260
|
+
// Log graph metrics for observability
|
|
261
|
+
const metrics = graphMetrics(graph);
|
|
262
|
+
process.stderr.write(`gsd-reactive: ${mid}/${sid} graph — tasks:${metrics.taskCount} edges:${metrics.edgeCount} ` +
|
|
263
|
+
`ready:${metrics.readySetSize} dispatching:${selected.length} ambiguous:${metrics.ambiguous}\n`);
|
|
264
|
+
// Persist dispatched batch so verification and recovery can check
|
|
265
|
+
// exactly which tasks were sent.
|
|
266
|
+
const { saveReactiveState } = await import("./reactive-graph.js");
|
|
267
|
+
saveReactiveState(basePath, mid, sid, {
|
|
268
|
+
sliceId: sid,
|
|
269
|
+
completed: [...completed],
|
|
270
|
+
dispatched: selected,
|
|
271
|
+
graphSnapshot: metrics,
|
|
272
|
+
updatedAt: new Date().toISOString(),
|
|
273
|
+
});
|
|
274
|
+
// Encode selected task IDs in unitId for artifact verification.
|
|
275
|
+
// Format: M001/S01/reactive+T02,T03
|
|
276
|
+
const batchSuffix = selected.join(",");
|
|
277
|
+
return {
|
|
278
|
+
action: "dispatch",
|
|
279
|
+
unitType: "reactive-execute",
|
|
280
|
+
unitId: `${mid}/${sid}/reactive+${batchSuffix}`,
|
|
281
|
+
prompt: await buildReactiveExecutePrompt(mid, midTitle, sid, sTitle, selected, basePath),
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
catch (err) {
|
|
285
|
+
// Non-fatal — fall through to sequential execution
|
|
286
|
+
process.stderr.write(`gsd-reactive: graph derivation failed: ${err.message}\n`);
|
|
287
|
+
return null;
|
|
288
|
+
}
|
|
289
|
+
},
|
|
290
|
+
},
|
|
226
291
|
{
|
|
227
292
|
name: "executing → execute-task (recover missing task plan → plan-slice)",
|
|
228
293
|
match: async ({ state, mid, midTitle, basePath }) => {
|