autodev-cli 1.4.208 → 1.4.210

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/out/todo.d.ts CHANGED
@@ -29,6 +29,16 @@ export declare function resetAllInProgress(filePath: string): void;
29
29
  export declare function markDone(filePath: string, task: Task): void;
30
30
  /** Append a new task line to the ## Todo section (at the bottom, before the next heading). */
31
31
  export declare function appendTask(filePath: string, text: string, id?: string): string;
32
+ /**
33
+ * Idempotent-by-id append. If a task line carrying `id` already exists in the
34
+ * file (in ANY section — Todo / In Progress / Done), this is a no-op and returns
35
+ * the id unchanged; otherwise it appends like {@link appendTask}. This is the
36
+ * guard the WS verify-poller relies on: re-appending a clobbered task must never
37
+ * produce a duplicate line, even if a concurrent write re-added it first (the
38
+ * read + append run inside the per-file serialisation queue — see
39
+ * TodoWriteManager.appendIfAbsent).
40
+ */
41
+ export declare function appendTaskIfAbsent(filePath: string, text: string, id: string): string;
32
42
  /**
33
43
  * Move all completed `[x]` lines from `todoPath` into
34
44
  * `<workspaceRoot>/DONE.md`, grouped under a dated heading.
package/out/todo.js CHANGED
@@ -43,6 +43,7 @@ exports.resetToTodo = resetToTodo;
43
43
  exports.resetAllInProgress = resetAllInProgress;
44
44
  exports.markDone = markDone;
45
45
  exports.appendTask = appendTask;
46
+ exports.appendTaskIfAbsent = appendTaskIfAbsent;
46
47
  exports.pruneTodoToArchive = pruneTodoToArchive;
47
48
  const fs = __importStar(require("fs"));
48
49
  const path = __importStar(require("path"));
@@ -280,6 +281,24 @@ function appendTask(filePath, text, id) {
280
281
  fs.writeFileSync(filePath, content, 'utf8');
281
282
  return taskId;
282
283
  }
284
+ /**
285
+ * Idempotent-by-id append. If a task line carrying `id` already exists in the
286
+ * file (in ANY section — Todo / In Progress / Done), this is a no-op and returns
287
+ * the id unchanged; otherwise it appends like {@link appendTask}. This is the
288
+ * guard the WS verify-poller relies on: re-appending a clobbered task must never
289
+ * produce a duplicate line, even if a concurrent write re-added it first (the
290
+ * read + append run inside the per-file serialisation queue — see
291
+ * TodoWriteManager.appendIfAbsent).
292
+ */
293
+ function appendTaskIfAbsent(filePath, text, id) {
294
+ if (fs.existsSync(filePath)) {
295
+ const content = fs.readFileSync(filePath, 'utf8');
296
+ if (parseTodoContent(content).some(t => t.id === id)) {
297
+ return id;
298
+ }
299
+ }
300
+ return appendTask(filePath, text, id);
301
+ }
283
302
  function escapeRegex(s) {
284
303
  return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
285
304
  }
