@farmslot/agent-runtime 0.8.0 → 0.9.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/CHANGELOG.md +14 -0
- package/README.md +2 -2
- package/bin/farmslot-agent.mjs +3 -43
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/native/affinity.test.d.ts +2 -0
- package/dist/native/affinity.test.d.ts.map +1 -0
- package/dist/native/affinity.test.js +30 -0
- package/dist/native/affinity.test.js.map +1 -0
- package/dist/native/claude.d.ts +11 -0
- package/dist/native/claude.d.ts.map +1 -0
- package/dist/native/claude.js +490 -0
- package/dist/native/claude.js.map +1 -0
- package/dist/native/client.d.ts +21 -0
- package/dist/native/client.d.ts.map +1 -0
- package/dist/native/client.js +106 -0
- package/dist/native/client.js.map +1 -0
- package/dist/native/codex.d.ts +3 -0
- package/dist/native/codex.d.ts.map +1 -0
- package/dist/native/codex.js +266 -0
- package/dist/native/codex.js.map +1 -0
- package/dist/native/durability.test.d.ts +2 -0
- package/dist/native/durability.test.d.ts.map +1 -0
- package/dist/native/durability.test.js +516 -0
- package/dist/native/durability.test.js.map +1 -0
- package/dist/native/host.d.ts +2 -0
- package/dist/native/host.d.ts.map +1 -0
- package/dist/native/host.js +90 -0
- package/dist/native/host.js.map +1 -0
- package/dist/native/index.d.ts +4 -0
- package/dist/native/index.d.ts.map +1 -0
- package/dist/native/index.js +3 -0
- package/dist/native/index.js.map +1 -0
- package/dist/native/ipc.d.ts +49 -0
- package/dist/native/ipc.d.ts.map +1 -0
- package/dist/native/ipc.js +109 -0
- package/dist/native/ipc.js.map +1 -0
- package/dist/native/manager.d.ts +43 -0
- package/dist/native/manager.d.ts.map +1 -0
- package/dist/native/manager.js +510 -0
- package/dist/native/manager.js.map +1 -0
- package/dist/native/process-tree.d.ts +15 -0
- package/dist/native/process-tree.d.ts.map +1 -0
- package/dist/native/process-tree.js +128 -0
- package/dist/native/process-tree.js.map +1 -0
- package/dist/native/process-tree.test.d.ts +2 -0
- package/dist/native/process-tree.test.d.ts.map +1 -0
- package/dist/native/process-tree.test.js +49 -0
- package/dist/native/process-tree.test.js.map +1 -0
- package/dist/native/process.d.ts +34 -0
- package/dist/native/process.d.ts.map +1 -0
- package/dist/native/process.js +223 -0
- package/dist/native/process.js.map +1 -0
- package/dist/native/service.d.ts +7 -0
- package/dist/native/service.d.ts.map +1 -0
- package/dist/native/service.js +117 -0
- package/dist/native/service.js.map +1 -0
- package/dist/native/storage.d.ts +11 -0
- package/dist/native/storage.d.ts.map +1 -0
- package/dist/native/storage.js +102 -0
- package/dist/native/storage.js.map +1 -0
- package/dist/native/supervisor.d.ts +2 -0
- package/dist/native/supervisor.d.ts.map +1 -0
- package/dist/native/supervisor.js +127 -0
- package/dist/native/supervisor.js.map +1 -0
- package/dist/native/types.d.ts +26 -0
- package/dist/native/types.d.ts.map +1 -0
- package/dist/native/types.js +2 -0
- package/dist/native/types.js.map +1 -0
- package/dist/native/workspace-files.d.ts +6 -0
- package/dist/native/workspace-files.d.ts.map +1 -0
- package/dist/native/workspace-files.js +62 -0
- package/dist/native/workspace-files.js.map +1 -0
- package/dist/native/workspace.d.ts +5 -0
- package/dist/native/workspace.d.ts.map +1 -0
- package/dist/native/workspace.js +120 -0
- package/dist/native/workspace.js.map +1 -0
- package/dist/task-init/index.d.ts +66 -0
- package/dist/task-init/index.d.ts.map +1 -0
- package/dist/task-init/index.js +120 -0
- package/dist/task-init/index.js.map +1 -0
- package/dist/task-init/task-document.d.ts +98 -0
- package/dist/task-init/task-document.d.ts.map +1 -0
- package/dist/task-init/task-document.js +184 -0
- package/dist/task-init/task-document.js.map +1 -0
- package/dist/task-init/write.d.ts +48 -0
- package/dist/task-init/write.d.ts.map +1 -0
- package/dist/task-init/write.js +70 -0
- package/dist/task-init/write.js.map +1 -0
- package/package.json +13 -4
- package/scripts/checklist-target.cjs +5 -3
- package/scripts/execution-template-cli.mjs +9 -7
- package/scripts/mark-checklist-step.cjs +4 -2
- package/scripts/task-init-cli.mjs +166 -0
- package/scripts/worker-terminal-contract.cjs +15 -3
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { closeSync, constants, fsyncSync, openSync, readdirSync, writeFileSync } from 'node:fs';
|
|
4
|
+
import { access, realpath, stat } from 'node:fs/promises';
|
|
5
|
+
import { homedir } from 'node:os';
|
|
6
|
+
import { delimiter, dirname, isAbsolute, join } from 'node:path';
|
|
7
|
+
import { promisify } from 'node:util';
|
|
8
|
+
import { claudeNativeAdapter } from './claude.js';
|
|
9
|
+
import { codexNativeAdapter } from './codex.js';
|
|
10
|
+
import { privateDirectory, readJournal } from './storage.js';
|
|
11
|
+
const exec = promisify(execFile);
|
|
12
|
+
const adapters = {
|
|
13
|
+
codex: { adapter: codexNativeAdapter, binary: 'codex' },
|
|
14
|
+
claude: { adapter: claudeNativeAdapter, binary: 'claude' },
|
|
15
|
+
};
|
|
16
|
+
export async function resolveNativeExecutable(binary, cwd) {
|
|
17
|
+
let executable;
|
|
18
|
+
for (const directory of (process.env.PATH ?? '').split(delimiter)) {
|
|
19
|
+
const candidate = join(directory, binary);
|
|
20
|
+
try {
|
|
21
|
+
await access(candidate, constants.X_OK);
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
if (['ENOENT', 'EACCES', 'ENOTDIR'].includes(error.code ?? ''))
|
|
25
|
+
continue;
|
|
26
|
+
throw error;
|
|
27
|
+
}
|
|
28
|
+
executable = candidate;
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
if (!executable)
|
|
32
|
+
throw new Error(`Install and log into the native ${binary} runner first`);
|
|
33
|
+
if (executable.includes('/.asdf/shims/')) {
|
|
34
|
+
const resolved = await exec('asdf', ['which', binary], { cwd, timeout: 10_000 });
|
|
35
|
+
executable = resolved.stdout.trim();
|
|
36
|
+
}
|
|
37
|
+
executable = await realpath(executable);
|
|
38
|
+
const result = await exec(executable, ['--version'], {
|
|
39
|
+
cwd,
|
|
40
|
+
timeout: 10_000,
|
|
41
|
+
env: nativeEnvironment(executable),
|
|
42
|
+
});
|
|
43
|
+
const version = result.stdout.trim();
|
|
44
|
+
if (!version)
|
|
45
|
+
throw new Error('Native executable did not provide version metadata');
|
|
46
|
+
return { executable, version };
|
|
47
|
+
}
|
|
48
|
+
function executionContext() {
|
|
49
|
+
return {
|
|
50
|
+
home: homedir(),
|
|
51
|
+
codexHome: process.env.CODEX_HOME ?? '',
|
|
52
|
+
claudeConfigDir: process.env.CLAUDE_CONFIG_DIR ?? '',
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function nativeEnvironment(executable) {
|
|
56
|
+
// Native configuration may reference environment credentials. Inherit it in-process only;
|
|
57
|
+
// never persist or send it over IPC. Remove parent Claude invocation context.
|
|
58
|
+
const env = {
|
|
59
|
+
...process.env,
|
|
60
|
+
PATH: `${dirname(executable)}${delimiter}${process.env.PATH ?? ''}`,
|
|
61
|
+
};
|
|
62
|
+
delete env.CLAUDECODE;
|
|
63
|
+
return env;
|
|
64
|
+
}
|
|
65
|
+
/** Runs only inside the local host. Synchronous fsync orders intent before native input. */
|
|
66
|
+
export class NativeSessionManager {
|
|
67
|
+
constructor(root, executionNodeId = 'local') {
|
|
68
|
+
this.root = root;
|
|
69
|
+
this.executionNodeId = executionNodeId;
|
|
70
|
+
this.sessions = new Map();
|
|
71
|
+
this.persisted = new WeakMap();
|
|
72
|
+
privateDirectory(root);
|
|
73
|
+
for (const name of readdirSync(root).filter((name) => name.endsWith('.journal'))) {
|
|
74
|
+
const path = join(root, name);
|
|
75
|
+
const entries = readJournal(path).map((line) => JSON.parse(line));
|
|
76
|
+
// The first durable record precedes process launch; a torn first write owned no input.
|
|
77
|
+
if (!entries.length)
|
|
78
|
+
continue;
|
|
79
|
+
let info;
|
|
80
|
+
let context;
|
|
81
|
+
let pending = [];
|
|
82
|
+
const commands = new Map();
|
|
83
|
+
const events = [];
|
|
84
|
+
for (const entry of entries) {
|
|
85
|
+
info = entry.info ?? info;
|
|
86
|
+
context = entry.context ?? context;
|
|
87
|
+
pending = entry.pending ?? pending;
|
|
88
|
+
for (const command of entry.commands ?? [])
|
|
89
|
+
commands.set(command.commandId, command);
|
|
90
|
+
if (entry.event)
|
|
91
|
+
events.push(entry.event);
|
|
92
|
+
}
|
|
93
|
+
if (!info || !context)
|
|
94
|
+
throw new Error('Native journal has no durable session identity');
|
|
95
|
+
if (info.executionNodeId !== executionNodeId)
|
|
96
|
+
throw new Error('Native journal belongs to another execution node');
|
|
97
|
+
const record = {
|
|
98
|
+
info,
|
|
99
|
+
context,
|
|
100
|
+
commands,
|
|
101
|
+
events,
|
|
102
|
+
pendingRequests: new Map(pending.map((event) => [event.request.id, event])),
|
|
103
|
+
sending: false,
|
|
104
|
+
};
|
|
105
|
+
this.persisted.set(record, {
|
|
106
|
+
info: JSON.stringify(info),
|
|
107
|
+
context: JSON.stringify(context),
|
|
108
|
+
pending: JSON.stringify(pending),
|
|
109
|
+
commands: new Map([...commands].map(([id, command]) => [id, JSON.stringify(command)])),
|
|
110
|
+
});
|
|
111
|
+
this.sessions.set(record.info.id, record);
|
|
112
|
+
if (!['closed', 'failed'].includes(record.info.state)) {
|
|
113
|
+
record.info.state = 'failed';
|
|
114
|
+
record.info.recovery =
|
|
115
|
+
'Native host stopped. Verify the old process group is stopped, then explicitly resume the saved native identity.';
|
|
116
|
+
for (const command of record.commands.values())
|
|
117
|
+
if (command.state === 'pending')
|
|
118
|
+
command.state = 'unknown';
|
|
119
|
+
this.append(record, {
|
|
120
|
+
type: 'session.closed',
|
|
121
|
+
status: 'failed',
|
|
122
|
+
text: record.info.recovery,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
persist(record, event) {
|
|
128
|
+
const previous = this.persisted.get(record) ?? { commands: new Map() };
|
|
129
|
+
const info = JSON.stringify(record.info);
|
|
130
|
+
const context = JSON.stringify(record.context);
|
|
131
|
+
const pending = JSON.stringify([...record.pendingRequests.values()]);
|
|
132
|
+
const commands = [...record.commands.values()].filter((command) => previous.commands.get(command.commandId) !== JSON.stringify(command));
|
|
133
|
+
const entry = {
|
|
134
|
+
...(info !== previous.info ? { info: record.info } : {}),
|
|
135
|
+
...(context !== previous.context ? { context: record.context } : {}),
|
|
136
|
+
...(pending !== previous.pending ? { pending: [...record.pendingRequests.values()] } : {}),
|
|
137
|
+
...(commands.length ? { commands } : {}),
|
|
138
|
+
event,
|
|
139
|
+
};
|
|
140
|
+
if (!event && !entry.info && !entry.context && !entry.pending && !entry.commands)
|
|
141
|
+
return;
|
|
142
|
+
const fd = openSync(join(this.root, `${record.info.id}.journal`), 'a', 0o600);
|
|
143
|
+
try {
|
|
144
|
+
writeFileSync(fd, `${JSON.stringify(entry)}\n`);
|
|
145
|
+
fsyncSync(fd);
|
|
146
|
+
}
|
|
147
|
+
finally {
|
|
148
|
+
closeSync(fd);
|
|
149
|
+
}
|
|
150
|
+
const directory = openSync(this.root, 'r');
|
|
151
|
+
try {
|
|
152
|
+
fsyncSync(directory);
|
|
153
|
+
}
|
|
154
|
+
finally {
|
|
155
|
+
closeSync(directory);
|
|
156
|
+
}
|
|
157
|
+
for (const command of commands)
|
|
158
|
+
previous.commands.set(command.commandId, JSON.stringify(command));
|
|
159
|
+
this.persisted.set(record, { info, context, pending, commands: previous.commands });
|
|
160
|
+
}
|
|
161
|
+
create(owner, params) {
|
|
162
|
+
return this.start(owner, params);
|
|
163
|
+
}
|
|
164
|
+
async ensure(owner, params) {
|
|
165
|
+
if (typeof params.sessionId !== 'string' ||
|
|
166
|
+
!/^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/.test(params.sessionId))
|
|
167
|
+
throw new Error('Reserved sessionId must be a lowercase UUID');
|
|
168
|
+
if ('resumeSessionId' in params && params.resumeSessionId !== undefined)
|
|
169
|
+
throw new Error('Reserved sessionId is for initial creation, not resume');
|
|
170
|
+
return this.start(owner, params, params.sessionId);
|
|
171
|
+
}
|
|
172
|
+
async start(ownerPrincipalId, params, reservedId) {
|
|
173
|
+
if (params.executionNodeId !== undefined && params.executionNodeId !== this.executionNodeId)
|
|
174
|
+
throw new Error('Native session targets another execution node');
|
|
175
|
+
if (reservedId !== undefined) {
|
|
176
|
+
const existing = this.existingCreation(ownerPrincipalId, params, reservedId);
|
|
177
|
+
if (existing)
|
|
178
|
+
return this.createdSession(existing);
|
|
179
|
+
}
|
|
180
|
+
const transport = adapters[params.runner];
|
|
181
|
+
if (!transport)
|
|
182
|
+
throw new Error(`Runner has no native transport: ${params.runner}`);
|
|
183
|
+
if (!isAbsolute(params.cwd) || !(await stat(params.cwd)).isDirectory())
|
|
184
|
+
throw new Error('Native cwd must be an existing absolute directory');
|
|
185
|
+
let previous;
|
|
186
|
+
let mode = params.mode ?? 'default';
|
|
187
|
+
if (params.resumeSessionId) {
|
|
188
|
+
previous = [...this.sessions.values()]
|
|
189
|
+
.reverse()
|
|
190
|
+
.find((record) => record.info.nativeSessionId === params.resumeSessionId &&
|
|
191
|
+
record.info.runner === params.runner);
|
|
192
|
+
if (!previous || previous.info.ownerPrincipalId !== ownerPrincipalId)
|
|
193
|
+
throw new Error('Resume requires an owned native session');
|
|
194
|
+
const unavailable = transport.adapter.resumeUnavailableReason?.(previous.info.version);
|
|
195
|
+
if (unavailable)
|
|
196
|
+
throw new Error(unavailable);
|
|
197
|
+
if (!['closed', 'failed'].includes(previous.info.state))
|
|
198
|
+
throw new Error('Close the current native input owner before resuming');
|
|
199
|
+
if (previous.info.processPid && !previous.info.processStopped)
|
|
200
|
+
throw new Error('Native process cleanup is unconfirmed; recovery is blocked');
|
|
201
|
+
if (JSON.stringify(previous.context) !== JSON.stringify(executionContext()))
|
|
202
|
+
throw new Error('Resume must preserve the native account execution context');
|
|
203
|
+
if (previous.info.cwd !== params.cwd)
|
|
204
|
+
throw new Error('Resume must preserve the recorded working directory');
|
|
205
|
+
mode = params.mode ?? previous.info.mode;
|
|
206
|
+
}
|
|
207
|
+
if (!transport.adapter.capabilities.modes.includes(mode))
|
|
208
|
+
throw new Error('Native runner does not support this interaction mode');
|
|
209
|
+
const resolved = await resolveNativeExecutable(transport.binary, params.cwd);
|
|
210
|
+
const unavailable = transport.adapter.resumeUnavailableReason?.(resolved.version);
|
|
211
|
+
if (params.resumeSessionId && unavailable)
|
|
212
|
+
throw new Error(unavailable);
|
|
213
|
+
// Validation above awaits filesystem/process probes. Recheck synchronously before reservation.
|
|
214
|
+
const existing = this.existingCreation(ownerPrincipalId, params, reservedId);
|
|
215
|
+
if (existing)
|
|
216
|
+
return this.createdSession(existing);
|
|
217
|
+
// Reserve before starting the child, so simultaneous resume calls cannot create two input owners.
|
|
218
|
+
if (params.resumeSessionId &&
|
|
219
|
+
[...this.sessions.values()].some((record) => record.info.nativeSessionId === params.resumeSessionId &&
|
|
220
|
+
!['closed', 'failed'].includes(record.info.state)))
|
|
221
|
+
throw new Error('Native session already has an input owner');
|
|
222
|
+
const info = {
|
|
223
|
+
id: previous?.info.id ?? reservedId ?? randomUUID(),
|
|
224
|
+
generation: randomUUID(),
|
|
225
|
+
hostPid: process.pid,
|
|
226
|
+
runner: params.runner,
|
|
227
|
+
nativeSessionId: params.resumeSessionId ?? '',
|
|
228
|
+
ownerPrincipalId,
|
|
229
|
+
executionNodeId: this.executionNodeId,
|
|
230
|
+
accountContextId: this.executionNodeId === 'local'
|
|
231
|
+
? `native-local:${ownerPrincipalId}`
|
|
232
|
+
: `native-node:${JSON.stringify([this.executionNodeId, ownerPrincipalId])}`,
|
|
233
|
+
cwd: params.cwd,
|
|
234
|
+
...resolved,
|
|
235
|
+
model: params.model ?? previous?.info.model,
|
|
236
|
+
mode,
|
|
237
|
+
accountMode: 'native',
|
|
238
|
+
state: 'starting',
|
|
239
|
+
capabilities: { ...transport.adapter.capabilities },
|
|
240
|
+
};
|
|
241
|
+
const record = {
|
|
242
|
+
info,
|
|
243
|
+
events: previous?.events ?? [],
|
|
244
|
+
commands: previous?.commands ?? new Map(),
|
|
245
|
+
pendingRequests: new Map(),
|
|
246
|
+
context: executionContext(),
|
|
247
|
+
sending: false,
|
|
248
|
+
};
|
|
249
|
+
this.sessions.set(info.id, record);
|
|
250
|
+
if (previous) {
|
|
251
|
+
const saved = this.persisted.get(previous);
|
|
252
|
+
if (saved)
|
|
253
|
+
this.persisted.set(record, saved);
|
|
254
|
+
}
|
|
255
|
+
try {
|
|
256
|
+
this.persist(record);
|
|
257
|
+
}
|
|
258
|
+
catch (error) {
|
|
259
|
+
record.reservationError = error;
|
|
260
|
+
info.state = 'failed';
|
|
261
|
+
info.recovery = 'Initial session reservation could not be persisted; no runner was launched.';
|
|
262
|
+
throw error;
|
|
263
|
+
}
|
|
264
|
+
try {
|
|
265
|
+
record.startup = transport.adapter.start({
|
|
266
|
+
...params,
|
|
267
|
+
mode,
|
|
268
|
+
model: info.model,
|
|
269
|
+
onSpawn: (pid, identity) => {
|
|
270
|
+
info.processPid = pid;
|
|
271
|
+
info.processIdentity = identity;
|
|
272
|
+
info.processStopped = false;
|
|
273
|
+
this.persist(record);
|
|
274
|
+
},
|
|
275
|
+
executable: resolved.executable,
|
|
276
|
+
env: nativeEnvironment(resolved.executable),
|
|
277
|
+
}, (event) => this.append(record, event));
|
|
278
|
+
record.adapter = await record.startup;
|
|
279
|
+
info.nativeSessionId = record.adapter.nativeSessionId;
|
|
280
|
+
if (record.adapter.capabilities)
|
|
281
|
+
info.capabilities = { ...record.adapter.capabilities };
|
|
282
|
+
if (info.state === 'starting')
|
|
283
|
+
info.state = 'idle';
|
|
284
|
+
this.persist(record);
|
|
285
|
+
return this.snapshot(record);
|
|
286
|
+
}
|
|
287
|
+
catch (error) {
|
|
288
|
+
info.state = 'failed';
|
|
289
|
+
this.append(record, { type: 'error', text: error.message });
|
|
290
|
+
throw error;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
existingCreation(owner, params, reservedId) {
|
|
294
|
+
const record = reservedId ? this.sessions.get(reservedId) : undefined;
|
|
295
|
+
if (!record)
|
|
296
|
+
return undefined;
|
|
297
|
+
if (record.info.ownerPrincipalId !== owner)
|
|
298
|
+
throw new Error('Reserved sessionId belongs to another owner');
|
|
299
|
+
for (const field of ['runner', 'cwd', 'model', 'mode']) {
|
|
300
|
+
const requested = field === 'mode' ? (params.mode ?? 'default') : params[field];
|
|
301
|
+
if (record.info[field] !== requested)
|
|
302
|
+
throw new Error(`Reserved sessionId launch configuration differs: ${field}`);
|
|
303
|
+
}
|
|
304
|
+
if (JSON.stringify(record.context) !== JSON.stringify(executionContext()))
|
|
305
|
+
throw new Error('Reserved sessionId launch configuration differs: account execution context');
|
|
306
|
+
return record;
|
|
307
|
+
}
|
|
308
|
+
async createdSession(record) {
|
|
309
|
+
if (record.reservationError)
|
|
310
|
+
throw record.reservationError;
|
|
311
|
+
if (record.info.state === 'starting' && record.startup)
|
|
312
|
+
await record.startup;
|
|
313
|
+
// Failed/closed reservations remain explicit. A retry cannot create a replacement process.
|
|
314
|
+
return this.snapshot(record);
|
|
315
|
+
}
|
|
316
|
+
append(record, event) {
|
|
317
|
+
const enriched = {
|
|
318
|
+
...event,
|
|
319
|
+
sessionId: record.info.id,
|
|
320
|
+
generation: record.info.generation,
|
|
321
|
+
sequence: record.events.length + 1,
|
|
322
|
+
at: new Date().toISOString(),
|
|
323
|
+
...(event.request
|
|
324
|
+
? { request: { ...event.request, id: `${record.info.generation}:${randomUUID()}` } }
|
|
325
|
+
: {}),
|
|
326
|
+
};
|
|
327
|
+
record.events.push(enriched);
|
|
328
|
+
if (event.type === 'session.started' && event.nativeId)
|
|
329
|
+
record.info.nativeSessionId = event.nativeId;
|
|
330
|
+
if (event.type === 'turn.started' && record.info.state !== 'closing')
|
|
331
|
+
record.info.state = 'running';
|
|
332
|
+
if (event.type === 'error' && event.status === 'failed')
|
|
333
|
+
record.info.state = 'closing';
|
|
334
|
+
if (event.type === 'turn.completed') {
|
|
335
|
+
if (record.info.state !== 'closing')
|
|
336
|
+
record.info.state = 'idle';
|
|
337
|
+
record.pendingRequests.clear();
|
|
338
|
+
const command = event.commandId && record.commands.get(event.commandId);
|
|
339
|
+
if (command) {
|
|
340
|
+
command.state = event.status === 'completed' ? 'completed' : 'failed';
|
|
341
|
+
command.outcome = event.status;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
if (event.type === 'session.closed') {
|
|
345
|
+
if (event.data?.processStopped === true)
|
|
346
|
+
record.info.processStopped = true;
|
|
347
|
+
record.info.state = event.status === 'failed' ? 'failed' : 'closed';
|
|
348
|
+
if (event.status === 'failed')
|
|
349
|
+
record.info.recovery ??= record.info.nativeSessionId
|
|
350
|
+
? 'Native runner stopped. Explicitly resume the saved identity after verifying its process group is stopped.'
|
|
351
|
+
: 'Native runner stopped before its conversation identity was known. Automatic recovery is unavailable.';
|
|
352
|
+
for (const command of record.commands.values())
|
|
353
|
+
if (command.state === 'pending')
|
|
354
|
+
command.state = 'unknown';
|
|
355
|
+
record.pendingRequests.clear();
|
|
356
|
+
}
|
|
357
|
+
if ((event.type === 'approval.requested' || event.type === 'question.requested') &&
|
|
358
|
+
event.nativeId)
|
|
359
|
+
record.pendingRequests.set(enriched.request.id, enriched);
|
|
360
|
+
if (event.type === 'approval.resolved' && event.nativeId)
|
|
361
|
+
for (const [id, pending] of record.pendingRequests)
|
|
362
|
+
if (pending.nativeId === event.nativeId) {
|
|
363
|
+
enriched.request = pending.request;
|
|
364
|
+
record.pendingRequests.delete(id);
|
|
365
|
+
}
|
|
366
|
+
if (event.type === 'command.accepted' && event.commandId) {
|
|
367
|
+
const command = record.commands.get(event.commandId);
|
|
368
|
+
if (command) {
|
|
369
|
+
command.accepted = true;
|
|
370
|
+
if (!['completed', 'failed'].includes(command.state))
|
|
371
|
+
command.state = 'accepted';
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
this.persist(record, enriched);
|
|
375
|
+
}
|
|
376
|
+
owned(owner, id) {
|
|
377
|
+
const record = this.sessions.get(id);
|
|
378
|
+
if (!record || record.info.ownerPrincipalId !== owner)
|
|
379
|
+
throw new Error('Native session not found for this principal');
|
|
380
|
+
return record;
|
|
381
|
+
}
|
|
382
|
+
snapshot(record) {
|
|
383
|
+
const unavailable = adapters[record.info.runner]?.adapter.resumeUnavailableReason?.(record.info.version);
|
|
384
|
+
return {
|
|
385
|
+
...record.info,
|
|
386
|
+
capabilities: {
|
|
387
|
+
...record.info.capabilities,
|
|
388
|
+
...(unavailable ? { resume: false, resumeUnavailableReason: unavailable } : {}),
|
|
389
|
+
},
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
list(owner) {
|
|
393
|
+
return [...this.sessions.values()]
|
|
394
|
+
.filter((record) => record.info.ownerPrincipalId === owner)
|
|
395
|
+
.map((record) => this.snapshot(record));
|
|
396
|
+
}
|
|
397
|
+
read(owner, id, after = 0, limit = 200) {
|
|
398
|
+
const record = this.owned(owner, id);
|
|
399
|
+
if (!Number.isSafeInteger(after) || after < 0 || after > record.events.length)
|
|
400
|
+
throw new Error('Invalid native event cursor');
|
|
401
|
+
if (!Number.isSafeInteger(limit) || limit < 1 || limit > 500)
|
|
402
|
+
throw new Error('Invalid native event limit');
|
|
403
|
+
const events = [];
|
|
404
|
+
let bytes = 0;
|
|
405
|
+
for (const event of record.events.slice(after, after + limit)) {
|
|
406
|
+
const size = Buffer.byteLength(JSON.stringify(event));
|
|
407
|
+
if (events.length && bytes + size > 2 * 1024 * 1024)
|
|
408
|
+
break;
|
|
409
|
+
events.push(event);
|
|
410
|
+
bytes += size;
|
|
411
|
+
}
|
|
412
|
+
return {
|
|
413
|
+
session: this.snapshot(record),
|
|
414
|
+
events,
|
|
415
|
+
cursor: after + events.length,
|
|
416
|
+
hasMore: after + events.length < record.events.length,
|
|
417
|
+
commands: [...record.commands.values()]
|
|
418
|
+
.slice(-100)
|
|
419
|
+
.map(({ text: _text, ...receipt }) => receipt),
|
|
420
|
+
pendingRequests: [...record.pendingRequests.values()],
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
async send(owner, id, commandId, text) {
|
|
424
|
+
const record = this.owned(owner, id);
|
|
425
|
+
const existing = record.commands.get(commandId);
|
|
426
|
+
if (existing) {
|
|
427
|
+
if (existing.text !== text)
|
|
428
|
+
throw new Error('Command ID already has different text');
|
|
429
|
+
return {
|
|
430
|
+
submitted: existing.submitted,
|
|
431
|
+
accepted: existing.accepted,
|
|
432
|
+
state: existing.state,
|
|
433
|
+
commandId,
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
if (!record.adapter ||
|
|
437
|
+
record.info.state !== 'idle' ||
|
|
438
|
+
record.sending ||
|
|
439
|
+
[...record.commands.values()].some((command) => command.generation === record.info.generation &&
|
|
440
|
+
['pending', 'unknown', 'accepted'].includes(command.state)))
|
|
441
|
+
throw new Error('Native session is not idle');
|
|
442
|
+
record.sending = true;
|
|
443
|
+
record.info.state = 'waiting';
|
|
444
|
+
const command = {
|
|
445
|
+
text,
|
|
446
|
+
commandId,
|
|
447
|
+
generation: record.info.generation,
|
|
448
|
+
// Reserve uncertainty and the visible prompt together before touching stdin.
|
|
449
|
+
state: 'unknown',
|
|
450
|
+
submitted: true,
|
|
451
|
+
accepted: false,
|
|
452
|
+
};
|
|
453
|
+
record.commands.set(commandId, command);
|
|
454
|
+
try {
|
|
455
|
+
// A crash after this durable reservation must never trigger a resend.
|
|
456
|
+
this.append(record, { type: 'command.submitted', commandId, text });
|
|
457
|
+
await record.adapter.send(text, commandId);
|
|
458
|
+
return {
|
|
459
|
+
submitted: command.submitted,
|
|
460
|
+
accepted: command.accepted,
|
|
461
|
+
state: command.state,
|
|
462
|
+
commandId,
|
|
463
|
+
};
|
|
464
|
+
}
|
|
465
|
+
catch (error) {
|
|
466
|
+
this.persist(record);
|
|
467
|
+
throw error;
|
|
468
|
+
}
|
|
469
|
+
finally {
|
|
470
|
+
record.sending = false;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
async respond(owner, id, requestId, response) {
|
|
474
|
+
const record = this.owned(owner, id);
|
|
475
|
+
const pending = record.pendingRequests.get(requestId);
|
|
476
|
+
if (!record.adapter || !pending || pending.generation !== record.info.generation)
|
|
477
|
+
throw new Error('Native request is stale or belongs to another session');
|
|
478
|
+
if (pending.type === 'question.requested'
|
|
479
|
+
? !response.answers || !!response.decision
|
|
480
|
+
: !response.decision || !!response.answers)
|
|
481
|
+
throw new Error('Response does not match the pending interaction');
|
|
482
|
+
if (pending.responseState)
|
|
483
|
+
throw new Error('Native response outcome is unknown; do not resend');
|
|
484
|
+
// Reserve durably before delivery. An uncertain decision cannot be applied twice.
|
|
485
|
+
record.pendingRequests.set(requestId, { ...pending, responseState: 'unknown' });
|
|
486
|
+
this.persist(record);
|
|
487
|
+
await record.adapter.respond(pending.nativeId, response);
|
|
488
|
+
}
|
|
489
|
+
async interrupt(owner, id) {
|
|
490
|
+
const record = this.owned(owner, id);
|
|
491
|
+
if (!['waiting', 'running'].includes(record.info.state))
|
|
492
|
+
throw new Error('Native session has no running turn');
|
|
493
|
+
await record.adapter.interrupt();
|
|
494
|
+
}
|
|
495
|
+
async close(owner, id) {
|
|
496
|
+
const record = this.owned(owner, id);
|
|
497
|
+
if (record.info.state === 'closed' || record.info.state === 'failed') {
|
|
498
|
+
if (record.info.processPid && !record.info.processStopped)
|
|
499
|
+
throw new Error('Native process cleanup is unconfirmed; close outcome is unknown');
|
|
500
|
+
return;
|
|
501
|
+
}
|
|
502
|
+
record.info.state = 'closing';
|
|
503
|
+
this.persist(record);
|
|
504
|
+
const adapter = record.adapter ?? (await record.startup);
|
|
505
|
+
await adapter?.close();
|
|
506
|
+
if (!['closed', 'failed'].includes(this.owned(owner, id).info.state))
|
|
507
|
+
this.append(record, { type: 'session.closed' });
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/native/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Tracks detached descendants while their ancestry is still observable. */
|
|
2
|
+
export declare class NativeProcessTree {
|
|
3
|
+
private readonly root;
|
|
4
|
+
private owned;
|
|
5
|
+
private readonly rootIdentity;
|
|
6
|
+
constructor(root: number);
|
|
7
|
+
capture(): void;
|
|
8
|
+
/** Freeze observed owners before the final ancestry scan, preventing new child launches. */
|
|
9
|
+
stop(): void;
|
|
10
|
+
empty(): boolean;
|
|
11
|
+
private stopGroup;
|
|
12
|
+
/** Graceful stop begins with the native root, retaining descendants for final cleanup. */
|
|
13
|
+
terminate(): void;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=process-tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-tree.d.ts","sourceRoot":"","sources":["../../src/native/process-tree.ts"],"names":[],"mappings":"AAuCA,4EAA4E;AAC5E,qBAAa,iBAAiB;IAGhB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,KAAK,CAAsC;IACnD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBACT,IAAI,EAAE,MAAM;IAMzC,OAAO,IAAI,IAAI;IA2Bf,4FAA4F;IAC5F,IAAI,IAAI,IAAI;IAqBZ,KAAK,IAAI,OAAO;IAMhB,OAAO,CAAC,SAAS;IAYjB,0FAA0F;IAC1F,SAAS,IAAI,IAAI;CAKlB"}
|