@farmslot/agent-runtime 0.8.1 → 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 +10 -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 +1 -1
- package/scripts/task-init-cli.mjs +166 -0
- package/scripts/worker-terminal-contract.cjs +15 -3
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { chmodSync, unlinkSync } from 'node:fs';
|
|
2
|
+
import { createServer } from 'node:net';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { authenticated, decodeRequest, object } from './ipc.js';
|
|
5
|
+
import { NativeSessionManager } from './manager.js';
|
|
6
|
+
import { privateDirectory, readJson } from './storage.js';
|
|
7
|
+
// The supervisor must durably register this PID before the host can bind or launch.
|
|
8
|
+
await new Promise((resolve, reject) => {
|
|
9
|
+
process.once('message', (message) => {
|
|
10
|
+
if (message === 'start')
|
|
11
|
+
resolve();
|
|
12
|
+
else
|
|
13
|
+
reject(new Error('Invalid native host startup release'));
|
|
14
|
+
});
|
|
15
|
+
process.once('disconnect', () => reject(new Error('Native supervisor stopped before host registration')));
|
|
16
|
+
});
|
|
17
|
+
const root = process.argv[2];
|
|
18
|
+
const identity = readJson(join(root, 'host.json'));
|
|
19
|
+
const manager = new NativeSessionManager(join(root, 'sessions'), identity.executionNodeId ?? 'local');
|
|
20
|
+
const server = createServer({ allowHalfOpen: true }, (socket) => {
|
|
21
|
+
socket.setEncoding('utf8');
|
|
22
|
+
socket.setTimeout(50_000, () => socket.destroy());
|
|
23
|
+
let input = '';
|
|
24
|
+
socket.on('error', (error) => {
|
|
25
|
+
// Peer loss only ends this RPC. The host and its operation remain authoritative.
|
|
26
|
+
if (!['EPIPE', 'ECONNRESET'].includes(error.code ?? ''))
|
|
27
|
+
throw error;
|
|
28
|
+
});
|
|
29
|
+
socket.on('data', (chunk) => {
|
|
30
|
+
input += chunk;
|
|
31
|
+
if (Buffer.byteLength(input) > 1024 * 1024)
|
|
32
|
+
socket.destroy();
|
|
33
|
+
});
|
|
34
|
+
socket.on('end', () => {
|
|
35
|
+
void (async () => {
|
|
36
|
+
try {
|
|
37
|
+
const envelope = object(JSON.parse(input));
|
|
38
|
+
if (!authenticated(envelope.token, identity.token))
|
|
39
|
+
throw new Error('Native IPC authentication failed');
|
|
40
|
+
const p = decodeRequest(envelope.request);
|
|
41
|
+
let value;
|
|
42
|
+
switch (p.method) {
|
|
43
|
+
case 'create':
|
|
44
|
+
value = await manager.create(p.owner, p.params);
|
|
45
|
+
break;
|
|
46
|
+
case 'ensure':
|
|
47
|
+
value = await manager.ensure(p.owner, p.params);
|
|
48
|
+
break;
|
|
49
|
+
case 'list':
|
|
50
|
+
value = manager.list(p.owner);
|
|
51
|
+
break;
|
|
52
|
+
case 'read':
|
|
53
|
+
value = manager.read(p.owner, p.id, p.after, p.limit);
|
|
54
|
+
break;
|
|
55
|
+
case 'send':
|
|
56
|
+
value = await manager.send(p.owner, p.id, p.commandId, p.text);
|
|
57
|
+
break;
|
|
58
|
+
case 'respond':
|
|
59
|
+
value = await manager.respond(p.owner, p.id, p.requestId, p.response);
|
|
60
|
+
break;
|
|
61
|
+
case 'interrupt':
|
|
62
|
+
value = await manager.interrupt(p.owner, p.id);
|
|
63
|
+
break;
|
|
64
|
+
case 'close':
|
|
65
|
+
value = await manager.close(p.owner, p.id);
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
if (!socket.destroyed)
|
|
69
|
+
socket.end(JSON.stringify({ value: value ?? null }));
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
if (!socket.destroyed)
|
|
73
|
+
socket.end(JSON.stringify({ error: error instanceof Error ? error.message : String(error) }));
|
|
74
|
+
}
|
|
75
|
+
})();
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
privateDirectory(join(identity.socket, '..'));
|
|
79
|
+
try {
|
|
80
|
+
unlinkSync(identity.socket);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
if (error.code !== 'ENOENT')
|
|
84
|
+
throw error;
|
|
85
|
+
}
|
|
86
|
+
server.listen(identity.socket, () => {
|
|
87
|
+
chmodSync(identity.socket, 0o600);
|
|
88
|
+
process.send?.('ready');
|
|
89
|
+
});
|
|
90
|
+
//# sourceMappingURL=host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/native/host.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { NativeSessionClient } from './client.js';
|
|
2
|
+
export { NativeSessionManager, resolveNativeExecutable } from './manager.js';
|
|
3
|
+
export type { NativeAdapter, NativeAdapterOptions, NativeAdapterSession, NativeEventInput, } from './types.js';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/native/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAC7E,YAAY,EACV,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/native/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { NativeSessionCreateParams, NativeSessionEnsureParams, NativeSessionResponse } from '@farmslot/protocol';
|
|
2
|
+
export interface HostIdentity {
|
|
3
|
+
executionNodeId?: string;
|
|
4
|
+
supportsEnsure?: boolean;
|
|
5
|
+
pid: number;
|
|
6
|
+
token: string;
|
|
7
|
+
socket: string;
|
|
8
|
+
}
|
|
9
|
+
export type HostRequest = {
|
|
10
|
+
method: 'create';
|
|
11
|
+
owner: string;
|
|
12
|
+
params: NativeSessionCreateParams;
|
|
13
|
+
} | {
|
|
14
|
+
method: 'ensure';
|
|
15
|
+
owner: string;
|
|
16
|
+
params: NativeSessionEnsureParams;
|
|
17
|
+
} | {
|
|
18
|
+
method: 'list';
|
|
19
|
+
owner: string;
|
|
20
|
+
} | {
|
|
21
|
+
method: 'read';
|
|
22
|
+
owner: string;
|
|
23
|
+
id: string;
|
|
24
|
+
after?: number;
|
|
25
|
+
limit?: number;
|
|
26
|
+
} | {
|
|
27
|
+
method: 'send';
|
|
28
|
+
owner: string;
|
|
29
|
+
id: string;
|
|
30
|
+
commandId: string;
|
|
31
|
+
text: string;
|
|
32
|
+
} | {
|
|
33
|
+
method: 'respond';
|
|
34
|
+
owner: string;
|
|
35
|
+
id: string;
|
|
36
|
+
requestId: string;
|
|
37
|
+
response: NativeSessionResponse;
|
|
38
|
+
} | {
|
|
39
|
+
method: 'interrupt' | 'close';
|
|
40
|
+
owner: string;
|
|
41
|
+
id: string;
|
|
42
|
+
};
|
|
43
|
+
export declare function socketDirectory(root: string): string;
|
|
44
|
+
export declare function authenticated(actual: unknown, expected: string): boolean;
|
|
45
|
+
export declare function object(value: unknown): Record<string, unknown>;
|
|
46
|
+
export declare function decodeRequest(value: unknown): HostRequest;
|
|
47
|
+
/** One attempt only. A lost reply never causes an implicit mutation retry. */
|
|
48
|
+
export declare function requestHost<T>(host: HostIdentity, request: HostRequest): Promise<T>;
|
|
49
|
+
//# sourceMappingURL=ipc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ipc.d.ts","sourceRoot":"","sources":["../../src/native/ipc.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,yBAAyB,EACzB,yBAAyB,EACzB,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,YAAY;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AACD,MAAM,MAAM,WAAW,GACnB;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,yBAAyB,CAAA;CAAE,GACtE;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,yBAAyB,CAAA;CAAE,GACtE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7E;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9E;IACE,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,qBAAqB,CAAC;CACjC,GACD;IAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AACjE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKpD;AACD,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAMxE;AACD,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAI9D;AAKD,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAwDzD;AACD,8EAA8E;AAC9E,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAyBnF"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { createHash, timingSafeEqual } from 'node:crypto';
|
|
2
|
+
import { connect } from 'node:net';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
export function socketDirectory(root) {
|
|
5
|
+
return join('/tmp', `fsn-${process.getuid?.()}-${createHash('sha256').update(root).digest('hex').slice(0, 20)}`);
|
|
6
|
+
}
|
|
7
|
+
export function authenticated(actual, expected) {
|
|
8
|
+
return (typeof actual === 'string' &&
|
|
9
|
+
Buffer.byteLength(actual) === Buffer.byteLength(expected) &&
|
|
10
|
+
timingSafeEqual(Buffer.from(actual), Buffer.from(expected)));
|
|
11
|
+
}
|
|
12
|
+
export function object(value) {
|
|
13
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
14
|
+
throw new Error('Expected IPC object');
|
|
15
|
+
return value;
|
|
16
|
+
}
|
|
17
|
+
function string(p, key) {
|
|
18
|
+
if (typeof p[key] !== 'string' || !p[key].trim())
|
|
19
|
+
throw new Error(`Invalid IPC ${key}`);
|
|
20
|
+
return p[key];
|
|
21
|
+
}
|
|
22
|
+
export function decodeRequest(value) {
|
|
23
|
+
const p = object(value);
|
|
24
|
+
const owner = string(p, 'owner');
|
|
25
|
+
const method = p.method;
|
|
26
|
+
if (method === 'list')
|
|
27
|
+
return { method, owner };
|
|
28
|
+
if (method === 'create' || method === 'ensure') {
|
|
29
|
+
const v = object(p.params);
|
|
30
|
+
const params = {
|
|
31
|
+
runner: string(v, 'runner'),
|
|
32
|
+
cwd: string(v, 'cwd'),
|
|
33
|
+
};
|
|
34
|
+
if (v.model !== undefined)
|
|
35
|
+
params.model = string(v, 'model');
|
|
36
|
+
if (v.mode !== undefined) {
|
|
37
|
+
if (v.mode !== 'default' && v.mode !== 'plan')
|
|
38
|
+
throw new Error('Invalid native mode');
|
|
39
|
+
params.mode = v.mode;
|
|
40
|
+
}
|
|
41
|
+
if (method === 'ensure') {
|
|
42
|
+
if (v.resumeSessionId !== undefined)
|
|
43
|
+
throw new Error('Reserved sessionId is not for resume');
|
|
44
|
+
return { method, owner, params: { ...params, sessionId: string(v, 'sessionId') } };
|
|
45
|
+
}
|
|
46
|
+
if (v.resumeSessionId !== undefined)
|
|
47
|
+
params.resumeSessionId = string(v, 'resumeSessionId');
|
|
48
|
+
return { method, owner, params };
|
|
49
|
+
}
|
|
50
|
+
const id = string(p, 'id');
|
|
51
|
+
if (method === 'read') {
|
|
52
|
+
if ((p.after !== undefined && typeof p.after !== 'number') ||
|
|
53
|
+
(p.limit !== undefined && typeof p.limit !== 'number'))
|
|
54
|
+
throw new Error('Invalid cursor/limit');
|
|
55
|
+
return { method, owner, id, after: p.after, limit: p.limit };
|
|
56
|
+
}
|
|
57
|
+
if (method === 'send')
|
|
58
|
+
return { method, owner, id, commandId: string(p, 'commandId'), text: string(p, 'text') };
|
|
59
|
+
if (method === 'close' || method === 'interrupt')
|
|
60
|
+
return { method, owner, id };
|
|
61
|
+
if (method === 'respond') {
|
|
62
|
+
const v = object(p.response);
|
|
63
|
+
const response = {};
|
|
64
|
+
if (v.decision === 'approve' || v.decision === 'deny')
|
|
65
|
+
response.decision = v.decision;
|
|
66
|
+
if (v.answers !== undefined) {
|
|
67
|
+
const answers = object(v.answers);
|
|
68
|
+
response.answers = {};
|
|
69
|
+
for (const [id, values] of Object.entries(answers)) {
|
|
70
|
+
if (!Array.isArray(values) ||
|
|
71
|
+
!values.every((value) => typeof value === 'string'))
|
|
72
|
+
throw new Error('Invalid native answers');
|
|
73
|
+
response.answers[id] = values;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (Boolean(response.decision) === Boolean(response.answers))
|
|
77
|
+
throw new Error('Supply a decision or answers');
|
|
78
|
+
return { method, owner, id, requestId: string(p, 'requestId'), response };
|
|
79
|
+
}
|
|
80
|
+
throw new Error('Unknown native host method');
|
|
81
|
+
}
|
|
82
|
+
/** One attempt only. A lost reply never causes an implicit mutation retry. */
|
|
83
|
+
export function requestHost(host, request) {
|
|
84
|
+
return new Promise((resolve, reject) => {
|
|
85
|
+
const socket = connect(host.socket);
|
|
86
|
+
let received = '';
|
|
87
|
+
socket.setEncoding('utf8');
|
|
88
|
+
socket.setTimeout(45_000, () => socket.destroy(new Error('Native host reply timed out; mutation outcome is unknown')));
|
|
89
|
+
socket.on('error', reject);
|
|
90
|
+
socket.on('connect', () => socket.end(`${JSON.stringify({ token: host.token, request })}\n`));
|
|
91
|
+
socket.on('data', (chunk) => {
|
|
92
|
+
received += chunk;
|
|
93
|
+
if (Buffer.byteLength(received) > 8 * 1024 * 1024)
|
|
94
|
+
socket.destroy(new Error('Native host reply exceeds limit'));
|
|
95
|
+
});
|
|
96
|
+
socket.on('end', () => {
|
|
97
|
+
try {
|
|
98
|
+
const result = object(JSON.parse(received));
|
|
99
|
+
if (typeof result.error === 'string')
|
|
100
|
+
throw new Error(result.error);
|
|
101
|
+
resolve(result.value);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
reject(error);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=ipc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ipc.js","sourceRoot":"","sources":["../../src/native/ipc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { NativeSessionCreateParams, NativeSessionEnsureParams, NativeSessionEvent, NativeSessionInfo, NativeSessionResponse, NativeSessionSendResult } from '@farmslot/protocol';
|
|
2
|
+
export declare function resolveNativeExecutable(binary: string, cwd: string): Promise<{
|
|
3
|
+
executable: string;
|
|
4
|
+
version: string;
|
|
5
|
+
}>;
|
|
6
|
+
/** Runs only inside the local host. Synchronous fsync orders intent before native input. */
|
|
7
|
+
export declare class NativeSessionManager {
|
|
8
|
+
private readonly root;
|
|
9
|
+
private readonly executionNodeId;
|
|
10
|
+
private sessions;
|
|
11
|
+
private persisted;
|
|
12
|
+
constructor(root: string, executionNodeId?: string);
|
|
13
|
+
private persist;
|
|
14
|
+
create(owner: string, params: NativeSessionCreateParams): Promise<NativeSessionInfo>;
|
|
15
|
+
ensure(owner: string, params: NativeSessionEnsureParams): Promise<NativeSessionInfo>;
|
|
16
|
+
private start;
|
|
17
|
+
private existingCreation;
|
|
18
|
+
private createdSession;
|
|
19
|
+
private append;
|
|
20
|
+
private owned;
|
|
21
|
+
private snapshot;
|
|
22
|
+
list(owner: string): NativeSessionInfo[];
|
|
23
|
+
read(owner: string, id: string, after?: number, limit?: number): {
|
|
24
|
+
session: NativeSessionInfo;
|
|
25
|
+
events: NativeSessionEvent[];
|
|
26
|
+
cursor: number;
|
|
27
|
+
hasMore: boolean;
|
|
28
|
+
commands: {
|
|
29
|
+
generation: string;
|
|
30
|
+
commandId: string;
|
|
31
|
+
state: import("@farmslot/protocol").NativeCommandState;
|
|
32
|
+
submitted: boolean;
|
|
33
|
+
accepted: boolean;
|
|
34
|
+
outcome?: "completed" | "failed" | "interrupted";
|
|
35
|
+
}[];
|
|
36
|
+
pendingRequests: NativeSessionEvent[];
|
|
37
|
+
};
|
|
38
|
+
send(owner: string, id: string, commandId: string, text: string): Promise<NativeSessionSendResult>;
|
|
39
|
+
respond(owner: string, id: string, requestId: string, response: NativeSessionResponse): Promise<void>;
|
|
40
|
+
interrupt(owner: string, id: string): Promise<void>;
|
|
41
|
+
close(owner: string, id: string): Promise<void>;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/native/manager.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAEV,yBAAyB,EACzB,yBAAyB,EACzB,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACxB,MAAM,oBAAoB,CAAC;AAa5B,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA4BlD;AA2CD,4FAA4F;AAC5F,qBAAa,oBAAoB;IAQ7B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,eAAe;IARlC,OAAO,CAAC,QAAQ,CAAoC;IACpD,OAAO,CAAC,SAAS,CAGb;gBAGe,IAAI,EAAE,MAAM,EACZ,eAAe,SAAU;IAoD5C,OAAO,CAAC,OAAO;IAiCf,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI9E,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,iBAAiB,CAAC;YAW5E,KAAK;IAgInB,OAAO,CAAC,gBAAgB;YAmBV,cAAc;IAO5B,OAAO,CAAC,MAAM;IA0Dd,OAAO,CAAC,KAAK;IAMb,OAAO,CAAC,QAAQ;IAYhB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,EAAE;IAKxC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,SAAI,EAAE,KAAK,SAAM;;;;;;;;;;;;;;;IAyBhD,IAAI,CACR,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,uBAAuB,CAAC;IAoD7B,OAAO,CACX,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,qBAAqB,GAC9B,OAAO,CAAC,IAAI,CAAC;IAiBV,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnD,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CActD"}
|