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
|
@@ -38,6 +38,7 @@ import {
|
|
|
38
38
|
buildRunUatPrompt,
|
|
39
39
|
buildReassessRoadmapPrompt,
|
|
40
40
|
buildRewriteDocsPrompt,
|
|
41
|
+
buildReactiveExecutePrompt,
|
|
41
42
|
checkNeedsReassessment,
|
|
42
43
|
checkNeedsRunUat,
|
|
43
44
|
} from "./auto-prompts.js";
|
|
@@ -61,6 +62,7 @@ export interface DispatchContext {
|
|
|
61
62
|
midTitle: string;
|
|
62
63
|
state: GSDState;
|
|
63
64
|
prefs: GSDPreferences | undefined;
|
|
65
|
+
session?: import("./auto/session.js").AutoSession;
|
|
64
66
|
}
|
|
65
67
|
|
|
66
68
|
interface DispatchRule {
|
|
@@ -81,26 +83,23 @@ function missingSliceStop(mid: string, phase: string): DispatchAction {
|
|
|
81
83
|
// ─── Rewrite Circuit Breaker ──────────────────────────────────────────────
|
|
82
84
|
|
|
83
85
|
const MAX_REWRITE_ATTEMPTS = 3;
|
|
84
|
-
let rewriteAttemptCount = 0;
|
|
85
|
-
export function resetRewriteCircuitBreaker(): void {
|
|
86
|
-
rewriteAttemptCount = 0;
|
|
87
|
-
}
|
|
88
86
|
|
|
89
87
|
// ─── Rules ────────────────────────────────────────────────────────────────
|
|
90
88
|
|
|
91
89
|
const DISPATCH_RULES: DispatchRule[] = [
|
|
92
90
|
{
|
|
93
91
|
name: "rewrite-docs (override gate)",
|
|
94
|
-
match: async ({ mid, midTitle, state, basePath }) => {
|
|
92
|
+
match: async ({ mid, midTitle, state, basePath, session }) => {
|
|
95
93
|
const pendingOverrides = await loadActiveOverrides(basePath);
|
|
96
94
|
if (pendingOverrides.length === 0) return null;
|
|
97
|
-
|
|
95
|
+
const count = session?.rewriteAttemptCount ?? 0;
|
|
96
|
+
if (count >= MAX_REWRITE_ATTEMPTS) {
|
|
98
97
|
const { resolveAllOverrides } = await import("./files.js");
|
|
99
98
|
await resolveAllOverrides(basePath);
|
|
100
|
-
rewriteAttemptCount = 0;
|
|
99
|
+
if (session) session.rewriteAttemptCount = 0;
|
|
101
100
|
return null;
|
|
102
101
|
}
|
|
103
|
-
rewriteAttemptCount++;
|
|
102
|
+
if (session) session.rewriteAttemptCount++;
|
|
104
103
|
const unitId = state.activeSlice ? `${mid}/${state.activeSlice.id}` : mid;
|
|
105
104
|
return {
|
|
106
105
|
action: "dispatch",
|
|
@@ -156,7 +155,7 @@ const DISPATCH_RULES: DispatchRule[] = [
|
|
|
156
155
|
uatContent ?? "",
|
|
157
156
|
basePath,
|
|
158
157
|
),
|
|
159
|
-
pauseAfterDispatch: uatType !== "artifact-driven",
|
|
158
|
+
pauseAfterDispatch: uatType !== "artifact-driven" && uatType !== "browser-executable" && uatType !== "runtime-executable",
|
|
160
159
|
};
|
|
161
160
|
},
|
|
162
161
|
},
|
|
@@ -309,6 +308,98 @@ const DISPATCH_RULES: DispatchRule[] = [
|
|
|
309
308
|
};
|
|
310
309
|
},
|
|
311
310
|
},
|
|
311
|
+
{
|
|
312
|
+
name: "executing → reactive-execute (parallel dispatch)",
|
|
313
|
+
match: async ({ state, mid, midTitle, basePath, prefs }) => {
|
|
314
|
+
if (state.phase !== "executing" || !state.activeTask) return null;
|
|
315
|
+
if (!state.activeSlice) return null; // fall through
|
|
316
|
+
|
|
317
|
+
// Only activate when reactive_execution is explicitly enabled
|
|
318
|
+
const reactiveConfig = prefs?.reactive_execution;
|
|
319
|
+
if (!reactiveConfig?.enabled) return null;
|
|
320
|
+
|
|
321
|
+
const sid = state.activeSlice.id;
|
|
322
|
+
const sTitle = state.activeSlice.title;
|
|
323
|
+
const maxParallel = reactiveConfig.max_parallel ?? 2;
|
|
324
|
+
|
|
325
|
+
// Dry-run mode: max_parallel=1 means graph is derived and logged but
|
|
326
|
+
// execution remains sequential
|
|
327
|
+
if (maxParallel <= 1) return null;
|
|
328
|
+
|
|
329
|
+
try {
|
|
330
|
+
const {
|
|
331
|
+
loadSliceTaskIO,
|
|
332
|
+
deriveTaskGraph,
|
|
333
|
+
isGraphAmbiguous,
|
|
334
|
+
getReadyTasks,
|
|
335
|
+
chooseNonConflictingSubset,
|
|
336
|
+
graphMetrics,
|
|
337
|
+
} = await import("./reactive-graph.js");
|
|
338
|
+
|
|
339
|
+
const taskIO = await loadSliceTaskIO(basePath, mid, sid);
|
|
340
|
+
if (taskIO.length < 2) return null; // single task, no point
|
|
341
|
+
|
|
342
|
+
const graph = deriveTaskGraph(taskIO);
|
|
343
|
+
|
|
344
|
+
// Ambiguous graph → fall through to sequential
|
|
345
|
+
if (isGraphAmbiguous(graph)) return null;
|
|
346
|
+
|
|
347
|
+
const completed = new Set(graph.filter((n) => n.done).map((n) => n.id));
|
|
348
|
+
const readyIds = getReadyTasks(graph, completed, new Set());
|
|
349
|
+
|
|
350
|
+
// Only activate reactive dispatch when >1 task is ready
|
|
351
|
+
if (readyIds.length <= 1) return null;
|
|
352
|
+
|
|
353
|
+
const selected = chooseNonConflictingSubset(
|
|
354
|
+
readyIds,
|
|
355
|
+
graph,
|
|
356
|
+
maxParallel,
|
|
357
|
+
new Set(),
|
|
358
|
+
);
|
|
359
|
+
if (selected.length <= 1) return null;
|
|
360
|
+
|
|
361
|
+
// Log graph metrics for observability
|
|
362
|
+
const metrics = graphMetrics(graph);
|
|
363
|
+
process.stderr.write(
|
|
364
|
+
`gsd-reactive: ${mid}/${sid} graph — tasks:${metrics.taskCount} edges:${metrics.edgeCount} ` +
|
|
365
|
+
`ready:${metrics.readySetSize} dispatching:${selected.length} ambiguous:${metrics.ambiguous}\n`,
|
|
366
|
+
);
|
|
367
|
+
|
|
368
|
+
// Persist dispatched batch so verification and recovery can check
|
|
369
|
+
// exactly which tasks were sent.
|
|
370
|
+
const { saveReactiveState } = await import("./reactive-graph.js");
|
|
371
|
+
saveReactiveState(basePath, mid, sid, {
|
|
372
|
+
sliceId: sid,
|
|
373
|
+
completed: [...completed],
|
|
374
|
+
dispatched: selected,
|
|
375
|
+
graphSnapshot: metrics,
|
|
376
|
+
updatedAt: new Date().toISOString(),
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
// Encode selected task IDs in unitId for artifact verification.
|
|
380
|
+
// Format: M001/S01/reactive+T02,T03
|
|
381
|
+
const batchSuffix = selected.join(",");
|
|
382
|
+
|
|
383
|
+
return {
|
|
384
|
+
action: "dispatch",
|
|
385
|
+
unitType: "reactive-execute",
|
|
386
|
+
unitId: `${mid}/${sid}/reactive+${batchSuffix}`,
|
|
387
|
+
prompt: await buildReactiveExecutePrompt(
|
|
388
|
+
mid,
|
|
389
|
+
midTitle,
|
|
390
|
+
sid,
|
|
391
|
+
sTitle,
|
|
392
|
+
selected,
|
|
393
|
+
basePath,
|
|
394
|
+
),
|
|
395
|
+
};
|
|
396
|
+
} catch (err) {
|
|
397
|
+
// Non-fatal — fall through to sequential execution
|
|
398
|
+
process.stderr.write(`gsd-reactive: graph derivation failed: ${(err as Error).message}\n`);
|
|
399
|
+
return null;
|
|
400
|
+
}
|
|
401
|
+
},
|
|
402
|
+
},
|
|
312
403
|
{
|
|
313
404
|
name: "executing → execute-task (recover missing task plan → plan-slice)",
|
|
314
405
|
match: async ({ state, mid, midTitle, basePath }) => {
|