@nifrajs/coding-agent 3.3.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 +146 -23
- 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 +5 -0
- package/dist/native.d.ts.map +1 -1
- package/dist/native.js +138 -34
- 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 +146 -23
- package/src/index.ts +5 -0
- package/src/isolated.ts +39 -2
- package/src/native.ts +173 -32
- 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
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
agentError,
|
|
9
9
|
type CreateSessionInput,
|
|
10
10
|
type ForkSessionResult,
|
|
11
|
+
isAgentEvent,
|
|
11
12
|
type ReloadResult,
|
|
12
13
|
} from "@nifrajs/agent-protocol"
|
|
13
14
|
import {
|
|
@@ -86,18 +87,33 @@ export class CodingAgentHost {
|
|
|
86
87
|
|
|
87
88
|
async start(input: CreateSessionInput): Promise<AgentSessionSnapshot> {
|
|
88
89
|
if (this.session !== undefined) throw new Error("coding agent: a session is already active")
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
history
|
|
93
|
-
this.
|
|
94
|
-
|
|
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
|
|
95
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
|
|
96
116
|
}
|
|
97
|
-
this.nextSeq = nextSequence(this.session, history)
|
|
98
|
-
await this.extensions?.reload()
|
|
99
|
-
await this.sessionStore?.append(this.session.id, "session.started", this.session)
|
|
100
|
-
return this.session
|
|
101
117
|
}
|
|
102
118
|
|
|
103
119
|
get snapshot(): AgentSessionSnapshot | undefined {
|
|
@@ -119,6 +135,12 @@ export class CodingAgentHost {
|
|
|
119
135
|
const event = this.acceptBackendEvent(rawEvent)
|
|
120
136
|
await this.recordEvent(event)
|
|
121
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
|
+
}
|
|
122
144
|
}
|
|
123
145
|
if (signal?.aborted === true) return
|
|
124
146
|
|
|
@@ -133,8 +155,15 @@ export class CodingAgentHost {
|
|
|
133
155
|
|
|
134
156
|
private nextSeq = 0
|
|
135
157
|
|
|
136
|
-
private acceptBackendEvent(rawEvent:
|
|
158
|
+
private acceptBackendEvent(rawEvent: unknown): AgentEvent {
|
|
137
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
|
+
}
|
|
138
167
|
const event = Object.freeze({
|
|
139
168
|
...rawEvent,
|
|
140
169
|
sessionId: session.id,
|
|
@@ -153,6 +182,26 @@ export class CodingAgentHost {
|
|
|
153
182
|
this.session = snapshot
|
|
154
183
|
return Object.freeze({ ...event, snapshot }) as AgentEvent
|
|
155
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
|
+
}
|
|
156
205
|
this.session = Object.freeze({
|
|
157
206
|
...session,
|
|
158
207
|
lastSeq: event.seq,
|
|
@@ -200,18 +249,30 @@ export class CodingAgentHost {
|
|
|
200
249
|
|
|
201
250
|
private createEvent(payload: AgentEventPayload): AgentEvent {
|
|
202
251
|
const session = this.requireSession()
|
|
203
|
-
const
|
|
252
|
+
const candidate = Object.freeze({
|
|
204
253
|
version: 1 as const,
|
|
205
254
|
sessionId: session.id,
|
|
206
255
|
seq: this.nextSeq++,
|
|
207
256
|
at: Date.now(),
|
|
208
257
|
...payload,
|
|
209
258
|
}) as AgentEvent
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
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
|
+
}
|
|
215
276
|
return event
|
|
216
277
|
}
|
|
217
278
|
|
|
@@ -310,7 +371,7 @@ export class CodingAgentHost {
|
|
|
310
371
|
if (this.sessionStore === undefined) return Object.freeze([])
|
|
311
372
|
if (!Number.isSafeInteger(limit) || limit < 1 || limit > 4096)
|
|
312
373
|
throw new RangeError("coding agent: history limit must be between 1 and 4096")
|
|
313
|
-
const entries = await this.sessionStore.read(this.session.id)
|
|
374
|
+
const entries = await this.sessionStore.read(this.session.id, limit)
|
|
314
375
|
return Object.freeze(entries.slice(-limit))
|
|
315
376
|
}
|
|
316
377
|
|
|
@@ -318,11 +379,16 @@ export class CodingAgentHost {
|
|
|
318
379
|
if (this.session === undefined) return
|
|
319
380
|
const id = this.session.id
|
|
320
381
|
this.session = undefined
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
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
|
+
}
|
|
326
392
|
}
|
|
327
393
|
|
|
328
394
|
get pendingApprovals(): readonly ApprovalRequest[] {
|
|
@@ -394,6 +460,63 @@ function eventText(event: AgentEvent): string {
|
|
|
394
460
|
}
|
|
395
461
|
}
|
|
396
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
|
+
|
|
397
520
|
/** Default session evidence is content-free; live protocol consumers still receive the full event. */
|
|
398
521
|
function eventEvidence(event: AgentEvent): unknown {
|
|
399
522
|
switch (event.type) {
|
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,
|
package/src/isolated.ts
CHANGED
|
@@ -336,9 +336,46 @@ function workerError(message: WorkerMessage): Error {
|
|
|
336
336
|
|
|
337
337
|
function filteredEnv(): Record<string, string> {
|
|
338
338
|
const result: Record<string, string> = {}
|
|
339
|
-
|
|
340
|
-
|
|
339
|
+
const names = [
|
|
340
|
+
"PATH",
|
|
341
|
+
"HOME",
|
|
342
|
+
"LANG",
|
|
343
|
+
"LC_ALL",
|
|
344
|
+
"TERM",
|
|
345
|
+
...(process.platform === "win32"
|
|
346
|
+
? [
|
|
347
|
+
"SystemRoot",
|
|
348
|
+
"WINDIR",
|
|
349
|
+
"TEMP",
|
|
350
|
+
"TMP",
|
|
351
|
+
"USERPROFILE",
|
|
352
|
+
"LOCALAPPDATA",
|
|
353
|
+
"APPDATA",
|
|
354
|
+
"COMSPEC",
|
|
355
|
+
"PATHEXT",
|
|
356
|
+
"BUN_INSTALL",
|
|
357
|
+
"HOMEDRIVE",
|
|
358
|
+
"HOMEPATH",
|
|
359
|
+
"USERNAME",
|
|
360
|
+
"USERDOMAIN",
|
|
361
|
+
"ProgramData",
|
|
362
|
+
"ProgramFiles",
|
|
363
|
+
"ProgramFiles(x86)",
|
|
364
|
+
]
|
|
365
|
+
: []),
|
|
366
|
+
]
|
|
367
|
+
for (const name of names) {
|
|
368
|
+
const value = readEnv(name)
|
|
341
369
|
if (value !== undefined) result[name] = value
|
|
342
370
|
}
|
|
343
371
|
return result
|
|
344
372
|
}
|
|
373
|
+
|
|
374
|
+
function readEnv(name: string): string | undefined {
|
|
375
|
+
const exact = process.env[name]
|
|
376
|
+
if (exact !== undefined || process.platform !== "win32") return exact
|
|
377
|
+
const key = Object.keys(process.env).find(
|
|
378
|
+
(candidate) => candidate.toLowerCase() === name.toLowerCase(),
|
|
379
|
+
)
|
|
380
|
+
return key === undefined ? undefined : process.env[key]
|
|
381
|
+
}
|