autodev-cli 1.4.190 → 1.4.192

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.
@@ -0,0 +1,28 @@
1
+ export interface PendingSteer {
2
+ /** A2A delivery id — the dedup key (a reconnect-replay carries the same id). */
3
+ id: string;
4
+ /** The steer text (already trimmed / attachment-folded by the caller). */
5
+ text: string;
6
+ /** Enqueue time (ms since epoch). */
7
+ ts: number;
8
+ }
9
+ export declare const PENDING_STEERS_FILE = ".autodev/pending-steers.jsonl";
10
+ /**
11
+ * Read + parse the queue, deduped by id (last write wins), skipping any malformed
12
+ * / partially-written lines. Returns [] when the file is absent. PURE read.
13
+ */
14
+ export declare function readPendingSteers(root: string): PendingSteer[];
15
+ /** True if a steer with this id is already queued. */
16
+ export declare function hasPendingSteer(root: string, id: string): boolean;
17
+ /**
18
+ * Append a steer to the queue unless one with the same id is already present
19
+ * (dedup). Returns true if it was newly enqueued, false if it was a duplicate
20
+ * (or could not be written). Best-effort; a write failure is swallowed.
21
+ */
22
+ export declare function enqueuePendingSteer(root: string, steer: PendingSteer): boolean;
23
+ /**
24
+ * Remove the steer with this id from the queue by rewriting the file without it.
25
+ * Best-effort. When the queue becomes empty the file is left as an empty file
26
+ * (readPendingSteers treats it as []).
27
+ */
28
+ export declare function removePendingSteer(root: string, id: string): void;
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ // ---------------------------------------------------------------------------
3
+ // Durable steer queue — `.autodev/pending-steers.jsonl`.
4
+ //
5
+ // A mid-run STEER delivered to a persistent ACP process (grok / opencode) used to
6
+ // be acked (marked seen server-side) the MOMENT it was handed to the process. If
7
+ // the loop/session restarted BEFORE that steered turn actually ran, the steer was
8
+ // silently LOST (the office had already stopped re-delivering it). This queue makes
9
+ // steers survive a restart with AT-LEAST-ONCE delivery:
10
+ //
11
+ // • A steer is APPENDED here BEFORE it is acked.
12
+ // • The server ack (onDelivered) + local removal fire only AFTER the steered turn
13
+ // COMPLETES — never merely on hand-off to the process.
14
+ // • On (re)start the loop DRAINS this file, re-delivering each queued steer to the
15
+ // live AcpSession as a loop-tracked turn, removing it only on completion.
16
+ // • Dedup is by `id` (the A2A delivery id): a server reconnect-replay of a still-
17
+ // queued steer, or one already completed, is a no-op.
18
+ //
19
+ // Deliberately NOT TODO.md: grok rewrites TODO.md mid-turn (taskLoop.ts:1212-1218)
20
+ // and would clobber an appended steer. This is a separate, append-only journal.
21
+ //
22
+ // One loop process owns a given root, so plain sync fs (append + rewrite) is safe;
23
+ // malformed / partially-written lines are skipped on read so a torn append (a kill
24
+ // mid-write) never poisons the queue.
25
+ // ---------------------------------------------------------------------------
26
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
27
+ if (k2 === undefined) k2 = k;
28
+ var desc = Object.getOwnPropertyDescriptor(m, k);
29
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
30
+ desc = { enumerable: true, get: function() { return m[k]; } };
31
+ }
32
+ Object.defineProperty(o, k2, desc);
33
+ }) : (function(o, m, k, k2) {
34
+ if (k2 === undefined) k2 = k;
35
+ o[k2] = m[k];
36
+ }));
37
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
38
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
39
+ }) : function(o, v) {
40
+ o["default"] = v;
41
+ });
42
+ var __importStar = (this && this.__importStar) || (function () {
43
+ var ownKeys = function(o) {
44
+ ownKeys = Object.getOwnPropertyNames || function (o) {
45
+ var ar = [];
46
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
47
+ return ar;
48
+ };
49
+ return ownKeys(o);
50
+ };
51
+ return function (mod) {
52
+ if (mod && mod.__esModule) return mod;
53
+ var result = {};
54
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
55
+ __setModuleDefault(result, mod);
56
+ return result;
57
+ };
58
+ })();
59
+ Object.defineProperty(exports, "__esModule", { value: true });
60
+ exports.PENDING_STEERS_FILE = void 0;
61
+ exports.readPendingSteers = readPendingSteers;
62
+ exports.hasPendingSteer = hasPendingSteer;
63
+ exports.enqueuePendingSteer = enqueuePendingSteer;
64
+ exports.removePendingSteer = removePendingSteer;
65
+ const fs = __importStar(require("fs"));
66
+ const path = __importStar(require("path"));
67
+ exports.PENDING_STEERS_FILE = '.autodev/pending-steers.jsonl';
68
+ function filePath(root) {
69
+ return path.join(root, exports.PENDING_STEERS_FILE);
70
+ }
71
+ /**
72
+ * Read + parse the queue, deduped by id (last write wins), skipping any malformed
73
+ * / partially-written lines. Returns [] when the file is absent. PURE read.
74
+ */
75
+ function readPendingSteers(root) {
76
+ let raw;
77
+ try {
78
+ raw = fs.readFileSync(filePath(root), 'utf8');
79
+ }
80
+ catch {
81
+ return [];
82
+ }
83
+ const byId = new Map();
84
+ for (const line of raw.split('\n')) {
85
+ const t = line.trim();
86
+ if (!t) {
87
+ continue;
88
+ }
89
+ let obj;
90
+ try {
91
+ obj = JSON.parse(t);
92
+ }
93
+ catch {
94
+ continue;
95
+ } // torn / bad line → skip
96
+ const o = obj;
97
+ if (!o || typeof o.id !== 'string' || typeof o.text !== 'string') {
98
+ continue;
99
+ }
100
+ byId.set(o.id, { id: o.id, text: o.text, ts: typeof o.ts === 'number' ? o.ts : Date.now() });
101
+ }
102
+ // Preserve first-seen order (Map keeps insertion order; last-value wins but the
103
+ // key's position is its first insertion, which is the delivery order we want).
104
+ return [...byId.values()];
105
+ }
106
+ /** True if a steer with this id is already queued. */
107
+ function hasPendingSteer(root, id) {
108
+ return readPendingSteers(root).some((s) => s.id === id);
109
+ }
110
+ /**
111
+ * Append a steer to the queue unless one with the same id is already present
112
+ * (dedup). Returns true if it was newly enqueued, false if it was a duplicate
113
+ * (or could not be written). Best-effort; a write failure is swallowed.
114
+ */
115
+ function enqueuePendingSteer(root, steer) {
116
+ if (hasPendingSteer(root, steer.id)) {
117
+ return false;
118
+ }
119
+ try {
120
+ fs.mkdirSync(path.dirname(filePath(root)), { recursive: true });
121
+ fs.appendFileSync(filePath(root), JSON.stringify(steer) + '\n', 'utf8');
122
+ return true;
123
+ }
124
+ catch {
125
+ return false;
126
+ }
127
+ }
128
+ /**
129
+ * Remove the steer with this id from the queue by rewriting the file without it.
130
+ * Best-effort. When the queue becomes empty the file is left as an empty file
131
+ * (readPendingSteers treats it as []).
132
+ */
133
+ function removePendingSteer(root, id) {
134
+ const remaining = readPendingSteers(root).filter((s) => s.id !== id);
135
+ try {
136
+ if (remaining.length === 0) {
137
+ fs.writeFileSync(filePath(root), '', 'utf8');
138
+ }
139
+ else {
140
+ fs.writeFileSync(filePath(root), remaining.map((s) => JSON.stringify(s)).join('\n') + '\n', 'utf8');
141
+ }
142
+ }
143
+ catch { /* ignore */ }
144
+ }
145
+ //# sourceMappingURL=pendingSteers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pendingSteers.js","sourceRoot":"","sources":["../src/pendingSteers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,197 @@
1
+ /** Callbacks the host injects so hook emission + redaction stay in one place. */
2
+ export interface AcpHostHooks {
3
+ /** Emit ONE hook event (host adds redaction + provider tagging). */
4
+ emitHook(name: string, extra: Record<string, unknown>): void;
5
+ /** Human log line. */
6
+ log(msg: string): void;
7
+ }
8
+ export interface AcpTurnResult {
9
+ clean: boolean;
10
+ stopReason: string;
11
+ error?: string;
12
+ /** True when the turn ended clean but produced NO assistant text / tool calls
13
+ * (e.g. an unusable model). Lets the host surface a clear log instead of
14
+ * silently spinning. */
15
+ emptyOutput?: boolean;
16
+ }
17
+ /** A decoded session/update notification (pure; unit-tested). */
18
+ export type AcpUpdate = {
19
+ kind: 'assistant';
20
+ text: string;
21
+ } | {
22
+ kind: 'reasoning';
23
+ text: string;
24
+ } | {
25
+ kind: 'tool_call';
26
+ id: string;
27
+ name: string;
28
+ input: unknown;
29
+ } | {
30
+ kind: 'tool_result';
31
+ id: string;
32
+ outputText: string;
33
+ status: string;
34
+ } | {
35
+ kind: 'other';
36
+ };
37
+ /** Provider-specific launch + decode configuration. */
38
+ export interface AcpLaunchSpec {
39
+ /** Build the argv (after the binary) for `spawn`. */
40
+ buildArgs(model: string | undefined, extraArgs: string[]): string[];
41
+ /** Decode a raw JSON-RPC session/update into an AcpUpdate. Defaults to the
42
+ * standard-ACP decoder (`decodeAcpUpdateStandard`). */
43
+ decodeUpdate?: (msg: unknown) => AcpUpdate;
44
+ /** Title attached to narration (Notification) hooks. */
45
+ narrationTitle: string;
46
+ /** Forward agent_thought_chunk as narration too (default false). */
47
+ narrateReasoning?: boolean;
48
+ }
49
+ /**
50
+ * STANDARD-ACP decoder (opencode, and the generic default). Handles the ACP-spec
51
+ * session/update shapes:
52
+ * agent_message_chunk {content:{type:'text',text}} -> assistant
53
+ * agent_thought_chunk {content:{type:'text',text}} -> reasoning
54
+ * tool_call {toolCallId,title,rawInput} -> tool_call (name=title)
55
+ * tool_call_update {toolCallId,status,content|rawOutput} -> tool_result
56
+ * Anything else (available_commands_update, usage_update, plan, …) -> other. PURE.
57
+ */
58
+ export declare function decodeAcpUpdateStandard(msg: unknown): AcpUpdate;
59
+ /** Best-effort flatten of a tool_call_update's output into a short string. PURE. */
60
+ export declare function extractToolOutput(u: Record<string, unknown>): string;
61
+ /**
62
+ * Classify a session/prompt RESULT into clean-vs-error for the exit file. PURE.
63
+ * - end_turn / max_tokens / max_turn_requests → clean (exit 0)
64
+ * - cancelled → clean (an intentional interrupt, not a failure)
65
+ * - a JSON-RPC error, or any other stopReason → error (exit 1)
66
+ */
67
+ export declare function classifyAcpResult(result: {
68
+ result?: {
69
+ stopReason?: string;
70
+ };
71
+ error?: {
72
+ message?: string;
73
+ };
74
+ }): AcpTurnResult;
75
+ /**
76
+ * One persistent ACP process for a workspace root. Not a singleton — the host
77
+ * keeps a Map<root, AcpSession> and reuses it. Provider behaviour is injected via
78
+ * the `spec`.
79
+ */
80
+ export declare class AcpSession {
81
+ protected readonly root: string;
82
+ protected readonly model: string | undefined;
83
+ protected readonly bin: string;
84
+ protected readonly hooks: AcpHostHooks;
85
+ protected readonly extraArgs: string[];
86
+ protected readonly spec: AcpLaunchSpec;
87
+ /** Extra env vars merged into the child's environment (e.g. OPENCODE_CONFIG). */
88
+ protected readonly extraEnv: Record<string, string>;
89
+ private readonly _decode;
90
+ private child;
91
+ private buf;
92
+ private nextId;
93
+ private readonly pending;
94
+ private _sessionId;
95
+ private _wantSessionId;
96
+ private _ready;
97
+ private _busy;
98
+ private _startCount;
99
+ private earlyStderr;
100
+ /** True WHILE session/load is replaying prior history — every session/update
101
+ * during the replay is dropped (emits ZERO hooks) so a (re)start never
102
+ * re-spams historical narration + tool_calls to the office feed (Layer A.1). */
103
+ private _loading;
104
+ /** The active PRIMARY turn's stdout sink (assistant text). Null between turns. */
105
+ private _sink;
106
+ /** Tool-call names by id, so a tool_result can carry the originating name. */
107
+ private readonly _toolNames;
108
+ /** Accumulates assistant chunks so Notification hooks are line-granular. */
109
+ private _narrationBuf;
110
+ /** The current tool activity label (set on tool_call, cleared on result). */
111
+ private _activity;
112
+ /** Did the active turn produce ANY assistant text or tool call? (empty-turn guard) */
113
+ private _turnHadOutput;
114
+ /** ALL outstanding session/prompt promises — the primary turn AND any steered
115
+ * (queued) continuation prompts. The turn is not "done" until this drains, so
116
+ * the loop keeps the agent WORKING through steers instead of going idle while
117
+ * the agent runs an untracked queued turn (Bug A). */
118
+ private readonly _inflight;
119
+ constructor(opts: {
120
+ root: string;
121
+ model?: string;
122
+ bin: string;
123
+ hooks: AcpHostHooks;
124
+ spec: AcpLaunchSpec;
125
+ initialSessionId?: string;
126
+ extraArgs?: string[];
127
+ extraEnv?: Record<string, string>;
128
+ });
129
+ /** Per-turn watchdog budget (ms). Env: AUTODEV_ACP_MAX_RUN_MS, else GROK_MAX_RUN_MS
130
+ * (parity with the headless path), else 20 minutes. A 0/negative value disables. */
131
+ static maxRunMs(): number;
132
+ get pid(): number | undefined;
133
+ get sessionId(): string | undefined;
134
+ get activity(): string | undefined;
135
+ /** Busy while the primary turn is running OR any steered/queued prompt is still
136
+ * in-flight — so the loop never treats the agent as idle mid-queue (Bug A). */
137
+ isBusy(): boolean;
138
+ isAlive(): boolean;
139
+ /** Spawn + initialize + session/new|load, once. Respawns transparently if dead. */
140
+ ensureReady(): Promise<void>;
141
+ private _startup;
142
+ private _spawnChild;
143
+ private _onExit;
144
+ private _onStdout;
145
+ private _handle;
146
+ private _onUpdate;
147
+ /**
148
+ * Bug B invariant: every forwarded tool-START must get a matching tool-END. On
149
+ * turn end / cancel / teardown, FLUSH any tool_call ids still open (never got a
150
+ * terminal tool_call_update) as ended, so pixel-office (which pairs start→end)
151
+ * never shows a tool stuck "running" after the agent is idle.
152
+ */
153
+ private _flushOpenTools;
154
+ /** Emit completed narration lines as Notification hooks. `final` flushes the
155
+ * trailing partial line (turn end). Keeps the office feed line-granular. */
156
+ private _flushNarration;
157
+ /**
158
+ * Run ONE primary turn: send the prompt and await turn end. Streams assistant
159
+ * text to `sink`. Emits Stop/StopFailure + SessionEnd. The process stays alive.
160
+ */
161
+ runTurn(promptText: string, sink: (text: string) => void): Promise<AcpTurnResult>;
162
+ /**
163
+ * Deliver a mid-run STEER: send an additional session/prompt the agent QUEUES
164
+ * (FIFO) and runs next — without exiting. The prompt is TRACKED in `_inflight`
165
+ * so the in-progress runTurn drains it before finishing (Bug A) — the steered
166
+ * turn's session/update hooks are forwarded like a normal turn and the loop
167
+ * stays WORKING until it completes. Returns true if handed to the live agent.
168
+ */
169
+ steer(text: string): boolean;
170
+ /**
171
+ * Like {@link steer}, but returns a promise that resolves when THAT steered
172
+ * turn actually COMPLETES (grok/opencode runs the queued session/prompt to its
173
+ * stopReason) — or null if it can't be delivered (dead/no session). The prompt
174
+ * is tracked in `_inflight` exactly like `steer()`, so an active runTurn drains
175
+ * it (Bug A). Used by the durable-steer queue to ack / de-queue a steer only on
176
+ * completion, so a restart mid-steer re-delivers it (at-least-once).
177
+ */
178
+ steerTracked(text: string): Promise<AcpTurnResult> | null;
179
+ /** Send a tracked session/prompt (primary or steer) and register it in
180
+ * `_inflight` until it resolves. */
181
+ private _promptRequest;
182
+ /** Wait until every in-flight/queued prompt has resolved. */
183
+ private _drainInflight;
184
+ /**
185
+ * Send a QUIET prompt (e.g. `/compact`) and await it WITHOUT emitting the
186
+ * Stop/SessionEnd turn-boundary hooks — used for maintenance commands so they
187
+ * don't register as a task turn. Best-effort.
188
+ */
189
+ sendQuiet(text: string): Promise<void>;
190
+ /** Cancel the running turn (process stays alive). */
191
+ cancel(): void;
192
+ /** Kill the persistent process. Preserves the known session id for a later load. */
193
+ close(): void;
194
+ private _request;
195
+ private _send;
196
+ get stderrSnapshot(): string;
197
+ }