@rasensio/aidlc 1.77.0 → 1.79.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 +7 -3
- package/dist/cli.js +2 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/menu.d.ts +5 -8
- package/dist/commands/menu.d.ts.map +1 -1
- package/dist/commands/menu.js +12 -13
- package/dist/commands/menu.js.map +1 -1
- package/dist/commands/status.d.ts +9 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +24 -0
- package/dist/commands/status.js.map +1 -1
- package/dist/console/autopilot-view.d.ts +50 -0
- package/dist/console/autopilot-view.d.ts.map +1 -0
- package/dist/console/autopilot-view.js +99 -0
- package/dist/console/autopilot-view.js.map +1 -0
- package/dist/console/harness.d.ts +84 -0
- package/dist/console/harness.d.ts.map +1 -0
- package/dist/console/harness.js +191 -0
- package/dist/console/harness.js.map +1 -0
- package/dist/console/index.d.ts +28 -0
- package/dist/console/index.d.ts.map +1 -0
- package/dist/console/index.js +154 -0
- package/dist/console/index.js.map +1 -0
- package/dist/console/route.d.ts +45 -0
- package/dist/console/route.d.ts.map +1 -0
- package/dist/console/route.js +118 -0
- package/dist/console/route.js.map +1 -0
- package/dist/console/session.d.ts +92 -0
- package/dist/console/session.d.ts.map +1 -0
- package/dist/console/session.js +337 -0
- package/dist/console/session.js.map +1 -0
- package/dist/console/standing.d.ts +44 -0
- package/dist/console/standing.d.ts.map +1 -0
- package/dist/console/standing.js +96 -0
- package/dist/console/standing.js.map +1 -0
- package/dist/console/terminal.d.ts +31 -0
- package/dist/console/terminal.d.ts.map +1 -0
- package/dist/console/terminal.js +216 -0
- package/dist/console/terminal.js.map +1 -0
- package/dist/menu/index.d.ts +7 -24
- package/dist/menu/index.d.ts.map +1 -1
- package/dist/menu/index.js +6 -86
- package/dist/menu/index.js.map +1 -1
- package/dist/roadmap/graph.d.ts +53 -3
- package/dist/roadmap/graph.d.ts.map +1 -1
- package/dist/roadmap/graph.js +126 -54
- package/dist/roadmap/graph.js.map +1 -1
- package/dist/roadmap/view-assets.d.ts +5 -0
- package/dist/roadmap/view-assets.d.ts.map +1 -1
- package/dist/roadmap/view-assets.js +302 -91
- package/dist/roadmap/view-assets.js.map +1 -1
- package/dist/roadmap/view-html.d.ts +11 -1
- package/dist/roadmap/view-html.d.ts.map +1 -1
- package/dist/roadmap/view-html.js +166 -35
- package/dist/roadmap/view-html.js.map +1 -1
- package/dist/roadmap/view-model.js +1 -1
- package/dist/roadmap/view-model.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Driving the user's own harness one turn at a time (aidlc-console/AC-20,
|
|
3
|
+
* aidlc-console/AC-21, aidlc-console/AC-22, aidlc-console/AC-23,
|
|
4
|
+
* aidlc-console/AC-24, aidlc-console/AC-26, aidlc-console/AC-30).
|
|
5
|
+
*
|
|
6
|
+
* Pure. Each turn is one process: Claude Code's `-p` with stream-json output,
|
|
7
|
+
* or `codex exec --json`, resumed by the id the previous turn reported (design
|
|
8
|
+
* D3). The message always travels on stdin, so a message starting with `-` is
|
|
9
|
+
* never read as an option and long command output never meets argv limits.
|
|
10
|
+
*
|
|
11
|
+
* @module
|
|
12
|
+
*/
|
|
13
|
+
import { emptyCodexProgress, readCodexEvents } from '../autopilot/result.js';
|
|
14
|
+
export const HARNESSES = ['claude-code', 'codex'];
|
|
15
|
+
/** The program each harness runs, for the "not installed" message (aidlc-console/AC-28). */
|
|
16
|
+
export const PROGRAM = { 'claude-code': 'claude', codex: 'codex' };
|
|
17
|
+
/** Harness ids are UUIDs; anything else is refused before it reaches argv. */
|
|
18
|
+
const SESSION_RE = /^[0-9A-Za-z][0-9A-Za-z-]{7,63}$/;
|
|
19
|
+
/**
|
|
20
|
+
* The argv for one turn. `session` null starts a new session; `allowed` holds the
|
|
21
|
+
* tool rules the user approved (aidlc-console/AC-23). Codex runs in its
|
|
22
|
+
* workspace-write sandbox and takes no tool rules (aidlc-console/AC-24).
|
|
23
|
+
*/
|
|
24
|
+
export function turnArgv(harness, session, allowed = []) {
|
|
25
|
+
const resume = session !== null && SESSION_RE.test(session) ? session : null;
|
|
26
|
+
if (harness === 'codex') {
|
|
27
|
+
return ['codex', 'exec', '--sandbox', 'workspace-write', '--json', ...(resume ? ['resume', resume] : []), '-'];
|
|
28
|
+
}
|
|
29
|
+
return [
|
|
30
|
+
'claude', '-p', '--output-format', 'stream-json', '--verbose',
|
|
31
|
+
...(resume ? ['--resume', resume] : []),
|
|
32
|
+
...(allowed.length > 0 ? ['--allowedTools', ...allowed] : []),
|
|
33
|
+
];
|
|
34
|
+
}
|
|
35
|
+
const isRecord = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
36
|
+
/** One line for a tool call: the command for a shell, the path for a file tool, else the name. */
|
|
37
|
+
export function toolLine(name, input) {
|
|
38
|
+
const i = isRecord(input) ? input : {};
|
|
39
|
+
const detail = typeof i.command === 'string' ? i.command
|
|
40
|
+
: typeof i.file_path === 'string' ? i.file_path
|
|
41
|
+
: typeof i.path === 'string' ? i.path
|
|
42
|
+
: typeof i.pattern === 'string' ? i.pattern
|
|
43
|
+
: '';
|
|
44
|
+
const one = detail.replace(/\s+/g, ' ').trim();
|
|
45
|
+
return `⏺ ${name}${one ? ` ${one.length > 100 ? `${one.slice(0, 99)}…` : one}` : ''}`;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Folds a turn's stdout, line by line, into what to show and how it ended.
|
|
49
|
+
* Unknown events and non-JSON lines are ignored, so a new harness event changes
|
|
50
|
+
* nothing here (design: harness output drift).
|
|
51
|
+
*/
|
|
52
|
+
export class TurnParser {
|
|
53
|
+
harness;
|
|
54
|
+
session;
|
|
55
|
+
costUsd = null;
|
|
56
|
+
tokens = null;
|
|
57
|
+
denials = [];
|
|
58
|
+
error = null;
|
|
59
|
+
codex = emptyCodexProgress();
|
|
60
|
+
sawResult = false;
|
|
61
|
+
constructor(harness, session) {
|
|
62
|
+
this.harness = harness;
|
|
63
|
+
this.session = session;
|
|
64
|
+
}
|
|
65
|
+
/** The lines to show for one stdout line. */
|
|
66
|
+
push(line) {
|
|
67
|
+
const t = line.trim();
|
|
68
|
+
if (!t.startsWith('{'))
|
|
69
|
+
return [];
|
|
70
|
+
let v;
|
|
71
|
+
try {
|
|
72
|
+
v = JSON.parse(t);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return [];
|
|
76
|
+
}
|
|
77
|
+
if (!isRecord(v))
|
|
78
|
+
return [];
|
|
79
|
+
return this.harness === 'codex' ? this.codexEvent(t, v) : this.claudeEvent(v);
|
|
80
|
+
}
|
|
81
|
+
claudeEvent(v) {
|
|
82
|
+
if (typeof v.session_id === 'string' && SESSION_RE.test(v.session_id))
|
|
83
|
+
this.session = v.session_id;
|
|
84
|
+
if (v.type === 'assistant' && isRecord(v.message) && Array.isArray(v.message.content)) {
|
|
85
|
+
const out = [];
|
|
86
|
+
for (const block of v.message.content) {
|
|
87
|
+
if (!isRecord(block))
|
|
88
|
+
continue;
|
|
89
|
+
if (block.type === 'text' && typeof block.text === 'string' && block.text.trim() !== '')
|
|
90
|
+
out.push(block.text.trim());
|
|
91
|
+
if (block.type === 'tool_use' && typeof block.name === 'string')
|
|
92
|
+
out.push(toolLine(block.name, block.input));
|
|
93
|
+
}
|
|
94
|
+
return out;
|
|
95
|
+
}
|
|
96
|
+
if (v.type === 'result') {
|
|
97
|
+
this.sawResult = true;
|
|
98
|
+
if (typeof v.total_cost_usd === 'number' && Number.isFinite(v.total_cost_usd))
|
|
99
|
+
this.costUsd = v.total_cost_usd;
|
|
100
|
+
if (v.is_error === true)
|
|
101
|
+
this.error = typeof v.result === 'string' && v.result ? v.result : String(v.subtype ?? 'error');
|
|
102
|
+
const denials = Array.isArray(v.permission_denials) ? v.permission_denials : [];
|
|
103
|
+
for (const d of denials) {
|
|
104
|
+
if (!isRecord(d) || typeof d.tool_name !== 'string')
|
|
105
|
+
continue;
|
|
106
|
+
const input = isRecord(d.tool_input) ? d.tool_input : {};
|
|
107
|
+
// The same refusal can repeat inside one turn; ask about it once.
|
|
108
|
+
if (!this.denials.some((x) => allowSpec(x) === allowSpec({ tool: d.tool_name, input }))) {
|
|
109
|
+
this.denials.push({ tool: d.tool_name, input });
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return [];
|
|
114
|
+
}
|
|
115
|
+
codexEvent(raw, v) {
|
|
116
|
+
readCodexEvents(raw, this.codex);
|
|
117
|
+
if (this.codex.thread_id !== null)
|
|
118
|
+
this.session = this.codex.thread_id;
|
|
119
|
+
if (v.type !== 'item.completed' || !isRecord(v.item))
|
|
120
|
+
return [];
|
|
121
|
+
const item = v.item;
|
|
122
|
+
if (item.type === 'agent_message' && typeof item.text === 'string' && item.text.trim() !== '')
|
|
123
|
+
return [item.text.trim()];
|
|
124
|
+
if (item.type === 'command_execution' && typeof item.command === 'string')
|
|
125
|
+
return [toolLine('Shell', { command: item.command })];
|
|
126
|
+
if (item.type === 'file_change' && Array.isArray(item.changes)) {
|
|
127
|
+
return item.changes.filter(isRecord).map((c) => toolLine('Edit', { path: c.path }));
|
|
128
|
+
}
|
|
129
|
+
return [];
|
|
130
|
+
}
|
|
131
|
+
/** How the turn ended. `exitCode` is the process's, for a turn that wrote no result. */
|
|
132
|
+
end(exitCode) {
|
|
133
|
+
let error = this.error;
|
|
134
|
+
if (this.harness === 'codex') {
|
|
135
|
+
error = this.codex.error;
|
|
136
|
+
const u = this.codex.usage;
|
|
137
|
+
if (this.codex.turns > 0)
|
|
138
|
+
this.tokens = u.input + u.output;
|
|
139
|
+
if (!this.codex.ended && error === null && exitCode !== 0)
|
|
140
|
+
error = `codex exited with code ${exitCode ?? 'signal'}`;
|
|
141
|
+
}
|
|
142
|
+
else if (!this.sawResult && exitCode !== 0) {
|
|
143
|
+
error = `claude exited with code ${exitCode ?? 'signal'}`;
|
|
144
|
+
}
|
|
145
|
+
return { session: this.session, costUsd: this.costUsd, tokens: this.tokens, denials: this.denials, error };
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* The `--allowedTools` rule that allows exactly what was refused: the command for
|
|
150
|
+
* Bash, else the tool by name (design D4).
|
|
151
|
+
*/
|
|
152
|
+
export function allowSpec(d) {
|
|
153
|
+
if (d.tool === 'Bash' && typeof d.input.command === 'string' && d.input.command.trim() !== '') {
|
|
154
|
+
return `Bash(${d.input.command.trim()})`;
|
|
155
|
+
}
|
|
156
|
+
return d.tool;
|
|
157
|
+
}
|
|
158
|
+
/** The question asked about a refused tool (aidlc-console/AC-23). */
|
|
159
|
+
export function denialQuestion(d) {
|
|
160
|
+
return `The agent asked to use ${toolLine(d.tool, d.input).slice(2)} — allow it for this session?`;
|
|
161
|
+
}
|
|
162
|
+
/** Output kept per command for the agent: the end matters most (exit status, errors). */
|
|
163
|
+
export const OUTPUT_KEEP = 4000;
|
|
164
|
+
/**
|
|
165
|
+
* The message for a turn, with the console's command output since the last turn
|
|
166
|
+
* in front of it (aidlc-console/AC-22). Each output is cut to its last
|
|
167
|
+
* `OUTPUT_KEEP` characters.
|
|
168
|
+
*/
|
|
169
|
+
export function withPendingOutput(text, pending) {
|
|
170
|
+
if (pending.length === 0)
|
|
171
|
+
return text;
|
|
172
|
+
const blocks = pending.map((p) => {
|
|
173
|
+
const out = p.output.length > OUTPUT_KEEP ? `…(cut)\n${p.output.slice(-OUTPUT_KEEP)}` : p.output;
|
|
174
|
+
return `$ ${p.line}\n${out.trimEnd()}`;
|
|
175
|
+
});
|
|
176
|
+
return `The user ran these in the aidlc console since your last turn:\n\n\`\`\`\n${blocks.join('\n\n')}\n\`\`\`\n\n${text}`;
|
|
177
|
+
}
|
|
178
|
+
/** The default harness from autopilot setup's saved agent command (aidlc-console/AC-26). */
|
|
179
|
+
export function defaultHarness(agentCommand) {
|
|
180
|
+
const program = agentCommand?.[0]?.split('/').pop();
|
|
181
|
+
return program === 'codex' ? 'codex' : 'claude-code';
|
|
182
|
+
}
|
|
183
|
+
/** The running-cost line after a turn (aidlc-console/AC-30). */
|
|
184
|
+
export function costLine(costUsd, tokens) {
|
|
185
|
+
if (costUsd > 0)
|
|
186
|
+
return `session cost $${costUsd.toFixed(2)}`;
|
|
187
|
+
if (tokens > 0)
|
|
188
|
+
return `session tokens ${tokens.toLocaleString('en-US')}`;
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=harness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness.js","sourceRoot":"","sources":["../../src/console/harness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAsB,MAAM,wBAAwB,CAAC;AAIjG,MAAM,CAAC,MAAM,SAAS,GAAuB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;AAEtE,4FAA4F;AAC5F,MAAM,CAAC,MAAM,OAAO,GAAsC,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAEtG,8EAA8E;AAC9E,MAAM,UAAU,GAAG,iCAAiC,CAAC;AAErD;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,OAAgB,EAAE,OAAsB,EAAE,UAA6B,EAAE;IAChG,MAAM,MAAM,GAAG,OAAO,KAAK,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7E,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,iBAAiB,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IACjH,CAAC;IACD,OAAO;QACL,QAAQ,EAAE,IAAI,EAAE,iBAAiB,EAAE,aAAa,EAAE,WAAW;QAC7D,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9D,CAAC;AACJ,CAAC;AAmBD,MAAM,QAAQ,GAAG,CAAC,CAAU,EAAa,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAErG,kGAAkG;AAClG,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,KAAc;IACnD,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO;QACtD,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;YAC/C,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;gBACrC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO;oBAC3C,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/C,OAAO,KAAK,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACxF,CAAC;AAED;;;;GAIG;AACH,MAAM,OAAO,UAAU;IASQ;IARrB,OAAO,CAAgB;IACvB,OAAO,GAAkB,IAAI,CAAC;IAC9B,MAAM,GAAkB,IAAI,CAAC;IAC7B,OAAO,GAAa,EAAE,CAAC;IACvB,KAAK,GAAkB,IAAI,CAAC;IAC5B,KAAK,GAAkB,kBAAkB,EAAE,CAAC;IAC5C,SAAS,GAAG,KAAK,CAAC;IAE1B,YAA6B,OAAgB,EAAE,OAAsB;QAAxC,YAAO,GAAP,OAAO,CAAS;QAC3C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,6CAA6C;IAC7C,IAAI,CAAC,IAAY;QACf,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,CAAC;QAClC,IAAI,CAAU,CAAC;QACf,IAAI,CAAC;YACH,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAChF,CAAC;IAEO,WAAW,CAAC,CAAO;QACzB,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;YAAE,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,UAAU,CAAC;QACnG,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACtF,MAAM,GAAG,GAAa,EAAE,CAAC;YACzB,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBACtC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;oBAAE,SAAS;gBAC/B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;oBAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACrH,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;oBAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/G,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;QACD,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACxB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,OAAO,CAAC,CAAC,cAAc,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC;gBAAE,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,cAAc,CAAC;YAC/G,IAAI,CAAC,CAAC,QAAQ,KAAK,IAAI;gBAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC;YACzH,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;YAChF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ;oBAAE,SAAS;gBAC9D,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzD,kEAAkE;gBAClE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,SAAmB,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC;oBAClG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAEO,UAAU,CAAC,GAAW,EAAE,CAAO;QACrC,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,KAAK,IAAI;YAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;QACvE,IAAI,CAAC,CAAC,IAAI,KAAK,gBAAgB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,CAAC;QAChE,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QACpB,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACzH,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACjI,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/D,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACtF,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,wFAAwF;IACxF,GAAG,CAAC,QAAuB;QACzB,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACvB,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YAC7B,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;YACzB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;YAC3B,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC;gBAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC;YAC3D,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI,QAAQ,KAAK,CAAC;gBAAE,KAAK,GAAG,0BAA0B,QAAQ,IAAI,QAAQ,EAAE,CAAC;QACtH,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC7C,KAAK,GAAG,2BAA2B,QAAQ,IAAI,QAAQ,EAAE,CAAC;QAC5D,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;IAC7G,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,CAAS;IACjC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC9F,OAAO,QAAQ,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;IAC3C,CAAC;IACD,OAAO,CAAC,CAAC,IAAI,CAAC;AAChB,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,cAAc,CAAC,CAAS;IACtC,OAAO,0BAA0B,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,+BAA+B,CAAC;AACrG,CAAC;AAED,yFAAyF;AACzF,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC;AAOhC;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,OAAiC;IAC/E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC/B,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACjG,OAAO,KAAK,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IACH,OAAO,4EAA4E,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,EAAE,CAAC;AAC9H,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,cAAc,CAAC,YAA2C;IACxE,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACpD,OAAO,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;AACvD,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,MAAc;IACtD,IAAI,OAAO,GAAG,CAAC;QAAE,OAAO,iBAAiB,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,IAAI,MAAM,GAAG,CAAC;QAAE,OAAO,kBAAkB,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;IAC1E,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `openConsole` — what bare `aidlc` and `aidlc menu` open (aidlc-console/AC-1,
|
|
3
|
+
* aidlc-console/AC-2, aidlc-console/AC-3).
|
|
4
|
+
*
|
|
5
|
+
* Off a terminal it keeps the old menu's fallbacks exactly: help on stderr for
|
|
6
|
+
* bare `aidlc`, a one-line diagnostic for `aidlc menu`, exit 1 for both.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
import type { Command } from 'commander';
|
|
11
|
+
import { type Prompter } from '../core/prompt.js';
|
|
12
|
+
import { type MenuMode } from '../menu/index.js';
|
|
13
|
+
/**
|
|
14
|
+
* The required positionals `argv` leaves out (aidlc-console/AC-14), or null when
|
|
15
|
+
* its first word is not a command (aidlc-console/AC-16). Words after the leaf that
|
|
16
|
+
* do not start with `-` count as given positionals; an option's value counts too,
|
|
17
|
+
* which can only under-ask, never ask for something already typed.
|
|
18
|
+
*/
|
|
19
|
+
export declare function missingArgs(program: Command, argv: readonly string[]): string[] | null;
|
|
20
|
+
/**
|
|
21
|
+
* Run `aidlc <argv>` through a throwaway program (menu/dispatch.ts). False when
|
|
22
|
+
* commander refused it or the command set a non-zero exit code; the code is then
|
|
23
|
+
* cleared so leaving the console exits 0 (aidlc-console/AC-16).
|
|
24
|
+
*/
|
|
25
|
+
export declare function runCommand(makeProgram: () => Command, argv: readonly string[]): Promise<boolean>;
|
|
26
|
+
/** Open the console, or print the non-interactive fallback (aidlc-console/AC-1..AC-3). */
|
|
27
|
+
export declare function openConsole(makeProgram: () => Command, mode?: MenuMode, prompter?: Prompter): Promise<void>;
|
|
28
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/console/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEnE,OAAO,EAA+B,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAQ9E;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,CAWtF;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,OAAO,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBtG;AA6CD,0FAA0F;AAC1F,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,OAAO,EAC1B,IAAI,GAAE,QAAiB,EACvB,QAAQ,GAAE,QAA0B,GACnC,OAAO,CAAC,IAAI,CAAC,CAuCf"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `openConsole` — what bare `aidlc` and `aidlc menu` open (aidlc-console/AC-1,
|
|
3
|
+
* aidlc-console/AC-2, aidlc-console/AC-3).
|
|
4
|
+
*
|
|
5
|
+
* Off a terminal it keeps the old menu's fallbacks exactly: help on stderr for
|
|
6
|
+
* bare `aidlc`, a one-line diagnostic for `aidlc menu`, exit 1 for both.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
import { liveRun } from '../autopilot/run.js';
|
|
11
|
+
import { loadConfig, loadState } from '../autopilot/state.js';
|
|
12
|
+
import { fileReader } from '../autopilot/watch.js';
|
|
13
|
+
import { approveCommand, forgetCommand, locate } from '../commands/autopilot.js';
|
|
14
|
+
import { resolveProjectRoot } from '../core/project-root.js';
|
|
15
|
+
import { defaultPrompter } from '../core/prompt.js';
|
|
16
|
+
import { runEntry } from '../menu/dispatch.js';
|
|
17
|
+
import { writeNonInteractiveFallback } from '../menu/index.js';
|
|
18
|
+
import { requiredArgs } from '../menu/resolve.js';
|
|
19
|
+
import { itemView } from './autopilot-view.js';
|
|
20
|
+
import { defaultHarness } from './harness.js';
|
|
21
|
+
import { runSession } from './session.js';
|
|
22
|
+
import { latestVersion, realReaders, standingLines } from './standing.js';
|
|
23
|
+
import { openShell, runShell, spawnTurn, terminalIO } from './terminal.js';
|
|
24
|
+
/**
|
|
25
|
+
* The required positionals `argv` leaves out (aidlc-console/AC-14), or null when
|
|
26
|
+
* its first word is not a command (aidlc-console/AC-16). Words after the leaf that
|
|
27
|
+
* do not start with `-` count as given positionals; an option's value counts too,
|
|
28
|
+
* which can only under-ask, never ask for something already typed.
|
|
29
|
+
*/
|
|
30
|
+
export function missingArgs(program, argv) {
|
|
31
|
+
let cmd = program;
|
|
32
|
+
let i = 0;
|
|
33
|
+
for (; i < argv.length; i++) {
|
|
34
|
+
const child = cmd.commands.find((c) => c.name() === argv[i] || c.aliases().includes(argv[i]));
|
|
35
|
+
if (child === undefined)
|
|
36
|
+
break;
|
|
37
|
+
cmd = child;
|
|
38
|
+
}
|
|
39
|
+
if (cmd === program)
|
|
40
|
+
return null;
|
|
41
|
+
const given = argv.slice(i).filter((w) => !w.startsWith('-')).length;
|
|
42
|
+
return requiredArgs(cmd).slice(given).map((a) => a.name());
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Run `aidlc <argv>` through a throwaway program (menu/dispatch.ts). False when
|
|
46
|
+
* commander refused it or the command set a non-zero exit code; the code is then
|
|
47
|
+
* cleared so leaving the console exits 0 (aidlc-console/AC-16).
|
|
48
|
+
*/
|
|
49
|
+
export async function runCommand(makeProgram, argv) {
|
|
50
|
+
process.exitCode = undefined;
|
|
51
|
+
// The command runs in this process, so Ctrl-C reaches only this process's handlers.
|
|
52
|
+
// A command cannot be cut short safely from outside; a second Ctrl-C leaves aidlc.
|
|
53
|
+
let presses = 0;
|
|
54
|
+
const onSigint = () => {
|
|
55
|
+
if (++presses === 1)
|
|
56
|
+
process.stderr.write('\n(Ctrl-C again leaves aidlc)\n');
|
|
57
|
+
else
|
|
58
|
+
process.exit(130);
|
|
59
|
+
};
|
|
60
|
+
process.on('SIGINT', onSigint);
|
|
61
|
+
try {
|
|
62
|
+
const r = await runEntry(makeProgram, ['node', 'aidlc', ...argv]);
|
|
63
|
+
return (r.ran || r.displayedHelp === true) && (process.exitCode ?? 0) === 0;
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
process.off('SIGINT', onSigint);
|
|
67
|
+
process.exitCode = undefined;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function autopilotAccess(projectRoot) {
|
|
71
|
+
let where = null;
|
|
72
|
+
try {
|
|
73
|
+
where = locate(projectRoot);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
where = null;
|
|
77
|
+
}
|
|
78
|
+
if (where === null)
|
|
79
|
+
return { access: null, paths: null };
|
|
80
|
+
const p = where.paths;
|
|
81
|
+
let agentCommand;
|
|
82
|
+
try {
|
|
83
|
+
agentCommand = loadConfig(p)?.agent_command;
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
agentCommand = undefined;
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
agentCommand,
|
|
90
|
+
paths: p,
|
|
91
|
+
access: {
|
|
92
|
+
items: () => loadState(p).items.map((i) => ({ view: itemView(fileReader.read, i), worktree: i.worktree, review: i.review })),
|
|
93
|
+
running: () => {
|
|
94
|
+
try {
|
|
95
|
+
return liveRun(p) !== null;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
read: fileReader.read,
|
|
102
|
+
logs: p.logs,
|
|
103
|
+
approve: (name) => {
|
|
104
|
+
process.exitCode = undefined;
|
|
105
|
+
approveCommand(name);
|
|
106
|
+
process.exitCode = undefined;
|
|
107
|
+
},
|
|
108
|
+
forget: (name) => {
|
|
109
|
+
process.exitCode = undefined;
|
|
110
|
+
forgetCommand(name);
|
|
111
|
+
process.exitCode = undefined;
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/** Open the console, or print the non-interactive fallback (aidlc-console/AC-1..AC-3). */
|
|
117
|
+
export async function openConsole(makeProgram, mode = 'bare', prompter = defaultPrompter) {
|
|
118
|
+
const program = makeProgram();
|
|
119
|
+
if (!prompter.interactive()) {
|
|
120
|
+
writeNonInteractiveFallback(program, mode);
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
const projectRoot = resolveProjectRoot();
|
|
124
|
+
const { access, paths, agentCommand } = autopilotAccess(projectRoot);
|
|
125
|
+
const readers = realReaders();
|
|
126
|
+
const deps = {
|
|
127
|
+
io: terminalIO(),
|
|
128
|
+
prompter,
|
|
129
|
+
version: program.version() ?? '',
|
|
130
|
+
harness: defaultHarness(agentCommand),
|
|
131
|
+
standing: (agent) => standingLines({ projectRoot, autopilot: paths, agent, now: Date.now() }, readers),
|
|
132
|
+
latestVersion: () => latestVersion(),
|
|
133
|
+
commandNames: () => program.commands.map((c) => c.name()),
|
|
134
|
+
missingArgs: (argv) => missingArgs(program, argv),
|
|
135
|
+
runCommand: (argv) => runCommand(makeProgram, argv),
|
|
136
|
+
spawnTurn: (argv, stdin, onLine) => spawnTurn(projectRoot, argv, stdin, onLine),
|
|
137
|
+
runShell: (cmd) => runShell(projectRoot, cmd),
|
|
138
|
+
openShell,
|
|
139
|
+
autopilot: access,
|
|
140
|
+
};
|
|
141
|
+
// Ctrl-C outside a prompt must not end the console: a turn handles its own, and
|
|
142
|
+
// a command or shell line gets the signal from the terminal directly.
|
|
143
|
+
const keepAlive = () => { };
|
|
144
|
+
process.on('SIGINT', keepAlive);
|
|
145
|
+
try {
|
|
146
|
+
await runSession(deps);
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
process.off('SIGINT', keepAlive);
|
|
150
|
+
}
|
|
151
|
+
// The version check may still be in flight; it must not hold the process open.
|
|
152
|
+
process.exit(process.exitCode ?? 0);
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/console/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a console line means (aidlc-console/AC-10, aidlc-console/AC-12,
|
|
3
|
+
* aidlc-console/AC-13, aidlc-console/AC-17, aidlc-console/AC-18).
|
|
4
|
+
*
|
|
5
|
+
* Pure. A `/` prefix is a command, a `!` prefix a shell line, anything else goes
|
|
6
|
+
* to the agent — so "update the readme" can never run `update`.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
/** Commands the console answers itself; everything else after `/` is an `aidlc` command. */
|
|
11
|
+
export declare const CONSOLE_COMMANDS: Readonly<Record<string, string>>;
|
|
12
|
+
/** Console spellings that run a longer `aidlc` command path (aidlc-console/AC-12). */
|
|
13
|
+
export declare const ALIASES: Readonly<Record<string, readonly string[]>>;
|
|
14
|
+
export type Route = {
|
|
15
|
+
kind: 'blank';
|
|
16
|
+
} | {
|
|
17
|
+
kind: 'shell';
|
|
18
|
+
cmd: string;
|
|
19
|
+
} | {
|
|
20
|
+
kind: 'agent';
|
|
21
|
+
text: string;
|
|
22
|
+
} | {
|
|
23
|
+
kind: 'console';
|
|
24
|
+
name: string;
|
|
25
|
+
args: string[];
|
|
26
|
+
} | {
|
|
27
|
+
kind: 'command';
|
|
28
|
+
argv: string[];
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Split a command line into words. Single and double quotes group; a backslash
|
|
32
|
+
* escapes the next character outside single quotes. No expansion of any kind —
|
|
33
|
+
* the words become argv elements, never shell input.
|
|
34
|
+
*/
|
|
35
|
+
export declare function splitWords(line: string): string[];
|
|
36
|
+
/** Route one typed line (aidlc-console/AC-10). */
|
|
37
|
+
export declare function routeLine(line: string): Route;
|
|
38
|
+
/**
|
|
39
|
+
* Tab completion for a `/` command name (aidlc-console/AC-18). Only the first
|
|
40
|
+
* word completes; returns readline's `[matches, substring]` shape.
|
|
41
|
+
*/
|
|
42
|
+
export declare function completeSlash(line: string, names: readonly string[]): [string[], string];
|
|
43
|
+
/** The `/help` listing: console commands, then the old menu's commands (aidlc-console/AC-13, AC-17). */
|
|
44
|
+
export declare function helpLines(): string[];
|
|
45
|
+
//# sourceMappingURL=route.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../src/console/route.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,4FAA4F;AAC5F,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAO7D,CAAC;AAEF,sFAAsF;AACtF,eAAO,MAAM,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAE/D,CAAC;AAEF,MAAM,MAAM,KAAK,GACb;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAExC;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CA4BjD;AAED,kDAAkD;AAClD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAiB7C;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAKxF;AAED,wGAAwG;AACxG,wBAAgB,SAAS,IAAI,MAAM,EAAE,CAcpC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a console line means (aidlc-console/AC-10, aidlc-console/AC-12,
|
|
3
|
+
* aidlc-console/AC-13, aidlc-console/AC-17, aidlc-console/AC-18).
|
|
4
|
+
*
|
|
5
|
+
* Pure. A `/` prefix is a command, a `!` prefix a shell line, anything else goes
|
|
6
|
+
* to the agent — so "update the readme" can never run `update`.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
import { ROSTER } from '../menu/roster.js';
|
|
11
|
+
/** Commands the console answers itself; everything else after `/` is an `aidlc` command. */
|
|
12
|
+
export const CONSOLE_COMMANDS = {
|
|
13
|
+
help: 'List what you can type here',
|
|
14
|
+
watch: 'Show or hide the autopilot section (also Ctrl-T)',
|
|
15
|
+
agent: 'Show the agent, or switch: /agent claude-code | /agent codex',
|
|
16
|
+
new: 'Start a new agent session',
|
|
17
|
+
exit: 'Leave the console (also /quit, Ctrl-D)',
|
|
18
|
+
quit: 'Leave the console',
|
|
19
|
+
};
|
|
20
|
+
/** Console spellings that run a longer `aidlc` command path (aidlc-console/AC-12). */
|
|
21
|
+
export const ALIASES = {
|
|
22
|
+
setup: ['autopilot', 'setup'],
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Split a command line into words. Single and double quotes group; a backslash
|
|
26
|
+
* escapes the next character outside single quotes. No expansion of any kind —
|
|
27
|
+
* the words become argv elements, never shell input.
|
|
28
|
+
*/
|
|
29
|
+
export function splitWords(line) {
|
|
30
|
+
const words = [];
|
|
31
|
+
let word = '';
|
|
32
|
+
let inWord = false;
|
|
33
|
+
let quote = null;
|
|
34
|
+
for (let i = 0; i < line.length; i++) {
|
|
35
|
+
const c = line[i];
|
|
36
|
+
if (quote !== null) {
|
|
37
|
+
if (c === quote)
|
|
38
|
+
quote = null;
|
|
39
|
+
else if (c === '\\' && quote === '"' && i + 1 < line.length)
|
|
40
|
+
word += line[++i];
|
|
41
|
+
else
|
|
42
|
+
word += c;
|
|
43
|
+
}
|
|
44
|
+
else if (c === '"' || c === "'") {
|
|
45
|
+
quote = c;
|
|
46
|
+
inWord = true;
|
|
47
|
+
}
|
|
48
|
+
else if (c === '\\' && i + 1 < line.length) {
|
|
49
|
+
word += line[++i];
|
|
50
|
+
inWord = true;
|
|
51
|
+
}
|
|
52
|
+
else if (/\s/.test(c)) {
|
|
53
|
+
if (inWord)
|
|
54
|
+
words.push(word);
|
|
55
|
+
word = '';
|
|
56
|
+
inWord = false;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
word += c;
|
|
60
|
+
inWord = true;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (inWord)
|
|
64
|
+
words.push(word);
|
|
65
|
+
return words;
|
|
66
|
+
}
|
|
67
|
+
/** Route one typed line (aidlc-console/AC-10). */
|
|
68
|
+
export function routeLine(line) {
|
|
69
|
+
const text = line.trim();
|
|
70
|
+
if (text === '')
|
|
71
|
+
return { kind: 'blank' };
|
|
72
|
+
if (text.startsWith('!')) {
|
|
73
|
+
const cmd = text.slice(1).trim();
|
|
74
|
+
return cmd === '' ? { kind: 'blank' } : { kind: 'shell', cmd };
|
|
75
|
+
}
|
|
76
|
+
if (!text.startsWith('/'))
|
|
77
|
+
return { kind: 'agent', text };
|
|
78
|
+
const words = splitWords(text.slice(1));
|
|
79
|
+
const [name, ...args] = words;
|
|
80
|
+
// `/` alone is the discoverable way in (aidlc-console/AC-17).
|
|
81
|
+
if (name === undefined)
|
|
82
|
+
return { kind: 'console', name: 'help', args: [] };
|
|
83
|
+
if (name in CONSOLE_COMMANDS)
|
|
84
|
+
return { kind: 'console', name, args };
|
|
85
|
+
// `aidlc menu` opens this console; run from inside it, it would open a second one.
|
|
86
|
+
if (name === 'menu')
|
|
87
|
+
return { kind: 'console', name, args };
|
|
88
|
+
const alias = ALIASES[name];
|
|
89
|
+
return { kind: 'command', argv: alias ? [...alias, ...args] : [name, ...args] };
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Tab completion for a `/` command name (aidlc-console/AC-18). Only the first
|
|
93
|
+
* word completes; returns readline's `[matches, substring]` shape.
|
|
94
|
+
*/
|
|
95
|
+
export function completeSlash(line, names) {
|
|
96
|
+
if (!line.startsWith('/') || /\s/.test(line))
|
|
97
|
+
return [[], line];
|
|
98
|
+
const all = [...new Set([...Object.keys(CONSOLE_COMMANDS), ...Object.keys(ALIASES), ...names])].sort();
|
|
99
|
+
const hits = all.filter((n) => `/${n}`.startsWith(line)).map((n) => `/${n}`);
|
|
100
|
+
return [hits, line];
|
|
101
|
+
}
|
|
102
|
+
/** The `/help` listing: console commands, then the old menu's commands (aidlc-console/AC-13, AC-17). */
|
|
103
|
+
export function helpLines() {
|
|
104
|
+
const rows = [
|
|
105
|
+
...Object.entries(CONSOLE_COMMANDS).filter(([n]) => n !== 'quit').map(([n, d]) => [`/${n}`, d]),
|
|
106
|
+
['/setup', 'Set up autopilot (aidlc autopilot setup)'],
|
|
107
|
+
...ROSTER.map((e) => [`/${e.path.join(' ')}`, e.label]),
|
|
108
|
+
];
|
|
109
|
+
const width = Math.max(...rows.map(([c]) => c.length));
|
|
110
|
+
return [
|
|
111
|
+
'Type words to talk to the agent, /command to run aidlc, !command to run a shell command.',
|
|
112
|
+
'',
|
|
113
|
+
...rows.map(([c, d]) => ` ${c.padEnd(width)} ${d}`),
|
|
114
|
+
'',
|
|
115
|
+
'Any other aidlc command works too: /autopilot run, /roadmap next, /status --json …',
|
|
116
|
+
];
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=route.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../src/console/route.ts"],"names":[],"mappings":"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"}
|