agenttaskflow 0.0.1 → 0.4.2

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.
Files changed (59) hide show
  1. package/README.md +262 -3
  2. package/dist/agent.d.ts +69 -0
  3. package/dist/agent.js +189 -0
  4. package/dist/agent.js.map +1 -0
  5. package/dist/cli.d.ts +2 -0
  6. package/dist/cli.js +54 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/connection.d.ts +37 -0
  9. package/dist/connection.js +313 -0
  10. package/dist/connection.js.map +1 -0
  11. package/dist/errors.d.ts +14 -0
  12. package/dist/errors.js +15 -0
  13. package/dist/errors.js.map +1 -0
  14. package/dist/events.d.ts +24 -0
  15. package/dist/events.js +60 -0
  16. package/dist/events.js.map +1 -0
  17. package/dist/flow.d.ts +10 -0
  18. package/dist/flow.js +32 -0
  19. package/dist/flow.js.map +1 -0
  20. package/dist/index.d.ts +6 -0
  21. package/dist/index.js +6 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/loader.d.ts +1 -0
  24. package/dist/loader.js +41 -0
  25. package/dist/loader.js.map +1 -0
  26. package/dist/runner.d.ts +1 -0
  27. package/dist/runner.js +13 -0
  28. package/dist/runner.js.map +1 -0
  29. package/dist/state.d.ts +17 -0
  30. package/dist/state.js +92 -0
  31. package/dist/state.js.map +1 -0
  32. package/dist/sync.d.ts +31 -0
  33. package/dist/sync.js +151 -0
  34. package/dist/sync.js.map +1 -0
  35. package/dist/transport.d.ts +33 -0
  36. package/dist/transport.js +211 -0
  37. package/dist/transport.js.map +1 -0
  38. package/dist/worker.d.ts +1 -0
  39. package/dist/worker.js +55 -0
  40. package/dist/worker.js.map +1 -0
  41. package/docs/validation.md +27 -0
  42. package/docs/workflow-authoring.md +80 -0
  43. package/examples/common.ts +9 -0
  44. package/examples/multi-fields.ts +45 -0
  45. package/examples/review.ts +24 -0
  46. package/examples/simple.ts +16 -0
  47. package/examples/smoke.ts +41 -0
  48. package/package.json +19 -6
  49. package/test/README.md +37 -0
  50. package/test/RESULTS.md +27 -0
  51. package/test/branches.ts +23 -0
  52. package/test/context.ts +18 -0
  53. package/test/correction.ts +20 -0
  54. package/test/loop.ts +30 -0
  55. package/test/modules.ts +12 -0
  56. package/test/multi-fields.ts +22 -0
  57. package/test/run.ts +55 -0
  58. package/test/shared.ts +15 -0
  59. package/index.js +0 -1
