@rasensio/aidlc 1.78.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/package.json +2 -2
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The console loop (aidlc-console/AC-1, aidlc-console/AC-8, aidlc-console/AC-9,
|
|
3
|
+
* aidlc-console/AC-11, aidlc-console/AC-14, aidlc-console/AC-15,
|
|
4
|
+
* aidlc-console/AC-16, aidlc-console/AC-19, aidlc-console/AC-25,
|
|
5
|
+
* aidlc-console/AC-27, aidlc-console/AC-28, aidlc-console/AC-29,
|
|
6
|
+
* aidlc-console/AC-31, aidlc-console/AC-33, aidlc-console/AC-34).
|
|
7
|
+
*
|
|
8
|
+
* Every effect goes through `ConsoleDeps`, so tests drive the loop with scripted
|
|
9
|
+
* input and read back what it wrote. The loop itself writes no file: commands the
|
|
10
|
+
* user runs do (aidlc-console/AC-5).
|
|
11
|
+
*
|
|
12
|
+
* @module
|
|
13
|
+
*/
|
|
14
|
+
import type { PausePhase } from '../autopilot/stops.js';
|
|
15
|
+
import type { Prompter } from '../core/prompt.js';
|
|
16
|
+
import { type ItemView } from './autopilot-view.js';
|
|
17
|
+
import { type Harness } from './harness.js';
|
|
18
|
+
export type Input = {
|
|
19
|
+
kind: 'line';
|
|
20
|
+
text: string;
|
|
21
|
+
} | {
|
|
22
|
+
kind: 'toggle';
|
|
23
|
+
} | {
|
|
24
|
+
kind: 'focus';
|
|
25
|
+
} | {
|
|
26
|
+
kind: 'eof';
|
|
27
|
+
};
|
|
28
|
+
export interface ConsoleIO {
|
|
29
|
+
/**
|
|
30
|
+
* Wait for one input. While waiting, `tick` runs every 2 s and the lines it
|
|
31
|
+
* returns are printed above the prompt, keeping what the user has typed.
|
|
32
|
+
*/
|
|
33
|
+
read(prompt: string, tick: () => string[], complete: (line: string) => [string[], string]): Promise<Input>;
|
|
34
|
+
write(text: string): void;
|
|
35
|
+
/** Replace the last frame drawn with `lines`; `write` ends a frame. */
|
|
36
|
+
frame(lines: string[]): void;
|
|
37
|
+
/** One key, for the focused autopilot section. */
|
|
38
|
+
key(): Promise<string>;
|
|
39
|
+
columns(): number | undefined;
|
|
40
|
+
/** Run `run` with stdout and stderr shown and also collected. */
|
|
41
|
+
capture<T>(run: () => Promise<T>): Promise<{
|
|
42
|
+
value: T;
|
|
43
|
+
output: string;
|
|
44
|
+
}>;
|
|
45
|
+
}
|
|
46
|
+
export interface TurnProcess {
|
|
47
|
+
/** `missing`: the program could not start. `interrupted`: Ctrl-C stopped it. */
|
|
48
|
+
done: Promise<{
|
|
49
|
+
code: number | null;
|
|
50
|
+
missing: boolean;
|
|
51
|
+
interrupted: boolean;
|
|
52
|
+
}>;
|
|
53
|
+
}
|
|
54
|
+
export interface AutopilotAccess {
|
|
55
|
+
items(): {
|
|
56
|
+
view: ItemView;
|
|
57
|
+
worktree: string;
|
|
58
|
+
review?: PausePhase;
|
|
59
|
+
}[];
|
|
60
|
+
running(): boolean;
|
|
61
|
+
read(path: string): string | null;
|
|
62
|
+
logs: string;
|
|
63
|
+
approve(name: string): void;
|
|
64
|
+
forget(name: string): void;
|
|
65
|
+
}
|
|
66
|
+
export interface ConsoleDeps {
|
|
67
|
+
io: ConsoleIO;
|
|
68
|
+
prompter: Prompter;
|
|
69
|
+
version: string;
|
|
70
|
+
harness: Harness;
|
|
71
|
+
standing(agent: string): string[];
|
|
72
|
+
latestVersion(): Promise<string | null>;
|
|
73
|
+
/** Top-level command names, for completion. */
|
|
74
|
+
commandNames(): string[];
|
|
75
|
+
/** Required positionals `argv` leaves out, by name; null when its first word is not a command. */
|
|
76
|
+
missingArgs(argv: string[]): string[] | null;
|
|
77
|
+
/** Run `aidlc <argv>` in-process; false when it failed. */
|
|
78
|
+
runCommand(argv: string[]): Promise<boolean>;
|
|
79
|
+
/** Start one agent turn with `stdin` as its message; `onLine` gets each stdout line. */
|
|
80
|
+
spawnTurn(argv: string[], stdin: string, onLine: (line: string) => void): TurnProcess;
|
|
81
|
+
/** Run a shell line with its output shown; resolves with what it printed. */
|
|
82
|
+
runShell(cmd: string): Promise<{
|
|
83
|
+
code: number | null;
|
|
84
|
+
output: string;
|
|
85
|
+
}>;
|
|
86
|
+
openShell(cwd: string): Promise<void>;
|
|
87
|
+
/** Null outside a git repository. */
|
|
88
|
+
autopilot: AutopilotAccess | null;
|
|
89
|
+
}
|
|
90
|
+
export declare const PROMPT = "\u203A ";
|
|
91
|
+
export declare function runSession(deps: ConsoleDeps): Promise<void>;
|
|
92
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/console/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The console loop (aidlc-console/AC-1, aidlc-console/AC-8, aidlc-console/AC-9,
|
|
3
|
+
* aidlc-console/AC-11, aidlc-console/AC-14, aidlc-console/AC-15,
|
|
4
|
+
* aidlc-console/AC-16, aidlc-console/AC-19, aidlc-console/AC-25,
|
|
5
|
+
* aidlc-console/AC-27, aidlc-console/AC-28, aidlc-console/AC-29,
|
|
6
|
+
* aidlc-console/AC-31, aidlc-console/AC-33, aidlc-console/AC-34).
|
|
7
|
+
*
|
|
8
|
+
* Every effect goes through `ConsoleDeps`, so tests drive the loop with scripted
|
|
9
|
+
* input and read back what it wrote. The loop itself writes no file: commands the
|
|
10
|
+
* user runs do (aidlc-console/AC-5).
|
|
11
|
+
*
|
|
12
|
+
* @module
|
|
13
|
+
*/
|
|
14
|
+
import { changeLines, focusKey, focusLines, logFile, reviewArtifact, tail, } from './autopilot-view.js';
|
|
15
|
+
import { allowSpec, costLine, denialQuestion, HARNESSES, PROGRAM, TurnParser, turnArgv, withPendingOutput, } from './harness.js';
|
|
16
|
+
import { fitWidth } from '../autopilot/watch.js';
|
|
17
|
+
import { completeSlash, helpLines, routeLine } from './route.js';
|
|
18
|
+
import { updateLine } from './standing.js';
|
|
19
|
+
export const PROMPT = '› ';
|
|
20
|
+
const LABEL = { 'claude-code': 'Claude Code', codex: 'Codex' };
|
|
21
|
+
const CODEX_NOTE = 'Codex runs in its workspace-write sandbox and asks no permission questions.';
|
|
22
|
+
/** Lines shown for an artifact or log in the focused section. */
|
|
23
|
+
const SHOW_LINES = 40;
|
|
24
|
+
export async function runSession(deps) {
|
|
25
|
+
const { io } = deps;
|
|
26
|
+
const say = (line) => io.write(`${line}\n`);
|
|
27
|
+
const s = {
|
|
28
|
+
harness: deps.harness,
|
|
29
|
+
session: null,
|
|
30
|
+
allowed: [],
|
|
31
|
+
pending: [],
|
|
32
|
+
costUsd: 0,
|
|
33
|
+
tokens: 0,
|
|
34
|
+
// On by default: it prints only when an item changes, so a quiet run is a quiet console.
|
|
35
|
+
shown: deps.autopilot !== null,
|
|
36
|
+
seen: new Map(),
|
|
37
|
+
notices: [],
|
|
38
|
+
};
|
|
39
|
+
say(`aidlc v${deps.version} — plain words go to ${LABEL[s.harness]}, /help lists commands, Ctrl-D leaves`);
|
|
40
|
+
for (const line of fitWidth(deps.standing(LABEL[s.harness]), io.columns()))
|
|
41
|
+
say(line);
|
|
42
|
+
if (s.harness === 'codex')
|
|
43
|
+
say(CODEX_NOTE);
|
|
44
|
+
s.seen = changeLines(new Map(), views(deps), io.columns()).next;
|
|
45
|
+
// Never awaited before the first prompt (aidlc-console/AC-7).
|
|
46
|
+
void deps.latestVersion().then((latest) => {
|
|
47
|
+
const line = updateLine(latest, deps.version);
|
|
48
|
+
if (line !== null)
|
|
49
|
+
s.notices.push(line);
|
|
50
|
+
}, () => { });
|
|
51
|
+
const tick = () => {
|
|
52
|
+
const out = s.notices.splice(0);
|
|
53
|
+
if (s.shown && deps.autopilot !== null) {
|
|
54
|
+
const changed = changeLines(s.seen, views(deps), io.columns());
|
|
55
|
+
s.seen = changed.next;
|
|
56
|
+
out.push(...changed.lines);
|
|
57
|
+
}
|
|
58
|
+
return out;
|
|
59
|
+
};
|
|
60
|
+
const complete = (line) => completeSlash(line, deps.commandNames());
|
|
61
|
+
for (;;) {
|
|
62
|
+
const input = await io.read(PROMPT, tick, complete);
|
|
63
|
+
if (input.kind === 'eof')
|
|
64
|
+
break;
|
|
65
|
+
if (input.kind === 'toggle') {
|
|
66
|
+
toggle(deps, s);
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (input.kind === 'focus') {
|
|
70
|
+
await focus(deps);
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
const route = routeLine(input.text);
|
|
74
|
+
if (route.kind === 'blank')
|
|
75
|
+
continue;
|
|
76
|
+
if (route.kind === 'console') {
|
|
77
|
+
if (route.name === 'exit' || route.name === 'quit')
|
|
78
|
+
break;
|
|
79
|
+
consoleCommand(deps, s, route.name, route.args);
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (route.kind === 'command')
|
|
83
|
+
await command(deps, s, route.argv);
|
|
84
|
+
else if (route.kind === 'shell')
|
|
85
|
+
await shell(deps, s, route.cmd);
|
|
86
|
+
else
|
|
87
|
+
await agentTurn(deps, s, route.text);
|
|
88
|
+
}
|
|
89
|
+
// Leaving never stops a run: nothing here signals it or writes STOP (aidlc-console/AC-9).
|
|
90
|
+
if (deps.autopilot?.running()) {
|
|
91
|
+
say('autopilot is still running in the background.');
|
|
92
|
+
say('Come back with `aidlc`, or watch it from a plain shell with `aidlc autopilot status --watch`.');
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function views(deps) {
|
|
96
|
+
try {
|
|
97
|
+
return deps.autopilot?.items().map((i) => i.view) ?? [];
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return [];
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function toggle(deps, s) {
|
|
104
|
+
const say = (line) => deps.io.write(`${line}\n`);
|
|
105
|
+
if (deps.autopilot === null) {
|
|
106
|
+
say('autopilot needs a git repository');
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
s.shown = !s.shown;
|
|
110
|
+
if (!s.shown) {
|
|
111
|
+
say('autopilot section hidden — Ctrl-T or /watch shows it');
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const current = changeLines(new Map(), views(deps), deps.io.columns());
|
|
115
|
+
s.seen = current.next;
|
|
116
|
+
say(`autopilot section shown — ${deps.autopilot.running() ? 'run is live' : 'no run is live'}; Tab on an empty prompt focuses it`);
|
|
117
|
+
if (current.lines.length === 0)
|
|
118
|
+
say('autopilot · no items in flight');
|
|
119
|
+
for (const line of current.lines)
|
|
120
|
+
say(line);
|
|
121
|
+
}
|
|
122
|
+
function consoleCommand(deps, s, name, args) {
|
|
123
|
+
const say = (line) => deps.io.write(`${line}\n`);
|
|
124
|
+
if (name === 'help') {
|
|
125
|
+
for (const line of helpLines())
|
|
126
|
+
say(line);
|
|
127
|
+
}
|
|
128
|
+
else if (name === 'menu') {
|
|
129
|
+
say('You are in the console already — /help lists what you can type');
|
|
130
|
+
}
|
|
131
|
+
else if (name === 'watch') {
|
|
132
|
+
toggle(deps, s);
|
|
133
|
+
}
|
|
134
|
+
else if (name === 'new') {
|
|
135
|
+
s.session = null;
|
|
136
|
+
s.allowed = [];
|
|
137
|
+
s.pending = [];
|
|
138
|
+
say(`new ${LABEL[s.harness]} session`);
|
|
139
|
+
}
|
|
140
|
+
else if (name === 'agent') {
|
|
141
|
+
const want = args[0];
|
|
142
|
+
if (want === undefined) {
|
|
143
|
+
say(`agent: ${LABEL[s.harness]} (${s.harness}) — /agent ${HARNESSES.join(' | /agent ')} switches`);
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
if (!HARNESSES.includes(want)) {
|
|
147
|
+
say(`unknown agent "${want}" — choose ${HARNESSES.join(' or ')}`);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
s.harness = want;
|
|
151
|
+
s.session = null;
|
|
152
|
+
s.allowed = [];
|
|
153
|
+
say(`agent: ${LABEL[s.harness]}, new session`);
|
|
154
|
+
if (s.harness === 'codex')
|
|
155
|
+
say(CODEX_NOTE);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
async function command(deps, s, argv) {
|
|
159
|
+
const say = (line) => deps.io.write(`${line}\n`);
|
|
160
|
+
const missing = deps.missingArgs(argv);
|
|
161
|
+
if (missing === null) {
|
|
162
|
+
say(`unknown command /${argv[0]} — /help lists what you can type`);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const values = [];
|
|
166
|
+
for (const name of missing) {
|
|
167
|
+
const answer = await deps.prompter.text({
|
|
168
|
+
message: `/${argv.join(' ')} — ${name}`,
|
|
169
|
+
validate: (v) => (v === undefined || v.trim() === '' ? `${name} is required` : undefined),
|
|
170
|
+
});
|
|
171
|
+
if (!answer.ok) {
|
|
172
|
+
say('cancelled');
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
values.push(answer.value);
|
|
176
|
+
}
|
|
177
|
+
// Prompted values after `--`, as the old menu did, so none is read as an option.
|
|
178
|
+
const full = values.length > 0 ? [...argv, '--', ...values] : argv;
|
|
179
|
+
const line = `aidlc ${[...argv, ...values].join(' ')}`;
|
|
180
|
+
let ok = false;
|
|
181
|
+
let output = '';
|
|
182
|
+
try {
|
|
183
|
+
const r = await deps.io.capture(() => deps.runCommand(full));
|
|
184
|
+
ok = r.value;
|
|
185
|
+
output = r.output;
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
output = err.message;
|
|
189
|
+
say(`error: ${output}`);
|
|
190
|
+
}
|
|
191
|
+
s.pending.push({ line, output });
|
|
192
|
+
if (!ok)
|
|
193
|
+
say(`/${argv.join(' ')} failed`);
|
|
194
|
+
}
|
|
195
|
+
async function shell(deps, s, cmd) {
|
|
196
|
+
const r = await deps.runShell(cmd);
|
|
197
|
+
s.pending.push({ line: cmd, output: r.output });
|
|
198
|
+
if (r.code !== 0)
|
|
199
|
+
deps.io.write(`exit ${r.code ?? 'signal'}\n`);
|
|
200
|
+
}
|
|
201
|
+
async function agentTurn(deps, s, text) {
|
|
202
|
+
const say = (line) => deps.io.write(`${line}\n`);
|
|
203
|
+
let message = withPendingOutput(text, s.pending);
|
|
204
|
+
for (;;) {
|
|
205
|
+
const parser = new TurnParser(s.harness, s.session);
|
|
206
|
+
const turn = deps.spawnTurn(turnArgv(s.harness, s.session, s.allowed), message, (line) => {
|
|
207
|
+
for (const out of parser.push(line))
|
|
208
|
+
say(out);
|
|
209
|
+
});
|
|
210
|
+
const r = await turn.done;
|
|
211
|
+
if (r.missing) {
|
|
212
|
+
say(`${PROGRAM[s.harness]} is not installed or not on PATH — install ${LABEL[s.harness]}, or switch with /agent`);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
const end = parser.end(r.code);
|
|
216
|
+
// The agent has seen the output now, even if the turn was cut short.
|
|
217
|
+
s.pending = [];
|
|
218
|
+
if (end.session !== null)
|
|
219
|
+
s.session = end.session;
|
|
220
|
+
s.costUsd += end.costUsd ?? 0;
|
|
221
|
+
s.tokens += end.tokens ?? 0;
|
|
222
|
+
if (r.interrupted) {
|
|
223
|
+
say('stopped');
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
if (end.error !== null)
|
|
227
|
+
say(`agent error: ${end.error}`);
|
|
228
|
+
const approved = [];
|
|
229
|
+
for (const d of end.denials) {
|
|
230
|
+
const spec = allowSpec(d);
|
|
231
|
+
if (s.allowed.includes(spec) || approved.includes(spec))
|
|
232
|
+
continue;
|
|
233
|
+
const answer = await deps.prompter.confirm({ message: denialQuestion(d), initialValue: false });
|
|
234
|
+
if (answer.ok && answer.value)
|
|
235
|
+
approved.push(spec);
|
|
236
|
+
}
|
|
237
|
+
const cost = costLine(s.costUsd, s.tokens);
|
|
238
|
+
if (cost !== null)
|
|
239
|
+
say(cost);
|
|
240
|
+
if (approved.length === 0)
|
|
241
|
+
return;
|
|
242
|
+
s.allowed.push(...approved);
|
|
243
|
+
message = `The user allowed ${approved.join(', ')} for this session. Carry on with what you were doing.`;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
async function focus(deps) {
|
|
247
|
+
const ap = deps.autopilot;
|
|
248
|
+
const say = (line) => deps.io.write(`${line}\n`);
|
|
249
|
+
let count = 0;
|
|
250
|
+
try {
|
|
251
|
+
count = ap?.items().length ?? 0;
|
|
252
|
+
}
|
|
253
|
+
catch (err) {
|
|
254
|
+
say(`error: ${err.message}`);
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
if (count === 0) {
|
|
258
|
+
say('autopilot has no items to focus');
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
let selected = 0;
|
|
262
|
+
for (;;) {
|
|
263
|
+
try {
|
|
264
|
+
if (!(await focusStep()))
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
catch (err) {
|
|
268
|
+
// A state file that does not parse, or a lock that cannot be taken, is shown, not crashed on.
|
|
269
|
+
say(`error: ${err.message}`);
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
/** One key in the focused section; false when focus should end. */
|
|
274
|
+
async function focusStep() {
|
|
275
|
+
const ap = deps.autopilot;
|
|
276
|
+
const items = ap.items();
|
|
277
|
+
if (items.length === 0)
|
|
278
|
+
return false;
|
|
279
|
+
selected = Math.min(selected, items.length - 1);
|
|
280
|
+
deps.io.frame(focusLines(items.map((i) => i.view), selected, deps.io.columns()));
|
|
281
|
+
const step = focusKey(selected, await deps.io.key(), items.length);
|
|
282
|
+
selected = step.selected;
|
|
283
|
+
const item = items[selected];
|
|
284
|
+
const name = item.view.name;
|
|
285
|
+
switch (step.action) {
|
|
286
|
+
case 'leave':
|
|
287
|
+
return false;
|
|
288
|
+
case 'approve':
|
|
289
|
+
ap.approve(name);
|
|
290
|
+
// approve prints its own result; end the frame so the next one does not draw over it.
|
|
291
|
+
deps.io.write('');
|
|
292
|
+
break;
|
|
293
|
+
case 'read': {
|
|
294
|
+
const file = reviewArtifact(ap.read, { name, worktree: item.worktree, review: item.review });
|
|
295
|
+
const text = file === null ? null : ap.read(file);
|
|
296
|
+
if (file === null || text === null) {
|
|
297
|
+
say(`${name}: no artifact to read yet`);
|
|
298
|
+
break;
|
|
299
|
+
}
|
|
300
|
+
const lines = text.split('\n');
|
|
301
|
+
say(file);
|
|
302
|
+
for (const line of lines.slice(0, SHOW_LINES))
|
|
303
|
+
say(line);
|
|
304
|
+
if (lines.length > SHOW_LINES)
|
|
305
|
+
say(`… ${lines.length - SHOW_LINES} more lines`);
|
|
306
|
+
break;
|
|
307
|
+
}
|
|
308
|
+
case 'log': {
|
|
309
|
+
const file = logFile({ logs: ap.logs }, { name });
|
|
310
|
+
const text = ap.read(file);
|
|
311
|
+
if (text === null) {
|
|
312
|
+
say(`${name}: no log yet`);
|
|
313
|
+
break;
|
|
314
|
+
}
|
|
315
|
+
say(file);
|
|
316
|
+
for (const line of tail(text, SHOW_LINES))
|
|
317
|
+
say(line);
|
|
318
|
+
break;
|
|
319
|
+
}
|
|
320
|
+
case 'open':
|
|
321
|
+
say(`opening a shell in ${item.worktree} — exit it to come back`);
|
|
322
|
+
await deps.openShell(item.worktree);
|
|
323
|
+
break;
|
|
324
|
+
case 'forget': {
|
|
325
|
+
const answer = await deps.prompter.confirm({ message: `Forget ${name}? Autopilot stops tracking it.`, initialValue: false });
|
|
326
|
+
if (answer.ok && answer.value)
|
|
327
|
+
ap.forget(name);
|
|
328
|
+
deps.io.write('');
|
|
329
|
+
break;
|
|
330
|
+
}
|
|
331
|
+
default:
|
|
332
|
+
break;
|
|
333
|
+
}
|
|
334
|
+
return true;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/console/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where things stand, printed when the console opens (aidlc-console/AC-4,
|
|
3
|
+
* aidlc-console/AC-5, aidlc-console/AC-6, aidlc-console/AC-7).
|
|
4
|
+
*
|
|
5
|
+
* Reads only. Every reader here is one an existing command already uses, and each
|
|
6
|
+
* failure reads as "nothing to say" rather than an error: a status line that throws
|
|
7
|
+
* would stop the console opening.
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
import { type AutopilotPaths } from '../autopilot/state.js';
|
|
12
|
+
import { type WatchReader } from '../autopilot/watch.js';
|
|
13
|
+
export interface StandingInput {
|
|
14
|
+
projectRoot: string;
|
|
15
|
+
/** Null outside a git repository, where autopilot cannot run. */
|
|
16
|
+
autopilot: AutopilotPaths | null;
|
|
17
|
+
agent: string;
|
|
18
|
+
now: number;
|
|
19
|
+
}
|
|
20
|
+
/** Each part of the summary, read independently so one failure hides only its own line. */
|
|
21
|
+
export interface StandingReaders {
|
|
22
|
+
hasProject(root: string): boolean;
|
|
23
|
+
run(p: AutopilotPaths): boolean;
|
|
24
|
+
items(p: AutopilotPaths): string[][];
|
|
25
|
+
stalled(root: string): {
|
|
26
|
+
name: string;
|
|
27
|
+
phase: string;
|
|
28
|
+
}[];
|
|
29
|
+
inbox(root: string): number;
|
|
30
|
+
next(root: string): string | null;
|
|
31
|
+
}
|
|
32
|
+
export declare function realReaders(reader?: WatchReader, now?: () => number): StandingReaders;
|
|
33
|
+
/** The opening summary (aidlc-console/AC-4, AC-6). */
|
|
34
|
+
export declare function standingLines(input: StandingInput, r: StandingReaders): string[];
|
|
35
|
+
/** Numeric compare of dotted versions; prerelease tags are ignored. */
|
|
36
|
+
export declare function newer(latest: string, current: string): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* The published version, read the way `aidlc update` reads it but without blocking
|
|
39
|
+
* the prompt (aidlc-console/AC-7). Null on any failure or after 10 s.
|
|
40
|
+
*/
|
|
41
|
+
export declare function latestVersion(pkg?: string): Promise<string | null>;
|
|
42
|
+
/** The line for a newer version, or null (aidlc-console/AC-7). */
|
|
43
|
+
export declare function updateLine(latest: string | null, current: string): string | null;
|
|
44
|
+
//# sourceMappingURL=standing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standing.d.ts","sourceRoot":"","sources":["../../src/console/standing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAyB,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAKhF,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,SAAS,EAAE,cAAc,GAAG,IAAI,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,2FAA2F;AAC3F,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAClC,GAAG,CAAC,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC;IAChC,KAAK,CAAC,CAAC,EAAE,cAAc,GAAG,MAAM,EAAE,EAAE,CAAC;IACrC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACzD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CACnC;AAUD,wBAAgB,WAAW,CAAC,MAAM,GAAE,WAAwB,EAAE,GAAG,GAAE,MAAM,MAAiB,GAAG,eAAe,CAY3G;AAED,sDAAsD;AACtD,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,EAAE,CAAC,EAAE,eAAe,GAAG,MAAM,EAAE,CAwBhF;AAED,uEAAuE;AACvE,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAQ9D;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,SAAoB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAO7E;AAED,kEAAkE;AAClE,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEhF"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where things stand, printed when the console opens (aidlc-console/AC-4,
|
|
3
|
+
* aidlc-console/AC-5, aidlc-console/AC-6, aidlc-console/AC-7).
|
|
4
|
+
*
|
|
5
|
+
* Reads only. Every reader here is one an existing command already uses, and each
|
|
6
|
+
* failure reads as "nothing to say" rather than an error: a status line that throws
|
|
7
|
+
* would stop the console opening.
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
import { execFile } from 'node:child_process';
|
|
12
|
+
import { existsSync } from 'node:fs';
|
|
13
|
+
import { join } from 'node:path';
|
|
14
|
+
import { liveRun } from '../autopilot/run.js';
|
|
15
|
+
import { loadState } from '../autopilot/state.js';
|
|
16
|
+
import { fileReader, itemCells } from '../autopilot/watch.js';
|
|
17
|
+
import { stalledInstances } from '../commands/status.js';
|
|
18
|
+
import { pickNext } from '../roadmap/next.js';
|
|
19
|
+
import { listStatus } from '../roadmap/paths.js';
|
|
20
|
+
const safe = (read, fallback) => {
|
|
21
|
+
try {
|
|
22
|
+
return read();
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return fallback;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
export function realReaders(reader = fileReader, now = Date.now) {
|
|
29
|
+
return {
|
|
30
|
+
hasProject: (root) => existsSync(join(root, '.aidlc')),
|
|
31
|
+
run: (p) => liveRun(p) !== null,
|
|
32
|
+
items: (p) => loadState(p).items.map((i) => itemCells(reader, i, now())),
|
|
33
|
+
stalled: (root) => stalledInstances(root),
|
|
34
|
+
inbox: (root) => listStatus(root, 'inbox').length,
|
|
35
|
+
next: (root) => {
|
|
36
|
+
const n = pickNext(root).next;
|
|
37
|
+
return n === null ? null : (n.title ?? n.file);
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/** The opening summary (aidlc-console/AC-4, AC-6). */
|
|
42
|
+
export function standingLines(input, r) {
|
|
43
|
+
const { projectRoot: root } = input;
|
|
44
|
+
if (!safe(() => r.hasProject(root), false)) {
|
|
45
|
+
return [
|
|
46
|
+
'No AIDLC project here yet — /init sets one up.',
|
|
47
|
+
`agent: ${input.agent}`,
|
|
48
|
+
];
|
|
49
|
+
}
|
|
50
|
+
const lines = [];
|
|
51
|
+
if (input.autopilot !== null) {
|
|
52
|
+
const p = input.autopilot;
|
|
53
|
+
const running = safe(() => r.run(p), false);
|
|
54
|
+
const items = safe(() => r.items(p), []);
|
|
55
|
+
lines.push(`autopilot: ${running ? 'running' : 'not running'}${items.length > 0 ? `, ${items.length} item${items.length === 1 ? '' : 's'}` : ''}`);
|
|
56
|
+
// item, step, phase — the first three watch columns.
|
|
57
|
+
for (const cells of items)
|
|
58
|
+
lines.push(` ${cells.slice(0, 3).join(' ')}`);
|
|
59
|
+
}
|
|
60
|
+
const stalled = safe(() => r.stalled(root), []);
|
|
61
|
+
if (stalled.length > 0)
|
|
62
|
+
lines.push(`stalled: ${stalled.map((s) => `${s.name} (${s.phase})`).join(', ')}`);
|
|
63
|
+
const inbox = safe(() => r.inbox(root), 0);
|
|
64
|
+
const next = safe(() => r.next(root), null);
|
|
65
|
+
lines.push(`roadmap: ${inbox} in inbox${next ? `, next: ${next}` : ''}`);
|
|
66
|
+
lines.push(`agent: ${input.agent}`);
|
|
67
|
+
return lines;
|
|
68
|
+
}
|
|
69
|
+
/** Numeric compare of dotted versions; prerelease tags are ignored. */
|
|
70
|
+
export function newer(latest, current) {
|
|
71
|
+
const parts = (v) => v.split('-')[0].split('.').map((n) => Number.parseInt(n, 10) || 0);
|
|
72
|
+
const a = parts(latest);
|
|
73
|
+
const b = parts(current);
|
|
74
|
+
for (let i = 0; i < Math.max(a.length, b.length); i++) {
|
|
75
|
+
if ((a[i] ?? 0) !== (b[i] ?? 0))
|
|
76
|
+
return (a[i] ?? 0) > (b[i] ?? 0);
|
|
77
|
+
}
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* The published version, read the way `aidlc update` reads it but without blocking
|
|
82
|
+
* the prompt (aidlc-console/AC-7). Null on any failure or after 10 s.
|
|
83
|
+
*/
|
|
84
|
+
export function latestVersion(pkg = '@rasensio/aidlc') {
|
|
85
|
+
return new Promise((resolve) => {
|
|
86
|
+
execFile('npm', ['view', pkg, 'dist-tags.latest'], { timeout: 10_000, encoding: 'utf8' }, (err, stdout) => {
|
|
87
|
+
const v = String(stdout ?? '').trim();
|
|
88
|
+
resolve(err || !/^\d+\.\d+\.\d+/.test(v) ? null : v);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
/** The line for a newer version, or null (aidlc-console/AC-7). */
|
|
93
|
+
export function updateLine(latest, current) {
|
|
94
|
+
return latest !== null && newer(latest, current) ? `aidlc ${latest} is available (you have ${current}) — /update installs it` : null;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=standing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standing.js","sourceRoot":"","sources":["../../src/console/standing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The real terminal behind `ConsoleIO` and the console's processes
|
|
3
|
+
* (aidlc-console/AC-18, aidlc-console/AC-19, aidlc-console/AC-28,
|
|
4
|
+
* aidlc-console/AC-29, aidlc-console/AC-32, aidlc-console/AC-33,
|
|
5
|
+
* aidlc-console/AC-34).
|
|
6
|
+
*
|
|
7
|
+
* One reader owns stdin at a time. `read` opens a readline for one input and
|
|
8
|
+
* closes it before returning, so a command's clack prompt, a shell line or an
|
|
9
|
+
* agent turn never shares stdin with the console (design: raw-mode risk).
|
|
10
|
+
*
|
|
11
|
+
* @module
|
|
12
|
+
*/
|
|
13
|
+
import type { ConsoleIO, TurnProcess } from './session.js';
|
|
14
|
+
export declare const TICK_MS = 2000;
|
|
15
|
+
/** Text without terminal escapes, for what the agent is shown. */
|
|
16
|
+
export declare function plain(text: string): string;
|
|
17
|
+
export declare function terminalIO(): ConsoleIO;
|
|
18
|
+
/**
|
|
19
|
+
* One agent turn as a child process. The message goes on stdin (design D3).
|
|
20
|
+
* Ctrl-C stops the turn and nothing else (aidlc-console/AC-29); a program that
|
|
21
|
+
* cannot start reports `missing` (aidlc-console/AC-28).
|
|
22
|
+
*/
|
|
23
|
+
export declare function spawnTurn(cwd: string, argv: string[], stdin: string, onLine: (line: string) => void): TurnProcess;
|
|
24
|
+
/** A `!` line in the user's shell, its output shown and collected (aidlc-console/AC-19). */
|
|
25
|
+
export declare function runShell(cwd: string, cmd: string): Promise<{
|
|
26
|
+
code: number | null;
|
|
27
|
+
output: string;
|
|
28
|
+
}>;
|
|
29
|
+
/** An interactive shell in `cwd`; resolves when the user exits it. */
|
|
30
|
+
export declare function openShell(cwd: string): Promise<void>;
|
|
31
|
+
//# sourceMappingURL=terminal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/console/terminal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAS,WAAW,EAAE,MAAM,cAAc,CAAC;AAElE,eAAO,MAAM,OAAO,OAAO,CAAC;AAI5B,kEAAkE;AAClE,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1C;AAED,wBAAgB,UAAU,IAAI,SAAS,CAuItC;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,WAAW,CA0BjH;AAED,4FAA4F;AAC5F,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAanG;AAED,sEAAsE;AACtE,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMpD"}
|