@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
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/* oxlint-disable eslint/no-await-in-loop -- cycle turns are stateful and sequential */
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { buildInitialWorkMessage, buildWorkReviewMessage, buildWorkReviseMessage, } from '../prompt/message-builders.js';
|
|
4
|
+
import { reviewResultSchema } from '../shared/review-result.js';
|
|
5
|
+
import { writeStderr } from '../shared/stderr.js';
|
|
6
|
+
import { verificationCommandResultSchema, } from '../state/task-event-types.js';
|
|
7
|
+
const runValidationToolEnvelopeSchema = z
|
|
8
|
+
.array(z.object({
|
|
9
|
+
tool: z.literal('run_validation'),
|
|
10
|
+
result: z.array(verificationCommandResultSchema),
|
|
11
|
+
}))
|
|
12
|
+
.length(1);
|
|
13
|
+
const nestedValidationResultsSchema = z.array(z.array(verificationCommandResultSchema)).length(1);
|
|
14
|
+
const REVIEWER_NUDGE = 'You did not call run_validation in the previous turn because validationResults was empty. Call it now, include the results in validationResults, and return the same JSON schema.';
|
|
15
|
+
const MALFORMED_REVIEW_NUDGE = 'Your previous review response did not match the required JSON schema. Return valid JSON with approved, summary, comments, and validationResults. Every comment must include file, severity, and comment.';
|
|
16
|
+
function firstTurn(systemPrompt, userMessage) {
|
|
17
|
+
return `# System\n${systemPrompt}\n\n# Task\n${userMessage}`;
|
|
18
|
+
}
|
|
19
|
+
function parseWorkReview(response) {
|
|
20
|
+
let parsed;
|
|
21
|
+
try {
|
|
22
|
+
parsed = JSON.parse(response);
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
throw new Error(`work-reviewer response is not valid JSON. Raw: ${response.slice(0, 200)}`, {
|
|
26
|
+
cause: error,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
const reviewResult = reviewResultSchema.safeParse(parsed);
|
|
30
|
+
if (!reviewResult.success) {
|
|
31
|
+
throw new Error(`work-reviewer response does not match ReviewResult schema: ${reviewResult.error.message}. Raw: ${response.slice(0, 200)}`);
|
|
32
|
+
}
|
|
33
|
+
const rawValidationResults = typeof parsed === 'object' && parsed !== null && 'validationResults' in parsed
|
|
34
|
+
? parsed.validationResults
|
|
35
|
+
: [];
|
|
36
|
+
const envelopeParse = runValidationToolEnvelopeSchema.safeParse(rawValidationResults);
|
|
37
|
+
const nestedParse = nestedValidationResultsSchema.safeParse(rawValidationResults);
|
|
38
|
+
const normalizedValidationResults = envelopeParse.success
|
|
39
|
+
? (envelopeParse.data[0]?.result ?? [])
|
|
40
|
+
: nestedParse.success
|
|
41
|
+
? (nestedParse.data[0] ?? [])
|
|
42
|
+
: rawValidationResults;
|
|
43
|
+
const validationResultsParse = z
|
|
44
|
+
.array(verificationCommandResultSchema)
|
|
45
|
+
.safeParse(normalizedValidationResults);
|
|
46
|
+
if (!validationResultsParse.success) {
|
|
47
|
+
throw new Error(`work-reviewer response has malformed validationResults: ${validationResultsParse.error.message}. Raw: ${response.slice(0, 200)}`);
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
review: reviewResult.data,
|
|
51
|
+
validationResults: validationResultsParse.data,
|
|
52
|
+
validationSkipped: false,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export async function runWorkCycle(props) {
|
|
56
|
+
const initialResponse = await props.workThread.send(firstTurn(props.systemPromptWorkAgent, buildInitialWorkMessage({
|
|
57
|
+
spec: props.spec,
|
|
58
|
+
plan: props.plan,
|
|
59
|
+
planReview: props.planReview,
|
|
60
|
+
validationCommandList: props.validationCommandList,
|
|
61
|
+
})));
|
|
62
|
+
await props.onWorkAgentTurn(0, initialResponse);
|
|
63
|
+
let lastReview = null;
|
|
64
|
+
const cycleCount = props.cycle.cycleCount;
|
|
65
|
+
for (let cycle = 1; cycle <= cycleCount; cycle += 1) {
|
|
66
|
+
if (props.isClosed?.()) {
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
const reviewMessage = buildWorkReviewMessage({
|
|
70
|
+
spec: props.spec,
|
|
71
|
+
plan: props.plan,
|
|
72
|
+
diff: await props.getDiff(),
|
|
73
|
+
cycle,
|
|
74
|
+
validationCommandList: props.validationCommandList,
|
|
75
|
+
});
|
|
76
|
+
let reviewResponse = await props.reviewThread.send(cycle === 1 ? firstTurn(props.systemPromptWorkReviewer, reviewMessage) : reviewMessage);
|
|
77
|
+
let parsedReview;
|
|
78
|
+
try {
|
|
79
|
+
parsedReview = parseWorkReview(reviewResponse.response);
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
83
|
+
if (!message.includes('does not match ReviewResult schema')) {
|
|
84
|
+
throw error;
|
|
85
|
+
}
|
|
86
|
+
writeStderr(`[work-cycle] reviewer cycle ${String(cycle)} returned malformed review JSON; nudging once: ${message}`);
|
|
87
|
+
reviewResponse = await props.reviewThread.send(MALFORMED_REVIEW_NUDGE);
|
|
88
|
+
parsedReview = parseWorkReview(reviewResponse.response);
|
|
89
|
+
}
|
|
90
|
+
if (props.validationCommandList.length > 0 && parsedReview.validationResults.length === 0) {
|
|
91
|
+
writeStderr(`[work-cycle] reviewer cycle ${String(cycle)} returned empty validationResults; nudging once`);
|
|
92
|
+
reviewResponse = await props.reviewThread.send(REVIEWER_NUDGE);
|
|
93
|
+
parsedReview = parseWorkReview(reviewResponse.response);
|
|
94
|
+
if (parsedReview.validationResults.length === 0) {
|
|
95
|
+
writeStderr(`[work-cycle] reviewer cycle ${String(cycle)} returned empty validationResults after nudge; proceeding`);
|
|
96
|
+
parsedReview = { ...parsedReview, validationSkipped: true };
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
lastReview = parsedReview;
|
|
100
|
+
await props.onWorkReviewerTurn(cycle, reviewResponse, parsedReview.review, parsedReview.validationResults, parsedReview.validationSkipped);
|
|
101
|
+
if (props.isClosed?.()) {
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
// Always revise after every review — reviewer feedback always reaches the agent.
|
|
105
|
+
// Cycle = <agent> → review → <agent>; the final state is the revised agent output.
|
|
106
|
+
const reviseResponse = await props.workThread.send(buildWorkReviseMessage({
|
|
107
|
+
cycle,
|
|
108
|
+
review: parsedReview.review,
|
|
109
|
+
validationResults: parsedReview.validationResults,
|
|
110
|
+
}));
|
|
111
|
+
await props.onWorkAgentTurn(cycle, reviseResponse);
|
|
112
|
+
}
|
|
113
|
+
if (lastReview === null) {
|
|
114
|
+
throw new Error('runWorkCycle expected at least one review turn.');
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
review: lastReview.review,
|
|
118
|
+
validationResults: lastReview.validationResults,
|
|
119
|
+
validationSkipped: lastReview.validationSkipped,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=work-cycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"work-cycle.js","sourceRoot":"","sources":["../../src/work-phase/work-cycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { VerificationCommandResult } from '../state/task-event-types.js';
|
|
3
|
+
import type { PersistentThread, PersistentThreadResponse } from '../work-executor/persistent-thread.js';
|
|
4
|
+
declare const wrapupFinalAnswerSchema: z.ZodObject<{
|
|
5
|
+
summary: z.ZodString;
|
|
6
|
+
prUrl: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
7
|
+
branchName: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
8
|
+
pushedCommits: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
9
|
+
}, z.core.$strip>;
|
|
10
|
+
export type WrapupFinalAnswer = z.infer<typeof wrapupFinalAnswerSchema>;
|
|
11
|
+
export interface RunWrapupProps {
|
|
12
|
+
readonly wrapupThread: PersistentThread;
|
|
13
|
+
readonly systemPromptWrapup: string;
|
|
14
|
+
readonly spec: string;
|
|
15
|
+
readonly plan: string;
|
|
16
|
+
readonly workSummary: string;
|
|
17
|
+
readonly gitContext: string;
|
|
18
|
+
readonly validationResults: readonly VerificationCommandResult[];
|
|
19
|
+
readonly validationSkipped: boolean;
|
|
20
|
+
readonly onWrapupTurn: (result: PersistentThreadResponse) => void | Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
export interface WrapupRunResult {
|
|
23
|
+
readonly summary: string;
|
|
24
|
+
readonly prUrl: string | null;
|
|
25
|
+
readonly branchName: string | null;
|
|
26
|
+
readonly pushedCommits: readonly string[];
|
|
27
|
+
}
|
|
28
|
+
export declare function runWrapup(props: RunWrapupProps): Promise<WrapupRunResult>;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=wrapup-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrapup-runner.d.ts","sourceRoot":"","sources":["../../src/wrapup-phase/wrapup-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,KAAK,EACX,gBAAgB,EAChB,wBAAwB,EACxB,MAAM,uCAAuC,CAAC;AAE/C,QAAA,MAAM,uBAAuB;;;;;iBAK3B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAKxE,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAC;IACxC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,iBAAiB,EAAE,SAAS,yBAAyB,EAAE,CAAC;IACjE,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,wBAAwB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClF;AAED,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AAgFD,wBAAsB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAmB/E"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
const wrapupFinalAnswerSchema = z.object({
|
|
3
|
+
summary: z.string(),
|
|
4
|
+
prUrl: z.string().url().nullable().optional(),
|
|
5
|
+
branchName: z.string().nullable().optional(),
|
|
6
|
+
pushedCommits: z.array(z.string()).default([]),
|
|
7
|
+
});
|
|
8
|
+
const WRAPUP_RESPONSE_PREVIEW_LENGTH = 300;
|
|
9
|
+
const FALLBACK_SUMMARY_LENGTH = 2_000;
|
|
10
|
+
function buildWrapupMessage(props) {
|
|
11
|
+
return [
|
|
12
|
+
`# System\n${props.systemPromptWrapup}`,
|
|
13
|
+
`# Original task\n${props.spec}`,
|
|
14
|
+
`# Final plan\n${props.plan}`,
|
|
15
|
+
`# Work-agent summary\n${props.workSummary}`,
|
|
16
|
+
`# Controller/git context\n${props.gitContext}`,
|
|
17
|
+
`# Validation results\n${JSON.stringify(props.validationResults, null, 2)}`,
|
|
18
|
+
`# Validation skipped\n${String(props.validationSkipped)}`,
|
|
19
|
+
'# Required output JSON',
|
|
20
|
+
'{ "summary": "...", "prUrl": "https://github.com/org/repo/pull/123 or null", "branchName": "agent/name or null", "pushedCommits": ["sha"] }',
|
|
21
|
+
].join('\n\n');
|
|
22
|
+
}
|
|
23
|
+
function parseWrapupFinalAnswer(response) {
|
|
24
|
+
let parsed;
|
|
25
|
+
try {
|
|
26
|
+
parsed = JSON.parse(response);
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
30
|
+
return {
|
|
31
|
+
success: false,
|
|
32
|
+
error: `wrapup agent response is not valid JSON: ${message}`,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const result = wrapupFinalAnswerSchema.safeParse(parsed);
|
|
36
|
+
if (!result.success) {
|
|
37
|
+
return {
|
|
38
|
+
success: false,
|
|
39
|
+
error: `wrapup agent response does not match schema: ${result.error.message}`,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
success: true,
|
|
44
|
+
value: {
|
|
45
|
+
summary: result.data.summary,
|
|
46
|
+
prUrl: result.data.prUrl ?? null,
|
|
47
|
+
branchName: result.data.branchName ?? null,
|
|
48
|
+
pushedCommits: result.data.pushedCommits,
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function buildWrapupJsonRepairMessage(error, rawResponse) {
|
|
53
|
+
return [
|
|
54
|
+
'Your previous wrapup response could not be parsed by the controller.',
|
|
55
|
+
`Parse error: ${error}`,
|
|
56
|
+
`Previous response preview: ${rawResponse.slice(0, WRAPUP_RESPONSE_PREVIEW_LENGTH)}`,
|
|
57
|
+
'Return only valid JSON with this exact shape:',
|
|
58
|
+
'{ "summary": "what was done", "prUrl": "https://github.com/org/repo/pull/123 or null", "branchName": "agent/name or null", "pushedCommits": ["sha"] }',
|
|
59
|
+
].join('\n\n');
|
|
60
|
+
}
|
|
61
|
+
function extractPullRequestUrl(response) {
|
|
62
|
+
const match = /https:\/\/github\.com\/[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+\/pull\/\d+/u.exec(response);
|
|
63
|
+
return match?.[0] ?? null;
|
|
64
|
+
}
|
|
65
|
+
function buildFallbackWrapupResult(response, error) {
|
|
66
|
+
const summary = response.trim().slice(0, FALLBACK_SUMMARY_LENGTH);
|
|
67
|
+
return {
|
|
68
|
+
summary: summary.length > 0
|
|
69
|
+
? summary
|
|
70
|
+
: `Wrapup agent did not provide a parseable final response. Last parse error: ${error}`,
|
|
71
|
+
prUrl: extractPullRequestUrl(response),
|
|
72
|
+
branchName: null,
|
|
73
|
+
pushedCommits: [],
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
export async function runWrapup(props) {
|
|
77
|
+
const turnResult = await props.wrapupThread.send(buildWrapupMessage(props));
|
|
78
|
+
await props.onWrapupTurn(turnResult);
|
|
79
|
+
const parsed = parseWrapupFinalAnswer(turnResult.response);
|
|
80
|
+
if (parsed.success) {
|
|
81
|
+
return parsed.value;
|
|
82
|
+
}
|
|
83
|
+
const retryResult = await props.wrapupThread.send(buildWrapupJsonRepairMessage(parsed.error, turnResult.response));
|
|
84
|
+
await props.onWrapupTurn(retryResult);
|
|
85
|
+
const retryParsed = parseWrapupFinalAnswer(retryResult.response);
|
|
86
|
+
if (retryParsed.success) {
|
|
87
|
+
return retryParsed.value;
|
|
88
|
+
}
|
|
89
|
+
return buildFallbackWrapupResult(retryResult.response, retryParsed.error);
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=wrapup-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrapup-runner.js","sourceRoot":"","sources":["../../src/wrapup-phase/wrapup-runner.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@agent-vm/agent-vm-worker",
|
|
3
|
+
"version": "0.0.20",
|
|
4
|
+
"description": "Worker process that runs inside a sandboxed VM, plans, edits, validates, and reviews coding tasks.",
|
|
5
|
+
"homepage": "https://github.com/ShravanSunder/agent-vm#readme",
|
|
6
|
+
"bugs": {
|
|
7
|
+
"url": "https://github.com/ShravanSunder/agent-vm/issues"
|
|
8
|
+
},
|
|
9
|
+
"license": "MIT",
|
|
10
|
+
"author": "Shravan Sunder <ShravanSunder@users.noreply.github.com>",
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "git+https://github.com/ShravanSunder/agent-vm.git",
|
|
14
|
+
"directory": "packages/agent-vm-worker"
|
|
15
|
+
},
|
|
16
|
+
"bin": {
|
|
17
|
+
"agent-vm-worker": "./dist/main.js"
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist"
|
|
21
|
+
],
|
|
22
|
+
"type": "module",
|
|
23
|
+
"main": "./dist/index.js",
|
|
24
|
+
"types": "./dist/index.d.ts",
|
|
25
|
+
"exports": {
|
|
26
|
+
".": {
|
|
27
|
+
"types": "./dist/index.d.ts",
|
|
28
|
+
"import": "./dist/index.js"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"publishConfig": {
|
|
32
|
+
"access": "public"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@hono/node-server": "^1.19.14",
|
|
36
|
+
"@hono/zod-validator": "^0.7.6",
|
|
37
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
38
|
+
"@openai/codex-sdk": "^0.122.0",
|
|
39
|
+
"cmd-ts": "^0.14.0",
|
|
40
|
+
"execa": "^9.5.2",
|
|
41
|
+
"hono": "^4.12.14",
|
|
42
|
+
"zod": "^4",
|
|
43
|
+
"zod-to-json-schema": "^3.24.1"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"vitest": "^4.1.4"
|
|
47
|
+
},
|
|
48
|
+
"scripts": {
|
|
49
|
+
"build": "tsc -p tsconfig.build.json",
|
|
50
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
51
|
+
"test": "pnpm test:unit",
|
|
52
|
+
"test:unit": "vitest run --root ../../ --config vitest.config.ts packages/agent-vm-worker/src",
|
|
53
|
+
"test:integration": "vitest run --root ../../ --config vitest.integration.config.ts packages/agent-vm-worker/src",
|
|
54
|
+
"test:smoke": "vitest run --root ../../ --config vitest.smoke.config.ts packages/agent-vm-worker/src",
|
|
55
|
+
"start": "node ./dist/main.js"
|
|
56
|
+
}
|
|
57
|
+
}
|