@workbench-ai/workbench-protocol 0.0.45 → 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/adapter-definition.d.ts +2 -2
- package/dist/adapter-definition.d.ts.map +1 -1
- package/dist/adapter-definition.js +2 -70
- package/dist/adapter-manifest.d.ts +3 -0
- package/dist/adapter-manifest.d.ts.map +1 -1
- package/dist/adapter-manifest.js +19 -1
- package/dist/adapter-protocol.d.ts +3 -2
- package/dist/adapter-protocol.d.ts.map +1 -1
- package/dist/adapter-protocol.js +7 -4
- package/dist/engine-resolve-result.d.ts +3 -3
- package/dist/engine-resolve-result.d.ts.map +1 -1
- package/dist/engine-resolve-result.js +9 -12
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/runtime-control.d.ts +49 -0
- package/dist/runtime-control.d.ts.map +1 -0
- package/dist/runtime-control.js +144 -0
- package/package.json +2 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Json } from "@workbench-ai/workbench-contract";
|
|
2
|
-
import type { WorkbenchAdapterAuthManifest, WorkbenchAdapterInvocationLike, WorkbenchAdapterManifest, WorkbenchAdapterOperation, WorkbenchAdapterSlotManifest } from "./adapter-manifest.ts";
|
|
2
|
+
import type { WorkbenchAdapterAuthManifest, WorkbenchAdapterInvocationLike, WorkbenchAdapterManifest, WorkbenchAdapterOperation, WorkbenchAdapterOperationExecutor, WorkbenchAdapterSlotManifest } from "./adapter-manifest.ts";
|
|
3
3
|
import { type WorkbenchAdapterOperationRequest, type WorkbenchAdapterOperationResult, type WorkbenchAdapterOperationResultValue } from "./adapter-protocol.ts";
|
|
4
4
|
export interface WorkbenchAdapterDefinition<TContext = unknown> {
|
|
5
5
|
id: string;
|
|
@@ -13,6 +13,7 @@ export interface WorkbenchAdapterDefinition<TContext = unknown> {
|
|
|
13
13
|
}
|
|
14
14
|
export interface WorkbenchAdapterOperationDefinition<TContext = unknown> {
|
|
15
15
|
command?: string;
|
|
16
|
+
executor?: WorkbenchAdapterOperationExecutor;
|
|
16
17
|
handle?: WorkbenchAdapterOperationHandler<TContext>;
|
|
17
18
|
}
|
|
18
19
|
export interface WorkbenchAdapterHandlerContext<TContext = unknown> {
|
|
@@ -40,7 +41,6 @@ export declare function defineOptimizer<TContext = unknown>(definition?: Workben
|
|
|
40
41
|
export declare function adapterSlot(path: string, operation: WorkbenchAdapterOperation): WorkbenchAdapterSlotManifest;
|
|
41
42
|
export declare function workbenchAdapterManifestFromDefinition(definition: WorkbenchAdapterDefinition): WorkbenchAdapterManifest;
|
|
42
43
|
export declare function runDefinedAdapter<TContext = unknown>(definition: WorkbenchAdapterDefinition<TContext>, options?: RunDefinedWorkbenchAdapterOptions<TContext>): Promise<WorkbenchAdapterOperationResult | null>;
|
|
43
|
-
export declare function runSubjectFromEngine<TContext = unknown>(context: WorkbenchAdapterHandlerContext<TContext>): Promise<WorkbenchAdapterOperationResult>;
|
|
44
44
|
export declare function operationDefinitionForRequest<TContext = unknown>(definition: WorkbenchAdapterDefinition<TContext>, operation: WorkbenchAdapterOperation): WorkbenchAdapterOperationDefinition<TContext> | undefined;
|
|
45
45
|
export declare function adapterResult<TValue extends WorkbenchAdapterOperationResultValue>(operation: WorkbenchAdapterOperation, value: TValue, metadata?: Omit<WorkbenchAdapterOperationResult<TValue>, "protocol" | "operation" | "value">): WorkbenchAdapterOperationResult<TValue>;
|
|
46
46
|
export declare function adapterSlotInvocation(request: WorkbenchAdapterOperationRequest, slots: Record<string, WorkbenchAdapterSlotManifest> | undefined, name: string): WorkbenchAdapterInvocationLike | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter-definition.d.ts","sourceRoot":"","sources":["../src/adapter-definition.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"adapter-definition.d.ts","sourceRoot":"","sources":["../src/adapter-definition.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import { promises as fs } from "node:fs";
|
|
2
|
-
import { execFile } from "node:child_process";
|
|
3
|
-
import path from "node:path";
|
|
4
|
-
import { promisify } from "node:util";
|
|
5
2
|
import { WORKBENCH_ADAPTER_MANIFEST_PROTOCOL, adapterCommandName, normalizeWorkbenchAdapterOperation, } from "./adapter-manifest.js";
|
|
6
|
-
import { WORKBENCH_ADAPTER_RESULT_PROTOCOL, ensureWorkbenchAdapterOutputDir,
|
|
7
|
-
const execFileAsync = promisify(execFile);
|
|
3
|
+
import { WORKBENCH_ADAPTER_RESULT_PROTOCOL, ensureWorkbenchAdapterOutputDir, readWorkbenchAdapterOperationRequest, workbenchAdapterOperationResultPath, writeWorkbenchAdapterOperationResult, } from "./adapter-protocol.js";
|
|
8
4
|
export function defineAdapter(definition) {
|
|
9
5
|
return definition;
|
|
10
6
|
}
|
|
@@ -76,71 +72,6 @@ export async function runDefinedAdapter(definition, options = {}) {
|
|
|
76
72
|
await writeWorkbenchAdapterOperationResult(request.paths.output, result);
|
|
77
73
|
return result;
|
|
78
74
|
}
|
|
79
|
-
export async function runSubjectFromEngine(context) {
|
|
80
|
-
if (context.operation !== "engine.run") {
|
|
81
|
-
throw new Error("runSubjectFromEngine can only be used while handling engine.run.");
|
|
82
|
-
}
|
|
83
|
-
const subject = context.request.context?.subject?.run;
|
|
84
|
-
if (!subject?.command) {
|
|
85
|
-
throw new Error("engine.run request context.subject.run.command is required to invoke the subject.");
|
|
86
|
-
}
|
|
87
|
-
const nestedRoot = path.join(context.paths.output, ".workbench", "internal", "subject-run", safeInternalPathSegment(context.request.id));
|
|
88
|
-
const nestedOutput = path.join(nestedRoot, "output");
|
|
89
|
-
const requestPath = path.join(nestedRoot, "request.json");
|
|
90
|
-
const resultPath = workbenchAdapterOperationResultPath(nestedOutput);
|
|
91
|
-
const subjectPaths = { ...context.paths };
|
|
92
|
-
delete subjectPaths.enginePrivate;
|
|
93
|
-
await fs.mkdir(nestedOutput, { recursive: true });
|
|
94
|
-
await fs.writeFile(requestPath, `${JSON.stringify({
|
|
95
|
-
...context.request,
|
|
96
|
-
id: `${context.request.id}:subject`,
|
|
97
|
-
operation: "subject.run",
|
|
98
|
-
invocation: {
|
|
99
|
-
use: subject.use,
|
|
100
|
-
with: subject.with ?? {},
|
|
101
|
-
...(subject.auth !== undefined ? { auth: subject.auth } : {}),
|
|
102
|
-
},
|
|
103
|
-
...(context.request.auth !== undefined
|
|
104
|
-
? { auth: adapterScopedAuth(context.request.auth, subject.use) }
|
|
105
|
-
: {}),
|
|
106
|
-
paths: {
|
|
107
|
-
...subjectPaths,
|
|
108
|
-
output: nestedOutput,
|
|
109
|
-
result: resultPath,
|
|
110
|
-
},
|
|
111
|
-
}, null, 2)}\n`);
|
|
112
|
-
await execFileAsync("sh", ["-c", subject.command], {
|
|
113
|
-
cwd: context.paths.cwd ?? context.paths.workspace,
|
|
114
|
-
env: {
|
|
115
|
-
...process.env,
|
|
116
|
-
WORKBENCH_ADAPTER_REQUEST: requestPath,
|
|
117
|
-
WORKBENCH_OUTPUT: nestedOutput,
|
|
118
|
-
WORKBENCH_RESULT: resultPath,
|
|
119
|
-
},
|
|
120
|
-
maxBuffer: 10 * 1024 * 1024,
|
|
121
|
-
});
|
|
122
|
-
const result = await readWorkbenchAdapterOperationResult(nestedOutput, "subject.run");
|
|
123
|
-
assertWorkbenchAdapterOperationResultOk(result, `Subject adapter ${subject.use} subject.run`);
|
|
124
|
-
return result;
|
|
125
|
-
}
|
|
126
|
-
function safeInternalPathSegment(value) {
|
|
127
|
-
const safe = value.replace(/[^a-z0-9._-]+/giu, "_").replace(/^_+|_+$/gu, "");
|
|
128
|
-
return safe || "subject";
|
|
129
|
-
}
|
|
130
|
-
function adapterScopedAuth(auth, adapterId) {
|
|
131
|
-
if (!auth || typeof auth !== "object" || Array.isArray(auth)) {
|
|
132
|
-
return auth;
|
|
133
|
-
}
|
|
134
|
-
const record = cloneJson(auth);
|
|
135
|
-
const adapters = record.adapters;
|
|
136
|
-
if (adapters && typeof adapters === "object" && !Array.isArray(adapters)) {
|
|
137
|
-
const scoped = adapters[adapterId];
|
|
138
|
-
if (scoped !== undefined) {
|
|
139
|
-
record.self = scoped;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
return record;
|
|
143
|
-
}
|
|
144
75
|
export function operationDefinitionForRequest(definition, operation) {
|
|
145
76
|
if (operation === "engine.resolve") {
|
|
146
77
|
return definition.engineResolve;
|
|
@@ -179,6 +110,7 @@ function addOperation(operations, adapterId, operation, definition) {
|
|
|
179
110
|
}
|
|
180
111
|
operations[operation] = {
|
|
181
112
|
command: definition.command ?? adapterCommandName(adapterId),
|
|
113
|
+
executor: definition.executor ?? "sandbox",
|
|
182
114
|
};
|
|
183
115
|
}
|
|
184
116
|
function cloneJson(value) {
|
|
@@ -9,8 +9,10 @@ export interface WorkbenchAdapterManifest {
|
|
|
9
9
|
}
|
|
10
10
|
export type WorkbenchPrimitiveAdapterOperation = "engine.resolve" | "engine.run" | "subject.run" | "optimizer.improve";
|
|
11
11
|
export type WorkbenchAdapterOperation = WorkbenchPrimitiveAdapterOperation;
|
|
12
|
+
export type WorkbenchAdapterOperationExecutor = "sandbox" | "host";
|
|
12
13
|
export interface WorkbenchAdapterOperationManifest {
|
|
13
14
|
command: string;
|
|
15
|
+
executor?: WorkbenchAdapterOperationExecutor;
|
|
14
16
|
}
|
|
15
17
|
export interface WorkbenchAdapterSlotManifest {
|
|
16
18
|
path: string;
|
|
@@ -52,6 +54,7 @@ export interface WorkbenchAdapterOperationRequirement {
|
|
|
52
54
|
export declare function adapterCommandName(adapterId: string): string;
|
|
53
55
|
export declare function workbenchAdapterManifestSupportsOperation(manifest: WorkbenchAdapterManifest, operation: WorkbenchAdapterOperation): boolean;
|
|
54
56
|
export declare function workbenchAdapterOperationCommand(manifest: WorkbenchAdapterManifest, operation: WorkbenchAdapterOperation): string;
|
|
57
|
+
export declare function workbenchAdapterOperationExecutor(manifest: WorkbenchAdapterManifest, operation: WorkbenchAdapterOperation): WorkbenchAdapterOperationExecutor;
|
|
55
58
|
export declare function cloneWorkbenchAdapterManifest(manifest: WorkbenchAdapterManifest): WorkbenchAdapterManifest;
|
|
56
59
|
export declare function parseWorkbenchAdapterManifest(source: string, label?: string): WorkbenchAdapterManifest;
|
|
57
60
|
export declare function workbenchAdapterManifestRequiresAuth(manifest: WorkbenchAdapterManifest): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter-manifest.d.ts","sourceRoot":"","sources":["../src/adapter-manifest.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mCAAmC,yBAAyB,CAAC;AAE1E,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,OAAO,mCAAmC,CAAC;IACrD,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,yBAAyB,EAAE,iCAAiC,CAAC,CAAC,CAAC;IAC1F,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,4BAA4B,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC;CACtD;AAED,MAAM,MAAM,kCAAkC,GAC1C,gBAAgB,GAChB,YAAY,GACZ,aAAa,GACb,mBAAmB,CAAC;AAExB,MAAM,MAAM,yBAAyB,GAAG,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter-manifest.d.ts","sourceRoot":"","sources":["../src/adapter-manifest.ts"],"names":[],"mappings":"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"}
|
package/dist/adapter-manifest.js
CHANGED
|
@@ -14,6 +14,14 @@ export function workbenchAdapterOperationCommand(manifest, operation) {
|
|
|
14
14
|
}
|
|
15
15
|
return operationManifest.command;
|
|
16
16
|
}
|
|
17
|
+
export function workbenchAdapterOperationExecutor(manifest, operation) {
|
|
18
|
+
const normalizedOperation = normalizeWorkbenchAdapterOperation(operation, "adapter operation");
|
|
19
|
+
const operationManifest = manifest.operations[normalizedOperation];
|
|
20
|
+
if (!operationManifest) {
|
|
21
|
+
throw new Error(`Adapter ${manifest.id} does not implement ${normalizedOperation}.`);
|
|
22
|
+
}
|
|
23
|
+
return operationManifest.executor ?? "sandbox";
|
|
24
|
+
}
|
|
17
25
|
export function cloneWorkbenchAdapterManifest(manifest) {
|
|
18
26
|
return {
|
|
19
27
|
...manifest,
|
|
@@ -62,7 +70,7 @@ function readAdapterOperations(value, label, adapterId) {
|
|
|
62
70
|
throw new Error(`${label}.${operation} must be an object.`);
|
|
63
71
|
}
|
|
64
72
|
const config = rawConfig;
|
|
65
|
-
rejectUnknownManifestKeys(config, `${label}.${operation}`, ["command"]);
|
|
73
|
+
rejectUnknownManifestKeys(config, `${label}.${operation}`, ["command", "executor"]);
|
|
66
74
|
if (operations[normalizedOperation]) {
|
|
67
75
|
throw new Error(`${label} declares ${normalizedOperation} more than once.`);
|
|
68
76
|
}
|
|
@@ -70,6 +78,7 @@ function readAdapterOperations(value, label, adapterId) {
|
|
|
70
78
|
command: config.command === undefined
|
|
71
79
|
? adapterCommandName(adapterId)
|
|
72
80
|
: readNonEmptyString(config.command, `${label}.${operation}.command`),
|
|
81
|
+
executor: readOperationExecutor(config.executor, `${label}.${operation}.executor`),
|
|
73
82
|
};
|
|
74
83
|
}
|
|
75
84
|
if (Object.keys(operations).length === 0) {
|
|
@@ -77,6 +86,15 @@ function readAdapterOperations(value, label, adapterId) {
|
|
|
77
86
|
}
|
|
78
87
|
return operations;
|
|
79
88
|
}
|
|
89
|
+
function readOperationExecutor(value, label) {
|
|
90
|
+
if (value === undefined) {
|
|
91
|
+
return "sandbox";
|
|
92
|
+
}
|
|
93
|
+
if (value === "sandbox" || value === "host") {
|
|
94
|
+
return value;
|
|
95
|
+
}
|
|
96
|
+
throw new Error(`${label} must be sandbox or host.`);
|
|
97
|
+
}
|
|
80
98
|
function readAdapterSlots(value, label) {
|
|
81
99
|
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
82
100
|
throw new Error(`${label} must be an object.`);
|
|
@@ -23,6 +23,9 @@ export interface WorkbenchAdapterOperationRequest {
|
|
|
23
23
|
subject?: {
|
|
24
24
|
id?: string;
|
|
25
25
|
path?: string;
|
|
26
|
+
prepare?: {
|
|
27
|
+
command: string;
|
|
28
|
+
};
|
|
26
29
|
run?: {
|
|
27
30
|
use: string;
|
|
28
31
|
with?: Json;
|
|
@@ -49,10 +52,8 @@ export interface WorkbenchAdapterOperationRequest {
|
|
|
49
52
|
result: string;
|
|
50
53
|
case?: string;
|
|
51
54
|
traces?: string;
|
|
52
|
-
cwd?: string;
|
|
53
55
|
subject?: string;
|
|
54
56
|
enginePrivate?: string;
|
|
55
|
-
logs?: string;
|
|
56
57
|
};
|
|
57
58
|
}
|
|
58
59
|
export type WorkbenchAdapterOperationResultValue = WorkbenchEngineResolveResult | WorkbenchResult | WorkbenchSubjectPatch | Json | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter-protocol.d.ts","sourceRoot":"","sources":["../src/adapter-protocol.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,IAAI,EACJ,YAAY,EACZ,eAAe,EACf,qBAAqB,EACtB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAEL,KAAK,4BAA4B,EAClC,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EACV,yBAAyB,EAC1B,MAAM,uBAAuB,CAAC;AAK/B,eAAO,MAAM,0BAA0B,yBAAyB,CAAC;AACjE,eAAO,MAAM,iCAAiC,gCAAgC,CAAC;AAC/E,eAAO,MAAM,6BAA6B,0BAA0B,CAAC;AAErE,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,EAAE,OAAO,0BAA0B,CAAC;IAC5C,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,yBAAyB,CAAC;IACrC,UAAU,EAAE;QACV,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,CAAC,EAAE,IAAI,CAAC;QACZ,IAAI,CAAC,EAAE,IAAI,CAAC;KACb,CAAC;IACF,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE;YACV,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,WAAW,CAAC,EAAE,MAAM,CAAC;SACtB,CAAC;QACF,OAAO,CAAC,EAAE;YACR,EAAE,CAAC,EAAE,MAAM,CAAC;YACZ,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,GAAG,CAAC,EAAE;gBACJ,GAAG,EAAE,MAAM,CAAC;gBACZ,IAAI,CAAC,EAAE,IAAI,CAAC;gBACZ,IAAI,CAAC,EAAE,IAAI,CAAC;gBACZ,OAAO,CAAC,EAAE,MAAM,CAAC;aAClB,CAAC;SACH,CAAC;QACF,SAAS,CAAC,EAAE;YACV,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;SAClB,CAAC;QACF,OAAO,CAAC,EAAE;YACR,YAAY,CAAC,EAAE,MAAM,CAAC;YACtB,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,MAAM,CAAC,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,IAAI,CAAC,EAAE;YACL,EAAE,CAAC,EAAE,MAAM,CAAC;YACZ,MAAM,CAAC,EAAE,MAAM,CAAC;SACjB,CAAC;KACH,CAAC;IACF,KAAK,EAAE;QACL,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,
|
|
1
|
+
{"version":3,"file":"adapter-protocol.d.ts","sourceRoot":"","sources":["../src/adapter-protocol.ts"],"names":[],"mappings":"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"}
|
package/dist/adapter-protocol.js
CHANGED
|
@@ -22,14 +22,12 @@ export function normalizeWorkbenchAdapterOperationRequest(value) {
|
|
|
22
22
|
const paths = requiredJsonRecord(record.paths, "adapter request paths");
|
|
23
23
|
rejectUnknownJsonKeys(paths, "adapter request paths", [
|
|
24
24
|
"workspace",
|
|
25
|
-
"cwd",
|
|
26
25
|
"output",
|
|
27
26
|
"result",
|
|
28
27
|
"subject",
|
|
29
28
|
"case",
|
|
30
29
|
"traces",
|
|
31
30
|
"enginePrivate",
|
|
32
|
-
"logs",
|
|
33
31
|
]);
|
|
34
32
|
const operation = requiredOperation(record.operation, "adapter request operation");
|
|
35
33
|
const use = requiredString(invocation.use, "adapter request invocation.use");
|
|
@@ -51,10 +49,8 @@ export function normalizeWorkbenchAdapterOperationRequest(value) {
|
|
|
51
49
|
result: requiredString(paths.result, "adapter request paths.result"),
|
|
52
50
|
...(typeof paths.case === "string" ? { case: paths.case } : {}),
|
|
53
51
|
...(typeof paths.traces === "string" ? { traces: paths.traces } : {}),
|
|
54
|
-
...(typeof paths.cwd === "string" ? { cwd: paths.cwd } : {}),
|
|
55
52
|
...(typeof paths.subject === "string" ? { subject: paths.subject } : {}),
|
|
56
53
|
...(typeof paths.enginePrivate === "string" ? { enginePrivate: paths.enginePrivate } : {}),
|
|
57
|
-
...(typeof paths.logs === "string" ? { logs: paths.logs } : {}),
|
|
58
54
|
},
|
|
59
55
|
};
|
|
60
56
|
}
|
|
@@ -141,9 +137,16 @@ function normalizeSubjectContext(value) {
|
|
|
141
137
|
return {
|
|
142
138
|
...(typeof record.id === "string" ? { id: record.id } : {}),
|
|
143
139
|
...(typeof record.path === "string" ? { path: record.path } : {}),
|
|
140
|
+
...(record.prepare !== undefined ? { prepare: normalizeSubjectPrepareContext(record.prepare) } : {}),
|
|
144
141
|
...(record.run !== undefined ? { run: normalizeContextInvocation(record.run, "adapter request context.subject.run") } : {}),
|
|
145
142
|
};
|
|
146
143
|
}
|
|
144
|
+
function normalizeSubjectPrepareContext(value) {
|
|
145
|
+
const record = requiredJsonRecord(value, "adapter request context.subject.prepare");
|
|
146
|
+
return {
|
|
147
|
+
command: requiredString(record.command, "adapter request context.subject.prepare.command"),
|
|
148
|
+
};
|
|
149
|
+
}
|
|
147
150
|
function normalizeContextInvocation(value, label) {
|
|
148
151
|
const record = requiredJsonRecord(value, label);
|
|
149
152
|
const use = requiredString(record.use, `${label}.use`);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type SurfaceSnapshotFile, type WorkbenchExecutionNetworkPolicy, type WorkbenchExecutionResources } from "@workbench-ai/workbench-contract";
|
|
2
2
|
export interface WorkbenchEngineCaseEnvironmentSpec {
|
|
3
3
|
dockerfile?: string;
|
|
4
4
|
workdir?: string;
|
|
@@ -11,8 +11,8 @@ export interface WorkbenchEngineCaseSpec {
|
|
|
11
11
|
environment?: WorkbenchEngineCaseEnvironmentSpec;
|
|
12
12
|
}
|
|
13
13
|
export interface WorkbenchEngineCaseFiles {
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
public?: SurfaceSnapshotFile[];
|
|
15
|
+
private?: SurfaceSnapshotFile[];
|
|
16
16
|
source?: SurfaceSnapshotFile[];
|
|
17
17
|
}
|
|
18
18
|
export interface WorkbenchEngineCase {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine-resolve-result.d.ts","sourceRoot":"","sources":["../src/engine-resolve-result.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"engine-resolve-result.d.ts","sourceRoot":"","sources":["../src/engine-resolve-result.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,+BAA+B,EACpC,KAAK,2BAA2B,EACjC,MAAM,kCAAkC,CAAC;AAE1C,MAAM,WAAW,kCAAkC;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC,2BAA2B,CAAC,CAAC;IACjD,OAAO,CAAC,EAAE,+BAA+B,CAAC;CAC3C;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,CAAC,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,kCAAkC,CAAC;CAClD;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAChC,MAAM,CAAC,EAAE,mBAAmB,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,uBAAuB,CAAC;IAC9B,KAAK,EAAE,wBAAwB,CAAC;CACjC;AAED,MAAM,WAAW,4BAA4B;IAC3C,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B,WAAW,CAAC,EAAE,kCAAkC,CAAC;CAClD;AAED,wBAAgB,qCAAqC,CACnD,KAAK,EAAE,OAAO,EACd,KAAK,SAA0B,GAC9B,4BAA4B,CAkB9B;AAED,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,GACZ,mBAAmB,CAWrB;AAED,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,GACZ,wBAAwB,CAc1B;AAED,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,GACZ,uBAAuB,CAezB"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
+
import { isWorkbenchExecutionNetworkEgress, } from "@workbench-ai/workbench-contract";
|
|
2
3
|
export function normalizeWorkbenchEngineResolveResult(value, label = "engine.resolve result") {
|
|
3
4
|
const record = requiredRecord(value, label);
|
|
4
5
|
if (!Array.isArray(record.cases)) {
|
|
@@ -30,13 +31,13 @@ export function normalizeWorkbenchEngineCase(value, label) {
|
|
|
30
31
|
}
|
|
31
32
|
export function normalizeWorkbenchEngineCaseFiles(value, label) {
|
|
32
33
|
const record = requiredRecord(value, label);
|
|
33
|
-
rejectUnknownKeys(record, label, ["
|
|
34
|
+
rejectUnknownKeys(record, label, ["public", "private", "source"]);
|
|
34
35
|
return {
|
|
35
|
-
...(record.
|
|
36
|
-
? {
|
|
36
|
+
...(record.public !== undefined
|
|
37
|
+
? { public: normalizeEngineResolveFiles(record.public, `${label}.public`) }
|
|
37
38
|
: {}),
|
|
38
|
-
...(record.
|
|
39
|
-
? {
|
|
39
|
+
...(record.private !== undefined
|
|
40
|
+
? { private: normalizeEngineResolveFiles(record.private, `${label}.private`) }
|
|
40
41
|
: {}),
|
|
41
42
|
...(record.source !== undefined
|
|
42
43
|
? { source: normalizeEngineResolveFiles(record.source, `${label}.source`) }
|
|
@@ -89,16 +90,12 @@ function normalizeCaseResources(value, label) {
|
|
|
89
90
|
}
|
|
90
91
|
function normalizeNetworkPolicy(value, label) {
|
|
91
92
|
const record = requiredRecord(value, label);
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
throw new Error(`${label}.egress must be none, allowlist, or open.`);
|
|
93
|
+
rejectUnknownKeys(record, label, ["egress"]);
|
|
94
|
+
if (!isWorkbenchExecutionNetworkEgress(record.egress)) {
|
|
95
|
+
throw new Error(`${label}.egress must be none or open.`);
|
|
96
96
|
}
|
|
97
97
|
return {
|
|
98
98
|
egress: record.egress,
|
|
99
|
-
...(Array.isArray(record.allow)
|
|
100
|
-
? { allow: record.allow.filter((entry) => typeof entry === "string") }
|
|
101
|
-
: {}),
|
|
102
99
|
};
|
|
103
100
|
}
|
|
104
101
|
function normalizeEngineResolveFiles(value, label) {
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
export { WORKBENCH_ADAPTER_MANIFEST_PROTOCOL, adapterCommandName, assertWorkbenchAdapterOperationSupport, cloneWorkbenchAdapterManifest, collectWorkbenchAdapterAuthRequirements, collectWorkbenchAdapterInvocations, collectWorkbenchAdapterOperationIssues, collectWorkbenchAdapterOperationRequirements, parseWorkbenchAdapterManifest, normalizeWorkbenchAdapterOperation, workbenchAdapterManifestSupportsOperation, workbenchAdapterOperationCommand, workbenchAdapterManifestRequiresAuth, withDefaultWorkbenchAdapterAuth, withDefaultWorkbenchAdapterAuthProfiles, type WorkbenchPrimitiveAdapterOperation, type WorkbenchAdapterOperation, type WorkbenchAdapterOperationManifest, type WorkbenchAdapterSlotManifest, type WorkbenchAdapterAuthEnvManifest, type WorkbenchAdapterAuthFileManifest, type WorkbenchAdapterAuthManifest, type WorkbenchAdapterAuthMethodManifest, type WorkbenchAdapterAuthRequirement, type WorkbenchAdapterInvocationLike, type WorkbenchAdapterManifest, type WorkbenchAdapterOperationRequirement, } from "./adapter-manifest.ts";
|
|
1
|
+
export { WORKBENCH_ADAPTER_MANIFEST_PROTOCOL, adapterCommandName, assertWorkbenchAdapterOperationSupport, cloneWorkbenchAdapterManifest, collectWorkbenchAdapterAuthRequirements, collectWorkbenchAdapterInvocations, collectWorkbenchAdapterOperationIssues, collectWorkbenchAdapterOperationRequirements, parseWorkbenchAdapterManifest, normalizeWorkbenchAdapterOperation, workbenchAdapterManifestSupportsOperation, workbenchAdapterOperationCommand, workbenchAdapterOperationExecutor, workbenchAdapterManifestRequiresAuth, withDefaultWorkbenchAdapterAuth, withDefaultWorkbenchAdapterAuthProfiles, type WorkbenchPrimitiveAdapterOperation, type WorkbenchAdapterOperation, type WorkbenchAdapterOperationExecutor, type WorkbenchAdapterOperationManifest, type WorkbenchAdapterSlotManifest, type WorkbenchAdapterAuthEnvManifest, type WorkbenchAdapterAuthFileManifest, type WorkbenchAdapterAuthManifest, type WorkbenchAdapterAuthMethodManifest, type WorkbenchAdapterAuthRequirement, type WorkbenchAdapterInvocationLike, type WorkbenchAdapterManifest, type WorkbenchAdapterOperationRequirement, } from "./adapter-manifest.ts";
|
|
2
2
|
export { WORKBENCH_ADAPTER_PROTOCOL, WORKBENCH_ADAPTER_RESULT_FILE, WORKBENCH_ADAPTER_RESULT_PROTOCOL, assertWorkbenchAdapterOperationResultOk, ensureWorkbenchAdapterOutputDir, normalizeWorkbenchAdapterOperationRequest, normalizeWorkbenchAdapterOperationResult, readWorkbenchAdapterOperationRequest, readWorkbenchAdapterOperationResult, workbenchAdapterOperationResultPath, writeWorkbenchAdapterOperationResult, type WorkbenchAdapterOperationRequest, type WorkbenchAdapterOperationResult, type WorkbenchAdapterOperationResultValue, } from "./adapter-protocol.ts";
|
|
3
3
|
export { normalizeWorkbenchEngineCase, normalizeWorkbenchEngineCaseFiles, normalizeWorkbenchEngineCaseSpec, normalizeWorkbenchEngineResolveResult, type WorkbenchEngineCase, type WorkbenchEngineCaseFiles, type WorkbenchEngineCaseEnvironmentSpec, type WorkbenchEngineCaseSpec, type WorkbenchEngineResolveResult, } from "./engine-resolve-result.ts";
|
|
4
|
-
export { adapterResult, adapterSlot, adapterSlotInvocation, defineAdapter, defineEngineResolver, defineSubject, defineEngineRunner, defineOptimizer, operationDefinitionForRequest,
|
|
4
|
+
export { adapterResult, adapterSlot, adapterSlotInvocation, defineAdapter, defineEngineResolver, defineSubject, defineEngineRunner, defineOptimizer, operationDefinitionForRequest, runDefinedAdapter, workbenchAdapterManifestFromDefinition, type WorkbenchAdapterDefinition, type WorkbenchAdapterHandlerContext, type WorkbenchAdapterHandlerReturn, type WorkbenchAdapterOperationDefinition, type WorkbenchAdapterOperationHandler, type RunDefinedWorkbenchAdapterOptions, } from "./adapter-definition.ts";
|
|
5
|
+
export { WORKBENCH_RUNTIME_CONTROL_TOKEN_ENV, WORKBENCH_RUNTIME_CONTROL_URL_ENV, runWorkbenchRuntimeOperationSequence, type RunWorkbenchRuntimeControlOptions, type WorkbenchRuntimeControlInvocation, type WorkbenchRuntimeControlOperation, type WorkbenchRuntimeControlOperationInputs, type WorkbenchRuntimeControlOperationSequenceRequest, type WorkbenchRuntimeControlOperationSequenceResult, } from "./runtime-control.ts";
|
|
5
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mCAAmC,EACnC,kBAAkB,EAClB,sCAAsC,EACtC,6BAA6B,EAC7B,uCAAuC,EACvC,kCAAkC,EAClC,sCAAsC,EACtC,4CAA4C,EAC5C,6BAA6B,EAC7B,kCAAkC,EAClC,yCAAyC,EACzC,gCAAgC,EAChC,oCAAoC,EACpC,+BAA+B,EAC/B,uCAAuC,EACvC,KAAK,kCAAkC,EACvC,KAAK,yBAAyB,EAC9B,KAAK,iCAAiC,EACtC,KAAK,4BAA4B,EACjC,KAAK,+BAA+B,EACpC,KAAK,gCAAgC,EACrC,KAAK,4BAA4B,EACjC,KAAK,kCAAkC,EACvC,KAAK,+BAA+B,EACpC,KAAK,8BAA8B,EACnC,KAAK,wBAAwB,EAC7B,KAAK,oCAAoC,GAC1C,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,0BAA0B,EAC1B,6BAA6B,EAC7B,iCAAiC,EACjC,uCAAuC,EACvC,+BAA+B,EAC/B,yCAAyC,EACzC,wCAAwC,EACxC,oCAAoC,EACpC,mCAAmC,EACnC,mCAAmC,EACnC,oCAAoC,EACpC,KAAK,gCAAgC,EACrC,KAAK,+BAA+B,EACpC,KAAK,oCAAoC,GAC1C,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,4BAA4B,EAC5B,iCAAiC,EACjC,gCAAgC,EAChC,qCAAqC,EACrC,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,kCAAkC,EACvC,KAAK,uBAAuB,EAC5B,KAAK,4BAA4B,GAClC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,aAAa,EACb,WAAW,EACX,qBAAqB,EACrB,aAAa,EACb,oBAAoB,EACpB,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,6BAA6B,EAC7B,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mCAAmC,EACnC,kBAAkB,EAClB,sCAAsC,EACtC,6BAA6B,EAC7B,uCAAuC,EACvC,kCAAkC,EAClC,sCAAsC,EACtC,4CAA4C,EAC5C,6BAA6B,EAC7B,kCAAkC,EAClC,yCAAyC,EACzC,gCAAgC,EAChC,iCAAiC,EACjC,oCAAoC,EACpC,+BAA+B,EAC/B,uCAAuC,EACvC,KAAK,kCAAkC,EACvC,KAAK,yBAAyB,EAC9B,KAAK,iCAAiC,EACtC,KAAK,iCAAiC,EACtC,KAAK,4BAA4B,EACjC,KAAK,+BAA+B,EACpC,KAAK,gCAAgC,EACrC,KAAK,4BAA4B,EACjC,KAAK,kCAAkC,EACvC,KAAK,+BAA+B,EACpC,KAAK,8BAA8B,EACnC,KAAK,wBAAwB,EAC7B,KAAK,oCAAoC,GAC1C,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,0BAA0B,EAC1B,6BAA6B,EAC7B,iCAAiC,EACjC,uCAAuC,EACvC,+BAA+B,EAC/B,yCAAyC,EACzC,wCAAwC,EACxC,oCAAoC,EACpC,mCAAmC,EACnC,mCAAmC,EACnC,oCAAoC,EACpC,KAAK,gCAAgC,EACrC,KAAK,+BAA+B,EACpC,KAAK,oCAAoC,GAC1C,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,4BAA4B,EAC5B,iCAAiC,EACjC,gCAAgC,EAChC,qCAAqC,EACrC,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,kCAAkC,EACvC,KAAK,uBAAuB,EAC5B,KAAK,4BAA4B,GAClC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,aAAa,EACb,WAAW,EACX,qBAAqB,EACrB,aAAa,EACb,oBAAoB,EACpB,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,6BAA6B,EAC7B,iBAAiB,EACjB,sCAAsC,EACtC,KAAK,0BAA0B,EAC/B,KAAK,8BAA8B,EACnC,KAAK,6BAA6B,EAClC,KAAK,mCAAmC,EACxC,KAAK,gCAAgC,EACrC,KAAK,iCAAiC,GACvC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,mCAAmC,EACnC,iCAAiC,EACjC,oCAAoC,EACpC,KAAK,iCAAiC,EACtC,KAAK,iCAAiC,EACtC,KAAK,gCAAgC,EACrC,KAAK,sCAAsC,EAC3C,KAAK,+CAA+C,EACpD,KAAK,8CAA8C,GACpD,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export { WORKBENCH_ADAPTER_MANIFEST_PROTOCOL, adapterCommandName, assertWorkbenchAdapterOperationSupport, cloneWorkbenchAdapterManifest, collectWorkbenchAdapterAuthRequirements, collectWorkbenchAdapterInvocations, collectWorkbenchAdapterOperationIssues, collectWorkbenchAdapterOperationRequirements, parseWorkbenchAdapterManifest, normalizeWorkbenchAdapterOperation, workbenchAdapterManifestSupportsOperation, workbenchAdapterOperationCommand, workbenchAdapterManifestRequiresAuth, withDefaultWorkbenchAdapterAuth, withDefaultWorkbenchAdapterAuthProfiles, } from "./adapter-manifest.js";
|
|
1
|
+
export { WORKBENCH_ADAPTER_MANIFEST_PROTOCOL, adapterCommandName, assertWorkbenchAdapterOperationSupport, cloneWorkbenchAdapterManifest, collectWorkbenchAdapterAuthRequirements, collectWorkbenchAdapterInvocations, collectWorkbenchAdapterOperationIssues, collectWorkbenchAdapterOperationRequirements, parseWorkbenchAdapterManifest, normalizeWorkbenchAdapterOperation, workbenchAdapterManifestSupportsOperation, workbenchAdapterOperationCommand, workbenchAdapterOperationExecutor, workbenchAdapterManifestRequiresAuth, withDefaultWorkbenchAdapterAuth, withDefaultWorkbenchAdapterAuthProfiles, } from "./adapter-manifest.js";
|
|
2
2
|
export { WORKBENCH_ADAPTER_PROTOCOL, WORKBENCH_ADAPTER_RESULT_FILE, WORKBENCH_ADAPTER_RESULT_PROTOCOL, assertWorkbenchAdapterOperationResultOk, ensureWorkbenchAdapterOutputDir, normalizeWorkbenchAdapterOperationRequest, normalizeWorkbenchAdapterOperationResult, readWorkbenchAdapterOperationRequest, readWorkbenchAdapterOperationResult, workbenchAdapterOperationResultPath, writeWorkbenchAdapterOperationResult, } from "./adapter-protocol.js";
|
|
3
3
|
export { normalizeWorkbenchEngineCase, normalizeWorkbenchEngineCaseFiles, normalizeWorkbenchEngineCaseSpec, normalizeWorkbenchEngineResolveResult, } from "./engine-resolve-result.js";
|
|
4
|
-
export { adapterResult, adapterSlot, adapterSlotInvocation, defineAdapter, defineEngineResolver, defineSubject, defineEngineRunner, defineOptimizer, operationDefinitionForRequest,
|
|
4
|
+
export { adapterResult, adapterSlot, adapterSlotInvocation, defineAdapter, defineEngineResolver, defineSubject, defineEngineRunner, defineOptimizer, operationDefinitionForRequest, runDefinedAdapter, workbenchAdapterManifestFromDefinition, } from "./adapter-definition.js";
|
|
5
|
+
export { WORKBENCH_RUNTIME_CONTROL_TOKEN_ENV, WORKBENCH_RUNTIME_CONTROL_URL_ENV, runWorkbenchRuntimeOperationSequence, } from "./runtime-control.js";
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { Json, SurfaceSnapshotFile, UsageSummary, WorkbenchResult } from "@workbench-ai/workbench-contract";
|
|
2
|
+
import type { WorkbenchAdapterOperation } from "./adapter-manifest.ts";
|
|
3
|
+
import type { WorkbenchAdapterOperationResult } from "./adapter-protocol.ts";
|
|
4
|
+
export declare const WORKBENCH_RUNTIME_CONTROL_URL_ENV = "WORKBENCH_RUNTIME_CONTROL_URL";
|
|
5
|
+
export declare const WORKBENCH_RUNTIME_CONTROL_TOKEN_ENV = "WORKBENCH_RUNTIME_CONTROL_TOKEN";
|
|
6
|
+
export interface WorkbenchRuntimeControlInvocation {
|
|
7
|
+
use: string;
|
|
8
|
+
with?: Json;
|
|
9
|
+
auth?: Json;
|
|
10
|
+
command?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface WorkbenchRuntimeControlOperation {
|
|
13
|
+
operation: WorkbenchAdapterOperation;
|
|
14
|
+
invocation: WorkbenchRuntimeControlInvocation;
|
|
15
|
+
label?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface WorkbenchRuntimeControlOperationInputs {
|
|
18
|
+
subject?: readonly SurfaceSnapshotFile[];
|
|
19
|
+
case?: readonly SurfaceSnapshotFile[];
|
|
20
|
+
enginePrivate?: readonly SurfaceSnapshotFile[];
|
|
21
|
+
traces?: readonly SurfaceSnapshotFile[];
|
|
22
|
+
workspace?: readonly SurfaceSnapshotFile[];
|
|
23
|
+
output?: readonly SurfaceSnapshotFile[];
|
|
24
|
+
}
|
|
25
|
+
export interface WorkbenchRuntimeControlOperationSequenceRequest {
|
|
26
|
+
inputs?: WorkbenchRuntimeControlOperationInputs;
|
|
27
|
+
operations: readonly WorkbenchRuntimeControlOperation[];
|
|
28
|
+
prepare?: boolean;
|
|
29
|
+
collectWorkspace?: boolean;
|
|
30
|
+
}
|
|
31
|
+
export interface WorkbenchRuntimeControlOperationSequenceResult {
|
|
32
|
+
ok: boolean;
|
|
33
|
+
files: SurfaceSnapshotFile[];
|
|
34
|
+
fileChanges: string[];
|
|
35
|
+
operationResults: WorkbenchAdapterOperationResult[];
|
|
36
|
+
workspaceFiles?: SurfaceSnapshotFile[];
|
|
37
|
+
result?: WorkbenchResult;
|
|
38
|
+
usage?: UsageSummary;
|
|
39
|
+
summary?: string;
|
|
40
|
+
feedback?: Json;
|
|
41
|
+
error?: string;
|
|
42
|
+
}
|
|
43
|
+
export interface RunWorkbenchRuntimeControlOptions {
|
|
44
|
+
url?: string;
|
|
45
|
+
token?: string;
|
|
46
|
+
fetch?: typeof fetch;
|
|
47
|
+
}
|
|
48
|
+
export declare function runWorkbenchRuntimeOperationSequence(request: WorkbenchRuntimeControlOperationSequenceRequest, options?: RunWorkbenchRuntimeControlOptions): Promise<WorkbenchRuntimeControlOperationSequenceResult>;
|
|
49
|
+
//# sourceMappingURL=runtime-control.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-control.d.ts","sourceRoot":"","sources":["../src/runtime-control.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,IAAI,EACJ,mBAAmB,EACnB,YAAY,EACZ,eAAe,EAChB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,KAAK,EACV,yBAAyB,EAC1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EACV,+BAA+B,EAChC,MAAM,uBAAuB,CAAC;AAE/B,eAAO,MAAM,iCAAiC,kCAAkC,CAAC;AACjF,eAAO,MAAM,mCAAmC,oCAAoC,CAAC;AAErF,MAAM,WAAW,iCAAiC;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gCAAgC;IAC/C,SAAS,EAAE,yBAAyB,CAAC;IACrC,UAAU,EAAE,iCAAiC,CAAC;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sCAAsC;IACrD,OAAO,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACzC,IAAI,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACtC,aAAa,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAC/C,MAAM,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACxC,SAAS,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAC3C,MAAM,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,+CAA+C;IAC9D,MAAM,CAAC,EAAE,sCAAsC,CAAC;IAChD,UAAU,EAAE,SAAS,gCAAgC,EAAE,CAAC;IACxD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,8CAA8C;IAC7D,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,gBAAgB,EAAE,+BAA+B,EAAE,CAAC;IACpD,cAAc,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACvC,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,IAAI,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iCAAiC;IAChD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED,wBAAsB,oCAAoC,CACxD,OAAO,EAAE,+CAA+C,EACxD,OAAO,GAAE,iCAAsC,GAC9C,OAAO,CAAC,8CAA8C,CAAC,CAgBzD"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import http from "node:http";
|
|
2
|
+
import https from "node:https";
|
|
3
|
+
export const WORKBENCH_RUNTIME_CONTROL_URL_ENV = "WORKBENCH_RUNTIME_CONTROL_URL";
|
|
4
|
+
export const WORKBENCH_RUNTIME_CONTROL_TOKEN_ENV = "WORKBENCH_RUNTIME_CONTROL_TOKEN";
|
|
5
|
+
export async function runWorkbenchRuntimeOperationSequence(request, options = {}) {
|
|
6
|
+
const url = (options.url ?? process.env[WORKBENCH_RUNTIME_CONTROL_URL_ENV] ?? "").trim();
|
|
7
|
+
const token = (options.token ?? process.env[WORKBENCH_RUNTIME_CONTROL_TOKEN_ENV] ?? "").trim();
|
|
8
|
+
if (!url || !token) {
|
|
9
|
+
throw new Error("Workbench runtime-control is unavailable for this adapter operation.");
|
|
10
|
+
}
|
|
11
|
+
const fetchImpl = options.fetch ?? fetch;
|
|
12
|
+
const endpoint = new URL("/v1/operation-sequence", url);
|
|
13
|
+
const response = options.fetch
|
|
14
|
+
? await postRuntimeControlJsonWithFetch(fetchImpl, endpoint, token, request)
|
|
15
|
+
: await postRuntimeControlJson(endpoint, token, request);
|
|
16
|
+
if (response.status < 200 || response.status >= 300) {
|
|
17
|
+
const message = readResponseError(response.payload) ?? `Workbench runtime-control request failed with status ${response.status}.`;
|
|
18
|
+
throw new Error(message);
|
|
19
|
+
}
|
|
20
|
+
return normalizeRuntimeControlOperationSequenceResult(response.payload);
|
|
21
|
+
}
|
|
22
|
+
async function postRuntimeControlJsonWithFetch(fetchImpl, url, token, request) {
|
|
23
|
+
const response = await fetchImpl(url, {
|
|
24
|
+
method: "POST",
|
|
25
|
+
headers: {
|
|
26
|
+
"authorization": `Bearer ${token}`,
|
|
27
|
+
"content-type": "application/json",
|
|
28
|
+
},
|
|
29
|
+
body: JSON.stringify(request),
|
|
30
|
+
});
|
|
31
|
+
return {
|
|
32
|
+
status: response.status,
|
|
33
|
+
payload: await response.json().catch(() => null),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
async function postRuntimeControlJson(url, token, request) {
|
|
37
|
+
const body = JSON.stringify(request);
|
|
38
|
+
const client = url.protocol === "https:" ? https : http;
|
|
39
|
+
return await new Promise((resolve, reject) => {
|
|
40
|
+
const outgoing = client.request(url, {
|
|
41
|
+
method: "POST",
|
|
42
|
+
headers: {
|
|
43
|
+
"authorization": `Bearer ${token}`,
|
|
44
|
+
"content-type": "application/json",
|
|
45
|
+
"content-length": Buffer.byteLength(body),
|
|
46
|
+
},
|
|
47
|
+
}, (incoming) => {
|
|
48
|
+
const chunks = [];
|
|
49
|
+
incoming.on("data", (chunk) => {
|
|
50
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
51
|
+
});
|
|
52
|
+
incoming.on("end", () => {
|
|
53
|
+
const text = Buffer.concat(chunks).toString("utf8");
|
|
54
|
+
let payload = null;
|
|
55
|
+
try {
|
|
56
|
+
payload = text ? JSON.parse(text) : null;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
payload = null;
|
|
60
|
+
}
|
|
61
|
+
resolve({
|
|
62
|
+
status: incoming.statusCode ?? 0,
|
|
63
|
+
payload,
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
outgoing.on("error", reject);
|
|
68
|
+
outgoing.setTimeout(0);
|
|
69
|
+
outgoing.end(body);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
function normalizeRuntimeControlOperationSequenceResult(value) {
|
|
73
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
74
|
+
throw new Error("Workbench runtime-control response must be an object.");
|
|
75
|
+
}
|
|
76
|
+
const record = value;
|
|
77
|
+
const files = Array.isArray(record.files)
|
|
78
|
+
? record.files.filter(isSurfaceSnapshotFile)
|
|
79
|
+
: [];
|
|
80
|
+
const fileChanges = Array.isArray(record.fileChanges)
|
|
81
|
+
? record.fileChanges.filter((entry) => typeof entry === "string")
|
|
82
|
+
: files.map((file) => file.path);
|
|
83
|
+
const operationResults = Array.isArray(record.operationResults)
|
|
84
|
+
? record.operationResults.filter(isWorkbenchAdapterOperationResult)
|
|
85
|
+
: [];
|
|
86
|
+
const workspaceFiles = Array.isArray(record.workspaceFiles)
|
|
87
|
+
? record.workspaceFiles.filter(isSurfaceSnapshotFile)
|
|
88
|
+
: undefined;
|
|
89
|
+
return {
|
|
90
|
+
ok: record.ok !== false,
|
|
91
|
+
files,
|
|
92
|
+
fileChanges,
|
|
93
|
+
operationResults,
|
|
94
|
+
...(workspaceFiles ? { workspaceFiles } : {}),
|
|
95
|
+
...(isJsonRecord(record.result) ? { result: record.result } : {}),
|
|
96
|
+
...(isJsonRecord(record.usage) ? { usage: record.usage } : {}),
|
|
97
|
+
...(typeof record.summary === "string" ? { summary: record.summary } : {}),
|
|
98
|
+
...(record.feedback !== undefined && isJson(record.feedback) ? { feedback: record.feedback } : {}),
|
|
99
|
+
...(typeof record.error === "string" ? { error: record.error } : {}),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function readResponseError(value) {
|
|
103
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
const error = value.error;
|
|
107
|
+
return typeof error === "string" && error.trim() ? error : null;
|
|
108
|
+
}
|
|
109
|
+
function isWorkbenchAdapterOperationResult(value) {
|
|
110
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
const record = value;
|
|
114
|
+
return record.protocol === "workbench.adapter-result.v1" &&
|
|
115
|
+
typeof record.operation === "string";
|
|
116
|
+
}
|
|
117
|
+
function isSurfaceSnapshotFile(value) {
|
|
118
|
+
return Boolean(value &&
|
|
119
|
+
typeof value === "object" &&
|
|
120
|
+
!Array.isArray(value) &&
|
|
121
|
+
typeof value.path === "string" &&
|
|
122
|
+
(value.kind === "text" || value.kind === "binary") &&
|
|
123
|
+
(value.encoding === "utf8" || value.encoding === "base64") &&
|
|
124
|
+
typeof value.content === "string" &&
|
|
125
|
+
typeof value.executable === "boolean");
|
|
126
|
+
}
|
|
127
|
+
function isJsonRecord(value) {
|
|
128
|
+
return !!value && typeof value === "object" && !Array.isArray(value) && isJson(value);
|
|
129
|
+
}
|
|
130
|
+
function isJson(value) {
|
|
131
|
+
if (value === null || typeof value === "string" || typeof value === "boolean") {
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
if (typeof value === "number") {
|
|
135
|
+
return Number.isFinite(value);
|
|
136
|
+
}
|
|
137
|
+
if (Array.isArray(value)) {
|
|
138
|
+
return value.every(isJson);
|
|
139
|
+
}
|
|
140
|
+
if (value && typeof value === "object") {
|
|
141
|
+
return Object.values(value).every(isJson);
|
|
142
|
+
}
|
|
143
|
+
return false;
|
|
144
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@workbench-ai/workbench-protocol",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.47",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
],
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"yaml": "^2.8.2",
|
|
23
|
-
"@workbench-ai/workbench-contract": "0.0.
|
|
23
|
+
"@workbench-ai/workbench-contract": "0.0.47"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@types/node": "^24.3.1",
|