@auvira.ai/sdk 0.2.9 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -11
- package/dist/agent/Agent.d.ts +7 -1
- package/dist/agent/Agent.d.ts.map +1 -1
- package/dist/agent/Agent.js +19 -1
- package/dist/agent/Agent.js.map +1 -1
- package/dist/agent/AgentRegistry.d.ts +1 -1
- package/dist/agent/AgentRegistry.d.ts.map +1 -1
- package/dist/agent/AgentRegistry.js.map +1 -1
- package/dist/agent/ConversationStore.d.ts +2 -0
- package/dist/agent/ConversationStore.d.ts.map +1 -1
- package/dist/agent/ConversationStore.js +4 -0
- package/dist/agent/ConversationStore.js.map +1 -1
- package/dist/agent/resolveModelConfig.d.ts.map +1 -1
- package/dist/agent/resolveModelConfig.js +3 -1
- package/dist/agent/resolveModelConfig.js.map +1 -1
- package/dist/agent/types.d.ts +6 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/runner/abortPoller.d.ts +4 -0
- package/dist/runner/abortPoller.d.ts.map +1 -0
- package/dist/runner/abortPoller.js +22 -0
- package/dist/runner/abortPoller.js.map +1 -0
- package/dist/runner/buildJobResult.d.ts +25 -0
- package/dist/runner/buildJobResult.d.ts.map +1 -0
- package/dist/runner/buildJobResult.js +56 -0
- package/dist/runner/buildJobResult.js.map +1 -0
- package/dist/runner/constants.d.ts +16 -0
- package/dist/runner/constants.d.ts.map +1 -0
- package/dist/runner/constants.js +16 -0
- package/dist/runner/constants.js.map +1 -0
- package/dist/runner/index.d.ts +14 -0
- package/dist/runner/index.d.ts.map +1 -0
- package/dist/runner/index.js +10 -0
- package/dist/runner/index.js.map +1 -0
- package/dist/runner/jobTypes.d.ts +80 -0
- package/dist/runner/jobTypes.d.ts.map +1 -0
- package/dist/runner/jobTypes.js +2 -0
- package/dist/runner/jobTypes.js.map +1 -0
- package/dist/runner/mapStreamEvents.d.ts +16 -0
- package/dist/runner/mapStreamEvents.d.ts.map +1 -0
- package/dist/runner/mapStreamEvents.js +196 -0
- package/dist/runner/mapStreamEvents.js.map +1 -0
- package/dist/runner/ndjsonWriter.d.ts +6 -0
- package/dist/runner/ndjsonWriter.d.ts.map +1 -0
- package/dist/runner/ndjsonWriter.js +18 -0
- package/dist/runner/ndjsonWriter.js.map +1 -0
- package/dist/runner/resolveRunnerEnv.d.ts +10 -0
- package/dist/runner/resolveRunnerEnv.d.ts.map +1 -0
- package/dist/runner/resolveRunnerEnv.js +28 -0
- package/dist/runner/resolveRunnerEnv.js.map +1 -0
- package/dist/runner/run.d.ts +13 -0
- package/dist/runner/run.d.ts.map +1 -0
- package/dist/runner/run.js +114 -0
- package/dist/runner/run.js.map +1 -0
- package/dist/runner/sessionStore.d.ts +12 -0
- package/dist/runner/sessionStore.d.ts.map +1 -0
- package/dist/runner/sessionStore.js +56 -0
- package/dist/runner/sessionStore.js.map +1 -0
- package/dist/runner/validateJob.d.ts +7 -0
- package/dist/runner/validateJob.d.ts.map +1 -0
- package/dist/runner/validateJob.js +158 -0
- package/dist/runner/validateJob.js.map +1 -0
- package/docs/sandbox-runner.md +199 -0
- package/package.json +14 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobTypes.js","sourceRoot":"","sources":["../../src/runner/jobTypes.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { AgentRunEvent } from "../agent/events.js";
|
|
2
|
+
import type { JobResultContext } from "./buildJobResult.js";
|
|
3
|
+
import type { HarnessProgressEvent, SandboxAuviraRunnerEvent } from "./jobTypes.js";
|
|
4
|
+
/** Mutable state while mapping a stream of SDK events to host progress. */
|
|
5
|
+
export interface MapStreamContext {
|
|
6
|
+
toolSeq: number;
|
|
7
|
+
openTools: Map<string, string>;
|
|
8
|
+
sessionReadyEmitted: boolean;
|
|
9
|
+
resultCtx: JobResultContext;
|
|
10
|
+
}
|
|
11
|
+
export declare function createMapStreamContext(sessionResumed: boolean): MapStreamContext;
|
|
12
|
+
/** Maps one SDK stream event to zero or more host progress events. */
|
|
13
|
+
export declare function mapAuviraStreamEventToProgress(event: AgentRunEvent, ctx: MapStreamContext): HarnessProgressEvent[];
|
|
14
|
+
/** Parses one NDJSON line from events.ndjson. */
|
|
15
|
+
export declare function parseSandboxAuviraRunnerLine(line: string): SandboxAuviraRunnerEvent | null;
|
|
16
|
+
//# sourceMappingURL=mapStreamEvents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapStreamEvents.d.ts","sourceRoot":"","sources":["../../src/runner/mapStreamEvents.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAEpF,2EAA2E;AAC3E,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,SAAS,EAAE,gBAAgB,CAAC;CAC7B;AAED,wBAAgB,sBAAsB,CACpC,cAAc,EAAE,OAAO,GACtB,gBAAgB,CAOlB;AAED,sEAAsE;AACtE,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,gBAAgB,GACpB,oBAAoB,EAAE,CA+JxB;AAED,iDAAiD;AACjD,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,GACX,wBAAwB,GAAG,IAAI,CAyBjC"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { getAssistantEventText } from "../agent/assistantEvent.js";
|
|
2
|
+
import { updateJobResultContext } from "./buildJobResult.js";
|
|
3
|
+
export function createMapStreamContext(sessionResumed) {
|
|
4
|
+
return {
|
|
5
|
+
toolSeq: 0,
|
|
6
|
+
openTools: new Map(),
|
|
7
|
+
sessionReadyEmitted: false,
|
|
8
|
+
resultCtx: { sessionResumed },
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
/** Maps one SDK stream event to zero or more host progress events. */
|
|
12
|
+
export function mapAuviraStreamEventToProgress(event, ctx) {
|
|
13
|
+
if (event.type === "run.early_finish" || event.type === "run.failed") {
|
|
14
|
+
updateJobResultContext(ctx.resultCtx, event);
|
|
15
|
+
}
|
|
16
|
+
if (event.type === "run.continue" && event.toolCallCount !== undefined) {
|
|
17
|
+
updateJobResultContext(ctx.resultCtx, event);
|
|
18
|
+
}
|
|
19
|
+
switch (event.type) {
|
|
20
|
+
case "workspace.prepared": {
|
|
21
|
+
if (ctx.sessionReadyEmitted) {
|
|
22
|
+
return [];
|
|
23
|
+
}
|
|
24
|
+
ctx.sessionReadyEmitted = true;
|
|
25
|
+
return [
|
|
26
|
+
{
|
|
27
|
+
type: "step",
|
|
28
|
+
id: "cursor_session",
|
|
29
|
+
label: "Auvira agent ready",
|
|
30
|
+
status: "completed",
|
|
31
|
+
},
|
|
32
|
+
];
|
|
33
|
+
}
|
|
34
|
+
case "tool.start": {
|
|
35
|
+
ctx.toolSeq += 1;
|
|
36
|
+
const stepId = `tool_${ctx.toolSeq}`;
|
|
37
|
+
ctx.openTools.set(event.name, stepId);
|
|
38
|
+
return [
|
|
39
|
+
{
|
|
40
|
+
type: "activity_trace",
|
|
41
|
+
entry: {
|
|
42
|
+
kind: "tool_start",
|
|
43
|
+
toolName: event.name,
|
|
44
|
+
label: event.name,
|
|
45
|
+
detail: JSON.stringify(event.input).slice(0, 200),
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
type: "step",
|
|
50
|
+
id: stepId,
|
|
51
|
+
label: event.name,
|
|
52
|
+
status: "active",
|
|
53
|
+
toolName: event.name,
|
|
54
|
+
},
|
|
55
|
+
];
|
|
56
|
+
}
|
|
57
|
+
case "tool.end": {
|
|
58
|
+
const stepId = ctx.openTools.get(event.name) ?? `tool_${event.name}`;
|
|
59
|
+
return [
|
|
60
|
+
{
|
|
61
|
+
type: "activity_trace",
|
|
62
|
+
entry: {
|
|
63
|
+
kind: "tool_end",
|
|
64
|
+
toolName: event.name,
|
|
65
|
+
label: event.name,
|
|
66
|
+
detail: event.ok ? "completed" : "failed",
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
type: "step",
|
|
71
|
+
id: stepId,
|
|
72
|
+
label: event.name,
|
|
73
|
+
status: event.ok ? "completed" : "failed",
|
|
74
|
+
toolName: event.name,
|
|
75
|
+
},
|
|
76
|
+
];
|
|
77
|
+
}
|
|
78
|
+
case "edit.diff":
|
|
79
|
+
return [
|
|
80
|
+
{
|
|
81
|
+
type: "activity_trace",
|
|
82
|
+
entry: {
|
|
83
|
+
kind: "diff",
|
|
84
|
+
path: event.path,
|
|
85
|
+
patch: event.patch,
|
|
86
|
+
truncated: event.truncated,
|
|
87
|
+
label: event.path,
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
];
|
|
91
|
+
case "run.diff":
|
|
92
|
+
return [
|
|
93
|
+
{
|
|
94
|
+
type: "activity_trace",
|
|
95
|
+
entry: {
|
|
96
|
+
kind: "diff",
|
|
97
|
+
patch: event.patch,
|
|
98
|
+
truncated: event.truncated,
|
|
99
|
+
label: "run summary",
|
|
100
|
+
detail: event.changedFiles.join(", "),
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
];
|
|
104
|
+
case "run.continue":
|
|
105
|
+
return [
|
|
106
|
+
{
|
|
107
|
+
type: "activity_trace",
|
|
108
|
+
entry: {
|
|
109
|
+
kind: "info",
|
|
110
|
+
label: "Continuing edit",
|
|
111
|
+
detail: event.reason === "style_only_incomplete"
|
|
112
|
+
? "Continuing edit — wiring required after style changes"
|
|
113
|
+
: `Continuing edit — ${event.reason}`,
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
];
|
|
117
|
+
case "run.early_finish":
|
|
118
|
+
return [
|
|
119
|
+
{
|
|
120
|
+
type: "activity_trace",
|
|
121
|
+
entry: {
|
|
122
|
+
kind: "info",
|
|
123
|
+
label: "Early finish",
|
|
124
|
+
detail: `${event.reason}: ${event.changedFiles.join(", ")}`,
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
];
|
|
128
|
+
case "run.failed":
|
|
129
|
+
return [
|
|
130
|
+
{
|
|
131
|
+
type: "activity_trace",
|
|
132
|
+
entry: {
|
|
133
|
+
kind: "info",
|
|
134
|
+
label: "Run failed",
|
|
135
|
+
detail: event.message,
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
];
|
|
139
|
+
case "model.attempt":
|
|
140
|
+
return [
|
|
141
|
+
{
|
|
142
|
+
type: "activity_trace",
|
|
143
|
+
entry: {
|
|
144
|
+
kind: "info",
|
|
145
|
+
label: "Model turn",
|
|
146
|
+
detail: `Model turn ${event.attempt}/${event.maxAttempts}`,
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
];
|
|
150
|
+
case "assistant": {
|
|
151
|
+
const text = getAssistantEventText(event);
|
|
152
|
+
if (!text.trim()) {
|
|
153
|
+
return [];
|
|
154
|
+
}
|
|
155
|
+
return [
|
|
156
|
+
{
|
|
157
|
+
type: "activity_trace",
|
|
158
|
+
entry: {
|
|
159
|
+
kind: "text",
|
|
160
|
+
label: "Auvira agent writing",
|
|
161
|
+
detail: text.slice(0, 500),
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
];
|
|
165
|
+
}
|
|
166
|
+
default:
|
|
167
|
+
return [];
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/** Parses one NDJSON line from events.ndjson. */
|
|
171
|
+
export function parseSandboxAuviraRunnerLine(line) {
|
|
172
|
+
const trimmed = line.trim();
|
|
173
|
+
if (!trimmed) {
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
try {
|
|
177
|
+
const parsed = JSON.parse(trimmed);
|
|
178
|
+
if (typeof parsed !== "object" ||
|
|
179
|
+
parsed === null ||
|
|
180
|
+
!("type" in parsed)) {
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
const type = parsed.type;
|
|
184
|
+
if (type === "progress" && "event" in parsed) {
|
|
185
|
+
return parsed;
|
|
186
|
+
}
|
|
187
|
+
if (type === "result" && "result" in parsed) {
|
|
188
|
+
return parsed;
|
|
189
|
+
}
|
|
190
|
+
return null;
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=mapStreamEvents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapStreamEvents.js","sourceRoot":"","sources":["../../src/runner/mapStreamEvents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { SandboxAuviraRunnerEvent } from "./jobTypes.js";
|
|
2
|
+
/** Appends a single NDJSON line to events.ndjson with fsync. */
|
|
3
|
+
export declare function appendRunnerEvent(eventsPath: string, event: SandboxAuviraRunnerEvent): Promise<void>;
|
|
4
|
+
/** Appends a progress or result event (convenience wrapper). */
|
|
5
|
+
export declare function appendNdjsonLine(eventsPath: string, payload: SandboxAuviraRunnerEvent): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=ndjsonWriter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ndjsonWriter.d.ts","sourceRoot":"","sources":["../../src/runner/ndjsonWriter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAE9D,gEAAgE;AAChE,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,IAAI,CAAC,CASf;AAED,gEAAgE;AAChE,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,IAAI,CAAC,CAEf"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { open } from "node:fs/promises";
|
|
2
|
+
/** Appends a single NDJSON line to events.ndjson with fsync. */
|
|
3
|
+
export async function appendRunnerEvent(eventsPath, event) {
|
|
4
|
+
const line = `${JSON.stringify(event)}\n`;
|
|
5
|
+
const handle = await open(eventsPath, "a");
|
|
6
|
+
try {
|
|
7
|
+
await handle.write(line);
|
|
8
|
+
await handle.sync();
|
|
9
|
+
}
|
|
10
|
+
finally {
|
|
11
|
+
await handle.close();
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/** Appends a progress or result event (convenience wrapper). */
|
|
15
|
+
export async function appendNdjsonLine(eventsPath, payload) {
|
|
16
|
+
await appendRunnerEvent(eventsPath, payload);
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=ndjsonWriter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ndjsonWriter.js","sourceRoot":"","sources":["../../src/runner/ndjsonWriter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAGxC,gEAAgE;AAChE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,UAAkB,EAClB,KAA+B;IAE/B,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;IAC1C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,gEAAgE;AAChE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,UAAkB,EAClB,OAAiC;IAEjC,MAAM,iBAAiB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AgentModelConfig } from "../agent/types.js";
|
|
2
|
+
/** Resolves model config with API key from environment only (never from job JSON). */
|
|
3
|
+
export declare function resolveRunnerModel(model: AgentModelConfig): AgentModelConfig;
|
|
4
|
+
/** Returns the configured API key from environment variables. */
|
|
5
|
+
export declare function resolveRunnerApiKey(): string | undefined;
|
|
6
|
+
/** Ensures a model API key is available before starting a run. */
|
|
7
|
+
export declare function assertRunnerApiKey(): void;
|
|
8
|
+
/** Resolves jobs root from environment or default. */
|
|
9
|
+
export declare function resolveJobsRoot(): string;
|
|
10
|
+
//# sourceMappingURL=resolveRunnerEnv.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveRunnerEnv.d.ts","sourceRoot":"","sources":["../../src/runner/resolveRunnerEnv.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAI1D,sFAAsF;AACtF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,gBAAgB,GAAG,gBAAgB,CAO5E;AAED,iEAAiE;AACjE,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,SAAS,CAKxD;AAED,kEAAkE;AAClE,wBAAgB,kBAAkB,IAAI,IAAI,CAMzC;AAED,sDAAsD;AACtD,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { resolveModelConfig } from "../agent/resolveModelConfig.js";
|
|
2
|
+
import { ENV_AGENT_API_KEY, ENV_JOBS_ROOT, ENV_MODEL_API_KEY } from "./constants.js";
|
|
3
|
+
import { DEFAULT_JOBS_ROOT } from "./constants.js";
|
|
4
|
+
/** Resolves model config with API key from environment only (never from job JSON). */
|
|
5
|
+
export function resolveRunnerModel(model) {
|
|
6
|
+
const stripped = {
|
|
7
|
+
id: model.id,
|
|
8
|
+
provider: model.provider,
|
|
9
|
+
baseURL: model.baseURL,
|
|
10
|
+
};
|
|
11
|
+
return resolveModelConfig(stripped);
|
|
12
|
+
}
|
|
13
|
+
/** Returns the configured API key from environment variables. */
|
|
14
|
+
export function resolveRunnerApiKey() {
|
|
15
|
+
return (process.env[ENV_MODEL_API_KEY]?.trim() ||
|
|
16
|
+
process.env[ENV_AGENT_API_KEY]?.trim());
|
|
17
|
+
}
|
|
18
|
+
/** Ensures a model API key is available before starting a run. */
|
|
19
|
+
export function assertRunnerApiKey() {
|
|
20
|
+
if (!resolveRunnerApiKey()) {
|
|
21
|
+
throw new Error(`Model API key required: set ${ENV_MODEL_API_KEY} or ${ENV_AGENT_API_KEY}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/** Resolves jobs root from environment or default. */
|
|
25
|
+
export function resolveJobsRoot() {
|
|
26
|
+
return process.env[ENV_JOBS_ROOT]?.trim() || DEFAULT_JOBS_ROOT;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=resolveRunnerEnv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveRunnerEnv.js","sourceRoot":"","sources":["../../src/runner/resolveRunnerEnv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACrF,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,sFAAsF;AACtF,MAAM,UAAU,kBAAkB,CAAC,KAAuB;IACxD,MAAM,QAAQ,GAAqB;QACjC,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC;IACF,OAAO,kBAAkB,CAAC,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,mBAAmB;IACjC,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE;QACtC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,CACvC,CAAC;AACJ,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,kBAAkB;IAChC,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,+BAA+B,iBAAiB,OAAO,iBAAiB,EAAE,CAC3E,CAAC;IACJ,CAAC;AACH,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,eAAe;IAC7B,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,IAAI,iBAAiB,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SandboxAuviraJobResult } from "./jobTypes.js";
|
|
2
|
+
export interface RunSandboxJobOptions {
|
|
3
|
+
jobsRoot?: string;
|
|
4
|
+
}
|
|
5
|
+
export interface RunSandboxJobOutcome {
|
|
6
|
+
exitCode: number;
|
|
7
|
+
result: SandboxAuviraJobResult;
|
|
8
|
+
}
|
|
9
|
+
/** Parses --job from argv or AUVIRA_CURSOR_JOB_ID. */
|
|
10
|
+
export declare function parseJobId(argv: string[]): string | undefined;
|
|
11
|
+
/** Executes a sandbox job from jobsRoot/editJobId/job.json. */
|
|
12
|
+
export declare function runSandboxJob(editJobId: string, options?: RunSandboxJobOptions): Promise<RunSandboxJobOutcome>;
|
|
13
|
+
//# sourceMappingURL=run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/runner/run.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAc5D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,sBAAsB,CAAC;CAChC;AAED,sDAAsD;AACtD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAU7D;AAWD,+DAA+D;AAC/D,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,oBAAoB,CAAC,CAqF/B"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { Agent } from "../agent/Agent.js";
|
|
4
|
+
import { watchAbortFile } from "./abortPoller.js";
|
|
5
|
+
import { buildRunnerFailureResult, buildSandboxJobResult, } from "./buildJobResult.js";
|
|
6
|
+
import { ENV_CURSOR_JOB_ID, EVENTS_FILE, JOB_FILE, RESULT_FILE, } from "./constants.js";
|
|
7
|
+
import { createMapStreamContext, mapAuviraStreamEventToProgress, } from "./mapStreamEvents.js";
|
|
8
|
+
import { appendNdjsonLine } from "./ndjsonWriter.js";
|
|
9
|
+
import { assertRunnerApiKey, resolveJobsRoot, resolveRunnerModel, } from "./resolveRunnerEnv.js";
|
|
10
|
+
import { createAgentFromSession, saveSandboxSession } from "./sessionStore.js";
|
|
11
|
+
import { SandboxJobValidationError, validateSandboxJob } from "./validateJob.js";
|
|
12
|
+
/** Parses --job from argv or AUVIRA_CURSOR_JOB_ID. */
|
|
13
|
+
export function parseJobId(argv) {
|
|
14
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
15
|
+
if (argv[i] === "--job" && argv[i + 1]) {
|
|
16
|
+
return argv[i + 1].trim();
|
|
17
|
+
}
|
|
18
|
+
if (argv[i]?.startsWith("--job=")) {
|
|
19
|
+
return argv[i].slice("--job=".length).trim();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return process.env[ENV_CURSOR_JOB_ID]?.trim();
|
|
23
|
+
}
|
|
24
|
+
async function writeResult(jobDir, eventsPath, result) {
|
|
25
|
+
await writeFile(join(jobDir, RESULT_FILE), JSON.stringify(result, null, 2));
|
|
26
|
+
await appendNdjsonLine(eventsPath, { type: "result", result });
|
|
27
|
+
}
|
|
28
|
+
/** Executes a sandbox job from jobsRoot/editJobId/job.json. */
|
|
29
|
+
export async function runSandboxJob(editJobId, options = {}) {
|
|
30
|
+
const jobsRoot = options.jobsRoot ?? resolveJobsRoot();
|
|
31
|
+
const jobDir = join(jobsRoot, editJobId);
|
|
32
|
+
const jobPath = join(jobDir, JOB_FILE);
|
|
33
|
+
const eventsPath = join(jobDir, EVENTS_FILE);
|
|
34
|
+
let sessionResumed = false;
|
|
35
|
+
let agentId;
|
|
36
|
+
try {
|
|
37
|
+
assertRunnerApiKey();
|
|
38
|
+
const rawJob = JSON.parse(await readFile(jobPath, "utf8"));
|
|
39
|
+
const job = validateSandboxJob(rawJob);
|
|
40
|
+
if (job.editJobId !== editJobId) {
|
|
41
|
+
throw new SandboxJobValidationError(`job.editJobId (${job.editJobId}) does not match --job (${editJobId})`);
|
|
42
|
+
}
|
|
43
|
+
await mkdir(jobDir, { recursive: true });
|
|
44
|
+
let agent;
|
|
45
|
+
if (job.resumeAgentId) {
|
|
46
|
+
const resumed = await createAgentFromSession(job, jobsRoot);
|
|
47
|
+
agent = resumed.agent;
|
|
48
|
+
sessionResumed = resumed.sessionResumed;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
agent = await Agent.create({
|
|
52
|
+
model: resolveRunnerModel(job.model),
|
|
53
|
+
local: {
|
|
54
|
+
cwd: job.workspacePath,
|
|
55
|
+
workspaceMode: "in_place",
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
agentId = agent.agentId;
|
|
60
|
+
const payload = job.images?.length
|
|
61
|
+
? { text: job.promptText, images: job.images }
|
|
62
|
+
: job.promptText;
|
|
63
|
+
const run = await agent.send(payload, {
|
|
64
|
+
selectedDom: job.selectedDom,
|
|
65
|
+
completion: job.completion,
|
|
66
|
+
validation: job.validation ?? { skip: true },
|
|
67
|
+
reuseWorkspace: job.reuseWorkspace,
|
|
68
|
+
timeoutMs: job.validation?.timeoutMs,
|
|
69
|
+
});
|
|
70
|
+
const mapCtx = createMapStreamContext(sessionResumed);
|
|
71
|
+
const abortWatcher = watchAbortFile(jobDir, run);
|
|
72
|
+
for await (const event of run.stream()) {
|
|
73
|
+
const progressEvents = mapAuviraStreamEventToProgress(event, mapCtx);
|
|
74
|
+
for (const progress of progressEvents) {
|
|
75
|
+
await appendNdjsonLine(eventsPath, { type: "progress", event: progress });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
await abortWatcher;
|
|
79
|
+
const result = await run.wait();
|
|
80
|
+
const jobResult = buildSandboxJobResult(result, mapCtx.resultCtx);
|
|
81
|
+
if (result.ok && result.status === "finished") {
|
|
82
|
+
await saveSandboxSession(jobsRoot, agent, job.workspacePath);
|
|
83
|
+
}
|
|
84
|
+
await writeResult(jobDir, eventsPath, jobResult);
|
|
85
|
+
return { exitCode: result.ok ? 0 : 1, result: jobResult };
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
const message = error instanceof Error ? error.message : "Unknown runner error";
|
|
89
|
+
const failure = buildRunnerFailureResult({
|
|
90
|
+
error: message,
|
|
91
|
+
agentId,
|
|
92
|
+
sessionResumed,
|
|
93
|
+
hostTimeout: message.toLowerCase().includes("timeout"),
|
|
94
|
+
});
|
|
95
|
+
await mkdir(jobDir, { recursive: true });
|
|
96
|
+
await writeResult(jobDir, eventsPath, failure);
|
|
97
|
+
return { exitCode: 1, result: failure };
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async function main() {
|
|
101
|
+
const editJobId = parseJobId(process.argv.slice(2));
|
|
102
|
+
if (!editJobId) {
|
|
103
|
+
console.error("Usage: auvira-sdk-run --job <editJobId>");
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
const outcome = await runSandboxJob(editJobId);
|
|
107
|
+
process.exit(outcome.exitCode);
|
|
108
|
+
}
|
|
109
|
+
const isDirectRun = process.argv[1]?.endsWith("/run.js") ||
|
|
110
|
+
process.argv[1]?.endsWith("/run.mjs");
|
|
111
|
+
if (isDirectRun) {
|
|
112
|
+
void main();
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/runner/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Agent } from "../agent/Agent.js";
|
|
2
|
+
import type { SandboxAuviraJobInput, SandboxAuviraSession } from "./jobTypes.js";
|
|
3
|
+
/** Loads a persisted sandbox session or returns undefined. */
|
|
4
|
+
export declare function loadSandboxSession(jobsRoot: string, agentId: string): Promise<SandboxAuviraSession | undefined>;
|
|
5
|
+
/** Persists agent state after a successful sandbox run. */
|
|
6
|
+
export declare function saveSandboxSession(jobsRoot: string, agent: Agent, workspacePath: string): Promise<void>;
|
|
7
|
+
/** Creates an agent from a resumed sandbox session. */
|
|
8
|
+
export declare function createAgentFromSession(job: SandboxAuviraJobInput, jobsRoot: string): Promise<{
|
|
9
|
+
agent: Agent;
|
|
10
|
+
sessionResumed: boolean;
|
|
11
|
+
}>;
|
|
12
|
+
//# sourceMappingURL=sessionStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionStore.d.ts","sourceRoot":"","sources":["../../src/runner/sessionStore.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C,OAAO,KAAK,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAWjF,8DAA8D;AAC9D,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAO3C;AAED,2DAA2D;AAC3D,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,KAAK,EACZ,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,uDAAuD;AACvD,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,qBAAqB,EAC1B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,cAAc,EAAE,OAAO,CAAA;CAAE,CAAC,CAwBpD"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { Agent } from "../agent/Agent.js";
|
|
4
|
+
import { resolveRunnerModel } from "./resolveRunnerEnv.js";
|
|
5
|
+
function sessionsDir(jobsRoot) {
|
|
6
|
+
return join(jobsRoot, "sessions");
|
|
7
|
+
}
|
|
8
|
+
function sessionPath(jobsRoot, agentId) {
|
|
9
|
+
return join(sessionsDir(jobsRoot), `${agentId}.json`);
|
|
10
|
+
}
|
|
11
|
+
/** Loads a persisted sandbox session or returns undefined. */
|
|
12
|
+
export async function loadSandboxSession(jobsRoot, agentId) {
|
|
13
|
+
try {
|
|
14
|
+
const raw = await readFile(sessionPath(jobsRoot, agentId), "utf8");
|
|
15
|
+
return JSON.parse(raw);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/** Persists agent state after a successful sandbox run. */
|
|
22
|
+
export async function saveSandboxSession(jobsRoot, agent, workspacePath) {
|
|
23
|
+
const dir = sessionsDir(jobsRoot);
|
|
24
|
+
await mkdir(dir, { recursive: true });
|
|
25
|
+
const session = {
|
|
26
|
+
agentId: agent.agentId,
|
|
27
|
+
workspacePath,
|
|
28
|
+
conversation: agent.getConversationTurns(),
|
|
29
|
+
lastVisionImages: agent.getLastVisionImages(),
|
|
30
|
+
};
|
|
31
|
+
await writeFile(sessionPath(jobsRoot, agent.agentId), JSON.stringify(session, null, 2));
|
|
32
|
+
}
|
|
33
|
+
/** Creates an agent from a resumed sandbox session. */
|
|
34
|
+
export async function createAgentFromSession(job, jobsRoot) {
|
|
35
|
+
const resumeId = job.resumeAgentId?.trim();
|
|
36
|
+
if (!resumeId) {
|
|
37
|
+
throw new Error("resumeAgentId is required for session resume");
|
|
38
|
+
}
|
|
39
|
+
const session = await loadSandboxSession(jobsRoot, resumeId);
|
|
40
|
+
if (!session) {
|
|
41
|
+
throw new Error(`Sandbox session not found for agent id: ${resumeId}`);
|
|
42
|
+
}
|
|
43
|
+
const createOptions = {
|
|
44
|
+
agentId: session.agentId,
|
|
45
|
+
initialConversation: session.conversation,
|
|
46
|
+
initialVisionImages: session.lastVisionImages,
|
|
47
|
+
model: resolveRunnerModel(job.model),
|
|
48
|
+
local: {
|
|
49
|
+
cwd: job.workspacePath,
|
|
50
|
+
workspaceMode: "in_place",
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
const agent = await Agent.create(createOptions);
|
|
54
|
+
return { agent, sessionResumed: true };
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=sessionStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionStore.js","sourceRoot":"","sources":["../../src/runner/sessionStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAG1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,SAAS,WAAW,CAAC,QAAgB;IACnC,OAAO,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,WAAW,CAAC,QAAgB,EAAE,OAAe;IACpD,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,GAAG,OAAO,OAAO,CAAC,CAAC;AACxD,CAAC;AAED,8DAA8D;AAC9D,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAAgB,EAChB,OAAe;IAEf,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,2DAA2D;AAC3D,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAAgB,EAChB,KAAY,EACZ,aAAqB;IAErB,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAClC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,OAAO,GAAyB;QACpC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,aAAa;QACb,YAAY,EAAE,KAAK,CAAC,oBAAoB,EAAE;QAC1C,gBAAgB,EAAE,KAAK,CAAC,mBAAmB,EAAE;KAC9C,CAAC;IACF,MAAM,SAAS,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1F,CAAC;AAED,uDAAuD;AACvD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,GAA0B,EAC1B,QAAgB;IAEhB,MAAM,QAAQ,GAAG,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC;IAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC7D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,2CAA2C,QAAQ,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,aAAa,GAAuB;QACxC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,mBAAmB,EAAE,OAAO,CAAC,YAAY;QACzC,mBAAmB,EAAE,OAAO,CAAC,gBAAgB;QAC7C,KAAK,EAAE,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;QACpC,KAAK,EAAE;YACL,GAAG,EAAE,GAAG,CAAC,aAAa;YACtB,aAAa,EAAE,UAAU;SAC1B;KACF,CAAC;IAEF,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAChD,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SandboxAuviraJobInput } from "./jobTypes.js";
|
|
2
|
+
export declare class SandboxJobValidationError extends Error {
|
|
3
|
+
constructor(message: string);
|
|
4
|
+
}
|
|
5
|
+
/** Validates and parses raw job JSON into SandboxAuviraJobInput v1. */
|
|
6
|
+
export declare function validateSandboxJob(raw: unknown): SandboxAuviraJobInput;
|
|
7
|
+
//# sourceMappingURL=validateJob.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateJob.d.ts","sourceRoot":"","sources":["../../src/runner/validateJob.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAE3D,qBAAa,yBAA0B,SAAQ,KAAK;gBACtC,OAAO,EAAE,MAAM;CAI5B;AAoHD,uEAAuE;AACvE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,qBAAqB,CAoDtE"}
|