@workbench-ai/workbench-core 0.0.46 → 0.0.47
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/execution-events.d.ts +2 -2
- package/dist/execution-events.d.ts.map +1 -1
- package/dist/execution-events.js +3 -3
- package/dist/{execution-phases.d.ts → execution-evidence.d.ts} +8 -7
- package/dist/execution-evidence.d.ts.map +1 -0
- package/dist/{execution-phases.js → execution-evidence.js} +91 -51
- package/dist/execution-graph.js +1 -2
- package/dist/execution-jobs.js +1 -1
- package/dist/execution-outputs.d.ts.map +1 -1
- package/dist/execution-outputs.js +5 -10
- package/dist/execution-runtime-types.d.ts +7 -3
- package/dist/execution-runtime-types.d.ts.map +1 -1
- package/dist/execution-traces.d.ts +11 -1
- package/dist/execution-traces.d.ts.map +1 -1
- package/dist/execution-traces.js +305 -2
- package/dist/generic-spec.d.ts +8 -3
- package/dist/generic-spec.d.ts.map +1 -1
- package/dist/generic-spec.js +26 -37
- package/dist/index.d.ts +22 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +868 -214
- package/dist/runtime-dockerfile.d.ts +14 -0
- package/dist/runtime-dockerfile.d.ts.map +1 -0
- package/dist/runtime-dockerfile.js +65 -0
- package/dist/sandbox-backends/docker.d.ts.map +1 -1
- package/dist/sandbox-backends/docker.js +9 -12
- package/dist/sandbox-backends/index.d.ts.map +1 -1
- package/dist/sandbox-backends/index.js +2 -1
- package/dist/sandbox-inputs.d.ts.map +1 -1
- package/dist/sandbox-inputs.js +1 -0
- package/dist/sandbox-plane.d.ts +1 -0
- package/dist/sandbox-plane.d.ts.map +1 -1
- package/dist/sandbox-plane.js +12 -22
- package/dist/trace-files.d.ts +2 -2
- package/dist/trace-files.d.ts.map +1 -1
- package/dist/trace-files.js +4 -4
- package/package.json +3 -3
- package/worker/sandbox-adapter-runner.cjs +22 -13
- package/dist/execution-phases.d.ts.map +0 -1
|
@@ -29,8 +29,8 @@ export interface WorkbenchExecutionEventPublisher {
|
|
|
29
29
|
}
|
|
30
30
|
export declare const WORKBENCH_PROGRESS_STDOUT_PREFIX = "__WORKBENCH_PROGRESS__";
|
|
31
31
|
export declare function createWorkbenchExecutionEventPublisher(context: WorkbenchExecutionEventPublisherContext): WorkbenchExecutionEventPublisher;
|
|
32
|
-
export declare function
|
|
33
|
-
|
|
32
|
+
export declare function publishCommandStepEvent(publisher: WorkbenchExecutionEventPublisher | undefined, args: {
|
|
33
|
+
step: string;
|
|
34
34
|
status: "started" | "succeeded" | "failed";
|
|
35
35
|
role?: WorkbenchExecutionEvent["role"];
|
|
36
36
|
exitCode?: number;
|
|
@@ -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;CACxC;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,
|
|
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;CACxC;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;AAyCD,MAAM,WAAW,+BAA+B;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE;QACJ,IAAI,EAAE,wBAAwB,CAAC;QAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,KAAK,EAAE,4BAA4B,CAAC;KACrC,CAAC;CACH;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,GACxC,OAAO,CAAC,IAAI,CAAC,CAEf"}
|
package/dist/execution-events.js
CHANGED
|
@@ -38,16 +38,16 @@ export function createWorkbenchExecutionEventPublisher(context) {
|
|
|
38
38
|
},
|
|
39
39
|
};
|
|
40
40
|
}
|
|
41
|
-
export async function
|
|
41
|
+
export async function publishCommandStepEvent(publisher, args) {
|
|
42
42
|
if (!publisher?.enabled) {
|
|
43
43
|
return;
|
|
44
44
|
}
|
|
45
45
|
await publisher.publish([{
|
|
46
46
|
source: "command",
|
|
47
47
|
...(args.role ? { role: args.role } : {}),
|
|
48
|
-
schema: "workbench.execution.
|
|
48
|
+
schema: "workbench.execution.step.v1",
|
|
49
49
|
payload: {
|
|
50
|
-
|
|
50
|
+
step: args.step,
|
|
51
51
|
status: args.status,
|
|
52
52
|
...(typeof args.exitCode === "number" ? { exitCode: args.exitCode } : {}),
|
|
53
53
|
...(args.error ? { error: args.error } : {}),
|
|
@@ -1,21 +1,22 @@
|
|
|
1
|
-
import type { SubjectCaseReview, HostedWorkbenchJob, HostedWorkbenchJobStatus, WorkbenchExecutionEventRole, WorkbenchExecutionSpec, WorkbenchExecutionTrace,
|
|
2
|
-
export declare function
|
|
1
|
+
import type { SubjectCaseReview, HostedWorkbenchJob, HostedWorkbenchJobStatus, WorkbenchExecutionEventRole, WorkbenchExecutionSpec, WorkbenchExecutionTrace, WorkbenchExecutionEvidence, WorkbenchTraceSession } from "@workbench-ai/workbench-contract";
|
|
2
|
+
export declare function buildSubjectCaseExecutionRefs(args: {
|
|
3
3
|
jobs: readonly HostedWorkbenchJob[];
|
|
4
4
|
subjectId: string;
|
|
5
5
|
caseId: string;
|
|
6
6
|
sampleIndex?: number;
|
|
7
|
-
}): SubjectCaseReview["
|
|
8
|
-
export declare function
|
|
7
|
+
}): SubjectCaseReview["executions"];
|
|
8
|
+
export declare function buildWorkbenchExecutionEvidence(args: {
|
|
9
9
|
jobs: readonly HostedWorkbenchJob[];
|
|
10
10
|
traceIdPrefix: string;
|
|
11
11
|
traceForJob: (job: HostedWorkbenchJob, role: WorkbenchExecutionEventRole) => WorkbenchExecutionTrace;
|
|
12
|
-
|
|
12
|
+
traceSessionsForJob?: (job: HostedWorkbenchJob, role: WorkbenchExecutionEventRole) => WorkbenchTraceSession[];
|
|
13
|
+
}): WorkbenchExecutionEvidence[];
|
|
13
14
|
export declare function readWorkbenchExecutionPurpose(job: HostedWorkbenchJob): WorkbenchExecutionSpec["purpose"] | null;
|
|
14
15
|
export declare function readWorkbenchExecutionId(job: HostedWorkbenchJob): string | null;
|
|
15
16
|
export declare function readWorkbenchExecutionMetadataString(job: HostedWorkbenchJob, key: string): string | null;
|
|
16
17
|
export declare function readWorkbenchExecutionMetadataNumber(job: HostedWorkbenchJob, key: string): number | null;
|
|
17
|
-
export declare function
|
|
18
|
+
export declare function isWorkbenchExecutionActive(execution: SubjectCaseReview["executions"][number]): boolean;
|
|
18
19
|
export declare function resolveWorkbenchJobGroupStatus(jobs: readonly {
|
|
19
20
|
status: HostedWorkbenchJobStatus;
|
|
20
21
|
}[]): HostedWorkbenchJobStatus;
|
|
21
|
-
//# sourceMappingURL=execution-
|
|
22
|
+
//# sourceMappingURL=execution-evidence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution-evidence.d.ts","sourceRoot":"","sources":["../src/execution-evidence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EAExB,2BAA2B,EAC3B,sBAAsB,EACtB,uBAAuB,EACvB,0BAA0B,EAC1B,qBAAqB,EACtB,MAAM,kCAAkC,CAAC;AAI1C,wBAAgB,6BAA6B,CAAC,IAAI,EAAE;IAClD,IAAI,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAgElC;AAED,wBAAgB,+BAA+B,CAAC,IAAI,EAAE;IACpD,IAAI,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,CACX,GAAG,EAAE,kBAAkB,EACvB,IAAI,EAAE,2BAA2B,KAC9B,uBAAuB,CAAC;IAC7B,mBAAmB,CAAC,EAAE,CACpB,GAAG,EAAE,kBAAkB,EACvB,IAAI,EAAE,2BAA2B,KAC9B,qBAAqB,EAAE,CAAC;CAC9B,GAAG,0BAA0B,EAAE,CAgF/B;AAED,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,kBAAkB,GACtB,sBAAsB,CAAC,SAAS,CAAC,GAAG,IAAI,CAQ1C;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI,CAG/E;AAED,wBAAgB,oCAAoC,CAClD,GAAG,EAAE,kBAAkB,EACvB,GAAG,EAAE,MAAM,GACV,MAAM,GAAG,IAAI,CAGf;AAED,wBAAgB,oCAAoC,CAClD,GAAG,EAAE,kBAAkB,EACvB,GAAG,EAAE,MAAM,GACV,MAAM,GAAG,IAAI,CAGf;AAED,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,GACjD,OAAO,CAET;AAED,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,SAAS;IAAE,MAAM,EAAE,wBAAwB,CAAA;CAAE,EAAE,GACpD,wBAAwB,CAc1B"}
|
|
@@ -1,32 +1,32 @@
|
|
|
1
1
|
import { mergeWorkbenchExecutionTracesByJob } from "./execution-traces.js";
|
|
2
|
-
export function
|
|
2
|
+
export function buildSubjectCaseExecutionRefs(args) {
|
|
3
3
|
const groups = new Map();
|
|
4
4
|
for (const job of args.jobs) {
|
|
5
|
-
const
|
|
5
|
+
const kind = readWorkbenchExecutionPurpose(job);
|
|
6
6
|
const jobSubjectId = job.subjectId ?? readWorkbenchExecutionMetadataString(job, "subjectId");
|
|
7
7
|
const jobCaseId = readWorkbenchExecutionMetadataString(job, "caseId");
|
|
8
8
|
if (jobSubjectId === args.subjectId &&
|
|
9
|
-
|
|
9
|
+
kind === "attempt" &&
|
|
10
10
|
caseReviewCaseIdsMatch(jobCaseId, args.caseId) &&
|
|
11
11
|
caseReviewSampleIndicesMatch(readWorkbenchExecutionMetadataNumber(job, "sampleIndex"), args.sampleIndex)) {
|
|
12
12
|
const key = [
|
|
13
13
|
job.runId,
|
|
14
|
-
|
|
14
|
+
kind,
|
|
15
15
|
jobCaseId ?? "",
|
|
16
16
|
readWorkbenchExecutionMetadataNumber(job, "sampleIndex") ?? "",
|
|
17
17
|
].join("\0");
|
|
18
18
|
groups.set(key, [...(groups.get(key) ?? []), job]);
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
|
-
const
|
|
22
|
-
.map((group) => group.slice().sort(
|
|
21
|
+
const executions = [...groups.values()]
|
|
22
|
+
.map((group) => group.slice().sort(compareWorkbenchExecutionJobs))
|
|
23
23
|
.flatMap((group) => {
|
|
24
24
|
const first = group[0];
|
|
25
25
|
if (!first) {
|
|
26
26
|
return [];
|
|
27
27
|
}
|
|
28
|
-
const
|
|
29
|
-
if (
|
|
28
|
+
const kind = readWorkbenchExecutionPurpose(first);
|
|
29
|
+
if (kind !== "attempt") {
|
|
30
30
|
return [];
|
|
31
31
|
}
|
|
32
32
|
const startedAt = minTimestamp(group.map((job) => job.startedAt));
|
|
@@ -36,23 +36,32 @@ export function buildSubjectCasePhaseRefs(args) {
|
|
|
36
36
|
: null;
|
|
37
37
|
return [{
|
|
38
38
|
runId: first.runId,
|
|
39
|
-
|
|
39
|
+
kind,
|
|
40
40
|
role: "engine",
|
|
41
41
|
status: resolveWorkbenchJobGroupStatus(group),
|
|
42
42
|
jobIds: group.map((job) => job.id),
|
|
43
|
+
executionIds: group.flatMap((job) => {
|
|
44
|
+
const executionId = readWorkbenchExecutionId(job);
|
|
45
|
+
return executionId ? [executionId] : [];
|
|
46
|
+
}),
|
|
43
47
|
createdAt: minTimestamp(group.map((job) => job.createdAt)) ?? first.createdAt,
|
|
44
48
|
...(startedAt ? { startedAt } : {}),
|
|
45
49
|
...(finishedAt ? { finishedAt } : {}),
|
|
46
50
|
...(durationMs !== null ? { durationMs } : {}),
|
|
51
|
+
...optionalString("caseId", readWorkbenchExecutionMetadataString(first, "caseId")),
|
|
47
52
|
...optionalNumber("sampleIndex", readWorkbenchExecutionMetadataNumber(first, "sampleIndex")),
|
|
53
|
+
...optionalNumber("attemptIndex", readWorkbenchExecutionMetadataNumber(first, "attemptIndex")),
|
|
48
54
|
}];
|
|
49
55
|
})
|
|
50
|
-
.sort(
|
|
51
|
-
return
|
|
56
|
+
.sort(compareSubjectCaseExecutions);
|
|
57
|
+
return selectCurrentExecutionRun(executions);
|
|
52
58
|
}
|
|
53
|
-
export function
|
|
59
|
+
export function buildWorkbenchExecutionEvidence(args) {
|
|
54
60
|
const groups = new Map();
|
|
55
61
|
for (const job of args.jobs) {
|
|
62
|
+
if (isBaselineMaterializationJob(job)) {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
56
65
|
const purpose = readWorkbenchExecutionPurpose(job);
|
|
57
66
|
if (!purpose) {
|
|
58
67
|
continue;
|
|
@@ -79,27 +88,52 @@ export function buildWorkbenchTracePhases(args) {
|
|
|
79
88
|
return [];
|
|
80
89
|
}
|
|
81
90
|
const role = traceRoleForPurpose(purpose);
|
|
91
|
+
const sessions = group.flatMap((job) => args.traceSessionsForJob
|
|
92
|
+
? args.traceSessionsForJob(job, role)
|
|
93
|
+
: []);
|
|
94
|
+
const jobIds = group.map((job) => job.id);
|
|
95
|
+
const executionIds = group.flatMap((job) => {
|
|
96
|
+
const executionId = readWorkbenchExecutionId(job);
|
|
97
|
+
return executionId ? [executionId] : [];
|
|
98
|
+
});
|
|
82
99
|
return [{
|
|
83
|
-
|
|
100
|
+
id: [
|
|
101
|
+
purpose,
|
|
102
|
+
first.runId,
|
|
103
|
+
readWorkbenchExecutionMetadataString(first, "caseId") ?? "current",
|
|
104
|
+
readWorkbenchExecutionMetadataNumber(first, "sampleIndex") ?? "sample",
|
|
105
|
+
readWorkbenchExecutionMetadataNumber(first, "attemptIndex") ?? "attempt",
|
|
106
|
+
jobIds.join("_"),
|
|
107
|
+
].join(":"),
|
|
108
|
+
kind: purpose,
|
|
84
109
|
executionId: group.length === 1 ? readWorkbenchExecutionId(first) : null,
|
|
85
110
|
role,
|
|
86
111
|
status: resolveWorkbenchJobGroupStatus(group),
|
|
87
|
-
jobIds
|
|
112
|
+
jobIds,
|
|
113
|
+
executionIds,
|
|
88
114
|
...(first.subjectId ? { subjectId: first.subjectId } : {}),
|
|
89
115
|
...optionalString("caseId", readWorkbenchExecutionMetadataString(first, "caseId")),
|
|
90
116
|
...optionalNumber("sampleIndex", readWorkbenchExecutionMetadataNumber(first, "sampleIndex")),
|
|
91
117
|
...optionalNumber("attemptIndex", readWorkbenchExecutionMetadataNumber(first, "attemptIndex")),
|
|
118
|
+
sessions,
|
|
92
119
|
trace: mergeWorkbenchExecutionTracesByJob({
|
|
93
120
|
traceIdPrefix: args.traceIdPrefix,
|
|
94
121
|
stageId: purpose,
|
|
95
|
-
jobs:
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
122
|
+
jobs: [
|
|
123
|
+
...group.map((job) => ({
|
|
124
|
+
id: job.id,
|
|
125
|
+
trace: args.traceForJob(job, role),
|
|
126
|
+
})),
|
|
127
|
+
...sessions.map((session) => ({
|
|
128
|
+
id: session.id,
|
|
129
|
+
jobId: session.jobId,
|
|
130
|
+
trace: session.trace,
|
|
131
|
+
})),
|
|
132
|
+
],
|
|
99
133
|
}),
|
|
100
134
|
}];
|
|
101
135
|
})
|
|
102
|
-
.sort(
|
|
136
|
+
.sort(compareWorkbenchExecutionEvidence);
|
|
103
137
|
}
|
|
104
138
|
export function readWorkbenchExecutionPurpose(job) {
|
|
105
139
|
if (job.kind !== "execute") {
|
|
@@ -122,8 +156,8 @@ export function readWorkbenchExecutionMetadataNumber(job, key) {
|
|
|
122
156
|
const raw = readWorkbenchExecutionMetadataValue(job, key);
|
|
123
157
|
return typeof raw === "number" && Number.isFinite(raw) ? raw : null;
|
|
124
158
|
}
|
|
125
|
-
export function
|
|
126
|
-
return
|
|
159
|
+
export function isWorkbenchExecutionActive(execution) {
|
|
160
|
+
return execution.status === "queued" || execution.status === "running";
|
|
127
161
|
}
|
|
128
162
|
export function resolveWorkbenchJobGroupStatus(jobs) {
|
|
129
163
|
if (jobs.some((job) => job.status === "running")) {
|
|
@@ -150,44 +184,50 @@ function readExecutionRecord(job) {
|
|
|
150
184
|
const input = asRecord(job.input);
|
|
151
185
|
return asRecord(input?.execution);
|
|
152
186
|
}
|
|
153
|
-
function
|
|
187
|
+
function isBaselineMaterializationJob(job) {
|
|
188
|
+
const input = asRecord(job.input);
|
|
189
|
+
const execution = asRecord(input?.execution);
|
|
190
|
+
const metadata = asRecord(execution?.metadata);
|
|
191
|
+
return metadata?.baseline === true || input?.baseline === true;
|
|
192
|
+
}
|
|
193
|
+
function caseReviewCaseIdsMatch(jobCaseId, requestedCaseId) {
|
|
154
194
|
return Boolean(jobCaseId) &&
|
|
155
|
-
(jobCaseId ===
|
|
195
|
+
(jobCaseId === requestedCaseId || requestedCaseId.startsWith(`${jobCaseId}__`));
|
|
156
196
|
}
|
|
157
197
|
function caseReviewSampleIndicesMatch(jobSampleIndex, reviewSampleIndex) {
|
|
158
198
|
return typeof reviewSampleIndex !== "number" || jobSampleIndex === reviewSampleIndex;
|
|
159
199
|
}
|
|
160
|
-
function
|
|
161
|
-
if (
|
|
162
|
-
return
|
|
200
|
+
function selectCurrentExecutionRun(executions) {
|
|
201
|
+
if (executions.length <= 1) {
|
|
202
|
+
return executions;
|
|
163
203
|
}
|
|
164
|
-
const activeRunId =
|
|
165
|
-
.filter(
|
|
166
|
-
.sort(
|
|
167
|
-
const selectedRunId = activeRunId ??
|
|
204
|
+
const activeRunId = executions
|
|
205
|
+
.filter(isWorkbenchExecutionActive)
|
|
206
|
+
.sort(compareExecutionRecency)[0]?.runId;
|
|
207
|
+
const selectedRunId = activeRunId ?? executions.slice().sort(compareExecutionRecency)[0]?.runId;
|
|
168
208
|
return selectedRunId
|
|
169
|
-
?
|
|
170
|
-
:
|
|
209
|
+
? executions.filter((execution) => execution.runId === selectedRunId)
|
|
210
|
+
: executions;
|
|
171
211
|
}
|
|
172
|
-
function
|
|
173
|
-
return (
|
|
212
|
+
function compareSubjectCaseExecutions(left, right) {
|
|
213
|
+
return (executionKindOrder(left.kind) - executionKindOrder(right.kind) ||
|
|
174
214
|
(left.sampleIndex ?? -1) - (right.sampleIndex ?? -1) ||
|
|
175
|
-
|
|
215
|
+
readExecutionRecencyMs(right) - readExecutionRecencyMs(left));
|
|
176
216
|
}
|
|
177
|
-
function
|
|
178
|
-
return
|
|
217
|
+
function compareExecutionRecency(left, right) {
|
|
218
|
+
return readExecutionRecencyMs(right) - readExecutionRecencyMs(left);
|
|
179
219
|
}
|
|
180
|
-
function
|
|
181
|
-
return (
|
|
182
|
-
|
|
220
|
+
function compareWorkbenchExecutionJobs(left, right) {
|
|
221
|
+
return (executionKindOrder(readWorkbenchExecutionPurpose(left)) -
|
|
222
|
+
executionKindOrder(readWorkbenchExecutionPurpose(right)) ||
|
|
183
223
|
(readWorkbenchExecutionMetadataNumber(left, "sampleIndex") ?? -1) -
|
|
184
224
|
(readWorkbenchExecutionMetadataNumber(right, "sampleIndex") ?? -1) ||
|
|
185
225
|
readJobRecencyMs(right) - readJobRecencyMs(left) ||
|
|
186
226
|
left.id.localeCompare(right.id));
|
|
187
227
|
}
|
|
188
228
|
function compareWorkbenchTraceJobs(left, right) {
|
|
189
|
-
return (
|
|
190
|
-
|
|
229
|
+
return (executionKindOrder(readWorkbenchExecutionPurpose(left)) -
|
|
230
|
+
executionKindOrder(readWorkbenchExecutionPurpose(right)) ||
|
|
191
231
|
String(readWorkbenchExecutionMetadataString(left, "caseId") ?? "").localeCompare(String(readWorkbenchExecutionMetadataString(right, "caseId") ?? "")) ||
|
|
192
232
|
(readWorkbenchExecutionMetadataNumber(left, "sampleIndex") ?? -1) -
|
|
193
233
|
(readWorkbenchExecutionMetadataNumber(right, "sampleIndex") ?? -1) ||
|
|
@@ -195,8 +235,8 @@ function compareWorkbenchTraceJobs(left, right) {
|
|
|
195
235
|
(readWorkbenchExecutionMetadataNumber(right, "attemptIndex") ?? -1) ||
|
|
196
236
|
left.id.localeCompare(right.id));
|
|
197
237
|
}
|
|
198
|
-
function
|
|
199
|
-
return (
|
|
238
|
+
function compareWorkbenchExecutionEvidence(left, right) {
|
|
239
|
+
return (executionKindOrder(left.kind) - executionKindOrder(right.kind) ||
|
|
200
240
|
String(left.caseId ?? "").localeCompare(String(right.caseId ?? "")) ||
|
|
201
241
|
(left.sampleIndex ?? -1) - (right.sampleIndex ?? -1) ||
|
|
202
242
|
(left.attemptIndex ?? -1) - (right.attemptIndex ?? -1) ||
|
|
@@ -208,19 +248,19 @@ function traceRoleForPurpose(purpose) {
|
|
|
208
248
|
}
|
|
209
249
|
return "engine";
|
|
210
250
|
}
|
|
211
|
-
function
|
|
212
|
-
if (
|
|
251
|
+
function executionKindOrder(kind) {
|
|
252
|
+
if (kind === "improve") {
|
|
213
253
|
return 0;
|
|
214
254
|
}
|
|
215
|
-
if (
|
|
255
|
+
if (kind === "attempt") {
|
|
216
256
|
return 1;
|
|
217
257
|
}
|
|
218
258
|
return 3;
|
|
219
259
|
}
|
|
220
|
-
function
|
|
221
|
-
return (parseTimestampMs(
|
|
222
|
-
parseTimestampMs(
|
|
223
|
-
parseTimestampMs(
|
|
260
|
+
function readExecutionRecencyMs(execution) {
|
|
261
|
+
return (parseTimestampMs(execution.finishedAt) ??
|
|
262
|
+
parseTimestampMs(execution.startedAt) ??
|
|
263
|
+
parseTimestampMs(execution.createdAt) ??
|
|
224
264
|
0);
|
|
225
265
|
}
|
|
226
266
|
function readJobRecencyMs(job) {
|
package/dist/execution-graph.js
CHANGED
|
@@ -80,8 +80,7 @@ function createExecution(args) {
|
|
|
80
80
|
subjectId: args.input.subjectId,
|
|
81
81
|
purpose: args.purpose,
|
|
82
82
|
adapter: args.adapter,
|
|
83
|
-
sandbox: args.input.environmentRef
|
|
84
|
-
runtimeSandboxRef(args.runtime) === runtimeSandboxRef(args.input.spec.environment)
|
|
83
|
+
sandbox: args.input.environmentRef
|
|
85
84
|
? {
|
|
86
85
|
kind: "oci",
|
|
87
86
|
ref: args.input.environmentRef,
|
package/dist/execution-jobs.js
CHANGED
|
@@ -76,7 +76,7 @@ export function engineCaseIds(engineCases) {
|
|
|
76
76
|
export function engineCaseForCase(engineCases, caseId) {
|
|
77
77
|
const engineCase = engineCases.find((bundle) => bundle.id === caseId);
|
|
78
78
|
if (!engineCase) {
|
|
79
|
-
throw new Error(`
|
|
79
|
+
throw new Error(`Engine case not found for case ${caseId}.`);
|
|
80
80
|
}
|
|
81
81
|
return engineCase;
|
|
82
82
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-outputs.d.ts","sourceRoot":"","sources":["../src/execution-outputs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,IAAI,EAEJ,qBAAqB,EAErB,sBAAsB,EACtB,eAAe,EAChB,MAAM,kCAAkC,CAAC;AAI1C,MAAM,WAAW,gCAAgC;IAC/C,YAAY,CAAC,EAAE,qBAAqB,CAAC;IACrC,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B;AAED,wBAAgB,wCAAwC,CACtD,SAAS,EAAE,sBAAsB,EACjC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAC7B,gCAAgC,CAoClC;AAED,wBAAgB,wCAAwC,CAAC,SAAS,EAAE,sBAAsB,GAAG,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"execution-outputs.d.ts","sourceRoot":"","sources":["../src/execution-outputs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,IAAI,EAEJ,qBAAqB,EAErB,sBAAsB,EACtB,eAAe,EAChB,MAAM,kCAAkC,CAAC;AAI1C,MAAM,WAAW,gCAAgC;IAC/C,YAAY,CAAC,EAAE,qBAAqB,CAAC;IACrC,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B;AAED,wBAAgB,wCAAwC,CACtD,SAAS,EAAE,sBAAsB,EACjC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAC7B,gCAAgC,CAoClC;AAED,wBAAgB,wCAAwC,CAAC,SAAS,EAAE,sBAAsB,GAAG,MAAM,EAAE,CAkFpG;AAsBD,wBAAgB,iCAAiC,CAAC,SAAS,EAAE,sBAAsB,GAAG,IAAI,CAKzF"}
|
|
@@ -87,6 +87,7 @@ export function collectWorkbenchExecutionIsolationIssues(execution) {
|
|
|
87
87
|
}
|
|
88
88
|
const outputNames = new Set();
|
|
89
89
|
const expectedOutput = expectedOutputForPurpose(execution.purpose);
|
|
90
|
+
const isRuntimeControlExecution = execution.metadata.runtimeControl === true;
|
|
90
91
|
for (const output of execution.outputs) {
|
|
91
92
|
if (outputNames.has(output.name)) {
|
|
92
93
|
issues.push(`Execution ${execution.id} declares duplicate output ${output.name}.`);
|
|
@@ -102,7 +103,7 @@ export function collectWorkbenchExecutionIsolationIssues(execution) {
|
|
|
102
103
|
issues.push(`Execution ${execution.id} cannot declare ${output.schema} for purpose ${execution.purpose}.`);
|
|
103
104
|
}
|
|
104
105
|
}
|
|
105
|
-
if (expectedOutput !== null && !outputNames.has(expectedOutput)) {
|
|
106
|
+
if (expectedOutput !== null && !outputNames.has(expectedOutput) && !isRuntimeControlExecution) {
|
|
106
107
|
issues.push(`Execution ${execution.id} missing required output ${expectedOutput} for purpose ${execution.purpose}.`);
|
|
107
108
|
}
|
|
108
109
|
const resources = execution.policy.resources;
|
|
@@ -111,9 +112,6 @@ export function collectWorkbenchExecutionIsolationIssues(execution) {
|
|
|
111
112
|
issues.push(`Execution ${execution.id} policy.resources.${name} must be a positive number.`);
|
|
112
113
|
}
|
|
113
114
|
}
|
|
114
|
-
if (execution.policy.network.egress === "allowlist" && (!execution.policy.network.allow || execution.policy.network.allow.length === 0)) {
|
|
115
|
-
issues.push(`Execution ${execution.id} allowlist network policy must include at least one allowed host.`);
|
|
116
|
-
}
|
|
117
115
|
return issues;
|
|
118
116
|
}
|
|
119
117
|
function expectedInputsForPurpose(purpose) {
|
|
@@ -271,13 +269,10 @@ function normalizeCaseCriteria(value, label, issues) {
|
|
|
271
269
|
if (!record || !criterionId || score === null) {
|
|
272
270
|
return [];
|
|
273
271
|
}
|
|
274
|
-
const pass = record.pass ===
|
|
275
|
-
? score >= 0.5
|
|
276
|
-
: typeof record.pass === "boolean"
|
|
277
|
-
? record.pass
|
|
278
|
-
: null;
|
|
272
|
+
const pass = typeof record.pass === "boolean" ? record.pass : null;
|
|
279
273
|
if (pass === null) {
|
|
280
274
|
issues.push(`${itemLabel}.pass must be a boolean.`);
|
|
275
|
+
return [];
|
|
281
276
|
}
|
|
282
277
|
const errors = record.errors === undefined
|
|
283
278
|
? []
|
|
@@ -294,7 +289,7 @@ function normalizeCaseCriteria(value, label, issues) {
|
|
|
294
289
|
criterion_id: criterionId,
|
|
295
290
|
label: typeof record.label === "string" ? record.label : criterionId,
|
|
296
291
|
score,
|
|
297
|
-
pass
|
|
292
|
+
pass,
|
|
298
293
|
...(errors && errors.length > 0 ? { errors } : {}),
|
|
299
294
|
...(rationale ? { rationale } : {}),
|
|
300
295
|
}];
|
|
@@ -2,7 +2,7 @@ import type { HostedWorkbenchEnvironmentVersion, HostedWorkbenchJob, Json, Surfa
|
|
|
2
2
|
import type { GenericRunSpec, WorkbenchEngineCase } from "./generic-spec.ts";
|
|
3
3
|
import type { WorkbenchExecutionProgressTarget } from "./execution-events.ts";
|
|
4
4
|
import type { WorkbenchAdapterAuthBundle } from "./adapter-auth.ts";
|
|
5
|
-
import type { WorkbenchAdapterOperation, WorkbenchAdapterManifest } from "@workbench-ai/workbench-protocol";
|
|
5
|
+
import type { WorkbenchAdapterOperation, WorkbenchAdapterOperationExecutor, WorkbenchAdapterManifest, WorkbenchRuntimeControlOperationSequenceRequest } from "@workbench-ai/workbench-protocol";
|
|
6
6
|
export interface WorkbenchExecutionRuntimeInput {
|
|
7
7
|
job: HostedWorkbenchJob;
|
|
8
8
|
spec: GenericRunSpec;
|
|
@@ -11,6 +11,7 @@ export interface WorkbenchExecutionRuntimeInput {
|
|
|
11
11
|
baseFiles: readonly SurfaceSnapshotFile[];
|
|
12
12
|
engineResolveFiles: readonly SurfaceSnapshotFile[];
|
|
13
13
|
engineCases: readonly WorkbenchEngineCase[];
|
|
14
|
+
adapterFiles?: readonly SurfaceSnapshotFile[];
|
|
14
15
|
traceFiles?: readonly SurfaceSnapshotFile[];
|
|
15
16
|
now?: string;
|
|
16
17
|
adapterAuthProfiles?: readonly WorkbenchAdapterAuthBundle[];
|
|
@@ -18,16 +19,19 @@ export interface WorkbenchExecutionRuntimeInput {
|
|
|
18
19
|
adapterAuthRoot?: string;
|
|
19
20
|
adapterAuthRequest?: Json;
|
|
20
21
|
adapterAuthEnv?: Record<string, string>;
|
|
22
|
+
adapterRuntimeEnv?: Record<string, string>;
|
|
21
23
|
progress?: WorkbenchExecutionProgressTarget;
|
|
22
24
|
runtimeRegistry?: string;
|
|
23
25
|
pullImages?: boolean;
|
|
24
26
|
workdir?: string;
|
|
25
27
|
workspaceRoot?: string;
|
|
28
|
+
runtimeControlOperation?: WorkbenchRuntimeControlOperationSequenceRequest;
|
|
26
29
|
}
|
|
27
|
-
export interface
|
|
28
|
-
kind: "optimizer" | "
|
|
30
|
+
export interface WorkbenchWorkloadStepCommand {
|
|
31
|
+
kind: "optimizer" | "subject" | "engine";
|
|
29
32
|
label: string;
|
|
30
33
|
operation: WorkbenchAdapterOperation;
|
|
34
|
+
executor: WorkbenchAdapterOperationExecutor;
|
|
31
35
|
adapter?: WorkbenchAdapterInvocation;
|
|
32
36
|
command?: string;
|
|
33
37
|
okExitCodes?: number[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-runtime-types.d.ts","sourceRoot":"","sources":["../src/execution-runtime-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iCAAiC,EACjC,kBAAkB,EAClB,IAAI,EACJ,mBAAmB,EACnB,0BAA0B,EAC3B,MAAM,kCAAkC,CAAC;AAE1C,OAAO,KAAK,EACV,cAAc,EACd,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,gCAAgC,EACjC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EACV,0BAA0B,EAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,yBAAyB,EACzB,wBAAwB,
|
|
1
|
+
{"version":3,"file":"execution-runtime-types.d.ts","sourceRoot":"","sources":["../src/execution-runtime-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iCAAiC,EACjC,kBAAkB,EAClB,IAAI,EACJ,mBAAmB,EACnB,0BAA0B,EAC3B,MAAM,kCAAkC,CAAC;AAE1C,OAAO,KAAK,EACV,cAAc,EACd,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,gCAAgC,EACjC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EACV,0BAA0B,EAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,yBAAyB,EACzB,iCAAiC,EACjC,wBAAwB,EACxB,+CAA+C,EAChD,MAAM,kCAAkC,CAAC;AAE1C,MAAM,WAAW,8BAA8B;IAC7C,GAAG,EAAE,kBAAkB,CAAC;IACxB,IAAI,EAAE,cAAc,CAAC;IACrB,kBAAkB,CAAC,EAAE,IAAI,CAAC,iCAAiC,EAAE,IAAI,GAAG,UAAU,GAAG,YAAY,GAAG,MAAM,CAAC,CAAC;IACxG,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,SAAS,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAC1C,kBAAkB,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACnD,WAAW,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAC5C,YAAY,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAC9C,UAAU,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAC5C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mBAAmB,CAAC,EAAE,SAAS,0BAA0B,EAAE,CAAC;IAC5D,gBAAgB,CAAC,EAAE,SAAS,wBAAwB,EAAE,CAAC;IACvD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,IAAI,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,QAAQ,CAAC,EAAE,gCAAgC,CAAC;IAC5C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uBAAuB,CAAC,EAAE,+CAA+C,CAAC;CAC3E;AAED,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,yBAAyB,CAAC;IACrC,QAAQ,EAAE,iCAAiC,CAAC;IAC5C,OAAO,CAAC,EAAE,0BAA0B,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import type { HostedWorkbenchJob, WorkbenchExecutionTrace } from "@workbench-ai/workbench-contract";
|
|
1
|
+
import type { HostedWorkbenchJob, SurfaceSnapshotFile, WorkbenchExecutionTrace, WorkbenchTraceSession } from "@workbench-ai/workbench-contract";
|
|
2
2
|
export interface WorkbenchTraceMergeJob {
|
|
3
3
|
id: string;
|
|
4
|
+
jobId?: string;
|
|
4
5
|
trace: WorkbenchExecutionTrace;
|
|
5
6
|
}
|
|
6
7
|
export declare function finalizeWorkbenchExecutionTraceForJob(args: {
|
|
@@ -13,4 +14,13 @@ export declare function mergeWorkbenchExecutionTracesByJob(args: {
|
|
|
13
14
|
stageId?: string | null;
|
|
14
15
|
jobs: readonly WorkbenchTraceMergeJob[];
|
|
15
16
|
}): WorkbenchExecutionTrace;
|
|
17
|
+
export declare function buildWorkbenchTraceSessionsFromFiles(args: {
|
|
18
|
+
job: HostedWorkbenchJob;
|
|
19
|
+
files: readonly SurfaceSnapshotFile[];
|
|
20
|
+
purpose?: string | null;
|
|
21
|
+
fallbackRole: WorkbenchTraceSession["role"];
|
|
22
|
+
}): WorkbenchTraceSession[];
|
|
23
|
+
export declare function combineWorkbenchTraceSessions(sessions: readonly WorkbenchTraceSession[]): WorkbenchExecutionTrace;
|
|
24
|
+
export declare function readWorkbenchExecutionTraceFiles(files: readonly SurfaceSnapshotFile[]): WorkbenchExecutionTrace | null;
|
|
25
|
+
export declare function traceSessionLabel(filePath: string, role: WorkbenchTraceSession["role"]): string;
|
|
16
26
|
//# sourceMappingURL=execution-traces.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-traces.d.ts","sourceRoot":"","sources":["../src/execution-traces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAElB,uBAAuB,
|
|
1
|
+
{"version":3,"file":"execution-traces.d.ts","sourceRoot":"","sources":["../src/execution-traces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAElB,mBAAmB,EACnB,uBAAuB,EACvB,qBAAqB,EACtB,MAAM,kCAAkC,CAAC;AAE1C,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,uBAAuB,CAAC;CAChC;AAED,wBAAgB,qCAAqC,CAAC,IAAI,EAAE;IAC1D,GAAG,EAAE,kBAAkB,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,uBAAuB,CAAC;CAChC,GAAG,uBAAuB,CAsD1B;AAED,wBAAgB,kCAAkC,CAAC,IAAI,EAAE;IACvD,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,SAAS,sBAAsB,EAAE,CAAC;CACzC,GAAG,uBAAuB,CAqC1B;AAED,wBAAgB,oCAAoC,CAAC,IAAI,EAAE;IACzD,GAAG,EAAE,kBAAkB,CAAC;IACxB,KAAK,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACtC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,EAAE,qBAAqB,CAAC,MAAM,CAAC,CAAC;CAC7C,GAAG,qBAAqB,EAAE,CA2B1B;AAED,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,SAAS,qBAAqB,EAAE,GACzC,uBAAuB,CAOzB;AAED,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,SAAS,mBAAmB,EAAE,GACpC,uBAAuB,GAAG,IAAI,CAiBhC;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,qBAAqB,CAAC,MAAM,CAAC,GAClC,MAAM,CAaR"}
|