@forgeax/engine-tool-runtime 0.1.26 → 0.1.28
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/command-tree.d.ts +49 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.mjs +357 -84
- package/dist/index.mjs.map +1 -1
- package/dist/json-schema.d.ts +22 -0
- package/dist/types.d.ts +8 -0
- package/package.json +1 -1
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { JsonValue, ToolContribution, ToolDescriptor, ToolExecutor, ToolRun, ToolRunOptions } from './types.js';
|
|
2
|
+
export type ToolCommandPath = readonly string[];
|
|
3
|
+
export interface ToolCommandDescriptor<TArgs = unknown, TResult = unknown> extends ToolDescriptor<TArgs, TResult> {
|
|
4
|
+
readonly path: ToolCommandPath;
|
|
5
|
+
}
|
|
6
|
+
export interface ToolCommandNode {
|
|
7
|
+
readonly name: string;
|
|
8
|
+
readonly path: string;
|
|
9
|
+
readonly summary: string;
|
|
10
|
+
readonly children?: readonly ToolCommandNode[];
|
|
11
|
+
readonly leaf?: {
|
|
12
|
+
readonly title: string;
|
|
13
|
+
readonly realm: ToolDescriptor['realm'];
|
|
14
|
+
readonly inputSchema?: JsonValue;
|
|
15
|
+
readonly outputSchema?: JsonValue;
|
|
16
|
+
readonly inputDescription?: string;
|
|
17
|
+
readonly outputDescription?: string;
|
|
18
|
+
readonly capabilities: readonly string[];
|
|
19
|
+
readonly errors: readonly string[];
|
|
20
|
+
readonly example?: JsonValue;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export interface ToolCommandHelp {
|
|
24
|
+
readonly path: string;
|
|
25
|
+
readonly summary?: string;
|
|
26
|
+
readonly nodes: readonly ToolCommandNode[];
|
|
27
|
+
readonly leaf?: ToolCommandNode['leaf'];
|
|
28
|
+
}
|
|
29
|
+
export type ToolCommandErrorCode = 'tool-command-invalid-path' | 'tool-command-conflict' | 'tool-command-not-found';
|
|
30
|
+
export declare class ToolCommandError extends Error {
|
|
31
|
+
readonly code: ToolCommandErrorCode;
|
|
32
|
+
readonly path: string;
|
|
33
|
+
readonly detail: Readonly<Record<string, unknown>>;
|
|
34
|
+
constructor(code: ToolCommandErrorCode, path: string, message: string, detail?: Readonly<Record<string, unknown>>);
|
|
35
|
+
}
|
|
36
|
+
export interface ToolCommandRegistry {
|
|
37
|
+
readonly contributions: readonly ToolContribution[];
|
|
38
|
+
readonly list: (path?: ToolCommandPath) => readonly ToolCommandNode[];
|
|
39
|
+
readonly tree: (path?: ToolCommandPath | string) => readonly ToolCommandNode[];
|
|
40
|
+
readonly describe: (path: ToolCommandPath | string) => ToolCommandDescriptor | undefined;
|
|
41
|
+
readonly help: (path?: ToolCommandPath | string, tree?: boolean) => ToolCommandHelp;
|
|
42
|
+
readonly get: (path: ToolCommandPath | string) => ToolContribution | undefined;
|
|
43
|
+
readonly run: <TResult = unknown>(path: ToolCommandPath | string, args: unknown, options?: ToolRunOptions) => ToolRun<TResult> | undefined;
|
|
44
|
+
}
|
|
45
|
+
export declare function commandPath(descriptor: ToolDescriptor): ToolCommandPath;
|
|
46
|
+
export declare function defineCommand<TArgs, TResult>(descriptor: Omit<ToolCommandDescriptor<TArgs, TResult>, 'id'> & {
|
|
47
|
+
readonly id?: string;
|
|
48
|
+
}, execute: ToolExecutor<TArgs, TResult>): ToolContribution<TArgs, TResult>;
|
|
49
|
+
export declare function createToolCommandRegistry(contributions: readonly ToolContribution[]): ToolCommandRegistry;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
export { type ArtifactManifestValidation, createArtifactManifest, createArtifactRef, createPreviewArtifactManifest, createSnapshotRef, isSerializableValue, type PreviewArtifactIdentity, type PreviewArtifactKind, type PreviewArtifactManifest, type PreviewArtifactManifestEntry, type PreviewArtifactManifestValidation, type PreviewArtifactRole, type ToolArtifactIdentity, type ToolArtifactManifest, type ToolArtifactManifestEntry, validateArtifactManifest, validateArtifactRefs, validatePreviewArtifactManifest, } from './artifacts.js';
|
|
2
2
|
export { createCapabilityResolver, createRealmCapabilityMatrix, createServiceCapability, defineToolCapability, type RealmBootstrapValidation, type RealmCapability, type RealmCapabilityInput, type RealmCapabilityMatrix, type ServiceAdmissionExpectation, type ServiceAdmissionRef, type ServiceCapability, validateRealmBootstrapPayload, } from './capability.js';
|
|
3
3
|
export { type CarrierError, type CarrierErrorCode, type CarrierLease, type CarrierLeaseRequest, type CarrierOffer, type CarrierPhase, type CarrierResult, type CarrierState, type CarrierStateMachine, type CarrierStateMachineOptions, createCarrierStateMachine, } from './carrier.js';
|
|
4
|
+
export { commandPath, createToolCommandRegistry, defineCommand, type ToolCommandDescriptor, ToolCommandError, type ToolCommandErrorCode, type ToolCommandHelp, type ToolCommandNode, type ToolCommandPath, type ToolCommandRegistry, } from './command-tree.js';
|
|
4
5
|
export { artifactIncompleteError, cancellationError, capabilityUnavailableError, cleanupError, disconnectedError, domainFailureError, invalidArgsError, snapshotStaleError, terminalError, timeoutError, } from './errors.js';
|
|
6
|
+
export { parseToolJsonSchema, type ToolJsonSchema, type ToolSchemaFailure, toolJsonSchema, } from './json-schema.js';
|
|
5
7
|
export { createLexicalLease, type LeaseCleanupFailure, type LeaseTermination, type LeaseTerminationReason, type LexicalLease, } from './lease.js';
|
|
6
8
|
export { type CapabilityToken, createCapabilityToken, createMigrationRecipe, type MigrationCapabilityProbe, type MigrationOperation, type MigrationPayloadValidation, type MigrationRecipe, probeMigrationTarget, validateMigrationPayload, } from './migration.js';
|
|
7
9
|
export { createToolRuntime, defineTool, type ToolRuntime } from './runtime.js';
|
package/dist/index.mjs
CHANGED
|
@@ -583,89 +583,6 @@ function createLexicalLease(runId) {
|
|
|
583
583
|
};
|
|
584
584
|
}
|
|
585
585
|
|
|
586
|
-
// src/migration.ts
|
|
587
|
-
var liveStateKeys = /* @__PURE__ */ new Set([
|
|
588
|
-
"world",
|
|
589
|
-
"renderer",
|
|
590
|
-
"canvas",
|
|
591
|
-
"context",
|
|
592
|
-
"fiber",
|
|
593
|
-
"page",
|
|
594
|
-
"carrier",
|
|
595
|
-
"ui",
|
|
596
|
-
"selection",
|
|
597
|
-
"draft",
|
|
598
|
-
"undo",
|
|
599
|
-
"session"
|
|
600
|
-
]);
|
|
601
|
-
function liveStateError(path, key) {
|
|
602
|
-
return {
|
|
603
|
-
code: "tool-migration-live-state",
|
|
604
|
-
expected: "migration payload to contain only recipe, snapshot, and artifact references",
|
|
605
|
-
hint: "Recreate the operation from serializable authority facts; do not migrate live state.",
|
|
606
|
-
detail: { path, key }
|
|
607
|
-
};
|
|
608
|
-
}
|
|
609
|
-
function createCapabilityToken(operation, source, version, target) {
|
|
610
|
-
if (source.catalogDigest.length === 0 || target.catalogDigest.length === 0)
|
|
611
|
-
throw new TypeError("capability probe catalogDigest must not be empty");
|
|
612
|
-
return {
|
|
613
|
-
kind: "forgeax-tool-capability",
|
|
614
|
-
version,
|
|
615
|
-
operation,
|
|
616
|
-
source: { ...source, evidence: [...source.evidence] },
|
|
617
|
-
target: { ...target, evidence: [...target.evidence] }
|
|
618
|
-
};
|
|
619
|
-
}
|
|
620
|
-
function probeMigrationTarget(token2, target) {
|
|
621
|
-
const sameEvidence = token2.target.evidence.every((kind) => target.evidence.includes(kind));
|
|
622
|
-
const matches = token2.target.realm === target.realm && token2.target.catalogDigest === target.catalogDigest && token2.target.rhiBackend === target.rhiBackend && sameEvidence;
|
|
623
|
-
if (!matches) {
|
|
624
|
-
return {
|
|
625
|
-
ok: false,
|
|
626
|
-
error: capabilityUnavailableError(`migration:${token2.operation}`, target.realm)
|
|
627
|
-
};
|
|
628
|
-
}
|
|
629
|
-
return { ok: true, value: { ...target, evidence: [...target.evidence] } };
|
|
630
|
-
}
|
|
631
|
-
function createMigrationRecipe(input) {
|
|
632
|
-
const recipe = {
|
|
633
|
-
operation: input.operation,
|
|
634
|
-
args: input.args,
|
|
635
|
-
...input.snapshot === void 0 ? {} : { snapshot: { ...input.snapshot } },
|
|
636
|
-
artifacts: (input.artifacts ?? []).map((artifact) => ({ ...artifact }))
|
|
637
|
-
};
|
|
638
|
-
const validation = validateMigrationPayload(recipe);
|
|
639
|
-
if (!validation.ok) {
|
|
640
|
-
const path = validation.error.code === "tool-migration-live-state" ? validation.error.detail.path : "$";
|
|
641
|
-
throw new TypeError(path);
|
|
642
|
-
}
|
|
643
|
-
return recipe;
|
|
644
|
-
}
|
|
645
|
-
function validateMigrationPayload(value) {
|
|
646
|
-
const visit = (candidate, path) => {
|
|
647
|
-
if (!isSerializableValue(candidate)) {
|
|
648
|
-
return { ok: false, error: liveStateError(path, path.split(".").at(-1) ?? "<root>") };
|
|
649
|
-
}
|
|
650
|
-
if (candidate === null || typeof candidate !== "object") return { ok: true };
|
|
651
|
-
if (Array.isArray(candidate)) {
|
|
652
|
-
for (const [index, child] of candidate.entries()) {
|
|
653
|
-
const result = visit(child, `${path}[${index}]`);
|
|
654
|
-
if (!result.ok) return result;
|
|
655
|
-
}
|
|
656
|
-
return { ok: true };
|
|
657
|
-
}
|
|
658
|
-
for (const [key, child] of Object.entries(candidate)) {
|
|
659
|
-
const normalized = key.replaceAll("_", "").replaceAll("-", "").toLowerCase();
|
|
660
|
-
if (liveStateKeys.has(normalized)) return { ok: false, error: liveStateError(path, key) };
|
|
661
|
-
const result = visit(child, `${path}.${key}`);
|
|
662
|
-
if (!result.ok) return result;
|
|
663
|
-
}
|
|
664
|
-
return { ok: true };
|
|
665
|
-
};
|
|
666
|
-
return visit(value, "$");
|
|
667
|
-
}
|
|
668
|
-
|
|
669
586
|
// src/timing.ts
|
|
670
587
|
var PHASES = [
|
|
671
588
|
"lookup",
|
|
@@ -1125,6 +1042,362 @@ function createToolRuntime(contributions) {
|
|
|
1125
1042
|
return runtime;
|
|
1126
1043
|
}
|
|
1127
1044
|
|
|
1045
|
+
// src/command-tree.ts
|
|
1046
|
+
var ToolCommandError = class extends Error {
|
|
1047
|
+
code;
|
|
1048
|
+
path;
|
|
1049
|
+
detail;
|
|
1050
|
+
constructor(code, path, message, detail = {}) {
|
|
1051
|
+
super(`${code}: ${message}`);
|
|
1052
|
+
this.name = "ToolCommandError";
|
|
1053
|
+
this.code = code;
|
|
1054
|
+
this.path = path;
|
|
1055
|
+
this.detail = detail;
|
|
1056
|
+
}
|
|
1057
|
+
};
|
|
1058
|
+
function normalizePath(path) {
|
|
1059
|
+
const segments = typeof path === "string" ? path.split(/\s+/).filter(Boolean) : [...path];
|
|
1060
|
+
if (segments.length === 0 && typeof path === "string" || segments.some((segment) => !/^[a-z][a-z0-9-]*$/.test(segment))) {
|
|
1061
|
+
throw new ToolCommandError(
|
|
1062
|
+
"tool-command-invalid-path",
|
|
1063
|
+
typeof path === "string" ? path : segments.join(" "),
|
|
1064
|
+
"command paths must contain lower-case name segments"
|
|
1065
|
+
);
|
|
1066
|
+
}
|
|
1067
|
+
return segments;
|
|
1068
|
+
}
|
|
1069
|
+
function descriptorPath(descriptor) {
|
|
1070
|
+
const path = normalizePath(descriptor.path ?? descriptor.id.split("."));
|
|
1071
|
+
if (path.length === 0) {
|
|
1072
|
+
throw new ToolCommandError(
|
|
1073
|
+
"tool-command-invalid-path",
|
|
1074
|
+
"",
|
|
1075
|
+
"command declarations must contain at least one name segment"
|
|
1076
|
+
);
|
|
1077
|
+
}
|
|
1078
|
+
return path;
|
|
1079
|
+
}
|
|
1080
|
+
function pathKey(path) {
|
|
1081
|
+
return path.join(" ");
|
|
1082
|
+
}
|
|
1083
|
+
function schemaValue(describe) {
|
|
1084
|
+
if (describe === void 0) return void 0;
|
|
1085
|
+
try {
|
|
1086
|
+
const value = JSON.parse(describe);
|
|
1087
|
+
return value !== null && typeof value === "object" ? value : void 0;
|
|
1088
|
+
} catch {
|
|
1089
|
+
return void 0;
|
|
1090
|
+
}
|
|
1091
|
+
}
|
|
1092
|
+
function nodeForDescriptor(descriptor, path, includeLeaf = true) {
|
|
1093
|
+
const inputSchema = descriptor.inputSchema ?? schemaValue(descriptor.argsSchema.describe);
|
|
1094
|
+
const outputSchema = descriptor.outputSchema ?? schemaValue(descriptor.resultSchema.describe);
|
|
1095
|
+
const node = {
|
|
1096
|
+
name: path[path.length - 1],
|
|
1097
|
+
path: pathKey(path),
|
|
1098
|
+
summary: descriptor.summary
|
|
1099
|
+
};
|
|
1100
|
+
if (includeLeaf) {
|
|
1101
|
+
return {
|
|
1102
|
+
...node,
|
|
1103
|
+
leaf: {
|
|
1104
|
+
title: descriptor.title,
|
|
1105
|
+
realm: descriptor.realm,
|
|
1106
|
+
...inputSchema === void 0 ? descriptor.argsSchema.describe === void 0 ? {} : { inputDescription: descriptor.argsSchema.describe } : { inputSchema },
|
|
1107
|
+
...outputSchema === void 0 ? descriptor.resultSchema.describe === void 0 ? {} : { outputDescription: descriptor.resultSchema.describe } : { outputSchema },
|
|
1108
|
+
capabilities: [...descriptor.capabilities ?? []],
|
|
1109
|
+
errors: [...descriptor.errors ?? []],
|
|
1110
|
+
...descriptor.example === void 0 ? {} : { example: descriptor.example }
|
|
1111
|
+
}
|
|
1112
|
+
};
|
|
1113
|
+
}
|
|
1114
|
+
return node;
|
|
1115
|
+
}
|
|
1116
|
+
function compareRegistered(left, right) {
|
|
1117
|
+
return pathKey(left.path).localeCompare(pathKey(right.path));
|
|
1118
|
+
}
|
|
1119
|
+
function hasPrefix(left, right) {
|
|
1120
|
+
return left.length < right.length && left.every((segment, index) => segment === right[index]);
|
|
1121
|
+
}
|
|
1122
|
+
function findNode(registered, path) {
|
|
1123
|
+
return registered.find(
|
|
1124
|
+
(candidate) => candidate.path.length === path.length && candidate.path.every((segment, index) => segment === path[index])
|
|
1125
|
+
);
|
|
1126
|
+
}
|
|
1127
|
+
function descendants(registered, path) {
|
|
1128
|
+
return registered.filter((candidate) => hasPrefix(path, candidate.path));
|
|
1129
|
+
}
|
|
1130
|
+
function projectNodes(registered, path, recursive) {
|
|
1131
|
+
const children = /* @__PURE__ */ new Map();
|
|
1132
|
+
for (const candidate of registered) {
|
|
1133
|
+
if (candidate.path.length <= path.length || !path.every((segment, index) => candidate.path[index] === segment))
|
|
1134
|
+
continue;
|
|
1135
|
+
const next = candidate.path[path.length];
|
|
1136
|
+
const existing = children.get(next);
|
|
1137
|
+
if (existing === void 0 || candidate.path.length < (existing?.path.length ?? Number.MAX_SAFE_INTEGER))
|
|
1138
|
+
children.set(next, candidate.path.length === path.length + 1 ? candidate : void 0);
|
|
1139
|
+
}
|
|
1140
|
+
return [...children.entries()].sort(([left], [right]) => left.localeCompare(right)).map(([name, exact]) => {
|
|
1141
|
+
const childPath = [...path, name];
|
|
1142
|
+
if (exact !== void 0)
|
|
1143
|
+
return nodeForDescriptor(exact.contribution.descriptor, childPath, false);
|
|
1144
|
+
const node = {
|
|
1145
|
+
name,
|
|
1146
|
+
path: pathKey(childPath),
|
|
1147
|
+
summary: descendants(registered, childPath)[0]?.contribution.descriptor.summary ?? ""
|
|
1148
|
+
};
|
|
1149
|
+
if (recursive) return { ...node, children: projectNodes(registered, childPath, true) };
|
|
1150
|
+
return node;
|
|
1151
|
+
});
|
|
1152
|
+
}
|
|
1153
|
+
function commandPath(descriptor) {
|
|
1154
|
+
return descriptorPath(descriptor);
|
|
1155
|
+
}
|
|
1156
|
+
function defineCommand(descriptor, execute) {
|
|
1157
|
+
const path = descriptorPath(descriptor);
|
|
1158
|
+
return {
|
|
1159
|
+
descriptor: {
|
|
1160
|
+
...descriptor,
|
|
1161
|
+
id: descriptor.id ?? path.join("."),
|
|
1162
|
+
path
|
|
1163
|
+
},
|
|
1164
|
+
execute
|
|
1165
|
+
};
|
|
1166
|
+
}
|
|
1167
|
+
function createToolCommandRegistry(contributions) {
|
|
1168
|
+
const registered = [];
|
|
1169
|
+
const byPath = /* @__PURE__ */ new Map();
|
|
1170
|
+
for (const contribution of contributions) {
|
|
1171
|
+
const path = descriptorPath(contribution.descriptor);
|
|
1172
|
+
const key = pathKey(path);
|
|
1173
|
+
if (byPath.has(key) || registered.some(
|
|
1174
|
+
(candidate) => hasPrefix(candidate.path, path) || hasPrefix(path, candidate.path)
|
|
1175
|
+
)) {
|
|
1176
|
+
throw new ToolCommandError(
|
|
1177
|
+
"tool-command-conflict",
|
|
1178
|
+
key,
|
|
1179
|
+
"command paths cannot collide with a leaf or its descendants",
|
|
1180
|
+
{ path: key }
|
|
1181
|
+
);
|
|
1182
|
+
}
|
|
1183
|
+
byPath.set(key, contribution);
|
|
1184
|
+
registered.push({ path, contribution });
|
|
1185
|
+
}
|
|
1186
|
+
registered.sort(compareRegistered);
|
|
1187
|
+
const runtime = createToolRuntime(registered.map((entry) => entry.contribution));
|
|
1188
|
+
const find = (pathInput) => {
|
|
1189
|
+
const path = normalizePath(pathInput);
|
|
1190
|
+
return findNode(registered, path);
|
|
1191
|
+
};
|
|
1192
|
+
const help = (pathInput, recursive = false) => {
|
|
1193
|
+
const path = pathInput === void 0 ? [] : normalizePath(pathInput);
|
|
1194
|
+
const exact = path.length === 0 ? void 0 : findNode(registered, path);
|
|
1195
|
+
const descendant = path.length === 0 ? registered : descendants(registered, path);
|
|
1196
|
+
if (path.length > 0 && exact === void 0 && descendant.length === 0) {
|
|
1197
|
+
let parent = path.slice(0, -1);
|
|
1198
|
+
while (parent.length > 0 && descendants(registered, parent).length === 0)
|
|
1199
|
+
parent = parent.slice(0, -1);
|
|
1200
|
+
throw new ToolCommandError(
|
|
1201
|
+
"tool-command-not-found",
|
|
1202
|
+
pathKey(path),
|
|
1203
|
+
"command path was not found",
|
|
1204
|
+
{
|
|
1205
|
+
parent: pathKey(parent),
|
|
1206
|
+
candidates: projectNodes(registered, parent, false).map((node) => node.name)
|
|
1207
|
+
}
|
|
1208
|
+
);
|
|
1209
|
+
}
|
|
1210
|
+
const leaf = exact === void 0 ? void 0 : nodeForDescriptor(exact.contribution.descriptor, path).leaf;
|
|
1211
|
+
const summary = exact?.contribution.descriptor.summary;
|
|
1212
|
+
return {
|
|
1213
|
+
path: pathKey(path),
|
|
1214
|
+
...summary === void 0 ? {} : { summary },
|
|
1215
|
+
nodes: projectNodes(registered, path, recursive || exact !== void 0),
|
|
1216
|
+
...leaf === void 0 ? {} : { leaf }
|
|
1217
|
+
};
|
|
1218
|
+
};
|
|
1219
|
+
return {
|
|
1220
|
+
contributions: registered.map((entry) => entry.contribution),
|
|
1221
|
+
list: (path = []) => projectNodes(registered, path, false),
|
|
1222
|
+
tree: (path = []) => projectNodes(registered, normalizePath(path), true),
|
|
1223
|
+
describe: (pathInput) => find(pathInput)?.contribution.descriptor,
|
|
1224
|
+
help,
|
|
1225
|
+
get: (pathInput) => find(pathInput)?.contribution,
|
|
1226
|
+
run: (pathInput, args, options) => {
|
|
1227
|
+
const contribution = find(pathInput)?.contribution;
|
|
1228
|
+
if (contribution === void 0) return void 0;
|
|
1229
|
+
return runtime.run(contribution, args, options);
|
|
1230
|
+
}
|
|
1231
|
+
};
|
|
1232
|
+
}
|
|
1233
|
+
|
|
1234
|
+
// src/json-schema.ts
|
|
1235
|
+
function isRecord(value) {
|
|
1236
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
1237
|
+
}
|
|
1238
|
+
function sameJson(left, right) {
|
|
1239
|
+
return JSON.stringify(left) === JSON.stringify(right);
|
|
1240
|
+
}
|
|
1241
|
+
function typeMatches(type, value) {
|
|
1242
|
+
switch (type) {
|
|
1243
|
+
case void 0:
|
|
1244
|
+
return true;
|
|
1245
|
+
case "null":
|
|
1246
|
+
return value === null;
|
|
1247
|
+
case "array":
|
|
1248
|
+
return Array.isArray(value);
|
|
1249
|
+
case "object":
|
|
1250
|
+
return isRecord(value);
|
|
1251
|
+
case "string":
|
|
1252
|
+
return typeof value === "string";
|
|
1253
|
+
case "number":
|
|
1254
|
+
return typeof value === "number" && Number.isFinite(value);
|
|
1255
|
+
case "integer":
|
|
1256
|
+
return typeof value === "number" && Number.isSafeInteger(value);
|
|
1257
|
+
case "boolean":
|
|
1258
|
+
return typeof value === "boolean";
|
|
1259
|
+
}
|
|
1260
|
+
}
|
|
1261
|
+
function validate(value, schema, path) {
|
|
1262
|
+
if (!typeMatches(schema.type, value))
|
|
1263
|
+
return { path, message: `expected ${schema.type ?? "a value"}` };
|
|
1264
|
+
if (schema.enum !== void 0 && !schema.enum.some((candidate) => sameJson(candidate, value))) {
|
|
1265
|
+
return { path, message: "expected one of the declared enum values" };
|
|
1266
|
+
}
|
|
1267
|
+
if (schema.const !== void 0 && !sameJson(schema.const, value)) {
|
|
1268
|
+
return { path, message: "expected the declared constant value" };
|
|
1269
|
+
}
|
|
1270
|
+
if (typeof value === "string" && schema.minLength !== void 0 && value.length < schema.minLength) {
|
|
1271
|
+
return { path, message: `must contain at least ${schema.minLength} characters` };
|
|
1272
|
+
}
|
|
1273
|
+
if (typeof value === "number") {
|
|
1274
|
+
if (schema.minimum !== void 0 && value < schema.minimum)
|
|
1275
|
+
return { path, message: `must be at least ${schema.minimum}` };
|
|
1276
|
+
if (schema.maximum !== void 0 && value > schema.maximum)
|
|
1277
|
+
return { path, message: `must be at most ${schema.maximum}` };
|
|
1278
|
+
}
|
|
1279
|
+
if (Array.isArray(value)) {
|
|
1280
|
+
if (schema.minItems !== void 0 && value.length < schema.minItems)
|
|
1281
|
+
return { path, message: `must contain at least ${schema.minItems} items` };
|
|
1282
|
+
if (schema.items !== void 0) {
|
|
1283
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
1284
|
+
const failure = validate(value[index], schema.items, `${path}[${index}]`);
|
|
1285
|
+
if (failure !== void 0) return failure;
|
|
1286
|
+
}
|
|
1287
|
+
}
|
|
1288
|
+
}
|
|
1289
|
+
if (isRecord(value)) {
|
|
1290
|
+
const properties = schema.properties ?? {};
|
|
1291
|
+
for (const key of schema.required ?? []) {
|
|
1292
|
+
if (!(key in value)) return { path: `${path}.${key}`, message: "is required" };
|
|
1293
|
+
}
|
|
1294
|
+
if (schema.additionalProperties === false) {
|
|
1295
|
+
for (const key of Object.keys(value)) {
|
|
1296
|
+
if (!(key in properties)) return { path: `${path}.${key}`, message: "is not declared" };
|
|
1297
|
+
}
|
|
1298
|
+
}
|
|
1299
|
+
for (const [key, child] of Object.entries(properties)) {
|
|
1300
|
+
if (!(key in value)) continue;
|
|
1301
|
+
const failure = validate(value[key], child, `${path}.${key}`);
|
|
1302
|
+
if (failure !== void 0) return failure;
|
|
1303
|
+
}
|
|
1304
|
+
}
|
|
1305
|
+
return void 0;
|
|
1306
|
+
}
|
|
1307
|
+
function parseToolJsonSchema(value, schema) {
|
|
1308
|
+
const failure = validate(value, schema, "$");
|
|
1309
|
+
return failure === void 0 ? { ok: true, value } : { ok: false, error: `${failure.path}: ${failure.message}` };
|
|
1310
|
+
}
|
|
1311
|
+
function toolJsonSchema(schema) {
|
|
1312
|
+
return {
|
|
1313
|
+
parse: (value) => parseToolJsonSchema(value, schema),
|
|
1314
|
+
describe: JSON.stringify(schema)
|
|
1315
|
+
};
|
|
1316
|
+
}
|
|
1317
|
+
|
|
1318
|
+
// src/migration.ts
|
|
1319
|
+
var liveStateKeys = /* @__PURE__ */ new Set([
|
|
1320
|
+
"world",
|
|
1321
|
+
"renderer",
|
|
1322
|
+
"canvas",
|
|
1323
|
+
"context",
|
|
1324
|
+
"fiber",
|
|
1325
|
+
"page",
|
|
1326
|
+
"carrier",
|
|
1327
|
+
"ui",
|
|
1328
|
+
"selection",
|
|
1329
|
+
"draft",
|
|
1330
|
+
"undo",
|
|
1331
|
+
"session"
|
|
1332
|
+
]);
|
|
1333
|
+
function liveStateError(path, key) {
|
|
1334
|
+
return {
|
|
1335
|
+
code: "tool-migration-live-state",
|
|
1336
|
+
expected: "migration payload to contain only recipe, snapshot, and artifact references",
|
|
1337
|
+
hint: "Recreate the operation from serializable authority facts; do not migrate live state.",
|
|
1338
|
+
detail: { path, key }
|
|
1339
|
+
};
|
|
1340
|
+
}
|
|
1341
|
+
function createCapabilityToken(operation, source, version, target) {
|
|
1342
|
+
if (source.catalogDigest.length === 0 || target.catalogDigest.length === 0)
|
|
1343
|
+
throw new TypeError("capability probe catalogDigest must not be empty");
|
|
1344
|
+
return {
|
|
1345
|
+
kind: "forgeax-tool-capability",
|
|
1346
|
+
version,
|
|
1347
|
+
operation,
|
|
1348
|
+
source: { ...source, evidence: [...source.evidence] },
|
|
1349
|
+
target: { ...target, evidence: [...target.evidence] }
|
|
1350
|
+
};
|
|
1351
|
+
}
|
|
1352
|
+
function probeMigrationTarget(token2, target) {
|
|
1353
|
+
const sameEvidence = token2.target.evidence.every((kind) => target.evidence.includes(kind));
|
|
1354
|
+
const matches = token2.target.realm === target.realm && token2.target.catalogDigest === target.catalogDigest && token2.target.rhiBackend === target.rhiBackend && sameEvidence;
|
|
1355
|
+
if (!matches) {
|
|
1356
|
+
return {
|
|
1357
|
+
ok: false,
|
|
1358
|
+
error: capabilityUnavailableError(`migration:${token2.operation}`, target.realm)
|
|
1359
|
+
};
|
|
1360
|
+
}
|
|
1361
|
+
return { ok: true, value: { ...target, evidence: [...target.evidence] } };
|
|
1362
|
+
}
|
|
1363
|
+
function createMigrationRecipe(input) {
|
|
1364
|
+
const recipe = {
|
|
1365
|
+
operation: input.operation,
|
|
1366
|
+
args: input.args,
|
|
1367
|
+
...input.snapshot === void 0 ? {} : { snapshot: { ...input.snapshot } },
|
|
1368
|
+
artifacts: (input.artifacts ?? []).map((artifact) => ({ ...artifact }))
|
|
1369
|
+
};
|
|
1370
|
+
const validation = validateMigrationPayload(recipe);
|
|
1371
|
+
if (!validation.ok) {
|
|
1372
|
+
const path = validation.error.code === "tool-migration-live-state" ? validation.error.detail.path : "$";
|
|
1373
|
+
throw new TypeError(path);
|
|
1374
|
+
}
|
|
1375
|
+
return recipe;
|
|
1376
|
+
}
|
|
1377
|
+
function validateMigrationPayload(value) {
|
|
1378
|
+
const visit = (candidate, path) => {
|
|
1379
|
+
if (!isSerializableValue(candidate)) {
|
|
1380
|
+
return { ok: false, error: liveStateError(path, path.split(".").at(-1) ?? "<root>") };
|
|
1381
|
+
}
|
|
1382
|
+
if (candidate === null || typeof candidate !== "object") return { ok: true };
|
|
1383
|
+
if (Array.isArray(candidate)) {
|
|
1384
|
+
for (const [index, child] of candidate.entries()) {
|
|
1385
|
+
const result = visit(child, `${path}[${index}]`);
|
|
1386
|
+
if (!result.ok) return result;
|
|
1387
|
+
}
|
|
1388
|
+
return { ok: true };
|
|
1389
|
+
}
|
|
1390
|
+
for (const [key, child] of Object.entries(candidate)) {
|
|
1391
|
+
const normalized = key.replaceAll("_", "").replaceAll("-", "").toLowerCase();
|
|
1392
|
+
if (liveStateKeys.has(normalized)) return { ok: false, error: liveStateError(path, key) };
|
|
1393
|
+
const result = visit(child, `${path}.${key}`);
|
|
1394
|
+
if (!result.ok) return result;
|
|
1395
|
+
}
|
|
1396
|
+
return { ok: true };
|
|
1397
|
+
};
|
|
1398
|
+
return visit(value, "$");
|
|
1399
|
+
}
|
|
1400
|
+
|
|
1128
1401
|
// src/snapshot.ts
|
|
1129
1402
|
function terminalSnapshot(terminal) {
|
|
1130
1403
|
return terminal.snapshotAfter;
|
|
@@ -1270,6 +1543,6 @@ function createAuthenticatedLoopbackTransport(options) {
|
|
|
1270
1543
|
};
|
|
1271
1544
|
}
|
|
1272
1545
|
|
|
1273
|
-
export { CarrierTransportError, artifactIncompleteError, cancellationError, capabilityUnavailableError, cleanupError, createArtifactManifest, createArtifactRef, createAuthenticatedCarrierTransport, createAuthenticatedLoopbackTransport, createCapabilityResolver, createCapabilityToken, createCarrierStateMachine, createExclusiveTiming, createLexicalLease, createLoopbackTransport, createMigrationRecipe, createPreviewArtifactManifest, createRealmCapabilityMatrix, createServiceCapability, createSnapshotRef, createToolRuntime, defineTool, defineToolCapability, disconnectedError, domainFailureError, finishToolTiming, invalidArgsError, isSerializableValue, isSnapshotRef, probeMigrationTarget, snapshotStaleError, startToolTiming, terminalError, terminalSnapshot, timeoutError, validateArtifactManifest, validateArtifactRefs, validateMigrationPayload, validatePreviewArtifactManifest, validateRealmBootstrapPayload };
|
|
1546
|
+
export { CarrierTransportError, ToolCommandError, artifactIncompleteError, cancellationError, capabilityUnavailableError, cleanupError, commandPath, createArtifactManifest, createArtifactRef, createAuthenticatedCarrierTransport, createAuthenticatedLoopbackTransport, createCapabilityResolver, createCapabilityToken, createCarrierStateMachine, createExclusiveTiming, createLexicalLease, createLoopbackTransport, createMigrationRecipe, createPreviewArtifactManifest, createRealmCapabilityMatrix, createServiceCapability, createSnapshotRef, createToolCommandRegistry, createToolRuntime, defineCommand, defineTool, defineToolCapability, disconnectedError, domainFailureError, finishToolTiming, invalidArgsError, isSerializableValue, isSnapshotRef, parseToolJsonSchema, probeMigrationTarget, snapshotStaleError, startToolTiming, terminalError, terminalSnapshot, timeoutError, toolJsonSchema, validateArtifactManifest, validateArtifactRefs, validateMigrationPayload, validatePreviewArtifactManifest, validateRealmBootstrapPayload };
|
|
1274
1547
|
//# sourceMappingURL=index.mjs.map
|
|
1275
1548
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/artifacts.ts","../src/capability.ts","../src/carrier.ts","../src/lease.ts","../src/migration.ts","../src/timing.ts","../src/runtime.ts","../src/snapshot.ts","../src/transport.ts"],"names":["performance","token"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { JsonValue, ToolEvidenceKind, ToolRealm, ToolRuntimeError } from './types.js';\n\nexport function invalidArgsError(message: string, value: JsonValue): ToolRuntimeError {\n return {\n code: 'tool-invalid-args',\n expected: 'arguments accepted by the contribution argsSchema',\n hint: 'Read the descriptor schema and retry with typed arguments.',\n detail: { message, value },\n };\n}\n\nexport function capabilityUnavailableError(capability: string, realm: ToolRealm): ToolRuntimeError {\n return {\n code: 'tool-capability-unavailable',\n expected: `capability ${capability} in realm ${realm}`,\n hint: 'Inspect the capability matrix and select an available realm or path.',\n detail: { capability, realm },\n };\n}\n\nexport function snapshotStaleError(expectedDigest: string, actualDigest: string): ToolRuntimeError {\n return {\n code: 'tool-snapshot-stale',\n expected: 'the supplied snapshot to match the current authority',\n hint: 'Refresh the authority snapshot and retry the write.',\n detail: { expectedDigest, actualDigest },\n };\n}\n\nexport function domainFailureError(\n code: string,\n expected = 'the producer operation to succeed',\n hint = 'Inspect detail and repair the owning producer before retrying.',\n payload?: JsonValue,\n): ToolRuntimeError {\n return {\n code: 'tool-domain-failed',\n expected,\n hint,\n detail: { code, ...(payload === undefined ? {} : { payload }) },\n };\n}\n\nexport function artifactIncompleteError(\n missing: readonly ToolEvidenceKind[],\n runId: string,\n): ToolRuntimeError {\n return {\n code: 'tool-artifact-incomplete',\n expected: 'the requested evidence artifacts to be produced by their owners',\n hint: 'Request only supported evidence and inspect the artifact manifest before retrying.',\n detail: { missing: [...missing], runId },\n };\n}\n\nexport function cancellationError(reason: string): ToolRuntimeError {\n return {\n code: 'tool-run-cancelled',\n expected: 'the tool run not to be cancelled',\n hint: 'Retry the command after resolving the cancellation source.',\n detail: { reason },\n };\n}\n\nexport function timeoutError(deadlineMs: number): ToolRuntimeError {\n return {\n code: 'tool-run-timeout',\n expected: `the tool run to complete within ${deadlineMs}ms`,\n hint: 'Increase the deadline only when the operation is expected to be bounded.',\n detail: { deadlineMs },\n };\n}\n\nexport function disconnectedError(transport: string): ToolRuntimeError {\n return {\n code: 'tool-run-disconnected',\n expected: 'the tool transport to remain connected',\n hint: 'Reconnect the transport and retry from the last serialized snapshot.',\n detail: { transport },\n };\n}\n\nexport function terminalError(runId: string, outcome: 'succeeded' | 'failed'): ToolRuntimeError {\n return {\n code: 'tool-run-terminal',\n expected: 'a non-terminal ToolRun',\n hint: 'Use the existing terminal and do not attach another executor.',\n detail: { runId, outcome },\n };\n}\n\nexport function cleanupError(runId: string, message: string): ToolRuntimeError {\n return {\n code: 'tool-cleanup-failed',\n expected: 'all ToolRun cleanup callbacks to complete',\n hint: 'Inspect the cleanup detail and release the owning resource.',\n detail: { runId, message },\n };\n}\n\nexport function artifactManifestError(\n expected: string,\n hint: string,\n detail: { readonly reason: string; readonly runId?: string },\n): ToolRuntimeError {\n return { code: 'tool-artifact-manifest-invalid', expected, hint, detail };\n}\n\nexport function timingError(reason: string): ToolRuntimeError {\n return {\n code: 'tool-timing-invalid',\n expected: 'exclusive timing phases to be opened and closed once without overlap',\n hint: 'close the current phase before starting the next phase and finish only after all phases close',\n detail: { reason },\n };\n}\n","import { artifactManifestError } from './errors.js';\nimport type { ArtifactRef, JsonValue, SnapshotRef, ToolEvidenceKind } from './types.js';\n\nexport type PreviewArtifactRole =\n | 'report'\n | 'rhi-tape'\n | 'capture'\n | 'fresh-replay'\n | 'profile-capture'\n | 'contact-sheet';\n\nexport type PreviewArtifactKind =\n | 'report'\n | 'rhi-tape'\n | 'png'\n | 'profile-capture'\n | 'contact-sheet';\n\nexport interface PreviewArtifactIdentity {\n readonly runId: string;\n readonly snapshotDigest: string;\n readonly subjectDigest: string;\n readonly presentationDigest: string;\n readonly captureId: string;\n readonly frameId: number;\n}\n\nexport interface PreviewArtifactManifestEntry {\n readonly owner: string;\n readonly kind: PreviewArtifactKind;\n readonly role: PreviewArtifactRole;\n readonly uri: string;\n readonly digest: string;\n readonly byteLength: number;\n readonly mediaType: string;\n readonly derivedFrom: readonly string[];\n}\n\nexport interface PreviewArtifactManifest {\n readonly schemaVersion: '2.0.0';\n readonly identity: PreviewArtifactIdentity;\n readonly artifacts: readonly PreviewArtifactManifestEntry[];\n}\n\nexport type PreviewArtifactManifestValidation =\n | { readonly ok: true; readonly value: PreviewArtifactManifest }\n | { readonly ok: false; readonly error: ReturnType<typeof artifactManifestError> };\n\nexport interface ToolArtifactIdentity {\n readonly runId: string;\n readonly snapshotDigest: string;\n readonly stepId: string;\n readonly frameId: number;\n readonly captureId: string;\n}\n\nexport interface ToolArtifactManifestEntry {\n readonly owner: string;\n readonly kind: ToolEvidenceKind;\n readonly uri: string;\n readonly digest: string;\n readonly byteLength: number;\n readonly mediaType?: string;\n readonly derivedFrom?: readonly string[];\n}\n\nexport interface ToolArtifactManifest {\n readonly schemaVersion: '1.0.0';\n readonly identity: ToolArtifactIdentity;\n readonly artifacts: readonly ToolArtifactManifestEntry[];\n}\n\nexport type ArtifactManifestValidation =\n | { readonly ok: true; readonly value: ToolArtifactManifest }\n | { readonly ok: false; readonly error: ReturnType<typeof artifactManifestError> };\n\nexport function createArtifactManifest(manifest: ToolArtifactManifest): ToolArtifactManifest {\n const result = validateArtifactManifest(manifest, []);\n if (!result.ok) throw new TypeError('artifact manifest is invalid');\n return {\n schemaVersion: '1.0.0',\n identity: { ...manifest.identity },\n artifacts: manifest.artifacts.map((artifact) => ({ ...artifact })),\n };\n}\n\nexport function validateArtifactManifest(\n manifest: ToolArtifactManifest,\n required: readonly ToolEvidenceKind[],\n): ArtifactManifestValidation {\n const fail = (reason: string, expected: string): ArtifactManifestValidation => ({\n ok: false,\n error: artifactManifestError(\n expected,\n 'regenerate the complete manifest from the owning producers',\n {\n reason,\n ...(typeof manifest?.identity?.runId === 'string'\n ? { runId: manifest.identity.runId }\n : {}),\n },\n ),\n });\n if (manifest?.schemaVersion !== '1.0.0')\n return fail('unsupported schemaVersion', 'schemaVersion === \"1.0.0\"');\n const identity = manifest.identity;\n if (\n identity === undefined ||\n identity.runId.length === 0 ||\n identity.snapshotDigest.length === 0 ||\n identity.stepId.length === 0 ||\n identity.captureId.length === 0 ||\n !Number.isSafeInteger(identity.frameId) ||\n identity.frameId < 0\n )\n return fail(\n 'identity is incomplete',\n 'runId/snapshotDigest/stepId/captureId and non-negative frameId',\n );\n const seen = new Set<ToolEvidenceKind>();\n for (const artifact of manifest.artifacts) {\n if (\n artifact.owner.length === 0 ||\n artifact.uri.length === 0 ||\n artifact.digest.length === 0 ||\n !Number.isSafeInteger(artifact.byteLength) ||\n artifact.byteLength < 0\n )\n return fail(\n `invalid ${artifact.kind} artifact entry`,\n 'owner/uri/digest and byteLength are complete',\n );\n if (seen.has(artifact.kind))\n return fail(\n `duplicate artifact kind '${artifact.kind}'`,\n 'one owner entry per evidence kind',\n );\n seen.add(artifact.kind);\n }\n for (const kind of required)\n if (!seen.has(kind))\n return fail(\n `missing artifact kind '${kind}'`,\n `manifest includes requested '${kind}' evidence`,\n );\n return { ok: true, value: manifest };\n}\n\nconst PREVIEW_ROLE_KINDS: Readonly<Record<PreviewArtifactRole, PreviewArtifactKind>> = {\n report: 'report',\n 'rhi-tape': 'rhi-tape',\n capture: 'png',\n 'fresh-replay': 'png',\n 'profile-capture': 'profile-capture',\n 'contact-sheet': 'contact-sheet',\n};\n\nexport function createPreviewArtifactManifest(\n manifest: PreviewArtifactManifest,\n): PreviewArtifactManifest {\n const result = validatePreviewArtifactManifest(manifest, []);\n if (!result.ok) throw new TypeError('preview artifact manifest is invalid');\n return {\n schemaVersion: '2.0.0',\n identity: { ...manifest.identity },\n artifacts: manifest.artifacts.map((artifact) => ({\n ...artifact,\n derivedFrom: [...artifact.derivedFrom],\n })),\n };\n}\n\nexport function validatePreviewArtifactManifest(\n manifest: PreviewArtifactManifest,\n requiredRoles: readonly PreviewArtifactRole[],\n): PreviewArtifactManifestValidation {\n const fail = (reason: string): PreviewArtifactManifestValidation => ({\n ok: false,\n error: artifactManifestError(\n 'schemaVersion 2.0.0 with one complete identity and role per artifact',\n 'regenerate the staged report and evidence from one lexical ToolRun',\n {\n reason,\n ...(typeof manifest?.identity?.runId === 'string'\n ? { runId: manifest.identity.runId }\n : {}),\n },\n ),\n });\n if (manifest?.schemaVersion !== '2.0.0') return fail('v1 manifest or unsupported schemaVersion');\n const identity = manifest.identity;\n if (\n identity === undefined ||\n [\n identity.runId,\n identity.snapshotDigest,\n identity.subjectDigest,\n identity.presentationDigest,\n identity.captureId,\n ].some((value) => typeof value !== 'string' || value.length === 0) ||\n !Number.isSafeInteger(identity.frameId) ||\n identity.frameId < 0\n ) {\n return fail('identity is incomplete or stale');\n }\n const seenRoles = new Set<PreviewArtifactRole>();\n const digests = new Set<string>();\n for (const artifact of manifest.artifacts) {\n if (seenRoles.has(artifact.role)) return fail(`duplicate role '${artifact.role}'`);\n if (PREVIEW_ROLE_KINDS[artifact.role] !== artifact.kind) {\n return fail(`role '${artifact.role}' does not match kind '${artifact.kind}'`);\n }\n if (\n artifact.owner.length === 0 ||\n artifact.uri.length === 0 ||\n artifact.digest.length === 0 ||\n artifact.mediaType.length === 0 ||\n !Number.isSafeInteger(artifact.byteLength) ||\n artifact.byteLength < 0 ||\n artifact.derivedFrom.some((digest) => digest.length === 0)\n ) {\n return fail(`incomplete '${artifact.role}' artifact`);\n }\n seenRoles.add(artifact.role);\n digests.add(artifact.digest);\n }\n for (const artifact of manifest.artifacts) {\n if (artifact.derivedFrom.some((digest) => !digests.has(digest))) {\n return fail(`'${artifact.role}' derivedFrom references an unpublished artifact`);\n }\n }\n for (const role of requiredRoles) {\n if (!seenRoles.has(role)) return fail(`missing required role '${role}'`);\n }\n return { ok: true, value: manifest };\n}\n\nexport function isSerializableValue(value: unknown, seen = new Set<object>()): value is JsonValue {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return true;\n if (typeof value === 'number') return Number.isFinite(value);\n if (typeof value !== 'object') return false;\n if (seen.has(value)) return false;\n seen.add(value);\n if (Array.isArray(value)) return value.every((entry) => isSerializableValue(entry, seen));\n if (Object.getPrototypeOf(value) !== Object.prototype) return false;\n return Object.entries(value).every(\n ([key, entry]) => typeof key === 'string' && isSerializableValue(entry, seen),\n );\n}\n\nexport function createArtifactRef(input: {\n readonly kind: ToolEvidenceKind | 'tool-result' | 'receipt';\n readonly digest: string;\n readonly uri?: string;\n readonly mediaType?: string;\n readonly sizeBytes?: number;\n}): ArtifactRef {\n if (input.digest.length === 0) throw new TypeError('ArtifactRef digest must not be empty');\n if (\n input.sizeBytes !== undefined &&\n (!Number.isSafeInteger(input.sizeBytes) || input.sizeBytes < 0)\n ) {\n throw new TypeError('ArtifactRef sizeBytes must be a non-negative safe integer');\n }\n return { ...input };\n}\n\nexport function createSnapshotRef(input: SnapshotRef): SnapshotRef {\n if (!Number.isSafeInteger(input.revision) || input.revision < 0) {\n throw new TypeError('SnapshotRef revision must be a non-negative safe integer');\n }\n if (input.digest.length === 0) throw new TypeError('SnapshotRef digest must not be empty');\n return { revision: input.revision, digest: input.digest };\n}\n\nexport function validateArtifactRefs(value: unknown): value is readonly ArtifactRef[] {\n return (\n Array.isArray(value) &&\n value.every(\n (entry) =>\n typeof entry === 'object' &&\n entry !== null &&\n typeof Reflect.get(entry, 'kind') === 'string' &&\n typeof Reflect.get(entry, 'digest') === 'string' &&\n (Reflect.get(entry, 'uri') === undefined || typeof Reflect.get(entry, 'uri') === 'string'),\n )\n );\n}\n","import type {\n ToolCapability,\n ToolCapabilityResolver,\n ToolRealm,\n ToolRuntimeError,\n} from './types.js';\n\nconst capabilityIdPattern = /^[a-z][a-z0-9]*(?:[._-][a-z0-9]+)*$/;\n\n/** A static service identity. The value and its lifecycle remain Fiber-local. */\nexport function defineToolCapability<T>(id: string): ToolCapability<T> {\n if (!capabilityIdPattern.test(id)) {\n throw new TypeError(`Tool capability id must use a stable lower-case path: ${id}`);\n }\n return Object.freeze({ id }) as ToolCapability<T>;\n}\n\nexport function createCapabilityResolver(\n resolve: <T>(capability: ToolCapability<T>) => T | undefined,\n): ToolCapabilityResolver {\n return <T>(capability: ToolCapability<T>) => {\n const value = resolve(capability);\n return value === undefined ? undefined : { ok: true as const, value };\n };\n}\n\nexport interface ServiceAdmissionRef {\n readonly schema: 'forgeax.tool-service-admission-ref.v1';\n readonly reportDigest: string;\n readonly toolId: string;\n readonly descriptorDigest: string;\n readonly recipeDigest: string;\n readonly workloadClass: string;\n readonly codeDigest: string;\n readonly browserVersion: string;\n readonly backend: 'webgpu';\n readonly frameCount: number;\n readonly samples: {\n readonly privateCold: number;\n readonly privateWarm: number;\n readonly serviceCold: number;\n readonly serviceWarm: number;\n };\n readonly correctness: {\n readonly terminalEquivalent: boolean;\n readonly artifactIntegrity: boolean;\n readonly freshReplay: boolean;\n readonly hiddenParity: boolean;\n readonly drawCalls: number;\n readonly nonBlackPixels: number;\n };\n readonly performance: {\n readonly privateMedianMs: number;\n readonly privateP95Ms: number;\n readonly privateMaxMs: number;\n readonly privateRssBytes: number;\n readonly serviceMedianMs: number;\n readonly serviceP95Ms: number;\n readonly serviceMaxMs: number;\n readonly serviceRssBytes: number;\n };\n readonly cleanupPassed: boolean;\n readonly evictionPassed: boolean;\n}\n\nexport interface ServiceAdmissionExpectation {\n readonly toolId: string;\n readonly descriptorDigest: string;\n readonly recipeDigest: string;\n readonly workloadClass: string;\n readonly codeDigest: string;\n readonly browserVersion: string;\n readonly backend: 'webgpu';\n}\n\nexport type ServiceCapability =\n | { readonly available: true; readonly reportDigest?: string }\n | {\n readonly available: false;\n readonly code: 'tool-service-capability-absent';\n readonly expected: 'an admitted acceleration service';\n readonly hint: 'Use the private executor and rerun benchmark admission before enabling service.';\n readonly detail: { readonly reason: string };\n };\n\nfunction admissionFailure(\n admission: ServiceAdmissionRef | undefined,\n expected: ServiceAdmissionExpectation,\n): string | undefined {\n if (admission === undefined) return 'no workload-scoped admission report was supplied';\n if (\n admission.schema !== 'forgeax.tool-service-admission-ref.v1' ||\n !/^sha256:[0-9a-f]{64}$/.test(admission.reportDigest)\n ) {\n return 'admission report identity is invalid';\n }\n for (const key of [\n 'toolId',\n 'descriptorDigest',\n 'recipeDigest',\n 'workloadClass',\n 'codeDigest',\n 'browserVersion',\n 'backend',\n ] as const) {\n if (admission[key] !== expected[key]) return `admission ${key} does not match this run`;\n }\n if (admission.frameCount < 300) return 'admission workload ran fewer than 300 frames';\n if (Object.values(admission.samples).some((count) => count < 30)) {\n return 'admission sample set is incomplete';\n }\n if (\n !admission.correctness.terminalEquivalent ||\n !admission.correctness.artifactIntegrity ||\n !admission.correctness.freshReplay ||\n !admission.correctness.hiddenParity ||\n admission.correctness.drawCalls <= 0 ||\n admission.correctness.nonBlackPixels <= 0\n ) {\n return 'admission correctness gate failed';\n }\n const performance = admission.performance;\n if (\n Object.values(performance).some((value) => !Number.isFinite(value) || value <= 0) ||\n performance.serviceMedianMs > performance.privateMedianMs * 0.8 ||\n performance.serviceP95Ms > performance.privateP95Ms * 0.9 ||\n performance.serviceMaxMs > performance.privateMaxMs * 1.1 ||\n performance.serviceRssBytes > performance.privateRssBytes * 1.25\n ) {\n return 'admission performance threshold failed';\n }\n if (!admission.cleanupPassed) return 'admission cleanup gate failed';\n if (!admission.evictionPassed) return 'admission eviction gate failed';\n return undefined;\n}\n\nexport function createServiceCapability(\n admission: ServiceAdmissionRef | undefined,\n expected: ServiceAdmissionExpectation,\n): ServiceCapability {\n const reason = admissionFailure(admission, expected);\n if (reason === undefined && admission !== undefined) {\n return { available: true, reportDigest: admission.reportDigest };\n }\n return {\n available: false,\n code: 'tool-service-capability-absent',\n expected: 'an admitted acceleration service',\n hint: 'Use the private executor and rerun benchmark admission before enabling service.',\n detail: { reason: reason ?? 'benchmark admission did not pass' },\n };\n}\n\nexport interface RealmCapability {\n readonly realm: ToolRealm;\n readonly supported: boolean;\n readonly reason?: 'realm-capability-unavailable';\n}\n\nexport interface RealmCapabilityMatrix {\n readonly catalogDigest: string;\n readonly realms: Readonly<Record<ToolRealm, RealmCapability>>;\n}\n\nexport interface RealmCapabilityInput {\n readonly catalogDigest: string;\n readonly supported: Readonly<Record<ToolRealm, boolean>>;\n}\n\nexport function createRealmCapabilityMatrix(input: RealmCapabilityInput): RealmCapabilityMatrix {\n const realms = (['build', 'host', 'engine'] as const).reduce(\n (result, realm) => {\n const supported = input.supported[realm];\n result[realm] = supported\n ? { realm, supported: true }\n : { realm, supported: false, reason: 'realm-capability-unavailable' };\n return result;\n },\n {} as Record<ToolRealm, RealmCapability>,\n );\n return { catalogDigest: input.catalogDigest, realms };\n}\n\nexport type RealmBootstrapValidation =\n | { readonly ok: true }\n | { readonly ok: false; readonly error: ToolRuntimeError };\n\nfunction bootstrapNotCloneSafeError(detail: { readonly message: string }): ToolRuntimeError {\n return {\n code: 'tool-bootstrap-not-clone-safe',\n expected: 'bootstrap input to contain structured-clone-safe data',\n hint: 'Remove live handles, functions, ports, and realm-owned objects from bootstrap input.',\n detail,\n };\n}\n\nexport function validateRealmBootstrapPayload(value: unknown): RealmBootstrapValidation {\n try {\n structuredClone(value);\n return { ok: true };\n } catch (cause) {\n return {\n ok: false,\n error: bootstrapNotCloneSafeError({\n message: cause instanceof Error ? cause.message : String(cause),\n }),\n };\n }\n}\n","export type CarrierPhase = 'offered' | 'leased' | 'started' | 'exited' | 'expired' | 'fallback';\n\nexport type CarrierErrorCode =\n | 'carrier-consumer-mismatch'\n | 'carrier-token-invalid'\n | 'carrier-offer-expired'\n | 'carrier-started'\n | 'carrier-exited'\n | 'carrier-lease-required'\n | 'carrier-payload-live-state'\n | 'carrier-descriptor-mismatch'\n | 'carrier-recipe-mismatch'\n | 'carrier-provider-exit'\n | 'carrier-capture-failed'\n | 'carrier-cleanup-failed';\n\nexport interface CarrierError {\n readonly code: CarrierErrorCode;\n readonly expected: string;\n readonly hint: string;\n readonly detail: Readonly<Record<string, unknown>>;\n}\n\nexport interface CarrierOffer {\n readonly schemaVersion: '1.0.0';\n readonly projectId: string;\n readonly consumerId: string;\n readonly offerId: string;\n readonly endpoint: string;\n readonly bearerToken: string;\n readonly livenessToken: string;\n readonly expiresAt: number;\n readonly descriptorDigest?: string;\n readonly recipeDigest?: string;\n readonly state: 'offered';\n}\n\nexport interface CarrierLease {\n readonly leaseId: string;\n readonly offerId: string;\n readonly consumerId: string;\n readonly state: 'leased';\n}\n\nexport interface CarrierState {\n readonly state: CarrierPhase;\n readonly leaseId?: string;\n}\n\nexport interface CarrierStateMachine {\n readonly offer: CarrierOffer;\n readonly lease: {\n (request: CarrierLeaseRequest): CarrierResult<CarrierLease>;\n (leaseId: string, request: CarrierLeaseRequest): CarrierResult<CarrierLease>;\n };\n readonly started: (leaseId: string) => CarrierResult<CarrierState>;\n readonly exit: (leaseId: string) => CarrierResult<CarrierState>;\n readonly fallback: () => CarrierResult<CarrierState>;\n readonly snapshot: () => CarrierState;\n}\n\nexport interface CarrierLeaseRequest {\n readonly consumerId: string;\n readonly bearerToken: string;\n readonly now: number;\n readonly descriptorDigest?: string;\n readonly recipeDigest?: string;\n}\n\nexport type CarrierResult<T> =\n | { readonly ok: true; readonly value: T; readonly state: CarrierPhase }\n | { readonly ok: false; readonly error: CarrierError };\n\nexport interface CarrierStateMachineOptions {\n readonly projectId: string;\n readonly consumerId: string;\n readonly endpoint: string;\n readonly now: number;\n readonly ttlMs: number;\n readonly payload?: unknown;\n readonly descriptorDigest?: string;\n readonly recipeDigest?: string;\n}\n\nfunction token(): string {\n return crypto.randomUUID().replaceAll('-', '');\n}\n\nfunction carrierError(\n code: CarrierErrorCode,\n expected: string,\n hint: string,\n detail: Readonly<Record<string, unknown>>,\n): CarrierError {\n return { code, expected, hint, detail };\n}\n\nfunction containsLiveKey(value: unknown, seen = new Set<object>()): boolean {\n if (typeof value !== 'object' || value === null) return false;\n if (seen.has(value)) return false;\n seen.add(value);\n if (Array.isArray(value)) return value.some((entry) => containsLiveKey(entry, seen));\n return Object.entries(value).some(([key, nested]) => {\n if (\n ['world', 'renderer', 'canvas', 'ui', 'profile', 'liveHandle', 'context', 'fiber'].includes(\n key,\n )\n )\n return true;\n return containsLiveKey(nested, seen);\n });\n}\n\nfunction validateOptions(options: CarrierStateMachineOptions): void {\n if (options.projectId.length === 0 || options.consumerId.length === 0) {\n throw new TypeError('carrier projectId and consumerId must not be empty');\n }\n const endpoint = new URL(options.endpoint);\n if (endpoint.protocol !== 'http:' || !['127.0.0.1', 'localhost'].includes(endpoint.hostname)) {\n throw new TypeError('carrier endpoint must be loopback HTTP');\n }\n if (!Number.isFinite(options.now) || !Number.isFinite(options.ttlMs) || options.ttlMs <= 0) {\n throw new TypeError('carrier clock and ttl must be finite and positive');\n }\n if (containsLiveKey(options.payload)) throw new TypeError('carrier-payload-live-state');\n}\n\nexport function createCarrierStateMachine(\n options: CarrierStateMachineOptions,\n): CarrierStateMachine {\n validateOptions(options);\n const offer: CarrierOffer = {\n schemaVersion: '1.0.0',\n projectId: options.projectId,\n consumerId: options.consumerId,\n offerId: `offer:${token()}`,\n endpoint: options.endpoint,\n bearerToken: token(),\n livenessToken: token(),\n expiresAt: options.now + options.ttlMs,\n ...(options.descriptorDigest === undefined\n ? {}\n : { descriptorDigest: options.descriptorDigest }),\n ...(options.recipeDigest === undefined ? {} : { recipeDigest: options.recipeDigest }),\n state: 'offered',\n };\n let state: CarrierState = { state: 'offered' };\n let lease: CarrierLease | undefined;\n\n const leaseOffer = (\n requestOrId: CarrierLeaseRequest | string,\n maybeRequest?: CarrierLeaseRequest,\n ): CarrierResult<CarrierLease> => {\n const request = typeof requestOrId === 'string' ? maybeRequest : requestOrId;\n const requestedLeaseId = typeof requestOrId === 'string' ? requestOrId : undefined;\n if (request === undefined) {\n return {\n ok: false,\n error: carrierError(\n 'carrier-token-invalid',\n 'a complete lease request',\n 'Provide consumer identity, bearer token, and current time.',\n {},\n ),\n };\n }\n if (state.state === 'started') {\n return {\n ok: false,\n error: carrierError(\n 'carrier-started',\n 'a started carrier not to be retried',\n 'Report one terminal failure and clean up the existing started lease.',\n {},\n ),\n };\n }\n if (state.state === 'exited') {\n return {\n ok: false,\n error: carrierError(\n 'carrier-exited',\n 'an exited carrier not to be retried',\n 'Re-run the operation from a serialized snapshot instead of migrating live state.',\n {},\n ),\n };\n }\n if (request.consumerId !== offer.consumerId) {\n return {\n ok: false,\n error: carrierError(\n 'carrier-consumer-mismatch',\n 'the offer consumer identity to match',\n 'Use the consumer identity that was authenticated for this project offer.',\n { expected: offer.consumerId, actual: request.consumerId },\n ),\n };\n }\n if (request.bearerToken !== offer.bearerToken) {\n return {\n ok: false,\n error: carrierError(\n 'carrier-token-invalid',\n 'the bearer token to match the ephemeral offer',\n 'Request a fresh visible offer; never persist or guess bearer tokens.',\n {},\n ),\n };\n }\n if (\n offer.descriptorDigest !== undefined &&\n request.descriptorDigest !== offer.descriptorDigest\n ) {\n return {\n ok: false,\n error: carrierError(\n 'carrier-descriptor-mismatch',\n 'the descriptor digest to match the authenticated offer',\n 'Refresh the descriptor and request a new visible offer before retrying.',\n { expected: offer.descriptorDigest, actual: request.descriptorDigest },\n ),\n };\n }\n if (offer.recipeDigest !== undefined && request.recipeDigest !== offer.recipeDigest) {\n return {\n ok: false,\n error: carrierError(\n 'carrier-recipe-mismatch',\n 'the recipe digest to match the authenticated offer',\n 'Serialize the current snapshot and request a fresh visible offer before retrying.',\n { expected: offer.recipeDigest, actual: request.recipeDigest },\n ),\n };\n }\n if (request.now >= offer.expiresAt) {\n state = { state: 'expired' };\n return {\n ok: false,\n error: carrierError(\n 'carrier-offer-expired',\n 'the offer to be within its expiry window',\n 'Fall back to the ordinary visible carrier before retrying.',\n { expiresAt: offer.expiresAt, now: request.now },\n ),\n };\n }\n if (requestedLeaseId !== undefined && requestedLeaseId !== lease?.leaseId) {\n return {\n ok: false,\n error: carrierError(\n 'carrier-token-invalid',\n 'the lease id to match the authenticated offer',\n 'Use the lease id returned by the first successful lease.',\n {},\n ),\n };\n }\n lease = {\n leaseId: `lease:${token()}`,\n offerId: offer.offerId,\n consumerId: request.consumerId,\n state: 'leased',\n };\n state = { state: 'leased', leaseId: lease.leaseId };\n return { ok: true, value: lease, state: 'leased' };\n };\n\n const started = (leaseId: string): CarrierResult<CarrierState> => {\n if (lease?.leaseId !== leaseId) {\n return {\n ok: false,\n error: carrierError(\n 'carrier-lease-required',\n 'a valid lease before started',\n 'Lease the authenticated offer before reporting provider started.',\n {},\n ),\n };\n }\n state = { state: 'started', leaseId };\n return { ok: true, value: state, state: 'started' };\n };\n\n const exit = (leaseId: string): CarrierResult<CarrierState> => {\n if (lease?.leaseId !== leaseId || state.state !== 'started') {\n return {\n ok: false,\n error: carrierError(\n 'carrier-lease-required',\n 'a started lease before provider exit',\n 'Provider exit is terminal only after started has been acknowledged.',\n {},\n ),\n };\n }\n state = { state: 'exited', leaseId };\n return { ok: true, value: state, state: 'exited' };\n };\n\n const fallback = (): CarrierResult<CarrierState> => {\n if (state.state === 'started' || state.state === 'exited') {\n return {\n ok: false,\n error: carrierError(\n 'carrier-started',\n 'fallback to happen before provider started',\n 'Do not retry or migrate a carrier after started; return its terminal failure.',\n { state: state.state },\n ),\n };\n }\n state = { state: 'fallback' };\n return { ok: true, value: state, state: 'fallback' };\n };\n\n return {\n offer,\n lease: leaseOffer,\n started,\n exit,\n fallback,\n snapshot: () => state,\n };\n}\n","export type LeaseTerminationReason =\n | 'terminal'\n | 'cancel'\n | 'timeout'\n | 'disconnect'\n | 'provider-exit';\n\nexport interface LeaseCleanupFailure {\n readonly owner: string;\n readonly message: string;\n}\n\nexport interface LeaseTermination {\n readonly terminalId: string;\n readonly reason: LeaseTerminationReason;\n readonly failures: readonly LeaseCleanupFailure[];\n}\n\nexport interface LexicalLease {\n readonly state: 'active' | 'terminating' | 'terminated';\n readonly register: (owner: string, cleanup: () => void | Promise<void>) => boolean;\n readonly terminate: (reason: LeaseTerminationReason) => Promise<LeaseTermination>;\n}\n\nexport function createLexicalLease(runId: string): LexicalLease {\n const cleanups: Array<{ readonly owner: string; readonly cleanup: () => void | Promise<void> }> =\n [];\n let state: LexicalLease['state'] = 'active';\n let terminalId: string | undefined;\n let termination: Promise<LeaseTermination> | undefined;\n\n const terminate = (reason: LeaseTerminationReason): Promise<LeaseTermination> => {\n if (termination !== undefined) return termination;\n terminalId = `${runId}:terminal:${crypto.randomUUID()}`;\n state = 'terminating';\n termination = (async () => {\n const failures: LeaseCleanupFailure[] = [];\n for (let index = cleanups.length - 1; index >= 0; index -= 1) {\n const entry = cleanups[index];\n if (entry === undefined) continue;\n try {\n await entry.cleanup();\n } catch (cause) {\n failures.push({\n owner: entry.owner,\n message: cause instanceof Error ? cause.message : String(cause),\n });\n }\n }\n state = 'terminated';\n return { terminalId: terminalId as string, reason, failures };\n })();\n return termination;\n };\n\n return {\n get state() {\n return state;\n },\n register(owner, cleanup) {\n if (state !== 'active') return false;\n cleanups.push({ owner, cleanup });\n return true;\n },\n terminate,\n };\n}\n","import { isSerializableValue } from './artifacts.js';\nimport { capabilityUnavailableError } from './errors.js';\nimport type {\n ArtifactRef,\n JsonValue,\n SnapshotRef,\n ToolEvidenceKind,\n ToolRealm,\n ToolRuntimeError,\n} from './types.js';\n\nexport type MigrationOperation =\n | 'project.build'\n | 'author.plugin-install'\n | 'preview.run'\n | 'project.preview'\n | 'material.preview'\n | 'mesh.preview'\n | 'vfx.preview'\n | 'texture.preview';\n\nexport interface MigrationCapabilityProbe {\n readonly realm: ToolRealm;\n readonly catalogDigest: string;\n readonly rhiBackend: 'webgpu' | 'null' | 'unknown';\n readonly evidence: readonly ToolEvidenceKind[];\n readonly carrier: boolean;\n readonly service: boolean;\n}\n\nexport interface CapabilityToken {\n readonly kind: 'forgeax-tool-capability';\n readonly version: '1.0.0';\n readonly operation: MigrationOperation;\n readonly source: MigrationCapabilityProbe;\n readonly target: MigrationCapabilityProbe;\n}\n\nexport interface MigrationRecipe {\n readonly operation: MigrationOperation;\n readonly args: JsonValue;\n readonly snapshot?: SnapshotRef;\n readonly artifacts: readonly ArtifactRef[];\n}\n\nexport type MigrationPayloadValidation =\n | { readonly ok: true }\n | { readonly ok: false; readonly error: ToolRuntimeError };\n\nconst liveStateKeys = new Set([\n 'world',\n 'renderer',\n 'canvas',\n 'context',\n 'fiber',\n 'page',\n 'carrier',\n 'ui',\n 'selection',\n 'draft',\n 'undo',\n 'session',\n]);\n\nfunction liveStateError(path: string, key: string): ToolRuntimeError {\n return {\n code: 'tool-migration-live-state',\n expected: 'migration payload to contain only recipe, snapshot, and artifact references',\n hint: 'Recreate the operation from serializable authority facts; do not migrate live state.',\n detail: { path, key },\n };\n}\n\nexport function createCapabilityToken(\n operation: MigrationOperation,\n source: MigrationCapabilityProbe,\n version: '1.0.0',\n target: MigrationCapabilityProbe,\n): CapabilityToken {\n if (source.catalogDigest.length === 0 || target.catalogDigest.length === 0)\n throw new TypeError('capability probe catalogDigest must not be empty');\n return {\n kind: 'forgeax-tool-capability',\n version,\n operation,\n source: { ...source, evidence: [...source.evidence] },\n target: { ...target, evidence: [...target.evidence] },\n };\n}\n\nexport function probeMigrationTarget(\n token: CapabilityToken,\n target: MigrationCapabilityProbe,\n):\n | { readonly ok: true; readonly value: MigrationCapabilityProbe }\n | {\n readonly ok: false;\n readonly error: ToolRuntimeError;\n } {\n const sameEvidence = token.target.evidence.every((kind) => target.evidence.includes(kind));\n const matches =\n token.target.realm === target.realm &&\n token.target.catalogDigest === target.catalogDigest &&\n token.target.rhiBackend === target.rhiBackend &&\n sameEvidence;\n if (!matches) {\n return {\n ok: false,\n error: capabilityUnavailableError(`migration:${token.operation}`, target.realm),\n };\n }\n return { ok: true, value: { ...target, evidence: [...target.evidence] } };\n}\n\nexport function createMigrationRecipe(input: {\n readonly operation: MigrationOperation;\n readonly args: JsonValue;\n readonly snapshot?: SnapshotRef;\n readonly artifacts?: readonly ArtifactRef[];\n}): MigrationRecipe {\n const recipe: MigrationRecipe = {\n operation: input.operation,\n args: input.args,\n ...(input.snapshot === undefined ? {} : { snapshot: { ...input.snapshot } }),\n artifacts: (input.artifacts ?? []).map((artifact) => ({ ...artifact })),\n };\n const validation = validateMigrationPayload(recipe);\n if (!validation.ok) {\n const path =\n validation.error.code === 'tool-migration-live-state' ? validation.error.detail.path : '$';\n throw new TypeError(path);\n }\n return recipe;\n}\n\nexport function validateMigrationPayload(value: unknown): MigrationPayloadValidation {\n const visit = (candidate: unknown, path: string): MigrationPayloadValidation => {\n if (!isSerializableValue(candidate)) {\n return { ok: false, error: liveStateError(path, path.split('.').at(-1) ?? '<root>') };\n }\n if (candidate === null || typeof candidate !== 'object') return { ok: true };\n if (Array.isArray(candidate)) {\n for (const [index, child] of candidate.entries()) {\n const result = visit(child, `${path}[${index}]`);\n if (!result.ok) return result;\n }\n return { ok: true };\n }\n for (const [key, child] of Object.entries(candidate)) {\n const normalized = key.replaceAll('_', '').replaceAll('-', '').toLowerCase();\n if (liveStateKeys.has(normalized)) return { ok: false, error: liveStateError(path, key) };\n const result = visit(child, `${path}.${key}`);\n if (!result.ok) return result;\n }\n return { ok: true };\n };\n return visit(value, '$');\n}\n","import type { ToolPhaseObservation, ToolTiming, ToolTimingPhase } from './types.js';\n\nexport interface ExclusiveTimingResult {\n readonly startedAtMs: number;\n readonly endedAtMs: number;\n readonly totalMs: number;\n readonly phases: Readonly<Record<ToolTimingPhase, ToolPhaseObservation>>;\n}\n\nexport interface ExclusiveTiming {\n begin(phase: ToolTimingPhase): void;\n end(phase: ToolTimingPhase): void;\n record(phase: ToolTimingPhase, durationMs: number): void;\n finish(): ExclusiveTimingResult;\n}\n\nconst PHASES: readonly ToolTimingPhase[] = [\n 'lookup',\n 'lease',\n 'transport',\n 'execute',\n 'capture',\n 'finalize',\n 'analyze',\n];\n\nexport function createExclusiveTiming(\n now: () => number = () => performance.now(),\n): ExclusiveTiming {\n const phases = Object.fromEntries(\n PHASES.map((phase) => [phase, { status: 'not-applicable' }]),\n ) as Record<ToolTimingPhase, ToolPhaseObservation>;\n const closed = new Set<ToolTimingPhase>();\n let active: { phase: ToolTimingPhase; startedAtMs: number } | undefined;\n let startedAtMs: number | undefined;\n let endedAtMs: number | undefined;\n return {\n begin(phase) {\n if (active !== undefined) throw new TypeError(`phase '${active.phase}' is still open`);\n if (closed.has(phase)) throw new TypeError(`phase '${phase}' was already closed`);\n const at = now();\n startedAtMs ??= at;\n active = { phase, startedAtMs: at };\n },\n end(phase) {\n if (active?.phase !== phase) throw new TypeError(`phase '${phase}' is not the active phase`);\n const at = now();\n phases[phase] = { status: 'observed', durationMs: Math.max(0, at - active.startedAtMs) };\n closed.add(phase);\n active = undefined;\n endedAtMs = at;\n },\n record(phase, durationMs) {\n if (!Number.isFinite(durationMs) || durationMs < 0)\n throw new TypeError('phase duration must be finite and non-negative');\n if (closed.has(phase)) throw new TypeError(`phase '${phase}' was already closed`);\n const at = now();\n startedAtMs ??= at - durationMs;\n phases[phase] = { status: 'observed', durationMs };\n closed.add(phase);\n endedAtMs = at;\n },\n finish() {\n if (active !== undefined) throw new TypeError(`phase '${active.phase}' is still open`);\n const start = startedAtMs ?? now();\n const end = endedAtMs ?? start;\n return {\n startedAtMs: start,\n endedAtMs: end,\n totalMs: Math.max(0, end - start),\n phases: { ...phases },\n };\n },\n };\n}\n\nexport function startToolTiming(): number {\n return performance.now();\n}\n\nexport function finishToolTiming(\n startedAtMs: number,\n operationTiming?: ExclusiveTiming,\n): ToolTiming {\n const endedAtMs = performance.now();\n const result = operationTiming?.finish();\n const durationMs = Math.max(0, endedAtMs - startedAtMs);\n const attributedMs =\n result === undefined\n ? 0\n : Object.values(result.phases).reduce(\n (sum, observation) =>\n observation.status === 'observed' ? sum + observation.durationMs : sum,\n 0,\n );\n return {\n startedAtMs,\n endedAtMs,\n durationMs,\n ...(result === undefined\n ? {}\n : { phases: result.phases, unattributedMs: Math.max(0, durationMs - attributedMs) }),\n };\n}\n","import { isSerializableValue, validateArtifactRefs } from './artifacts.js';\nimport {\n artifactIncompleteError,\n cancellationError,\n capabilityUnavailableError,\n cleanupError,\n disconnectedError,\n domainFailureError,\n invalidArgsError,\n terminalError,\n timeoutError,\n} from './errors.js';\nimport { createLexicalLease, type LeaseTerminationReason } from './lease.js';\nimport { createExclusiveTiming, finishToolTiming, startToolTiming } from './timing.js';\nimport type {\n JsonValue,\n ToolCapability,\n ToolCleanupReport,\n ToolContribution,\n ToolDescriptor,\n ToolDomainFailure,\n ToolExecutionContext,\n ToolExecutor,\n ToolRun,\n ToolRunEvent,\n ToolRunOptions,\n ToolRuntimeError,\n ToolSchema,\n ToolTerminal,\n} from './types.js';\n\nexport interface ToolRuntime {\n readonly list: () => readonly ToolDescriptor[];\n readonly describe: (id: string) => ToolDescriptor | undefined;\n readonly get: (id: string) => ToolContribution<unknown, unknown> | undefined;\n readonly run: <TArgs, TResult>(\n contribution: ToolContribution<TArgs, TResult>,\n args: TArgs,\n options?: ToolRunOptions,\n ) => ToolRun<TResult>;\n}\n\nexport function defineTool<TArgs, TResult>(\n descriptor: ToolDescriptor<TArgs, TResult>,\n execute: ToolExecutor<TArgs, TResult>,\n): ToolContribution<TArgs, TResult> {\n if (!/^[a-z][a-z0-9]*(?:[._-][a-z0-9]+)*$/.test(descriptor.id)) {\n throw new TypeError(`Tool id must use a stable lower-case path: ${descriptor.id}`);\n }\n if (descriptor.title.trim().length === 0 || descriptor.summary.trim().length === 0) {\n throw new TypeError('Tool title and summary must not be empty');\n }\n if (!Array.isArray(descriptor.evidence)) throw new TypeError('Tool evidence must be an array');\n if (descriptor.preview !== undefined && descriptor.preview.realm !== descriptor.realm) {\n throw new TypeError(\n `Tool ${descriptor.id} preview contract declares ${descriptor.preview.realm} but descriptor declares ${descriptor.realm}`,\n );\n }\n const argsSchema: ToolSchema<TArgs> = descriptor.argsSchema;\n const resultSchema: ToolSchema<TResult> = descriptor.resultSchema;\n return {\n descriptor: { ...descriptor, argsSchema, resultSchema, evidence: [...descriptor.evidence] },\n execute,\n };\n}\n\nfunction eventChannel(): {\n readonly emit: (event: ToolRunEvent) => void;\n readonly close: () => void;\n readonly events: AsyncIterable<ToolRunEvent>;\n} {\n const queue: ToolRunEvent[] = [];\n const waiters: Array<(result: IteratorResult<ToolRunEvent>) => void> = [];\n let closed = false;\n const emit = (event: ToolRunEvent): void => {\n const waiter = waiters.shift();\n if (waiter !== undefined) waiter({ done: false, value: event });\n else queue.push(event);\n };\n const close = (): void => {\n closed = true;\n while (waiters.length > 0) waiters.shift()?.({ done: true, value: undefined });\n };\n const events: AsyncIterable<ToolRunEvent> = {\n [Symbol.asyncIterator](): AsyncIterator<ToolRunEvent> {\n return {\n next: async (): Promise<IteratorResult<ToolRunEvent>> => {\n const event = queue.shift();\n if (event !== undefined) return { done: false, value: event };\n if (closed) return { done: true, value: undefined };\n return new Promise((resolve) => waiters.push(resolve));\n },\n };\n },\n };\n return { emit, close, events };\n}\n\nfunction isTerminal<TResult>(value: unknown): value is ToolTerminal<TResult> {\n if (typeof value !== 'object' || value === null) return false;\n const outcome = Reflect.get(value, 'outcome');\n return outcome === 'succeeded' || outcome === 'failed';\n}\n\nfunction serializablePreview(value: unknown): JsonValue {\n return isSerializableValue(value) ? value : null;\n}\n\nfunction domainError(error: ToolDomainFailure): ToolRuntimeError {\n return domainFailureError(\n error.code,\n error.expected ?? 'the producer operation to succeed',\n error.hint ?? 'Inspect detail and repair the owning producer before retrying.',\n error.detail,\n );\n}\n\nfunction hasOkField(value: unknown): value is { readonly ok: boolean } {\n return (\n typeof value === 'object' && value !== null && typeof Reflect.get(value, 'ok') === 'boolean'\n );\n}\n\nfunction isToolRuntimeError(value: unknown): value is ToolRuntimeError {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof Reflect.get(value, 'code') === 'string' &&\n Reflect.get(value, 'code').startsWith('tool-')\n );\n}\n\nexport function createToolRuntime<TArgs, TResult>(\n contributions: readonly ToolContribution<TArgs, TResult>[],\n): ToolRuntime;\nexport function createToolRuntime(contributions: readonly unknown[]): ToolRuntime;\nexport function createToolRuntime(contributions: readonly unknown[]): ToolRuntime {\n const byId = new Map<string, ToolContribution<unknown, unknown>>();\n for (const candidate of contributions) {\n if (typeof candidate !== 'object' || candidate === null) {\n throw new TypeError('Tool contributions must be objects');\n }\n const contribution = candidate as ToolContribution<unknown, unknown>;\n if (typeof contribution.execute !== 'function') {\n throw new TypeError('Tool contributions must provide an executor');\n }\n const id = contribution.descriptor.id;\n if (byId.has(id)) throw new TypeError(`Duplicate tool contribution id: ${id}`);\n byId.set(id, contribution);\n }\n\n const list = (): readonly ToolDescriptor[] =>\n [...byId.values()].map((contribution) => contribution.descriptor);\n\n const run = <TArgs, TResult>(\n contribution: ToolContribution<TArgs, TResult>,\n args: TArgs,\n options: ToolRunOptions = {},\n ): ToolRun<TResult> => {\n const runId = `${contribution.descriptor.id}:${crypto.randomUUID()}`;\n const channel = eventChannel();\n const controller = new AbortController();\n const startedAtMs = startToolTiming();\n const operationTiming = createExclusiveTiming();\n const lookupStartedAtMs = startToolTiming();\n operationTiming.record('lookup', Math.max(0, startToolTiming() - lookupStartedAtMs));\n const lease = createLexicalLease(runId);\n const leaseStartedAtMs = startToolTiming();\n operationTiming.record('lease', Math.max(0, startToolTiming() - leaseStartedAtMs));\n let terminalStarted = false;\n let cleanupReport: ToolCleanupReport = {\n census: { worlds: 0, renderers: 0, canvases: 0, leases: 0 },\n failures: [],\n };\n let cancelReason = 'cancelled by caller';\n let resolveTerminal!: (terminal: ToolTerminal<TResult>) => void;\n const terminal = new Promise<ToolTerminal<TResult>>((resolve) => {\n resolveTerminal = resolve;\n });\n\n const settle = async (\n candidate: ToolTerminal<TResult>,\n reason: LeaseTerminationReason = 'terminal',\n ): Promise<void> => {\n if (terminalStarted) return;\n terminalStarted = true;\n controller.abort();\n const finalizeStartedAtMs = startToolTiming();\n const cleanupResult = await lease.terminate(reason);\n const cleanupFailure = cleanupResult.failures[0];\n const liveResources = Object.entries(cleanupReport.census).filter(([, count]) => count !== 0);\n const reportFailure =\n cleanupReport.failures[0] ??\n (liveResources.length === 0\n ? undefined\n : `live resources remain: ${liveResources.map(([kind, count]) => `${kind}=${count}`).join(', ')}`);\n operationTiming.record('finalize', Math.max(0, startToolTiming() - finalizeStartedAtMs));\n const finalTerminal: ToolTerminal<TResult> =\n cleanupFailure || (candidate.outcome === 'succeeded' && reportFailure !== undefined)\n ? {\n outcome: 'failed',\n failure: cleanupError(\n runId,\n cleanupFailure === undefined\n ? (reportFailure as string)\n : `${cleanupFailure.owner}: ${cleanupFailure.message}`,\n ),\n artifacts: candidate.artifacts,\n cleanup: cleanupReport,\n ...(candidate.snapshotAfter === undefined\n ? {}\n : { snapshotAfter: candidate.snapshotAfter }),\n timing: finishToolTiming(startedAtMs, operationTiming),\n }\n : {\n ...candidate,\n cleanup: cleanupReport,\n timing: finishToolTiming(startedAtMs, operationTiming),\n };\n resolveTerminal(finalTerminal);\n channel.emit({\n kind: 'terminal',\n runId,\n outcome: finalTerminal.outcome,\n atMs: performance.now(),\n });\n channel.close();\n };\n\n const context: ToolExecutionContext = {\n runId,\n signal: controller.signal,\n ...(options.snapshot === undefined ? {} : { snapshot: options.snapshot }),\n emit: (event) => {\n if (!terminalStarted) channel.emit({ ...event, runId });\n },\n addCleanup: (cleanup) => {\n if (!lease.register(`cleanup:${lease.state}`, cleanup)) void cleanup();\n },\n setCleanupReport: (report) => {\n cleanupReport = {\n census: { ...report.census },\n failures: [...report.failures],\n };\n },\n require: <T>(capability: ToolCapability<T>) => {\n if (terminalStarted) {\n return { ok: false as const, error: terminalError(runId, 'succeeded') };\n }\n const resolved = options.capabilityResolver?.(capability);\n if (resolved !== undefined) return resolved;\n return {\n ok: false as const,\n error: capabilityUnavailableError(capability.id, contribution.descriptor.realm),\n };\n },\n runChild: async (childContribution, childArgs, childOptions = {}) => {\n if (terminalStarted) {\n return {\n outcome: 'failed',\n failure: terminalError(runId, 'failed'),\n artifacts: [],\n };\n }\n const childRun = runtime.run(childContribution, childArgs, {\n ...childOptions,\n signal: controller.signal,\n ...(childOptions.capabilityResolver === undefined &&\n options.capabilityResolver !== undefined\n ? { capabilityResolver: options.capabilityResolver }\n : {}),\n ...(options.snapshot === undefined ? {} : { snapshot: options.snapshot }),\n });\n channel.emit({\n kind: 'child-started',\n runId,\n childRunId: childRun.id,\n atMs: performance.now(),\n });\n lease.register(`child:${childRun.id}`, () => {\n childRun.cancel('parent terminal');\n });\n return childRun.terminal;\n },\n };\n\n const fail = (failure: ToolRuntimeError): void => {\n void settle({ outcome: 'failed', failure, artifacts: [] });\n };\n\n const cancel = (reason = 'cancelled by caller'): void => {\n cancelReason = reason;\n void settle(\n { outcome: 'failed', failure: cancellationError(reason), artifacts: [] },\n 'cancel',\n );\n };\n\n const disconnect = (transport = 'tool transport'): void => {\n void settle(\n { outcome: 'failed', failure: disconnectedError(transport), artifacts: [] },\n 'disconnect',\n );\n };\n\n const providerExit = (provider = 'provider'): void => {\n void settle(\n {\n outcome: 'failed',\n failure: domainFailureError(\n 'provider-exit',\n 'the provider to remain alive until terminal',\n 'Restart the provider and retry from the serialized snapshot.',\n provider,\n ),\n artifacts: [],\n },\n 'provider-exit',\n );\n };\n\n const timeout =\n options.deadlineMs === undefined\n ? undefined\n : setTimeout(\n () =>\n void settle(\n {\n outcome: 'failed',\n failure: timeoutError(options.deadlineMs as number),\n artifacts: [],\n },\n 'timeout',\n ),\n options.deadlineMs,\n );\n\n channel.emit({ kind: 'started', runId, atMs: performance.now() });\n void (async () => {\n const parsedArgs = contribution.descriptor.argsSchema.parse(args);\n if (!parsedArgs.ok) {\n fail(invalidArgsError(parsedArgs.error, serializablePreview(args)));\n return;\n }\n try {\n if (options.signal?.aborted) {\n cancelReason = 'aborted by caller';\n fail(cancellationError(cancelReason));\n return;\n }\n const onAbort = (): void => cancel('aborted by caller');\n options.signal?.addEventListener('abort', onAbort, { once: true });\n let produced: unknown;\n const executeStartedAtMs = startToolTiming();\n try {\n produced = await contribution.execute(parsedArgs.value, context);\n } finally {\n operationTiming.record('execute', Math.max(0, startToolTiming() - executeStartedAtMs));\n options.signal?.removeEventListener('abort', onAbort);\n }\n if (terminalStarted) return;\n if (controller.signal.aborted) {\n fail(cancellationError(cancelReason));\n return;\n }\n let result: unknown = produced;\n let snapshotAfter = options.snapshot;\n let artifacts: readonly import('./types.js').ArtifactRef[] = [];\n if (isTerminal<TResult>(produced)) {\n if (produced.outcome === 'failed') {\n await settle(produced);\n return;\n }\n result = produced.result;\n snapshotAfter = produced.snapshotAfter;\n artifacts = produced.artifacts;\n cleanupReport = produced.cleanup ?? cleanupReport;\n } else if (hasOkField(produced)) {\n if (produced.ok === false) {\n const error = Reflect.get(produced, 'error');\n if (isToolRuntimeError(error)) {\n await settle({ outcome: 'failed', failure: error, artifacts: [] });\n return;\n }\n await settle({\n outcome: 'failed',\n failure: domainError(error as ToolDomainFailure),\n artifacts: [],\n });\n return;\n }\n result = Reflect.get(produced, 'value');\n snapshotAfter = Reflect.get(produced, 'snapshotAfter');\n artifacts = Reflect.get(produced, 'artifacts') ?? [];\n }\n if (!isSerializableValue(result)) {\n await settle({\n outcome: 'failed',\n failure: domainFailureError(\n 'terminal-not-serializable',\n 'the result to be JSON serializable',\n 'Return plain JSON data and ArtifactRef values instead of live handles.',\n ),\n artifacts: [],\n });\n return;\n }\n const parsedResult = contribution.descriptor.resultSchema.parse(result);\n if (!parsedResult.ok) {\n await settle({\n outcome: 'failed',\n failure: domainFailureError(\n 'result-schema-invalid',\n 'the result to satisfy resultSchema',\n parsedResult.error,\n ),\n artifacts: [],\n });\n return;\n }\n if (!validateArtifactRefs(artifacts)) {\n await settle({\n outcome: 'failed',\n failure: domainFailureError(\n 'artifact-ref-invalid',\n 'artifact refs to be serializable ArtifactRef values',\n 'Return refs created by createArtifactRef.',\n ),\n artifacts: [],\n });\n return;\n }\n const requiredEvidence = [\n ...new Set([...(contribution.descriptor.evidence ?? []), ...(options.evidence ?? [])]),\n ];\n const missingEvidence = requiredEvidence.filter(\n (kind) => !artifacts.some((artifact) => artifact.kind === kind),\n );\n if (missingEvidence.length > 0) {\n await settle({\n outcome: 'failed',\n failure: artifactIncompleteError(missingEvidence, runId),\n artifacts,\n });\n return;\n }\n await settle({\n outcome: 'succeeded',\n result: parsedResult.value,\n artifacts,\n ...(snapshotAfter === undefined ? {} : { snapshotAfter }),\n });\n } catch (cause) {\n await settle({\n outcome: 'failed',\n failure: domainFailureError(\n 'executor-threw',\n 'the contribution executor to return a result',\n cause instanceof Error ? cause.message : String(cause),\n ),\n artifacts: [],\n });\n } finally {\n if (timeout !== undefined) clearTimeout(timeout);\n }\n })();\n\n const runtimeRun: ToolRun<TResult> = {\n id: runId,\n events: channel.events,\n terminal,\n cancel,\n disconnect,\n providerExit,\n };\n return runtimeRun;\n };\n\n const runtime: ToolRuntime = {\n list,\n describe: (id) => byId.get(id)?.descriptor,\n get: (id) => byId.get(id),\n run,\n };\n return runtime;\n}\n","import type { SnapshotRef, ToolTerminal } from './types.js';\n\nexport function terminalSnapshot<TResult>(\n terminal: ToolTerminal<TResult>,\n): SnapshotRef | undefined {\n return terminal.snapshotAfter;\n}\n\nexport function isSnapshotRef(value: unknown): value is SnapshotRef {\n return (\n typeof value === 'object' &&\n value !== null &&\n Number.isSafeInteger(Reflect.get(value, 'revision')) &&\n Reflect.get(value, 'revision') >= 0 &&\n typeof Reflect.get(value, 'digest') === 'string' &&\n Reflect.get(value, 'digest').length > 0\n );\n}\n","import { validateRealmBootstrapPayload } from './capability.js';\nimport type {\n CarrierLease,\n CarrierLeaseRequest,\n CarrierPhase,\n CarrierResult,\n CarrierState,\n} from './carrier.js';\nimport type { JsonValue, ToolTerminal } from './types.js';\n\nexport interface CarrierTransport {\n readonly endpoint: string;\n readonly connected: boolean;\n readonly send: (payload: unknown) => boolean;\n readonly close: () => void;\n}\n\nexport interface CarrierExecutionRequest {\n readonly leaseId: string;\n readonly descriptorDigest: string;\n readonly recipeDigest: string;\n readonly args: unknown;\n}\n\nexport interface AuthenticatedCarrierTransport {\n readonly endpoint: string;\n readonly connected: boolean;\n readonly lease: (request: CarrierLeaseRequest) => Promise<CarrierResult<CarrierLease>>;\n readonly started: (request: { readonly leaseId: string }) => Promise<CarrierResult<CarrierState>>;\n readonly execute: (request: CarrierExecutionRequest) => Promise<{\n readonly ok: true;\n readonly value: ToolTerminal<unknown>;\n readonly state: CarrierPhase;\n }>;\n readonly exit: (request: { readonly leaseId: string }) => Promise<CarrierResult<CarrierState>>;\n readonly close: () => void;\n}\n\nexport interface AuthenticatedCarrierTransportOptions {\n readonly endpoint: string;\n readonly bearerToken: string;\n}\n\nexport class CarrierTransportError extends Error {\n readonly code: string;\n readonly expected?: string;\n readonly hint?: string;\n readonly detail?: Readonly<Record<string, unknown>>;\n\n constructor(error: {\n readonly code: string;\n readonly expected?: string;\n readonly hint?: string;\n readonly detail?: Readonly<Record<string, unknown>>;\n }) {\n super(error.code);\n this.name = 'CarrierTransportError';\n this.code = error.code;\n if (error.expected !== undefined) this.expected = error.expected;\n if (error.hint !== undefined) this.hint = error.hint;\n if (error.detail !== undefined) this.detail = error.detail;\n }\n}\n\nexport function createAuthenticatedCarrierTransport(\n options: AuthenticatedCarrierTransportOptions,\n): AuthenticatedCarrierTransport {\n const url = new URL(options.endpoint);\n if (url.protocol !== 'http:' || !['127.0.0.1', 'localhost'].includes(url.hostname))\n throw new TypeError('carrier transport endpoint must be loopback HTTP');\n if (options.bearerToken.length < 8) throw new TypeError('carrier bearer token is too short');\n let connected = true;\n async function request<T>(path: string, payload: unknown): Promise<T> {\n if (!connected)\n throw new CarrierTransportError({\n code: 'carrier-exited',\n expected: 'a connected carrier transport',\n hint: 'Request a fresh visible offer after provider exit.',\n });\n let response: Response;\n try {\n response = await fetch(`${options.endpoint}${path}`, {\n method: 'POST',\n headers: {\n authorization: `Bearer ${options.bearerToken}`,\n 'content-type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n } catch (cause) {\n throw new CarrierTransportError({\n code: 'carrier-provider-exit',\n expected: 'the carrier provider to remain reachable',\n hint: 'Offer a fresh carrier; do not fallback after started.',\n detail: { cause: cause instanceof Error ? cause.message : String(cause) },\n });\n }\n const value: unknown = await response.json().catch(() => ({}));\n if (\n !response.ok ||\n typeof value !== 'object' ||\n value === null ||\n !('ok' in value) ||\n value.ok !== true\n ) {\n const error =\n typeof value === 'object' &&\n value !== null &&\n 'error' in value &&\n typeof value.error === 'object' &&\n value.error !== null\n ? (value.error as Record<string, unknown>)\n : {\n code: 'carrier-provider-exit',\n expected: 'a successful carrier response',\n hint: 'Offer a fresh carrier and retry from a serialized snapshot.',\n };\n const normalized = {\n code: typeof error.code === 'string' ? error.code : 'carrier-provider-exit',\n ...(typeof error.expected === 'string' ? { expected: error.expected } : {}),\n ...(typeof error.hint === 'string' ? { hint: error.hint } : {}),\n ...(typeof error.detail === 'object' && error.detail !== null\n ? { detail: error.detail as Readonly<Record<string, unknown>> }\n : {}),\n };\n throw new CarrierTransportError(normalized);\n }\n return value as T;\n }\n return {\n endpoint: options.endpoint,\n get connected() {\n return connected;\n },\n lease: (payload) => request('/lease', payload),\n started: (payload) => request('/start', payload),\n execute: (payload) => request('/execute', payload),\n exit: (payload) => request('/exit', payload),\n close() {\n connected = false;\n },\n };\n}\n\n/** Minimal loopback transport seam; it carries POD only and owns no operation state. */\nexport function createLoopbackTransport(endpoint: string): CarrierTransport {\n const url = new URL(endpoint);\n if (url.protocol !== 'http:' || !['127.0.0.1', 'localhost'].includes(url.hostname)) {\n throw new TypeError('carrier transport endpoint must be loopback HTTP');\n }\n let connected = true;\n return {\n endpoint,\n get connected() {\n return connected;\n },\n send(payload) {\n if (!connected || !validateRealmBootstrapPayload(payload).ok) return false;\n return true;\n },\n close() {\n connected = false;\n },\n };\n}\n\nexport interface ServiceWireRequest {\n readonly descriptorDigest: string;\n readonly recipeDigest: string;\n readonly args: JsonValue;\n}\n\nexport type ServiceWireHandler = (\n request: ServiceWireRequest,\n) => Promise<ToolTerminal<unknown>> | ToolTerminal<unknown>;\n\nexport interface AuthenticatedLoopbackTransport {\n readonly endpoint: string;\n readonly connected: boolean;\n readonly request: (\n request: ServiceWireRequest,\n bearerToken: string,\n options?: { readonly signal?: AbortSignal },\n ) => Promise<ToolTerminal<unknown>>;\n readonly close: () => void;\n}\n\nexport interface AuthenticatedLoopbackTransportOptions {\n readonly endpoint: string;\n readonly bearerToken: string;\n}\n\nexport function createAuthenticatedLoopbackTransport(\n options: AuthenticatedLoopbackTransportOptions,\n): AuthenticatedLoopbackTransport {\n const url = new URL(options.endpoint);\n if (url.protocol !== 'http:' || !['127.0.0.1', 'localhost'].includes(url.hostname)) {\n throw new TypeError('service transport endpoint must be loopback HTTP');\n }\n if (options.bearerToken.length < 8) throw new TypeError('service bearer token is too short');\n let connected = true;\n return {\n endpoint: options.endpoint,\n get connected() {\n return connected;\n },\n async request(request, bearerToken, requestOptions = {}) {\n if (!connected) throw new Error('service transport is disconnected');\n if (bearerToken !== options.bearerToken) throw new Error('service bearer token rejected');\n if (!validateRealmBootstrapPayload(request).ok) {\n throw new Error('service request is not structured-clone safe');\n }\n const response = await fetch(options.endpoint, {\n method: 'POST',\n headers: {\n authorization: `Bearer ${bearerToken}`,\n 'content-type': 'application/json',\n },\n body: JSON.stringify(request),\n ...(requestOptions.signal === undefined ? {} : { signal: requestOptions.signal }),\n });\n const payload: unknown = await response.json();\n if (!response.ok) {\n const detail =\n typeof payload === 'object' && payload !== null && 'error' in payload\n ? String(payload.error)\n : `HTTP ${response.status}`;\n throw new Error(`service request failed: ${detail}`);\n }\n return payload as ToolTerminal<unknown>;\n },\n close() {\n connected = false;\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/artifacts.ts","../src/capability.ts","../src/carrier.ts","../src/lease.ts","../src/timing.ts","../src/runtime.ts","../src/command-tree.ts","../src/json-schema.ts","../src/migration.ts","../src/snapshot.ts","../src/transport.ts"],"names":["performance","token"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { JsonValue, ToolEvidenceKind, ToolRealm, ToolRuntimeError } from './types.js';\n\nexport function invalidArgsError(message: string, value: JsonValue): ToolRuntimeError {\n return {\n code: 'tool-invalid-args',\n expected: 'arguments accepted by the contribution argsSchema',\n hint: 'Read the descriptor schema and retry with typed arguments.',\n detail: { message, value },\n };\n}\n\nexport function capabilityUnavailableError(capability: string, realm: ToolRealm): ToolRuntimeError {\n return {\n code: 'tool-capability-unavailable',\n expected: `capability ${capability} in realm ${realm}`,\n hint: 'Inspect the capability matrix and select an available realm or path.',\n detail: { capability, realm },\n };\n}\n\nexport function snapshotStaleError(expectedDigest: string, actualDigest: string): ToolRuntimeError {\n return {\n code: 'tool-snapshot-stale',\n expected: 'the supplied snapshot to match the current authority',\n hint: 'Refresh the authority snapshot and retry the write.',\n detail: { expectedDigest, actualDigest },\n };\n}\n\nexport function domainFailureError(\n code: string,\n expected = 'the producer operation to succeed',\n hint = 'Inspect detail and repair the owning producer before retrying.',\n payload?: JsonValue,\n): ToolRuntimeError {\n return {\n code: 'tool-domain-failed',\n expected,\n hint,\n detail: { code, ...(payload === undefined ? {} : { payload }) },\n };\n}\n\nexport function artifactIncompleteError(\n missing: readonly ToolEvidenceKind[],\n runId: string,\n): ToolRuntimeError {\n return {\n code: 'tool-artifact-incomplete',\n expected: 'the requested evidence artifacts to be produced by their owners',\n hint: 'Request only supported evidence and inspect the artifact manifest before retrying.',\n detail: { missing: [...missing], runId },\n };\n}\n\nexport function cancellationError(reason: string): ToolRuntimeError {\n return {\n code: 'tool-run-cancelled',\n expected: 'the tool run not to be cancelled',\n hint: 'Retry the command after resolving the cancellation source.',\n detail: { reason },\n };\n}\n\nexport function timeoutError(deadlineMs: number): ToolRuntimeError {\n return {\n code: 'tool-run-timeout',\n expected: `the tool run to complete within ${deadlineMs}ms`,\n hint: 'Increase the deadline only when the operation is expected to be bounded.',\n detail: { deadlineMs },\n };\n}\n\nexport function disconnectedError(transport: string): ToolRuntimeError {\n return {\n code: 'tool-run-disconnected',\n expected: 'the tool transport to remain connected',\n hint: 'Reconnect the transport and retry from the last serialized snapshot.',\n detail: { transport },\n };\n}\n\nexport function terminalError(runId: string, outcome: 'succeeded' | 'failed'): ToolRuntimeError {\n return {\n code: 'tool-run-terminal',\n expected: 'a non-terminal ToolRun',\n hint: 'Use the existing terminal and do not attach another executor.',\n detail: { runId, outcome },\n };\n}\n\nexport function cleanupError(runId: string, message: string): ToolRuntimeError {\n return {\n code: 'tool-cleanup-failed',\n expected: 'all ToolRun cleanup callbacks to complete',\n hint: 'Inspect the cleanup detail and release the owning resource.',\n detail: { runId, message },\n };\n}\n\nexport function artifactManifestError(\n expected: string,\n hint: string,\n detail: { readonly reason: string; readonly runId?: string },\n): ToolRuntimeError {\n return { code: 'tool-artifact-manifest-invalid', expected, hint, detail };\n}\n\nexport function timingError(reason: string): ToolRuntimeError {\n return {\n code: 'tool-timing-invalid',\n expected: 'exclusive timing phases to be opened and closed once without overlap',\n hint: 'close the current phase before starting the next phase and finish only after all phases close',\n detail: { reason },\n };\n}\n","import { artifactManifestError } from './errors.js';\nimport type { ArtifactRef, JsonValue, SnapshotRef, ToolEvidenceKind } from './types.js';\n\nexport type PreviewArtifactRole =\n | 'report'\n | 'rhi-tape'\n | 'capture'\n | 'fresh-replay'\n | 'profile-capture'\n | 'contact-sheet';\n\nexport type PreviewArtifactKind =\n | 'report'\n | 'rhi-tape'\n | 'png'\n | 'profile-capture'\n | 'contact-sheet';\n\nexport interface PreviewArtifactIdentity {\n readonly runId: string;\n readonly snapshotDigest: string;\n readonly subjectDigest: string;\n readonly presentationDigest: string;\n readonly captureId: string;\n readonly frameId: number;\n}\n\nexport interface PreviewArtifactManifestEntry {\n readonly owner: string;\n readonly kind: PreviewArtifactKind;\n readonly role: PreviewArtifactRole;\n readonly uri: string;\n readonly digest: string;\n readonly byteLength: number;\n readonly mediaType: string;\n readonly derivedFrom: readonly string[];\n}\n\nexport interface PreviewArtifactManifest {\n readonly schemaVersion: '2.0.0';\n readonly identity: PreviewArtifactIdentity;\n readonly artifacts: readonly PreviewArtifactManifestEntry[];\n}\n\nexport type PreviewArtifactManifestValidation =\n | { readonly ok: true; readonly value: PreviewArtifactManifest }\n | { readonly ok: false; readonly error: ReturnType<typeof artifactManifestError> };\n\nexport interface ToolArtifactIdentity {\n readonly runId: string;\n readonly snapshotDigest: string;\n readonly stepId: string;\n readonly frameId: number;\n readonly captureId: string;\n}\n\nexport interface ToolArtifactManifestEntry {\n readonly owner: string;\n readonly kind: ToolEvidenceKind;\n readonly uri: string;\n readonly digest: string;\n readonly byteLength: number;\n readonly mediaType?: string;\n readonly derivedFrom?: readonly string[];\n}\n\nexport interface ToolArtifactManifest {\n readonly schemaVersion: '1.0.0';\n readonly identity: ToolArtifactIdentity;\n readonly artifacts: readonly ToolArtifactManifestEntry[];\n}\n\nexport type ArtifactManifestValidation =\n | { readonly ok: true; readonly value: ToolArtifactManifest }\n | { readonly ok: false; readonly error: ReturnType<typeof artifactManifestError> };\n\nexport function createArtifactManifest(manifest: ToolArtifactManifest): ToolArtifactManifest {\n const result = validateArtifactManifest(manifest, []);\n if (!result.ok) throw new TypeError('artifact manifest is invalid');\n return {\n schemaVersion: '1.0.0',\n identity: { ...manifest.identity },\n artifacts: manifest.artifacts.map((artifact) => ({ ...artifact })),\n };\n}\n\nexport function validateArtifactManifest(\n manifest: ToolArtifactManifest,\n required: readonly ToolEvidenceKind[],\n): ArtifactManifestValidation {\n const fail = (reason: string, expected: string): ArtifactManifestValidation => ({\n ok: false,\n error: artifactManifestError(\n expected,\n 'regenerate the complete manifest from the owning producers',\n {\n reason,\n ...(typeof manifest?.identity?.runId === 'string'\n ? { runId: manifest.identity.runId }\n : {}),\n },\n ),\n });\n if (manifest?.schemaVersion !== '1.0.0')\n return fail('unsupported schemaVersion', 'schemaVersion === \"1.0.0\"');\n const identity = manifest.identity;\n if (\n identity === undefined ||\n identity.runId.length === 0 ||\n identity.snapshotDigest.length === 0 ||\n identity.stepId.length === 0 ||\n identity.captureId.length === 0 ||\n !Number.isSafeInteger(identity.frameId) ||\n identity.frameId < 0\n )\n return fail(\n 'identity is incomplete',\n 'runId/snapshotDigest/stepId/captureId and non-negative frameId',\n );\n const seen = new Set<ToolEvidenceKind>();\n for (const artifact of manifest.artifacts) {\n if (\n artifact.owner.length === 0 ||\n artifact.uri.length === 0 ||\n artifact.digest.length === 0 ||\n !Number.isSafeInteger(artifact.byteLength) ||\n artifact.byteLength < 0\n )\n return fail(\n `invalid ${artifact.kind} artifact entry`,\n 'owner/uri/digest and byteLength are complete',\n );\n if (seen.has(artifact.kind))\n return fail(\n `duplicate artifact kind '${artifact.kind}'`,\n 'one owner entry per evidence kind',\n );\n seen.add(artifact.kind);\n }\n for (const kind of required)\n if (!seen.has(kind))\n return fail(\n `missing artifact kind '${kind}'`,\n `manifest includes requested '${kind}' evidence`,\n );\n return { ok: true, value: manifest };\n}\n\nconst PREVIEW_ROLE_KINDS: Readonly<Record<PreviewArtifactRole, PreviewArtifactKind>> = {\n report: 'report',\n 'rhi-tape': 'rhi-tape',\n capture: 'png',\n 'fresh-replay': 'png',\n 'profile-capture': 'profile-capture',\n 'contact-sheet': 'contact-sheet',\n};\n\nexport function createPreviewArtifactManifest(\n manifest: PreviewArtifactManifest,\n): PreviewArtifactManifest {\n const result = validatePreviewArtifactManifest(manifest, []);\n if (!result.ok) throw new TypeError('preview artifact manifest is invalid');\n return {\n schemaVersion: '2.0.0',\n identity: { ...manifest.identity },\n artifacts: manifest.artifacts.map((artifact) => ({\n ...artifact,\n derivedFrom: [...artifact.derivedFrom],\n })),\n };\n}\n\nexport function validatePreviewArtifactManifest(\n manifest: PreviewArtifactManifest,\n requiredRoles: readonly PreviewArtifactRole[],\n): PreviewArtifactManifestValidation {\n const fail = (reason: string): PreviewArtifactManifestValidation => ({\n ok: false,\n error: artifactManifestError(\n 'schemaVersion 2.0.0 with one complete identity and role per artifact',\n 'regenerate the staged report and evidence from one lexical ToolRun',\n {\n reason,\n ...(typeof manifest?.identity?.runId === 'string'\n ? { runId: manifest.identity.runId }\n : {}),\n },\n ),\n });\n if (manifest?.schemaVersion !== '2.0.0') return fail('v1 manifest or unsupported schemaVersion');\n const identity = manifest.identity;\n if (\n identity === undefined ||\n [\n identity.runId,\n identity.snapshotDigest,\n identity.subjectDigest,\n identity.presentationDigest,\n identity.captureId,\n ].some((value) => typeof value !== 'string' || value.length === 0) ||\n !Number.isSafeInteger(identity.frameId) ||\n identity.frameId < 0\n ) {\n return fail('identity is incomplete or stale');\n }\n const seenRoles = new Set<PreviewArtifactRole>();\n const digests = new Set<string>();\n for (const artifact of manifest.artifacts) {\n if (seenRoles.has(artifact.role)) return fail(`duplicate role '${artifact.role}'`);\n if (PREVIEW_ROLE_KINDS[artifact.role] !== artifact.kind) {\n return fail(`role '${artifact.role}' does not match kind '${artifact.kind}'`);\n }\n if (\n artifact.owner.length === 0 ||\n artifact.uri.length === 0 ||\n artifact.digest.length === 0 ||\n artifact.mediaType.length === 0 ||\n !Number.isSafeInteger(artifact.byteLength) ||\n artifact.byteLength < 0 ||\n artifact.derivedFrom.some((digest) => digest.length === 0)\n ) {\n return fail(`incomplete '${artifact.role}' artifact`);\n }\n seenRoles.add(artifact.role);\n digests.add(artifact.digest);\n }\n for (const artifact of manifest.artifacts) {\n if (artifact.derivedFrom.some((digest) => !digests.has(digest))) {\n return fail(`'${artifact.role}' derivedFrom references an unpublished artifact`);\n }\n }\n for (const role of requiredRoles) {\n if (!seenRoles.has(role)) return fail(`missing required role '${role}'`);\n }\n return { ok: true, value: manifest };\n}\n\nexport function isSerializableValue(value: unknown, seen = new Set<object>()): value is JsonValue {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return true;\n if (typeof value === 'number') return Number.isFinite(value);\n if (typeof value !== 'object') return false;\n if (seen.has(value)) return false;\n seen.add(value);\n if (Array.isArray(value)) return value.every((entry) => isSerializableValue(entry, seen));\n if (Object.getPrototypeOf(value) !== Object.prototype) return false;\n return Object.entries(value).every(\n ([key, entry]) => typeof key === 'string' && isSerializableValue(entry, seen),\n );\n}\n\nexport function createArtifactRef(input: {\n readonly kind: ToolEvidenceKind | 'tool-result' | 'receipt';\n readonly digest: string;\n readonly uri?: string;\n readonly mediaType?: string;\n readonly sizeBytes?: number;\n}): ArtifactRef {\n if (input.digest.length === 0) throw new TypeError('ArtifactRef digest must not be empty');\n if (\n input.sizeBytes !== undefined &&\n (!Number.isSafeInteger(input.sizeBytes) || input.sizeBytes < 0)\n ) {\n throw new TypeError('ArtifactRef sizeBytes must be a non-negative safe integer');\n }\n return { ...input };\n}\n\nexport function createSnapshotRef(input: SnapshotRef): SnapshotRef {\n if (!Number.isSafeInteger(input.revision) || input.revision < 0) {\n throw new TypeError('SnapshotRef revision must be a non-negative safe integer');\n }\n if (input.digest.length === 0) throw new TypeError('SnapshotRef digest must not be empty');\n return { revision: input.revision, digest: input.digest };\n}\n\nexport function validateArtifactRefs(value: unknown): value is readonly ArtifactRef[] {\n return (\n Array.isArray(value) &&\n value.every(\n (entry) =>\n typeof entry === 'object' &&\n entry !== null &&\n typeof Reflect.get(entry, 'kind') === 'string' &&\n typeof Reflect.get(entry, 'digest') === 'string' &&\n (Reflect.get(entry, 'uri') === undefined || typeof Reflect.get(entry, 'uri') === 'string'),\n )\n );\n}\n","import type {\n ToolCapability,\n ToolCapabilityResolver,\n ToolRealm,\n ToolRuntimeError,\n} from './types.js';\n\nconst capabilityIdPattern = /^[a-z][a-z0-9]*(?:[._-][a-z0-9]+)*$/;\n\n/** A static service identity. The value and its lifecycle remain Fiber-local. */\nexport function defineToolCapability<T>(id: string): ToolCapability<T> {\n if (!capabilityIdPattern.test(id)) {\n throw new TypeError(`Tool capability id must use a stable lower-case path: ${id}`);\n }\n return Object.freeze({ id }) as ToolCapability<T>;\n}\n\nexport function createCapabilityResolver(\n resolve: <T>(capability: ToolCapability<T>) => T | undefined,\n): ToolCapabilityResolver {\n return <T>(capability: ToolCapability<T>) => {\n const value = resolve(capability);\n return value === undefined ? undefined : { ok: true as const, value };\n };\n}\n\nexport interface ServiceAdmissionRef {\n readonly schema: 'forgeax.tool-service-admission-ref.v1';\n readonly reportDigest: string;\n readonly toolId: string;\n readonly descriptorDigest: string;\n readonly recipeDigest: string;\n readonly workloadClass: string;\n readonly codeDigest: string;\n readonly browserVersion: string;\n readonly backend: 'webgpu';\n readonly frameCount: number;\n readonly samples: {\n readonly privateCold: number;\n readonly privateWarm: number;\n readonly serviceCold: number;\n readonly serviceWarm: number;\n };\n readonly correctness: {\n readonly terminalEquivalent: boolean;\n readonly artifactIntegrity: boolean;\n readonly freshReplay: boolean;\n readonly hiddenParity: boolean;\n readonly drawCalls: number;\n readonly nonBlackPixels: number;\n };\n readonly performance: {\n readonly privateMedianMs: number;\n readonly privateP95Ms: number;\n readonly privateMaxMs: number;\n readonly privateRssBytes: number;\n readonly serviceMedianMs: number;\n readonly serviceP95Ms: number;\n readonly serviceMaxMs: number;\n readonly serviceRssBytes: number;\n };\n readonly cleanupPassed: boolean;\n readonly evictionPassed: boolean;\n}\n\nexport interface ServiceAdmissionExpectation {\n readonly toolId: string;\n readonly descriptorDigest: string;\n readonly recipeDigest: string;\n readonly workloadClass: string;\n readonly codeDigest: string;\n readonly browserVersion: string;\n readonly backend: 'webgpu';\n}\n\nexport type ServiceCapability =\n | { readonly available: true; readonly reportDigest?: string }\n | {\n readonly available: false;\n readonly code: 'tool-service-capability-absent';\n readonly expected: 'an admitted acceleration service';\n readonly hint: 'Use the private executor and rerun benchmark admission before enabling service.';\n readonly detail: { readonly reason: string };\n };\n\nfunction admissionFailure(\n admission: ServiceAdmissionRef | undefined,\n expected: ServiceAdmissionExpectation,\n): string | undefined {\n if (admission === undefined) return 'no workload-scoped admission report was supplied';\n if (\n admission.schema !== 'forgeax.tool-service-admission-ref.v1' ||\n !/^sha256:[0-9a-f]{64}$/.test(admission.reportDigest)\n ) {\n return 'admission report identity is invalid';\n }\n for (const key of [\n 'toolId',\n 'descriptorDigest',\n 'recipeDigest',\n 'workloadClass',\n 'codeDigest',\n 'browserVersion',\n 'backend',\n ] as const) {\n if (admission[key] !== expected[key]) return `admission ${key} does not match this run`;\n }\n if (admission.frameCount < 300) return 'admission workload ran fewer than 300 frames';\n if (Object.values(admission.samples).some((count) => count < 30)) {\n return 'admission sample set is incomplete';\n }\n if (\n !admission.correctness.terminalEquivalent ||\n !admission.correctness.artifactIntegrity ||\n !admission.correctness.freshReplay ||\n !admission.correctness.hiddenParity ||\n admission.correctness.drawCalls <= 0 ||\n admission.correctness.nonBlackPixels <= 0\n ) {\n return 'admission correctness gate failed';\n }\n const performance = admission.performance;\n if (\n Object.values(performance).some((value) => !Number.isFinite(value) || value <= 0) ||\n performance.serviceMedianMs > performance.privateMedianMs * 0.8 ||\n performance.serviceP95Ms > performance.privateP95Ms * 0.9 ||\n performance.serviceMaxMs > performance.privateMaxMs * 1.1 ||\n performance.serviceRssBytes > performance.privateRssBytes * 1.25\n ) {\n return 'admission performance threshold failed';\n }\n if (!admission.cleanupPassed) return 'admission cleanup gate failed';\n if (!admission.evictionPassed) return 'admission eviction gate failed';\n return undefined;\n}\n\nexport function createServiceCapability(\n admission: ServiceAdmissionRef | undefined,\n expected: ServiceAdmissionExpectation,\n): ServiceCapability {\n const reason = admissionFailure(admission, expected);\n if (reason === undefined && admission !== undefined) {\n return { available: true, reportDigest: admission.reportDigest };\n }\n return {\n available: false,\n code: 'tool-service-capability-absent',\n expected: 'an admitted acceleration service',\n hint: 'Use the private executor and rerun benchmark admission before enabling service.',\n detail: { reason: reason ?? 'benchmark admission did not pass' },\n };\n}\n\nexport interface RealmCapability {\n readonly realm: ToolRealm;\n readonly supported: boolean;\n readonly reason?: 'realm-capability-unavailable';\n}\n\nexport interface RealmCapabilityMatrix {\n readonly catalogDigest: string;\n readonly realms: Readonly<Record<ToolRealm, RealmCapability>>;\n}\n\nexport interface RealmCapabilityInput {\n readonly catalogDigest: string;\n readonly supported: Readonly<Record<ToolRealm, boolean>>;\n}\n\nexport function createRealmCapabilityMatrix(input: RealmCapabilityInput): RealmCapabilityMatrix {\n const realms = (['build', 'host', 'engine'] as const).reduce(\n (result, realm) => {\n const supported = input.supported[realm];\n result[realm] = supported\n ? { realm, supported: true }\n : { realm, supported: false, reason: 'realm-capability-unavailable' };\n return result;\n },\n {} as Record<ToolRealm, RealmCapability>,\n );\n return { catalogDigest: input.catalogDigest, realms };\n}\n\nexport type RealmBootstrapValidation =\n | { readonly ok: true }\n | { readonly ok: false; readonly error: ToolRuntimeError };\n\nfunction bootstrapNotCloneSafeError(detail: { readonly message: string }): ToolRuntimeError {\n return {\n code: 'tool-bootstrap-not-clone-safe',\n expected: 'bootstrap input to contain structured-clone-safe data',\n hint: 'Remove live handles, functions, ports, and realm-owned objects from bootstrap input.',\n detail,\n };\n}\n\nexport function validateRealmBootstrapPayload(value: unknown): RealmBootstrapValidation {\n try {\n structuredClone(value);\n return { ok: true };\n } catch (cause) {\n return {\n ok: false,\n error: bootstrapNotCloneSafeError({\n message: cause instanceof Error ? cause.message : String(cause),\n }),\n };\n }\n}\n","export type CarrierPhase = 'offered' | 'leased' | 'started' | 'exited' | 'expired' | 'fallback';\n\nexport type CarrierErrorCode =\n | 'carrier-consumer-mismatch'\n | 'carrier-token-invalid'\n | 'carrier-offer-expired'\n | 'carrier-started'\n | 'carrier-exited'\n | 'carrier-lease-required'\n | 'carrier-payload-live-state'\n | 'carrier-descriptor-mismatch'\n | 'carrier-recipe-mismatch'\n | 'carrier-provider-exit'\n | 'carrier-capture-failed'\n | 'carrier-cleanup-failed';\n\nexport interface CarrierError {\n readonly code: CarrierErrorCode;\n readonly expected: string;\n readonly hint: string;\n readonly detail: Readonly<Record<string, unknown>>;\n}\n\nexport interface CarrierOffer {\n readonly schemaVersion: '1.0.0';\n readonly projectId: string;\n readonly consumerId: string;\n readonly offerId: string;\n readonly endpoint: string;\n readonly bearerToken: string;\n readonly livenessToken: string;\n readonly expiresAt: number;\n readonly descriptorDigest?: string;\n readonly recipeDigest?: string;\n readonly state: 'offered';\n}\n\nexport interface CarrierLease {\n readonly leaseId: string;\n readonly offerId: string;\n readonly consumerId: string;\n readonly state: 'leased';\n}\n\nexport interface CarrierState {\n readonly state: CarrierPhase;\n readonly leaseId?: string;\n}\n\nexport interface CarrierStateMachine {\n readonly offer: CarrierOffer;\n readonly lease: {\n (request: CarrierLeaseRequest): CarrierResult<CarrierLease>;\n (leaseId: string, request: CarrierLeaseRequest): CarrierResult<CarrierLease>;\n };\n readonly started: (leaseId: string) => CarrierResult<CarrierState>;\n readonly exit: (leaseId: string) => CarrierResult<CarrierState>;\n readonly fallback: () => CarrierResult<CarrierState>;\n readonly snapshot: () => CarrierState;\n}\n\nexport interface CarrierLeaseRequest {\n readonly consumerId: string;\n readonly bearerToken: string;\n readonly now: number;\n readonly descriptorDigest?: string;\n readonly recipeDigest?: string;\n}\n\nexport type CarrierResult<T> =\n | { readonly ok: true; readonly value: T; readonly state: CarrierPhase }\n | { readonly ok: false; readonly error: CarrierError };\n\nexport interface CarrierStateMachineOptions {\n readonly projectId: string;\n readonly consumerId: string;\n readonly endpoint: string;\n readonly now: number;\n readonly ttlMs: number;\n readonly payload?: unknown;\n readonly descriptorDigest?: string;\n readonly recipeDigest?: string;\n}\n\nfunction token(): string {\n return crypto.randomUUID().replaceAll('-', '');\n}\n\nfunction carrierError(\n code: CarrierErrorCode,\n expected: string,\n hint: string,\n detail: Readonly<Record<string, unknown>>,\n): CarrierError {\n return { code, expected, hint, detail };\n}\n\nfunction containsLiveKey(value: unknown, seen = new Set<object>()): boolean {\n if (typeof value !== 'object' || value === null) return false;\n if (seen.has(value)) return false;\n seen.add(value);\n if (Array.isArray(value)) return value.some((entry) => containsLiveKey(entry, seen));\n return Object.entries(value).some(([key, nested]) => {\n if (\n ['world', 'renderer', 'canvas', 'ui', 'profile', 'liveHandle', 'context', 'fiber'].includes(\n key,\n )\n )\n return true;\n return containsLiveKey(nested, seen);\n });\n}\n\nfunction validateOptions(options: CarrierStateMachineOptions): void {\n if (options.projectId.length === 0 || options.consumerId.length === 0) {\n throw new TypeError('carrier projectId and consumerId must not be empty');\n }\n const endpoint = new URL(options.endpoint);\n if (endpoint.protocol !== 'http:' || !['127.0.0.1', 'localhost'].includes(endpoint.hostname)) {\n throw new TypeError('carrier endpoint must be loopback HTTP');\n }\n if (!Number.isFinite(options.now) || !Number.isFinite(options.ttlMs) || options.ttlMs <= 0) {\n throw new TypeError('carrier clock and ttl must be finite and positive');\n }\n if (containsLiveKey(options.payload)) throw new TypeError('carrier-payload-live-state');\n}\n\nexport function createCarrierStateMachine(\n options: CarrierStateMachineOptions,\n): CarrierStateMachine {\n validateOptions(options);\n const offer: CarrierOffer = {\n schemaVersion: '1.0.0',\n projectId: options.projectId,\n consumerId: options.consumerId,\n offerId: `offer:${token()}`,\n endpoint: options.endpoint,\n bearerToken: token(),\n livenessToken: token(),\n expiresAt: options.now + options.ttlMs,\n ...(options.descriptorDigest === undefined\n ? {}\n : { descriptorDigest: options.descriptorDigest }),\n ...(options.recipeDigest === undefined ? {} : { recipeDigest: options.recipeDigest }),\n state: 'offered',\n };\n let state: CarrierState = { state: 'offered' };\n let lease: CarrierLease | undefined;\n\n const leaseOffer = (\n requestOrId: CarrierLeaseRequest | string,\n maybeRequest?: CarrierLeaseRequest,\n ): CarrierResult<CarrierLease> => {\n const request = typeof requestOrId === 'string' ? maybeRequest : requestOrId;\n const requestedLeaseId = typeof requestOrId === 'string' ? requestOrId : undefined;\n if (request === undefined) {\n return {\n ok: false,\n error: carrierError(\n 'carrier-token-invalid',\n 'a complete lease request',\n 'Provide consumer identity, bearer token, and current time.',\n {},\n ),\n };\n }\n if (state.state === 'started') {\n return {\n ok: false,\n error: carrierError(\n 'carrier-started',\n 'a started carrier not to be retried',\n 'Report one terminal failure and clean up the existing started lease.',\n {},\n ),\n };\n }\n if (state.state === 'exited') {\n return {\n ok: false,\n error: carrierError(\n 'carrier-exited',\n 'an exited carrier not to be retried',\n 'Re-run the operation from a serialized snapshot instead of migrating live state.',\n {},\n ),\n };\n }\n if (request.consumerId !== offer.consumerId) {\n return {\n ok: false,\n error: carrierError(\n 'carrier-consumer-mismatch',\n 'the offer consumer identity to match',\n 'Use the consumer identity that was authenticated for this project offer.',\n { expected: offer.consumerId, actual: request.consumerId },\n ),\n };\n }\n if (request.bearerToken !== offer.bearerToken) {\n return {\n ok: false,\n error: carrierError(\n 'carrier-token-invalid',\n 'the bearer token to match the ephemeral offer',\n 'Request a fresh visible offer; never persist or guess bearer tokens.',\n {},\n ),\n };\n }\n if (\n offer.descriptorDigest !== undefined &&\n request.descriptorDigest !== offer.descriptorDigest\n ) {\n return {\n ok: false,\n error: carrierError(\n 'carrier-descriptor-mismatch',\n 'the descriptor digest to match the authenticated offer',\n 'Refresh the descriptor and request a new visible offer before retrying.',\n { expected: offer.descriptorDigest, actual: request.descriptorDigest },\n ),\n };\n }\n if (offer.recipeDigest !== undefined && request.recipeDigest !== offer.recipeDigest) {\n return {\n ok: false,\n error: carrierError(\n 'carrier-recipe-mismatch',\n 'the recipe digest to match the authenticated offer',\n 'Serialize the current snapshot and request a fresh visible offer before retrying.',\n { expected: offer.recipeDigest, actual: request.recipeDigest },\n ),\n };\n }\n if (request.now >= offer.expiresAt) {\n state = { state: 'expired' };\n return {\n ok: false,\n error: carrierError(\n 'carrier-offer-expired',\n 'the offer to be within its expiry window',\n 'Fall back to the ordinary visible carrier before retrying.',\n { expiresAt: offer.expiresAt, now: request.now },\n ),\n };\n }\n if (requestedLeaseId !== undefined && requestedLeaseId !== lease?.leaseId) {\n return {\n ok: false,\n error: carrierError(\n 'carrier-token-invalid',\n 'the lease id to match the authenticated offer',\n 'Use the lease id returned by the first successful lease.',\n {},\n ),\n };\n }\n lease = {\n leaseId: `lease:${token()}`,\n offerId: offer.offerId,\n consumerId: request.consumerId,\n state: 'leased',\n };\n state = { state: 'leased', leaseId: lease.leaseId };\n return { ok: true, value: lease, state: 'leased' };\n };\n\n const started = (leaseId: string): CarrierResult<CarrierState> => {\n if (lease?.leaseId !== leaseId) {\n return {\n ok: false,\n error: carrierError(\n 'carrier-lease-required',\n 'a valid lease before started',\n 'Lease the authenticated offer before reporting provider started.',\n {},\n ),\n };\n }\n state = { state: 'started', leaseId };\n return { ok: true, value: state, state: 'started' };\n };\n\n const exit = (leaseId: string): CarrierResult<CarrierState> => {\n if (lease?.leaseId !== leaseId || state.state !== 'started') {\n return {\n ok: false,\n error: carrierError(\n 'carrier-lease-required',\n 'a started lease before provider exit',\n 'Provider exit is terminal only after started has been acknowledged.',\n {},\n ),\n };\n }\n state = { state: 'exited', leaseId };\n return { ok: true, value: state, state: 'exited' };\n };\n\n const fallback = (): CarrierResult<CarrierState> => {\n if (state.state === 'started' || state.state === 'exited') {\n return {\n ok: false,\n error: carrierError(\n 'carrier-started',\n 'fallback to happen before provider started',\n 'Do not retry or migrate a carrier after started; return its terminal failure.',\n { state: state.state },\n ),\n };\n }\n state = { state: 'fallback' };\n return { ok: true, value: state, state: 'fallback' };\n };\n\n return {\n offer,\n lease: leaseOffer,\n started,\n exit,\n fallback,\n snapshot: () => state,\n };\n}\n","export type LeaseTerminationReason =\n | 'terminal'\n | 'cancel'\n | 'timeout'\n | 'disconnect'\n | 'provider-exit';\n\nexport interface LeaseCleanupFailure {\n readonly owner: string;\n readonly message: string;\n}\n\nexport interface LeaseTermination {\n readonly terminalId: string;\n readonly reason: LeaseTerminationReason;\n readonly failures: readonly LeaseCleanupFailure[];\n}\n\nexport interface LexicalLease {\n readonly state: 'active' | 'terminating' | 'terminated';\n readonly register: (owner: string, cleanup: () => void | Promise<void>) => boolean;\n readonly terminate: (reason: LeaseTerminationReason) => Promise<LeaseTermination>;\n}\n\nexport function createLexicalLease(runId: string): LexicalLease {\n const cleanups: Array<{ readonly owner: string; readonly cleanup: () => void | Promise<void> }> =\n [];\n let state: LexicalLease['state'] = 'active';\n let terminalId: string | undefined;\n let termination: Promise<LeaseTermination> | undefined;\n\n const terminate = (reason: LeaseTerminationReason): Promise<LeaseTermination> => {\n if (termination !== undefined) return termination;\n terminalId = `${runId}:terminal:${crypto.randomUUID()}`;\n state = 'terminating';\n termination = (async () => {\n const failures: LeaseCleanupFailure[] = [];\n for (let index = cleanups.length - 1; index >= 0; index -= 1) {\n const entry = cleanups[index];\n if (entry === undefined) continue;\n try {\n await entry.cleanup();\n } catch (cause) {\n failures.push({\n owner: entry.owner,\n message: cause instanceof Error ? cause.message : String(cause),\n });\n }\n }\n state = 'terminated';\n return { terminalId: terminalId as string, reason, failures };\n })();\n return termination;\n };\n\n return {\n get state() {\n return state;\n },\n register(owner, cleanup) {\n if (state !== 'active') return false;\n cleanups.push({ owner, cleanup });\n return true;\n },\n terminate,\n };\n}\n","import type { ToolPhaseObservation, ToolTiming, ToolTimingPhase } from './types.js';\n\nexport interface ExclusiveTimingResult {\n readonly startedAtMs: number;\n readonly endedAtMs: number;\n readonly totalMs: number;\n readonly phases: Readonly<Record<ToolTimingPhase, ToolPhaseObservation>>;\n}\n\nexport interface ExclusiveTiming {\n begin(phase: ToolTimingPhase): void;\n end(phase: ToolTimingPhase): void;\n record(phase: ToolTimingPhase, durationMs: number): void;\n finish(): ExclusiveTimingResult;\n}\n\nconst PHASES: readonly ToolTimingPhase[] = [\n 'lookup',\n 'lease',\n 'transport',\n 'execute',\n 'capture',\n 'finalize',\n 'analyze',\n];\n\nexport function createExclusiveTiming(\n now: () => number = () => performance.now(),\n): ExclusiveTiming {\n const phases = Object.fromEntries(\n PHASES.map((phase) => [phase, { status: 'not-applicable' }]),\n ) as Record<ToolTimingPhase, ToolPhaseObservation>;\n const closed = new Set<ToolTimingPhase>();\n let active: { phase: ToolTimingPhase; startedAtMs: number } | undefined;\n let startedAtMs: number | undefined;\n let endedAtMs: number | undefined;\n return {\n begin(phase) {\n if (active !== undefined) throw new TypeError(`phase '${active.phase}' is still open`);\n if (closed.has(phase)) throw new TypeError(`phase '${phase}' was already closed`);\n const at = now();\n startedAtMs ??= at;\n active = { phase, startedAtMs: at };\n },\n end(phase) {\n if (active?.phase !== phase) throw new TypeError(`phase '${phase}' is not the active phase`);\n const at = now();\n phases[phase] = { status: 'observed', durationMs: Math.max(0, at - active.startedAtMs) };\n closed.add(phase);\n active = undefined;\n endedAtMs = at;\n },\n record(phase, durationMs) {\n if (!Number.isFinite(durationMs) || durationMs < 0)\n throw new TypeError('phase duration must be finite and non-negative');\n if (closed.has(phase)) throw new TypeError(`phase '${phase}' was already closed`);\n const at = now();\n startedAtMs ??= at - durationMs;\n phases[phase] = { status: 'observed', durationMs };\n closed.add(phase);\n endedAtMs = at;\n },\n finish() {\n if (active !== undefined) throw new TypeError(`phase '${active.phase}' is still open`);\n const start = startedAtMs ?? now();\n const end = endedAtMs ?? start;\n return {\n startedAtMs: start,\n endedAtMs: end,\n totalMs: Math.max(0, end - start),\n phases: { ...phases },\n };\n },\n };\n}\n\nexport function startToolTiming(): number {\n return performance.now();\n}\n\nexport function finishToolTiming(\n startedAtMs: number,\n operationTiming?: ExclusiveTiming,\n): ToolTiming {\n const endedAtMs = performance.now();\n const result = operationTiming?.finish();\n const durationMs = Math.max(0, endedAtMs - startedAtMs);\n const attributedMs =\n result === undefined\n ? 0\n : Object.values(result.phases).reduce(\n (sum, observation) =>\n observation.status === 'observed' ? sum + observation.durationMs : sum,\n 0,\n );\n return {\n startedAtMs,\n endedAtMs,\n durationMs,\n ...(result === undefined\n ? {}\n : { phases: result.phases, unattributedMs: Math.max(0, durationMs - attributedMs) }),\n };\n}\n","import { isSerializableValue, validateArtifactRefs } from './artifacts.js';\nimport {\n artifactIncompleteError,\n cancellationError,\n capabilityUnavailableError,\n cleanupError,\n disconnectedError,\n domainFailureError,\n invalidArgsError,\n terminalError,\n timeoutError,\n} from './errors.js';\nimport { createLexicalLease, type LeaseTerminationReason } from './lease.js';\nimport { createExclusiveTiming, finishToolTiming, startToolTiming } from './timing.js';\nimport type {\n JsonValue,\n ToolCapability,\n ToolCleanupReport,\n ToolContribution,\n ToolDescriptor,\n ToolDomainFailure,\n ToolExecutionContext,\n ToolExecutor,\n ToolRun,\n ToolRunEvent,\n ToolRunOptions,\n ToolRuntimeError,\n ToolSchema,\n ToolTerminal,\n} from './types.js';\n\nexport interface ToolRuntime {\n readonly list: () => readonly ToolDescriptor[];\n readonly describe: (id: string) => ToolDescriptor | undefined;\n readonly get: (id: string) => ToolContribution<unknown, unknown> | undefined;\n readonly run: <TArgs, TResult>(\n contribution: ToolContribution<TArgs, TResult>,\n args: TArgs,\n options?: ToolRunOptions,\n ) => ToolRun<TResult>;\n}\n\nexport function defineTool<TArgs, TResult>(\n descriptor: ToolDescriptor<TArgs, TResult>,\n execute: ToolExecutor<TArgs, TResult>,\n): ToolContribution<TArgs, TResult> {\n if (!/^[a-z][a-z0-9]*(?:[._-][a-z0-9]+)*$/.test(descriptor.id)) {\n throw new TypeError(`Tool id must use a stable lower-case path: ${descriptor.id}`);\n }\n if (descriptor.title.trim().length === 0 || descriptor.summary.trim().length === 0) {\n throw new TypeError('Tool title and summary must not be empty');\n }\n if (!Array.isArray(descriptor.evidence)) throw new TypeError('Tool evidence must be an array');\n if (descriptor.preview !== undefined && descriptor.preview.realm !== descriptor.realm) {\n throw new TypeError(\n `Tool ${descriptor.id} preview contract declares ${descriptor.preview.realm} but descriptor declares ${descriptor.realm}`,\n );\n }\n const argsSchema: ToolSchema<TArgs> = descriptor.argsSchema;\n const resultSchema: ToolSchema<TResult> = descriptor.resultSchema;\n return {\n descriptor: { ...descriptor, argsSchema, resultSchema, evidence: [...descriptor.evidence] },\n execute,\n };\n}\n\nfunction eventChannel(): {\n readonly emit: (event: ToolRunEvent) => void;\n readonly close: () => void;\n readonly events: AsyncIterable<ToolRunEvent>;\n} {\n const queue: ToolRunEvent[] = [];\n const waiters: Array<(result: IteratorResult<ToolRunEvent>) => void> = [];\n let closed = false;\n const emit = (event: ToolRunEvent): void => {\n const waiter = waiters.shift();\n if (waiter !== undefined) waiter({ done: false, value: event });\n else queue.push(event);\n };\n const close = (): void => {\n closed = true;\n while (waiters.length > 0) waiters.shift()?.({ done: true, value: undefined });\n };\n const events: AsyncIterable<ToolRunEvent> = {\n [Symbol.asyncIterator](): AsyncIterator<ToolRunEvent> {\n return {\n next: async (): Promise<IteratorResult<ToolRunEvent>> => {\n const event = queue.shift();\n if (event !== undefined) return { done: false, value: event };\n if (closed) return { done: true, value: undefined };\n return new Promise((resolve) => waiters.push(resolve));\n },\n };\n },\n };\n return { emit, close, events };\n}\n\nfunction isTerminal<TResult>(value: unknown): value is ToolTerminal<TResult> {\n if (typeof value !== 'object' || value === null) return false;\n const outcome = Reflect.get(value, 'outcome');\n return outcome === 'succeeded' || outcome === 'failed';\n}\n\nfunction serializablePreview(value: unknown): JsonValue {\n return isSerializableValue(value) ? value : null;\n}\n\nfunction domainError(error: ToolDomainFailure): ToolRuntimeError {\n return domainFailureError(\n error.code,\n error.expected ?? 'the producer operation to succeed',\n error.hint ?? 'Inspect detail and repair the owning producer before retrying.',\n error.detail,\n );\n}\n\nfunction hasOkField(value: unknown): value is { readonly ok: boolean } {\n return (\n typeof value === 'object' && value !== null && typeof Reflect.get(value, 'ok') === 'boolean'\n );\n}\n\nfunction isToolRuntimeError(value: unknown): value is ToolRuntimeError {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof Reflect.get(value, 'code') === 'string' &&\n Reflect.get(value, 'code').startsWith('tool-')\n );\n}\n\nexport function createToolRuntime<TArgs, TResult>(\n contributions: readonly ToolContribution<TArgs, TResult>[],\n): ToolRuntime;\nexport function createToolRuntime(contributions: readonly unknown[]): ToolRuntime;\nexport function createToolRuntime(contributions: readonly unknown[]): ToolRuntime {\n const byId = new Map<string, ToolContribution<unknown, unknown>>();\n for (const candidate of contributions) {\n if (typeof candidate !== 'object' || candidate === null) {\n throw new TypeError('Tool contributions must be objects');\n }\n const contribution = candidate as ToolContribution<unknown, unknown>;\n if (typeof contribution.execute !== 'function') {\n throw new TypeError('Tool contributions must provide an executor');\n }\n const id = contribution.descriptor.id;\n if (byId.has(id)) throw new TypeError(`Duplicate tool contribution id: ${id}`);\n byId.set(id, contribution);\n }\n\n const list = (): readonly ToolDescriptor[] =>\n [...byId.values()].map((contribution) => contribution.descriptor);\n\n const run = <TArgs, TResult>(\n contribution: ToolContribution<TArgs, TResult>,\n args: TArgs,\n options: ToolRunOptions = {},\n ): ToolRun<TResult> => {\n const runId = `${contribution.descriptor.id}:${crypto.randomUUID()}`;\n const channel = eventChannel();\n const controller = new AbortController();\n const startedAtMs = startToolTiming();\n const operationTiming = createExclusiveTiming();\n const lookupStartedAtMs = startToolTiming();\n operationTiming.record('lookup', Math.max(0, startToolTiming() - lookupStartedAtMs));\n const lease = createLexicalLease(runId);\n const leaseStartedAtMs = startToolTiming();\n operationTiming.record('lease', Math.max(0, startToolTiming() - leaseStartedAtMs));\n let terminalStarted = false;\n let cleanupReport: ToolCleanupReport = {\n census: { worlds: 0, renderers: 0, canvases: 0, leases: 0 },\n failures: [],\n };\n let cancelReason = 'cancelled by caller';\n let resolveTerminal!: (terminal: ToolTerminal<TResult>) => void;\n const terminal = new Promise<ToolTerminal<TResult>>((resolve) => {\n resolveTerminal = resolve;\n });\n\n const settle = async (\n candidate: ToolTerminal<TResult>,\n reason: LeaseTerminationReason = 'terminal',\n ): Promise<void> => {\n if (terminalStarted) return;\n terminalStarted = true;\n controller.abort();\n const finalizeStartedAtMs = startToolTiming();\n const cleanupResult = await lease.terminate(reason);\n const cleanupFailure = cleanupResult.failures[0];\n const liveResources = Object.entries(cleanupReport.census).filter(([, count]) => count !== 0);\n const reportFailure =\n cleanupReport.failures[0] ??\n (liveResources.length === 0\n ? undefined\n : `live resources remain: ${liveResources.map(([kind, count]) => `${kind}=${count}`).join(', ')}`);\n operationTiming.record('finalize', Math.max(0, startToolTiming() - finalizeStartedAtMs));\n const finalTerminal: ToolTerminal<TResult> =\n cleanupFailure || (candidate.outcome === 'succeeded' && reportFailure !== undefined)\n ? {\n outcome: 'failed',\n failure: cleanupError(\n runId,\n cleanupFailure === undefined\n ? (reportFailure as string)\n : `${cleanupFailure.owner}: ${cleanupFailure.message}`,\n ),\n artifacts: candidate.artifacts,\n cleanup: cleanupReport,\n ...(candidate.snapshotAfter === undefined\n ? {}\n : { snapshotAfter: candidate.snapshotAfter }),\n timing: finishToolTiming(startedAtMs, operationTiming),\n }\n : {\n ...candidate,\n cleanup: cleanupReport,\n timing: finishToolTiming(startedAtMs, operationTiming),\n };\n resolveTerminal(finalTerminal);\n channel.emit({\n kind: 'terminal',\n runId,\n outcome: finalTerminal.outcome,\n atMs: performance.now(),\n });\n channel.close();\n };\n\n const context: ToolExecutionContext = {\n runId,\n signal: controller.signal,\n ...(options.snapshot === undefined ? {} : { snapshot: options.snapshot }),\n emit: (event) => {\n if (!terminalStarted) channel.emit({ ...event, runId });\n },\n addCleanup: (cleanup) => {\n if (!lease.register(`cleanup:${lease.state}`, cleanup)) void cleanup();\n },\n setCleanupReport: (report) => {\n cleanupReport = {\n census: { ...report.census },\n failures: [...report.failures],\n };\n },\n require: <T>(capability: ToolCapability<T>) => {\n if (terminalStarted) {\n return { ok: false as const, error: terminalError(runId, 'succeeded') };\n }\n const resolved = options.capabilityResolver?.(capability);\n if (resolved !== undefined) return resolved;\n return {\n ok: false as const,\n error: capabilityUnavailableError(capability.id, contribution.descriptor.realm),\n };\n },\n runChild: async (childContribution, childArgs, childOptions = {}) => {\n if (terminalStarted) {\n return {\n outcome: 'failed',\n failure: terminalError(runId, 'failed'),\n artifacts: [],\n };\n }\n const childRun = runtime.run(childContribution, childArgs, {\n ...childOptions,\n signal: controller.signal,\n ...(childOptions.capabilityResolver === undefined &&\n options.capabilityResolver !== undefined\n ? { capabilityResolver: options.capabilityResolver }\n : {}),\n ...(options.snapshot === undefined ? {} : { snapshot: options.snapshot }),\n });\n channel.emit({\n kind: 'child-started',\n runId,\n childRunId: childRun.id,\n atMs: performance.now(),\n });\n lease.register(`child:${childRun.id}`, () => {\n childRun.cancel('parent terminal');\n });\n return childRun.terminal;\n },\n };\n\n const fail = (failure: ToolRuntimeError): void => {\n void settle({ outcome: 'failed', failure, artifacts: [] });\n };\n\n const cancel = (reason = 'cancelled by caller'): void => {\n cancelReason = reason;\n void settle(\n { outcome: 'failed', failure: cancellationError(reason), artifacts: [] },\n 'cancel',\n );\n };\n\n const disconnect = (transport = 'tool transport'): void => {\n void settle(\n { outcome: 'failed', failure: disconnectedError(transport), artifacts: [] },\n 'disconnect',\n );\n };\n\n const providerExit = (provider = 'provider'): void => {\n void settle(\n {\n outcome: 'failed',\n failure: domainFailureError(\n 'provider-exit',\n 'the provider to remain alive until terminal',\n 'Restart the provider and retry from the serialized snapshot.',\n provider,\n ),\n artifacts: [],\n },\n 'provider-exit',\n );\n };\n\n const timeout =\n options.deadlineMs === undefined\n ? undefined\n : setTimeout(\n () =>\n void settle(\n {\n outcome: 'failed',\n failure: timeoutError(options.deadlineMs as number),\n artifacts: [],\n },\n 'timeout',\n ),\n options.deadlineMs,\n );\n\n channel.emit({ kind: 'started', runId, atMs: performance.now() });\n void (async () => {\n const parsedArgs = contribution.descriptor.argsSchema.parse(args);\n if (!parsedArgs.ok) {\n fail(invalidArgsError(parsedArgs.error, serializablePreview(args)));\n return;\n }\n try {\n if (options.signal?.aborted) {\n cancelReason = 'aborted by caller';\n fail(cancellationError(cancelReason));\n return;\n }\n const onAbort = (): void => cancel('aborted by caller');\n options.signal?.addEventListener('abort', onAbort, { once: true });\n let produced: unknown;\n const executeStartedAtMs = startToolTiming();\n try {\n produced = await contribution.execute(parsedArgs.value, context);\n } finally {\n operationTiming.record('execute', Math.max(0, startToolTiming() - executeStartedAtMs));\n options.signal?.removeEventListener('abort', onAbort);\n }\n if (terminalStarted) return;\n if (controller.signal.aborted) {\n fail(cancellationError(cancelReason));\n return;\n }\n let result: unknown = produced;\n let snapshotAfter = options.snapshot;\n let artifacts: readonly import('./types.js').ArtifactRef[] = [];\n if (isTerminal<TResult>(produced)) {\n if (produced.outcome === 'failed') {\n await settle(produced);\n return;\n }\n result = produced.result;\n snapshotAfter = produced.snapshotAfter;\n artifacts = produced.artifacts;\n cleanupReport = produced.cleanup ?? cleanupReport;\n } else if (hasOkField(produced)) {\n if (produced.ok === false) {\n const error = Reflect.get(produced, 'error');\n if (isToolRuntimeError(error)) {\n await settle({ outcome: 'failed', failure: error, artifacts: [] });\n return;\n }\n await settle({\n outcome: 'failed',\n failure: domainError(error as ToolDomainFailure),\n artifacts: [],\n });\n return;\n }\n result = Reflect.get(produced, 'value');\n snapshotAfter = Reflect.get(produced, 'snapshotAfter');\n artifacts = Reflect.get(produced, 'artifacts') ?? [];\n }\n if (!isSerializableValue(result)) {\n await settle({\n outcome: 'failed',\n failure: domainFailureError(\n 'terminal-not-serializable',\n 'the result to be JSON serializable',\n 'Return plain JSON data and ArtifactRef values instead of live handles.',\n ),\n artifacts: [],\n });\n return;\n }\n const parsedResult = contribution.descriptor.resultSchema.parse(result);\n if (!parsedResult.ok) {\n await settle({\n outcome: 'failed',\n failure: domainFailureError(\n 'result-schema-invalid',\n 'the result to satisfy resultSchema',\n parsedResult.error,\n ),\n artifacts: [],\n });\n return;\n }\n if (!validateArtifactRefs(artifacts)) {\n await settle({\n outcome: 'failed',\n failure: domainFailureError(\n 'artifact-ref-invalid',\n 'artifact refs to be serializable ArtifactRef values',\n 'Return refs created by createArtifactRef.',\n ),\n artifacts: [],\n });\n return;\n }\n const requiredEvidence = [\n ...new Set([...(contribution.descriptor.evidence ?? []), ...(options.evidence ?? [])]),\n ];\n const missingEvidence = requiredEvidence.filter(\n (kind) => !artifacts.some((artifact) => artifact.kind === kind),\n );\n if (missingEvidence.length > 0) {\n await settle({\n outcome: 'failed',\n failure: artifactIncompleteError(missingEvidence, runId),\n artifacts,\n });\n return;\n }\n await settle({\n outcome: 'succeeded',\n result: parsedResult.value,\n artifacts,\n ...(snapshotAfter === undefined ? {} : { snapshotAfter }),\n });\n } catch (cause) {\n await settle({\n outcome: 'failed',\n failure: domainFailureError(\n 'executor-threw',\n 'the contribution executor to return a result',\n cause instanceof Error ? cause.message : String(cause),\n ),\n artifacts: [],\n });\n } finally {\n if (timeout !== undefined) clearTimeout(timeout);\n }\n })();\n\n const runtimeRun: ToolRun<TResult> = {\n id: runId,\n events: channel.events,\n terminal,\n cancel,\n disconnect,\n providerExit,\n };\n return runtimeRun;\n };\n\n const runtime: ToolRuntime = {\n list,\n describe: (id) => byId.get(id)?.descriptor,\n get: (id) => byId.get(id),\n run,\n };\n return runtime;\n}\n","import { createToolRuntime } from './runtime.js';\nimport type {\n JsonValue,\n ToolContribution,\n ToolDescriptor,\n ToolExecutor,\n ToolRun,\n ToolRunOptions,\n} from './types.js';\n\nexport type ToolCommandPath = readonly string[];\n\nexport interface ToolCommandDescriptor<TArgs = unknown, TResult = unknown>\n extends ToolDescriptor<TArgs, TResult> {\n readonly path: ToolCommandPath;\n}\n\nexport interface ToolCommandNode {\n readonly name: string;\n readonly path: string;\n readonly summary: string;\n readonly children?: readonly ToolCommandNode[];\n readonly leaf?: {\n readonly title: string;\n readonly realm: ToolDescriptor['realm'];\n readonly inputSchema?: JsonValue;\n readonly outputSchema?: JsonValue;\n readonly inputDescription?: string;\n readonly outputDescription?: string;\n readonly capabilities: readonly string[];\n readonly errors: readonly string[];\n readonly example?: JsonValue;\n };\n}\n\nexport interface ToolCommandHelp {\n readonly path: string;\n readonly summary?: string;\n readonly nodes: readonly ToolCommandNode[];\n readonly leaf?: ToolCommandNode['leaf'];\n}\n\nexport type ToolCommandErrorCode =\n | 'tool-command-invalid-path'\n | 'tool-command-conflict'\n | 'tool-command-not-found';\n\nexport class ToolCommandError extends Error {\n readonly code: ToolCommandErrorCode;\n readonly path: string;\n readonly detail: Readonly<Record<string, unknown>>;\n\n constructor(\n code: ToolCommandErrorCode,\n path: string,\n message: string,\n detail: Readonly<Record<string, unknown>> = {},\n ) {\n super(`${code}: ${message}`);\n this.name = 'ToolCommandError';\n this.code = code;\n this.path = path;\n this.detail = detail;\n }\n}\n\nexport interface ToolCommandRegistry {\n readonly contributions: readonly ToolContribution[];\n readonly list: (path?: ToolCommandPath) => readonly ToolCommandNode[];\n readonly tree: (path?: ToolCommandPath | string) => readonly ToolCommandNode[];\n readonly describe: (path: ToolCommandPath | string) => ToolCommandDescriptor | undefined;\n readonly help: (path?: ToolCommandPath | string, tree?: boolean) => ToolCommandHelp;\n readonly get: (path: ToolCommandPath | string) => ToolContribution | undefined;\n readonly run: <TResult = unknown>(\n path: ToolCommandPath | string,\n args: unknown,\n options?: ToolRunOptions,\n ) => ToolRun<TResult> | undefined;\n}\n\nfunction normalizePath(path: ToolCommandPath | string): string[] {\n const segments = typeof path === 'string' ? path.split(/\\s+/).filter(Boolean) : [...path];\n if (\n (segments.length === 0 && typeof path === 'string') ||\n segments.some((segment) => !/^[a-z][a-z0-9-]*$/.test(segment))\n ) {\n throw new ToolCommandError(\n 'tool-command-invalid-path',\n typeof path === 'string' ? path : segments.join(' '),\n 'command paths must contain lower-case name segments',\n );\n }\n return segments;\n}\n\nfunction descriptorPath(descriptor: ToolDescriptor): string[] {\n const path = normalizePath(descriptor.path ?? descriptor.id.split('.'));\n if (path.length === 0) {\n throw new ToolCommandError(\n 'tool-command-invalid-path',\n '',\n 'command declarations must contain at least one name segment',\n );\n }\n return path;\n}\n\nfunction pathKey(path: ToolCommandPath): string {\n return path.join(' ');\n}\n\nfunction schemaValue(describe: string | undefined): JsonValue | undefined {\n if (describe === undefined) return undefined;\n try {\n const value = JSON.parse(describe) as unknown;\n return value !== null && typeof value === 'object' ? (value as JsonValue) : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction nodeForDescriptor(\n descriptor: ToolDescriptor,\n path: ToolCommandPath,\n includeLeaf = true,\n): ToolCommandNode {\n const inputSchema = descriptor.inputSchema ?? schemaValue(descriptor.argsSchema.describe);\n const outputSchema = descriptor.outputSchema ?? schemaValue(descriptor.resultSchema.describe);\n const node: ToolCommandNode = {\n name: path[path.length - 1] as string,\n path: pathKey(path),\n summary: descriptor.summary,\n };\n if (includeLeaf) {\n return {\n ...node,\n leaf: {\n title: descriptor.title,\n realm: descriptor.realm,\n ...(inputSchema === undefined\n ? descriptor.argsSchema.describe === undefined\n ? {}\n : { inputDescription: descriptor.argsSchema.describe }\n : { inputSchema }),\n ...(outputSchema === undefined\n ? descriptor.resultSchema.describe === undefined\n ? {}\n : { outputDescription: descriptor.resultSchema.describe }\n : { outputSchema }),\n capabilities: [...(descriptor.capabilities ?? [])],\n errors: [...(descriptor.errors ?? [])],\n ...(descriptor.example === undefined ? {} : { example: descriptor.example }),\n },\n };\n }\n return node;\n}\n\ninterface Registered {\n readonly path: readonly string[];\n readonly contribution: ToolContribution;\n}\n\nfunction compareRegistered(left: Registered, right: Registered): number {\n return pathKey(left.path).localeCompare(pathKey(right.path));\n}\n\nfunction hasPrefix(left: ToolCommandPath, right: ToolCommandPath): boolean {\n return left.length < right.length && left.every((segment, index) => segment === right[index]);\n}\n\nfunction findNode(\n registered: readonly Registered[],\n path: ToolCommandPath,\n): Registered | undefined {\n return registered.find(\n (candidate) =>\n candidate.path.length === path.length &&\n candidate.path.every((segment, index) => segment === path[index]),\n );\n}\n\nfunction descendants(registered: readonly Registered[], path: ToolCommandPath): Registered[] {\n return registered.filter((candidate) => hasPrefix(path, candidate.path));\n}\n\nfunction projectNodes(\n registered: readonly Registered[],\n path: ToolCommandPath,\n recursive: boolean,\n): ToolCommandNode[] {\n const children = new Map<string, Registered | undefined>();\n for (const candidate of registered) {\n if (\n candidate.path.length <= path.length ||\n !path.every((segment, index) => candidate.path[index] === segment)\n )\n continue;\n const next = candidate.path[path.length] as string;\n const existing = children.get(next);\n if (\n existing === undefined ||\n candidate.path.length < (existing?.path.length ?? Number.MAX_SAFE_INTEGER)\n )\n children.set(next, candidate.path.length === path.length + 1 ? candidate : undefined);\n }\n return [...children.entries()]\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([name, exact]) => {\n const childPath = [...path, name];\n if (exact !== undefined)\n return nodeForDescriptor(exact.contribution.descriptor, childPath, false);\n const node: ToolCommandNode = {\n name,\n path: pathKey(childPath),\n summary: descendants(registered, childPath)[0]?.contribution.descriptor.summary ?? '',\n };\n if (recursive) return { ...node, children: projectNodes(registered, childPath, true) };\n return node;\n });\n}\n\nexport function commandPath(descriptor: ToolDescriptor): ToolCommandPath {\n return descriptorPath(descriptor);\n}\n\nexport function defineCommand<TArgs, TResult>(\n descriptor: Omit<ToolCommandDescriptor<TArgs, TResult>, 'id'> & { readonly id?: string },\n execute: ToolExecutor<TArgs, TResult>,\n): ToolContribution<TArgs, TResult> {\n const path = descriptorPath(descriptor as ToolDescriptor);\n return {\n descriptor: {\n ...descriptor,\n id: descriptor.id ?? path.join('.'),\n path,\n },\n execute,\n } as ToolContribution<TArgs, TResult>;\n}\n\nexport function createToolCommandRegistry(\n contributions: readonly ToolContribution[],\n): ToolCommandRegistry {\n const registered: Registered[] = [];\n const byPath = new Map<string, ToolContribution>();\n for (const contribution of contributions) {\n const path = descriptorPath(contribution.descriptor);\n const key = pathKey(path);\n if (\n byPath.has(key) ||\n registered.some(\n (candidate) => hasPrefix(candidate.path, path) || hasPrefix(path, candidate.path),\n )\n ) {\n throw new ToolCommandError(\n 'tool-command-conflict',\n key,\n 'command paths cannot collide with a leaf or its descendants',\n { path: key },\n );\n }\n byPath.set(key, contribution);\n registered.push({ path, contribution });\n }\n registered.sort(compareRegistered);\n const runtime = createToolRuntime(registered.map((entry) => entry.contribution));\n const find = (pathInput: ToolCommandPath | string): Registered | undefined => {\n const path = normalizePath(pathInput);\n return findNode(registered, path);\n };\n const help = (pathInput?: ToolCommandPath | string, recursive = false): ToolCommandHelp => {\n const path = pathInput === undefined ? [] : normalizePath(pathInput);\n const exact = path.length === 0 ? undefined : findNode(registered, path);\n const descendant = path.length === 0 ? registered : descendants(registered, path);\n if (path.length > 0 && exact === undefined && descendant.length === 0) {\n let parent = path.slice(0, -1);\n while (parent.length > 0 && descendants(registered, parent).length === 0)\n parent = parent.slice(0, -1);\n throw new ToolCommandError(\n 'tool-command-not-found',\n pathKey(path),\n 'command path was not found',\n {\n parent: pathKey(parent),\n candidates: projectNodes(registered, parent, false).map((node) => node.name),\n },\n );\n }\n const leaf =\n exact === undefined ? undefined : nodeForDescriptor(exact.contribution.descriptor, path).leaf;\n const summary = exact?.contribution.descriptor.summary;\n return {\n path: pathKey(path),\n ...(summary === undefined ? {} : { summary }),\n nodes: projectNodes(registered, path, recursive || exact !== undefined),\n ...(leaf === undefined ? {} : { leaf }),\n };\n };\n return {\n contributions: registered.map((entry) => entry.contribution),\n list: (path = []) => projectNodes(registered, path, false),\n tree: (path: ToolCommandPath | string = []) =>\n projectNodes(registered, normalizePath(path), true),\n describe: (pathInput) =>\n find(pathInput)?.contribution.descriptor as ToolCommandDescriptor | undefined,\n help,\n get: (pathInput) => find(pathInput)?.contribution,\n run: <TResult = unknown>(\n pathInput: ToolCommandPath | string,\n args: unknown,\n options?: ToolRunOptions,\n ): ToolRun<TResult> | undefined => {\n const contribution = find(pathInput)?.contribution;\n if (contribution === undefined) return undefined;\n return runtime.run(contribution, args, options) as ToolRun<TResult>;\n },\n };\n}\n","import type { JsonValue, ToolSchema, ToolSchemaResult } from './types.js';\n\n/** The small JSON Schema vocabulary shared by command contracts. */\nexport interface ToolJsonSchema {\n readonly type?: 'object' | 'array' | 'string' | 'number' | 'integer' | 'boolean' | 'null';\n readonly properties?: Readonly<Record<string, ToolJsonSchema>>;\n readonly required?: readonly string[];\n readonly additionalProperties?: boolean;\n readonly items?: ToolJsonSchema;\n readonly enum?: readonly JsonValue[];\n readonly const?: JsonValue;\n readonly minLength?: number;\n readonly minItems?: number;\n readonly minimum?: number;\n readonly maximum?: number;\n readonly description?: string;\n}\n\nexport interface ToolSchemaFailure {\n readonly path: string;\n readonly message: string;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction sameJson(left: unknown, right: unknown): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction typeMatches(type: ToolJsonSchema['type'], value: unknown): boolean {\n switch (type) {\n case undefined:\n return true;\n case 'null':\n return value === null;\n case 'array':\n return Array.isArray(value);\n case 'object':\n return isRecord(value);\n case 'string':\n return typeof value === 'string';\n case 'number':\n return typeof value === 'number' && Number.isFinite(value);\n case 'integer':\n return typeof value === 'number' && Number.isSafeInteger(value);\n case 'boolean':\n return typeof value === 'boolean';\n }\n}\n\nfunction validate(\n value: unknown,\n schema: ToolJsonSchema,\n path: string,\n): ToolSchemaFailure | undefined {\n if (!typeMatches(schema.type, value))\n return { path, message: `expected ${schema.type ?? 'a value'}` };\n if (schema.enum !== undefined && !schema.enum.some((candidate) => sameJson(candidate, value))) {\n return { path, message: 'expected one of the declared enum values' };\n }\n if (schema.const !== undefined && !sameJson(schema.const, value)) {\n return { path, message: 'expected the declared constant value' };\n }\n if (\n typeof value === 'string' &&\n schema.minLength !== undefined &&\n value.length < schema.minLength\n ) {\n return { path, message: `must contain at least ${schema.minLength} characters` };\n }\n if (typeof value === 'number') {\n if (schema.minimum !== undefined && value < schema.minimum)\n return { path, message: `must be at least ${schema.minimum}` };\n if (schema.maximum !== undefined && value > schema.maximum)\n return { path, message: `must be at most ${schema.maximum}` };\n }\n if (Array.isArray(value)) {\n if (schema.minItems !== undefined && value.length < schema.minItems)\n return { path, message: `must contain at least ${schema.minItems} items` };\n if (schema.items !== undefined) {\n for (let index = 0; index < value.length; index += 1) {\n const failure = validate(value[index], schema.items, `${path}[${index}]`);\n if (failure !== undefined) return failure;\n }\n }\n }\n if (isRecord(value)) {\n const properties = schema.properties ?? {};\n for (const key of schema.required ?? []) {\n if (!(key in value)) return { path: `${path}.${key}`, message: 'is required' };\n }\n if (schema.additionalProperties === false) {\n for (const key of Object.keys(value)) {\n if (!(key in properties)) return { path: `${path}.${key}`, message: 'is not declared' };\n }\n }\n for (const [key, child] of Object.entries(properties)) {\n if (!(key in value)) continue;\n const failure = validate(value[key], child, `${path}.${key}`);\n if (failure !== undefined) return failure;\n }\n }\n return undefined;\n}\n\nexport function parseToolJsonSchema<T = unknown>(\n value: unknown,\n schema: ToolJsonSchema,\n): ToolSchemaResult<T> {\n const failure = validate(value, schema, '$');\n return failure === undefined\n ? { ok: true, value: value as T }\n : { ok: false, error: `${failure.path}: ${failure.message}` };\n}\n\nexport function toolJsonSchema<T = unknown>(schema: ToolJsonSchema): ToolSchema<T> {\n return {\n parse: (value) => parseToolJsonSchema<T>(value, schema),\n describe: JSON.stringify(schema),\n };\n}\n","import { isSerializableValue } from './artifacts.js';\nimport { capabilityUnavailableError } from './errors.js';\nimport type {\n ArtifactRef,\n JsonValue,\n SnapshotRef,\n ToolEvidenceKind,\n ToolRealm,\n ToolRuntimeError,\n} from './types.js';\n\nexport type MigrationOperation =\n | 'project.build'\n | 'author.plugin-install'\n | 'preview.run'\n | 'project.preview'\n | 'material.preview'\n | 'mesh.preview'\n | 'vfx.preview'\n | 'texture.preview';\n\nexport interface MigrationCapabilityProbe {\n readonly realm: ToolRealm;\n readonly catalogDigest: string;\n readonly rhiBackend: 'webgpu' | 'null' | 'unknown';\n readonly evidence: readonly ToolEvidenceKind[];\n readonly carrier: boolean;\n readonly service: boolean;\n}\n\nexport interface CapabilityToken {\n readonly kind: 'forgeax-tool-capability';\n readonly version: '1.0.0';\n readonly operation: MigrationOperation;\n readonly source: MigrationCapabilityProbe;\n readonly target: MigrationCapabilityProbe;\n}\n\nexport interface MigrationRecipe {\n readonly operation: MigrationOperation;\n readonly args: JsonValue;\n readonly snapshot?: SnapshotRef;\n readonly artifacts: readonly ArtifactRef[];\n}\n\nexport type MigrationPayloadValidation =\n | { readonly ok: true }\n | { readonly ok: false; readonly error: ToolRuntimeError };\n\nconst liveStateKeys = new Set([\n 'world',\n 'renderer',\n 'canvas',\n 'context',\n 'fiber',\n 'page',\n 'carrier',\n 'ui',\n 'selection',\n 'draft',\n 'undo',\n 'session',\n]);\n\nfunction liveStateError(path: string, key: string): ToolRuntimeError {\n return {\n code: 'tool-migration-live-state',\n expected: 'migration payload to contain only recipe, snapshot, and artifact references',\n hint: 'Recreate the operation from serializable authority facts; do not migrate live state.',\n detail: { path, key },\n };\n}\n\nexport function createCapabilityToken(\n operation: MigrationOperation,\n source: MigrationCapabilityProbe,\n version: '1.0.0',\n target: MigrationCapabilityProbe,\n): CapabilityToken {\n if (source.catalogDigest.length === 0 || target.catalogDigest.length === 0)\n throw new TypeError('capability probe catalogDigest must not be empty');\n return {\n kind: 'forgeax-tool-capability',\n version,\n operation,\n source: { ...source, evidence: [...source.evidence] },\n target: { ...target, evidence: [...target.evidence] },\n };\n}\n\nexport function probeMigrationTarget(\n token: CapabilityToken,\n target: MigrationCapabilityProbe,\n):\n | { readonly ok: true; readonly value: MigrationCapabilityProbe }\n | {\n readonly ok: false;\n readonly error: ToolRuntimeError;\n } {\n const sameEvidence = token.target.evidence.every((kind) => target.evidence.includes(kind));\n const matches =\n token.target.realm === target.realm &&\n token.target.catalogDigest === target.catalogDigest &&\n token.target.rhiBackend === target.rhiBackend &&\n sameEvidence;\n if (!matches) {\n return {\n ok: false,\n error: capabilityUnavailableError(`migration:${token.operation}`, target.realm),\n };\n }\n return { ok: true, value: { ...target, evidence: [...target.evidence] } };\n}\n\nexport function createMigrationRecipe(input: {\n readonly operation: MigrationOperation;\n readonly args: JsonValue;\n readonly snapshot?: SnapshotRef;\n readonly artifacts?: readonly ArtifactRef[];\n}): MigrationRecipe {\n const recipe: MigrationRecipe = {\n operation: input.operation,\n args: input.args,\n ...(input.snapshot === undefined ? {} : { snapshot: { ...input.snapshot } }),\n artifacts: (input.artifacts ?? []).map((artifact) => ({ ...artifact })),\n };\n const validation = validateMigrationPayload(recipe);\n if (!validation.ok) {\n const path =\n validation.error.code === 'tool-migration-live-state' ? validation.error.detail.path : '$';\n throw new TypeError(path);\n }\n return recipe;\n}\n\nexport function validateMigrationPayload(value: unknown): MigrationPayloadValidation {\n const visit = (candidate: unknown, path: string): MigrationPayloadValidation => {\n if (!isSerializableValue(candidate)) {\n return { ok: false, error: liveStateError(path, path.split('.').at(-1) ?? '<root>') };\n }\n if (candidate === null || typeof candidate !== 'object') return { ok: true };\n if (Array.isArray(candidate)) {\n for (const [index, child] of candidate.entries()) {\n const result = visit(child, `${path}[${index}]`);\n if (!result.ok) return result;\n }\n return { ok: true };\n }\n for (const [key, child] of Object.entries(candidate)) {\n const normalized = key.replaceAll('_', '').replaceAll('-', '').toLowerCase();\n if (liveStateKeys.has(normalized)) return { ok: false, error: liveStateError(path, key) };\n const result = visit(child, `${path}.${key}`);\n if (!result.ok) return result;\n }\n return { ok: true };\n };\n return visit(value, '$');\n}\n","import type { SnapshotRef, ToolTerminal } from './types.js';\n\nexport function terminalSnapshot<TResult>(\n terminal: ToolTerminal<TResult>,\n): SnapshotRef | undefined {\n return terminal.snapshotAfter;\n}\n\nexport function isSnapshotRef(value: unknown): value is SnapshotRef {\n return (\n typeof value === 'object' &&\n value !== null &&\n Number.isSafeInteger(Reflect.get(value, 'revision')) &&\n Reflect.get(value, 'revision') >= 0 &&\n typeof Reflect.get(value, 'digest') === 'string' &&\n Reflect.get(value, 'digest').length > 0\n );\n}\n","import { validateRealmBootstrapPayload } from './capability.js';\nimport type {\n CarrierLease,\n CarrierLeaseRequest,\n CarrierPhase,\n CarrierResult,\n CarrierState,\n} from './carrier.js';\nimport type { JsonValue, ToolTerminal } from './types.js';\n\nexport interface CarrierTransport {\n readonly endpoint: string;\n readonly connected: boolean;\n readonly send: (payload: unknown) => boolean;\n readonly close: () => void;\n}\n\nexport interface CarrierExecutionRequest {\n readonly leaseId: string;\n readonly descriptorDigest: string;\n readonly recipeDigest: string;\n readonly args: unknown;\n}\n\nexport interface AuthenticatedCarrierTransport {\n readonly endpoint: string;\n readonly connected: boolean;\n readonly lease: (request: CarrierLeaseRequest) => Promise<CarrierResult<CarrierLease>>;\n readonly started: (request: { readonly leaseId: string }) => Promise<CarrierResult<CarrierState>>;\n readonly execute: (request: CarrierExecutionRequest) => Promise<{\n readonly ok: true;\n readonly value: ToolTerminal<unknown>;\n readonly state: CarrierPhase;\n }>;\n readonly exit: (request: { readonly leaseId: string }) => Promise<CarrierResult<CarrierState>>;\n readonly close: () => void;\n}\n\nexport interface AuthenticatedCarrierTransportOptions {\n readonly endpoint: string;\n readonly bearerToken: string;\n}\n\nexport class CarrierTransportError extends Error {\n readonly code: string;\n readonly expected?: string;\n readonly hint?: string;\n readonly detail?: Readonly<Record<string, unknown>>;\n\n constructor(error: {\n readonly code: string;\n readonly expected?: string;\n readonly hint?: string;\n readonly detail?: Readonly<Record<string, unknown>>;\n }) {\n super(error.code);\n this.name = 'CarrierTransportError';\n this.code = error.code;\n if (error.expected !== undefined) this.expected = error.expected;\n if (error.hint !== undefined) this.hint = error.hint;\n if (error.detail !== undefined) this.detail = error.detail;\n }\n}\n\nexport function createAuthenticatedCarrierTransport(\n options: AuthenticatedCarrierTransportOptions,\n): AuthenticatedCarrierTransport {\n const url = new URL(options.endpoint);\n if (url.protocol !== 'http:' || !['127.0.0.1', 'localhost'].includes(url.hostname))\n throw new TypeError('carrier transport endpoint must be loopback HTTP');\n if (options.bearerToken.length < 8) throw new TypeError('carrier bearer token is too short');\n let connected = true;\n async function request<T>(path: string, payload: unknown): Promise<T> {\n if (!connected)\n throw new CarrierTransportError({\n code: 'carrier-exited',\n expected: 'a connected carrier transport',\n hint: 'Request a fresh visible offer after provider exit.',\n });\n let response: Response;\n try {\n response = await fetch(`${options.endpoint}${path}`, {\n method: 'POST',\n headers: {\n authorization: `Bearer ${options.bearerToken}`,\n 'content-type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n } catch (cause) {\n throw new CarrierTransportError({\n code: 'carrier-provider-exit',\n expected: 'the carrier provider to remain reachable',\n hint: 'Offer a fresh carrier; do not fallback after started.',\n detail: { cause: cause instanceof Error ? cause.message : String(cause) },\n });\n }\n const value: unknown = await response.json().catch(() => ({}));\n if (\n !response.ok ||\n typeof value !== 'object' ||\n value === null ||\n !('ok' in value) ||\n value.ok !== true\n ) {\n const error =\n typeof value === 'object' &&\n value !== null &&\n 'error' in value &&\n typeof value.error === 'object' &&\n value.error !== null\n ? (value.error as Record<string, unknown>)\n : {\n code: 'carrier-provider-exit',\n expected: 'a successful carrier response',\n hint: 'Offer a fresh carrier and retry from a serialized snapshot.',\n };\n const normalized = {\n code: typeof error.code === 'string' ? error.code : 'carrier-provider-exit',\n ...(typeof error.expected === 'string' ? { expected: error.expected } : {}),\n ...(typeof error.hint === 'string' ? { hint: error.hint } : {}),\n ...(typeof error.detail === 'object' && error.detail !== null\n ? { detail: error.detail as Readonly<Record<string, unknown>> }\n : {}),\n };\n throw new CarrierTransportError(normalized);\n }\n return value as T;\n }\n return {\n endpoint: options.endpoint,\n get connected() {\n return connected;\n },\n lease: (payload) => request('/lease', payload),\n started: (payload) => request('/start', payload),\n execute: (payload) => request('/execute', payload),\n exit: (payload) => request('/exit', payload),\n close() {\n connected = false;\n },\n };\n}\n\n/** Minimal loopback transport seam; it carries POD only and owns no operation state. */\nexport function createLoopbackTransport(endpoint: string): CarrierTransport {\n const url = new URL(endpoint);\n if (url.protocol !== 'http:' || !['127.0.0.1', 'localhost'].includes(url.hostname)) {\n throw new TypeError('carrier transport endpoint must be loopback HTTP');\n }\n let connected = true;\n return {\n endpoint,\n get connected() {\n return connected;\n },\n send(payload) {\n if (!connected || !validateRealmBootstrapPayload(payload).ok) return false;\n return true;\n },\n close() {\n connected = false;\n },\n };\n}\n\nexport interface ServiceWireRequest {\n readonly descriptorDigest: string;\n readonly recipeDigest: string;\n readonly args: JsonValue;\n}\n\nexport type ServiceWireHandler = (\n request: ServiceWireRequest,\n) => Promise<ToolTerminal<unknown>> | ToolTerminal<unknown>;\n\nexport interface AuthenticatedLoopbackTransport {\n readonly endpoint: string;\n readonly connected: boolean;\n readonly request: (\n request: ServiceWireRequest,\n bearerToken: string,\n options?: { readonly signal?: AbortSignal },\n ) => Promise<ToolTerminal<unknown>>;\n readonly close: () => void;\n}\n\nexport interface AuthenticatedLoopbackTransportOptions {\n readonly endpoint: string;\n readonly bearerToken: string;\n}\n\nexport function createAuthenticatedLoopbackTransport(\n options: AuthenticatedLoopbackTransportOptions,\n): AuthenticatedLoopbackTransport {\n const url = new URL(options.endpoint);\n if (url.protocol !== 'http:' || !['127.0.0.1', 'localhost'].includes(url.hostname)) {\n throw new TypeError('service transport endpoint must be loopback HTTP');\n }\n if (options.bearerToken.length < 8) throw new TypeError('service bearer token is too short');\n let connected = true;\n return {\n endpoint: options.endpoint,\n get connected() {\n return connected;\n },\n async request(request, bearerToken, requestOptions = {}) {\n if (!connected) throw new Error('service transport is disconnected');\n if (bearerToken !== options.bearerToken) throw new Error('service bearer token rejected');\n if (!validateRealmBootstrapPayload(request).ok) {\n throw new Error('service request is not structured-clone safe');\n }\n const response = await fetch(options.endpoint, {\n method: 'POST',\n headers: {\n authorization: `Bearer ${bearerToken}`,\n 'content-type': 'application/json',\n },\n body: JSON.stringify(request),\n ...(requestOptions.signal === undefined ? {} : { signal: requestOptions.signal }),\n });\n const payload: unknown = await response.json();\n if (!response.ok) {\n const detail =\n typeof payload === 'object' && payload !== null && 'error' in payload\n ? String(payload.error)\n : `HTTP ${response.status}`;\n throw new Error(`service request failed: ${detail}`);\n }\n return payload as ToolTerminal<unknown>;\n },\n close() {\n connected = false;\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { JsonValue, ToolSchema, ToolSchemaResult } from './types.js';
|
|
2
|
+
/** The small JSON Schema vocabulary shared by command contracts. */
|
|
3
|
+
export interface ToolJsonSchema {
|
|
4
|
+
readonly type?: 'object' | 'array' | 'string' | 'number' | 'integer' | 'boolean' | 'null';
|
|
5
|
+
readonly properties?: Readonly<Record<string, ToolJsonSchema>>;
|
|
6
|
+
readonly required?: readonly string[];
|
|
7
|
+
readonly additionalProperties?: boolean;
|
|
8
|
+
readonly items?: ToolJsonSchema;
|
|
9
|
+
readonly enum?: readonly JsonValue[];
|
|
10
|
+
readonly const?: JsonValue;
|
|
11
|
+
readonly minLength?: number;
|
|
12
|
+
readonly minItems?: number;
|
|
13
|
+
readonly minimum?: number;
|
|
14
|
+
readonly maximum?: number;
|
|
15
|
+
readonly description?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface ToolSchemaFailure {
|
|
18
|
+
readonly path: string;
|
|
19
|
+
readonly message: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function parseToolJsonSchema<T = unknown>(value: unknown, schema: ToolJsonSchema): ToolSchemaResult<T>;
|
|
22
|
+
export declare function toolJsonSchema<T = unknown>(schema: ToolJsonSchema): ToolSchema<T>;
|
package/dist/types.d.ts
CHANGED
|
@@ -74,12 +74,20 @@ export type ToolSchemaResult<T> = {
|
|
|
74
74
|
};
|
|
75
75
|
export interface ToolDescriptor<TArgs = unknown, TResult = unknown> {
|
|
76
76
|
readonly id: string;
|
|
77
|
+
/** Public command path. When omitted, the stable id is split on dots. */
|
|
78
|
+
readonly path?: readonly string[];
|
|
77
79
|
readonly title: string;
|
|
78
80
|
readonly summary: string;
|
|
79
81
|
readonly realm: ToolRealm;
|
|
80
82
|
readonly argsSchema: ToolSchema<TArgs>;
|
|
81
83
|
readonly resultSchema: ToolSchema<TResult>;
|
|
82
84
|
readonly evidence: readonly ToolEvidenceKind[];
|
|
85
|
+
/** Optional JSON-schema-shaped projection used by help and SDK callers. */
|
|
86
|
+
readonly inputSchema?: JsonValue;
|
|
87
|
+
readonly outputSchema?: JsonValue;
|
|
88
|
+
readonly capabilities?: readonly string[];
|
|
89
|
+
readonly errors?: readonly string[];
|
|
90
|
+
readonly example?: JsonValue;
|
|
83
91
|
/** Domain preview descriptors bind a subject and snapshot without exposing live state. */
|
|
84
92
|
readonly preview?: ToolPreviewContract;
|
|
85
93
|
}
|