@the-open-engine/zeroshot 6.45.0 → 6.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -144,6 +144,9 @@ export type DataSelector = {
144
144
  readonly "path": ReadonlyArray<string>;
145
145
  readonly "source": "item";
146
146
  };
147
+ export type DeclaredConnections = {
148
+ readonly [key: string]: DeclaredEnvironment;
149
+ };
147
150
  export type DeclaredEnvironment = ReadonlyArray<string>;
148
151
  export type DeleteParams = {
149
152
  readonly "idempotencyKey": string;
@@ -663,13 +666,13 @@ export type NodeOutputSelector = {
663
666
  readonly "path": ReadonlyArray<string>;
664
667
  };
665
668
  export type NodeRuntimeBinding = ({
669
+ readonly "connections"?: DeclaredConnections;
666
670
  readonly "effort"?: ReasoningEffort | null;
667
- readonly "env"?: DeclaredEnvironment;
668
671
  readonly "kind": "agent";
669
672
  readonly "model": string;
670
673
  readonly "sessionScope"?: SessionScope;
671
674
  }) | {
672
- readonly "env"?: DeclaredEnvironment;
675
+ readonly "connections"?: DeclaredConnections;
673
676
  readonly "kind": "git_delivery";
674
677
  };
675
678
  export type NonEmptyVec_of_ChoiceBranch = ReadonlyArray<ChoiceBranch>;
@@ -812,7 +815,7 @@ export type RunLogsResult = {
812
815
  export type RunMetadata = {
813
816
  readonly "tokenUsage"?: TokenUsage | null;
814
817
  };
815
- export type RunSize = "tiny" | "small" | "standard" | "large";
818
+ export type RunSize = "small" | "medium" | "large";
816
819
  export type RunStatus = {
817
820
  readonly "phase": "admitted";
818
821
  } | {
@@ -144,6 +144,9 @@ export type DataSelector = {
144
144
  readonly "path": ReadonlyArray<string>;
145
145
  readonly "source": "item";
146
146
  };
147
+ export type DeclaredConnections = {
148
+ readonly [key: string]: DeclaredEnvironment;
149
+ };
147
150
  export type DeclaredEnvironment = ReadonlyArray<string>;
148
151
  export type DeleteParams = {
149
152
  readonly "idempotencyKey": string;
@@ -663,13 +666,13 @@ export type NodeOutputSelector = {
663
666
  readonly "path": ReadonlyArray<string>;
664
667
  };
665
668
  export type NodeRuntimeBinding = ({
669
+ readonly "connections"?: DeclaredConnections;
666
670
  readonly "effort"?: ReasoningEffort | null;
667
- readonly "env"?: DeclaredEnvironment;
668
671
  readonly "kind": "agent";
669
672
  readonly "model": string;
670
673
  readonly "sessionScope"?: SessionScope;
671
674
  }) | {
672
- readonly "env"?: DeclaredEnvironment;
675
+ readonly "connections"?: DeclaredConnections;
673
676
  readonly "kind": "git_delivery";
674
677
  };
675
678
  export type NonEmptyVec_of_ChoiceBranch = ReadonlyArray<ChoiceBranch>;
@@ -812,7 +815,7 @@ export type RunLogsResult = {
812
815
  export type RunMetadata = {
813
816
  readonly "tokenUsage"?: TokenUsage | null;
814
817
  };
815
- export type RunSize = "tiny" | "small" | "standard" | "large";
818
+ export type RunSize = "small" | "medium" | "large";
816
819
  export type RunStatus = {
817
820
  readonly "phase": "admitted";
818
821
  } | {
@@ -144,6 +144,9 @@ export type DataSelector = {
144
144
  readonly "path": ReadonlyArray<string>;
145
145
  readonly "source": "item";
146
146
  };
147
+ export type DeclaredConnections = {
148
+ readonly [key: string]: DeclaredEnvironment;
149
+ };
147
150
  export type DeclaredEnvironment = ReadonlyArray<string>;
148
151
  export type DeleteParams = {
149
152
  readonly "idempotencyKey": string;
@@ -663,13 +666,13 @@ export type NodeOutputSelector = {
663
666
  readonly "path": ReadonlyArray<string>;
664
667
  };
665
668
  export type NodeRuntimeBinding = ({
669
+ readonly "connections"?: DeclaredConnections;
666
670
  readonly "effort"?: ReasoningEffort | null;
667
- readonly "env"?: DeclaredEnvironment;
668
671
  readonly "kind": "agent";
669
672
  readonly "model": string;
670
673
  readonly "sessionScope"?: SessionScope;
671
674
  }) | {
672
- readonly "env"?: DeclaredEnvironment;
675
+ readonly "connections"?: DeclaredConnections;
673
676
  readonly "kind": "git_delivery";
674
677
  };
675
678
  export type NonEmptyVec_of_ChoiceBranch = ReadonlyArray<ChoiceBranch>;
@@ -812,7 +815,7 @@ export type RunLogsResult = {
812
815
  export type RunMetadata = {
813
816
  readonly "tokenUsage"?: TokenUsage | null;
814
817
  };
815
- export type RunSize = "tiny" | "small" | "standard" | "large";
818
+ export type RunSize = "small" | "medium" | "large";
816
819
  export type RunStatus = {
817
820
  readonly "phase": "admitted";
818
821
  } | {
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeInboundSubscriptionFrame = normalizeInboundSubscriptionFrame;
3
4
  exports.assertDefinition = assertDefinition;
4
5
  exports.assertMethodResult = assertMethodResult;
5
6
  exports.assertGraphSpec = assertGraphSpec;
@@ -9,6 +10,7 @@ const _2020_js_1 = require("ajv/dist/2020.js");
9
10
  const protocol_js_1 = require("./generated/protocol.cjs");
10
11
  const protocol_schema_js_1 = require("./generated/protocol-schema.cjs");
11
12
  const errors_js_1 = require("./errors.cjs");
13
+ const frames_js_1 = require("./frames.cjs");
12
14
  const ajv = new _2020_js_1.default({
13
15
  allErrors: true,
14
16
  strict: false,
@@ -26,6 +28,38 @@ function validatorFor(definition) {
26
28
  validators.set(definition, validator);
27
29
  return validator;
28
30
  }
31
+ const RUN_PROJECTION_DEFINITIONS = new Set([
32
+ 'RunForceResult',
33
+ 'RunStatusResult',
34
+ 'RunWatchEventNotification',
35
+ ]);
36
+ function normalizeRunProjection(value) {
37
+ if (!(0, frames_js_1.isRecord)(value))
38
+ return value;
39
+ const size = value.size === 'tiny'
40
+ ? 'small'
41
+ : value.size === 'standard'
42
+ ? 'medium'
43
+ : value.size;
44
+ return size === value.size ? value : { ...value, size };
45
+ }
46
+ /** Normalize deserialize-only aliases before validating an inbound protocol value. */
47
+ function normalizeInboundDefinition(definition, value) {
48
+ if (RUN_PROJECTION_DEFINITIONS.has(definition))
49
+ return normalizeRunProjection(value);
50
+ if (definition !== 'RunListResult' || !(0, frames_js_1.isRecord)(value))
51
+ return value;
52
+ const existingRuns = value.runs;
53
+ if (!Array.isArray(existingRuns))
54
+ return value;
55
+ const runs = existingRuns.map(normalizeRunProjection);
56
+ return runs.some((run, index) => run !== existingRuns[index]) ? { ...value, runs } : value;
57
+ }
58
+ function normalizeInboundSubscriptionFrame(kind, method, frame) {
59
+ if (kind !== 'run/watch' || method !== 'event' || !(0, frames_js_1.isRecord)(frame.params))
60
+ return frame;
61
+ return { ...frame, params: normalizeInboundDefinition('RunWatchEventNotification', frame.params) };
62
+ }
29
63
  function assertDefinition(definition, value) {
30
64
  const validate = validatorFor(definition);
31
65
  if (validate(value))
@@ -35,7 +69,10 @@ function assertDefinition(definition, value) {
35
69
  }
36
70
  function assertMethodResult(method, value) {
37
71
  try {
38
- assertDefinition(protocol_js_1.METHOD_RESULT_DEFINITIONS[method], value);
72
+ const definition = protocol_js_1.METHOD_RESULT_DEFINITIONS[method];
73
+ const normalized = normalizeInboundDefinition(definition, value);
74
+ assertDefinition(definition, normalized);
75
+ return normalized;
39
76
  }
40
77
  catch (error) {
41
78
  const receivedVersion = method === 'initialize' && value !== null && typeof value === 'object'
@@ -1,6 +1,8 @@
1
1
  import type { ClusterMethod, GraphProfile, GraphSpec, ServerCapabilities } from './generated/protocol.js';
2
+ import type { FrameRecord } from './frames.js';
3
+ export declare function normalizeInboundSubscriptionFrame(kind: string, method: string, frame: FrameRecord): FrameRecord;
2
4
  export declare function assertDefinition(definition: string, value: unknown): void;
3
- export declare function assertMethodResult(method: ClusterMethod, value: unknown): void;
5
+ export declare function assertMethodResult(method: ClusterMethod, value: unknown): unknown;
4
6
  /** Validate an execution graph against the frozen cluster protocol schema. */
5
7
  export declare function assertGraphSpec(value: unknown): asserts value is GraphSpec;
6
8
  export declare function assertGraphProfile(value: unknown): asserts value is GraphProfile;
@@ -1,6 +1,8 @@
1
1
  import type { ClusterMethod, GraphProfile, GraphSpec, ServerCapabilities } from './generated/protocol.js';
2
+ import type { FrameRecord } from './frames.js';
3
+ export declare function normalizeInboundSubscriptionFrame(kind: string, method: string, frame: FrameRecord): FrameRecord;
2
4
  export declare function assertDefinition(definition: string, value: unknown): void;
3
- export declare function assertMethodResult(method: ClusterMethod, value: unknown): void;
5
+ export declare function assertMethodResult(method: ClusterMethod, value: unknown): unknown;
4
6
  /** Validate an execution graph against the frozen cluster protocol schema. */
5
7
  export declare function assertGraphSpec(value: unknown): asserts value is GraphSpec;
6
8
  export declare function assertGraphProfile(value: unknown): asserts value is GraphProfile;
@@ -1,6 +1,8 @@
1
1
  import type { ClusterMethod, GraphProfile, GraphSpec, ServerCapabilities } from './generated/protocol.js';
2
+ import type { FrameRecord } from './frames.js';
3
+ export declare function normalizeInboundSubscriptionFrame(kind: string, method: string, frame: FrameRecord): FrameRecord;
2
4
  export declare function assertDefinition(definition: string, value: unknown): void;
3
- export declare function assertMethodResult(method: ClusterMethod, value: unknown): void;
5
+ export declare function assertMethodResult(method: ClusterMethod, value: unknown): unknown;
4
6
  /** Validate an execution graph against the frozen cluster protocol schema. */
5
7
  export declare function assertGraphSpec(value: unknown): asserts value is GraphSpec;
6
8
  export declare function assertGraphProfile(value: unknown): asserts value is GraphProfile;
@@ -2,6 +2,7 @@ import Ajv2020 from 'ajv/dist/2020.js';
2
2
  import { METHOD_RESULT_DEFINITIONS, PROTOCOL_VERSION, } from './generated/protocol.mjs';
3
3
  import { CLUSTER_PROTOCOL_SCHEMA } from './generated/protocol-schema.mjs';
4
4
  import { ClusterProtocolError, ClusterRequestError } from './errors.mjs';
5
+ import { isRecord } from './frames.mjs';
5
6
  const ajv = new Ajv2020({
6
7
  allErrors: true,
7
8
  strict: false,
@@ -19,6 +20,38 @@ function validatorFor(definition) {
19
20
  validators.set(definition, validator);
20
21
  return validator;
21
22
  }
23
+ const RUN_PROJECTION_DEFINITIONS = new Set([
24
+ 'RunForceResult',
25
+ 'RunStatusResult',
26
+ 'RunWatchEventNotification',
27
+ ]);
28
+ function normalizeRunProjection(value) {
29
+ if (!isRecord(value))
30
+ return value;
31
+ const size = value.size === 'tiny'
32
+ ? 'small'
33
+ : value.size === 'standard'
34
+ ? 'medium'
35
+ : value.size;
36
+ return size === value.size ? value : { ...value, size };
37
+ }
38
+ /** Normalize deserialize-only aliases before validating an inbound protocol value. */
39
+ function normalizeInboundDefinition(definition, value) {
40
+ if (RUN_PROJECTION_DEFINITIONS.has(definition))
41
+ return normalizeRunProjection(value);
42
+ if (definition !== 'RunListResult' || !isRecord(value))
43
+ return value;
44
+ const existingRuns = value.runs;
45
+ if (!Array.isArray(existingRuns))
46
+ return value;
47
+ const runs = existingRuns.map(normalizeRunProjection);
48
+ return runs.some((run, index) => run !== existingRuns[index]) ? { ...value, runs } : value;
49
+ }
50
+ export function normalizeInboundSubscriptionFrame(kind, method, frame) {
51
+ if (kind !== 'run/watch' || method !== 'event' || !isRecord(frame.params))
52
+ return frame;
53
+ return { ...frame, params: normalizeInboundDefinition('RunWatchEventNotification', frame.params) };
54
+ }
22
55
  export function assertDefinition(definition, value) {
23
56
  const validate = validatorFor(definition);
24
57
  if (validate(value))
@@ -28,7 +61,10 @@ export function assertDefinition(definition, value) {
28
61
  }
29
62
  export function assertMethodResult(method, value) {
30
63
  try {
31
- assertDefinition(METHOD_RESULT_DEFINITIONS[method], value);
64
+ const definition = METHOD_RESULT_DEFINITIONS[method];
65
+ const normalized = normalizeInboundDefinition(definition, value);
66
+ assertDefinition(definition, normalized);
67
+ return normalized;
32
68
  }
33
69
  catch (error) {
34
70
  const receivedVersion = method === 'initialize' && value !== null && typeof value === 'object'
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@the-open-engine/zeroshot",
3
- "version": "6.45.0",
3
+ "version": "6.46.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@the-open-engine/zeroshot",
9
- "version": "6.45.0",
9
+ "version": "6.46.0",
10
10
  "hasInstallScript": true,
11
11
  "license": "MIT",
12
12
  "dependencies": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@the-open-engine/zeroshot",
3
- "version": "6.45.0",
3
+ "version": "6.46.0",
4
4
  "description": "Independent executor–verifier orchestration for software changes.",
5
5
  "main": "src/orchestrator.js",
6
6
  "bin": {
@@ -117,6 +117,23 @@ function parenthesize(value) {
117
117
  return value.includes(' | ') || value.includes(' & ') ? `(${value})` : value;
118
118
  }
119
119
 
120
+ function renderAlias(name, definition) {
121
+ const inline = `export type ${name} = ${schemaType(definition)};`;
122
+ if (Buffer.byteLength(inline) <= 120) return inline;
123
+ const multiline = schemaType(definition).replaceAll('; ', ';\n ').replaceAll(' | ', '\n | ');
124
+ return `export type ${name} =\n ${multiline};`;
125
+ }
126
+
127
+ function renderSchemaModule(schema) {
128
+ const encoded = JSON.stringify(schema);
129
+ const chunks = encoded.match(/[\s\S]{1,72}/g) ?? [];
130
+ const expression = chunks.map((chunk) => ` ${JSON.stringify(chunk)}`).join(' +\n');
131
+ return (
132
+ '// Generated from protocol/openengine-cluster/v1/schema.json. Do not edit.\n' +
133
+ `export const CLUSTER_PROTOCOL_SCHEMA: unknown = JSON.parse(\n${expression}\n);\n`
134
+ );
135
+ }
136
+
120
137
  function generate() {
121
138
  const openrpc = readJson(OPENRPC_PATH);
122
139
  const schema = readJson(SCHEMA_PATH);
@@ -137,7 +154,7 @@ function generate() {
137
154
  openrpc.methods.map((method) => [method.name, method.result.schema.$ref.split('/').at(-1)])
138
155
  );
139
156
  const aliases = Object.entries(schema.$defs)
140
- .map(([name, definition]) => `export type ${name} = ${schemaType(definition)};`)
157
+ .map(([name, definition]) => renderAlias(name, definition))
141
158
  .join('\n');
142
159
 
143
160
  return (
@@ -194,7 +211,7 @@ function generate() {
194
211
  }
195
212
 
196
213
  const expected = generate();
197
- const schemaExpected = `// Generated from protocol/openengine-cluster/v1/schema.json. Do not edit.\nexport const CLUSTER_PROTOCOL_SCHEMA: unknown = ${JSON.stringify(readJson(SCHEMA_PATH))};\n`;
214
+ const schemaExpected = renderSchemaModule(readJson(SCHEMA_PATH));
198
215
  const check = process.argv.includes('--check');
199
216
  const outputs = [
200
217
  [OUTPUT_PATH, expected],
@@ -12,7 +12,7 @@ import type { FrameRecord } from './frames.js';
12
12
  import { BoundedQueue } from './queue.js';
13
13
  import { addSocketListener } from './socket.js';
14
14
  import type { WebSocketLike } from './socket.js';
15
- import { assertDefinition, assertMethodResult } from './validators.js';
15
+ import { assertDefinition, assertMethodResult, normalizeInboundSubscriptionFrame } from './validators.js';
16
16
  import {
17
17
  CONNECTION_TRANSITIONS,
18
18
  PROTOCOL_DIAGNOSTIC_CAPACITY,
@@ -193,7 +193,7 @@ export class Connection {
193
193
  if (!('result' in frame)) {
194
194
  entry.reject(new ClusterProtocolError('response has neither result nor error', 'INVALID_RESPONSE')); return;
195
195
  }
196
- try { assertMethodResult(entry.method, frame.result); }
196
+ let validatedResult: unknown; try { validatedResult = assertMethodResult(entry.method, frame.result); }
197
197
  catch (error) {
198
198
  if (entry.subscriptionKind && isRecord(frame.result) && typeof frame.result.subscriptionId === 'string') {
199
199
  void this.#sendNotification('subscription/cancel', { subscriptionId: frame.result.subscriptionId })
@@ -201,8 +201,8 @@ export class Connection {
201
201
  }
202
202
  entry.reject(error); return;
203
203
  }
204
- if (!entry.subscriptionKind) { entry.resolve(frame.result); return; }
205
- const result = frame.result as ClusterMethodResults[SubscriptionMethod];
204
+ if (!entry.subscriptionKind) { entry.resolve(validatedResult); return; }
205
+ const result = validatedResult as ClusterMethodResults[SubscriptionMethod];
206
206
  const registration: SubscriptionRegistration = {
207
207
  id: result.subscriptionId, kind: entry.subscriptionKind,
208
208
  queue: new BoundedQueue<FrameRecord>(), overflowed: false, cancelSent: false,
@@ -232,14 +232,14 @@ export class Connection {
232
232
  if (registration.abortSignal && registration.abortHandler) {
233
233
  registration.abortSignal.removeEventListener('abort', registration.abortHandler);
234
234
  }
235
- delete registration.abortSignal;
236
- delete registration.abortHandler;
235
+ delete registration.abortSignal; delete registration.abortHandler;
237
236
  }
238
237
  #routeNotification(method: string, params: FrameRecord, frame: FrameRecord, bytes: number): void {
239
238
  const subscriptionId = params.subscriptionId;
240
239
  if (typeof subscriptionId !== 'string') { this.#recordProtocolError('subscription notification has no subscriptionId'); return; }
241
240
  const registration = this.#subscriptions.get(subscriptionId); if (!registration) return;
242
- const terminal = method === 'subscription/closed'; const outcome = registration.queue.push(frame, bytes);
241
+ const routedFrame = normalizeInboundSubscriptionFrame(registration.kind, method, frame);
242
+ const terminal = method === 'subscription/closed'; const outcome = registration.queue.push(routedFrame, bytes);
243
243
  if (outcome === 'overflow') {
244
244
  registration.overflowed = true; this.unregisterSubscription(subscriptionId, registration); registration.queue.endRetainingBuffer();
245
245
  if (!terminal) void this.cancelSubscription(registration).catch((error: unknown) => this.recordDiagnostic(error));