@agent-vm/agent-vm-worker 0.0.20
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/LICENSE +21 -0
- package/dist/config/worker-config.d.ts +158 -0
- package/dist/config/worker-config.d.ts.map +1 -0
- package/dist/config/worker-config.js +280 -0
- package/dist/config/worker-config.js.map +1 -0
- package/dist/context/gather-context.d.ts +9 -0
- package/dist/context/gather-context.d.ts.map +1 -0
- package/dist/context/gather-context.js +72 -0
- package/dist/context/gather-context.js.map +1 -0
- package/dist/coordinator/coordinator-helpers.d.ts +13 -0
- package/dist/coordinator/coordinator-helpers.d.ts.map +1 -0
- package/dist/coordinator/coordinator-helpers.js +63 -0
- package/dist/coordinator/coordinator-helpers.js.map +1 -0
- package/dist/coordinator/coordinator-types.d.ts +25 -0
- package/dist/coordinator/coordinator-types.d.ts.map +1 -0
- package/dist/coordinator/coordinator-types.js +2 -0
- package/dist/coordinator/coordinator-types.js.map +1 -0
- package/dist/coordinator/coordinator.d.ts +4 -0
- package/dist/coordinator/coordinator.d.ts.map +1 -0
- package/dist/coordinator/coordinator.js +74 -0
- package/dist/coordinator/coordinator.js.map +1 -0
- package/dist/coordinator/task-runner.d.ts +5 -0
- package/dist/coordinator/task-runner.d.ts.map +1 -0
- package/dist/coordinator/task-runner.js +310 -0
- package/dist/coordinator/task-runner.js.map +1 -0
- package/dist/git/git-operations.d.ts +33 -0
- package/dist/git/git-operations.d.ts.map +1 -0
- package/dist/git/git-operations.js +109 -0
- package/dist/git/git-operations.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +11 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +140 -0
- package/dist/main.js.map +1 -0
- package/dist/plan-phase/plan-cycle.d.ts +27 -0
- package/dist/plan-phase/plan-cycle.d.ts.map +1 -0
- package/dist/plan-phase/plan-cycle.js +83 -0
- package/dist/plan-phase/plan-cycle.js.map +1 -0
- package/dist/prompt/message-builders.d.ts +44 -0
- package/dist/prompt/message-builders.d.ts.map +1 -0
- package/dist/prompt/message-builders.js +83 -0
- package/dist/prompt/message-builders.js.map +1 -0
- package/dist/prompt/prompt-assembler.d.ts +11 -0
- package/dist/prompt/prompt-assembler.d.ts.map +1 -0
- package/dist/prompt/prompt-assembler.js +34 -0
- package/dist/prompt/prompt-assembler.js.map +1 -0
- package/dist/prompt/prompt-defaults.d.ts +10 -0
- package/dist/prompt/prompt-defaults.d.ts.map +1 -0
- package/dist/prompt/prompt-defaults.js +200 -0
- package/dist/prompt/prompt-defaults.js.map +1 -0
- package/dist/server.d.ts +32 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +75 -0
- package/dist/server.js.map +1 -0
- package/dist/shared/phase-names.d.ts +8 -0
- package/dist/shared/phase-names.d.ts.map +1 -0
- package/dist/shared/phase-names.js +11 -0
- package/dist/shared/phase-names.js.map +1 -0
- package/dist/shared/repo-location.d.ts +13 -0
- package/dist/shared/repo-location.d.ts.map +1 -0
- package/dist/shared/repo-location.js +9 -0
- package/dist/shared/repo-location.js.map +1 -0
- package/dist/shared/review-result.d.ts +17 -0
- package/dist/shared/review-result.d.ts.map +1 -0
- package/dist/shared/review-result.js +12 -0
- package/dist/shared/review-result.js.map +1 -0
- package/dist/shared/skill-types.d.ts +7 -0
- package/dist/shared/skill-types.d.ts.map +1 -0
- package/dist/shared/skill-types.js +6 -0
- package/dist/shared/skill-types.js.map +1 -0
- package/dist/shared/stderr.d.ts +2 -0
- package/dist/shared/stderr.d.ts.map +1 -0
- package/dist/shared/stderr.js +4 -0
- package/dist/shared/stderr.js.map +1 -0
- package/dist/state/event-log.d.ts +4 -0
- package/dist/state/event-log.d.ts.map +1 -0
- package/dist/state/event-log.js +67 -0
- package/dist/state/event-log.js.map +1 -0
- package/dist/state/task-event-types.d.ts +280 -0
- package/dist/state/task-event-types.d.ts.map +1 -0
- package/dist/state/task-event-types.js +106 -0
- package/dist/state/task-event-types.js.map +1 -0
- package/dist/state/task-state.d.ts +35 -0
- package/dist/state/task-state.d.ts.map +1 -0
- package/dist/state/task-state.js +191 -0
- package/dist/state/task-state.js.map +1 -0
- package/dist/validation-runner/verification-runner.d.ts +30 -0
- package/dist/validation-runner/verification-runner.d.ts.map +1 -0
- package/dist/validation-runner/verification-runner.js +196 -0
- package/dist/validation-runner/verification-runner.js.map +1 -0
- package/dist/work-executor/codex-executor.d.ts +9 -0
- package/dist/work-executor/codex-executor.d.ts.map +1 -0
- package/dist/work-executor/codex-executor.js +159 -0
- package/dist/work-executor/codex-executor.js.map +1 -0
- package/dist/work-executor/executor-factory.d.ts +4 -0
- package/dist/work-executor/executor-factory.d.ts.map +1 -0
- package/dist/work-executor/executor-factory.js +17 -0
- package/dist/work-executor/executor-factory.js.map +1 -0
- package/dist/work-executor/executor-interface.d.ts +33 -0
- package/dist/work-executor/executor-interface.d.ts.map +1 -0
- package/dist/work-executor/executor-interface.js +2 -0
- package/dist/work-executor/executor-interface.js.map +1 -0
- package/dist/work-executor/local-tool-mcp-server.d.ts +8 -0
- package/dist/work-executor/local-tool-mcp-server.d.ts.map +1 -0
- package/dist/work-executor/local-tool-mcp-server.js +187 -0
- package/dist/work-executor/local-tool-mcp-server.js.map +1 -0
- package/dist/work-executor/persistent-thread.d.ts +16 -0
- package/dist/work-executor/persistent-thread.d.ts.map +1 -0
- package/dist/work-executor/persistent-thread.js +37 -0
- package/dist/work-executor/persistent-thread.js.map +1 -0
- package/dist/work-phase/controller-tools/controller-tool-support.d.ts +19 -0
- package/dist/work-phase/controller-tools/controller-tool-support.d.ts.map +1 -0
- package/dist/work-phase/controller-tools/controller-tool-support.js +92 -0
- package/dist/work-phase/controller-tools/controller-tool-support.js.map +1 -0
- package/dist/work-phase/controller-tools/git-pull-default-tool.d.ts +10 -0
- package/dist/work-phase/controller-tools/git-pull-default-tool.d.ts.map +1 -0
- package/dist/work-phase/controller-tools/git-pull-default-tool.js +36 -0
- package/dist/work-phase/controller-tools/git-pull-default-tool.js.map +1 -0
- package/dist/work-phase/controller-tools/git-push-tool.d.ts +10 -0
- package/dist/work-phase/controller-tools/git-push-tool.d.ts.map +1 -0
- package/dist/work-phase/controller-tools/git-push-tool.js +45 -0
- package/dist/work-phase/controller-tools/git-push-tool.js.map +1 -0
- package/dist/work-phase/validation-tool.d.ts +11 -0
- package/dist/work-phase/validation-tool.d.ts.map +1 -0
- package/dist/work-phase/validation-tool.js +25 -0
- package/dist/work-phase/validation-tool.js.map +1 -0
- package/dist/work-phase/work-cycle.d.ts +28 -0
- package/dist/work-phase/work-cycle.d.ts.map +1 -0
- package/dist/work-phase/work-cycle.js +122 -0
- package/dist/work-phase/work-cycle.js.map +1 -0
- package/dist/wrapup-phase/wrapup-runner.d.ts +30 -0
- package/dist/wrapup-phase/wrapup-runner.d.ts.map +1 -0
- package/dist/wrapup-phase/wrapup-runner.js +91 -0
- package/dist/wrapup-phase/wrapup-runner.js.map +1 -0
- package/package.json +57 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025-2026 Shravan Sunder
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const mcpServerSchema: z.ZodObject<{
|
|
3
|
+
name: z.ZodString;
|
|
4
|
+
url: z.ZodString;
|
|
5
|
+
}, z.core.$strip>;
|
|
6
|
+
export declare const phaseExecutorSchema: z.ZodObject<{
|
|
7
|
+
provider: z.ZodOptional<z.ZodString>;
|
|
8
|
+
model: z.ZodOptional<z.ZodString>;
|
|
9
|
+
}, z.core.$strip>;
|
|
10
|
+
declare const planCycleSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
11
|
+
kind: z.ZodLiteral<"noReview">;
|
|
12
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
13
|
+
kind: z.ZodLiteral<"review">;
|
|
14
|
+
cycleCount: z.ZodNumber;
|
|
15
|
+
}, z.core.$strip>], "kind">;
|
|
16
|
+
declare const workCycleSchema: z.ZodObject<{
|
|
17
|
+
kind: z.ZodLiteral<"review">;
|
|
18
|
+
cycleCount: z.ZodNumber;
|
|
19
|
+
}, z.core.$strip>;
|
|
20
|
+
export type PlanCycleConfig = z.infer<typeof planCycleSchema>;
|
|
21
|
+
export type WorkCycleConfig = z.infer<typeof workCycleSchema>;
|
|
22
|
+
export declare const planPhaseSchema: z.ZodObject<{
|
|
23
|
+
cycle: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
24
|
+
kind: z.ZodLiteral<"noReview">;
|
|
25
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
26
|
+
kind: z.ZodLiteral<"review">;
|
|
27
|
+
cycleCount: z.ZodNumber;
|
|
28
|
+
}, z.core.$strip>], "kind">;
|
|
29
|
+
agentInstructions: z.ZodUnion<readonly [z.ZodString, z.ZodNull]>;
|
|
30
|
+
reviewerInstructions: z.ZodUnion<readonly [z.ZodString, z.ZodNull]>;
|
|
31
|
+
agentTurnTimeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
32
|
+
reviewerTurnTimeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
33
|
+
skills: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
34
|
+
name: z.ZodString;
|
|
35
|
+
path: z.ZodString;
|
|
36
|
+
}, z.core.$strip>>>;
|
|
37
|
+
provider: z.ZodOptional<z.ZodString>;
|
|
38
|
+
model: z.ZodOptional<z.ZodString>;
|
|
39
|
+
}, z.core.$strip>;
|
|
40
|
+
export declare const workPhaseSchema: z.ZodObject<{
|
|
41
|
+
cycle: z.ZodObject<{
|
|
42
|
+
kind: z.ZodLiteral<"review">;
|
|
43
|
+
cycleCount: z.ZodNumber;
|
|
44
|
+
}, z.core.$strip>;
|
|
45
|
+
agentInstructions: z.ZodUnion<readonly [z.ZodString, z.ZodNull]>;
|
|
46
|
+
reviewerInstructions: z.ZodUnion<readonly [z.ZodString, z.ZodNull]>;
|
|
47
|
+
agentTurnTimeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
48
|
+
reviewerTurnTimeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
49
|
+
skills: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
50
|
+
name: z.ZodString;
|
|
51
|
+
path: z.ZodString;
|
|
52
|
+
}, z.core.$strip>>>;
|
|
53
|
+
provider: z.ZodOptional<z.ZodString>;
|
|
54
|
+
model: z.ZodOptional<z.ZodString>;
|
|
55
|
+
}, z.core.$strip>;
|
|
56
|
+
export declare const wrapupPhaseSchema: z.ZodObject<{
|
|
57
|
+
instructions: z.ZodUnion<readonly [z.ZodString, z.ZodNull]>;
|
|
58
|
+
turnTimeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
59
|
+
skills: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
60
|
+
name: z.ZodString;
|
|
61
|
+
path: z.ZodString;
|
|
62
|
+
}, z.core.$strip>>>;
|
|
63
|
+
provider: z.ZodOptional<z.ZodString>;
|
|
64
|
+
model: z.ZodOptional<z.ZodString>;
|
|
65
|
+
}, z.core.$strip>;
|
|
66
|
+
export declare const verificationCommandSchema: z.ZodObject<{
|
|
67
|
+
name: z.ZodString;
|
|
68
|
+
command: z.ZodString;
|
|
69
|
+
}, z.core.$strip>;
|
|
70
|
+
export declare const workerConfigSchema: z.ZodObject<{
|
|
71
|
+
instructions: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNull]>>;
|
|
72
|
+
defaults: z.ZodDefault<z.ZodObject<{
|
|
73
|
+
provider: z.ZodDefault<z.ZodString>;
|
|
74
|
+
model: z.ZodDefault<z.ZodString>;
|
|
75
|
+
}, z.core.$strip>>;
|
|
76
|
+
phases: z.ZodObject<{
|
|
77
|
+
plan: z.ZodObject<{
|
|
78
|
+
cycle: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
79
|
+
kind: z.ZodLiteral<"noReview">;
|
|
80
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
81
|
+
kind: z.ZodLiteral<"review">;
|
|
82
|
+
cycleCount: z.ZodNumber;
|
|
83
|
+
}, z.core.$strip>], "kind">;
|
|
84
|
+
agentInstructions: z.ZodUnion<readonly [z.ZodString, z.ZodNull]>;
|
|
85
|
+
reviewerInstructions: z.ZodUnion<readonly [z.ZodString, z.ZodNull]>;
|
|
86
|
+
agentTurnTimeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
87
|
+
reviewerTurnTimeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
88
|
+
skills: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
89
|
+
name: z.ZodString;
|
|
90
|
+
path: z.ZodString;
|
|
91
|
+
}, z.core.$strip>>>;
|
|
92
|
+
provider: z.ZodOptional<z.ZodString>;
|
|
93
|
+
model: z.ZodOptional<z.ZodString>;
|
|
94
|
+
}, z.core.$strip>;
|
|
95
|
+
work: z.ZodObject<{
|
|
96
|
+
cycle: z.ZodObject<{
|
|
97
|
+
kind: z.ZodLiteral<"review">;
|
|
98
|
+
cycleCount: z.ZodNumber;
|
|
99
|
+
}, z.core.$strip>;
|
|
100
|
+
agentInstructions: z.ZodUnion<readonly [z.ZodString, z.ZodNull]>;
|
|
101
|
+
reviewerInstructions: z.ZodUnion<readonly [z.ZodString, z.ZodNull]>;
|
|
102
|
+
agentTurnTimeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
103
|
+
reviewerTurnTimeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
104
|
+
skills: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
105
|
+
name: z.ZodString;
|
|
106
|
+
path: z.ZodString;
|
|
107
|
+
}, z.core.$strip>>>;
|
|
108
|
+
provider: z.ZodOptional<z.ZodString>;
|
|
109
|
+
model: z.ZodOptional<z.ZodString>;
|
|
110
|
+
}, z.core.$strip>;
|
|
111
|
+
wrapup: z.ZodObject<{
|
|
112
|
+
instructions: z.ZodUnion<readonly [z.ZodString, z.ZodNull]>;
|
|
113
|
+
turnTimeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
114
|
+
skills: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
115
|
+
name: z.ZodString;
|
|
116
|
+
path: z.ZodString;
|
|
117
|
+
}, z.core.$strip>>>;
|
|
118
|
+
provider: z.ZodOptional<z.ZodString>;
|
|
119
|
+
model: z.ZodOptional<z.ZodString>;
|
|
120
|
+
}, z.core.$strip>;
|
|
121
|
+
}, z.core.$strict>;
|
|
122
|
+
mcpServers: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
123
|
+
name: z.ZodString;
|
|
124
|
+
url: z.ZodString;
|
|
125
|
+
}, z.core.$strip>>>;
|
|
126
|
+
verification: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
127
|
+
name: z.ZodString;
|
|
128
|
+
command: z.ZodString;
|
|
129
|
+
}, z.core.$strip>>>;
|
|
130
|
+
verificationTimeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
131
|
+
branchPrefix: z.ZodDefault<z.ZodString>;
|
|
132
|
+
stateDir: z.ZodDefault<z.ZodString>;
|
|
133
|
+
}, z.core.$strict>;
|
|
134
|
+
export type PlanPhaseConfig = z.infer<typeof planPhaseSchema>;
|
|
135
|
+
export type WorkPhaseConfig = z.infer<typeof workPhaseSchema>;
|
|
136
|
+
export type WrapupPhaseConfig = z.infer<typeof wrapupPhaseSchema>;
|
|
137
|
+
export type WorkerConfig = z.infer<typeof workerConfigSchema>;
|
|
138
|
+
export declare function computeTotalTaskTimeoutMs(config: WorkerConfig): number;
|
|
139
|
+
export type ReasoningEffort = 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';
|
|
140
|
+
interface ResolvedModel {
|
|
141
|
+
readonly model: string;
|
|
142
|
+
readonly reasoningEffort: ReasoningEffort;
|
|
143
|
+
}
|
|
144
|
+
export declare function resolveModelAlias(provider: string, model: string): ResolvedModel;
|
|
145
|
+
export declare function resolvePhaseExecutor(config: WorkerConfig, phase: {
|
|
146
|
+
readonly provider?: string | undefined;
|
|
147
|
+
readonly model?: string | undefined;
|
|
148
|
+
}): {
|
|
149
|
+
readonly provider: string;
|
|
150
|
+
readonly model: string;
|
|
151
|
+
readonly reasoningEffort: ReasoningEffort;
|
|
152
|
+
};
|
|
153
|
+
export declare function resolveWorkerConfigInstructionReferences(rawConfig: Record<string, unknown>, options: {
|
|
154
|
+
readonly configPath: string;
|
|
155
|
+
}): Promise<Record<string, unknown>>;
|
|
156
|
+
export declare function loadWorkerConfig(configPath?: string): Promise<WorkerConfig>;
|
|
157
|
+
export {};
|
|
158
|
+
//# sourceMappingURL=worker-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-config.d.ts","sourceRoot":"","sources":["../../src/config/worker-config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,eAAe;;;iBAG1B,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;iBAG9B,CAAC;AAmBH,QAAA,MAAM,eAAe;;;;;2BAAyE,CAAC;AAG/F,QAAA,MAAM,eAAe;;;iBAAoB,CAAC;AAE1C,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAC9D,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAiB9D,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;iBAgB1B,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;iBAgB1B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;;iBAS5B,CAAC;AAUH,eAAO,MAAM,yBAAyB;;;iBAGpC,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAmBrB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAC9D,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAC9D,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAClE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAY9D,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAMtE;AAED,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAE9E,UAAU,aAAa;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;CAC1C;AAeD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,CAEhF;AAED,wBAAgB,oBAAoB,CACnC,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE;IAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACpF;IACF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;CAC1C,CAUA;AA+HD,wBAAsB,wCAAwC,CAC7D,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,OAAO,EAAE;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACtC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA0DlC;AAED,wBAAsB,gBAAgB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAejF"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { readFile, realpath } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { skillReferenceSchema } from '../shared/skill-types.js';
|
|
5
|
+
export const mcpServerSchema = z.object({
|
|
6
|
+
name: z.string().min(1),
|
|
7
|
+
url: z.string().min(1),
|
|
8
|
+
});
|
|
9
|
+
export const phaseExecutorSchema = z.object({
|
|
10
|
+
provider: z.string().min(1).optional(),
|
|
11
|
+
model: z.string().min(1).optional(),
|
|
12
|
+
});
|
|
13
|
+
// Cycle semantics:
|
|
14
|
+
// noReview: just <agent> 1 turn
|
|
15
|
+
// review: <agent> → review → <agent> × cycleCount 1 + 2N turns
|
|
16
|
+
//
|
|
17
|
+
// A "cycle" always ENDS on the agent's revise turn, so reviewer feedback
|
|
18
|
+
// always reaches the agent. plan accepts both shapes; work must always
|
|
19
|
+
// include review (minimum 1 cycle).
|
|
20
|
+
const noReviewCycleSchema = z.object({
|
|
21
|
+
kind: z.literal('noReview'),
|
|
22
|
+
});
|
|
23
|
+
const reviewCycleSchema = z.object({
|
|
24
|
+
kind: z.literal('review'),
|
|
25
|
+
cycleCount: z.number().int().min(1),
|
|
26
|
+
});
|
|
27
|
+
const planCycleSchema = z.discriminatedUnion('kind', [noReviewCycleSchema, reviewCycleSchema]);
|
|
28
|
+
// work can never be noReview — minimum 1 cycle enforced by schema
|
|
29
|
+
const workCycleSchema = reviewCycleSchema;
|
|
30
|
+
const instructionTextSchema = z.string();
|
|
31
|
+
const nullableInstructionTextSchema = z.union([instructionTextSchema, z.null()]);
|
|
32
|
+
const instructionFileReferenceSchema = z
|
|
33
|
+
.object({
|
|
34
|
+
path: z.string().min(1),
|
|
35
|
+
})
|
|
36
|
+
.strict();
|
|
37
|
+
const instructionInputSchema = z.union([instructionTextSchema, instructionFileReferenceSchema]);
|
|
38
|
+
const nullableInstructionInputSchema = z.union([instructionInputSchema, z.null()]);
|
|
39
|
+
export const planPhaseSchema = z.object({
|
|
40
|
+
...phaseExecutorSchema.shape,
|
|
41
|
+
cycle: planCycleSchema,
|
|
42
|
+
agentInstructions: nullableInstructionTextSchema,
|
|
43
|
+
reviewerInstructions: nullableInstructionTextSchema,
|
|
44
|
+
agentTurnTimeoutMs: z
|
|
45
|
+
.number()
|
|
46
|
+
.int()
|
|
47
|
+
.positive()
|
|
48
|
+
.default(15 * 60_000),
|
|
49
|
+
reviewerTurnTimeoutMs: z
|
|
50
|
+
.number()
|
|
51
|
+
.int()
|
|
52
|
+
.positive()
|
|
53
|
+
.default(15 * 60_000),
|
|
54
|
+
skills: z.array(skillReferenceSchema).default([]),
|
|
55
|
+
});
|
|
56
|
+
export const workPhaseSchema = z.object({
|
|
57
|
+
...phaseExecutorSchema.shape,
|
|
58
|
+
cycle: workCycleSchema,
|
|
59
|
+
agentInstructions: nullableInstructionTextSchema,
|
|
60
|
+
reviewerInstructions: nullableInstructionTextSchema,
|
|
61
|
+
agentTurnTimeoutMs: z
|
|
62
|
+
.number()
|
|
63
|
+
.int()
|
|
64
|
+
.positive()
|
|
65
|
+
.default(45 * 60_000),
|
|
66
|
+
reviewerTurnTimeoutMs: z
|
|
67
|
+
.number()
|
|
68
|
+
.int()
|
|
69
|
+
.positive()
|
|
70
|
+
.default(15 * 60_000),
|
|
71
|
+
skills: z.array(skillReferenceSchema).default([]),
|
|
72
|
+
});
|
|
73
|
+
export const wrapupPhaseSchema = z.object({
|
|
74
|
+
...phaseExecutorSchema.shape,
|
|
75
|
+
instructions: nullableInstructionTextSchema,
|
|
76
|
+
turnTimeoutMs: z
|
|
77
|
+
.number()
|
|
78
|
+
.int()
|
|
79
|
+
.positive()
|
|
80
|
+
.default(15 * 60_000),
|
|
81
|
+
skills: z.array(skillReferenceSchema).default([]),
|
|
82
|
+
});
|
|
83
|
+
const phasesSchema = z
|
|
84
|
+
.object({
|
|
85
|
+
plan: planPhaseSchema,
|
|
86
|
+
work: workPhaseSchema,
|
|
87
|
+
wrapup: wrapupPhaseSchema,
|
|
88
|
+
})
|
|
89
|
+
.strict();
|
|
90
|
+
export const verificationCommandSchema = z.object({
|
|
91
|
+
name: z.string().min(1),
|
|
92
|
+
command: z.string().min(1),
|
|
93
|
+
});
|
|
94
|
+
export const workerConfigSchema = z
|
|
95
|
+
.object({
|
|
96
|
+
instructions: nullableInstructionTextSchema.optional(),
|
|
97
|
+
defaults: z
|
|
98
|
+
.object({
|
|
99
|
+
provider: z.string().min(1).default('codex'),
|
|
100
|
+
model: z.string().min(1).default('latest-medium'),
|
|
101
|
+
})
|
|
102
|
+
.default(() => ({
|
|
103
|
+
provider: 'codex',
|
|
104
|
+
model: 'latest-medium',
|
|
105
|
+
})),
|
|
106
|
+
phases: phasesSchema,
|
|
107
|
+
mcpServers: z.array(mcpServerSchema).default([]),
|
|
108
|
+
verification: z.array(verificationCommandSchema).default([]),
|
|
109
|
+
verificationTimeoutMs: z.number().positive().default(300_000),
|
|
110
|
+
branchPrefix: z.string().min(1).default('agent/'),
|
|
111
|
+
stateDir: z.string().min(1).default('/state'),
|
|
112
|
+
})
|
|
113
|
+
.strict();
|
|
114
|
+
const TOTAL_TIMEOUT_BUFFER_PERCENT = 10;
|
|
115
|
+
function phaseWorstCaseMs(phase) {
|
|
116
|
+
if (phase.cycle.kind === 'noReview') {
|
|
117
|
+
return phase.agentTurnTimeoutMs;
|
|
118
|
+
}
|
|
119
|
+
const cycles = phase.cycle.cycleCount;
|
|
120
|
+
return (cycles + 1) * phase.agentTurnTimeoutMs + cycles * phase.reviewerTurnTimeoutMs;
|
|
121
|
+
}
|
|
122
|
+
export function computeTotalTaskTimeoutMs(config) {
|
|
123
|
+
const planMs = phaseWorstCaseMs(config.phases.plan);
|
|
124
|
+
const workMs = phaseWorstCaseMs(config.phases.work);
|
|
125
|
+
const wrapupMs = config.phases.wrapup.turnTimeoutMs;
|
|
126
|
+
const baseMs = planMs + workMs + wrapupMs;
|
|
127
|
+
return baseMs + Math.ceil((baseMs * TOTAL_TIMEOUT_BUFFER_PERCENT) / 100);
|
|
128
|
+
}
|
|
129
|
+
const MODEL_ALIASES = {
|
|
130
|
+
codex: {
|
|
131
|
+
latest: { model: 'gpt-5.4', reasoningEffort: 'high' },
|
|
132
|
+
'latest-medium': { model: 'gpt-5.4', reasoningEffort: 'low' },
|
|
133
|
+
'latest-mini': { model: 'gpt-5.4-mini', reasoningEffort: 'medium' },
|
|
134
|
+
},
|
|
135
|
+
claude: {
|
|
136
|
+
latest: { model: 'claude-opus-4-6', reasoningEffort: 'high' },
|
|
137
|
+
'latest-medium': { model: 'claude-sonnet-4-6', reasoningEffort: 'medium' },
|
|
138
|
+
'latest-mini': { model: 'claude-haiku-4-5', reasoningEffort: 'medium' },
|
|
139
|
+
},
|
|
140
|
+
};
|
|
141
|
+
export function resolveModelAlias(provider, model) {
|
|
142
|
+
return MODEL_ALIASES[provider]?.[model] ?? { model, reasoningEffort: 'medium' };
|
|
143
|
+
}
|
|
144
|
+
export function resolvePhaseExecutor(config, phase) {
|
|
145
|
+
const provider = phase.provider ?? config.defaults.provider;
|
|
146
|
+
const model = phase.model ?? config.defaults.model;
|
|
147
|
+
const resolved = resolveModelAlias(provider, model);
|
|
148
|
+
return {
|
|
149
|
+
provider,
|
|
150
|
+
model: resolved.model,
|
|
151
|
+
reasoningEffort: resolved.reasoningEffort,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
function buildDefaultWorkerConfigInput() {
|
|
155
|
+
return {
|
|
156
|
+
phases: {
|
|
157
|
+
plan: {
|
|
158
|
+
cycle: { kind: 'review', cycleCount: 2 },
|
|
159
|
+
agentInstructions: null,
|
|
160
|
+
reviewerInstructions: null,
|
|
161
|
+
skills: [],
|
|
162
|
+
},
|
|
163
|
+
work: {
|
|
164
|
+
cycle: { kind: 'review', cycleCount: 4 },
|
|
165
|
+
agentInstructions: null,
|
|
166
|
+
reviewerInstructions: null,
|
|
167
|
+
skills: [],
|
|
168
|
+
},
|
|
169
|
+
wrapup: { instructions: null, skills: [] },
|
|
170
|
+
},
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
function isObjectRecord(value) {
|
|
174
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
175
|
+
}
|
|
176
|
+
async function readInstructionReference(reference, configDir, fieldPath) {
|
|
177
|
+
if (path.isAbsolute(reference.path)) {
|
|
178
|
+
throw new Error(`Invalid worker config ${fieldPath}: prompt file path must be relative to ./prompts.`);
|
|
179
|
+
}
|
|
180
|
+
const promptsRootPath = path.resolve(configDir, 'prompts');
|
|
181
|
+
const filePath = path.resolve(configDir, reference.path);
|
|
182
|
+
const relativeToPromptsRoot = path.relative(promptsRootPath, filePath);
|
|
183
|
+
if (relativeToPromptsRoot.startsWith('..') || path.isAbsolute(relativeToPromptsRoot)) {
|
|
184
|
+
throw new Error(`Invalid worker config ${fieldPath}: prompt file path must stay under './prompts'.`);
|
|
185
|
+
}
|
|
186
|
+
try {
|
|
187
|
+
const [realPromptsRootPath, realFilePath] = await Promise.all([
|
|
188
|
+
realpath(promptsRootPath),
|
|
189
|
+
realpath(filePath),
|
|
190
|
+
]);
|
|
191
|
+
const realRelativePath = path.relative(realPromptsRootPath, realFilePath);
|
|
192
|
+
if (realRelativePath.startsWith('..') || path.isAbsolute(realRelativePath)) {
|
|
193
|
+
throw new Error(`prompt file path escapes '${realPromptsRootPath}'`);
|
|
194
|
+
}
|
|
195
|
+
return await readFile(filePath, 'utf-8');
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
199
|
+
throw new Error(`Failed to load worker config ${fieldPath} from '${filePath}': ${message}`, {
|
|
200
|
+
cause: error,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
async function resolveInstructionInput(value, configDir, fieldPath) {
|
|
205
|
+
const parsed = nullableInstructionInputSchema.safeParse(value);
|
|
206
|
+
if (!parsed.success) {
|
|
207
|
+
throw new Error(`Invalid worker config ${fieldPath}: expected string, null, or { "path": string }.`, { cause: parsed.error });
|
|
208
|
+
}
|
|
209
|
+
const instructionInput = parsed.data;
|
|
210
|
+
if (instructionInput === null || typeof instructionInput === 'string') {
|
|
211
|
+
return instructionInput;
|
|
212
|
+
}
|
|
213
|
+
return await readInstructionReference(instructionInput, configDir, fieldPath);
|
|
214
|
+
}
|
|
215
|
+
async function resolveOptionalInstructionInput(value, configDir, fieldPath) {
|
|
216
|
+
if (value === undefined) {
|
|
217
|
+
return undefined;
|
|
218
|
+
}
|
|
219
|
+
return await resolveInstructionInput(value, configDir, fieldPath);
|
|
220
|
+
}
|
|
221
|
+
async function resolveInstructionField(record, fieldName, configDir, fieldPath) {
|
|
222
|
+
if (!(fieldName in record)) {
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
record[fieldName] = await resolveInstructionInput(record[fieldName], configDir, fieldPath);
|
|
226
|
+
}
|
|
227
|
+
async function resolveOptionalInstructionField(record, fieldName, configDir, fieldPath) {
|
|
228
|
+
if (!(fieldName in record)) {
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
record[fieldName] = await resolveOptionalInstructionInput(record[fieldName], configDir, fieldPath);
|
|
232
|
+
}
|
|
233
|
+
function cloneRecordIfObject(value) {
|
|
234
|
+
return isObjectRecord(value) ? { ...value } : undefined;
|
|
235
|
+
}
|
|
236
|
+
export async function resolveWorkerConfigInstructionReferences(rawConfig, options) {
|
|
237
|
+
const configDir = path.dirname(path.resolve(options.configPath));
|
|
238
|
+
const resolvedConfig = { ...rawConfig };
|
|
239
|
+
await resolveOptionalInstructionField(resolvedConfig, 'instructions', configDir, 'instructions');
|
|
240
|
+
const phases = cloneRecordIfObject(resolvedConfig.phases);
|
|
241
|
+
if (!phases) {
|
|
242
|
+
return resolvedConfig;
|
|
243
|
+
}
|
|
244
|
+
const planPhase = cloneRecordIfObject(phases.plan);
|
|
245
|
+
if (planPhase) {
|
|
246
|
+
await resolveInstructionField(planPhase, 'agentInstructions', configDir, 'phases.plan.agentInstructions');
|
|
247
|
+
await resolveInstructionField(planPhase, 'reviewerInstructions', configDir, 'phases.plan.reviewerInstructions');
|
|
248
|
+
phases.plan = planPhase;
|
|
249
|
+
}
|
|
250
|
+
const workPhase = cloneRecordIfObject(phases.work);
|
|
251
|
+
if (workPhase) {
|
|
252
|
+
await resolveInstructionField(workPhase, 'agentInstructions', configDir, 'phases.work.agentInstructions');
|
|
253
|
+
await resolveInstructionField(workPhase, 'reviewerInstructions', configDir, 'phases.work.reviewerInstructions');
|
|
254
|
+
phases.work = workPhase;
|
|
255
|
+
}
|
|
256
|
+
const wrapupPhase = cloneRecordIfObject(phases.wrapup);
|
|
257
|
+
if (wrapupPhase) {
|
|
258
|
+
await resolveInstructionField(wrapupPhase, 'instructions', configDir, 'phases.wrapup.instructions');
|
|
259
|
+
phases.wrapup = wrapupPhase;
|
|
260
|
+
}
|
|
261
|
+
resolvedConfig.phases = phases;
|
|
262
|
+
return resolvedConfig;
|
|
263
|
+
}
|
|
264
|
+
export async function loadWorkerConfig(configPath) {
|
|
265
|
+
if (!configPath) {
|
|
266
|
+
return workerConfigSchema.parse(buildDefaultWorkerConfigInput());
|
|
267
|
+
}
|
|
268
|
+
try {
|
|
269
|
+
const raw = JSON.parse(await readFile(configPath, 'utf-8'));
|
|
270
|
+
const resolvedRaw = isObjectRecord(raw)
|
|
271
|
+
? await resolveWorkerConfigInstructionReferences(raw, { configPath })
|
|
272
|
+
: raw;
|
|
273
|
+
return workerConfigSchema.parse(resolvedRaw);
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
277
|
+
throw new Error(`Invalid worker config: ${message}`, { cause: error });
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=worker-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-config.js","sourceRoot":"","sources":["../../src/config/worker-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface RepoContext {
|
|
2
|
+
readonly fileCount: number;
|
|
3
|
+
readonly summary: string;
|
|
4
|
+
readonly claudeMd: string | null;
|
|
5
|
+
readonly packageJson: string | null;
|
|
6
|
+
}
|
|
7
|
+
export declare function readOptionalFile(filePath: string): Promise<string | null>;
|
|
8
|
+
export declare function gatherContext(workspaceDir: string): Promise<RepoContext>;
|
|
9
|
+
//# sourceMappingURL=gather-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gather-context.d.ts","sourceRoot":"","sources":["../../src/context/gather-context.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAgCD,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAS/E;AAED,wBAAsB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAyC9E"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import * as fs from 'node:fs/promises';
|
|
2
|
+
import { join, relative } from 'node:path';
|
|
3
|
+
const SKIP_DIRS = new Set(['node_modules', '.git', 'dist', 'build', 'coverage']);
|
|
4
|
+
async function collectFiles(dir, baseDir, depth, maxDepth) {
|
|
5
|
+
if (depth > maxDepth)
|
|
6
|
+
return [];
|
|
7
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
8
|
+
const nested = await Promise.all(entries
|
|
9
|
+
.filter((entry) => !SKIP_DIRS.has(entry.name))
|
|
10
|
+
.map(async (entry) => {
|
|
11
|
+
const fullPath = join(dir, entry.name);
|
|
12
|
+
if (entry.isDirectory()) {
|
|
13
|
+
return await collectFiles(fullPath, baseDir, depth + 1, maxDepth);
|
|
14
|
+
}
|
|
15
|
+
return [relative(baseDir, fullPath)];
|
|
16
|
+
}));
|
|
17
|
+
return nested.flat();
|
|
18
|
+
}
|
|
19
|
+
function formatMetadataSection(filePath, content) {
|
|
20
|
+
return `${filePath} contents:\n${content}`;
|
|
21
|
+
}
|
|
22
|
+
export async function readOptionalFile(filePath) {
|
|
23
|
+
try {
|
|
24
|
+
return await fs.readFile(filePath, 'utf-8');
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
if (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT') {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
throw error;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export async function gatherContext(workspaceDir) {
|
|
34
|
+
const files = await collectFiles(workspaceDir, workspaceDir, 0, 3);
|
|
35
|
+
const claudeMd = await readOptionalFile(join(workspaceDir, 'CLAUDE.md'));
|
|
36
|
+
const packageJson = await readOptionalFile(join(workspaceDir, 'package.json'));
|
|
37
|
+
const repoMetadataLines = files
|
|
38
|
+
.filter((filePath) => filePath.endsWith('CLAUDE.md') || filePath.endsWith('package.json'))
|
|
39
|
+
.slice(0, 20);
|
|
40
|
+
const summarySections = [`Repository structure (${files.length} files):`, files.join('\n')];
|
|
41
|
+
if (repoMetadataLines.length > 0) {
|
|
42
|
+
summarySections.push('', 'Discovered repo metadata files:', repoMetadataLines.join('\n'));
|
|
43
|
+
}
|
|
44
|
+
if (claudeMd) {
|
|
45
|
+
summarySections.push('', formatMetadataSection('CLAUDE.md', claudeMd));
|
|
46
|
+
}
|
|
47
|
+
if (packageJson) {
|
|
48
|
+
summarySections.push('', formatMetadataSection('package.json', packageJson));
|
|
49
|
+
}
|
|
50
|
+
const nestedMetadataSections = await Promise.all(repoMetadataLines
|
|
51
|
+
.filter((filePath) => filePath !== 'CLAUDE.md' && filePath !== 'package.json')
|
|
52
|
+
.map(async (filePath) => {
|
|
53
|
+
const content = await readOptionalFile(join(workspaceDir, filePath));
|
|
54
|
+
if (!content) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
return formatMetadataSection(filePath, content);
|
|
58
|
+
}));
|
|
59
|
+
for (const section of nestedMetadataSections) {
|
|
60
|
+
if (section) {
|
|
61
|
+
summarySections.push('', section);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const summary = summarySections.join('\n');
|
|
65
|
+
return {
|
|
66
|
+
fileCount: files.length,
|
|
67
|
+
summary,
|
|
68
|
+
claudeMd,
|
|
69
|
+
packageJson,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=gather-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gather-context.js","sourceRoot":"","sources":["../../src/context/gather-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { WorkerConfig } from '../config/worker-config.js';
|
|
2
|
+
import type { TaskConfig, TaskEvent } from '../state/task-event-types.js';
|
|
3
|
+
import { type TaskState } from '../state/task-state.js';
|
|
4
|
+
import type { CreateTaskInput } from './coordinator-types.js';
|
|
5
|
+
export declare function sanitizeErrorMessage(message: string): string;
|
|
6
|
+
export declare function buildTaskConfig(input: CreateTaskInput, config: WorkerConfig): TaskConfig;
|
|
7
|
+
export declare function createTaskEventRecorder(stateDir: string, tasks: Map<string, TaskState>, closedTaskIds: Set<string>): TaskEventRecorder;
|
|
8
|
+
export interface TaskEventRecorder {
|
|
9
|
+
readonly emit: (taskId: string, event: TaskEvent) => Promise<void>;
|
|
10
|
+
readonly isClosed: (taskId: string) => boolean;
|
|
11
|
+
readonly recordTaskFailure: (taskId: string, reason: string) => Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=coordinator-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordinator-helpers.d.ts","sourceRoot":"","sources":["../../src/coordinator/coordinator-helpers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAG/D,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQ5D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,YAAY,GAAG,UAAU,CAQxF;AAED,wBAAgB,uBAAuB,CACtC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAC7B,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,GACxB,iBAAiB,CA4CnB;AAED,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IAC/C,QAAQ,CAAC,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9E"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { writeStderr } from '../shared/stderr.js';
|
|
3
|
+
import { appendEvent } from '../state/event-log.js';
|
|
4
|
+
import { applyEvent } from '../state/task-state.js';
|
|
5
|
+
export function sanitizeErrorMessage(message) {
|
|
6
|
+
return message
|
|
7
|
+
.replace(/https:\/\/x-access-token:[^@]*@/g, 'https://x-access-token:***@')
|
|
8
|
+
.replace(/sk-[A-Za-z0-9_-]{20,}/g, 'sk-***')
|
|
9
|
+
.replace(/ghp_[A-Za-z0-9_]{20,}/g, 'ghp_***')
|
|
10
|
+
.replace(/ghs_[A-Za-z0-9_]{20,}/g, 'ghs_***')
|
|
11
|
+
.replace(/Bearer [A-Za-z0-9._-]+/giu, 'Bearer ***')
|
|
12
|
+
.replace(/OPENAI_API_KEY=[^\s]+/gu, 'OPENAI_API_KEY=***');
|
|
13
|
+
}
|
|
14
|
+
export function buildTaskConfig(input, config) {
|
|
15
|
+
return {
|
|
16
|
+
taskId: input.taskId,
|
|
17
|
+
prompt: input.prompt,
|
|
18
|
+
repos: [...(input.repos ?? [])],
|
|
19
|
+
context: input.context ?? {},
|
|
20
|
+
effectiveConfig: config,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export function createTaskEventRecorder(stateDir, tasks, closedTaskIds) {
|
|
24
|
+
function logPath(taskId) {
|
|
25
|
+
return join(stateDir, 'tasks', `${taskId}.jsonl`);
|
|
26
|
+
}
|
|
27
|
+
async function emit(taskId, event) {
|
|
28
|
+
if (closedTaskIds.has(taskId) && event.event !== 'task-closed') {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
await appendEvent(logPath(taskId), event);
|
|
32
|
+
const current = tasks.get(taskId);
|
|
33
|
+
if (current) {
|
|
34
|
+
tasks.set(taskId, applyEvent(current, event));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async function recordTaskFailure(taskId, reason) {
|
|
38
|
+
try {
|
|
39
|
+
await emit(taskId, { event: 'task-failed', reason });
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
43
|
+
writeStderr(`[task-event-recorder] Failed to append task-failed for ${taskId}: ${message}`);
|
|
44
|
+
const current = tasks.get(taskId);
|
|
45
|
+
if (current) {
|
|
46
|
+
tasks.set(taskId, applyEvent(current, { event: 'task-failed', reason }));
|
|
47
|
+
}
|
|
48
|
+
writeStderr(`[task-event-recorder] Fatal: task-failed could not be persisted for ${taskId}; exiting to avoid state resurrection on restart.`);
|
|
49
|
+
process.exitCode = 1;
|
|
50
|
+
setImmediate(() => {
|
|
51
|
+
process.exit(1);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
emit,
|
|
57
|
+
isClosed(taskId) {
|
|
58
|
+
return closedTaskIds.has(taskId);
|
|
59
|
+
},
|
|
60
|
+
recordTaskFailure,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=coordinator-helpers.js.map
|