@nifrajs/coding-agent 3.2.0 → 3.5.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/dist/context.js +29 -1
- package/dist/context.js.map +1 -1
- package/dist/diff.js +38 -2
- package/dist/diff.js.map +1 -1
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +217 -24
- package/dist/host.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/isolated.js +37 -2
- package/dist/isolated.js.map +1 -1
- package/dist/native.d.ts +17 -0
- package/dist/native.d.ts.map +1 -1
- package/dist/native.js +265 -41
- package/dist/native.js.map +1 -1
- package/dist/replay.d.ts +4 -0
- package/dist/replay.d.ts.map +1 -1
- package/dist/replay.js +189 -24
- package/dist/replay.js.map +1 -1
- package/dist/rpc.d.ts +10 -0
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +208 -29
- package/dist/rpc.js.map +1 -1
- package/dist/sessions.d.ts +14 -2
- package/dist/sessions.d.ts.map +1 -1
- package/dist/sessions.js +253 -59
- package/dist/sessions.js.map +1 -1
- package/dist/verification.d.ts +23 -0
- package/dist/verification.d.ts.map +1 -1
- package/dist/verification.js +113 -1
- package/dist/verification.js.map +1 -1
- package/dist/workflows.d.ts +1 -0
- package/dist/workflows.d.ts.map +1 -1
- package/dist/workflows.js +43 -21
- package/dist/workflows.js.map +1 -1
- package/package.json +6 -5
- package/src/context.ts +32 -1
- package/src/diff.ts +40 -2
- package/src/host.ts +219 -24
- package/src/index.ts +5 -0
- package/src/isolated.ts +39 -2
- package/src/native.ts +408 -42
- package/src/replay.ts +206 -25
- package/src/rpc.ts +261 -33
- package/src/sessions.ts +271 -56
- package/src/verification.ts +140 -1
- package/src/workflows.ts +37 -25
package/dist/workflows.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../src/workflows.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../src/workflows.ts"],"names":[],"mappings":"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"}
|
package/dist/workflows.js
CHANGED
|
@@ -2,6 +2,7 @@ import { publicErrorDetails } from "./errors.js";
|
|
|
2
2
|
/** Bounded orchestration primitives. The kernel knows no provider, UI, or framework package. */
|
|
3
3
|
export class WorkflowRunner {
|
|
4
4
|
options;
|
|
5
|
+
signal;
|
|
5
6
|
values = new Map();
|
|
6
7
|
completed = [];
|
|
7
8
|
steps = 0;
|
|
@@ -11,6 +12,7 @@ export class WorkflowRunner {
|
|
|
11
12
|
maxSteps: options.maxSteps ?? 128,
|
|
12
13
|
maxDepth: options.maxDepth ?? 8,
|
|
13
14
|
};
|
|
15
|
+
this.signal = options.signal ?? new AbortController().signal;
|
|
14
16
|
if (!Number.isSafeInteger(this.options.maxSteps) || this.options.maxSteps < 1)
|
|
15
17
|
throw new RangeError("workflow: maxSteps must be positive");
|
|
16
18
|
if (!Number.isSafeInteger(this.options.maxDepth) || this.options.maxDepth < 1)
|
|
@@ -36,12 +38,12 @@ export class WorkflowRunner {
|
|
|
36
38
|
};
|
|
37
39
|
}
|
|
38
40
|
}
|
|
39
|
-
context() {
|
|
41
|
+
context(depth) {
|
|
40
42
|
return {
|
|
41
|
-
signal: this.
|
|
43
|
+
signal: this.signal,
|
|
42
44
|
values: this.values,
|
|
43
45
|
set: (name, value) => this.values.set(name, value),
|
|
44
|
-
run: (step) => this.execute(step, 1),
|
|
46
|
+
run: (step) => this.execute(step, depth + 1),
|
|
45
47
|
};
|
|
46
48
|
}
|
|
47
49
|
async execute(step, depth) {
|
|
@@ -53,9 +55,9 @@ export class WorkflowRunner {
|
|
|
53
55
|
throw new Error("workflow cancelled");
|
|
54
56
|
switch (step.type) {
|
|
55
57
|
case "task":
|
|
56
|
-
return this.single(step.id, () => step.run(this.context()));
|
|
58
|
+
return this.single(step.id, () => step.run(this.context(depth)));
|
|
57
59
|
case "verify": {
|
|
58
|
-
const result = await this.single(step.id, () => step.run(this.context()));
|
|
60
|
+
const result = await this.single(step.id, () => step.run(this.context(depth)));
|
|
59
61
|
const ok = typeof result === "boolean" ? result : isVerificationResult(result) && result.ok;
|
|
60
62
|
if (!ok)
|
|
61
63
|
throw new Error(`verification failed: ${step.id}`);
|
|
@@ -63,18 +65,18 @@ export class WorkflowRunner {
|
|
|
63
65
|
}
|
|
64
66
|
case "approve": {
|
|
65
67
|
await this.emit({ type: "approval.required", id: step.id, reason: step.reason });
|
|
66
|
-
const approved = await this.single(step.id, () => step.run(this.context()));
|
|
68
|
+
const approved = await this.single(step.id, () => step.run(this.context(depth)));
|
|
67
69
|
if (approved !== true)
|
|
68
70
|
throw new Error(`approval denied: ${step.id}`);
|
|
69
71
|
return approved;
|
|
70
72
|
}
|
|
71
73
|
case "checkpoint": {
|
|
72
|
-
const result = await this.single(step.id, () => step.run(this.context()));
|
|
74
|
+
const result = await this.single(step.id, () => step.run(this.context(depth)));
|
|
73
75
|
await this.emit({ type: "checkpoint.created", id: step.id });
|
|
74
76
|
return result;
|
|
75
77
|
}
|
|
76
78
|
case "handoff":
|
|
77
|
-
return this.single(step.id, () => step.run(this.context()));
|
|
79
|
+
return this.single(step.id, () => step.run(this.context(depth)));
|
|
78
80
|
case "sequence": {
|
|
79
81
|
const results = [];
|
|
80
82
|
for (const child of step.steps)
|
|
@@ -82,11 +84,16 @@ export class WorkflowRunner {
|
|
|
82
84
|
return results;
|
|
83
85
|
}
|
|
84
86
|
case "parallel":
|
|
87
|
+
if (step.steps.length === 0)
|
|
88
|
+
return [];
|
|
85
89
|
return this.parallel(step.steps, step.maxConcurrency ?? step.steps.length, depth);
|
|
86
90
|
case "retry": {
|
|
87
91
|
const attempts = step.attempts ?? 3;
|
|
88
92
|
if (!Number.isSafeInteger(attempts) || attempts < 1 || attempts > 16)
|
|
89
93
|
throw new RangeError("workflow: attempts must be between 1 and 16");
|
|
94
|
+
const backoffMs = step.backoffMs ?? 0;
|
|
95
|
+
if (!Number.isSafeInteger(backoffMs) || backoffMs < 0)
|
|
96
|
+
throw new RangeError("workflow: backoffMs must be a non-negative safe integer");
|
|
90
97
|
let last;
|
|
91
98
|
for (let attempt = 0; attempt < attempts; attempt++) {
|
|
92
99
|
try {
|
|
@@ -94,14 +101,14 @@ export class WorkflowRunner {
|
|
|
94
101
|
}
|
|
95
102
|
catch (error) {
|
|
96
103
|
last = error;
|
|
97
|
-
if (attempt + 1 < attempts &&
|
|
98
|
-
await delay(Math.min(
|
|
104
|
+
if (attempt + 1 < attempts && backoffMs > 0)
|
|
105
|
+
await delay(Math.min(backoffMs * (attempt + 1), 10_000), this.options.signal);
|
|
99
106
|
}
|
|
100
107
|
}
|
|
101
108
|
throw last instanceof Error ? last : new Error(String(last));
|
|
102
109
|
}
|
|
103
110
|
case "branch": {
|
|
104
|
-
const selected = await this.single(step.id, () => step.when(this.context()));
|
|
111
|
+
const selected = await this.single(step.id, () => step.when(this.context(depth)));
|
|
105
112
|
return selected === true
|
|
106
113
|
? this.execute(step.then, depth + 1)
|
|
107
114
|
: step.otherwise === undefined
|
|
@@ -151,18 +158,33 @@ export class WorkflowRunner {
|
|
|
151
158
|
}
|
|
152
159
|
async function delay(ms, signal) {
|
|
153
160
|
await new Promise((resolve, reject) => {
|
|
154
|
-
|
|
161
|
+
let settled = false;
|
|
162
|
+
let timer;
|
|
163
|
+
let onAbort;
|
|
164
|
+
const cleanup = () => {
|
|
165
|
+
if (timer !== undefined)
|
|
166
|
+
clearTimeout(timer);
|
|
167
|
+
if (signal !== undefined && onAbort !== undefined)
|
|
168
|
+
signal.removeEventListener("abort", onAbort);
|
|
169
|
+
};
|
|
170
|
+
const settle = (error) => {
|
|
171
|
+
if (settled)
|
|
172
|
+
return;
|
|
173
|
+
settled = true;
|
|
174
|
+
cleanup();
|
|
175
|
+
if (error === undefined)
|
|
176
|
+
resolve();
|
|
177
|
+
else
|
|
178
|
+
reject(error);
|
|
179
|
+
};
|
|
180
|
+
timer = setTimeout(() => settle(), ms);
|
|
155
181
|
if (signal === undefined)
|
|
156
182
|
return;
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
signal.addEventListener("abort", () => {
|
|
163
|
-
clearTimeout(timer);
|
|
164
|
-
reject(new Error("workflow cancelled"));
|
|
165
|
-
}, { once: true });
|
|
183
|
+
onAbort = () => settle(new Error("workflow cancelled"));
|
|
184
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
185
|
+
// Abort can race listener registration; check again after subscribing.
|
|
186
|
+
if (signal.aborted)
|
|
187
|
+
onAbort();
|
|
166
188
|
});
|
|
167
189
|
}
|
|
168
190
|
function isVerificationResult(value) {
|
package/dist/workflows.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflows.js","sourceRoot":"","sources":["../src/workflows.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAsFhD,gGAAgG;AAChG,MAAM,OAAO,cAAc;IACR,OAAO,CACD;IACN,MAAM,GAAG,IAAI,GAAG,EAAmB,CAAA;IACnC,SAAS,GAAa,EAAE,CAAA;IACjC,KAAK,GAAG,CAAC,CAAA;IAEjB,YAAY,UAAiC,EAAE;QAC7C,IAAI,CAAC,OAAO,GAAG;YACb,GAAG,OAAO;YACV,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,GAAG;YACjC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,CAAC;SAChC,CAAA;QACD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC;YAC3E,MAAM,IAAI,UAAU,CAAC,qCAAqC,CAAC,CAAA;QAC7D,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC;YAC3E,MAAM,IAAI,UAAU,CAAC,qCAAqC,CAAC,CAAA;IAC/D,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAAkB;QAC1B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;YAC3B,OAAO;gBACL,EAAE,EAAE,IAAI;gBACR,MAAM,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC5B,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;aAC9C,CAAA;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,kBAAkB,CAChC,KAAK,EACL,iBAAiB,EACjB,IAAI,CAAC,OAAO,CAAC,iBAAiB,KAAK,IAAI,CACxC,CAAA;YACD,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC5B,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC7C,KAAK,EAAE,OAAO,CAAC,OAAO;gBACtB,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;aACjE,CAAA;QACH,CAAC;IACH,CAAC;IAEO,OAAO;
|
|
1
|
+
{"version":3,"file":"workflows.js","sourceRoot":"","sources":["../src/workflows.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nifrajs/coding-agent",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.5.0",
|
|
4
4
|
"description": "Standalone, extensible Nifra coding-agent host and CLI.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"bun",
|
|
@@ -67,10 +67,11 @@
|
|
|
67
67
|
"access": "public"
|
|
68
68
|
},
|
|
69
69
|
"dependencies": {
|
|
70
|
-
"@nifrajs/agent": "3.
|
|
71
|
-
"@nifrajs/agent-
|
|
72
|
-
"@nifrajs/
|
|
73
|
-
"@nifrajs/
|
|
70
|
+
"@nifrajs/agent": "3.5.0",
|
|
71
|
+
"@nifrajs/agent-review": "3.5.0",
|
|
72
|
+
"@nifrajs/agent-protocol": "3.5.0",
|
|
73
|
+
"@nifrajs/jobs": "3.5.0",
|
|
74
|
+
"@nifrajs/pi": "3.5.0"
|
|
74
75
|
},
|
|
75
76
|
"repository": {
|
|
76
77
|
"type": "git",
|
package/src/context.ts
CHANGED
|
@@ -72,10 +72,41 @@ function safeEnv(
|
|
|
72
72
|
"LC_ALL",
|
|
73
73
|
"TERM",
|
|
74
74
|
"CI",
|
|
75
|
+
...(process.platform === "win32"
|
|
76
|
+
? [
|
|
77
|
+
"SystemRoot",
|
|
78
|
+
"WINDIR",
|
|
79
|
+
"TEMP",
|
|
80
|
+
"TMP",
|
|
81
|
+
"USERPROFILE",
|
|
82
|
+
"LOCALAPPDATA",
|
|
83
|
+
"APPDATA",
|
|
84
|
+
"COMSPEC",
|
|
85
|
+
"PATHEXT",
|
|
86
|
+
"BUN_INSTALL",
|
|
87
|
+
"HOMEDRIVE",
|
|
88
|
+
"HOMEPATH",
|
|
89
|
+
"USERNAME",
|
|
90
|
+
"USERDOMAIN",
|
|
91
|
+
"ProgramData",
|
|
92
|
+
"ProgramFiles",
|
|
93
|
+
"ProgramFiles(x86)",
|
|
94
|
+
]
|
|
95
|
+
: []),
|
|
75
96
|
...Object.keys(overrides ?? {}),
|
|
76
97
|
])) {
|
|
77
|
-
const value =
|
|
98
|
+
const value =
|
|
99
|
+
overrides !== undefined && Object.hasOwn(overrides, name) ? overrides[name] : readEnv(name)
|
|
78
100
|
if (value !== undefined) result[name] = value
|
|
79
101
|
}
|
|
80
102
|
return result
|
|
81
103
|
}
|
|
104
|
+
|
|
105
|
+
function readEnv(name: string): string | undefined {
|
|
106
|
+
const exact = process.env[name]
|
|
107
|
+
if (exact !== undefined || process.platform !== "win32") return exact
|
|
108
|
+
const key = Object.keys(process.env).find(
|
|
109
|
+
(candidate) => candidate.toLowerCase() === name.toLowerCase(),
|
|
110
|
+
)
|
|
111
|
+
return key === undefined ? undefined : process.env[key]
|
|
112
|
+
}
|
package/src/diff.ts
CHANGED
|
@@ -72,9 +72,47 @@ export async function readProjectDiff(options: ProjectDiffOptions): Promise<Proj
|
|
|
72
72
|
|
|
73
73
|
function safeEnv(): Record<string, string> {
|
|
74
74
|
const result: Record<string, string> = {}
|
|
75
|
-
|
|
76
|
-
|
|
75
|
+
const names = [
|
|
76
|
+
"PATH",
|
|
77
|
+
"HOME",
|
|
78
|
+
"LANG",
|
|
79
|
+
"LC_ALL",
|
|
80
|
+
"TERM",
|
|
81
|
+
"GIT_PAGER",
|
|
82
|
+
...(process.platform === "win32"
|
|
83
|
+
? [
|
|
84
|
+
"SystemRoot",
|
|
85
|
+
"WINDIR",
|
|
86
|
+
"TEMP",
|
|
87
|
+
"TMP",
|
|
88
|
+
"USERPROFILE",
|
|
89
|
+
"LOCALAPPDATA",
|
|
90
|
+
"APPDATA",
|
|
91
|
+
"COMSPEC",
|
|
92
|
+
"PATHEXT",
|
|
93
|
+
"BUN_INSTALL",
|
|
94
|
+
"HOMEDRIVE",
|
|
95
|
+
"HOMEPATH",
|
|
96
|
+
"USERNAME",
|
|
97
|
+
"USERDOMAIN",
|
|
98
|
+
"ProgramData",
|
|
99
|
+
"ProgramFiles",
|
|
100
|
+
"ProgramFiles(x86)",
|
|
101
|
+
]
|
|
102
|
+
: []),
|
|
103
|
+
]
|
|
104
|
+
for (const name of names) {
|
|
105
|
+
const value = name === "GIT_PAGER" ? "cat" : readEnv(name)
|
|
77
106
|
if (value !== undefined) result[name] = value
|
|
78
107
|
}
|
|
79
108
|
return result
|
|
80
109
|
}
|
|
110
|
+
|
|
111
|
+
function readEnv(name: string): string | undefined {
|
|
112
|
+
const exact = process.env[name]
|
|
113
|
+
if (exact !== undefined || process.platform !== "win32") return exact
|
|
114
|
+
const key = Object.keys(process.env).find(
|
|
115
|
+
(candidate) => candidate.toLowerCase() === name.toLowerCase(),
|
|
116
|
+
)
|
|
117
|
+
return key === undefined ? undefined : process.env[key]
|
|
118
|
+
}
|
package/src/host.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
type AgentApprovalRequiredEvent,
|
|
3
|
+
type AgentApprovalResolvedEvent,
|
|
3
4
|
type AgentBackend,
|
|
4
5
|
type AgentEvent,
|
|
5
6
|
type AgentEventPayload,
|
|
@@ -7,6 +8,7 @@ import {
|
|
|
7
8
|
agentError,
|
|
8
9
|
type CreateSessionInput,
|
|
9
10
|
type ForkSessionResult,
|
|
11
|
+
isAgentEvent,
|
|
10
12
|
type ReloadResult,
|
|
11
13
|
} from "@nifrajs/agent-protocol"
|
|
12
14
|
import {
|
|
@@ -85,18 +87,33 @@ export class CodingAgentHost {
|
|
|
85
87
|
|
|
86
88
|
async start(input: CreateSessionInput): Promise<AgentSessionSnapshot> {
|
|
87
89
|
if (this.session !== undefined) throw new Error("coding agent: a session is already active")
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
history
|
|
92
|
-
this.
|
|
93
|
-
|
|
90
|
+
const created = await this.backend.createSession(input)
|
|
91
|
+
this.session = created
|
|
92
|
+
try {
|
|
93
|
+
let history: readonly import("./sessions.ts").SessionLogEntry[] = []
|
|
94
|
+
if (input.sessionId !== undefined && this.sessionStore !== undefined) {
|
|
95
|
+
history = await this.sessionStore.read(input.sessionId)
|
|
96
|
+
this.context.restore(history.map(sessionEntryToContextRecord))
|
|
97
|
+
} else {
|
|
98
|
+
this.context.restore([])
|
|
99
|
+
}
|
|
100
|
+
this.nextSeq = nextSequence(created, history)
|
|
101
|
+
await this.extensions?.reload()
|
|
102
|
+
await this.sessionStore?.append(created.id, "session.started", created)
|
|
103
|
+
return created
|
|
104
|
+
} catch (error) {
|
|
105
|
+
// Session creation may allocate a process or other external resource. If history, extension
|
|
106
|
+
// initialization, or the first persistence write fails, roll the backend session back before
|
|
107
|
+
// exposing the failure; otherwise a retry leaks the live session behind `this.session = undefined`.
|
|
108
|
+
this.session = undefined
|
|
94
109
|
this.context.restore([])
|
|
110
|
+
this.nextSeq = 0
|
|
111
|
+
await this.backend.cancel(created.id, "session startup failed").catch(() => {})
|
|
112
|
+
await this.backend.close(created.id).catch(() => {})
|
|
113
|
+
await this.extensions?.close().catch(() => {})
|
|
114
|
+
this.approvals.close()
|
|
115
|
+
throw error
|
|
95
116
|
}
|
|
96
|
-
this.nextSeq = nextSequence(this.session, history)
|
|
97
|
-
await this.extensions?.reload()
|
|
98
|
-
await this.sessionStore?.append(this.session.id, "session.started", this.session)
|
|
99
|
-
return this.session
|
|
100
117
|
}
|
|
101
118
|
|
|
102
119
|
get snapshot(): AgentSessionSnapshot | undefined {
|
|
@@ -118,6 +135,12 @@ export class CodingAgentHost {
|
|
|
118
135
|
const event = this.acceptBackendEvent(rawEvent)
|
|
119
136
|
await this.recordEvent(event)
|
|
120
137
|
yield event
|
|
138
|
+
if (event.type === "session.stopped") return
|
|
139
|
+
if (event.type === "session.failed") {
|
|
140
|
+
if (event.error.code === "BACKEND_PROTOCOL")
|
|
141
|
+
await this.backend.cancel(sessionId, "backend protocol error").catch(() => {})
|
|
142
|
+
return
|
|
143
|
+
}
|
|
121
144
|
}
|
|
122
145
|
if (signal?.aborted === true) return
|
|
123
146
|
|
|
@@ -132,8 +155,15 @@ export class CodingAgentHost {
|
|
|
132
155
|
|
|
133
156
|
private nextSeq = 0
|
|
134
157
|
|
|
135
|
-
private acceptBackendEvent(rawEvent:
|
|
158
|
+
private acceptBackendEvent(rawEvent: unknown): AgentEvent {
|
|
136
159
|
const session = this.requireSession()
|
|
160
|
+
if (!isAgentEvent(rawEvent) || rawEvent.sessionId !== session.id) {
|
|
161
|
+
return this.createEvent({
|
|
162
|
+
type: "session.failed",
|
|
163
|
+
error: agentError("BACKEND_PROTOCOL", "backend emitted an invalid agent event"),
|
|
164
|
+
recoverable: false,
|
|
165
|
+
})
|
|
166
|
+
}
|
|
137
167
|
const event = Object.freeze({
|
|
138
168
|
...rawEvent,
|
|
139
169
|
sessionId: session.id,
|
|
@@ -152,6 +182,26 @@ export class CodingAgentHost {
|
|
|
152
182
|
this.session = snapshot
|
|
153
183
|
return Object.freeze({ ...event, snapshot }) as AgentEvent
|
|
154
184
|
}
|
|
185
|
+
if (event.type === "session.stopped") {
|
|
186
|
+
const { activeTurnId: _activeTurnId, ...withoutActiveTurn } = session
|
|
187
|
+
this.session = Object.freeze({
|
|
188
|
+
...withoutActiveTurn,
|
|
189
|
+
status: "stopped",
|
|
190
|
+
lastSeq: event.seq,
|
|
191
|
+
updatedAt: event.at,
|
|
192
|
+
})
|
|
193
|
+
return event
|
|
194
|
+
}
|
|
195
|
+
if (event.type === "session.failed") {
|
|
196
|
+
const { activeTurnId: _activeTurnId, ...withoutActiveTurn } = session
|
|
197
|
+
this.session = Object.freeze({
|
|
198
|
+
...withoutActiveTurn,
|
|
199
|
+
status: "failed",
|
|
200
|
+
lastSeq: event.seq,
|
|
201
|
+
updatedAt: event.at,
|
|
202
|
+
})
|
|
203
|
+
return event
|
|
204
|
+
}
|
|
155
205
|
this.session = Object.freeze({
|
|
156
206
|
...session,
|
|
157
207
|
lastSeq: event.seq,
|
|
@@ -199,18 +249,30 @@ export class CodingAgentHost {
|
|
|
199
249
|
|
|
200
250
|
private createEvent(payload: AgentEventPayload): AgentEvent {
|
|
201
251
|
const session = this.requireSession()
|
|
202
|
-
const
|
|
252
|
+
const candidate = Object.freeze({
|
|
203
253
|
version: 1 as const,
|
|
204
254
|
sessionId: session.id,
|
|
205
255
|
seq: this.nextSeq++,
|
|
206
256
|
at: Date.now(),
|
|
207
257
|
...payload,
|
|
208
258
|
}) as AgentEvent
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
259
|
+
const event = normalizeHostEvent(candidate)
|
|
260
|
+
if (event === undefined) throw new Error("coding agent: host generated an invalid agent event")
|
|
261
|
+
if (event.type === "session.stopped" || event.type === "session.failed") {
|
|
262
|
+
const { activeTurnId: _activeTurnId, ...withoutActiveTurn } = session
|
|
263
|
+
this.session = Object.freeze({
|
|
264
|
+
...withoutActiveTurn,
|
|
265
|
+
status: event.type === "session.stopped" ? "stopped" : "failed",
|
|
266
|
+
lastSeq: event.seq,
|
|
267
|
+
updatedAt: event.at,
|
|
268
|
+
})
|
|
269
|
+
} else {
|
|
270
|
+
this.session = Object.freeze({
|
|
271
|
+
...session,
|
|
272
|
+
lastSeq: event.seq,
|
|
273
|
+
updatedAt: event.at,
|
|
274
|
+
})
|
|
275
|
+
}
|
|
214
276
|
return event
|
|
215
277
|
}
|
|
216
278
|
|
|
@@ -218,7 +280,11 @@ export class CodingAgentHost {
|
|
|
218
280
|
const sessionId = this.requireSession().id
|
|
219
281
|
if (event.type === "approval.required")
|
|
220
282
|
await this.approvals.observe(event as AgentApprovalRequiredEvent)
|
|
221
|
-
|
|
283
|
+
else if (event.type === "approval.resolved") {
|
|
284
|
+
const resolved = event as AgentApprovalResolvedEvent
|
|
285
|
+
this.approvals.resolve(resolved.approvalId, resolved.approved, resolved.reason)
|
|
286
|
+
}
|
|
287
|
+
await this.sessionStore?.append(sessionId, event.type, eventEvidence(event), {
|
|
222
288
|
pinned:
|
|
223
289
|
event.type === "approval.required" ||
|
|
224
290
|
event.type === "verification.completed" ||
|
|
@@ -305,7 +371,7 @@ export class CodingAgentHost {
|
|
|
305
371
|
if (this.sessionStore === undefined) return Object.freeze([])
|
|
306
372
|
if (!Number.isSafeInteger(limit) || limit < 1 || limit > 4096)
|
|
307
373
|
throw new RangeError("coding agent: history limit must be between 1 and 4096")
|
|
308
|
-
const entries = await this.sessionStore.read(this.session.id)
|
|
374
|
+
const entries = await this.sessionStore.read(this.session.id, limit)
|
|
309
375
|
return Object.freeze(entries.slice(-limit))
|
|
310
376
|
}
|
|
311
377
|
|
|
@@ -313,11 +379,16 @@ export class CodingAgentHost {
|
|
|
313
379
|
if (this.session === undefined) return
|
|
314
380
|
const id = this.session.id
|
|
315
381
|
this.session = undefined
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
382
|
+
try {
|
|
383
|
+
await this.sessionStore?.append(id, "session.stopped", { reason })
|
|
384
|
+
} finally {
|
|
385
|
+
// Persistence is an audit aid, not a prerequisite for releasing the backend. Always clean up
|
|
386
|
+
// the live session even when the store is full, read-only, or temporarily unavailable.
|
|
387
|
+
await this.backend.cancel(id, reason).catch(() => {})
|
|
388
|
+
await this.backend.close(id).catch(() => {})
|
|
389
|
+
await this.extensions?.close().catch(() => {})
|
|
390
|
+
this.approvals.close()
|
|
391
|
+
}
|
|
321
392
|
}
|
|
322
393
|
|
|
323
394
|
get pendingApprovals(): readonly ApprovalRequest[] {
|
|
@@ -389,6 +460,130 @@ function eventText(event: AgentEvent): string {
|
|
|
389
460
|
}
|
|
390
461
|
}
|
|
391
462
|
|
|
463
|
+
/** Keep host-owned diagnostics inside the same wire contract as backend events. */
|
|
464
|
+
function normalizeHostEvent(event: unknown): AgentEvent | undefined {
|
|
465
|
+
if (isAgentEvent(event)) return event
|
|
466
|
+
if (event === null || typeof event !== "object" || Array.isArray(event)) return undefined
|
|
467
|
+
const candidate = event as Record<string, unknown>
|
|
468
|
+
if (candidate.type === "verification.completed") {
|
|
469
|
+
// Verification reports are command output. They are useful to the repair prompt, but an
|
|
470
|
+
// arbitrary report must not bypass the protocol's depth/object/string limits on the live stream.
|
|
471
|
+
const { report: _report, ...withoutReport } = candidate
|
|
472
|
+
const fallback = Object.freeze(withoutReport)
|
|
473
|
+
return isAgentEvent(fallback) ? (fallback as AgentEvent) : undefined
|
|
474
|
+
}
|
|
475
|
+
if (candidate.type !== "repair.required") return undefined
|
|
476
|
+
|
|
477
|
+
const source = candidate.task
|
|
478
|
+
if (source === null || typeof source !== "object" || Array.isArray(source)) return undefined
|
|
479
|
+
const taskSource = source as Record<string, unknown>
|
|
480
|
+
const task = Object.freeze({
|
|
481
|
+
id: boundedHostToken(taskSource.id)
|
|
482
|
+
? taskSource.id
|
|
483
|
+
: `verification-${typeof candidate.seq === "number" ? candidate.seq : "unknown"}`,
|
|
484
|
+
verification:
|
|
485
|
+
taskSource.verification === "check" ||
|
|
486
|
+
taskSource.verification === "assure" ||
|
|
487
|
+
taskSource.verification === "test"
|
|
488
|
+
? taskSource.verification
|
|
489
|
+
: "check",
|
|
490
|
+
cwd: boundedHostText(taskSource.cwd, 4_096) || ".",
|
|
491
|
+
reason: boundedHostText(taskSource.reason, 256 * 1024) || "verification failed",
|
|
492
|
+
capabilities: Object.freeze(
|
|
493
|
+
(Array.isArray(taskSource.capabilities) ? taskSource.capabilities : []).filter(
|
|
494
|
+
boundedHostToken,
|
|
495
|
+
),
|
|
496
|
+
),
|
|
497
|
+
...(typeof taskSource.output === "string"
|
|
498
|
+
? { output: boundedHostText(taskSource.output, 256 * 1024) }
|
|
499
|
+
: {}),
|
|
500
|
+
})
|
|
501
|
+
const { task: _task, turnId, ...base } = candidate
|
|
502
|
+
const fallback = Object.freeze({
|
|
503
|
+
...base,
|
|
504
|
+
...(boundedHostToken(turnId) ? { turnId } : {}),
|
|
505
|
+
task,
|
|
506
|
+
})
|
|
507
|
+
return isAgentEvent(fallback) ? (fallback as AgentEvent) : undefined
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
function boundedHostText(value: unknown, max: number): string {
|
|
511
|
+
if (typeof value !== "string") return ""
|
|
512
|
+
const clean = value.replaceAll("\0", "")
|
|
513
|
+
return clean.length <= max ? clean : clean.slice(0, max)
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
function boundedHostToken(value: unknown): value is string {
|
|
517
|
+
return typeof value === "string" && /^[A-Za-z0-9._:/-]{1,128}$/.test(value)
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
/** Default session evidence is content-free; live protocol consumers still receive the full event. */
|
|
521
|
+
function eventEvidence(event: AgentEvent): unknown {
|
|
522
|
+
switch (event.type) {
|
|
523
|
+
case "session.started":
|
|
524
|
+
case "session.updated":
|
|
525
|
+
case "session.completed":
|
|
526
|
+
return {
|
|
527
|
+
status: event.snapshot.status,
|
|
528
|
+
lastSeq: event.snapshot.lastSeq,
|
|
529
|
+
activeTurnId: event.snapshot.activeTurnId,
|
|
530
|
+
capabilities: event.snapshot.capabilities,
|
|
531
|
+
}
|
|
532
|
+
case "turn.started":
|
|
533
|
+
return { turnId: event.turnId }
|
|
534
|
+
case "assistant.delta":
|
|
535
|
+
case "assistant.message":
|
|
536
|
+
return { turnId: event.turnId }
|
|
537
|
+
case "tool.started":
|
|
538
|
+
return { turnId: event.turnId, callId: event.callId, name: event.name }
|
|
539
|
+
case "tool.delta":
|
|
540
|
+
return { turnId: event.turnId, callId: event.callId }
|
|
541
|
+
case "tool.completed":
|
|
542
|
+
return {
|
|
543
|
+
turnId: event.turnId,
|
|
544
|
+
callId: event.callId,
|
|
545
|
+
name: event.name,
|
|
546
|
+
ok: event.ok,
|
|
547
|
+
...(event.error === undefined ? {} : { errorCode: event.error.code }),
|
|
548
|
+
}
|
|
549
|
+
case "approval.required":
|
|
550
|
+
return {
|
|
551
|
+
turnId: event.turnId,
|
|
552
|
+
approvalId: event.approvalId,
|
|
553
|
+
action: event.action,
|
|
554
|
+
capability: event.capability,
|
|
555
|
+
}
|
|
556
|
+
case "approval.resolved":
|
|
557
|
+
return {
|
|
558
|
+
...(event.turnId === undefined ? {} : { turnId: event.turnId }),
|
|
559
|
+
approvalId: event.approvalId,
|
|
560
|
+
approved: event.approved,
|
|
561
|
+
}
|
|
562
|
+
case "repair.required":
|
|
563
|
+
return {
|
|
564
|
+
...(event.turnId === undefined ? {} : { turnId: event.turnId }),
|
|
565
|
+
taskId: event.task.id,
|
|
566
|
+
verification: event.task.verification,
|
|
567
|
+
capabilities: event.task.capabilities,
|
|
568
|
+
}
|
|
569
|
+
case "verification.completed":
|
|
570
|
+
return { name: event.name, ok: event.ok }
|
|
571
|
+
case "memory.compacted":
|
|
572
|
+
return { before: event.before, after: event.after, reason: event.reason }
|
|
573
|
+
case "extension.reloaded":
|
|
574
|
+
return {
|
|
575
|
+
revision: event.revision,
|
|
576
|
+
loaded: event.loaded,
|
|
577
|
+
disabled: event.disabled,
|
|
578
|
+
rolledBack: event.rolledBack,
|
|
579
|
+
}
|
|
580
|
+
case "session.failed":
|
|
581
|
+
return { errorCode: event.error.code, recoverable: event.recoverable }
|
|
582
|
+
case "session.stopped":
|
|
583
|
+
return {}
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
|
|
392
587
|
function createRepairPrompt(
|
|
393
588
|
tasks: readonly VerificationRepairTask[],
|
|
394
589
|
attempt: number,
|
package/src/index.ts
CHANGED
|
@@ -150,6 +150,11 @@ export {
|
|
|
150
150
|
} from "./ui.ts"
|
|
151
151
|
export {
|
|
152
152
|
createVerificationRepairTask,
|
|
153
|
+
isSafeReviewDiff,
|
|
154
|
+
type ReviewExecutionErrorCode,
|
|
155
|
+
type ReviewExecutionResult,
|
|
156
|
+
type ReviewOptions,
|
|
157
|
+
runNifraReview,
|
|
153
158
|
runNifraVerification,
|
|
154
159
|
type VerificationOptions,
|
|
155
160
|
type VerificationRepairTask,
|