@workbench-ai/workbench-core 0.0.68 → 0.0.70
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/coded-errors.d.ts +27 -0
- package/dist/coded-errors.d.ts.map +1 -0
- package/dist/coded-errors.js +52 -0
- package/dist/execution-events.d.ts +5 -1
- package/dist/execution-events.d.ts.map +1 -1
- package/dist/execution-events.js +13 -3
- package/dist/execution-scheduler.d.ts +5 -3
- package/dist/execution-scheduler.d.ts.map +1 -1
- package/dist/execution-scheduler.js +29 -8
- package/dist/generic-spec.d.ts +1 -55
- package/dist/generic-spec.d.ts.map +1 -1
- package/dist/generic-spec.js +0 -681
- package/dist/index.d.ts +72 -19
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3538 -1326
- package/dist/remote-model.d.ts +17 -0
- package/dist/remote-model.d.ts.map +1 -0
- package/dist/remote-model.js +86 -0
- package/dist/runtime-utils.d.ts +1 -1
- package/dist/runtime-utils.d.ts.map +1 -1
- package/dist/runtime-utils.js +3 -3
- package/dist/sandbox-backends/docker.d.ts.map +1 -1
- package/dist/sandbox-backends/docker.js +32 -16
- package/package.json +3 -3
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Json } from "@workbench-ai/workbench-contract";
|
|
2
|
+
export interface WorkbenchCodedErrorOptions {
|
|
3
|
+
retryable?: boolean;
|
|
4
|
+
remediation?: string;
|
|
5
|
+
subject?: Record<string, Json>;
|
|
6
|
+
exitCode?: number;
|
|
7
|
+
}
|
|
8
|
+
export declare class WorkbenchUserError extends Error {
|
|
9
|
+
constructor(message: string);
|
|
10
|
+
}
|
|
11
|
+
export declare class WorkbenchCodedError extends WorkbenchUserError {
|
|
12
|
+
readonly code: string;
|
|
13
|
+
readonly retryable: boolean;
|
|
14
|
+
readonly remediation?: string;
|
|
15
|
+
readonly subject?: Record<string, Json>;
|
|
16
|
+
readonly exitCode: number;
|
|
17
|
+
constructor(code: string, message: string, options?: WorkbenchCodedErrorOptions);
|
|
18
|
+
}
|
|
19
|
+
export declare function codedErrorFromUnknown(error: unknown, fallbackCode?: string): {
|
|
20
|
+
code: string;
|
|
21
|
+
message: string;
|
|
22
|
+
retryable: boolean;
|
|
23
|
+
remediation?: string;
|
|
24
|
+
subject?: Record<string, Json>;
|
|
25
|
+
exitCode: number;
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=coded-errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coded-errors.d.ts","sourceRoot":"","sources":["../src/coded-errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kCAAkC,CAAC;AAE7D,MAAM,WAAW,0BAA0B;IACzC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,mBAAoB,SAAQ,kBAAkB;IACzD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,0BAA+B;CAapF;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,SAAa,GAAG;IAChF,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;CAClB,CAyBA"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export class WorkbenchUserError extends Error {
|
|
2
|
+
constructor(message) {
|
|
3
|
+
super(message);
|
|
4
|
+
this.name = "WorkbenchUserError";
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export class WorkbenchCodedError extends WorkbenchUserError {
|
|
8
|
+
code;
|
|
9
|
+
retryable;
|
|
10
|
+
remediation;
|
|
11
|
+
subject;
|
|
12
|
+
exitCode;
|
|
13
|
+
constructor(code, message, options = {}) {
|
|
14
|
+
super(message);
|
|
15
|
+
this.name = "WorkbenchCodedError";
|
|
16
|
+
this.code = code;
|
|
17
|
+
this.retryable = options.retryable ?? false;
|
|
18
|
+
if (options.remediation) {
|
|
19
|
+
this.remediation = options.remediation;
|
|
20
|
+
}
|
|
21
|
+
if (options.subject) {
|
|
22
|
+
this.subject = options.subject;
|
|
23
|
+
}
|
|
24
|
+
this.exitCode = options.exitCode ?? 1;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export function codedErrorFromUnknown(error, fallbackCode = "internal") {
|
|
28
|
+
if (error instanceof WorkbenchCodedError) {
|
|
29
|
+
return {
|
|
30
|
+
code: error.code,
|
|
31
|
+
message: error.message,
|
|
32
|
+
retryable: error.retryable,
|
|
33
|
+
...(error.remediation ? { remediation: error.remediation } : {}),
|
|
34
|
+
...(error.subject ? { subject: error.subject } : {}),
|
|
35
|
+
exitCode: error.exitCode,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
if (error instanceof WorkbenchUserError) {
|
|
39
|
+
return {
|
|
40
|
+
code: "usage",
|
|
41
|
+
message: error.message,
|
|
42
|
+
retryable: false,
|
|
43
|
+
exitCode: 2,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
code: fallbackCode,
|
|
48
|
+
message: error instanceof Error ? error.message : String(error),
|
|
49
|
+
retryable: false,
|
|
50
|
+
exitCode: 1,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
@@ -5,6 +5,7 @@ export interface WorkbenchExecutionProgressTarget {
|
|
|
5
5
|
ownerUserId?: string;
|
|
6
6
|
flushWindowMs?: number;
|
|
7
7
|
transport?: "http" | "stdout" | "both";
|
|
8
|
+
appendBatch?: (batch: WorkbenchExecutionEventBatch) => Promise<void>;
|
|
8
9
|
}
|
|
9
10
|
export interface WorkbenchExecutionEventPublisherContext {
|
|
10
11
|
projectId: string;
|
|
@@ -45,9 +46,12 @@ export interface WorkbenchProgressStdoutEnvelope {
|
|
|
45
46
|
batch: WorkbenchExecutionEventBatch;
|
|
46
47
|
};
|
|
47
48
|
}
|
|
49
|
+
export interface PublishWorkbenchProgressStdoutEnvelopeOptions {
|
|
50
|
+
forwardStdout?: boolean;
|
|
51
|
+
}
|
|
48
52
|
export declare function createWorkbenchProgressStdoutParser(onEnvelope: (envelope: WorkbenchProgressStdoutEnvelope) => void): {
|
|
49
53
|
write(chunk: Buffer | string): void;
|
|
50
54
|
flush(): void;
|
|
51
55
|
};
|
|
52
|
-
export declare function publishWorkbenchProgressStdoutEnvelope(envelope: WorkbenchProgressStdoutEnvelope, expectedTarget?: WorkbenchExecutionProgressTarget): Promise<void>;
|
|
56
|
+
export declare function publishWorkbenchProgressStdoutEnvelope(envelope: WorkbenchProgressStdoutEnvelope, expectedTarget?: WorkbenchExecutionProgressTarget, options?: PublishWorkbenchProgressStdoutEnvelopeOptions): Promise<void>;
|
|
53
57
|
//# sourceMappingURL=execution-events.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-events.d.ts","sourceRoot":"","sources":["../src/execution-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,IAAI,EACJ,uBAAuB,EACvB,4BAA4B,EAC5B,6BAA6B,EAC9B,MAAM,kCAAkC,CAAC;AAE1C,MAAM,WAAW,gCAAgC;IAC/C,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"execution-events.d.ts","sourceRoot":"","sources":["../src/execution-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,IAAI,EACJ,uBAAuB,EACvB,4BAA4B,EAC5B,6BAA6B,EAC9B,MAAM,kCAAkC,CAAC;AAE1C,MAAM,WAAW,gCAAgC;IAC/C,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;IACvC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,4BAA4B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtE;AAED,MAAM,WAAW,uCAAuC;IACtD,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,gCAAgC,CAAC;CAC3C;AAED,MAAM,WAAW,4BAA4B;IAC3C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,6BAA6B,CAAC;IACtC,IAAI,CAAC,EAAE,uBAAuB,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,EAAE,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAC1C,OAAO,EAAE,IAAI,CAAC;CACf;AAED,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,OAAO,CAAC,MAAM,EAAE,SAAS,4BAA4B,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,eAAO,MAAM,gCAAgC,2BAA2B,CAAC;AAEzE,wBAAgB,sCAAsC,CACpD,OAAO,EAAE,uCAAuC,GAC/C,gCAAgC,CAsClC;AAED,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,gCAAgC,GAAG,SAAS,EACvD,IAAI,EAAE;IACJ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3C,IAAI,CAAC,EAAE,uBAAuB,CAAC,MAAM,CAAC,CAAC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,OAAO,CAAC,IAAI,CAAC,CAef;AA0CD,MAAM,WAAW,+BAA+B;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE;QACJ,MAAM,EAAE,kCAAkC,CAAC;QAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,4BAA4B,CAAC;KACrC,CAAC;CACH;AAED,MAAM,WAAW,6CAA6C;IAC5D,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,mCAAmC,CACjD,UAAU,EAAE,CAAC,QAAQ,EAAE,+BAA+B,KAAK,IAAI,GAC9D;IACD,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACpC,KAAK,IAAI,IAAI,CAAC;CACf,CA0DA;AAED,wBAAsB,sCAAsC,CAC1D,QAAQ,EAAE,+BAA+B,EACzC,cAAc,CAAC,EAAE,gCAAgC,EACjD,OAAO,GAAE,6CAAkD,GAC1D,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
|
package/dist/execution-events.js
CHANGED
|
@@ -75,6 +75,7 @@ function validProgressTarget(target) {
|
|
|
75
75
|
? { flushWindowMs: target.flushWindowMs }
|
|
76
76
|
: {}),
|
|
77
77
|
...(target.transport === "stdout" || target.transport === "both" ? { transport: target.transport } : { transport: "http" }),
|
|
78
|
+
...(target.appendBatch ? { appendBatch: target.appendBatch } : {}),
|
|
78
79
|
};
|
|
79
80
|
}
|
|
80
81
|
async function publishProgressBatch(target, batch) {
|
|
@@ -147,7 +148,7 @@ export function createWorkbenchProgressStdoutParser(onEnvelope) {
|
|
|
147
148
|
},
|
|
148
149
|
};
|
|
149
150
|
}
|
|
150
|
-
export async function publishWorkbenchProgressStdoutEnvelope(envelope, expectedTarget) {
|
|
151
|
+
export async function publishWorkbenchProgressStdoutEnvelope(envelope, expectedTarget, options = {}) {
|
|
151
152
|
const target = validProgressTarget(expectedTarget);
|
|
152
153
|
if (!target) {
|
|
153
154
|
await postProgressBody(envelope);
|
|
@@ -156,14 +157,23 @@ export async function publishWorkbenchProgressStdoutEnvelope(envelope, expectedT
|
|
|
156
157
|
if (!progressEnvelopeMatchesTarget(envelope, target)) {
|
|
157
158
|
return;
|
|
158
159
|
}
|
|
159
|
-
|
|
160
|
+
if (target.appendBatch) {
|
|
161
|
+
await target.appendBatch(envelope.body.batch);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
const deliveredEnvelope = {
|
|
160
165
|
url: target.url,
|
|
161
166
|
body: {
|
|
162
167
|
...envelope.body,
|
|
163
168
|
...(target.ownerUserId ? { ownerUserId: target.ownerUserId } : {}),
|
|
164
169
|
leaseToken: target.token,
|
|
165
170
|
},
|
|
166
|
-
}
|
|
171
|
+
};
|
|
172
|
+
if (target.transport === "stdout" && options.forwardStdout === true) {
|
|
173
|
+
process.stdout.write(`${WORKBENCH_PROGRESS_STDOUT_PREFIX}${JSON.stringify(deliveredEnvelope)}\n`);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
await postProgressBody(deliveredEnvelope);
|
|
167
177
|
}
|
|
168
178
|
function progressEnvelopeMatchesTarget(envelope, target) {
|
|
169
179
|
return envelope.url === target.url &&
|
|
@@ -11,15 +11,16 @@ export interface WorkbenchExecutionDagResult {
|
|
|
11
11
|
startedJobCount: number;
|
|
12
12
|
cancelledJobCount: number;
|
|
13
13
|
}
|
|
14
|
+
type WorkbenchExecutionDagJobHook = (job: RemoteWorkbenchJob) => void | Promise<void>;
|
|
14
15
|
export interface WorkbenchExecutionDagRunInput {
|
|
15
16
|
jobs: readonly RemoteWorkbenchJob[];
|
|
16
17
|
capacity: WorkbenchExecutionDagCapacity;
|
|
17
18
|
sandboxBackend: WorkbenchSandboxBackendName;
|
|
18
19
|
executeJob: (job: RemoteWorkbenchJob) => Promise<RemoteWorkbenchJob>;
|
|
19
20
|
now?: () => string;
|
|
20
|
-
onJobQueued?:
|
|
21
|
-
onJobStarted?:
|
|
22
|
-
onJobFinished?:
|
|
21
|
+
onJobQueued?: WorkbenchExecutionDagJobHook;
|
|
22
|
+
onJobStarted?: WorkbenchExecutionDagJobHook;
|
|
23
|
+
onJobFinished?: WorkbenchExecutionDagJobHook;
|
|
23
24
|
}
|
|
24
25
|
export declare function runWorkbenchExecutionDag(args: WorkbenchExecutionDagRunInput): Promise<WorkbenchExecutionDagResult>;
|
|
25
26
|
export declare function workbenchJobDependencies(job: RemoteWorkbenchJob): string[];
|
|
@@ -28,4 +29,5 @@ export declare function workbenchJobHostCost(job: RemoteWorkbenchJob, backend: W
|
|
|
28
29
|
export declare function addCapacity(left: WorkbenchExecutionDagCapacity, right: WorkbenchExecutionDagCapacity): WorkbenchExecutionDagCapacity;
|
|
29
30
|
export declare function subtractCapacity(left: WorkbenchExecutionDagCapacity, right: WorkbenchExecutionDagCapacity): WorkbenchExecutionDagCapacity;
|
|
30
31
|
export declare function capacityFits(available: WorkbenchExecutionDagCapacity, cost: WorkbenchExecutionDagCapacity): boolean;
|
|
32
|
+
export {};
|
|
31
33
|
//# sourceMappingURL=execution-scheduler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-scheduler.d.ts","sourceRoot":"","sources":["../src/execution-scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAEnB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,gCAAgC,EACrC,KAAK,2BAA2B,EACjC,MAAM,6BAA6B,CAAC;AAErC,MAAM,WAAW,6BAA6B;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,kBAAkB,EAAE,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACpC,QAAQ,EAAE,6BAA6B,CAAC;IACxC,cAAc,EAAE,2BAA2B,CAAC;IAC5C,UAAU,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACrE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"execution-scheduler.d.ts","sourceRoot":"","sources":["../src/execution-scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAEnB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,gCAAgC,EACrC,KAAK,2BAA2B,EACjC,MAAM,6BAA6B,CAAC;AAErC,MAAM,WAAW,6BAA6B;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,kBAAkB,EAAE,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,KAAK,4BAA4B,GAAG,CAAC,GAAG,EAAE,kBAAkB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAEtF,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACpC,QAAQ,EAAE,6BAA6B,CAAC;IACxC,cAAc,EAAE,2BAA2B,CAAC;IAC5C,UAAU,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACrE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,4BAA4B,CAAC;IAC3C,YAAY,CAAC,EAAE,4BAA4B,CAAC;IAC5C,aAAa,CAAC,EAAE,4BAA4B,CAAC;CAC9C;AASD,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,6BAA6B,GAClC,OAAO,CAAC,2BAA2B,CAAC,CAuMtC;AAYD,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,kBAAkB,GAAG,MAAM,EAAE,CAM1E;AAED,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,kBAAkB,GACtB,gCAAgC,CAYlC;AAED,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,kBAAkB,EACvB,OAAO,EAAE,2BAA2B,GACnC,sBAAsB,CAExB;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,6BAA6B,EACnC,KAAK,EAAE,6BAA6B,GACnC,6BAA6B,CAM/B;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,6BAA6B,EACnC,KAAK,EAAE,6BAA6B,GACnC,6BAA6B,CAM/B;AAED,wBAAgB,YAAY,CAC1B,SAAS,EAAE,6BAA6B,EACxC,IAAI,EAAE,6BAA6B,GAClC,OAAO,CAIT"}
|
|
@@ -37,14 +37,17 @@ export async function runWorkbenchExecutionDag(args) {
|
|
|
37
37
|
throw new Error(`Job ${job.id} has unsupported initial DAG status ${job.status}.`);
|
|
38
38
|
}
|
|
39
39
|
pending.set(job.id, job);
|
|
40
|
-
args.onJobQueued
|
|
40
|
+
await runJobHook(args.onJobQueued, job);
|
|
41
41
|
}
|
|
42
42
|
while (pending.size > 0 || running.size > 0) {
|
|
43
|
-
const progressed = startReadyJobs();
|
|
43
|
+
const progressed = await startReadyJobs();
|
|
44
44
|
if (running.size === 0) {
|
|
45
45
|
if (pending.size === 0) {
|
|
46
46
|
break;
|
|
47
47
|
}
|
|
48
|
+
if (await cancelTerminalBlockedPendingJobs()) {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
48
51
|
const ready = readyPendingJobs();
|
|
49
52
|
if (ready.length > 0) {
|
|
50
53
|
const blocked = ready[0];
|
|
@@ -69,7 +72,7 @@ export async function runWorkbenchExecutionDag(args) {
|
|
|
69
72
|
startedJobCount,
|
|
70
73
|
cancelledJobCount,
|
|
71
74
|
};
|
|
72
|
-
function startReadyJobs() {
|
|
75
|
+
async function startReadyJobs() {
|
|
73
76
|
let progressed = false;
|
|
74
77
|
for (const job of [...pending.values()]) {
|
|
75
78
|
const dependencyStatus = dependencyTerminalStatus(job);
|
|
@@ -77,7 +80,7 @@ export async function runWorkbenchExecutionDag(args) {
|
|
|
77
80
|
continue;
|
|
78
81
|
}
|
|
79
82
|
if (dependencyStatus !== "ready") {
|
|
80
|
-
cancelPendingJob(job, dependencyStatus);
|
|
83
|
+
await cancelPendingJob(job, dependencyStatus);
|
|
81
84
|
progressed = true;
|
|
82
85
|
continue;
|
|
83
86
|
}
|
|
@@ -97,7 +100,7 @@ export async function runWorkbenchExecutionDag(args) {
|
|
|
97
100
|
};
|
|
98
101
|
startedJobCount += 1;
|
|
99
102
|
maxConcurrency = Math.max(maxConcurrency, running.size + 1);
|
|
100
|
-
args.onJobStarted
|
|
103
|
+
await runJobHook(args.onJobStarted, runningJob);
|
|
101
104
|
const promise = finishJob(runningJob, cost);
|
|
102
105
|
running.set(job.id, { cost, promise });
|
|
103
106
|
progressed = true;
|
|
@@ -107,6 +110,18 @@ export async function runWorkbenchExecutionDag(args) {
|
|
|
107
110
|
function readyPendingJobs() {
|
|
108
111
|
return [...pending.values()].filter((job) => dependencyTerminalStatus(job) === "ready");
|
|
109
112
|
}
|
|
113
|
+
async function cancelTerminalBlockedPendingJobs() {
|
|
114
|
+
let cancelled = false;
|
|
115
|
+
for (const job of [...pending.values()]) {
|
|
116
|
+
const dependencyStatus = dependencyTerminalStatus(job);
|
|
117
|
+
if (dependencyStatus !== "failed" && dependencyStatus !== "cancelled") {
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
await cancelPendingJob(job, dependencyStatus);
|
|
121
|
+
cancelled = true;
|
|
122
|
+
}
|
|
123
|
+
return cancelled;
|
|
124
|
+
}
|
|
110
125
|
function dependencyTerminalStatus(job) {
|
|
111
126
|
const jobDependencies = dependencies.get(job.id) ?? [];
|
|
112
127
|
let blocked = false;
|
|
@@ -128,7 +143,7 @@ export async function runWorkbenchExecutionDag(args) {
|
|
|
128
143
|
}
|
|
129
144
|
return blocked ? "blocked" : "ready";
|
|
130
145
|
}
|
|
131
|
-
function cancelPendingJob(job, dependencyStatus) {
|
|
146
|
+
async function cancelPendingJob(job, dependencyStatus) {
|
|
132
147
|
pending.delete(job.id);
|
|
133
148
|
const finishedAt = now();
|
|
134
149
|
const cancelled = {
|
|
@@ -141,7 +156,7 @@ export async function runWorkbenchExecutionDag(args) {
|
|
|
141
156
|
cancelledJobCount += 1;
|
|
142
157
|
terminal.set(job.id, cancelled);
|
|
143
158
|
results.set(job.id, cancelled);
|
|
144
|
-
args.onJobFinished
|
|
159
|
+
await runJobHook(args.onJobFinished, cancelled);
|
|
145
160
|
}
|
|
146
161
|
async function finishJob(runningJob, cost) {
|
|
147
162
|
let completed;
|
|
@@ -164,8 +179,14 @@ export async function runWorkbenchExecutionDag(args) {
|
|
|
164
179
|
}
|
|
165
180
|
terminal.set(runningJob.id, completed);
|
|
166
181
|
results.set(runningJob.id, completed);
|
|
167
|
-
args.onJobFinished
|
|
182
|
+
await runJobHook(args.onJobFinished, completed);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
async function runJobHook(hook, job) {
|
|
186
|
+
if (!hook) {
|
|
187
|
+
return;
|
|
168
188
|
}
|
|
189
|
+
await hook(job);
|
|
169
190
|
}
|
|
170
191
|
export function workbenchJobDependencies(job) {
|
|
171
192
|
const input = jsonRecord(job.input);
|
package/dist/generic-spec.d.ts
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import type { SurfaceSnapshotFile, WorkbenchAdapterInvocation, WorkbenchExecutionNetworkPolicy, WorkbenchExecutionResources } from "@workbench-ai/workbench-contract";
|
|
2
2
|
import type { WorkbenchEngineCase, WorkbenchEngineCaseSpec } from "@workbench-ai/workbench-protocol";
|
|
3
|
-
export declare const EVAL_SPEC_FILE = "eval.yaml";
|
|
4
|
-
export declare const SKILL_SPEC_FILE = "skill.yaml";
|
|
5
3
|
export interface WorkbenchRuntimeSpec {
|
|
6
4
|
dockerfile: string;
|
|
7
5
|
workdir?: string;
|
|
@@ -19,13 +17,6 @@ export interface WorkbenchPathRef {
|
|
|
19
17
|
export interface WorkbenchSkillPrepareSpec {
|
|
20
18
|
command: string;
|
|
21
19
|
}
|
|
22
|
-
export interface AuthoredEvalSpec {
|
|
23
|
-
version: 4;
|
|
24
|
-
name: string;
|
|
25
|
-
description: string;
|
|
26
|
-
adapters: string[];
|
|
27
|
-
engine: WorkbenchAdapterInvocation;
|
|
28
|
-
}
|
|
29
20
|
export interface WorkbenchSkillAgentSpec extends WorkbenchAdapterInvocation {
|
|
30
21
|
name: string;
|
|
31
22
|
}
|
|
@@ -37,30 +28,6 @@ export interface WorkbenchSelectionSpec {
|
|
|
37
28
|
metric: string;
|
|
38
29
|
cases?: WorkbenchCaseSelector;
|
|
39
30
|
}
|
|
40
|
-
export interface WorkbenchSkillImproveSpec extends WorkbenchAdapterInvocation {
|
|
41
|
-
edits: string[];
|
|
42
|
-
optimizeOn?: WorkbenchCaseSelector;
|
|
43
|
-
selectBy?: WorkbenchSelectionSpec;
|
|
44
|
-
}
|
|
45
|
-
export interface WorkbenchSkillManifestSpec {
|
|
46
|
-
version: 4;
|
|
47
|
-
name: string;
|
|
48
|
-
description?: string;
|
|
49
|
-
files: WorkbenchPathRef;
|
|
50
|
-
prepare?: WorkbenchSkillPrepareSpec;
|
|
51
|
-
adapters: string[];
|
|
52
|
-
defaultAgent?: string;
|
|
53
|
-
agents: Record<string, WorkbenchSkillAgentSpec>;
|
|
54
|
-
improve?: WorkbenchSkillImproveSpec;
|
|
55
|
-
}
|
|
56
|
-
export interface ResolvedSkillSpec extends WorkbenchSkillManifestSpec {
|
|
57
|
-
selectedAgentId: string;
|
|
58
|
-
}
|
|
59
|
-
export interface WorkbenchResolvedSource {
|
|
60
|
-
version: 4;
|
|
61
|
-
eval: AuthoredEvalSpec;
|
|
62
|
-
skill: ResolvedSkillSpec;
|
|
63
|
-
}
|
|
64
31
|
export interface GenericRunSpec {
|
|
65
32
|
version: 4;
|
|
66
33
|
name: string;
|
|
@@ -75,9 +42,6 @@ export interface GenericRunSpec {
|
|
|
75
42
|
description?: string;
|
|
76
43
|
files: WorkbenchPathRef;
|
|
77
44
|
prepare?: WorkbenchSkillPrepareSpec;
|
|
78
|
-
defaultAgent: string;
|
|
79
|
-
selectedAgentId: string;
|
|
80
|
-
selectedAgentName: string;
|
|
81
45
|
agents: Record<string, WorkbenchSkillAgentSpec>;
|
|
82
46
|
improve?: {
|
|
83
47
|
edits: string[];
|
|
@@ -101,33 +65,15 @@ export interface ResolvedEngineCaseExecutionConfig {
|
|
|
101
65
|
run: WorkbenchAdapterInvocation;
|
|
102
66
|
}
|
|
103
67
|
export declare const DEFAULT_EXECUTION_RESOURCES: WorkbenchExecutionResources;
|
|
104
|
-
export declare function validateWorkbenchResolvedSourceYaml(source: string): WorkbenchSpecValidation;
|
|
105
|
-
export declare function resolveWorkbenchResolvedSourceYaml(source: string): GenericRunSpec;
|
|
106
|
-
export declare function engineResolveBindingForSourceYaml(source: string): EngineResolveBinding;
|
|
107
|
-
export declare function engineResolveBindingForSpec(spec: GenericRunSpec): EngineResolveBinding;
|
|
108
|
-
export declare function resolveWorkbenchSourceFiles(args: {
|
|
109
|
-
evalSource: string;
|
|
110
|
-
skillSource: string;
|
|
111
|
-
selectedAgentId?: string | null;
|
|
112
|
-
}): GenericRunSpec;
|
|
113
|
-
export declare function parseWorkbenchSourceFiles(args: {
|
|
114
|
-
evalSource: string;
|
|
115
|
-
skillSource?: string;
|
|
116
|
-
selectedAgentId?: string | null;
|
|
117
|
-
}): WorkbenchResolvedSource;
|
|
118
|
-
export declare function serializeWorkbenchResolvedSourceYaml(source: WorkbenchResolvedSource): string;
|
|
119
|
-
export declare function isWorkbenchSkillManifestPath(filePath: string): boolean;
|
|
120
68
|
export declare function resolveEngineCaseExecutionConfig(args: {
|
|
121
69
|
spec: GenericRunSpec;
|
|
122
70
|
engineCase: GenericEngineCaseSpec;
|
|
123
71
|
}): ResolvedEngineCaseExecutionConfig;
|
|
124
|
-
export declare function engineResolveInvocationForSpec(spec: GenericRunSpec): WorkbenchAdapterInvocation;
|
|
125
72
|
export declare function engineCaseFilesForRuntimeInput(args: {
|
|
126
73
|
spec: GenericRunSpec;
|
|
127
74
|
engineCase: WorkbenchEngineCase;
|
|
128
75
|
}): SurfaceSnapshotFile[];
|
|
129
76
|
export declare function engineCasePublicFiles(engineCase: WorkbenchEngineCase): SurfaceSnapshotFile[];
|
|
130
|
-
export declare function engineCasePrivateFiles(engineCase: WorkbenchEngineCase): SurfaceSnapshotFile[];
|
|
131
77
|
export declare function runtimeResources(runtime: WorkbenchRuntimeSpec): WorkbenchExecutionResources;
|
|
132
78
|
export declare function runtimeNetwork(runtime: WorkbenchRuntimeSpec): WorkbenchExecutionNetworkPolicy;
|
|
133
79
|
export declare function runtimeSandboxRef(runtime: WorkbenchRuntimeSpec): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generic-spec.d.ts","sourceRoot":"","sources":["../src/generic-spec.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generic-spec.d.ts","sourceRoot":"","sources":["../src/generic-spec.ts"],"names":[],"mappings":"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"}
|