@nifrajs/coding-agent 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/EXTENSIONS.md +25 -0
- package/PERFORMANCE.md +19 -0
- package/README.md +69 -0
- package/REGISTRY.md +15 -0
- package/SECURITY.md +32 -0
- package/dist/approvals.d.ts +70 -0
- package/dist/approvals.d.ts.map +1 -0
- package/dist/approvals.js +174 -0
- package/dist/approvals.js.map +1 -0
- package/dist/capabilities.d.ts +20 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +49 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/cli.d.ts +24 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +380 -0
- package/dist/cli.js.map +1 -0
- package/dist/context.d.ts +17 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +66 -0
- package/dist/context.js.map +1 -0
- package/dist/deployment-adapters.d.ts +40 -0
- package/dist/deployment-adapters.d.ts.map +1 -0
- package/dist/deployment-adapters.js +147 -0
- package/dist/deployment-adapters.js.map +1 -0
- package/dist/diff.d.ts +17 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +61 -0
- package/dist/diff.js.map +1 -0
- package/dist/errors.d.ts +9 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +35 -0
- package/dist/errors.js.map +1 -0
- package/dist/extensions.d.ts +104 -0
- package/dist/extensions.d.ts.map +1 -0
- package/dist/extensions.js +284 -0
- package/dist/extensions.js.map +1 -0
- package/dist/handoffs.d.ts +97 -0
- package/dist/handoffs.d.ts.map +1 -0
- package/dist/handoffs.js +199 -0
- package/dist/handoffs.js.map +1 -0
- package/dist/healing.d.ts +56 -0
- package/dist/healing.d.ts.map +1 -0
- package/dist/healing.js +54 -0
- package/dist/healing.js.map +1 -0
- package/dist/host.d.ts +61 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +369 -0
- package/dist/host.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/isolated-worker.d.ts +2 -0
- package/dist/isolated-worker.d.ts.map +1 -0
- package/dist/isolated-worker.js +155 -0
- package/dist/isolated-worker.js.map +1 -0
- package/dist/isolated.d.ts +52 -0
- package/dist/isolated.d.ts.map +1 -0
- package/dist/isolated.js +293 -0
- package/dist/isolated.js.map +1 -0
- package/dist/native.d.ts +92 -0
- package/dist/native.d.ts.map +1 -0
- package/dist/native.js +339 -0
- package/dist/native.js.map +1 -0
- package/dist/orchestration/artifact-port.d.ts +30 -0
- package/dist/orchestration/artifact-port.d.ts.map +1 -0
- package/dist/orchestration/artifact-port.js +59 -0
- package/dist/orchestration/artifact-port.js.map +1 -0
- package/dist/orchestration/catalog.d.ts +71 -0
- package/dist/orchestration/catalog.d.ts.map +1 -0
- package/dist/orchestration/catalog.js +46 -0
- package/dist/orchestration/catalog.js.map +1 -0
- package/dist/orchestration/compile.d.ts +59 -0
- package/dist/orchestration/compile.d.ts.map +1 -0
- package/dist/orchestration/compile.js +268 -0
- package/dist/orchestration/compile.js.map +1 -0
- package/dist/orchestration/dispatch.d.ts +115 -0
- package/dist/orchestration/dispatch.d.ts.map +1 -0
- package/dist/orchestration/dispatch.js +220 -0
- package/dist/orchestration/dispatch.js.map +1 -0
- package/dist/orchestration/durable-jobs.d.ts +35 -0
- package/dist/orchestration/durable-jobs.d.ts.map +1 -0
- package/dist/orchestration/durable-jobs.js +273 -0
- package/dist/orchestration/durable-jobs.js.map +1 -0
- package/dist/orchestration/effect-key.d.ts +23 -0
- package/dist/orchestration/effect-key.d.ts.map +1 -0
- package/dist/orchestration/effect-key.js +24 -0
- package/dist/orchestration/effect-key.js.map +1 -0
- package/dist/orchestration/evidence-store.d.ts +75 -0
- package/dist/orchestration/evidence-store.d.ts.map +1 -0
- package/dist/orchestration/evidence-store.js +183 -0
- package/dist/orchestration/evidence-store.js.map +1 -0
- package/dist/orchestration/hash.d.ts +12 -0
- package/dist/orchestration/hash.d.ts.map +1 -0
- package/dist/orchestration/hash.js +43 -0
- package/dist/orchestration/hash.js.map +1 -0
- package/dist/orchestration/host.d.ts +121 -0
- package/dist/orchestration/host.d.ts.map +1 -0
- package/dist/orchestration/host.js +334 -0
- package/dist/orchestration/host.js.map +1 -0
- package/dist/orchestration/index.d.ts +20 -0
- package/dist/orchestration/index.d.ts.map +1 -0
- package/dist/orchestration/index.js +19 -0
- package/dist/orchestration/index.js.map +1 -0
- package/dist/orchestration/policy.d.ts +63 -0
- package/dist/orchestration/policy.d.ts.map +1 -0
- package/dist/orchestration/policy.js +80 -0
- package/dist/orchestration/policy.js.map +1 -0
- package/dist/orchestration/recovery.d.ts +87 -0
- package/dist/orchestration/recovery.d.ts.map +1 -0
- package/dist/orchestration/recovery.js +197 -0
- package/dist/orchestration/recovery.js.map +1 -0
- package/dist/orchestration/tracer.d.ts +31 -0
- package/dist/orchestration/tracer.d.ts.map +1 -0
- package/dist/orchestration/tracer.js +141 -0
- package/dist/orchestration/tracer.js.map +1 -0
- package/dist/plans.d.ts +35 -0
- package/dist/plans.d.ts.map +1 -0
- package/dist/plans.js +63 -0
- package/dist/plans.js.map +1 -0
- package/dist/presets.d.ts +10 -0
- package/dist/presets.d.ts.map +1 -0
- package/dist/presets.js +70 -0
- package/dist/presets.js.map +1 -0
- package/dist/process.d.ts +6 -0
- package/dist/process.d.ts.map +1 -0
- package/dist/process.js +42 -0
- package/dist/process.js.map +1 -0
- package/dist/registry.d.ts +37 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +51 -0
- package/dist/registry.js.map +1 -0
- package/dist/replay.d.ts +24 -0
- package/dist/replay.d.ts.map +1 -0
- package/dist/replay.js +154 -0
- package/dist/replay.js.map +1 -0
- package/dist/rpc.d.ts +51 -0
- package/dist/rpc.d.ts.map +1 -0
- package/dist/rpc.js +412 -0
- package/dist/rpc.js.map +1 -0
- package/dist/session-migration.d.ts +59 -0
- package/dist/session-migration.d.ts.map +1 -0
- package/dist/session-migration.js +315 -0
- package/dist/session-migration.js.map +1 -0
- package/dist/sessions.d.ts +74 -0
- package/dist/sessions.d.ts.map +1 -0
- package/dist/sessions.js +222 -0
- package/dist/sessions.js.map +1 -0
- package/dist/subagents.d.ts +51 -0
- package/dist/subagents.d.ts.map +1 -0
- package/dist/subagents.js +141 -0
- package/dist/subagents.js.map +1 -0
- package/dist/tools.d.ts +13 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +37 -0
- package/dist/tools.js.map +1 -0
- package/dist/ui.d.ts +42 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +93 -0
- package/dist/ui.js.map +1 -0
- package/dist/verification.d.ts +34 -0
- package/dist/verification.d.ts.map +1 -0
- package/dist/verification.js +91 -0
- package/dist/verification.js.map +1 -0
- package/dist/workflows.d.ts +98 -0
- package/dist/workflows.d.ts.map +1 -0
- package/dist/workflows.js +174 -0
- package/dist/workflows.js.map +1 -0
- package/package.json +84 -0
- package/src/approvals.ts +249 -0
- package/src/capabilities.ts +74 -0
- package/src/cli.ts +405 -0
- package/src/context.ts +81 -0
- package/src/deployment-adapters.ts +181 -0
- package/src/diff.ts +80 -0
- package/src/errors.ts +46 -0
- package/src/extensions.ts +402 -0
- package/src/handoffs.ts +299 -0
- package/src/healing.ts +93 -0
- package/src/host.ts +465 -0
- package/src/index.ts +165 -0
- package/src/isolated-worker.ts +177 -0
- package/src/isolated.ts +344 -0
- package/src/native.ts +478 -0
- package/src/orchestration/artifact-port.ts +75 -0
- package/src/orchestration/catalog.ts +102 -0
- package/src/orchestration/compile.ts +373 -0
- package/src/orchestration/dispatch.ts +383 -0
- package/src/orchestration/durable-jobs.ts +374 -0
- package/src/orchestration/effect-key.ts +35 -0
- package/src/orchestration/evidence-store.ts +233 -0
- package/src/orchestration/hash.ts +43 -0
- package/src/orchestration/host.ts +445 -0
- package/src/orchestration/index.ts +131 -0
- package/src/orchestration/policy.ts +116 -0
- package/src/orchestration/recovery.ts +271 -0
- package/src/orchestration/tracer.ts +177 -0
- package/src/plans.ts +105 -0
- package/src/presets.ts +90 -0
- package/src/process.ts +47 -0
- package/src/registry.ts +80 -0
- package/src/replay.ts +190 -0
- package/src/rpc.ts +598 -0
- package/src/session-migration.ts +401 -0
- package/src/sessions.ts +303 -0
- package/src/subagents.ts +210 -0
- package/src/tools.ts +52 -0
- package/src/ui.ts +137 -0
- package/src/verification.ts +133 -0
- package/src/workflows.ts +279 -0
package/dist/native.d.ts
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { type ModelGateway, type ModelRoutePolicy } from "@nifrajs/agent";
|
|
2
|
+
import { type AgentBackend, type AgentBackendInfo, type AgentEvent, type AgentSessionSnapshot, type CreateSessionInput, type ReloadResult, type SendMessageInput } from "@nifrajs/agent-protocol";
|
|
3
|
+
export interface NativeMessage {
|
|
4
|
+
readonly role: "user" | "assistant" | "tool";
|
|
5
|
+
readonly text: string;
|
|
6
|
+
readonly name?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface NativeTool {
|
|
9
|
+
readonly name: string;
|
|
10
|
+
readonly description: string;
|
|
11
|
+
readonly capabilities?: readonly string[];
|
|
12
|
+
readonly requiresApproval?: boolean | ((input: unknown) => boolean | PromiseLike<boolean>);
|
|
13
|
+
readonly execute: (input: unknown, context: {
|
|
14
|
+
readonly cwd: string;
|
|
15
|
+
readonly signal: AbortSignal;
|
|
16
|
+
}) => unknown | PromiseLike<unknown>;
|
|
17
|
+
}
|
|
18
|
+
export interface NativeModelRequest {
|
|
19
|
+
readonly sessionId: string;
|
|
20
|
+
readonly cwd: string;
|
|
21
|
+
readonly messages: readonly NativeMessage[];
|
|
22
|
+
readonly tools: readonly Pick<NativeTool, "name" | "description" | "capabilities">[];
|
|
23
|
+
readonly signal: AbortSignal;
|
|
24
|
+
}
|
|
25
|
+
export type NativeModelResponse = {
|
|
26
|
+
readonly type: "text";
|
|
27
|
+
readonly text: string;
|
|
28
|
+
} | {
|
|
29
|
+
readonly type: "tool";
|
|
30
|
+
readonly name: string;
|
|
31
|
+
readonly input: unknown;
|
|
32
|
+
};
|
|
33
|
+
export type NativeModelChunk = {
|
|
34
|
+
readonly type: "text_delta";
|
|
35
|
+
readonly text: string;
|
|
36
|
+
} | {
|
|
37
|
+
readonly type: "response";
|
|
38
|
+
readonly response: NativeModelResponse;
|
|
39
|
+
};
|
|
40
|
+
export interface NativeModelPort {
|
|
41
|
+
complete(request: NativeModelRequest): NativeModelResponse | PromiseLike<NativeModelResponse> | AsyncIterable<NativeModelChunk>;
|
|
42
|
+
}
|
|
43
|
+
export interface NativeGatewayModelPortOptions {
|
|
44
|
+
readonly gateway: ModelGateway;
|
|
45
|
+
readonly policy: ModelRoutePolicy;
|
|
46
|
+
readonly routeId?: string;
|
|
47
|
+
}
|
|
48
|
+
/** Adapt the provider-neutral gateway to the native backend without making it the default path. */
|
|
49
|
+
export declare function createNativeGatewayModelPort(options: NativeGatewayModelPortOptions): NativeModelPort;
|
|
50
|
+
export interface NativeApprovalPort {
|
|
51
|
+
request(input: {
|
|
52
|
+
readonly sessionId: string;
|
|
53
|
+
readonly tool: NativeTool;
|
|
54
|
+
readonly input: unknown;
|
|
55
|
+
readonly signal: AbortSignal;
|
|
56
|
+
}): boolean | PromiseLike<boolean>;
|
|
57
|
+
}
|
|
58
|
+
export interface NifraBackendOptions {
|
|
59
|
+
readonly model: NativeModelPort;
|
|
60
|
+
readonly tools?: readonly NativeTool[];
|
|
61
|
+
readonly approval?: NativeApprovalPort;
|
|
62
|
+
readonly maxSteps?: number;
|
|
63
|
+
readonly maxMessageChars?: number;
|
|
64
|
+
readonly now?: () => number;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Small provider port for a future Nifra-native backend.
|
|
68
|
+
*
|
|
69
|
+
* It deliberately knows only messages, tools, and the protocol. Provider SDKs, credentials, UI,
|
|
70
|
+
* and framework packages stay outside this module. A model may return one response or stream
|
|
71
|
+
* deltas followed by a final response.
|
|
72
|
+
*/
|
|
73
|
+
export declare class NifraBackend implements AgentBackend {
|
|
74
|
+
readonly info: AgentBackendInfo;
|
|
75
|
+
private readonly options;
|
|
76
|
+
private readonly sessions;
|
|
77
|
+
constructor(options: NifraBackendOptions);
|
|
78
|
+
createSession(input: CreateSessionInput): Promise<AgentSessionSnapshot>;
|
|
79
|
+
send(input: SendMessageInput): AsyncIterable<AgentEvent>;
|
|
80
|
+
cancel(sessionId: string, reason?: string): Promise<void>;
|
|
81
|
+
snapshot(sessionId: string): Promise<AgentSessionSnapshot>;
|
|
82
|
+
reload(sessionId: string): Promise<ReloadResult>;
|
|
83
|
+
close(sessionId: string): Promise<void>;
|
|
84
|
+
private run;
|
|
85
|
+
private consumeModel;
|
|
86
|
+
private finish;
|
|
87
|
+
private emit;
|
|
88
|
+
private update;
|
|
89
|
+
private requireSession;
|
|
90
|
+
private now;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=native.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"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"}
|
package/dist/native.js
ADDED
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
import { runModelGateway, structuredOutputParser, } from "@nifrajs/agent";
|
|
2
|
+
import { agentError, createAgentEventStream, } from "@nifrajs/agent-protocol";
|
|
3
|
+
/** Adapt the provider-neutral gateway to the native backend without making it the default path. */
|
|
4
|
+
export function createNativeGatewayModelPort(options) {
|
|
5
|
+
const parser = structuredOutputParser((value) => parseNativeModelResponse(value));
|
|
6
|
+
return {
|
|
7
|
+
complete(request) {
|
|
8
|
+
return runModelGateway(options.gateway, {
|
|
9
|
+
input: request,
|
|
10
|
+
...(options.routeId === undefined ? {} : { routeId: options.routeId }),
|
|
11
|
+
parser,
|
|
12
|
+
signal: request.signal,
|
|
13
|
+
}, options.policy).then((result) => {
|
|
14
|
+
if (!result.ok)
|
|
15
|
+
throw new Error(`native gateway failed: ${result.error.code}`);
|
|
16
|
+
return result.output;
|
|
17
|
+
});
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function parseNativeModelResponse(value) {
|
|
22
|
+
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
23
|
+
throw new TypeError("native model response is invalid");
|
|
24
|
+
const record = value;
|
|
25
|
+
if (record.type === "text" && typeof record.text === "string")
|
|
26
|
+
return Object.freeze({ type: "text", text: record.text });
|
|
27
|
+
if (record.type === "tool" && typeof record.name === "string" && Object.hasOwn(record, "input"))
|
|
28
|
+
return Object.freeze({ type: "tool", name: record.name, input: record.input });
|
|
29
|
+
throw new TypeError("native model response is invalid");
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Small provider port for a future Nifra-native backend.
|
|
33
|
+
*
|
|
34
|
+
* It deliberately knows only messages, tools, and the protocol. Provider SDKs, credentials, UI,
|
|
35
|
+
* and framework packages stay outside this module. A model may return one response or stream
|
|
36
|
+
* deltas followed by a final response.
|
|
37
|
+
*/
|
|
38
|
+
export class NifraBackend {
|
|
39
|
+
info = Object.freeze({
|
|
40
|
+
name: "nifra",
|
|
41
|
+
capabilities: Object.freeze(["sessions", "extensions", "reload", "approvals", "streaming"]),
|
|
42
|
+
});
|
|
43
|
+
options;
|
|
44
|
+
sessions = new Map();
|
|
45
|
+
constructor(options) {
|
|
46
|
+
this.options = Object.freeze({
|
|
47
|
+
...options,
|
|
48
|
+
maxSteps: options.maxSteps ?? 32,
|
|
49
|
+
maxMessageChars: options.maxMessageChars ?? 64 * 1024,
|
|
50
|
+
tools: Object.freeze([...(options.tools ?? [])]),
|
|
51
|
+
});
|
|
52
|
+
if (!Number.isSafeInteger(this.options.maxSteps) ||
|
|
53
|
+
this.options.maxSteps < 1 ||
|
|
54
|
+
this.options.maxSteps > 512)
|
|
55
|
+
throw new RangeError("nifra backend: maxSteps must be between 1 and 512");
|
|
56
|
+
if (!Number.isSafeInteger(this.options.maxMessageChars) || this.options.maxMessageChars < 256)
|
|
57
|
+
throw new RangeError("nifra backend: maxMessageChars must be at least 256");
|
|
58
|
+
}
|
|
59
|
+
async createSession(input) {
|
|
60
|
+
const id = input.sessionId ?? crypto.randomUUID();
|
|
61
|
+
if (!/^[a-zA-Z0-9._:-]{1,128}$/.test(id))
|
|
62
|
+
throw new TypeError("nifra backend: sessionId must be a bounded token");
|
|
63
|
+
if (this.sessions.has(id))
|
|
64
|
+
throw new Error(`nifra backend: session already exists: ${id}`);
|
|
65
|
+
const now = this.now();
|
|
66
|
+
const snapshot = {
|
|
67
|
+
version: 1,
|
|
68
|
+
id,
|
|
69
|
+
backend: this.info.name,
|
|
70
|
+
cwd: input.cwd,
|
|
71
|
+
status: "idle",
|
|
72
|
+
createdAt: now,
|
|
73
|
+
updatedAt: now,
|
|
74
|
+
lastSeq: 0,
|
|
75
|
+
capabilities: Object.freeze([...(input.capabilities ?? this.info.capabilities)]),
|
|
76
|
+
};
|
|
77
|
+
const session = {
|
|
78
|
+
id,
|
|
79
|
+
cwd: input.cwd,
|
|
80
|
+
messages: [],
|
|
81
|
+
controller: new AbortController(),
|
|
82
|
+
snapshot,
|
|
83
|
+
active: undefined,
|
|
84
|
+
seq: 0,
|
|
85
|
+
extensionRevision: 0,
|
|
86
|
+
closed: false,
|
|
87
|
+
};
|
|
88
|
+
this.sessions.set(id, session);
|
|
89
|
+
return snapshot;
|
|
90
|
+
}
|
|
91
|
+
send(input) {
|
|
92
|
+
const session = this.requireSession(input.sessionId);
|
|
93
|
+
if (session.closed)
|
|
94
|
+
return failedStream(agentError("SESSION_CLOSED", "Nifra session is closed"));
|
|
95
|
+
if (session.active !== undefined)
|
|
96
|
+
return failedStream(agentError("SESSION_BUSY", "Nifra session is busy"));
|
|
97
|
+
if (input.message.length === 0 || input.message.length > this.options.maxMessageChars)
|
|
98
|
+
return failedStream(agentError("MESSAGE_BOUNDED", "message is empty or exceeds the configured limit"));
|
|
99
|
+
const stream = createAgentEventStream();
|
|
100
|
+
session.active = stream;
|
|
101
|
+
session.controller = new AbortController();
|
|
102
|
+
const signal = session.controller.signal;
|
|
103
|
+
if (input.signal !== undefined) {
|
|
104
|
+
const externalSignal = input.signal;
|
|
105
|
+
if (externalSignal.aborted)
|
|
106
|
+
session.controller.abort(externalSignal.reason);
|
|
107
|
+
else
|
|
108
|
+
externalSignal.addEventListener("abort", () => session.controller.abort(externalSignal.reason), { once: true });
|
|
109
|
+
}
|
|
110
|
+
void this.run(session, input.message, stream, signal);
|
|
111
|
+
return stream;
|
|
112
|
+
}
|
|
113
|
+
async cancel(sessionId, reason = "cancelled") {
|
|
114
|
+
const session = this.requireSession(sessionId);
|
|
115
|
+
if (session.closed)
|
|
116
|
+
return;
|
|
117
|
+
const stream = session.active;
|
|
118
|
+
session.controller.abort(reason);
|
|
119
|
+
this.update(session, "stopped");
|
|
120
|
+
this.emit(session, { type: "session.stopped", reason });
|
|
121
|
+
stream?.complete();
|
|
122
|
+
session.active = undefined;
|
|
123
|
+
}
|
|
124
|
+
async snapshot(sessionId) {
|
|
125
|
+
return this.requireSession(sessionId).snapshot;
|
|
126
|
+
}
|
|
127
|
+
async reload(sessionId) {
|
|
128
|
+
const session = this.requireSession(sessionId);
|
|
129
|
+
if (session.active !== undefined)
|
|
130
|
+
return {
|
|
131
|
+
revision: session.snapshot.extensionRevision ?? "unchanged",
|
|
132
|
+
loaded: [],
|
|
133
|
+
disabled: [],
|
|
134
|
+
rolledBack: false,
|
|
135
|
+
error: agentError("SESSION_BUSY", "Nifra session is busy"),
|
|
136
|
+
};
|
|
137
|
+
session.extensionRevision += 1;
|
|
138
|
+
const revision = `nifra:${session.extensionRevision}`;
|
|
139
|
+
session.snapshot = Object.freeze({
|
|
140
|
+
...session.snapshot,
|
|
141
|
+
extensionRevision: revision,
|
|
142
|
+
updatedAt: this.now(),
|
|
143
|
+
});
|
|
144
|
+
return { revision, loaded: [], disabled: [], rolledBack: false };
|
|
145
|
+
}
|
|
146
|
+
async close(sessionId) {
|
|
147
|
+
const session = this.requireSession(sessionId);
|
|
148
|
+
if (session.closed)
|
|
149
|
+
return;
|
|
150
|
+
session.closed = true;
|
|
151
|
+
session.controller.abort("closed");
|
|
152
|
+
session.active?.complete();
|
|
153
|
+
session.active = undefined;
|
|
154
|
+
this.sessions.delete(sessionId);
|
|
155
|
+
}
|
|
156
|
+
async run(session, message, stream, signal) {
|
|
157
|
+
const turnId = crypto.randomUUID();
|
|
158
|
+
this.update(session, "running", turnId);
|
|
159
|
+
this.emit(session, { type: "turn.started", turnId, prompt: message });
|
|
160
|
+
session.messages.push({ role: "user", text: message });
|
|
161
|
+
try {
|
|
162
|
+
for (let step = 0; step < this.options.maxSteps; step++) {
|
|
163
|
+
if (signal.aborted)
|
|
164
|
+
throw new Error("native turn cancelled");
|
|
165
|
+
const raw = this.options.model.complete({
|
|
166
|
+
sessionId: session.id,
|
|
167
|
+
cwd: session.cwd,
|
|
168
|
+
messages: Object.freeze(session.messages.map((item) => Object.freeze({ ...item }))),
|
|
169
|
+
tools: Object.freeze(this.options.tools.map((tool) => ({
|
|
170
|
+
name: tool.name,
|
|
171
|
+
description: tool.description,
|
|
172
|
+
...(tool.capabilities === undefined ? {} : { capabilities: tool.capabilities }),
|
|
173
|
+
}))),
|
|
174
|
+
signal,
|
|
175
|
+
});
|
|
176
|
+
const response = await this.consumeModel(raw, session, turnId, signal);
|
|
177
|
+
if (response.type === "text") {
|
|
178
|
+
session.messages.push({ role: "assistant", text: response.text });
|
|
179
|
+
this.emit(session, { type: "assistant.message", turnId, text: response.text });
|
|
180
|
+
this.finish(session, stream);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
const tool = this.options.tools.find((candidate) => candidate.name === response.name);
|
|
184
|
+
if (tool === undefined) {
|
|
185
|
+
this.emit(session, {
|
|
186
|
+
type: "tool.completed",
|
|
187
|
+
turnId,
|
|
188
|
+
callId: crypto.randomUUID(),
|
|
189
|
+
name: response.name,
|
|
190
|
+
ok: false,
|
|
191
|
+
error: agentError("UNKNOWN_TOOL", `unknown native tool: ${response.name}`),
|
|
192
|
+
});
|
|
193
|
+
session.messages.push({ role: "tool", name: response.name, text: "unknown tool" });
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
const callId = crypto.randomUUID();
|
|
197
|
+
this.emit(session, {
|
|
198
|
+
type: "tool.started",
|
|
199
|
+
turnId,
|
|
200
|
+
callId,
|
|
201
|
+
name: tool.name,
|
|
202
|
+
input: response.input,
|
|
203
|
+
});
|
|
204
|
+
const needsApproval = typeof tool.requiresApproval === "function"
|
|
205
|
+
? await tool.requiresApproval(response.input)
|
|
206
|
+
: tool.requiresApproval === true;
|
|
207
|
+
if (needsApproval) {
|
|
208
|
+
if (this.options.approval === undefined ||
|
|
209
|
+
!(await this.options.approval.request({
|
|
210
|
+
sessionId: session.id,
|
|
211
|
+
tool,
|
|
212
|
+
input: response.input,
|
|
213
|
+
signal,
|
|
214
|
+
}))) {
|
|
215
|
+
this.emit(session, {
|
|
216
|
+
type: "tool.completed",
|
|
217
|
+
turnId,
|
|
218
|
+
callId,
|
|
219
|
+
name: tool.name,
|
|
220
|
+
ok: false,
|
|
221
|
+
error: agentError("APPROVAL_DENIED", `approval denied for ${tool.name}`),
|
|
222
|
+
});
|
|
223
|
+
session.messages.push({ role: "tool", name: tool.name, text: "approval denied" });
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
try {
|
|
228
|
+
const output = await tool.execute(response.input, { cwd: session.cwd, signal });
|
|
229
|
+
const text = boundedText(output);
|
|
230
|
+
session.messages.push({ role: "tool", name: tool.name, text });
|
|
231
|
+
this.emit(session, {
|
|
232
|
+
type: "tool.completed",
|
|
233
|
+
turnId,
|
|
234
|
+
callId,
|
|
235
|
+
name: tool.name,
|
|
236
|
+
ok: true,
|
|
237
|
+
output: text,
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
242
|
+
session.messages.push({ role: "tool", name: tool.name, text: message });
|
|
243
|
+
this.emit(session, {
|
|
244
|
+
type: "tool.completed",
|
|
245
|
+
turnId,
|
|
246
|
+
callId,
|
|
247
|
+
name: tool.name,
|
|
248
|
+
ok: false,
|
|
249
|
+
error: agentError("TOOL_FAILED", message),
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
throw new Error("native turn exceeded maxSteps");
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
if (session.closed)
|
|
257
|
+
return;
|
|
258
|
+
this.update(session, signal.aborted ? "stopped" : "failed");
|
|
259
|
+
this.emit(session, {
|
|
260
|
+
type: "session.failed",
|
|
261
|
+
error: agentError(signal.aborted ? "TURN_CANCELLED" : "NATIVE_TURN_FAILED", error instanceof Error ? error.message : String(error)),
|
|
262
|
+
recoverable: true,
|
|
263
|
+
});
|
|
264
|
+
stream.complete();
|
|
265
|
+
session.active = undefined;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
async consumeModel(raw, session, turnId, signal) {
|
|
269
|
+
if (isAsyncIterable(raw)) {
|
|
270
|
+
let response;
|
|
271
|
+
for await (const chunk of raw) {
|
|
272
|
+
if (signal.aborted)
|
|
273
|
+
throw new Error("native turn cancelled");
|
|
274
|
+
if (chunk.type === "text_delta")
|
|
275
|
+
this.emit(session, { type: "assistant.delta", turnId, text: chunk.text });
|
|
276
|
+
else
|
|
277
|
+
response = chunk.response;
|
|
278
|
+
}
|
|
279
|
+
if (response === undefined)
|
|
280
|
+
throw new Error("native model stream ended without a response");
|
|
281
|
+
return response;
|
|
282
|
+
}
|
|
283
|
+
return await raw;
|
|
284
|
+
}
|
|
285
|
+
finish(session, stream) {
|
|
286
|
+
this.update(session, "idle");
|
|
287
|
+
this.emit(session, { type: "session.completed", snapshot: session.snapshot });
|
|
288
|
+
stream.complete();
|
|
289
|
+
session.active = undefined;
|
|
290
|
+
}
|
|
291
|
+
emit(session, payload) {
|
|
292
|
+
const event = Object.freeze({
|
|
293
|
+
version: 1,
|
|
294
|
+
sessionId: session.id,
|
|
295
|
+
seq: session.seq++,
|
|
296
|
+
at: this.now(),
|
|
297
|
+
...payload,
|
|
298
|
+
});
|
|
299
|
+
session.snapshot = Object.freeze({
|
|
300
|
+
...session.snapshot,
|
|
301
|
+
lastSeq: event.seq,
|
|
302
|
+
updatedAt: event.at,
|
|
303
|
+
});
|
|
304
|
+
session.active?.push(event);
|
|
305
|
+
}
|
|
306
|
+
update(session, status, turnId) {
|
|
307
|
+
const next = { ...session.snapshot, status, updatedAt: this.now(), lastSeq: session.seq };
|
|
308
|
+
session.snapshot = Object.freeze(status === "running" && turnId !== undefined ? { ...next, activeTurnId: turnId } : next);
|
|
309
|
+
if (session.active !== undefined)
|
|
310
|
+
this.emit(session, { type: "session.updated", snapshot: session.snapshot });
|
|
311
|
+
}
|
|
312
|
+
requireSession(id) {
|
|
313
|
+
const session = this.sessions.get(id);
|
|
314
|
+
if (session === undefined)
|
|
315
|
+
throw new Error(`nifra backend: unknown session: ${id}`);
|
|
316
|
+
return session;
|
|
317
|
+
}
|
|
318
|
+
now() {
|
|
319
|
+
return this.options.now?.() ?? Date.now();
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
function isAsyncIterable(value) {
|
|
323
|
+
return value !== null && typeof value === "object" && Symbol.asyncIterator in value;
|
|
324
|
+
}
|
|
325
|
+
function boundedText(value) {
|
|
326
|
+
try {
|
|
327
|
+
const text = typeof value === "string" ? value : JSON.stringify(value);
|
|
328
|
+
return text.length > 64 * 1024 ? `${text.slice(0, 64 * 1024)}…[truncated]` : text;
|
|
329
|
+
}
|
|
330
|
+
catch {
|
|
331
|
+
return "[unserializable tool output]";
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
function failedStream(error) {
|
|
335
|
+
const stream = createAgentEventStream();
|
|
336
|
+
stream.fail(error);
|
|
337
|
+
return stream;
|
|
338
|
+
}
|
|
339
|
+
//# sourceMappingURL=native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native.js","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reference {@link ArtifactPort} implementations - the only artifact sinks the public repo ships.
|
|
3
|
+
*
|
|
4
|
+
* Neither persists durably: {@link noopArtifactPort} hashes and discards; {@link memoryArtifactPort}
|
|
5
|
+
* keeps bytes in a bounded process-local map for tests only and refuses a large budget. A durable,
|
|
6
|
+
* tenant-aware, or encrypted store is caller-owned and never lives here - the absence of a
|
|
7
|
+
* persisting sink in the public package IS the privacy guardrail.
|
|
8
|
+
*/
|
|
9
|
+
import type { ArtifactPort } from "@nifrajs/agent-protocol";
|
|
10
|
+
/**
|
|
11
|
+
* Hashes the payload for a content-free {@link ArtifactRef}, then discards the bytes. The default
|
|
12
|
+
* port: public code sees only the digest, size, and coordinates - never the payload.
|
|
13
|
+
*/
|
|
14
|
+
export declare function noopArtifactPort(): ArtifactPort;
|
|
15
|
+
/** A memory port that additionally exposes stored bytes for assertions. Test-only. */
|
|
16
|
+
export interface MemoryArtifactPort extends ArtifactPort {
|
|
17
|
+
/** Return the retained bytes for an id, or undefined. Test assertions only. */
|
|
18
|
+
get(id: string): Uint8Array | undefined;
|
|
19
|
+
/** Number of retained payloads. */
|
|
20
|
+
readonly count: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* A disposable in-memory port for tests. Retains payloads up to a small byte budget and throws past
|
|
24
|
+
* it, refusing any load that resembles durable use. NEVER use outside tests - it has no persistence,
|
|
25
|
+
* no tenancy, and no eviction beyond the hard cap.
|
|
26
|
+
*/
|
|
27
|
+
export declare function memoryArtifactPort(options?: {
|
|
28
|
+
readonly maxBytes?: number;
|
|
29
|
+
}): MemoryArtifactPort;
|
|
30
|
+
//# sourceMappingURL=artifact-port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact-port.d.ts","sourceRoot":"","sources":["../../src/orchestration/artifact-port.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAmB,YAAY,EAAe,MAAM,yBAAyB,CAAA;AAOzF;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,YAAY,CAY/C;AAED,sFAAsF;AACtF,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACtD,+EAA+E;IAC/E,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAA;IACvC,mCAAmC;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,GAAE;IAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAC3C,kBAAkB,CAyBpB"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reference {@link ArtifactPort} implementations - the only artifact sinks the public repo ships.
|
|
3
|
+
*
|
|
4
|
+
* Neither persists durably: {@link noopArtifactPort} hashes and discards; {@link memoryArtifactPort}
|
|
5
|
+
* keeps bytes in a bounded process-local map for tests only and refuses a large budget. A durable,
|
|
6
|
+
* tenant-aware, or encrypted store is caller-owned and never lives here - the absence of a
|
|
7
|
+
* persisting sink in the public package IS the privacy guardrail.
|
|
8
|
+
*/
|
|
9
|
+
import { sha256Hex } from "./hash.js";
|
|
10
|
+
function refId(digest, ctx) {
|
|
11
|
+
return `${ctx.nodeId}:${ctx.kind}:${digest.slice(0, 16)}`;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Hashes the payload for a content-free {@link ArtifactRef}, then discards the bytes. The default
|
|
15
|
+
* port: public code sees only the digest, size, and coordinates - never the payload.
|
|
16
|
+
*/
|
|
17
|
+
export function noopArtifactPort() {
|
|
18
|
+
return {
|
|
19
|
+
async put(payload, ctx) {
|
|
20
|
+
const digest = await sha256Hex(payload);
|
|
21
|
+
return {
|
|
22
|
+
id: refId(digest, ctx),
|
|
23
|
+
digest,
|
|
24
|
+
bytes: payload.length,
|
|
25
|
+
mediaType: "application/octet-stream",
|
|
26
|
+
};
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* A disposable in-memory port for tests. Retains payloads up to a small byte budget and throws past
|
|
32
|
+
* it, refusing any load that resembles durable use. NEVER use outside tests - it has no persistence,
|
|
33
|
+
* no tenancy, and no eviction beyond the hard cap.
|
|
34
|
+
*/
|
|
35
|
+
export function memoryArtifactPort(options = {}) {
|
|
36
|
+
const maxBytes = options.maxBytes ?? 1_048_576;
|
|
37
|
+
if (!Number.isSafeInteger(maxBytes) || maxBytes < 1)
|
|
38
|
+
throw new RangeError("memoryArtifactPort: maxBytes must be a positive integer");
|
|
39
|
+
const store = new Map();
|
|
40
|
+
let total = 0;
|
|
41
|
+
return {
|
|
42
|
+
get count() {
|
|
43
|
+
return store.size;
|
|
44
|
+
},
|
|
45
|
+
get(id) {
|
|
46
|
+
return store.get(id);
|
|
47
|
+
},
|
|
48
|
+
async put(payload, ctx) {
|
|
49
|
+
total += payload.length;
|
|
50
|
+
if (total > maxBytes)
|
|
51
|
+
throw new Error("memoryArtifactPort: byte budget exceeded - this port is test-only and never for durable use");
|
|
52
|
+
const digest = await sha256Hex(payload);
|
|
53
|
+
const id = refId(digest, ctx);
|
|
54
|
+
store.set(id, payload.slice());
|
|
55
|
+
return { id, digest, bytes: payload.length, mediaType: "application/octet-stream" };
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=artifact-port.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact-port.js","sourceRoot":"","sources":["../../src/orchestration/artifact-port.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAErC,SAAS,KAAK,CAAC,MAAc,EAAE,GAAoB;IACjD,OAAO,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAA;AAC3D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,KAAK,CAAC,GAAG,CAAC,OAAmB,EAAE,GAAoB;YACjD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAA;YACvC,OAAO;gBACL,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC;gBACtB,MAAM;gBACN,KAAK,EAAE,OAAO,CAAC,MAAM;gBACrB,SAAS,EAAE,0BAA0B;aACtC,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC;AAUD;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,UAA0C,EAAE;IAE5C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,SAAS,CAAA;IAC9C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC;QACjD,MAAM,IAAI,UAAU,CAAC,yDAAyD,CAAC,CAAA;IACjF,MAAM,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAA;IAC3C,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,OAAO;QACL,IAAI,KAAK;YACP,OAAO,KAAK,CAAC,IAAI,CAAA;QACnB,CAAC;QACD,GAAG,CAAC,EAAU;YACZ,OAAO,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACtB,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,OAAmB,EAAE,GAAoB;YACjD,KAAK,IAAI,OAAO,CAAC,MAAM,CAAA;YACvB,IAAI,KAAK,GAAG,QAAQ;gBAClB,MAAM,IAAI,KAAK,CACb,6FAA6F,CAC9F,CAAA;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAA;YACvC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;YAC7B,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAA;YAC9B,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,0BAA0B,EAAE,CAAA;QACrF,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The StepCatalog: the local, closure-holding registry that resolves a plan node's `step` name to a
|
|
3
|
+
* runnable handler. A {@link RunPlan} is serializable and content-free precisely because it names
|
|
4
|
+
* steps by string; the executable behavior lives here, in-process, and never in the plan.
|
|
5
|
+
*
|
|
6
|
+
* A step declares a `version` and the `capabilities` it needs. The compiler uses both to fail closed:
|
|
7
|
+
* a node that pins a drifted version, or a step that needs a capability the host did not grant, is
|
|
8
|
+
* rejected before any node runs (ORC-05, ORC-07).
|
|
9
|
+
*/
|
|
10
|
+
import type { ArtifactPort, RunNodeKind } from "@nifrajs/agent-protocol";
|
|
11
|
+
import type { SubagentExecutor, SubagentSpec } from "../subagents.js";
|
|
12
|
+
/** Read-only view handed to a step's pure effect selector. No port, no mutation. */
|
|
13
|
+
export interface StepEffectContext {
|
|
14
|
+
readonly nodeId: string;
|
|
15
|
+
readonly planDigest: string;
|
|
16
|
+
readonly values: ReadonlyMap<string, unknown>;
|
|
17
|
+
}
|
|
18
|
+
/** Runtime context handed to a step body. Payloads leave only through {@link StepRunContext.artifact}. */
|
|
19
|
+
export interface StepRunContext {
|
|
20
|
+
readonly nodeId: string;
|
|
21
|
+
readonly planDigest: string;
|
|
22
|
+
readonly signal: AbortSignal;
|
|
23
|
+
/** Caller-owned artifact sink. The step routes any raw payload here to get a content-free ref. */
|
|
24
|
+
readonly artifact: ArtifactPort;
|
|
25
|
+
readonly values: ReadonlyMap<string, unknown>;
|
|
26
|
+
set(name: string, value: unknown): void;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* One catalog handler. `kind` must match the plan node's kind at compile time.
|
|
30
|
+
*
|
|
31
|
+
* - Leaf kinds `task`/`verify`/`approve`/`checkpoint`/`handoff` implement {@link CatalogStep.run}.
|
|
32
|
+
* - `subagent` implements {@link CatalogStep.spec} and supplies an {@link CatalogStep.executor};
|
|
33
|
+
* the compiler drives it through a {@link BoundedSubagentRunner} (never a private copy).
|
|
34
|
+
* - `branch` implements {@link CatalogStep.when}, a content-free predicate.
|
|
35
|
+
*
|
|
36
|
+
* `selectEffect`, when present, marks the step idempotent and projects its identity-bearing input
|
|
37
|
+
* into content-free bytes for `deriveNodeEffectKey`. It MUST be pure and read-only.
|
|
38
|
+
*/
|
|
39
|
+
export interface CatalogStep {
|
|
40
|
+
readonly kind: RunNodeKind;
|
|
41
|
+
/** Positive step version. Defaults to 1 when omitted. A node may pin an exact version. */
|
|
42
|
+
readonly version?: number;
|
|
43
|
+
/** Capabilities this step needs. The host's allow-list is the ceiling; a superset fails closed. */
|
|
44
|
+
readonly capabilities?: readonly string[];
|
|
45
|
+
run?(context: StepRunContext): unknown | PromiseLike<unknown>;
|
|
46
|
+
selectEffect?(context: StepEffectContext): Uint8Array;
|
|
47
|
+
/** `subagent` kind: the bounded child executor and the content-free spec projection. */
|
|
48
|
+
readonly executor?: SubagentExecutor;
|
|
49
|
+
spec?(context: StepRunContext): SubagentSpec | PromiseLike<SubagentSpec>;
|
|
50
|
+
/** `branch` kind: a content-free predicate selecting `then` or `otherwise`. */
|
|
51
|
+
when?(context: StepRunContext): boolean | PromiseLike<boolean>;
|
|
52
|
+
}
|
|
53
|
+
/** Thrown on a catalog construction fault: a key collision across merged catalogs. */
|
|
54
|
+
export declare class CatalogError extends Error {
|
|
55
|
+
readonly reason: string;
|
|
56
|
+
constructor(reason: string);
|
|
57
|
+
}
|
|
58
|
+
/** The effective version of a step (defaults to 1). */
|
|
59
|
+
export declare function stepVersion(step: CatalogStep): number;
|
|
60
|
+
/** Resolves step names to handlers. Immutable after construction; lookup is deterministic. */
|
|
61
|
+
export interface StepCatalog {
|
|
62
|
+
get(step: string): CatalogStep | undefined;
|
|
63
|
+
has(step: string): boolean;
|
|
64
|
+
/** Sorted for deterministic enumeration. */
|
|
65
|
+
readonly keys: readonly string[];
|
|
66
|
+
}
|
|
67
|
+
/** Build a StepCatalog from a name -> handler map. */
|
|
68
|
+
export declare function createStepCatalog(entries: Readonly<Record<string, CatalogStep>>): StepCatalog;
|
|
69
|
+
/** Merge catalogs into one. Throws {@link CatalogError} on any duplicate step key (collision). */
|
|
70
|
+
export declare function mergeStepCatalogs(...catalogs: readonly StepCatalog[]): StepCatalog;
|
|
71
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/orchestration/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAErE,oFAAoF;AACpF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC9C;AAED,0GAA0G;AAC1G,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;IAC5B,kGAAkG;IAClG,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAA;IAC/B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7C,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAA;CACxC;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;IAC1B,0FAA0F;IAC1F,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,mGAAmG;IACnG,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACzC,GAAG,CAAC,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;IAC7D,YAAY,CAAC,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CAAA;IACrD,wFAAwF;IACxF,QAAQ,CAAC,QAAQ,CAAC,EAAE,gBAAgB,CAAA;IACpC,IAAI,CAAC,CAAC,OAAO,EAAE,cAAc,GAAG,YAAY,GAAG,WAAW,CAAC,YAAY,CAAC,CAAA;IACxE,+EAA+E;IAC/E,IAAI,CAAC,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;CAC/D;AAED,sFAAsF;AACtF,qBAAa,YAAa,SAAQ,KAAK;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM;CAIpC;AAED,uDAAuD;AACvD,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAErD;AAED,8FAA8F;AAC9F,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAAA;IAC1C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;IAC1B,4CAA4C;IAC5C,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;CACjC;AAUD,sDAAsD;AACtD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,GAAG,WAAW,CAE7F;AAED,kGAAkG;AAClG,wBAAgB,iBAAiB,CAAC,GAAG,QAAQ,EAAE,SAAS,WAAW,EAAE,GAAG,WAAW,CASlF"}
|