package/out/todo.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"todo.js","sourceRoot":"","sources":["../src/todo.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"todo.js","sourceRoot":"","sources":["../src/todo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ export interface TodoState {
2
+ /** Ids present in TODO.md as an open task ([ ] todo or [~] in-progress). */
3
+ present: Set<string>;
4
+ /** Ids present in TODO.md as a completed task ([x] done). */
5
+ done: Set<string>;
6
+ }
7
+ export interface TodoTaskVerifierOptions {
8
+ /** Poll interval. Default 10s ("poll every 10s until written, then stop"). */
9
+ intervalMs?: number;
10
+ /** Consecutive present ticks required before a task is considered durable. */
11
+ confirmTicks?: number;
12
+ /** Read the current TODO.md task ids, split by status. Must not throw fatally. */
13
+ readState: () => TodoState;
14
+ /** Idempotent-by-id (re-)append of a clobbered/missing task. */
15
+ appendIfAbsent: (id: string, payload: string) => Promise<void>;
16
+ /** Send the deferred task_ack once the task is confirmed durably present. */
17
+ sendAck: (dbTaskId: string) => void;
18
+ /** Fired after a re-append so callers can nudge the loop (optional). */
19
+ onReappended?: () => void;
20
+ log?: (msg: string) => void;
21
+ }
22
+ export declare class TodoTaskVerifier {
23
+ private readonly _opts;
24
+ private readonly _tasks;
25
+ private _timer;
26
+ private readonly _intervalMs;
27
+ private readonly _confirmTicks;
28
+ constructor(_opts: TodoTaskVerifierOptions);
29
+ /** Is this task id currently being tracked (not yet confirmed durable)? */
30
+ has(id: string): boolean;
31
+ /** Number of tasks awaiting durable confirmation. */
32
+ get size(): number;
33
+ /**
34
+ * Register a delivered task for verification. Idempotent by id — re-tracking
35
+ * the same id (e.g. the office re-pushed the same DB task under a new delivery
36
+ * id) refreshes the payload/dbTaskId without resetting its progress. Starts
37
+ * the poller if it was idle.
38
+ */
39
+ track(id: string, payload: string, dbTaskId?: string): void;
40
+ /** Stop tracking a task (e.g. it was cancelled/removed upstream). */
41
+ forget(id: string): void;
42
+ /**
43
+ * One verification pass. Public so tests can drive it deterministically; the
44
+ * timer simply calls it on an interval.
45
+ */
46
+ tick(): void;
47
+ /** Stop the poller and clear all tracked tasks (loop teardown). */
48
+ stop(): void;
49
+ private _ensureTimer;
50
+ private _stopTimer;
51
+ private _log;
52
+ }
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ // ---------------------------------------------------------------------------
3
+ // TodoTaskVerifier — verify-and-re-append backstop for WS-pushed tasks.
4
+ //
5
+ // THE BUG IT FIXES
6
+ // A task pushed over the WS (the `user_message` A2A frame) used to be appended
7
+ // to TODO.md immediately and ACKed (task_ack → the office stamps delivered_at
8
+ // and permanently drops the task from its 45s redelivery sweep) in the same
9
+ // breath. A grok-acp agent, however, REWRITES TODO.md during its own turn
10
+ // (taskLoop.ts clobber — see pendingSteers.ts header), so the just-appended
11
+ // line is wiped: the task was acked-as-delivered, written, overwritten, and
12
+ // never re-pushed. Steers survive this via the durable-steer queue; tasks had
13
+ // no such protection.
14
+ //
15
+ // THE FIX (this module is the backbone)
16
+ // • track(id, payload, dbTaskId) registers a delivered task.
17
+ // • A poller tick (~10s) reads which task ids are currently in TODO.md:
18
+ // – ABSENT → (re-)append it idempotently-by-id (a grok clobber is
19
+ // repaired on the next tick), and reset its confirmation count.
20
+ // – PRESENT → increment a consecutive-present counter; once it has been
21
+ // present for `confirmTicks` ticks in a row the task is
22
+ // DURABLE: send the deferred task_ack and stop tracking it.
23
+ // – DONE → the agent finished it; stop tracking immediately and never
24
+ // re-append (prevents resurrecting a completed/pruned task).
25
+ // • The ack is DEFERRED until durable-present, so the office's 45s sweep stays
26
+ // armed as a backstop: if the CLI dies before the line is durable, the
27
+ // office re-pushes it.
28
+ //
29
+ // Re-append idempotency is guaranteed by the injected appendIfAbsent (the
30
+ // presence check + append run inside TodoWriteManager's per-file queue), so no
31
+ // duplicate line is ever produced even under a concurrent write.
32
+ //
33
+ // This is deliberately a small, side-effect-injected unit (no socket, no fs of
34
+ // its own) so it is directly unit-testable — see test/todoTaskVerifier.smoke.mjs.
35
+ // ---------------------------------------------------------------------------
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.TodoTaskVerifier = void 0;
38
+ class TodoTaskVerifier {
39
+ _opts;
40
+ _tasks = new Map();
41
+ _timer = null;
42
+ _intervalMs;
43
+ _confirmTicks;
44
+ constructor(_opts) {
45
+ this._opts = _opts;
46
+ this._intervalMs = _opts.intervalMs ?? 10_000;
47
+ this._confirmTicks = Math.max(1, _opts.confirmTicks ?? 2);
48
+ }
49
+ /** Is this task id currently being tracked (not yet confirmed durable)? */
50
+ has(id) { return this._tasks.has(id); }
51
+ /** Number of tasks awaiting durable confirmation. */
52
+ get size() { return this._tasks.size; }
53
+ /**
54
+ * Register a delivered task for verification. Idempotent by id — re-tracking
55
+ * the same id (e.g. the office re-pushed the same DB task under a new delivery
56
+ * id) refreshes the payload/dbTaskId without resetting its progress. Starts
57
+ * the poller if it was idle.
58
+ */
59
+ track(id, payload, dbTaskId) {
60
+ const existing = this._tasks.get(id);
61
+ if (existing) {
62
+ existing.payload = payload;
63
+ if (dbTaskId) {
64
+ existing.dbTaskId = dbTaskId;
65
+ }
66
+ }
67
+ else {
68
+ this._tasks.set(id, { id, payload, dbTaskId, presentTicks: 0 });
69
+ }
70
+ this._ensureTimer();
71
+ }
72
+ /** Stop tracking a task (e.g. it was cancelled/removed upstream). */
73
+ forget(id) {
74
+ this._tasks.delete(id);
75
+ if (this._tasks.size === 0) {
76
+ this._stopTimer();
77
+ }
78
+ }
79
+ /**
80
+ * One verification pass. Public so tests can drive it deterministically; the
81
+ * timer simply calls it on an interval.
82
+ */
83
+ tick() {
84
+ if (this._tasks.size === 0) {
85
+ this._stopTimer();
86
+ return;
87
+ }
88
+ let state;
89
+ try {
90
+ state = this._opts.readState();
91
+ }
92
+ catch (err) {
93
+ this._log(`todo verify: read failed, retrying next tick: ${err}`);
94
+ return;
95
+ }
96
+ for (const [id, task] of [...this._tasks]) {
97
+ if (state.done.has(id)) {
98
+ // The agent completed it. The office no longer needs our redelivery
99
+ // backstop; ack so it un-fades, then stop tracking (never re-append).
100
+ if (task.dbTaskId) {
101
+ this._opts.sendAck(task.dbTaskId);
102
+ }
103
+ this._tasks.delete(id);
104
+ continue;
105
+ }
106
+ if (state.present.has(id)) {
107
+ task.presentTicks++;
108
+ if (task.presentTicks >= this._confirmTicks) {
109
+ // Durably present → NOW send the deferred ack and stop polling it.
110
+ if (task.dbTaskId) {
111
+ this._opts.sendAck(task.dbTaskId);
112
+ }
113
+ this._tasks.delete(id);
114
+ }
115
+ }
116
+ else {
117
+ // Clobbered (or never landed) → repair idempotently and restart the
118
+ // confirmation count. appendIfAbsent guarantees no duplicate line.
119
+ task.presentTicks = 0;
120
+ void this._opts.appendIfAbsent(id, task.payload)
121
+ .then(() => { this._opts.onReappended?.(); })
122
+ .catch(err => this._log(`todo verify: re-append of ${id} failed: ${err}`));
123
+ }
124
+ }
125
+ if (this._tasks.size === 0) {
126
+ this._stopTimer();
127
+ }
128
+ }
129
+ /** Stop the poller and clear all tracked tasks (loop teardown). */
130
+ stop() {
131
+ this._stopTimer();
132
+ this._tasks.clear();
133
+ }
134
+ _ensureTimer() {
135
+ if (this._timer || this._tasks.size === 0) {
136
+ return;
137
+ }
138
+ this._timer = setInterval(() => this.tick(), this._intervalMs);
139
+ // Don't keep the process alive just for this verification timer.
140
+ this._timer.unref?.();
141
+ }
142
+ _stopTimer() {
143
+ if (this._timer) {
144
+ clearInterval(this._timer);
145
+ this._timer = null;
146
+ }
147
+ }
148
+ _log(msg) { this._opts.log?.(msg); }
149
+ }
150
+ exports.TodoTaskVerifier = TodoTaskVerifier;
151
+ //# sourceMappingURL=todoTaskVerifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"todoTaskVerifier.js","sourceRoot":"","sources":["../src/todoTaskVerifier.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,14 @@ declare class TodoWriteManager {
14
14
  private _enqueue;
15
15
  /** Append a new task to the Todo section and return its generated task ID. */
16
16
  append(filePath: string, text: string, id?: string): Promise<string>;
17
+ /**
18
+ * Idempotent-by-id append: append the task only if no line with this id is
19
+ * already present in the file. The presence check + append run as a SINGLE
20
+ * enqueued op, so two concurrent callers (the WS immediate write and the
21
+ * verify-poller re-append) can never both write the same id — exactly one
22
+ * line is ever produced. Returns the id.
23
+ */
24
+ appendIfAbsent(filePath: string, text: string, id: string): Promise<string>;
17
25
  /** Reset a single [~] in-progress task back to [ ]. */
18
26
  resetToTodo(filePath: string, task: Task): Promise<void>;
19
27
  /** Reset ALL [~] in-progress tasks back to [ ]. */
@@ -26,6 +26,16 @@ class TodoWriteManager {
26
26
  append(filePath, text, id) {
27
27
  return this._enqueue(filePath, () => (0, todo_1.appendTask)(filePath, text, id));
28
28
  }
29
+ /**
30
+ * Idempotent-by-id append: append the task only if no line with this id is
31
+ * already present in the file. The presence check + append run as a SINGLE
32
+ * enqueued op, so two concurrent callers (the WS immediate write and the
33
+ * verify-poller re-append) can never both write the same id — exactly one
34
+ * line is ever produced. Returns the id.
35
+ */
36
+ appendIfAbsent(filePath, text, id) {
37
+ return this._enqueue(filePath, () => (0, todo_1.appendTaskIfAbsent)(filePath, text, id));
38
+ }
29
39
  /** Reset a single [~] in-progress task back to [ ]. */
30
40
  resetToTodo(filePath, task) {
31
41
  return this._enqueue(filePath, () => (0, todo_1.resetToTodo)(filePath, task));
@@ -1 +1 @@
1
- {"version":3,"file":"todoWriteManager.js","sourceRoot":"","sources":["../src/todoWriteManager.ts"],"names":[],"mappings":";;;AAAA,iCAAqG;AAErG;;;;;;;;;GASG;AACH,MAAM,gBAAgB;IACD,MAAM,GAAG,IAAI,GAAG,EAA4B,CAAC;IAEtD,QAAQ,CAAI,QAAgB,EAAE,EAAW;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5D,0EAA0E;QAC1E,MAAM,MAAM,GAAgB,IAAsB,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAChF,6EAA6E;QAC7E,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;QACzE,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,8EAA8E;IAC9E,MAAM,CAAC,QAAgB,EAAE,IAAY,EAAE,EAAW;QAC9C,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAA,iBAAU,EAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,uDAAuD;IACvD,WAAW,CAAC,QAAgB,EAAE,IAAU;QACpC,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAA,kBAAW,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,mDAAmD;IACnD,kBAAkB,CAAC,QAAgB;QAC/B,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAA,yBAAkB,EAAC,QAAQ,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,0CAA0C;IAC1C,QAAQ,CAAC,QAAgB,EAAE,IAAU;QACjC,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAA,eAAQ,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IACnE,CAAC;IAED;8EAC0E;IAC1E,cAAc,CAAC,QAAgB,EAAE,IAAU;QACvC,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAA,qBAAc,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IACzE,CAAC;CACJ;AAED,8FAA8F;AACjF,QAAA,UAAU,GAAG,IAAI,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"todoWriteManager.js","sourceRoot":"","sources":["../src/todoWriteManager.ts"],"names":[],"mappings":";;;AAAA,iCAAyH;AAEzH;;;;;;;;;GASG;AACH,MAAM,gBAAgB;IACD,MAAM,GAAG,IAAI,GAAG,EAA4B,CAAC;IAEtD,QAAQ,CAAI,QAAgB,EAAE,EAAW;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5D,0EAA0E;QAC1E,MAAM,MAAM,GAAgB,IAAsB,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAChF,6EAA6E;QAC7E,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;QACzE,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,8EAA8E;IAC9E,MAAM,CAAC,QAAgB,EAAE,IAAY,EAAE,EAAW;QAC9C,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAA,iBAAU,EAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IACzE,CAAC;IAED;;;;;;OAMG;IACH,cAAc,CAAC,QAAgB,EAAE,IAAY,EAAE,EAAU;QACrD,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAA,yBAAkB,EAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IACjF,CAAC;IAED,uDAAuD;IACvD,WAAW,CAAC,QAAgB,EAAE,IAAU;QACpC,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAA,kBAAW,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,mDAAmD;IACnD,kBAAkB,CAAC,QAAgB;QAC/B,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAA,yBAAkB,EAAC,QAAQ,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,0CAA0C;IAC1C,QAAQ,CAAC,QAAgB,EAAE,IAAU;QACjC,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAA,eAAQ,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IACnE,CAAC;IAED;8EAC0E;IAC1E,cAAc,CAAC,QAAgB,EAAE,IAAU;QACvC,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAA,qBAAc,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IACzE,CAAC;CACJ;AAED,8FAA8F;AACjF,QAAA,UAAU,GAAG,IAAI,gBAAgB,EAAE,CAAC"}
@@ -33,6 +33,7 @@ export declare class WebSocketPoller {
33
33
  private _seenOrder;
34
34
  private _seenDeliveriesFile;
35
35
  private static readonly MAX_SEEN_DELIVERIES;
36
+ private _todoVerifier;
36
37
  private static readonly PING_INTERVAL_MS;
37
38
  private static readonly PONG_GRACE_MS;
38
39
  private _pingTimer;
@@ -78,6 +79,12 @@ export declare class WebSocketPoller {
78
79
  private _loadSeenDeliveries;
79
80
  /** Record a delivery id as processed (in-memory + persisted, bounded FIFO). */
80
81
  private _markSeenDelivery;
82
+ /**
83
+ * Lazily build the verify-and-re-append poller (needs `_todoPath`, set in
84
+ * start()). Wires the TODO.md read, the idempotent re-append, and the deferred
85
+ * ack to this poller's real implementations.
86
+ */
87
+ private _verifier;
81
88
  /** Tear down the connection permanently. */
82
89
  destroy(): void;
83
90
  /**
@@ -44,10 +44,12 @@ const manager_2 = require("./rdp/manager");
44
44
  const messageBuilder_1 = require("./messageBuilder");
45
45
  const todo_1 = require("./todo");
46
46
  const todoWriteManager_1 = require("./todoWriteManager");
47
+ const todoTaskVerifier_1 = require("./todoTaskVerifier");
47
48
  const commands_1 = require("./core/commands");
48
49
  const fileBrowser_1 = require("./fileBrowser");
49
50
  const gitRequest_1 = require("./git/gitRequest");
50
51
  const wsHandshake_1 = require("./wsHandshake");
52
+ const connect_1 = require("./connect");
51
53
  // ---------------------------------------------------------------------------
52
54
  // WebSocketPoller — persistent WS connection for ws:// / wss:// endpoints
53
55
  // ---------------------------------------------------------------------------
@@ -93,6 +95,11 @@ class WebSocketPoller {
93
95
  _seenOrder = [];
94
96
  _seenDeliveriesFile = null;
95
97
  static MAX_SEEN_DELIVERIES = 2000;
98
+ // Verify-and-re-append backstop for pushed tasks. A delivered task is tracked
99
+ // here until its line is DURABLY present in TODO.md; a grok-acp turn that
100
+ // clobbers TODO.md is repaired on the next tick, and the task_ack is deferred
101
+ // until the line is confirmed present (so the office's 45s sweep stays armed).
102
+ _todoVerifier = null;
96
103
  // Heartbeat: send a WS Ping every 25 s and expect a Pong. If 2 pings in a
97
104
  // row come back without a pong (≈55 s), force-reconnect. Without this the
98
105
  // server's 10-min stale-connection sweep silently drops idle agents and the
@@ -215,10 +222,38 @@ class WebSocketPoller {
215
222
  }
216
223
  catch { /* best-effort persistence */ }
217
224
  }
225
+ /**
226
+ * Lazily build the verify-and-re-append poller (needs `_todoPath`, set in
227
+ * start()). Wires the TODO.md read, the idempotent re-append, and the deferred
228
+ * ack to this poller's real implementations.
229
+ */
230
+ _verifier() {
231
+ if (!this._todoVerifier) {
232
+ this._todoVerifier = new todoTaskVerifier_1.TodoTaskVerifier({
233
+ readState: () => {
234
+ const present = new Set();
235
+ const done = new Set();
236
+ for (const t of (0, todo_1.parseTodo)(this._todoPath)) {
237
+ if (!t.id) {
238
+ continue;
239
+ }
240
+ (t.status === 'done' ? done : present).add(t.id);
241
+ }
242
+ return { present, done };
243
+ },
244
+ appendIfAbsent: (id, payload) => todoWriteManager_1.todoWriter.appendIfAbsent(this._todoPath, payload, id).then(() => undefined),
245
+ sendAck: (dbTaskId) => this._sendTaskAck(dbTaskId),
246
+ onReappended: () => this._onTaskAppend?.(),
247
+ log: (m) => this._log(m),
248
+ });
249
+ }
250
+ return this._todoVerifier;
251
+ }
218
252
  /** Tear down the connection permanently. */
219
253
  destroy() {
220
254
  this._destroyed = true;
221
255
  this._stopHeartbeat();
256
+ this._todoVerifier?.stop();
222
257
  this._vncManager.stopAll();
223
258
  this._rdpManager.stopAll();
224
259
  if (this._reconnectTimer) {
@@ -595,11 +630,17 @@ class WebSocketPoller {
595
630
  const meta = t['metadata'] ?? {};
596
631
  if (taskId && this._seenTaskIds.has(taskId)) {
597
632
  this._log(`WS task already processed (id=${taskId}), skipping`);
598
- // Already queued locally, but the office is still re-delivering it (faded) —
599
- // that means our earlier arrival ack never landed. Re-ack so the sweep stops.
633
+ // Already queued locally, but the office is still re-delivering it (faded).
634
+ // If the verify poller is still tracking this task it has DELIBERATELY not
635
+ // acked yet (waiting for the TODO.md line to be durably present past a
636
+ // grok clobber) — do NOT short-circuit that ack here; the poller owns it.
637
+ // Otherwise our earlier ack never landed, so re-ack to stop the sweep.
600
638
  // Idempotent server-side; only for real DB tasks (metadata.taskId present).
601
639
  if (meta['event'] === 'user_message' && typeof meta['taskId'] === 'string') {
602
- this._sendTaskAck(meta['taskId']);
640
+ const dbId = meta['taskId'];
641
+ if (!this._todoVerifier?.has(dbId)) {
642
+ this._sendTaskAck(dbId);
643
+ }
603
644
  }
604
645
  return;
605
646
  }
@@ -612,6 +653,28 @@ class WebSocketPoller {
612
653
  // Delivered live to the running turn (mid-turn injection), NOT appended to
613
654
  // TODO. Same A2A task-frame shape as a user_message but event='steer'.
614
655
  if (meta['event'] === 'steer' || meta['event'] === 'instant') {
656
+ // Persona push (pixel-office AgentController::assignPersonality live delivery):
657
+ // the frame carries a STRUCTURED persona in metadata.persona alongside the
658
+ // steer text. Write it into SOUL.md DETERMINISTICALLY here instead of trusting
659
+ // the model to self-edit from the steer text (unreliable, esp. grok-acp). The
660
+ // steer text is still delivered below as an immediate same-turn nudge; the SOUL
661
+ // write is the durable layer. The per-turn SOUL content-hash reminder
662
+ // (messageBuilder.soulUpdatedReminder) hashes SOUL.md from disk against
663
+ // .autodev/.soul-seen every turn, so it notices this external write on the next
664
+ // turn and tells the model to re-read it — we deliberately DON'T touch the
665
+ // marker here. applyPersonaToSoul is idempotent (replaces an existing block, a
666
+ // general/empty persona removes it), so there's no double-apply. Fully guarded:
667
+ // a missing/malformed persona or a write failure must never break steer handling.
668
+ if (meta['source'] === 'persona' && meta['persona'] && this._workspaceRoot) {
669
+ try {
670
+ const persona = meta['persona'];
671
+ const wrote = (0, connect_1.applyPersonaToSoul)(this._workspaceRoot, persona);
672
+ this._log(`WS persona push → SOUL.md ${wrote ? 'updated' : 'unchanged'} (${persona?.label ?? persona?.id ?? 'persona'})`);
673
+ }
674
+ catch (err) {
675
+ this._log(`WS persona push failed to write SOUL.md: ${err}`);
676
+ }
677
+ }
615
678
  const steerObj = meta['task'];
616
679
  let steerText = typeof steerObj?.['text'] === 'string' ? steerObj['text'] : '';
617
680
  // A steer can carry the same A2A file parts a user_message does (pasted /
@@ -749,7 +812,13 @@ class WebSocketPoller {
749
812
  this._log('WS failed to append task to TODO.md: todoPath is empty');
750
813
  return;
751
814
  }
752
- todoWriteManager_1.todoWriter.append(this._todoPath, fullText, wsTaskId)
815
+ // Append the task immediately so the loop can pick it up now — but
816
+ // idempotently by id, and WITHOUT acking. A grok-acp turn may clobber this
817
+ // line; the verify poller (registered below) repairs the clobber on its
818
+ // next tick and only sends task_ack once the line is DURABLY present. Until
819
+ // then the office's 45s redelivery sweep stays armed as a backstop, so a
820
+ // CLI crash before the line is durable still gets the task re-pushed.
821
+ todoWriteManager_1.todoWriter.appendIfAbsent(this._todoPath, fullText, wsTaskId)
753
822
  .then(() => {
754
823
  // At-least-once: only record the delivery as seen AFTER the durable
755
824
  // TODO append succeeds. On failure we leave it unseen so the server's
@@ -757,11 +826,8 @@ class WebSocketPoller {
757
826
  if (taskId) {
758
827
  this._markSeenDelivery(taskId);
759
828
  }
760
- // Confirm arrival to the office so it stops re-delivering this task and
761
- // clears its "not yet delivered" fade. Idempotent server-side.
762
- if (dbTaskId) {
763
- this._sendTaskAck(dbTaskId);
764
- }
829
+ // Register for verify-and-re-append. The ack is deferred to the poller.
830
+ this._verifier().track(wsTaskId, fullText, dbTaskId);
765
831
  this._onTaskAppend?.();
766
832
  })
767
833
  .catch(err => { this._log(`WS failed to append task to TODO.md: ${err}`); });