@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/process.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export async function readBoundedText(stream, maxBytes) {
|
|
2
|
+
if (stream === null || stream === undefined || typeof stream === "number")
|
|
3
|
+
return { text: "", truncated: false };
|
|
4
|
+
if (!Number.isSafeInteger(maxBytes) || maxBytes < 1)
|
|
5
|
+
throw new RangeError("bounded process output: maxBytes must be positive");
|
|
6
|
+
const reader = stream.getReader();
|
|
7
|
+
const decoder = new TextDecoder();
|
|
8
|
+
const chunks = [];
|
|
9
|
+
let total = 0;
|
|
10
|
+
let truncated = false;
|
|
11
|
+
try {
|
|
12
|
+
for (;;) {
|
|
13
|
+
const { done, value } = await reader.read();
|
|
14
|
+
if (done) {
|
|
15
|
+
chunks.push(decoder.decode());
|
|
16
|
+
break;
|
|
17
|
+
}
|
|
18
|
+
if (value === undefined)
|
|
19
|
+
continue;
|
|
20
|
+
const remaining = maxBytes - total;
|
|
21
|
+
if (remaining <= 0) {
|
|
22
|
+
truncated = true;
|
|
23
|
+
await reader.cancel();
|
|
24
|
+
break;
|
|
25
|
+
}
|
|
26
|
+
if (value.byteLength > remaining) {
|
|
27
|
+
chunks.push(decoder.decode(value.subarray(0, remaining), { stream: true }));
|
|
28
|
+
chunks.push(decoder.decode());
|
|
29
|
+
truncated = true;
|
|
30
|
+
await reader.cancel();
|
|
31
|
+
break;
|
|
32
|
+
}
|
|
33
|
+
total += value.byteLength;
|
|
34
|
+
chunks.push(decoder.decode(value, { stream: true }));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
reader.releaseLock();
|
|
39
|
+
}
|
|
40
|
+
return { text: chunks.join(""), truncated };
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../src/process.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAA8D,EAC9D,QAAgB;IAEhB,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,IAAI,OAAO,MAAM,KAAK,QAAQ;QACvE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAA;IACvC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC;QACjD,MAAM,IAAI,UAAU,CAAC,mDAAmD,CAAC,CAAA;IAC3E,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAA;IACjC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAA;IACjC,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,IAAI,SAAS,GAAG,KAAK,CAAA;IACrB,IAAI,CAAC;QACH,SAAS,CAAC;YACR,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;YAC3C,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;gBAC7B,MAAK;YACP,CAAC;YACD,IAAI,KAAK,KAAK,SAAS;gBAAE,SAAQ;YACjC,MAAM,SAAS,GAAG,QAAQ,GAAG,KAAK,CAAA;YAClC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;gBACnB,SAAS,GAAG,IAAI,CAAA;gBAChB,MAAM,MAAM,CAAC,MAAM,EAAE,CAAA;gBACrB,MAAK;YACP,CAAC;YACD,IAAI,KAAK,CAAC,UAAU,GAAG,SAAS,EAAE,CAAC;gBACjC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;gBAC3E,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;gBAC7B,SAAS,GAAG,IAAI,CAAA;gBAChB,MAAM,MAAM,CAAC,MAAM,EAAE,CAAA;gBACrB,MAAK;YACP,CAAC;YACD,KAAK,IAAI,KAAK,CAAC,UAAU,CAAA;YACzB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QACtD,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,WAAW,EAAE,CAAA;IACtB,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,CAAA;AAC7C,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capability-descriptor adapter for coding-agent extensions.
|
|
3
|
+
*
|
|
4
|
+
* An extension is host-supplied code that runs with granted capabilities, so its descriptor is
|
|
5
|
+
* projected under the `extension` kind and, unlike a typed tool, admits an opaque input. The adapter
|
|
6
|
+
* fails closed on capability escalation: an extension must declare its capabilities explicitly (an
|
|
7
|
+
* empty array asserts "none"), and every declared capability must appear in the host's trusted
|
|
8
|
+
* allowlist. An omitted declaration or any capability outside the allowlist raises
|
|
9
|
+
* `capability_escalation` rather than silently narrowing or widening the grant.
|
|
10
|
+
*
|
|
11
|
+
* This module is the only place `@nifrajs/coding-agent` reaches `@nifrajs/agent`; the edge is
|
|
12
|
+
* `coding-agent -> agent`, never the reverse, so the agent package stays free of coding-agent code.
|
|
13
|
+
*/
|
|
14
|
+
import { type ApprovalClass, type CapabilityDescriptor, type IsolationClass } from "@nifrajs/agent/registry";
|
|
15
|
+
/** The minimal shape an extension exposes for projection: an identity and an explicit capability grant. */
|
|
16
|
+
export interface ExtensionDescriptorSource {
|
|
17
|
+
readonly name: string;
|
|
18
|
+
readonly capabilities?: readonly string[];
|
|
19
|
+
}
|
|
20
|
+
export interface ExtensionDescriptorOptions {
|
|
21
|
+
/** The host's trusted capability allowlist. A declared capability outside it fails closed. */
|
|
22
|
+
readonly trustedCapabilities: readonly string[];
|
|
23
|
+
readonly version?: string;
|
|
24
|
+
readonly approval?: ApprovalClass;
|
|
25
|
+
readonly isolation?: IsolationClass;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Project one extension into an `extension` capability descriptor, enforcing the grant. The declared
|
|
29
|
+
* capabilities become the descriptor's required capabilities only after every one is confirmed
|
|
30
|
+
* trusted; an undeclared grant or an escalated capability throws before any descriptor is built.
|
|
31
|
+
* Approval defaults to required and isolation to process, matching how untyped host code is admitted.
|
|
32
|
+
*/
|
|
33
|
+
export declare function extensionDescriptor(extension: ExtensionDescriptorSource, options: ExtensionDescriptorOptions): Promise<CapabilityDescriptor>;
|
|
34
|
+
/** Project a set of extensions under a single trusted allowlist, preserving order. */
|
|
35
|
+
export declare function extensionDescriptors(extensions: readonly ExtensionDescriptorSource[], options: ExtensionDescriptorOptions): Promise<readonly CapabilityDescriptor[]>;
|
|
36
|
+
export type { CapabilityDescriptor };
|
|
37
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,oBAAoB,EAEzB,KAAK,cAAc,EAEpB,MAAM,yBAAyB,CAAA;AAQhC,2GAA2G;AAC3G,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC1C;AAED,MAAM,WAAW,0BAA0B;IACzC,8FAA8F;IAC9F,QAAQ,CAAC,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAA;IAC/C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAA;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,cAAc,CAAA;CACpC;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,yBAAyB,EACpC,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,oBAAoB,CAAC,CAkB/B;AAED,sFAAsF;AACtF,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,SAAS,yBAAyB,EAAE,EAChD,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,SAAS,oBAAoB,EAAE,CAAC,CAE1C;AAED,YAAY,EAAE,oBAAoB,EAAE,CAAA"}
|
package/dist/registry.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capability-descriptor adapter for coding-agent extensions.
|
|
3
|
+
*
|
|
4
|
+
* An extension is host-supplied code that runs with granted capabilities, so its descriptor is
|
|
5
|
+
* projected under the `extension` kind and, unlike a typed tool, admits an opaque input. The adapter
|
|
6
|
+
* fails closed on capability escalation: an extension must declare its capabilities explicitly (an
|
|
7
|
+
* empty array asserts "none"), and every declared capability must appear in the host's trusted
|
|
8
|
+
* allowlist. An omitted declaration or any capability outside the allowlist raises
|
|
9
|
+
* `capability_escalation` rather than silently narrowing or widening the grant.
|
|
10
|
+
*
|
|
11
|
+
* This module is the only place `@nifrajs/coding-agent` reaches `@nifrajs/agent`; the edge is
|
|
12
|
+
* `coding-agent -> agent`, never the reverse, so the agent package stays free of coding-agent code.
|
|
13
|
+
*/
|
|
14
|
+
import { composeDescriptor, RegistryError, } from "@nifrajs/agent/registry";
|
|
15
|
+
/** Opaque extension input. Extensions do not publish a typed schema, so identity rests on name and grant. */
|
|
16
|
+
const EXTENSION_INPUT_SCHEMA = Object.freeze({
|
|
17
|
+
type: "object",
|
|
18
|
+
additionalProperties: true,
|
|
19
|
+
});
|
|
20
|
+
/**
|
|
21
|
+
* Project one extension into an `extension` capability descriptor, enforcing the grant. The declared
|
|
22
|
+
* capabilities become the descriptor's required capabilities only after every one is confirmed
|
|
23
|
+
* trusted; an undeclared grant or an escalated capability throws before any descriptor is built.
|
|
24
|
+
* Approval defaults to required and isolation to process, matching how untyped host code is admitted.
|
|
25
|
+
*/
|
|
26
|
+
export function extensionDescriptor(extension, options) {
|
|
27
|
+
const requested = extension.capabilities;
|
|
28
|
+
if (requested === undefined)
|
|
29
|
+
throw new RegistryError("capability_escalation");
|
|
30
|
+
const trusted = new Set(options.trustedCapabilities);
|
|
31
|
+
for (const capability of requested) {
|
|
32
|
+
if (!trusted.has(capability))
|
|
33
|
+
throw new RegistryError("capability_escalation");
|
|
34
|
+
}
|
|
35
|
+
return composeDescriptor({
|
|
36
|
+
kind: "extension",
|
|
37
|
+
name: extension.name,
|
|
38
|
+
...(options.version === undefined ? {} : { version: options.version }),
|
|
39
|
+
inputSchema: EXTENSION_INPUT_SCHEMA,
|
|
40
|
+
requiredCapabilities: requested,
|
|
41
|
+
approval: options.approval ?? { kind: "required" },
|
|
42
|
+
retry: "none",
|
|
43
|
+
idempotency: "none",
|
|
44
|
+
isolation: options.isolation ?? "process",
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/** Project a set of extensions under a single trusted allowlist, preserving order. */
|
|
48
|
+
export function extensionDescriptors(extensions, options) {
|
|
49
|
+
return Promise.all(extensions.map((extension) => extensionDescriptor(extension, options)));
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAGL,iBAAiB,EAEjB,aAAa,GACd,MAAM,yBAAyB,CAAA;AAEhC,6GAA6G;AAC7G,MAAM,sBAAsB,GAA4B,MAAM,CAAC,MAAM,CAAC;IACpE,IAAI,EAAE,QAAQ;IACd,oBAAoB,EAAE,IAAI;CAC3B,CAAC,CAAA;AAgBF;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,SAAoC,EACpC,OAAmC;IAEnC,MAAM,SAAS,GAAG,SAAS,CAAC,YAAY,CAAA;IACxC,IAAI,SAAS,KAAK,SAAS;QAAE,MAAM,IAAI,aAAa,CAAC,uBAAuB,CAAC,CAAA;IAC7E,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAA;IACpD,KAAK,MAAM,UAAU,IAAI,SAAS,EAAE,CAAC;QACnC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;YAAE,MAAM,IAAI,aAAa,CAAC,uBAAuB,CAAC,CAAA;IAChF,CAAC;IACD,OAAO,iBAAiB,CAAC;QACvB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;QACtE,WAAW,EAAE,sBAAsB;QACnC,oBAAoB,EAAE,SAAS;QAC/B,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE;QAClD,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,MAAM;QACnB,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,SAAS;KAC1C,CAAC,CAAA;AACJ,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,oBAAoB,CAClC,UAAgD,EAChD,OAAmC;IAEnC,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;AAC5F,CAAC"}
|
package/dist/replay.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type AgentBackend, type AgentBackendInfo, type AgentEvent, type AgentSessionSnapshot, type CreateSessionInput, type ReloadResult, type SendMessageInput } from "@nifrajs/agent-protocol";
|
|
2
|
+
export interface ReplayBackendOptions {
|
|
3
|
+
readonly events: readonly AgentEvent[];
|
|
4
|
+
readonly delayMs?: number;
|
|
5
|
+
}
|
|
6
|
+
/** Deterministic protocol backend for demos, CI, and UI regression tests. */
|
|
7
|
+
export declare class ReplayBackend implements AgentBackend {
|
|
8
|
+
readonly info: AgentBackendInfo;
|
|
9
|
+
private readonly events;
|
|
10
|
+
private readonly delayMs;
|
|
11
|
+
private readonly sessions;
|
|
12
|
+
constructor(options: ReplayBackendOptions);
|
|
13
|
+
createSession(input: CreateSessionInput): Promise<AgentSessionSnapshot>;
|
|
14
|
+
send(input: SendMessageInput): AsyncIterable<AgentEvent>;
|
|
15
|
+
cancel(sessionId: string, reason?: string): Promise<void>;
|
|
16
|
+
snapshot(sessionId: string): Promise<AgentSessionSnapshot>;
|
|
17
|
+
reload(sessionId: string): Promise<ReloadResult>;
|
|
18
|
+
close(sessionId: string): Promise<void>;
|
|
19
|
+
private replay;
|
|
20
|
+
private push;
|
|
21
|
+
private requireSession;
|
|
22
|
+
}
|
|
23
|
+
export declare function readReplayEvents(path: string): Promise<readonly AgentEvent[]>;
|
|
24
|
+
//# sourceMappingURL=replay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,UAAU,EAEf,KAAK,oBAAoB,EAEzB,KAAK,kBAAkB,EAEvB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACtB,MAAM,yBAAyB,CAAA;AAEhC,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,CAAA;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAC1B;AAUD,6EAA6E;AAC7E,qBAAa,aAAc,YAAW,YAAY;IAChD,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAG7B;IACF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;gBAEhD,OAAO,EAAE,oBAAoB;IAOnC,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAqB7E,IAAI,CAAC,KAAK,EAAE,gBAAgB,GAAG,aAAa,CAAC,UAAU,CAAC;IAYlD,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,SAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAY9D,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAI1D,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAWhD,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAQ/B,MAAM;IA6BpB,OAAO,CAAC,IAAI;IAaZ,OAAO,CAAC,cAAc;CAKvB;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,UAAU,EAAE,CAAC,CAUnF"}
|
package/dist/replay.js
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { agentError, createAgentEventStream, } from "@nifrajs/agent-protocol";
|
|
2
|
+
/** Deterministic protocol backend for demos, CI, and UI regression tests. */
|
|
3
|
+
export class ReplayBackend {
|
|
4
|
+
info = Object.freeze({
|
|
5
|
+
name: "replay",
|
|
6
|
+
capabilities: Object.freeze(["sessions", "streaming", "replay"]),
|
|
7
|
+
});
|
|
8
|
+
events;
|
|
9
|
+
delayMs;
|
|
10
|
+
sessions = new Map();
|
|
11
|
+
constructor(options) {
|
|
12
|
+
this.events = Object.freeze(options.events.map((event) => Object.freeze({ ...event })));
|
|
13
|
+
this.delayMs = options.delayMs ?? 0;
|
|
14
|
+
if (!Number.isSafeInteger(this.delayMs) || this.delayMs < 0 || this.delayMs > 60_000)
|
|
15
|
+
throw new RangeError("replay backend: delayMs must be between 0 and 60000");
|
|
16
|
+
}
|
|
17
|
+
async createSession(input) {
|
|
18
|
+
const id = input.sessionId ?? crypto.randomUUID();
|
|
19
|
+
if (!/^[a-zA-Z0-9._:-]{1,128}$/.test(id))
|
|
20
|
+
throw new TypeError("replay backend: invalid sessionId");
|
|
21
|
+
if (this.sessions.has(id))
|
|
22
|
+
throw new Error(`replay backend: session already exists: ${id}`);
|
|
23
|
+
const now = Date.now();
|
|
24
|
+
const snapshot = {
|
|
25
|
+
version: 1,
|
|
26
|
+
id,
|
|
27
|
+
backend: this.info.name,
|
|
28
|
+
cwd: input.cwd,
|
|
29
|
+
status: "idle",
|
|
30
|
+
createdAt: now,
|
|
31
|
+
updatedAt: now,
|
|
32
|
+
lastSeq: 0,
|
|
33
|
+
capabilities: Object.freeze([...(input.capabilities ?? this.info.capabilities)]),
|
|
34
|
+
};
|
|
35
|
+
this.sessions.set(id, { id, snapshot, active: undefined, closed: false, seq: 0 });
|
|
36
|
+
return snapshot;
|
|
37
|
+
}
|
|
38
|
+
send(input) {
|
|
39
|
+
const session = this.requireSession(input.sessionId);
|
|
40
|
+
if (session.closed)
|
|
41
|
+
return failedStream(agentError("SESSION_CLOSED", "replay session is closed"));
|
|
42
|
+
if (session.active !== undefined)
|
|
43
|
+
return failedStream(agentError("SESSION_BUSY", "replay session is busy"));
|
|
44
|
+
const stream = createAgentEventStream();
|
|
45
|
+
session.active = stream;
|
|
46
|
+
void this.replay(session, stream);
|
|
47
|
+
return stream;
|
|
48
|
+
}
|
|
49
|
+
async cancel(sessionId, reason = "cancelled") {
|
|
50
|
+
const session = this.requireSession(sessionId);
|
|
51
|
+
session.active?.complete();
|
|
52
|
+
session.active = undefined;
|
|
53
|
+
session.snapshot = Object.freeze({
|
|
54
|
+
...session.snapshot,
|
|
55
|
+
status: "stopped",
|
|
56
|
+
updatedAt: Date.now(),
|
|
57
|
+
});
|
|
58
|
+
if (session.seq === 0)
|
|
59
|
+
this.push(session, { type: "session.stopped", reason });
|
|
60
|
+
}
|
|
61
|
+
async snapshot(sessionId) {
|
|
62
|
+
return this.requireSession(sessionId).snapshot;
|
|
63
|
+
}
|
|
64
|
+
async reload(sessionId) {
|
|
65
|
+
const session = this.requireSession(sessionId);
|
|
66
|
+
const revision = `replay:${this.events.length}`;
|
|
67
|
+
session.snapshot = Object.freeze({
|
|
68
|
+
...session.snapshot,
|
|
69
|
+
extensionRevision: revision,
|
|
70
|
+
updatedAt: Date.now(),
|
|
71
|
+
});
|
|
72
|
+
return { revision, loaded: [], disabled: [], rolledBack: false };
|
|
73
|
+
}
|
|
74
|
+
async close(sessionId) {
|
|
75
|
+
const session = this.requireSession(sessionId);
|
|
76
|
+
session.closed = true;
|
|
77
|
+
session.active?.complete();
|
|
78
|
+
session.active = undefined;
|
|
79
|
+
this.sessions.delete(sessionId);
|
|
80
|
+
}
|
|
81
|
+
async replay(session, stream) {
|
|
82
|
+
session.snapshot = Object.freeze({
|
|
83
|
+
...session.snapshot,
|
|
84
|
+
status: "running",
|
|
85
|
+
updatedAt: Date.now(),
|
|
86
|
+
});
|
|
87
|
+
try {
|
|
88
|
+
for (const source of this.events) {
|
|
89
|
+
if (this.delayMs > 0)
|
|
90
|
+
await new Promise((resolve) => setTimeout(resolve, this.delayMs));
|
|
91
|
+
this.push(session, remap(source, session.id, session.seq));
|
|
92
|
+
}
|
|
93
|
+
session.snapshot = Object.freeze({
|
|
94
|
+
...session.snapshot,
|
|
95
|
+
status: "idle",
|
|
96
|
+
updatedAt: Date.now(),
|
|
97
|
+
});
|
|
98
|
+
this.push(session, { type: "session.completed", snapshot: session.snapshot });
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
this.push(session, {
|
|
102
|
+
type: "session.failed",
|
|
103
|
+
error: agentError("REPLAY_FAILED", error instanceof Error ? error.message : String(error)),
|
|
104
|
+
recoverable: true,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
stream.complete();
|
|
109
|
+
session.active = undefined;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
push(session, event) {
|
|
113
|
+
const next = "version" in event && "sessionId" in event
|
|
114
|
+
? event
|
|
115
|
+
: { version: 1, sessionId: session.id, seq: session.seq, at: Date.now(), ...event };
|
|
116
|
+
session.seq = next.seq + 1;
|
|
117
|
+
session.snapshot = Object.freeze({ ...session.snapshot, lastSeq: next.seq, updatedAt: next.at });
|
|
118
|
+
session.active?.push(next);
|
|
119
|
+
}
|
|
120
|
+
requireSession(id) {
|
|
121
|
+
const session = this.sessions.get(id);
|
|
122
|
+
if (session === undefined)
|
|
123
|
+
throw new Error(`replay backend: unknown session: ${id}`);
|
|
124
|
+
return session;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
export async function readReplayEvents(path) {
|
|
128
|
+
const text = await Bun.file(path).text();
|
|
129
|
+
const events = [];
|
|
130
|
+
for (const line of text.split("\n")) {
|
|
131
|
+
if (line.trim().length === 0)
|
|
132
|
+
continue;
|
|
133
|
+
const value = JSON.parse(line);
|
|
134
|
+
if (!isAgentEvent(value))
|
|
135
|
+
throw new Error(`replay: invalid event in ${path}`);
|
|
136
|
+
events.push(value);
|
|
137
|
+
}
|
|
138
|
+
return Object.freeze(events);
|
|
139
|
+
}
|
|
140
|
+
function remap(event, sessionId, seq) {
|
|
141
|
+
return Object.freeze({ ...event, sessionId, seq, at: Date.now() });
|
|
142
|
+
}
|
|
143
|
+
function isAgentEvent(value) {
|
|
144
|
+
return (value !== null &&
|
|
145
|
+
typeof value === "object" &&
|
|
146
|
+
value.version === 1 &&
|
|
147
|
+
typeof value.type === "string");
|
|
148
|
+
}
|
|
149
|
+
function failedStream(error) {
|
|
150
|
+
const stream = createAgentEventStream();
|
|
151
|
+
stream.fail(error);
|
|
152
|
+
return stream;
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=replay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"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"}
|
package/dist/rpc.d.ts
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type AgentBackend } from "@nifrajs/agent-protocol";
|
|
2
|
+
import type { ExtensionHost } from "./extensions.js";
|
|
3
|
+
import { CodingAgentHost, type CodingAgentHostOptions } from "./host.js";
|
|
4
|
+
import type { ContextWindowOptions, SessionStore } from "./sessions.js";
|
|
5
|
+
import type { UiExtensionHost } from "./ui.js";
|
|
6
|
+
export interface CodingAgentRpcServerOptions {
|
|
7
|
+
readonly backend: AgentBackend;
|
|
8
|
+
readonly cwd: string;
|
|
9
|
+
readonly hostname?: string;
|
|
10
|
+
/** Remote binding is opt-in; the default only permits loopback hosts. */
|
|
11
|
+
readonly allowRemote?: boolean;
|
|
12
|
+
readonly port?: number;
|
|
13
|
+
/** A random token is generated when omitted. Use an explicit token only for managed local launchers. */
|
|
14
|
+
readonly authToken?: string;
|
|
15
|
+
/** Include bounded exception stacks in RPC failures only for trusted loopback debugging. */
|
|
16
|
+
readonly exposeErrorStacks?: boolean;
|
|
17
|
+
readonly maxBodyBytes?: number;
|
|
18
|
+
readonly sessionStore?: SessionStore;
|
|
19
|
+
readonly contextWindow?: ContextWindowOptions;
|
|
20
|
+
readonly extensions?: ExtensionHost;
|
|
21
|
+
readonly ui?: UiExtensionHost;
|
|
22
|
+
readonly verifyAfterTurn?: readonly ("check" | "assure" | "test")[];
|
|
23
|
+
readonly maxRepairAttempts?: number;
|
|
24
|
+
readonly verification?: CodingAgentHostOptions["verification"];
|
|
25
|
+
}
|
|
26
|
+
export interface CodingAgentRpcServerHandle {
|
|
27
|
+
readonly url: string;
|
|
28
|
+
readonly token: string;
|
|
29
|
+
stop(): Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Minimal loopback RPC surface for the CLI, Workbench, CI clients, and a future mobile companion.
|
|
33
|
+
* Turn output is SSE so clients do not need a WebSocket dependency; every event is still a versioned
|
|
34
|
+
* protocol event from the backend.
|
|
35
|
+
*/
|
|
36
|
+
export declare class CodingAgentRpcServer {
|
|
37
|
+
readonly host: CodingAgentHost;
|
|
38
|
+
private readonly options;
|
|
39
|
+
private readonly token;
|
|
40
|
+
private readonly maxBodyBytes;
|
|
41
|
+
private listener;
|
|
42
|
+
constructor(options: CodingAgentRpcServerOptions);
|
|
43
|
+
start(): Promise<CodingAgentRpcServerHandle>;
|
|
44
|
+
stop(): Promise<void>;
|
|
45
|
+
private fetch;
|
|
46
|
+
private dispatch;
|
|
47
|
+
private requireSnapshot;
|
|
48
|
+
private protocolError;
|
|
49
|
+
private readRequest;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=rpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EAIlB,MAAM,yBAAyB,CAAA;AAGhC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAExE,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACvE,OAAO,KAAK,EAAE,eAAe,EAAuB,MAAM,SAAS,CAAA;AAGnE,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAA;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,yEAAyE;IACzE,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAA;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,wGAAwG;IACxG,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,4FAA4F;IAC5F,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAA;IACpC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAAA;IACpC,QAAQ,CAAC,aAAa,CAAC,EAAE,oBAAoB,CAAA;IAC7C,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAA;IACnC,QAAQ,CAAC,EAAE,CAAC,EAAE,eAAe,CAAA;IAC7B,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,CAAC,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAA;IACnE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IACnC,QAAQ,CAAC,YAAY,CAAC,EAAE,sBAAsB,CAAC,cAAc,CAAC,CAAA;CAC/D;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACtB;AAYD;;;;GAIG;AACH,qBAAa,oBAAoB;IAC/B,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAA;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAA2B;gBAE/B,OAAO,EAAE,2BAA2B;IAwB1C,KAAK,IAAI,OAAO,CAAC,0BAA0B,CAAC;IAsB5C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAOb,KAAK;YA4CL,QAAQ;IA2UtB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,aAAa;YAQP,WAAW;CAa1B"}
|