@kenkaiiii/ggcoder 4.3.204 → 4.3.206
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/dist/cli.js +38 -26
- package/dist/cli.js.map +1 -1
- package/dist/config.js +2 -2
- package/dist/core/compaction/compactor.d.ts.map +1 -1
- package/dist/core/compaction/compactor.js +6 -0
- package/dist/core/compaction/compactor.js.map +1 -1
- package/dist/core/compaction/compactor.test.js +16 -0
- package/dist/core/compaction/compactor.test.js.map +1 -1
- package/dist/core/goal-controller.d.ts +57 -0
- package/dist/core/goal-controller.d.ts.map +1 -0
- package/dist/core/goal-controller.js +285 -0
- package/dist/core/goal-controller.js.map +1 -0
- package/dist/core/goal-controller.test.d.ts +2 -0
- package/dist/core/goal-controller.test.d.ts.map +1 -0
- package/dist/core/goal-controller.test.js +377 -0
- package/dist/core/goal-controller.test.js.map +1 -0
- package/dist/core/goal-lifecycle-smoke.test.d.ts +2 -0
- package/dist/core/goal-lifecycle-smoke.test.d.ts.map +1 -0
- package/dist/core/goal-lifecycle-smoke.test.js +207 -0
- package/dist/core/goal-lifecycle-smoke.test.js.map +1 -0
- package/dist/core/goal-store.d.ts +164 -0
- package/dist/core/goal-store.d.ts.map +1 -0
- package/dist/core/goal-store.js +721 -0
- package/dist/core/goal-store.js.map +1 -0
- package/dist/core/goal-store.test.d.ts +2 -0
- package/dist/core/goal-store.test.d.ts.map +1 -0
- package/dist/core/goal-store.test.js +341 -0
- package/dist/core/goal-store.test.js.map +1 -0
- package/dist/core/goal-verifier.d.ts +17 -0
- package/dist/core/goal-verifier.d.ts.map +1 -0
- package/dist/core/goal-verifier.js +84 -0
- package/dist/core/goal-verifier.js.map +1 -0
- package/dist/core/goal-verifier.test.d.ts +2 -0
- package/dist/core/goal-verifier.test.d.ts.map +1 -0
- package/dist/core/goal-verifier.test.js +88 -0
- package/dist/core/goal-verifier.test.js.map +1 -0
- package/dist/core/goal-worker.d.ts +47 -0
- package/dist/core/goal-worker.d.ts.map +1 -0
- package/dist/core/goal-worker.js +329 -0
- package/dist/core/goal-worker.js.map +1 -0
- package/dist/core/goal-worker.test.d.ts +2 -0
- package/dist/core/goal-worker.test.d.ts.map +1 -0
- package/dist/core/goal-worker.test.js +206 -0
- package/dist/core/goal-worker.test.js.map +1 -0
- package/dist/core/oauth/gemini.d.ts.map +1 -1
- package/dist/core/oauth/gemini.js +138 -30
- package/dist/core/oauth/gemini.js.map +1 -1
- package/dist/core/oauth/gemini.test.d.ts +2 -0
- package/dist/core/oauth/gemini.test.d.ts.map +1 -0
- package/dist/core/oauth/gemini.test.js +154 -0
- package/dist/core/oauth/gemini.test.js.map +1 -0
- package/dist/core/prompt-commands.d.ts.map +1 -1
- package/dist/core/prompt-commands.js +124 -0
- package/dist/core/prompt-commands.js.map +1 -1
- package/dist/core/prompt-commands.test.js +36 -0
- package/dist/core/prompt-commands.test.js.map +1 -1
- package/dist/core/repomap.js +2 -0
- package/dist/core/repomap.js.map +1 -1
- package/dist/core/repomap.test.js +18 -0
- package/dist/core/repomap.test.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/interactive.d.ts.map +1 -1
- package/dist/interactive.js +20 -11
- package/dist/interactive.js.map +1 -1
- package/dist/system-prompt.d.ts.map +1 -1
- package/dist/system-prompt.js +18 -50
- package/dist/system-prompt.js.map +1 -1
- package/dist/system-prompt.test.js +124 -1
- package/dist/system-prompt.test.js.map +1 -1
- package/dist/tools/edit-diff.d.ts.map +1 -1
- package/dist/tools/edit-diff.js +71 -32
- package/dist/tools/edit-diff.js.map +1 -1
- package/dist/tools/edit-diff.test.js +14 -0
- package/dist/tools/edit-diff.test.js.map +1 -1
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +16 -6
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/edit.test.js +27 -0
- package/dist/tools/edit.test.js.map +1 -1
- package/dist/tools/enter-plan.d.ts.map +1 -1
- package/dist/tools/enter-plan.js +1 -0
- package/dist/tools/enter-plan.js.map +1 -1
- package/dist/tools/find.d.ts.map +1 -1
- package/dist/tools/find.js +2 -0
- package/dist/tools/find.js.map +1 -1
- package/dist/tools/goals.d.ts +110 -0
- package/dist/tools/goals.d.ts.map +1 -0
- package/dist/tools/goals.js +500 -0
- package/dist/tools/goals.js.map +1 -0
- package/dist/tools/goals.test.d.ts +2 -0
- package/dist/tools/goals.test.d.ts.map +1 -0
- package/dist/tools/goals.test.js +431 -0
- package/dist/tools/goals.test.js.map +1 -0
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +2 -0
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +6 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/prompt-hints.d.ts.map +1 -1
- package/dist/tools/prompt-hints.js +2 -0
- package/dist/tools/prompt-hints.js.map +1 -1
- package/dist/tools/source-path.d.ts +9 -0
- package/dist/tools/source-path.d.ts.map +1 -0
- package/dist/tools/source-path.js +119 -0
- package/dist/tools/source-path.js.map +1 -0
- package/dist/tools/source-path.test.d.ts +2 -0
- package/dist/tools/source-path.test.d.ts.map +1 -0
- package/dist/tools/source-path.test.js +80 -0
- package/dist/tools/source-path.test.js.map +1 -0
- package/dist/tools/subagent.js +16 -0
- package/dist/tools/subagent.js.map +1 -1
- package/dist/ui/App.d.ts +36 -3
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +879 -57
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/activity-phrases.d.ts.map +1 -1
- package/dist/ui/activity-phrases.js +7 -3
- package/dist/ui/activity-phrases.js.map +1 -1
- package/dist/ui/app-state-persistence.test.d.ts +2 -0
- package/dist/ui/app-state-persistence.test.d.ts.map +1 -0
- package/dist/ui/app-state-persistence.test.js +56 -0
- package/dist/ui/app-state-persistence.test.js.map +1 -0
- package/dist/ui/components/BackgroundTasksBar.d.ts +16 -1
- package/dist/ui/components/BackgroundTasksBar.d.ts.map +1 -1
- package/dist/ui/components/BackgroundTasksBar.js +15 -2
- package/dist/ui/components/BackgroundTasksBar.js.map +1 -1
- package/dist/ui/components/Banner.d.ts +2 -1
- package/dist/ui/components/Banner.d.ts.map +1 -1
- package/dist/ui/components/Banner.js +3 -3
- package/dist/ui/components/Banner.js.map +1 -1
- package/dist/ui/components/GoalOverlay.d.ts +21 -0
- package/dist/ui/components/GoalOverlay.d.ts.map +1 -0
- package/dist/ui/components/GoalOverlay.js +336 -0
- package/dist/ui/components/GoalOverlay.js.map +1 -0
- package/dist/ui/components/GoalStatusBar.d.ts +24 -0
- package/dist/ui/components/GoalStatusBar.d.ts.map +1 -0
- package/dist/ui/components/GoalStatusBar.js +113 -0
- package/dist/ui/components/GoalStatusBar.js.map +1 -0
- package/dist/ui/components/InputArea.d.ts +2 -1
- package/dist/ui/components/InputArea.d.ts.map +1 -1
- package/dist/ui/components/InputArea.js +6 -1
- package/dist/ui/components/InputArea.js.map +1 -1
- package/dist/ui/components/ToolExecution.d.ts.map +1 -1
- package/dist/ui/components/ToolExecution.js +94 -1
- package/dist/ui/components/ToolExecution.js.map +1 -1
- package/dist/ui/footer-status-layout.test.d.ts +2 -0
- package/dist/ui/footer-status-layout.test.d.ts.map +1 -0
- package/dist/ui/footer-status-layout.test.js +56 -0
- package/dist/ui/footer-status-layout.test.js.map +1 -0
- package/dist/ui/goal-events.d.ts +20 -0
- package/dist/ui/goal-events.d.ts.map +1 -0
- package/dist/ui/goal-events.js +102 -0
- package/dist/ui/goal-events.js.map +1 -0
- package/dist/ui/goal-events.test.d.ts +2 -0
- package/dist/ui/goal-events.test.d.ts.map +1 -0
- package/dist/ui/goal-events.test.js +208 -0
- package/dist/ui/goal-events.test.js.map +1 -0
- package/dist/ui/goal-overlay.test.d.ts +2 -0
- package/dist/ui/goal-overlay.test.d.ts.map +1 -0
- package/dist/ui/goal-overlay.test.js +122 -0
- package/dist/ui/goal-overlay.test.js.map +1 -0
- package/dist/ui/goal-status-bar.test.d.ts +2 -0
- package/dist/ui/goal-status-bar.test.d.ts.map +1 -0
- package/dist/ui/goal-status-bar.test.js +143 -0
- package/dist/ui/goal-status-bar.test.js.map +1 -0
- package/dist/ui/live-item-flush.test.js +48 -0
- package/dist/ui/live-item-flush.test.js.map +1 -1
- package/dist/ui/render.d.ts +8 -3
- package/dist/ui/render.d.ts.map +1 -1
- package/dist/ui/render.js +10 -3
- package/dist/ui/render.js.map +1 -1
- package/dist/ui/scroll-stabilization.test.d.ts +2 -0
- package/dist/ui/scroll-stabilization.test.d.ts.map +1 -0
- package/dist/ui/scroll-stabilization.test.js +23 -0
- package/dist/ui/scroll-stabilization.test.js.map +1 -0
- package/dist/utils/format.js +44 -0
- package/dist/utils/format.js.map +1 -1
- package/package.json +5 -4
package/dist/tools/find.js
CHANGED
|
@@ -27,6 +27,8 @@ export function createFindTool(cwd) {
|
|
|
27
27
|
dot: false,
|
|
28
28
|
onlyFiles: true,
|
|
29
29
|
ignore: ["**/node_modules/**", "**/.git/**"],
|
|
30
|
+
suppressErrors: true,
|
|
31
|
+
followSymbolicLinks: false,
|
|
30
32
|
});
|
|
31
33
|
// Filter by .gitignore
|
|
32
34
|
const filtered = entries.filter((entry) => !ig.ignores(entry));
|
package/dist/tools/find.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find.js","sourceRoot":"","sources":["../../src/tools/find.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8DAA8D,CAAC;IAC5F,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;CACjF,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,GAAG,CAAC;AAExB,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,WAAW,EACT,2DAA2D;YAC3D,gEAAgE;QAClE,UAAU,EAAE,UAAU;QACtB,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE;YACzC,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YAE5D,wCAAwC;YACxC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;YACrC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;YAEtC,2BAA2B;YAC3B,MAAM,cAAc,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC;YAChD,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YAC5B,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAEvB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;gBACxC,GAAG,EAAE,GAAG;gBACR,GAAG,EAAE,KAAK;gBACV,SAAS,EAAE,IAAI;gBACf,MAAM,EAAE,CAAC,oBAAoB,EAAE,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"find.js","sourceRoot":"","sources":["../../src/tools/find.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { AgentTool } from "@kenkaiiii/gg-agent";
|
|
3
|
+
declare const GoalsParams: z.ZodObject<{
|
|
4
|
+
action: z.ZodEnum<{
|
|
5
|
+
status: "status";
|
|
6
|
+
task: "task";
|
|
7
|
+
create: "create";
|
|
8
|
+
pause: "pause";
|
|
9
|
+
resume: "resume";
|
|
10
|
+
complete: "complete";
|
|
11
|
+
evidence: "evidence";
|
|
12
|
+
verify: "verify";
|
|
13
|
+
prerequisite: "prerequisite";
|
|
14
|
+
}>;
|
|
15
|
+
run_id: z.ZodOptional<z.ZodString>;
|
|
16
|
+
title: z.ZodOptional<z.ZodString>;
|
|
17
|
+
goal: z.ZodOptional<z.ZodString>;
|
|
18
|
+
success_criteria: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
19
|
+
prerequisites: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
20
|
+
id: z.ZodOptional<z.ZodString>;
|
|
21
|
+
label: z.ZodString;
|
|
22
|
+
status: z.ZodOptional<z.ZodEnum<{
|
|
23
|
+
unknown: "unknown";
|
|
24
|
+
met: "met";
|
|
25
|
+
missing: "missing";
|
|
26
|
+
}>>;
|
|
27
|
+
check_command: z.ZodOptional<z.ZodString>;
|
|
28
|
+
instructions: z.ZodOptional<z.ZodString>;
|
|
29
|
+
evidence: z.ZodOptional<z.ZodString>;
|
|
30
|
+
}, z.core.$strip>>>;
|
|
31
|
+
prerequisite_id: z.ZodOptional<z.ZodString>;
|
|
32
|
+
prerequisite_status: z.ZodOptional<z.ZodEnum<{
|
|
33
|
+
unknown: "unknown";
|
|
34
|
+
met: "met";
|
|
35
|
+
missing: "missing";
|
|
36
|
+
}>>;
|
|
37
|
+
prerequisite_label: z.ZodOptional<z.ZodString>;
|
|
38
|
+
instructions: z.ZodOptional<z.ZodString>;
|
|
39
|
+
harness: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
40
|
+
id: z.ZodOptional<z.ZodString>;
|
|
41
|
+
label: z.ZodString;
|
|
42
|
+
command: z.ZodOptional<z.ZodString>;
|
|
43
|
+
path: z.ZodOptional<z.ZodString>;
|
|
44
|
+
description: z.ZodOptional<z.ZodString>;
|
|
45
|
+
}, z.core.$strip>>>;
|
|
46
|
+
evidence_plan: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
47
|
+
id: z.ZodOptional<z.ZodString>;
|
|
48
|
+
label: z.ZodString;
|
|
49
|
+
mechanism: z.ZodEnum<{
|
|
50
|
+
command: "command";
|
|
51
|
+
script: "script";
|
|
52
|
+
source: "source";
|
|
53
|
+
video: "video";
|
|
54
|
+
test: "test";
|
|
55
|
+
fixture: "fixture";
|
|
56
|
+
log: "log";
|
|
57
|
+
screenshot: "screenshot";
|
|
58
|
+
browser: "browser";
|
|
59
|
+
device: "device";
|
|
60
|
+
manual: "manual";
|
|
61
|
+
}>;
|
|
62
|
+
description: z.ZodString;
|
|
63
|
+
status: z.ZodOptional<z.ZodEnum<{
|
|
64
|
+
ready: "ready";
|
|
65
|
+
blocked: "blocked";
|
|
66
|
+
planned: "planned";
|
|
67
|
+
}>>;
|
|
68
|
+
command: z.ZodOptional<z.ZodString>;
|
|
69
|
+
path: z.ZodOptional<z.ZodString>;
|
|
70
|
+
instructions: z.ZodOptional<z.ZodString>;
|
|
71
|
+
evidence: z.ZodOptional<z.ZodString>;
|
|
72
|
+
}, z.core.$strip>>>;
|
|
73
|
+
verifier_command: z.ZodOptional<z.ZodString>;
|
|
74
|
+
verifier_description: z.ZodOptional<z.ZodString>;
|
|
75
|
+
task_id: z.ZodOptional<z.ZodString>;
|
|
76
|
+
task_title: z.ZodOptional<z.ZodString>;
|
|
77
|
+
task_prompt: z.ZodOptional<z.ZodString>;
|
|
78
|
+
task_status: z.ZodOptional<z.ZodEnum<{
|
|
79
|
+
failed: "failed";
|
|
80
|
+
running: "running";
|
|
81
|
+
done: "done";
|
|
82
|
+
blocked: "blocked";
|
|
83
|
+
pending: "pending";
|
|
84
|
+
verifying: "verifying";
|
|
85
|
+
}>>;
|
|
86
|
+
worker_id: z.ZodOptional<z.ZodString>;
|
|
87
|
+
attempts: z.ZodOptional<z.ZodNumber>;
|
|
88
|
+
summary: z.ZodOptional<z.ZodString>;
|
|
89
|
+
evidence_kind: z.ZodOptional<z.ZodEnum<{
|
|
90
|
+
command: "command";
|
|
91
|
+
file: "file";
|
|
92
|
+
summary: "summary";
|
|
93
|
+
log: "log";
|
|
94
|
+
screenshot: "screenshot";
|
|
95
|
+
}>>;
|
|
96
|
+
evidence_label: z.ZodOptional<z.ZodString>;
|
|
97
|
+
evidence_path: z.ZodOptional<z.ZodString>;
|
|
98
|
+
evidence_content: z.ZodOptional<z.ZodString>;
|
|
99
|
+
verification_status: z.ZodOptional<z.ZodEnum<{
|
|
100
|
+
unknown: "unknown";
|
|
101
|
+
pass: "pass";
|
|
102
|
+
fail: "fail";
|
|
103
|
+
}>>;
|
|
104
|
+
exit_code: z.ZodOptional<z.ZodNumber>;
|
|
105
|
+
output_path: z.ZodOptional<z.ZodString>;
|
|
106
|
+
blockers: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
107
|
+
}, z.core.$strip>;
|
|
108
|
+
export declare function createGoalsTool(cwd: string): AgentTool<typeof GoalsParams>;
|
|
109
|
+
export {};
|
|
110
|
+
//# sourceMappingURL=goals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goals.d.ts","sourceRoot":"","sources":["../../src/tools/goals.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAmErD,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAkEf,CAAC;AA0FH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,WAAW,CAAC,CA8T1E"}
|
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { log } from "../core/logger.js";
|
|
4
|
+
import { canCompleteGoalRun, decideGoalNextAction } from "../core/goal-controller.js";
|
|
5
|
+
import { appendGoalDecision, appendGoalEvidence, createGoalEvidence, formatGoalBlockingPrerequisiteList, formatGoalBlockingPrerequisites, getActiveGoalRun, getGoalRun, goalHasBlockingPrerequisites, loadGoalRuns, upsertGoalRun, updateGoalTask, } from "../core/goal-store.js";
|
|
6
|
+
const PrerequisiteInput = z.object({
|
|
7
|
+
id: z.string().optional().describe("Stable prerequisite id"),
|
|
8
|
+
label: z.string().describe("Human-readable prerequisite label"),
|
|
9
|
+
status: z.enum(["unknown", "met", "missing"]).optional(),
|
|
10
|
+
check_command: z.string().optional().describe("Optional command used to check this prerequisite"),
|
|
11
|
+
instructions: z.string().optional().describe("What the user must provide when missing"),
|
|
12
|
+
evidence: z.string().optional().describe("Short evidence, never secret values"),
|
|
13
|
+
});
|
|
14
|
+
const HarnessInput = z.object({
|
|
15
|
+
id: z.string().optional().describe("Stable harness item id"),
|
|
16
|
+
label: z.string().describe("Harness/diagnostic label"),
|
|
17
|
+
command: z.string().optional().describe("Command that runs this harness item"),
|
|
18
|
+
path: z.string().optional().describe("File path for a harness artifact"),
|
|
19
|
+
description: z.string().optional().describe("What this harness observes or verifies"),
|
|
20
|
+
});
|
|
21
|
+
const EvidencePlanInput = z.object({
|
|
22
|
+
id: z.string().optional().describe("Stable evidence-plan item id"),
|
|
23
|
+
label: z.string().describe("Short evidence path label"),
|
|
24
|
+
mechanism: z
|
|
25
|
+
.enum([
|
|
26
|
+
"command",
|
|
27
|
+
"test",
|
|
28
|
+
"script",
|
|
29
|
+
"fixture",
|
|
30
|
+
"log",
|
|
31
|
+
"screenshot",
|
|
32
|
+
"video",
|
|
33
|
+
"browser",
|
|
34
|
+
"device",
|
|
35
|
+
"source",
|
|
36
|
+
"manual",
|
|
37
|
+
])
|
|
38
|
+
.describe("How this proof will be gathered"),
|
|
39
|
+
description: z.string().describe("What this evidence proves"),
|
|
40
|
+
status: z.enum(["planned", "ready", "blocked"]).optional(),
|
|
41
|
+
command: z.string().optional().describe("Runnable command when available"),
|
|
42
|
+
path: z.string().optional().describe("Artifact path when available"),
|
|
43
|
+
instructions: z.string().optional().describe("Exact user instructions when blocked"),
|
|
44
|
+
evidence: z.string().optional().describe("Observed evidence summary when ready"),
|
|
45
|
+
});
|
|
46
|
+
const GoalsParams = z.object({
|
|
47
|
+
action: z
|
|
48
|
+
.enum([
|
|
49
|
+
"create",
|
|
50
|
+
"prerequisite",
|
|
51
|
+
"task",
|
|
52
|
+
"evidence",
|
|
53
|
+
"verify",
|
|
54
|
+
"status",
|
|
55
|
+
"pause",
|
|
56
|
+
"resume",
|
|
57
|
+
"complete",
|
|
58
|
+
])
|
|
59
|
+
.describe("Goal action to perform"),
|
|
60
|
+
run_id: z.string().optional().describe("Goal run id; omitted actions use the active/latest run"),
|
|
61
|
+
title: z.string().optional().describe("Goal or task title"),
|
|
62
|
+
goal: z.string().optional().describe("Original user objective for create"),
|
|
63
|
+
success_criteria: z
|
|
64
|
+
.array(z.string())
|
|
65
|
+
.optional()
|
|
66
|
+
.describe("Concrete criteria that must be proven before completion"),
|
|
67
|
+
prerequisites: z
|
|
68
|
+
.array(PrerequisiteInput)
|
|
69
|
+
.optional()
|
|
70
|
+
.describe("Prerequisites that must be met before launching workers"),
|
|
71
|
+
prerequisite_id: z.string().optional().describe("Prerequisite id to update"),
|
|
72
|
+
prerequisite_status: z
|
|
73
|
+
.enum(["unknown", "met", "missing"])
|
|
74
|
+
.optional()
|
|
75
|
+
.describe("Updated prerequisite status"),
|
|
76
|
+
prerequisite_label: z.string().optional().describe("Label for an added/updated prerequisite"),
|
|
77
|
+
instructions: z.string().optional().describe("User-facing instructions for missing prerequisite"),
|
|
78
|
+
harness: z.array(HarnessInput).optional().describe("Harness/diagnostic commands and files"),
|
|
79
|
+
evidence_plan: z
|
|
80
|
+
.array(EvidencePlanInput)
|
|
81
|
+
.optional()
|
|
82
|
+
.describe("Planned proof paths for end-to-end verification"),
|
|
83
|
+
verifier_command: z.string().optional().describe("Command that verifies the goal end-to-end"),
|
|
84
|
+
verifier_description: z.string().optional().describe("Natural-language verifier description"),
|
|
85
|
+
task_id: z.string().optional().describe("Goal task id to update"),
|
|
86
|
+
task_title: z.string().optional().describe("Short worker task title"),
|
|
87
|
+
task_prompt: z
|
|
88
|
+
.string()
|
|
89
|
+
.optional()
|
|
90
|
+
.describe("Standalone prompt for a disposable Goal worker in this same project"),
|
|
91
|
+
task_status: z
|
|
92
|
+
.enum(["pending", "running", "verifying", "done", "failed", "blocked"])
|
|
93
|
+
.optional()
|
|
94
|
+
.describe("Goal task status"),
|
|
95
|
+
worker_id: z.string().optional().describe("Worker id associated with a task"),
|
|
96
|
+
attempts: z.number().int().min(0).optional().describe("Task attempt count"),
|
|
97
|
+
summary: z.string().optional().describe("Short summary or verification note"),
|
|
98
|
+
evidence_kind: z
|
|
99
|
+
.enum(["log", "command", "screenshot", "file", "summary"])
|
|
100
|
+
.optional()
|
|
101
|
+
.describe("Evidence kind"),
|
|
102
|
+
evidence_label: z.string().optional().describe("Evidence label"),
|
|
103
|
+
evidence_path: z.string().optional().describe("Evidence file/log/screenshot path"),
|
|
104
|
+
evidence_content: z.string().optional().describe("Short evidence content"),
|
|
105
|
+
verification_status: z
|
|
106
|
+
.enum(["pass", "fail", "unknown"])
|
|
107
|
+
.optional()
|
|
108
|
+
.describe("Verifier result status"),
|
|
109
|
+
exit_code: z.number().int().optional().describe("Verifier command exit code"),
|
|
110
|
+
output_path: z.string().optional().describe("Path to verifier output/log"),
|
|
111
|
+
blockers: z.array(z.string()).optional().describe("Current blockers"),
|
|
112
|
+
});
|
|
113
|
+
function asPrerequisiteStatus(value) {
|
|
114
|
+
if (value === "met" || value === "missing" || value === "unknown")
|
|
115
|
+
return value;
|
|
116
|
+
return "unknown";
|
|
117
|
+
}
|
|
118
|
+
function asTaskStatus(value) {
|
|
119
|
+
if (value === "pending" ||
|
|
120
|
+
value === "running" ||
|
|
121
|
+
value === "verifying" ||
|
|
122
|
+
value === "done" ||
|
|
123
|
+
value === "failed" ||
|
|
124
|
+
value === "blocked") {
|
|
125
|
+
return value;
|
|
126
|
+
}
|
|
127
|
+
return "pending";
|
|
128
|
+
}
|
|
129
|
+
function asEvidenceKind(value) {
|
|
130
|
+
if (value === "log" ||
|
|
131
|
+
value === "command" ||
|
|
132
|
+
value === "screenshot" ||
|
|
133
|
+
value === "file" ||
|
|
134
|
+
value === "summary") {
|
|
135
|
+
return value;
|
|
136
|
+
}
|
|
137
|
+
return "summary";
|
|
138
|
+
}
|
|
139
|
+
function asEvidenceMechanism(value) {
|
|
140
|
+
if (value === "command" ||
|
|
141
|
+
value === "test" ||
|
|
142
|
+
value === "script" ||
|
|
143
|
+
value === "fixture" ||
|
|
144
|
+
value === "log" ||
|
|
145
|
+
value === "screenshot" ||
|
|
146
|
+
value === "video" ||
|
|
147
|
+
value === "browser" ||
|
|
148
|
+
value === "device" ||
|
|
149
|
+
value === "source" ||
|
|
150
|
+
value === "manual") {
|
|
151
|
+
return value;
|
|
152
|
+
}
|
|
153
|
+
return "command";
|
|
154
|
+
}
|
|
155
|
+
function asVerificationStatus(value) {
|
|
156
|
+
if (value === "pass" || value === "fail" || value === "unknown")
|
|
157
|
+
return value;
|
|
158
|
+
return "unknown";
|
|
159
|
+
}
|
|
160
|
+
function formatRun(run) {
|
|
161
|
+
const prereqs = run.prerequisites.length
|
|
162
|
+
? `${run.prerequisites.filter((item) => item.status === "met").length}/${run.prerequisites.length} prereqs met`
|
|
163
|
+
: "no prereqs";
|
|
164
|
+
const tasks = run.tasks.length
|
|
165
|
+
? `${run.tasks.filter((item) => item.status === "done").length}/${run.tasks.length} tasks done`
|
|
166
|
+
: "no tasks";
|
|
167
|
+
const verifier = run.verifier?.lastResult
|
|
168
|
+
? `verifier ${run.verifier.lastResult.status}`
|
|
169
|
+
: run.verifier?.command
|
|
170
|
+
? "verifier configured"
|
|
171
|
+
: "no verifier";
|
|
172
|
+
const blocker = goalHasBlockingPrerequisites(run)
|
|
173
|
+
? `\nUser prerequisites: ${formatGoalBlockingPrerequisites(run)}`
|
|
174
|
+
: "";
|
|
175
|
+
return `[${run.status}] ${run.title} (id: ${run.id.slice(0, 8)}) — ${prereqs}, ${tasks}, ${verifier}${blocker}`;
|
|
176
|
+
}
|
|
177
|
+
function recoverableTaskStatus(status) {
|
|
178
|
+
return status === "pending" || status === "failed";
|
|
179
|
+
}
|
|
180
|
+
function statusAfterTaskPatch(run, status) {
|
|
181
|
+
if (run.status !== "failed" || !recoverableTaskStatus(status))
|
|
182
|
+
return run.status;
|
|
183
|
+
return goalHasBlockingPrerequisites(run) ? "blocked" : "ready";
|
|
184
|
+
}
|
|
185
|
+
async function resolveRun(cwd, id) {
|
|
186
|
+
if (id)
|
|
187
|
+
return getGoalRun(cwd, id);
|
|
188
|
+
return getActiveGoalRun(cwd);
|
|
189
|
+
}
|
|
190
|
+
export function createGoalsTool(cwd) {
|
|
191
|
+
return {
|
|
192
|
+
name: "goals",
|
|
193
|
+
description: "Manage durable Goal runs for /goal and Ctrl+G workflows. Use this instead of tasks when the user wants a programmatic goal loop: define success criteria first, check prerequisites before launching workers, persist harness/diagnostics/evidence, add standalone worker tasks, and only mark the goal complete when verifier evidence proves the original objective. Do not require paid services or signups without recording a blocker and asking the user for the missing prerequisite.",
|
|
194
|
+
parameters: GoalsParams,
|
|
195
|
+
executionMode: "sequential",
|
|
196
|
+
async execute(args) {
|
|
197
|
+
switch (args.action) {
|
|
198
|
+
case "create": {
|
|
199
|
+
if (!args.title)
|
|
200
|
+
return "Error: title is required for create.";
|
|
201
|
+
if (!args.goal)
|
|
202
|
+
return "Error: goal is required for create.";
|
|
203
|
+
const existing = args.run_id ? await getGoalRun(cwd, args.run_id) : null;
|
|
204
|
+
const prerequisites = args.prerequisites?.map((item) => ({
|
|
205
|
+
id: item.id ?? randomUUID(),
|
|
206
|
+
label: item.label,
|
|
207
|
+
status: asPrerequisiteStatus(item.status),
|
|
208
|
+
...(item.check_command ? { checkCommand: item.check_command } : {}),
|
|
209
|
+
...(item.instructions ? { instructions: item.instructions } : {}),
|
|
210
|
+
...(item.evidence ? { evidence: item.evidence } : {}),
|
|
211
|
+
}));
|
|
212
|
+
const harness = args.harness?.map((item) => ({
|
|
213
|
+
id: item.id ?? randomUUID(),
|
|
214
|
+
label: item.label,
|
|
215
|
+
...(item.command ? { command: item.command } : {}),
|
|
216
|
+
...(item.path ? { path: item.path } : {}),
|
|
217
|
+
...(item.description ? { description: item.description } : {}),
|
|
218
|
+
}));
|
|
219
|
+
const evidencePlan = args.evidence_plan?.map((item) => ({
|
|
220
|
+
id: item.id ?? randomUUID(),
|
|
221
|
+
label: item.label,
|
|
222
|
+
mechanism: asEvidenceMechanism(item.mechanism),
|
|
223
|
+
description: item.description,
|
|
224
|
+
status: item.status ?? "planned",
|
|
225
|
+
...(item.command ? { command: item.command } : {}),
|
|
226
|
+
...(item.path ? { path: item.path } : {}),
|
|
227
|
+
...(item.instructions ? { instructions: item.instructions } : {}),
|
|
228
|
+
...(item.evidence ? { evidence: item.evidence } : {}),
|
|
229
|
+
}));
|
|
230
|
+
const verifier = args.verifier_command || args.verifier_description
|
|
231
|
+
? {
|
|
232
|
+
description: args.verifier_description ?? existing?.verifier?.description ?? "Goal verifier",
|
|
233
|
+
...((args.verifier_command ?? existing?.verifier?.command)
|
|
234
|
+
? { command: args.verifier_command ?? existing?.verifier?.command }
|
|
235
|
+
: {}),
|
|
236
|
+
...(existing?.verifier?.lastResult
|
|
237
|
+
? { lastResult: existing.verifier.lastResult }
|
|
238
|
+
: {}),
|
|
239
|
+
}
|
|
240
|
+
: existing?.verifier;
|
|
241
|
+
const nextPrerequisites = prerequisites ?? existing?.prerequisites ?? [];
|
|
242
|
+
const missingPrerequisites = formatGoalBlockingPrerequisiteList(nextPrerequisites);
|
|
243
|
+
const hasBlockingPrerequisites = missingPrerequisites !== "Goal has no missing user prerequisites.";
|
|
244
|
+
const run = await upsertGoalRun(cwd, {
|
|
245
|
+
...(args.run_id ? { id: args.run_id } : {}),
|
|
246
|
+
title: args.title,
|
|
247
|
+
goal: args.goal,
|
|
248
|
+
status: hasBlockingPrerequisites ? "blocked" : (existing?.status ?? "ready"),
|
|
249
|
+
successCriteria: args.success_criteria ?? existing?.successCriteria ?? [],
|
|
250
|
+
prerequisites: nextPrerequisites,
|
|
251
|
+
harness: harness ?? existing?.harness ?? [],
|
|
252
|
+
evidencePlan: evidencePlan ?? existing?.evidencePlan ?? [],
|
|
253
|
+
...(verifier ? { verifier } : {}),
|
|
254
|
+
blockers: hasBlockingPrerequisites
|
|
255
|
+
? Array.from(new Set([...(args.blockers ?? existing?.blockers ?? []), missingPrerequisites]))
|
|
256
|
+
: (args.blockers ?? []),
|
|
257
|
+
});
|
|
258
|
+
await appendGoalDecision(cwd, run.id, {
|
|
259
|
+
kind: args.run_id ? "update" : "create",
|
|
260
|
+
reason: `criteria=${run.successCriteria.length}; prerequisites=${run.prerequisites.length}; harness=${run.harness.length}; evidence_plan=${run.evidencePlan.length}; verifier=${run.verifier?.command ? "configured" : "missing"}`,
|
|
261
|
+
});
|
|
262
|
+
log("INFO", "goals", `Goal created: ${run.title}`, { id: run.id, status: run.status });
|
|
263
|
+
return goalHasBlockingPrerequisites(run)
|
|
264
|
+
? `Goal ${args.run_id ? "updated" : "created"}: "${run.title}" (id: ${run.id.slice(0, 8)}, ${run.status}). User prerequisites: ${formatGoalBlockingPrerequisites(run)}`
|
|
265
|
+
: `Goal ${args.run_id ? "updated" : "created"}: "${run.title}" (id: ${run.id.slice(0, 8)}, ${run.status})`;
|
|
266
|
+
}
|
|
267
|
+
case "status": {
|
|
268
|
+
if (args.run_id) {
|
|
269
|
+
const run = await getGoalRun(cwd, args.run_id);
|
|
270
|
+
return run ? formatRun(run) : `Error: no goal found matching id "${args.run_id}".`;
|
|
271
|
+
}
|
|
272
|
+
const runs = await loadGoalRuns(cwd);
|
|
273
|
+
if (runs.length === 0)
|
|
274
|
+
return "No goals.";
|
|
275
|
+
return runs.map(formatRun).join("\n");
|
|
276
|
+
}
|
|
277
|
+
case "prerequisite": {
|
|
278
|
+
const run = await resolveRun(cwd, args.run_id);
|
|
279
|
+
if (!run)
|
|
280
|
+
return "Error: no active goal run found.";
|
|
281
|
+
const prereqId = args.prerequisite_id;
|
|
282
|
+
if (!prereqId && !args.prerequisite_label) {
|
|
283
|
+
return "Error: prerequisite_id or prerequisite_label is required.";
|
|
284
|
+
}
|
|
285
|
+
const prerequisites = [...run.prerequisites];
|
|
286
|
+
const index = prereqId
|
|
287
|
+
? prerequisites.findIndex((item) => item.id === prereqId || item.id.startsWith(prereqId))
|
|
288
|
+
: -1;
|
|
289
|
+
const patch = {
|
|
290
|
+
id: prereqId ?? randomUUID(),
|
|
291
|
+
label: args.prerequisite_label ?? prereqId ?? "Prerequisite",
|
|
292
|
+
status: asPrerequisiteStatus(args.prerequisite_status),
|
|
293
|
+
...(args.instructions ? { instructions: args.instructions } : {}),
|
|
294
|
+
...(args.summary ? { evidence: args.summary } : {}),
|
|
295
|
+
};
|
|
296
|
+
if (index >= 0) {
|
|
297
|
+
prerequisites[index] = {
|
|
298
|
+
...prerequisites[index],
|
|
299
|
+
...patch,
|
|
300
|
+
id: prerequisites[index].id,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
prerequisites.push(patch);
|
|
305
|
+
}
|
|
306
|
+
const stillBlocked = goalHasBlockingPrerequisites({ ...run, prerequisites });
|
|
307
|
+
const updated = await upsertGoalRun(cwd, {
|
|
308
|
+
...run,
|
|
309
|
+
prerequisites,
|
|
310
|
+
status: stillBlocked ? "blocked" : "ready",
|
|
311
|
+
blockers: stillBlocked ? run.blockers : [],
|
|
312
|
+
});
|
|
313
|
+
await appendGoalDecision(cwd, updated.id, {
|
|
314
|
+
kind: "prerequisites",
|
|
315
|
+
reason: `Prerequisite ${patch.label} is ${patch.status}; run is ${updated.status}.`,
|
|
316
|
+
});
|
|
317
|
+
return goalHasBlockingPrerequisites(updated)
|
|
318
|
+
? `Prerequisite updated for "${updated.title}" (${updated.status}). User prerequisites: ${formatGoalBlockingPrerequisites(updated)}`
|
|
319
|
+
: `User prerequisites complete for "${updated.title}". Goal is ready to run.`;
|
|
320
|
+
}
|
|
321
|
+
case "task": {
|
|
322
|
+
const run = await resolveRun(cwd, args.run_id);
|
|
323
|
+
if (!run)
|
|
324
|
+
return "Error: no active goal run found.";
|
|
325
|
+
if (!args.task_id && (!args.task_title || !args.task_prompt)) {
|
|
326
|
+
return "Error: task_title and task_prompt are required when adding a task.";
|
|
327
|
+
}
|
|
328
|
+
const taskId = args.task_id ?? randomUUID();
|
|
329
|
+
const existingTask = run.tasks.find((task) => task.id === taskId || task.id.startsWith(taskId));
|
|
330
|
+
const taskExisted = existingTask !== undefined;
|
|
331
|
+
if (!taskExisted && (!args.task_title || !args.task_prompt)) {
|
|
332
|
+
return "Error: task_title and task_prompt are required when adding a task.";
|
|
333
|
+
}
|
|
334
|
+
const taskStatus = asTaskStatus(args.task_status);
|
|
335
|
+
const updated = await updateGoalTask(cwd, run.id, taskId, {
|
|
336
|
+
id: taskId,
|
|
337
|
+
...(args.task_title ? { title: args.task_title } : {}),
|
|
338
|
+
...(args.task_prompt ? { prompt: args.task_prompt } : {}),
|
|
339
|
+
status: taskStatus,
|
|
340
|
+
...(args.worker_id ? { workerId: args.worker_id } : {}),
|
|
341
|
+
...(args.attempts !== undefined ? { attempts: args.attempts } : {}),
|
|
342
|
+
...(args.summary ? { lastSummary: args.summary } : {}),
|
|
343
|
+
});
|
|
344
|
+
const recovered = updated
|
|
345
|
+
? await upsertGoalRun(updated.projectPath, {
|
|
346
|
+
...updated,
|
|
347
|
+
status: statusAfterTaskPatch(updated, taskStatus),
|
|
348
|
+
})
|
|
349
|
+
: null;
|
|
350
|
+
if (!recovered)
|
|
351
|
+
return `Error: no task found matching id "${taskId}".`;
|
|
352
|
+
const updatedTask = recovered.tasks.find((task) => task.id === existingTask?.id || task.id === taskId || task.id.startsWith(taskId));
|
|
353
|
+
return `Goal task ${taskExisted ? "updated" : "added"}: "${updatedTask?.title ?? args.task_title ?? taskId}".`;
|
|
354
|
+
}
|
|
355
|
+
case "evidence": {
|
|
356
|
+
const run = await resolveRun(cwd, args.run_id);
|
|
357
|
+
if (!run)
|
|
358
|
+
return "Error: no active goal run found.";
|
|
359
|
+
if (!args.evidence_label && !args.summary)
|
|
360
|
+
return "Error: evidence_label or summary is required.";
|
|
361
|
+
const updated = await appendGoalEvidence(cwd, run.id, {
|
|
362
|
+
kind: asEvidenceKind(args.evidence_kind),
|
|
363
|
+
label: args.evidence_label ?? "Evidence",
|
|
364
|
+
...(args.evidence_path ? { path: args.evidence_path } : {}),
|
|
365
|
+
...(args.evidence_content || args.summary
|
|
366
|
+
? { content: args.evidence_content ?? args.summary }
|
|
367
|
+
: {}),
|
|
368
|
+
});
|
|
369
|
+
if (!updated)
|
|
370
|
+
return "Error: failed to append evidence.";
|
|
371
|
+
return `Evidence added to "${updated.title}".`;
|
|
372
|
+
}
|
|
373
|
+
case "verify": {
|
|
374
|
+
const run = await resolveRun(cwd, args.run_id);
|
|
375
|
+
if (!run)
|
|
376
|
+
return "Error: no active goal run found.";
|
|
377
|
+
const result = {
|
|
378
|
+
status: asVerificationStatus(args.verification_status),
|
|
379
|
+
summary: args.summary ?? "Verifier recorded.",
|
|
380
|
+
...((args.verifier_command ?? run.verifier?.command)
|
|
381
|
+
? { command: args.verifier_command ?? run.verifier?.command }
|
|
382
|
+
: {}),
|
|
383
|
+
...(args.exit_code !== undefined ? { exitCode: args.exit_code } : {}),
|
|
384
|
+
...(args.output_path ? { outputPath: args.output_path } : {}),
|
|
385
|
+
checkedAt: new Date().toISOString(),
|
|
386
|
+
};
|
|
387
|
+
const runWithVerifier = {
|
|
388
|
+
...run,
|
|
389
|
+
verifier: {
|
|
390
|
+
description: args.verifier_description ?? run.verifier?.description ?? "Goal verifier",
|
|
391
|
+
...((args.verifier_command ?? run.verifier?.command)
|
|
392
|
+
? { command: args.verifier_command ?? run.verifier?.command }
|
|
393
|
+
: {}),
|
|
394
|
+
lastResult: result,
|
|
395
|
+
},
|
|
396
|
+
evidence: [
|
|
397
|
+
...run.evidence,
|
|
398
|
+
createGoalEvidence({
|
|
399
|
+
kind: "command",
|
|
400
|
+
label: "Verifier result",
|
|
401
|
+
content: result.summary,
|
|
402
|
+
...(result.outputPath ? { path: result.outputPath } : {}),
|
|
403
|
+
}),
|
|
404
|
+
],
|
|
405
|
+
};
|
|
406
|
+
const completion = canCompleteGoalRun(runWithVerifier);
|
|
407
|
+
const updated = await upsertGoalRun(cwd, {
|
|
408
|
+
...runWithVerifier,
|
|
409
|
+
status: result.status === "pass" && completion.ok
|
|
410
|
+
? "passed"
|
|
411
|
+
: result.status === "pass"
|
|
412
|
+
? "ready"
|
|
413
|
+
: result.status === "fail"
|
|
414
|
+
? "ready"
|
|
415
|
+
: "verifying",
|
|
416
|
+
});
|
|
417
|
+
return `Verifier recorded for "${updated.title}": ${result.status}.`;
|
|
418
|
+
}
|
|
419
|
+
case "pause":
|
|
420
|
+
case "resume":
|
|
421
|
+
case "complete": {
|
|
422
|
+
const run = await resolveRun(cwd, args.run_id);
|
|
423
|
+
if (!run)
|
|
424
|
+
return "Error: no active goal run found.";
|
|
425
|
+
let status;
|
|
426
|
+
if (args.action === "pause")
|
|
427
|
+
status = "paused";
|
|
428
|
+
else if (args.action === "resume") {
|
|
429
|
+
const missing = goalHasBlockingPrerequisites(run)
|
|
430
|
+
? formatGoalBlockingPrerequisites(run)
|
|
431
|
+
: "";
|
|
432
|
+
if (missing) {
|
|
433
|
+
const updated = await upsertGoalRun(cwd, {
|
|
434
|
+
...run,
|
|
435
|
+
status: "blocked",
|
|
436
|
+
blockers: Array.from(new Set([...run.blockers, missing])),
|
|
437
|
+
evidence: [
|
|
438
|
+
...run.evidence,
|
|
439
|
+
createGoalEvidence({
|
|
440
|
+
kind: "summary",
|
|
441
|
+
label: "Goal resume blocked",
|
|
442
|
+
content: missing,
|
|
443
|
+
}),
|
|
444
|
+
],
|
|
445
|
+
});
|
|
446
|
+
return `Goal "${updated.title}" resume blocked: ${missing}`;
|
|
447
|
+
}
|
|
448
|
+
const requestedAt = new Date().toISOString();
|
|
449
|
+
const resumed = {
|
|
450
|
+
...run,
|
|
451
|
+
status: run.status === "running" || run.status === "verifying" ? run.status : "ready",
|
|
452
|
+
continueRequestedAt: requestedAt,
|
|
453
|
+
evidence: [
|
|
454
|
+
...run.evidence,
|
|
455
|
+
createGoalEvidence({
|
|
456
|
+
kind: "summary",
|
|
457
|
+
label: "Goal resume requested",
|
|
458
|
+
content: "Continuation requested; the next eligible Goal action will run automatically when no worker/verifier is active.",
|
|
459
|
+
createdAt: requestedAt,
|
|
460
|
+
}),
|
|
461
|
+
],
|
|
462
|
+
};
|
|
463
|
+
const decision = decideGoalNextAction(resumed);
|
|
464
|
+
const updated = await upsertGoalRun(cwd, resumed);
|
|
465
|
+
await appendGoalDecision(cwd, updated.id, {
|
|
466
|
+
kind: "resume",
|
|
467
|
+
reason: decision.kind === "wait" ||
|
|
468
|
+
decision.kind === "blocked" ||
|
|
469
|
+
decision.kind === "terminal" ||
|
|
470
|
+
decision.kind === "complete" ||
|
|
471
|
+
decision.kind === "create_task" ||
|
|
472
|
+
decision.kind === "pause" ||
|
|
473
|
+
decision.kind === "start_worker" ||
|
|
474
|
+
decision.kind === "run_verifier"
|
|
475
|
+
? decision.reason
|
|
476
|
+
: "Resume decision queued.",
|
|
477
|
+
content: `next=${decision.kind}`,
|
|
478
|
+
});
|
|
479
|
+
if (decision.kind === "wait") {
|
|
480
|
+
return `Goal "${updated.title}" resume queued: ${decision.reason}`;
|
|
481
|
+
}
|
|
482
|
+
if (decision.kind === "blocked") {
|
|
483
|
+
return `Goal "${updated.title}" resume blocked: ${decision.reason}`;
|
|
484
|
+
}
|
|
485
|
+
return `Goal "${updated.title}" resume requested; next action: ${decision.kind}.`;
|
|
486
|
+
}
|
|
487
|
+
else {
|
|
488
|
+
const completion = canCompleteGoalRun(run);
|
|
489
|
+
if (!completion.ok)
|
|
490
|
+
return `Error: cannot complete goal: ${completion.reason}`;
|
|
491
|
+
status = "passed";
|
|
492
|
+
}
|
|
493
|
+
const updated = await upsertGoalRun(cwd, { ...run, status });
|
|
494
|
+
return `Goal "${updated.title}" is now ${updated.status}.`;
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
},
|
|
498
|
+
};
|
|
499
|
+
}
|
|
500
|
+
//# sourceMappingURL=goals.js.map
|