package/dist/state.js ADDED
@@ -0,0 +1,92 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { mkdirSync, readFileSync, writeFileSync, renameSync, existsSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import lockfile from 'proper-lockfile';
5
+ import { StateError } from './errors.js';
6
+ function canonical(value) {
7
+ if (Array.isArray(value))
8
+ return value.map(canonical);
9
+ if (value && typeof value === 'object') {
10
+ return Object.fromEntries(Object.entries(value).sort(([a], [b]) => a.localeCompare(b))
11
+ .map(([key, val]) => [key, canonical(val)]));
12
+ }
13
+ return value;
14
+ }
15
+ export const fingerprint = (value) => createHash('sha256')
16
+ .update(JSON.stringify(canonical(value))).digest('hex');
17
+ export function writeJson(file, value) {
18
+ const temp = `${file}.${randomUUID()}.tmp`;
19
+ writeFileSync(temp, JSON.stringify(value, null, 2) + '\n', { mode: 0o600 });
20
+ renameSync(temp, file);
21
+ }
22
+ export class State {
23
+ directory;
24
+ file;
25
+ snapshot;
26
+ unlock;
27
+ compromised;
28
+ constructor(directory, runId, configuration) {
29
+ this.directory = join(directory, runId);
30
+ mkdirSync(this.directory, { recursive: true, mode: 0o700 });
31
+ this.file = join(this.directory, 'state.json');
32
+ try {
33
+ this.unlock = lockfile.lockSync(this.directory, {
34
+ stale: 30_000, update: 10_000, retries: 0,
35
+ onCompromised: error => { this.compromised = error; },
36
+ });
37
+ }
38
+ catch (error) {
39
+ throw new StateError(`Run ${runId} is already locked or cannot be opened: ${String(error)}`);
40
+ }
41
+ try {
42
+ const config = fingerprint(configuration);
43
+ this.snapshot = existsSync(this.file) ? JSON.parse(readFileSync(this.file, 'utf8')) :
44
+ { version: 1, config, checkpoints: {} };
45
+ if (this.snapshot.version !== 1 || this.snapshot.config !== config) {
46
+ throw new StateError('Run configuration/version changed; use a new runId');
47
+ }
48
+ this.persist();
49
+ }
50
+ catch (error) {
51
+ this.unlock();
52
+ throw error;
53
+ }
54
+ }
55
+ assertOwned() {
56
+ if (this.compromised)
57
+ throw new StateError(`Run lock lost: ${this.compromised.message}`);
58
+ }
59
+ persist() { this.assertOwned(); writeJson(this.file, this.snapshot); }
60
+ get sessionId() { return this.snapshot.sessionId; }
61
+ bind(sessionId) {
62
+ this.assertOwned();
63
+ if (this.snapshot.sessionId && this.snapshot.sessionId !== sessionId) {
64
+ throw new ProtocolStateError('Host changed the session ID');
65
+ }
66
+ if (this.snapshot.sessionId !== sessionId) {
67
+ this.snapshot.sessionId = sessionId;
68
+ this.persist();
69
+ }
70
+ }
71
+ saveCheckpoint(key, value, input) {
72
+ // Store serialized copies, so callers cannot mutate persisted state indirectly.
73
+ const copy = JSON.parse(JSON.stringify(value));
74
+ Object.defineProperty(this.snapshot.checkpoints, key, {
75
+ value: { input: fingerprint(input), value: copy }, enumerable: true, writable: true, configurable: true,
76
+ });
77
+ this.persist();
78
+ }
79
+ loadCheckpoint(key, input) {
80
+ this.assertOwned();
81
+ if (!Object.hasOwn(this.snapshot.checkpoints, key))
82
+ return undefined;
83
+ const saved = this.snapshot.checkpoints[key];
84
+ if (saved.input !== fingerprint(input))
85
+ throw new StateError(`Checkpoint ${key} inputs changed`);
86
+ return JSON.parse(JSON.stringify(saved.value));
87
+ }
88
+ close() { this.unlock(); }
89
+ }
90
+ class ProtocolStateError extends StateError {
91
+ }
92
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
package/dist/sync.d.ts ADDED
@@ -0,0 +1,31 @@
1
+ import { z } from 'zod';
2
+ import type { AgentOptions, RunOptions } from './agent.js';
3
+ export type SyncAgentOptions = Omit<AgentOptions, 'signal'>;
4
+ export type SyncRunOptions<S extends z.ZodType = z.ZodType> = Omit<RunOptions<S>, 'signal'>;
5
+ /** Blocking workflow API. A worker thread keeps agent I/O and timeouts running. */
6
+ export declare class Agent {
7
+ private options;
8
+ private worker;
9
+ private port;
10
+ private wake;
11
+ private sequence;
12
+ private closed;
13
+ private busy;
14
+ private display;
15
+ runId: string;
16
+ sessionId?: string;
17
+ pid?: number;
18
+ constructor(options?: SyncAgentOptions);
19
+ run<S extends z.ZodType>(prompt: string, options: SyncRunOptions<S> & {
20
+ schema: S;
21
+ }): z.output<S>;
22
+ run(prompt: string, options?: SyncRunOptions & {
23
+ schema?: undefined;
24
+ }): string;
25
+ saveCheckpoint(key: string, value: unknown, input: unknown): void;
26
+ loadCheckpoint<T = unknown>(key: string, input: unknown): T | undefined;
27
+ close(): void;
28
+ [Symbol.dispose](): void;
29
+ private request;
30
+ }
31
+ export declare function withAgent<T>(options: SyncAgentOptions, workflow: (agent: Agent) => T): T;
package/dist/sync.js ADDED
@@ -0,0 +1,151 @@
1
+ import { MessageChannel, receiveMessageOnPort, Worker } from 'node:worker_threads';
2
+ import { z } from 'zod';
3
+ import { Console } from './events.js';
4
+ import * as errors from './errors.js';
5
+ /** Blocking workflow API. A worker thread keeps agent I/O and timeouts running. */
6
+ export class Agent {
7
+ options;
8
+ worker;
9
+ port;
10
+ wake = new Int32Array(new SharedArrayBuffer(4));
11
+ sequence = 0;
12
+ closed = false;
13
+ busy = false;
14
+ display;
15
+ runId = '';
16
+ sessionId;
17
+ pid;
18
+ constructor(options = {}) {
19
+ this.options = options;
20
+ const { display, onEvent, ...serializable } = options;
21
+ this.display = display === false ? false : typeof display === 'function' ? display : (display ?? new Console()).emit;
22
+ const { port1, port2 } = new MessageChannel();
23
+ this.port = port1;
24
+ // File-based workers cannot inherit the parent's eval/stdin-only switches.
25
+ // Preserve other runtime flags (including any Node permission configuration).
26
+ const execArgv = [];
27
+ for (let i = 0; i < process.execArgv.length; i++) {
28
+ const arg = process.execArgv[i];
29
+ if (['--input-type', '--eval', '-e', '--print', '-p'].includes(arg)) {
30
+ i++;
31
+ continue;
32
+ }
33
+ if (/^--(?:input-type|eval|print)=/.test(arg))
34
+ continue;
35
+ execArgv.push(arg);
36
+ }
37
+ this.worker = new Worker(new URL('./worker.js', import.meta.url), {
38
+ workerData: { port: port2, wake: this.wake.buffer }, transferList: [port2], execArgv,
39
+ });
40
+ this.worker.on('error', () => { }); // Synchronous waits have a bounded deadline for boot failures.
41
+ try {
42
+ this.request('init', serializable, undefined, 30_000);
43
+ }
44
+ catch (error) {
45
+ this.port.close();
46
+ void this.worker.terminate();
47
+ this.closed = true;
48
+ throw error;
49
+ }
50
+ }
51
+ run(prompt, options = {}) {
52
+ if (typeof prompt !== 'string' || !prompt.trim())
53
+ throw new TypeError('prompt must be nonempty text');
54
+ return this.request('run', { prompt, name: options.name,
55
+ jsonSchema: options.schema ? z.toJSONSchema(options.schema) : undefined }, options.schema);
56
+ }
57
+ saveCheckpoint(key, value, input) {
58
+ this.request('saveCheckpoint', { key, value, input });
59
+ }
60
+ loadCheckpoint(key, input) {
61
+ return this.request('loadCheckpoint', { key, input });
62
+ }
63
+ close() {
64
+ if (this.closed)
65
+ return;
66
+ try {
67
+ this.request('close', {}, undefined, 10_000);
68
+ }
69
+ finally {
70
+ this.closed = true;
71
+ this.port.close();
72
+ void this.worker.terminate();
73
+ }
74
+ }
75
+ [Symbol.dispose]() { this.close(); }
76
+ request(method, args, schema, timeoutMs) {
77
+ if (this.closed)
78
+ throw new errors.StateError('Agent is closed');
79
+ if (this.busy)
80
+ throw new errors.StateError('Do not call Agent methods from its synchronous event callback');
81
+ this.busy = true;
82
+ const id = ++this.sequence;
83
+ const deadline = Date.now() + (timeoutMs ?? (this.options.timeoutMs ?? 3_600_000) + 15_000);
84
+ let callbackError;
85
+ try {
86
+ this.port.postMessage({ id, method, args });
87
+ for (;;) {
88
+ const version = Atomics.load(this.wake, 0);
89
+ const received = receiveMessageOnPort(this.port);
90
+ if (!received) {
91
+ if (Date.now() >= deadline)
92
+ throw new errors.AgentTimeoutError('Agent worker did not respond; close this Agent');
93
+ Atomics.wait(this.wake, 0, version, Math.min(1000, deadline - Date.now()));
94
+ continue;
95
+ }
96
+ const message = received.message;
97
+ if (message.type === 'event') {
98
+ if (message.event.kind === 'process_started')
99
+ this.pid = message.event.data.pid;
100
+ if (message.event.kind === 'session_started')
101
+ this.sessionId = message.event.text;
102
+ // Drain the current operation even if a presentation callback throws.
103
+ try {
104
+ if (this.display)
105
+ this.display(message.event);
106
+ this.options.onEvent?.(message.event);
107
+ }
108
+ catch (error) {
109
+ callbackError ??= error;
110
+ }
111
+ }
112
+ else if (message.type === 'validate') {
113
+ let value;
114
+ try {
115
+ const result = schema.safeParse(message.data);
116
+ value = result.success ? { success: true, data: result.data } : { success: false, issues: result.error.issues };
117
+ }
118
+ catch (error) {
119
+ value = { success: false, issues: String(error) };
120
+ }
121
+ this.port.postMessage({ type: 'validation_result', id: message.id, value });
122
+ }
123
+ else if (message.type === 'result' && message.id === id) {
124
+ this.pid = message.pid;
125
+ this.sessionId = message.sessionId;
126
+ this.runId = message.runId;
127
+ if (callbackError)
128
+ throw callbackError;
129
+ if (message.error) {
130
+ const ErrorType = errors[message.error.name] ?? errors.AgentTaskFlowError;
131
+ throw new ErrorType(message.error.message);
132
+ }
133
+ return message.value;
134
+ }
135
+ }
136
+ }
137
+ finally {
138
+ this.busy = false;
139
+ }
140
+ }
141
+ }
142
+ export function withAgent(options, workflow) {
143
+ const agent = new Agent(options);
144
+ try {
145
+ return workflow(agent);
146
+ }
147
+ finally {
148
+ agent.close();
149
+ }
150
+ }
151
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { type ChildProcessWithoutNullStreams } from 'node:child_process';
2
+ export type Wire = Record<string, any>;
3
+ export type Frame = {
4
+ kind: 'raw';
5
+ value: Wire;
6
+ } | {
7
+ kind: 'stderr';
8
+ value: string;
9
+ };
10
+ /** One child for the lifetime of the connection; bounded stdout/stderr queue. */
11
+ export declare class Transport {
12
+ child?: ChildProcessWithoutNullStreams;
13
+ lastActivity: number;
14
+ private frames;
15
+ private waiter?;
16
+ private failure?;
17
+ private closing;
18
+ private closed;
19
+ private closePromise?;
20
+ private exited?;
21
+ private tail;
22
+ private guardian?;
23
+ get pid(): number | undefined;
24
+ start(argv: string[], cwd: string, env: NodeJS.ProcessEnv): Promise<void>;
25
+ private line;
26
+ private put;
27
+ fail(error: Error): void;
28
+ assertAlive(): void;
29
+ read(): Promise<Frame>;
30
+ send(message: Wire): Promise<void>;
31
+ close(): Promise<void>;
32
+ private shutdown;
33
+ }
@@ -0,0 +1,211 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { AgentProcessError, ProtocolError, StateError } from './errors.js';
3
+ const MAX_LINE = 16 * 1024 * 1024;
4
+ const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
5
+ /** One child for the lifetime of the connection; bounded stdout/stderr queue. */
6
+ export class Transport {
7
+ child;
8
+ lastActivity = Date.now();
9
+ frames = [];
10
+ waiter;
11
+ failure;
12
+ closing = false;
13
+ closed = false;
14
+ closePromise;
15
+ exited;
16
+ tail = '';
17
+ guardian;
18
+ get pid() { return this.child?.pid; }
19
+ async start(argv, cwd, env) {
20
+ if (this.child || this.closed) {
21
+ this.assertAlive();
22
+ return;
23
+ }
24
+ const child = this.child = spawn(argv[0], argv.slice(1), {
25
+ cwd, env, detached: process.platform !== 'win32', stdio: ['pipe', 'pipe', 'pipe'],
26
+ });
27
+ this.exited = new Promise(resolve => child.once('close', () => resolve()));
28
+ child.once('error', error => this.fail(new AgentProcessError(`Could not start ${argv[0]}: ${error.message}`)));
29
+ child.once('exit', (code, signal) => {
30
+ if (!this.closing)
31
+ this.fail(new AgentProcessError(`Persistent CLI exited (code=${code}, signal=${signal}); no automatic restart\n${this.tail}`));
32
+ });
33
+ let buffer = '';
34
+ child.stdout.setEncoding('utf8');
35
+ child.stderr.setEncoding('utf8');
36
+ child.stdout.on('data', (chunk) => {
37
+ this.lastActivity = Date.now();
38
+ if (this.closing || this.failure)
39
+ return;
40
+ buffer += chunk;
41
+ try {
42
+ let index;
43
+ while ((index = buffer.indexOf('\n')) >= 0) {
44
+ const line = buffer.slice(0, index);
45
+ buffer = buffer.slice(index + 1);
46
+ this.line(line);
47
+ }
48
+ if (Buffer.byteLength(buffer) > MAX_LINE)
49
+ throw new ProtocolError('Host event exceeds 16 MiB');
50
+ }
51
+ catch (error) {
52
+ this.fail(error instanceof Error ? error : new ProtocolError(String(error)));
53
+ }
54
+ });
55
+ child.stdout.once('end', () => {
56
+ if (this.closing)
57
+ return;
58
+ try {
59
+ if (buffer.trim())
60
+ this.line(buffer);
61
+ }
62
+ catch (error) {
63
+ this.fail(error);
64
+ }
65
+ this.fail(new AgentProcessError('Persistent CLI closed stdout; no automatic restart'));
66
+ });
67
+ child.stderr.on('data', (text) => {
68
+ this.lastActivity = Date.now();
69
+ this.tail = (this.tail + text).slice(-8192);
70
+ this.put({ kind: 'stderr', value: text });
71
+ });
72
+ // EPIPE is reported through send/connection failure, never an unhandled event.
73
+ child.stdin.on('error', error => { if (!this.closing)
74
+ this.fail(new AgentProcessError(error.message)); });
75
+ await new Promise((resolve, reject) => {
76
+ child.once('spawn', resolve);
77
+ child.once('error', reject);
78
+ });
79
+ if (process.platform !== 'win32' && child.pid) {
80
+ // A tiny independent watcher cleans up the detached agent group if the
81
+ // workflow process/worker dies (including Ctrl+C during a synchronous wait).
82
+ const script = `IFS= read -r target || exit 0
83
+ case "$target" in ''|*[!0-9]*) exit 1;; esac
84
+ cleanup() {
85
+ kill -TERM -- "-$target" 2>/dev/null
86
+ sleep 0.2
87
+ kill -KILL -- "-$target" 2>/dev/null
88
+ exit 0
89
+ }
90
+ trap cleanup INT TERM HUP
91
+ IFS= read -r finished
92
+ [ "$finished" = done ] && exit 0
93
+ cleanup`;
94
+ // Stay in the workflow's foreground group so terminal Ctrl+C reaches the
95
+ // watcher even while the main JS thread is inside Atomics.wait().
96
+ this.guardian = spawn('/bin/sh', ['-c', script], { detached: false, stdio: ['pipe', 'ignore', 'ignore'] });
97
+ this.guardian.on('error', error => this.fail(new AgentProcessError(`Lifecycle watcher failed: ${error.message}`)));
98
+ this.guardian.stdin.on('error', () => { });
99
+ this.guardian.stdin.write(`${child.pid}\n`);
100
+ }
101
+ }
102
+ line(line) {
103
+ if (!line.trim())
104
+ return;
105
+ if (Buffer.byteLength(line) > MAX_LINE)
106
+ throw new ProtocolError('Host event exceeds 16 MiB');
107
+ let value;
108
+ try {
109
+ value = JSON.parse(line);
110
+ }
111
+ catch {
112
+ throw new ProtocolError('CLI stdout must contain JSONL; check command/provider configuration');
113
+ }
114
+ if (!value || typeof value !== 'object' || Array.isArray(value))
115
+ throw new ProtocolError('Host event must be an object');
116
+ this.put({ kind: 'raw', value: value });
117
+ }
118
+ put(frame) {
119
+ if (this.closing || this.failure)
120
+ return;
121
+ if (this.waiter) {
122
+ const waiter = this.waiter;
123
+ this.waiter = undefined;
124
+ waiter.resolve(frame);
125
+ }
126
+ else
127
+ this.frames.push(frame);
128
+ if (this.frames.length >= 1024) {
129
+ this.child?.stdout.pause();
130
+ this.child?.stderr.pause();
131
+ }
132
+ // A single chunk can contain many tiny frames; reject a protocol flood rather than grow without bound.
133
+ if (this.frames.length > 8192)
134
+ this.fail(new ProtocolError('Host event queue overflow'));
135
+ }
136
+ fail(error) {
137
+ this.failure ??= error;
138
+ if (this.waiter) {
139
+ this.waiter.reject(this.failure);
140
+ this.waiter = undefined;
141
+ }
142
+ }
143
+ assertAlive() {
144
+ if (this.failure)
145
+ throw this.failure;
146
+ if (this.closing || this.closed)
147
+ throw new StateError('Persistent connection closed; create a new Agent explicitly');
148
+ if (this.child && (this.child.exitCode !== null || this.child.signalCode !== null)) {
149
+ throw new AgentProcessError('Persistent CLI exited; no automatic restart');
150
+ }
151
+ }
152
+ async read() {
153
+ this.assertAlive();
154
+ const frame = this.frames.shift();
155
+ if (this.frames.length < 512) {
156
+ this.child?.stdout.resume();
157
+ this.child?.stderr.resume();
158
+ }
159
+ if (frame)
160
+ return frame;
161
+ if (this.waiter)
162
+ throw new StateError('Only one reader may consume a connection');
163
+ return new Promise((resolve, reject) => { this.waiter = { resolve, reject }; });
164
+ }
165
+ async send(message) {
166
+ this.assertAlive();
167
+ if (!this.child)
168
+ throw new StateError('Connection not started');
169
+ await new Promise((resolve, reject) => this.child.stdin.write(JSON.stringify(message) + '\n', error => {
170
+ if (error)
171
+ reject(new AgentProcessError(`Host input pipe failed: ${error.message}`));
172
+ else
173
+ resolve();
174
+ }));
175
+ }
176
+ close() { return this.closePromise ??= this.shutdown(); }
177
+ async shutdown() {
178
+ this.closing = true;
179
+ this.fail(new StateError('Connection closed'));
180
+ this.frames.length = 0;
181
+ const child = this.child;
182
+ if (child) {
183
+ child.stdout.resume();
184
+ child.stderr.resume();
185
+ child.stdin.end();
186
+ await Promise.race([this.exited, sleep(500)]);
187
+ const kill = (signal) => {
188
+ try {
189
+ if (process.platform !== 'win32' && child.pid)
190
+ process.kill(-child.pid, signal);
191
+ else
192
+ child.kill(signal);
193
+ }
194
+ catch (error) {
195
+ if (error.code !== 'ESRCH')
196
+ throw error;
197
+ }
198
+ };
199
+ kill('SIGTERM');
200
+ await sleep(100);
201
+ kill('SIGKILL');
202
+ await Promise.race([this.exited, sleep(1000)]);
203
+ child.stdout.destroy();
204
+ child.stderr.destroy();
205
+ child.stdin.destroy();
206
+ }
207
+ this.guardian?.stdin?.end('done\n');
208
+ this.closed = true;
209
+ }
210
+ }
211
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
package/dist/worker.js ADDED
@@ -0,0 +1,55 @@
1
+ import { workerData } from 'node:worker_threads';
2
+ import { Agent } from './agent.js';
3
+ const port = workerData.port;
4
+ const wake = new Int32Array(workerData.wake);
5
+ let agent;
6
+ let validationCounter = 0;
7
+ const validations = new Map();
8
+ function post(message) {
9
+ port.postMessage(message);
10
+ Atomics.add(wake, 0, 1);
11
+ Atomics.notify(wake, 0);
12
+ }
13
+ port.on('message', async (message) => {
14
+ if (message.type === 'validation_result') {
15
+ validations.get(message.id)?.(message.value);
16
+ validations.delete(message.id);
17
+ return;
18
+ }
19
+ const { id, method, args } = message;
20
+ try {
21
+ let value;
22
+ if (method === 'init') {
23
+ agent = new Agent({ ...args, display: false, onEvent: event => post({ type: 'event', event }) });
24
+ }
25
+ else if (!agent)
26
+ throw new Error('Worker agent has not initialized');
27
+ else if (method === 'run') {
28
+ value = args.jsonSchema
29
+ ? await agent.runValidated(args.prompt, { name: args.name }, {
30
+ jsonSchema: args.jsonSchema,
31
+ validate: data => new Promise(resolve => {
32
+ const validationId = ++validationCounter;
33
+ validations.set(validationId, resolve);
34
+ post({ type: 'validate', id: validationId, data });
35
+ }),
36
+ })
37
+ : await agent.run(args.prompt, { name: args.name });
38
+ }
39
+ else if (method === 'saveCheckpoint')
40
+ agent.saveCheckpoint(args.key, args.value, args.input);
41
+ else if (method === 'loadCheckpoint')
42
+ value = agent.loadCheckpoint(args.key, args.input);
43
+ else if (method === 'close')
44
+ await agent.close();
45
+ else
46
+ throw new Error(`Unknown worker operation: ${method}`);
47
+ post({ type: 'result', id, value, pid: agent?.pid, sessionId: agent?.sessionId, runId: agent?.runId });
48
+ }
49
+ catch (error) {
50
+ post({ type: 'result', id, error: { name: error instanceof Error ? error.constructor.name : 'Error', message: String(error) },
51
+ pid: agent?.pid, sessionId: agent?.sessionId, runId: agent?.runId });
52
+ }
53
+ });
54
+ post({ type: 'ready' });
55
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ # TypeScript 版验证记录
2
+
3
+ 验证日期:2026-09-26,macOS arm64,Node.js 22.19.0。
4
+
5
+ - TypeScript 构建及源码、示例、测试类型检查通过。
6
+ - 命令行回归测试 38 项全部通过。协议测试使用独立假 CLI,覆盖 Codex/Claude 常驻进程、多轮上下文、格式补答、失败不重放、超时、流式输出、恢复、运行锁和进程清理。
7
+ - 简洁 `flow` API 验证了普通 for/if、check、choose、自动步骤名称;五次提示词共用一个进程。
8
+ - 默认同步 API 的真实 Codex smoke 通过:命令 cxh,记忆标记加两轮回忆,共三步,PID 始终为 16517。运行 ID:a892f8a1-954a-4694-bfdf-efab260e58f8。
9
+ - 默认同步 API 的真实 Claude Code smoke 通过:记忆标记加两轮回忆,共三步,PID 始终为 15684。运行 ID:d591ad33-3424-4ad3-b0eb-84f70b216f4c。
10
+
11
+ 真实 smoke 验证的是同步执行基础层;简洁 flow 包装层的分支使用假 CLI 验证。上述测试不证明模型能够可靠完成任意业务流程,也不保证无限上下文。Windows 未验证。
12
+
13
+ 复现自动检查:
14
+
15
+ ```bash
16
+ nvm use
17
+ npm run build
18
+ npm run check
19
+ npm test
20
+ ```
21
+
22
+ 真实 CLI 测试需要已配置的命令及模型访问:
23
+
24
+ ```bash
25
+ npm run smoke -- --provider codex --command cxh --rounds 2
26
+ npm run smoke -- --provider claude --command claude --rounds 2
27
+ ```