agent-relay 0.1.0 → 1.0.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/README.md +56 -730
- package/dist/cli/index.d.ts +6 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +109 -1521
- package/dist/cli/index.js.map +1 -1
- package/dist/daemon/server.d.ts +8 -1
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +23 -7
- package/dist/daemon/server.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/storage/adapter.d.ts +43 -0
- package/dist/storage/adapter.d.ts.map +1 -1
- package/dist/storage/adapter.js +105 -1
- package/dist/storage/adapter.js.map +1 -1
- package/dist/storage/sqlite-adapter.d.ts +1 -0
- package/dist/storage/sqlite-adapter.d.ts.map +1 -1
- package/dist/storage/sqlite-adapter.js +26 -0
- package/dist/storage/sqlite-adapter.js.map +1 -1
- package/dist/utils/project-namespace.d.ts +46 -0
- package/dist/utils/project-namespace.d.ts.map +1 -0
- package/dist/utils/project-namespace.js +111 -0
- package/dist/utils/project-namespace.js.map +1 -0
- package/dist/wrapper/client.d.ts +1 -1
- package/dist/wrapper/client.d.ts.map +1 -1
- package/dist/wrapper/client.js +1 -1
- package/dist/wrapper/client.js.map +1 -1
- package/dist/wrapper/index.d.ts +0 -1
- package/dist/wrapper/index.d.ts.map +1 -1
- package/dist/wrapper/index.js +2 -3
- package/dist/wrapper/index.js.map +1 -1
- package/dist/wrapper/tmux-wrapper.d.ts +5 -0
- package/dist/wrapper/tmux-wrapper.d.ts.map +1 -1
- package/dist/wrapper/tmux-wrapper.js +94 -19
- package/dist/wrapper/tmux-wrapper.js.map +1 -1
- package/docs/AGENTS.md +386 -0
- package/docs/CLI-SIMPLIFICATION-COMPLETE.md +48 -0
- package/docs/CONTRIBUTING.md +151 -0
- package/docs/TMUX_IMPLEMENTATION_NOTES.md +364 -0
- package/docs/removable-code-analysis.md +24 -0
- package/install.sh +10 -2
- package/package.json +3 -4
- package/dist/games/index.d.ts +0 -2
- package/dist/games/index.d.ts.map +0 -1
- package/dist/games/index.js +0 -2
- package/dist/games/index.js.map +0 -1
- package/dist/games/tictactoe.d.ts +0 -24
- package/dist/games/tictactoe.d.ts.map +0 -1
- package/dist/games/tictactoe.js +0 -160
- package/dist/games/tictactoe.js.map +0 -1
- package/dist/supervisor/inbox.d.ts +0 -38
- package/dist/supervisor/inbox.d.ts.map +0 -1
- package/dist/supervisor/inbox.js +0 -162
- package/dist/supervisor/inbox.js.map +0 -1
- package/dist/supervisor/index.d.ts +0 -10
- package/dist/supervisor/index.d.ts.map +0 -1
- package/dist/supervisor/index.js +0 -10
- package/dist/supervisor/index.js.map +0 -1
- package/dist/supervisor/spawner.d.ts +0 -54
- package/dist/supervisor/spawner.d.ts.map +0 -1
- package/dist/supervisor/spawner.js +0 -282
- package/dist/supervisor/spawner.js.map +0 -1
- package/dist/supervisor/state.d.ts +0 -132
- package/dist/supervisor/state.d.ts.map +0 -1
- package/dist/supervisor/state.js +0 -465
- package/dist/supervisor/state.js.map +0 -1
- package/dist/supervisor/supervisor.d.ts +0 -67
- package/dist/supervisor/supervisor.d.ts.map +0 -1
- package/dist/supervisor/supervisor.js +0 -263
- package/dist/supervisor/supervisor.js.map +0 -1
- package/dist/supervisor/types.d.ts +0 -139
- package/dist/supervisor/types.d.ts.map +0 -1
- package/dist/supervisor/types.js +0 -12
- package/dist/supervisor/types.js.map +0 -1
- package/dist/webhook/spawner.d.ts +0 -79
- package/dist/webhook/spawner.d.ts.map +0 -1
- package/dist/webhook/spawner.js +0 -288
- package/dist/webhook/spawner.js.map +0 -1
- package/dist/wrapper/pty-wrapper.d.ts +0 -125
- package/dist/wrapper/pty-wrapper.d.ts.map +0 -1
- package/dist/wrapper/pty-wrapper.js +0 -494
- package/dist/wrapper/pty-wrapper.js.map +0 -1
- /package/{CHANGELOG.md → docs/CHANGELOG.md} +0 -0
- /package/{PROTOCOL.md → docs/PROTOCOL.md} +0 -0
package/dist/supervisor/inbox.js
DELETED
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Supervisor Inbox Utilities
|
|
3
|
-
*
|
|
4
|
-
* Provides an atomic "claim" for an agent inbox file to avoid losing messages
|
|
5
|
-
* that arrive while the supervisor is processing.
|
|
6
|
-
*/
|
|
7
|
-
import fs from 'node:fs';
|
|
8
|
-
import path from 'node:path';
|
|
9
|
-
// Supported inbox formats:
|
|
10
|
-
// 1) New canonical:
|
|
11
|
-
// ## Message from <sender> | <iso>
|
|
12
|
-
// <body>
|
|
13
|
-
//
|
|
14
|
-
// 2) Legacy (from early inbox-write):
|
|
15
|
-
// ## Message from <sender>
|
|
16
|
-
// **Time:** <iso>
|
|
17
|
-
// <body>
|
|
18
|
-
const MESSAGE_HEADER_V1 = /^## Message from (.+?) \| (.+?)$/gm;
|
|
19
|
-
const MESSAGE_HEADER_LEGACY = /^## Message from (.+?)$/gm;
|
|
20
|
-
const LEGACY_TIME_LINE = /^\*\*Time:\*\*\s*(.+?)\s*$/m;
|
|
21
|
-
/**
|
|
22
|
-
* Parse inbox markdown into structured messages.
|
|
23
|
-
*
|
|
24
|
-
* Expected format (repeated blocks):
|
|
25
|
-
* ## Message from <sender> | <timestamp>
|
|
26
|
-
* <body>
|
|
27
|
-
*/
|
|
28
|
-
export function parseInboxMarkdown(content) {
|
|
29
|
-
const matches = [];
|
|
30
|
-
let m;
|
|
31
|
-
// eslint-disable-next-line no-cond-assign
|
|
32
|
-
while ((m = MESSAGE_HEADER_V1.exec(content)) !== null) {
|
|
33
|
-
matches.push({
|
|
34
|
-
index: m.index,
|
|
35
|
-
from: (m[1] ?? '').trim(),
|
|
36
|
-
timestamp: (m[2] ?? '').trim(),
|
|
37
|
-
headerLen: m[0].length,
|
|
38
|
-
isLegacy: false,
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
// If no canonical headers, try legacy headers.
|
|
42
|
-
if (matches.length === 0) {
|
|
43
|
-
// eslint-disable-next-line no-cond-assign
|
|
44
|
-
while ((m = MESSAGE_HEADER_LEGACY.exec(content)) !== null) {
|
|
45
|
-
matches.push({
|
|
46
|
-
index: m.index,
|
|
47
|
-
from: (m[1] ?? '').trim(),
|
|
48
|
-
timestamp: '',
|
|
49
|
-
headerLen: m[0].length,
|
|
50
|
-
isLegacy: true,
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
if (matches.length === 0)
|
|
55
|
-
return [];
|
|
56
|
-
const messages = [];
|
|
57
|
-
for (let i = 0; i < matches.length; i++) {
|
|
58
|
-
const cur = matches[i];
|
|
59
|
-
const next = matches[i + 1];
|
|
60
|
-
const bodyStart = cur.index + cur.headerLen;
|
|
61
|
-
const bodyEnd = next ? next.index : content.length;
|
|
62
|
-
let bodyChunk = content.substring(bodyStart, bodyEnd).replace(/^\s*\n/, '');
|
|
63
|
-
let timestamp = cur.timestamp;
|
|
64
|
-
if (cur.isLegacy) {
|
|
65
|
-
const t = bodyChunk.match(LEGACY_TIME_LINE);
|
|
66
|
-
if (t?.[1]) {
|
|
67
|
-
timestamp = t[1].trim();
|
|
68
|
-
// Remove the time line from the body
|
|
69
|
-
bodyChunk = bodyChunk.replace(LEGACY_TIME_LINE, '').replace(/^\s*\n/, '');
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
const body = bodyChunk.trim();
|
|
73
|
-
if (!cur.from)
|
|
74
|
-
continue;
|
|
75
|
-
if (!timestamp)
|
|
76
|
-
timestamp = new Date().toISOString();
|
|
77
|
-
if (!body)
|
|
78
|
-
continue;
|
|
79
|
-
messages.push({ from: cur.from, timestamp, body });
|
|
80
|
-
}
|
|
81
|
-
return messages;
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Atomically claim an inbox by renaming it to a processing file.
|
|
85
|
-
* New incoming messages will be written to a new inbox.md.
|
|
86
|
-
*/
|
|
87
|
-
export function claimInbox(inboxPath) {
|
|
88
|
-
if (!fs.existsSync(inboxPath))
|
|
89
|
-
return null;
|
|
90
|
-
const dir = path.dirname(inboxPath);
|
|
91
|
-
const processingPath = path.join(dir, 'inbox.processing.md');
|
|
92
|
-
try {
|
|
93
|
-
fs.renameSync(inboxPath, processingPath);
|
|
94
|
-
}
|
|
95
|
-
catch (err) {
|
|
96
|
-
const code = err.code;
|
|
97
|
-
// If someone else claimed it or it disappeared, treat as no work.
|
|
98
|
-
if (code === 'ENOENT' || code === 'EACCES' || code === 'EBUSY') {
|
|
99
|
-
return null;
|
|
100
|
-
}
|
|
101
|
-
throw err;
|
|
102
|
-
}
|
|
103
|
-
let content = '';
|
|
104
|
-
try {
|
|
105
|
-
content = fs.readFileSync(processingPath, 'utf-8');
|
|
106
|
-
}
|
|
107
|
-
catch {
|
|
108
|
-
content = '';
|
|
109
|
-
}
|
|
110
|
-
return { inboxPath, processingPath, content };
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Finalize a claimed inbox.
|
|
114
|
-
*
|
|
115
|
-
* - On success: delete processing file.
|
|
116
|
-
* - On failure: re-queue the claimed content back into inbox.md without
|
|
117
|
-
* overwriting any messages that arrived while processing.
|
|
118
|
-
*/
|
|
119
|
-
export function finalizeClaim(claim, success) {
|
|
120
|
-
if (success) {
|
|
121
|
-
try {
|
|
122
|
-
if (fs.existsSync(claim.processingPath)) {
|
|
123
|
-
fs.unlinkSync(claim.processingPath);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
catch {
|
|
127
|
-
// Best-effort cleanup
|
|
128
|
-
}
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
// Failure path: merge back into inbox.
|
|
132
|
-
try {
|
|
133
|
-
const claimedContent = fs.existsSync(claim.processingPath)
|
|
134
|
-
? fs.readFileSync(claim.processingPath, 'utf-8')
|
|
135
|
-
: claim.content;
|
|
136
|
-
if (!claimedContent.trim()) {
|
|
137
|
-
// Nothing to restore
|
|
138
|
-
if (fs.existsSync(claim.processingPath))
|
|
139
|
-
fs.unlinkSync(claim.processingPath);
|
|
140
|
-
return;
|
|
141
|
-
}
|
|
142
|
-
if (!fs.existsSync(claim.inboxPath)) {
|
|
143
|
-
fs.renameSync(claim.processingPath, claim.inboxPath);
|
|
144
|
-
return;
|
|
145
|
-
}
|
|
146
|
-
// Inbox exists (new messages arrived). Prepend claimed content so older messages come first.
|
|
147
|
-
const currentInbox = fs.readFileSync(claim.inboxPath, 'utf-8');
|
|
148
|
-
const merged = `${claimedContent.trimEnd()}\n\n${currentInbox.trimStart()}`;
|
|
149
|
-
const tmpPath = `${claim.inboxPath}.tmp`;
|
|
150
|
-
fs.writeFileSync(tmpPath, merged, 'utf-8');
|
|
151
|
-
fs.renameSync(tmpPath, claim.inboxPath);
|
|
152
|
-
if (fs.existsSync(claim.processingPath)) {
|
|
153
|
-
fs.unlinkSync(claim.processingPath);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
catch (err) {
|
|
157
|
-
// Last-resort: don't crash the supervisor on finalize
|
|
158
|
-
// eslint-disable-next-line no-console
|
|
159
|
-
console.error('[supervisor] Failed to finalize inbox claim:', err);
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
//# sourceMappingURL=inbox.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../src/supervisor/inbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent Relay Supervisor
|
|
3
|
-
*
|
|
4
|
-
* Exports for the spawn-per-message supervisor system.
|
|
5
|
-
*/
|
|
6
|
-
export * from './types.js';
|
|
7
|
-
export * from './state.js';
|
|
8
|
-
export * from './spawner.js';
|
|
9
|
-
export * from './supervisor.js';
|
|
10
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/supervisor/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC"}
|
package/dist/supervisor/index.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/supervisor/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC"}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CLI Spawner
|
|
3
|
-
*
|
|
4
|
-
* Handles spawning fresh CLI instances for different agent types.
|
|
5
|
-
* Supports Claude Code, Codex, Cursor, and custom commands.
|
|
6
|
-
*/
|
|
7
|
-
import type { CLIType, SpawnResult, ParsedRelayCommand, SupervisorConfig } from './types.js';
|
|
8
|
-
/** Parsed structured markers from output */
|
|
9
|
-
export interface ParsedDecision {
|
|
10
|
-
what: string;
|
|
11
|
-
why: string;
|
|
12
|
-
}
|
|
13
|
-
export interface ParsedTodo {
|
|
14
|
-
task: string;
|
|
15
|
-
priority: 'high' | 'normal' | 'low';
|
|
16
|
-
owner?: string;
|
|
17
|
-
}
|
|
18
|
-
export interface ParsedDone {
|
|
19
|
-
taskMatch: string;
|
|
20
|
-
}
|
|
21
|
-
export interface ParsedStateMarkers {
|
|
22
|
-
decisions: ParsedDecision[];
|
|
23
|
-
todos: ParsedTodo[];
|
|
24
|
-
dones: ParsedDone[];
|
|
25
|
-
summary?: string;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Parse structured state markers from CLI output
|
|
29
|
-
*/
|
|
30
|
-
export declare function parseStateMarkers(output: string): ParsedStateMarkers;
|
|
31
|
-
/**
|
|
32
|
-
* Parse relay commands from CLI output
|
|
33
|
-
*/
|
|
34
|
-
export declare function parseRelayCommands(output: string): ParsedRelayCommand[];
|
|
35
|
-
/**
|
|
36
|
-
* CLI Spawner class
|
|
37
|
-
*/
|
|
38
|
-
export declare class CLISpawner {
|
|
39
|
-
private config;
|
|
40
|
-
constructor(config: SupervisorConfig);
|
|
41
|
-
/**
|
|
42
|
-
* Spawn a CLI with the given prompt
|
|
43
|
-
*/
|
|
44
|
-
spawn(cli: CLIType, prompt: string, cwd: string, customCommand?: string): Promise<SpawnResult>;
|
|
45
|
-
/**
|
|
46
|
-
* Parse a custom command string into cmd, args, promptFlag
|
|
47
|
-
*/
|
|
48
|
-
private parseCustomCommand;
|
|
49
|
-
/**
|
|
50
|
-
* Check if a CLI is available
|
|
51
|
-
*/
|
|
52
|
-
isAvailable(cli: CLIType, customCommand?: string): Promise<boolean>;
|
|
53
|
-
}
|
|
54
|
-
//# sourceMappingURL=spawner.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"spawner.d.ts","sourceRoot":"","sources":["../../src/supervisor/spawner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AA0C7F,4CAA4C;AAC5C,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,CA6DpE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,EAAE,CA8BvE;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAmB;gBAErB,MAAM,EAAE,gBAAgB;IAIpC;;OAEG;IACG,KAAK,CACT,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,WAAW,CAAC;IAmHvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAwB1B;;OAEG;IACG,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAa1E"}
|
|
@@ -1,282 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CLI Spawner
|
|
3
|
-
*
|
|
4
|
-
* Handles spawning fresh CLI instances for different agent types.
|
|
5
|
-
* Supports Claude Code, Codex, Cursor, and custom commands.
|
|
6
|
-
*/
|
|
7
|
-
import { spawn } from 'node:child_process';
|
|
8
|
-
const CLI_COMMANDS = {
|
|
9
|
-
claude: {
|
|
10
|
-
cmd: 'claude',
|
|
11
|
-
args: ['--dangerously-skip-permissions'],
|
|
12
|
-
promptMode: 'flag',
|
|
13
|
-
promptFlag: '-p',
|
|
14
|
-
},
|
|
15
|
-
codex: {
|
|
16
|
-
cmd: 'codex',
|
|
17
|
-
// Prefer stdin for robustness (some codex invocations are flaky with huge -p prompts).
|
|
18
|
-
// Try --quiet first but retry without it if unsupported.
|
|
19
|
-
args: ['--quiet'],
|
|
20
|
-
promptMode: 'stdin',
|
|
21
|
-
},
|
|
22
|
-
cursor: {
|
|
23
|
-
cmd: 'cursor',
|
|
24
|
-
args: ['--cli'],
|
|
25
|
-
promptMode: 'flag',
|
|
26
|
-
promptFlag: '-p',
|
|
27
|
-
},
|
|
28
|
-
custom: {
|
|
29
|
-
cmd: '',
|
|
30
|
-
args: [],
|
|
31
|
-
promptMode: 'stdin',
|
|
32
|
-
},
|
|
33
|
-
};
|
|
34
|
-
/** Relay command patterns */
|
|
35
|
-
const INLINE_RELAY_PATTERN = /^(\s*)@relay:(\S+)\s+(.+)$/gm;
|
|
36
|
-
const BLOCK_RELAY_PATTERN = /\[\[RELAY\]\]([\s\S]*?)\[\[\/RELAY\]\]/g;
|
|
37
|
-
/** Structured state markers */
|
|
38
|
-
const DECISION_PATTERN = /\[\[DECISION\]\]([\s\S]*?)\[\[\/DECISION\]\]/g;
|
|
39
|
-
const TODO_PATTERN = /\[\[TODO\]\]([\s\S]*?)\[\[\/TODO\]\]/g;
|
|
40
|
-
const DONE_PATTERN = /\[\[DONE\]\]([\s\S]*?)\[\[\/DONE\]\]/g;
|
|
41
|
-
const SUMMARY_PATTERN = /\[\[SUMMARY\]\]([\s\S]*?)\[\[\/SUMMARY\]\]/g;
|
|
42
|
-
/**
|
|
43
|
-
* Parse structured state markers from CLI output
|
|
44
|
-
*/
|
|
45
|
-
export function parseStateMarkers(output) {
|
|
46
|
-
const decisions = [];
|
|
47
|
-
const todos = [];
|
|
48
|
-
const dones = [];
|
|
49
|
-
let summary;
|
|
50
|
-
// Parse decisions
|
|
51
|
-
let match;
|
|
52
|
-
while ((match = DECISION_PATTERN.exec(output)) !== null) {
|
|
53
|
-
try {
|
|
54
|
-
const json = JSON.parse(match[1].trim());
|
|
55
|
-
if (json.what) {
|
|
56
|
-
decisions.push({
|
|
57
|
-
what: json.what,
|
|
58
|
-
why: json.why || '',
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
catch {
|
|
63
|
-
// Not valid JSON, try simple text format
|
|
64
|
-
const text = match[1].trim();
|
|
65
|
-
if (text) {
|
|
66
|
-
decisions.push({ what: text, why: '' });
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
// Parse TODOs
|
|
71
|
-
while ((match = TODO_PATTERN.exec(output)) !== null) {
|
|
72
|
-
try {
|
|
73
|
-
const json = JSON.parse(match[1].trim());
|
|
74
|
-
if (json.task) {
|
|
75
|
-
todos.push({
|
|
76
|
-
task: json.task,
|
|
77
|
-
priority: json.priority || 'normal',
|
|
78
|
-
owner: json.owner,
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
catch {
|
|
83
|
-
// Not valid JSON, treat as simple task
|
|
84
|
-
const text = match[1].trim();
|
|
85
|
-
if (text) {
|
|
86
|
-
todos.push({ task: text, priority: 'normal' });
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
// Parse DONEs (task completions)
|
|
91
|
-
while ((match = DONE_PATTERN.exec(output)) !== null) {
|
|
92
|
-
const text = match[1].trim();
|
|
93
|
-
if (text) {
|
|
94
|
-
dones.push({ taskMatch: text });
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
// Parse SUMMARY (take last one)
|
|
98
|
-
while ((match = SUMMARY_PATTERN.exec(output)) !== null) {
|
|
99
|
-
const text = match[1].trim();
|
|
100
|
-
if (text)
|
|
101
|
-
summary = text;
|
|
102
|
-
}
|
|
103
|
-
return { decisions, todos, dones, summary };
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Parse relay commands from CLI output
|
|
107
|
-
*/
|
|
108
|
-
export function parseRelayCommands(output) {
|
|
109
|
-
const commands = [];
|
|
110
|
-
// Parse inline commands
|
|
111
|
-
let match;
|
|
112
|
-
while ((match = INLINE_RELAY_PATTERN.exec(output)) !== null) {
|
|
113
|
-
commands.push({
|
|
114
|
-
to: match[2],
|
|
115
|
-
body: match[3],
|
|
116
|
-
kind: 'message',
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
// Parse block commands
|
|
120
|
-
while ((match = BLOCK_RELAY_PATTERN.exec(output)) !== null) {
|
|
121
|
-
try {
|
|
122
|
-
const json = JSON.parse(match[1].trim());
|
|
123
|
-
if (json.to && json.type) {
|
|
124
|
-
commands.push({
|
|
125
|
-
to: json.to,
|
|
126
|
-
body: json.body || json.text || '',
|
|
127
|
-
kind: json.type,
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
catch {
|
|
132
|
-
// Invalid JSON, skip
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
return commands;
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* CLI Spawner class
|
|
139
|
-
*/
|
|
140
|
-
export class CLISpawner {
|
|
141
|
-
config;
|
|
142
|
-
constructor(config) {
|
|
143
|
-
this.config = config;
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Spawn a CLI with the given prompt
|
|
147
|
-
*/
|
|
148
|
-
async spawn(cli, prompt, cwd, customCommand) {
|
|
149
|
-
const { cmd, args, promptMode, promptFlag } = cli === 'custom' && customCommand
|
|
150
|
-
? this.parseCustomCommand(customCommand)
|
|
151
|
-
: CLI_COMMANDS[cli];
|
|
152
|
-
if (!cmd) {
|
|
153
|
-
throw new Error(`Invalid CLI type: ${cli}`);
|
|
154
|
-
}
|
|
155
|
-
const attempt = async (attemptArgs) => {
|
|
156
|
-
const fullArgs = [...attemptArgs];
|
|
157
|
-
if (promptMode === 'flag' && promptFlag) {
|
|
158
|
-
fullArgs.push(promptFlag, prompt);
|
|
159
|
-
}
|
|
160
|
-
if (this.config.verbose) {
|
|
161
|
-
console.error(`[spawner] Running: ${cmd} ${fullArgs.join(' ')}`);
|
|
162
|
-
}
|
|
163
|
-
return new Promise((resolve) => {
|
|
164
|
-
const proc = spawn(cmd, fullArgs, {
|
|
165
|
-
cwd,
|
|
166
|
-
env: {
|
|
167
|
-
...process.env,
|
|
168
|
-
AGENT_RELAY_SUPERVISED: '1',
|
|
169
|
-
},
|
|
170
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
171
|
-
});
|
|
172
|
-
let stdout = '';
|
|
173
|
-
let stderr = '';
|
|
174
|
-
proc.stdout?.on('data', (data) => {
|
|
175
|
-
const chunk = data.toString();
|
|
176
|
-
stdout += chunk;
|
|
177
|
-
if (this.config.verbose) {
|
|
178
|
-
process.stdout.write(chunk);
|
|
179
|
-
}
|
|
180
|
-
});
|
|
181
|
-
proc.stderr?.on('data', (data) => {
|
|
182
|
-
const chunk = data.toString();
|
|
183
|
-
stderr += chunk;
|
|
184
|
-
if (this.config.verbose) {
|
|
185
|
-
process.stderr.write(chunk);
|
|
186
|
-
}
|
|
187
|
-
});
|
|
188
|
-
// For CLIs that read prompt from stdin instead of flag
|
|
189
|
-
if (promptMode === 'stdin') {
|
|
190
|
-
proc.stdin?.write(prompt);
|
|
191
|
-
proc.stdin?.end();
|
|
192
|
-
}
|
|
193
|
-
proc.on('close', (code) => {
|
|
194
|
-
// Some CLIs emit user-visible output on stderr; parse both for commands/markers.
|
|
195
|
-
const combined = `${stdout}\n${stderr}`;
|
|
196
|
-
const relayCommands = parseRelayCommands(combined);
|
|
197
|
-
const stateMarkers = parseStateMarkers(combined);
|
|
198
|
-
if (this.config.verbose) {
|
|
199
|
-
console.error(`[spawner] Exited with code ${code}, found ${relayCommands.length} relay commands, ${stateMarkers.decisions.length} decisions, ${stateMarkers.todos.length} todos, ${stateMarkers.dones.length} dones`);
|
|
200
|
-
}
|
|
201
|
-
resolve({
|
|
202
|
-
exitCode: code ?? 1,
|
|
203
|
-
stdout,
|
|
204
|
-
stderr,
|
|
205
|
-
relayCommands,
|
|
206
|
-
stateMarkers,
|
|
207
|
-
});
|
|
208
|
-
});
|
|
209
|
-
proc.on('error', (err) => {
|
|
210
|
-
console.error(`[spawner] Spawn error:`, err);
|
|
211
|
-
resolve({
|
|
212
|
-
exitCode: 1,
|
|
213
|
-
stdout,
|
|
214
|
-
stderr: stderr + `\nSpawn error: ${err.message}`,
|
|
215
|
-
relayCommands: [],
|
|
216
|
-
stateMarkers: { decisions: [], todos: [], dones: [] },
|
|
217
|
-
});
|
|
218
|
-
});
|
|
219
|
-
// Timeout after 5 minutes
|
|
220
|
-
setTimeout(() => {
|
|
221
|
-
if (!proc.killed) {
|
|
222
|
-
console.error(`[spawner] Timeout, killing process`);
|
|
223
|
-
proc.kill('SIGTERM');
|
|
224
|
-
}
|
|
225
|
-
}, 5 * 60 * 1000);
|
|
226
|
-
});
|
|
227
|
-
};
|
|
228
|
-
// First attempt
|
|
229
|
-
const first = await attempt(args);
|
|
230
|
-
// Codex-specific retry: if --quiet is unsupported, retry without it.
|
|
231
|
-
if (cli === 'codex' &&
|
|
232
|
-
args.includes('--quiet') &&
|
|
233
|
-
first.exitCode !== 0 &&
|
|
234
|
-
/unknown option|unrecognized option|invalid option|unexpected option|unknown flag/i.test(first.stderr)) {
|
|
235
|
-
if (this.config.verbose) {
|
|
236
|
-
console.error('[spawner] codex --quiet unsupported; retrying without --quiet');
|
|
237
|
-
}
|
|
238
|
-
return attempt(args.filter((a) => a !== '--quiet'));
|
|
239
|
-
}
|
|
240
|
-
return first;
|
|
241
|
-
}
|
|
242
|
-
/**
|
|
243
|
-
* Parse a custom command string into cmd, args, promptFlag
|
|
244
|
-
*/
|
|
245
|
-
parseCustomCommand(command) {
|
|
246
|
-
const parts = command.split(' ');
|
|
247
|
-
const cmd = parts[0];
|
|
248
|
-
const args = parts.slice(1);
|
|
249
|
-
// Try to detect prompt flag
|
|
250
|
-
let promptFlag;
|
|
251
|
-
let promptMode = 'stdin';
|
|
252
|
-
const pFlagIdx = args.indexOf('-p');
|
|
253
|
-
const promptFlagIdx = args.indexOf('--prompt');
|
|
254
|
-
if (pFlagIdx !== -1) {
|
|
255
|
-
promptFlag = '-p';
|
|
256
|
-
args.splice(pFlagIdx, 1);
|
|
257
|
-
promptMode = 'flag';
|
|
258
|
-
}
|
|
259
|
-
else if (promptFlagIdx !== -1) {
|
|
260
|
-
promptFlag = '--prompt';
|
|
261
|
-
args.splice(promptFlagIdx, 1);
|
|
262
|
-
promptMode = 'flag';
|
|
263
|
-
}
|
|
264
|
-
return { cmd, args, promptMode, promptFlag };
|
|
265
|
-
}
|
|
266
|
-
/**
|
|
267
|
-
* Check if a CLI is available
|
|
268
|
-
*/
|
|
269
|
-
async isAvailable(cli, customCommand) {
|
|
270
|
-
const cmd = cli === 'custom' && customCommand
|
|
271
|
-
? customCommand.split(' ')[0]
|
|
272
|
-
: CLI_COMMANDS[cli].cmd;
|
|
273
|
-
if (!cmd)
|
|
274
|
-
return false;
|
|
275
|
-
return new Promise((resolve) => {
|
|
276
|
-
const proc = spawn('which', [cmd], { stdio: 'ignore' });
|
|
277
|
-
proc.on('close', (code) => resolve(code === 0));
|
|
278
|
-
proc.on('error', () => resolve(false));
|
|
279
|
-
});
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
//# sourceMappingURL=spawner.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"spawner.js","sourceRoot":"","sources":["../../src/supervisor/spawner.ts"],"names":[],"mappings":"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"}
|