autodev-cli 1.4.33 → 1.4.34
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/agentBackup/export.js +69 -2
- package/out/agentBackup/export.js.map +1 -1
- package/out/agentBackup/import.js +1 -7
- package/out/agentBackup/import.js.map +1 -1
- package/out/agentBackup/layout.d.ts +9 -0
- package/out/agentBackup/layout.js +10 -1
- package/out/agentBackup/layout.js.map +1 -1
- package/out/commands/start.js +11 -0
- package/out/commands/start.js.map +1 -1
- package/out/git/gitService.js +9 -1
- package/out/git/gitService.js.map +1 -1
- package/out/taskLoop.d.ts +7 -0
- package/out/taskLoop.js +106 -8
- package/out/taskLoop.js.map +1 -1
- package/out/webSocketPoller.d.ts +1 -1
- package/out/webSocketPoller.js +303 -269
- package/out/webSocketPoller.js.map +1 -1
- package/out/webhookPoller.d.ts +1 -1
- package/out/webhookPoller.js.map +1 -1
- package/package.json +1 -1
|
@@ -34,11 +34,71 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.createAgentBackup = createAgentBackup;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
37
38
|
const path = __importStar(require("path"));
|
|
38
39
|
const archive_1 = require("./archive");
|
|
39
40
|
const layout_1 = require("./layout");
|
|
40
41
|
const sessionProviders_1 = require("./sessionProviders");
|
|
41
42
|
const manifest_1 = require("./manifest");
|
|
43
|
+
/**
|
|
44
|
+
* Add the workspace `.autodev/` tree to the archive, but with `settings.json`
|
|
45
|
+
* SANITIZED — the raw file holds the live WS auth token + endpoint (IDENTITY_KEYS)
|
|
46
|
+
* written at connect time, and a backup ZIP is uploaded off-VM and served by the
|
|
47
|
+
* download endpoint. Shipping the token would let anyone who fetches the export
|
|
48
|
+
* connect AS the agent. Every other `.autodev` file is added verbatim so
|
|
49
|
+
* workspace-state portability is preserved. Symlinks are skipped (walk uses
|
|
50
|
+
* isFile), which also avoids following a link out of the tree.
|
|
51
|
+
*/
|
|
52
|
+
function addSanitizedAutodev(root, archive) {
|
|
53
|
+
const srcDir = path.join(root, '.autodev');
|
|
54
|
+
if (!fs.existsSync(srcDir)) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const archiveBase = `${layout_1.ARCHIVE_PATHS.workspace}/.autodev`;
|
|
58
|
+
const walk = (absDir, relDir) => {
|
|
59
|
+
let entries;
|
|
60
|
+
try {
|
|
61
|
+
entries = fs.readdirSync(absDir, { withFileTypes: true });
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
for (const e of entries) {
|
|
67
|
+
const abs = path.join(absDir, e.name);
|
|
68
|
+
const rel = relDir ? `${relDir}/${e.name}` : e.name;
|
|
69
|
+
if (e.isDirectory()) {
|
|
70
|
+
walk(abs, rel);
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (!e.isFile()) {
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (rel === 'settings.json') {
|
|
77
|
+
archive.addBuffer(`${archiveBase}/settings.json`, sanitizeSettings(abs));
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
archive.addFile(abs, `${archiveBase}/${rel}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
walk(srcDir, '');
|
|
85
|
+
}
|
|
86
|
+
/** Read settings.json and return it with all IDENTITY_KEYS stripped. Fails
|
|
87
|
+
* closed: an unreadable/malformed file yields an empty object rather than
|
|
88
|
+
* shipping the raw (token-bearing) contents. */
|
|
89
|
+
function sanitizeSettings(absPath) {
|
|
90
|
+
let obj = {};
|
|
91
|
+
try {
|
|
92
|
+
obj = JSON.parse(fs.readFileSync(absPath, 'utf8'));
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
obj = {};
|
|
96
|
+
}
|
|
97
|
+
for (const k of layout_1.IDENTITY_KEYS) {
|
|
98
|
+
delete obj[k];
|
|
99
|
+
}
|
|
100
|
+
return Buffer.from(JSON.stringify(obj, null, 2) + '\n', 'utf8');
|
|
101
|
+
}
|
|
42
102
|
/**
|
|
43
103
|
* Pure (vscode-free) core: build and write the agent backup ZIP.
|
|
44
104
|
* Called both by the VS Code command (with a dialog-chosen path) and directly
|
|
@@ -46,9 +106,16 @@ const manifest_1 = require("./manifest");
|
|
|
46
106
|
*/
|
|
47
107
|
async function createAgentBackup(root, destPath) {
|
|
48
108
|
const archive = archive_1.AdmZipArchive.create();
|
|
49
|
-
// Workspace state directories (single source of truth in layout).
|
|
109
|
+
// Workspace state directories (single source of truth in layout). The
|
|
110
|
+
// `.autodev` tree is added via a sanitizing walk that strips the agent's WS
|
|
111
|
+
// auth token from settings.json before it can leave the VM.
|
|
50
112
|
for (const rel of layout_1.WORKSPACE_DIRS) {
|
|
51
|
-
|
|
113
|
+
if (rel === '.autodev') {
|
|
114
|
+
addSanitizedAutodev(root, archive);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
archive.addDir(path.join(root, rel), `${layout_1.ARCHIVE_PATHS.workspace}/${rel}`);
|
|
118
|
+
}
|
|
52
119
|
}
|
|
53
120
|
// Root-level agent docs.
|
|
54
121
|
for (const f of layout_1.ROOT_DOCS) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/agentBackup/export.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/agentBackup/export.ts"],"names":[],"mappings":"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"}
|
|
@@ -40,12 +40,6 @@ const archive_1 = require("./archive");
|
|
|
40
40
|
const layout_1 = require("./layout");
|
|
41
41
|
const sessionProviders_1 = require("./sessionProviders");
|
|
42
42
|
const manifest_1 = require("./manifest");
|
|
43
|
-
/**
|
|
44
|
-
* Identity/connection settings that belong to the DESTINATION agent, not the
|
|
45
|
-
* backed-up one. Restoring a backup must never overwrite these, or the restored
|
|
46
|
-
* agent would connect as the source agent (identity hijack).
|
|
47
|
-
*/
|
|
48
|
-
const IDENTITY_KEYS = ['wsUrl', 'serverBaseUrl', 'serverApiKey', 'webhookSlug', 'agentId'];
|
|
49
43
|
/**
|
|
50
44
|
* Restore an agent backup ZIP into a destination folder and wire up its
|
|
51
45
|
* session state so it resumes there. Mirrors {@link './export'} using the
|
|
@@ -69,7 +63,7 @@ async function restoreAgentBackup(zipPath, destRoot) {
|
|
|
69
63
|
try {
|
|
70
64
|
if (fs.existsSync(destSettingsPath)) {
|
|
71
65
|
const cur = JSON.parse(fs.readFileSync(destSettingsPath, 'utf8'));
|
|
72
|
-
for (const k of IDENTITY_KEYS) {
|
|
66
|
+
for (const k of layout_1.IDENTITY_KEYS) {
|
|
73
67
|
if (cur[k] !== undefined) {
|
|
74
68
|
preservedIdentity[k] = cur[k];
|
|
75
69
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/agentBackup/import.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/agentBackup/import.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,15 @@ export declare const ROOT_DOCS: readonly string[];
|
|
|
20
20
|
* by both export and import (DRY).
|
|
21
21
|
*/
|
|
22
22
|
export declare const WORKSPACE_DIRS: readonly string[];
|
|
23
|
+
/**
|
|
24
|
+
* Identity/connection settings in `.autodev/settings.json` that are scoped to a
|
|
25
|
+
* specific agent and MUST NOT travel in a backup: they are the live WS auth
|
|
26
|
+
* token + endpoint. Export strips them from the shipped settings.json (a backup
|
|
27
|
+
* ZIP is uploaded off-VM), and import preserves the destination agent's own
|
|
28
|
+
* values so a restore never hijacks its identity. Single source of truth shared
|
|
29
|
+
* by both sides (DRY).
|
|
30
|
+
*/
|
|
31
|
+
export declare const IDENTITY_KEYS: readonly ["wsUrl", "serverBaseUrl", "serverApiKey", "webhookSlug", "agentId"];
|
|
23
32
|
/** Normalise a filesystem path for comparison (case-insensitive, slash-form). */
|
|
24
33
|
export declare function normalizePath(p: string): string;
|
|
25
34
|
/** Root of the Copilot CLI store. */
|
|
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.WORKSPACE_DIRS = exports.ROOT_DOCS = exports.ARCHIVE_PATHS = exports.TOP_FOLDER = void 0;
|
|
36
|
+
exports.IDENTITY_KEYS = exports.WORKSPACE_DIRS = exports.ROOT_DOCS = exports.ARCHIVE_PATHS = exports.TOP_FOLDER = void 0;
|
|
37
37
|
exports.sessionsPath = sessionsPath;
|
|
38
38
|
exports.normalizePath = normalizePath;
|
|
39
39
|
exports.copilotDir = copilotDir;
|
|
@@ -73,6 +73,15 @@ exports.WORKSPACE_DIRS = [
|
|
|
73
73
|
path.posix.join('media', 'profile'),
|
|
74
74
|
path.posix.join('media', 'skills'),
|
|
75
75
|
];
|
|
76
|
+
/**
|
|
77
|
+
* Identity/connection settings in `.autodev/settings.json` that are scoped to a
|
|
78
|
+
* specific agent and MUST NOT travel in a backup: they are the live WS auth
|
|
79
|
+
* token + endpoint. Export strips them from the shipped settings.json (a backup
|
|
80
|
+
* ZIP is uploaded off-VM), and import preserves the destination agent's own
|
|
81
|
+
* values so a restore never hijacks its identity. Single source of truth shared
|
|
82
|
+
* by both sides (DRY).
|
|
83
|
+
*/
|
|
84
|
+
exports.IDENTITY_KEYS = ['wsUrl', 'serverBaseUrl', 'serverApiKey', 'webhookSlug', 'agentId'];
|
|
76
85
|
/** Normalise a filesystem path for comparison (case-insensitive, slash-form). */
|
|
77
86
|
function normalizePath(p) {
|
|
78
87
|
return p.replace(/\\/g, '/').replace(/\/+$/, '').toLowerCase();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/agentBackup/layout.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeA,oCAEC;
|
|
1
|
+
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/agentBackup/layout.ts"],"names":[],"mappings":"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"}
|
package/out/commands/start.js
CHANGED
|
@@ -97,6 +97,17 @@ function startCommand(program) {
|
|
|
97
97
|
sdk_1.AutoDev.loop.stop();
|
|
98
98
|
setTimeout(() => process.exit(0), 1500).unref();
|
|
99
99
|
});
|
|
100
|
+
// Backstop: an unexpected throw or rejection anywhere in the loop (a
|
|
101
|
+
// hostile WS frame, an I/O error) must not take the whole agent offline
|
|
102
|
+
// requiring a manual respawn. Log and keep the process alive so it stays
|
|
103
|
+
// online and serving. The per-frame try/catch in webSocketPoller is the
|
|
104
|
+
// primary guard; these are the last line of defence.
|
|
105
|
+
process.on('uncaughtException', (err) => {
|
|
106
|
+
logger_1.log.error(`Uncaught exception (kept alive): ${err instanceof Error ? err.stack ?? err.message : String(err)}`);
|
|
107
|
+
});
|
|
108
|
+
process.on('unhandledRejection', (reason) => {
|
|
109
|
+
logger_1.log.error(`Unhandled rejection (kept alive): ${reason instanceof Error ? reason.stack ?? reason.message : String(reason)}`);
|
|
110
|
+
});
|
|
100
111
|
try {
|
|
101
112
|
const options = {
|
|
102
113
|
cwd,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
|
package/out/git/gitService.js
CHANGED
|
@@ -113,8 +113,16 @@ async function getDiff(cwd, filePath, staged) {
|
|
|
113
113
|
if (!out && !staged) {
|
|
114
114
|
const content = await git(cwd, ['show', `:${filePath}`]).catch(async () => {
|
|
115
115
|
const { readFileSync } = await Promise.resolve().then(() => __importStar(require('fs')));
|
|
116
|
+
const pathMod = await Promise.resolve().then(() => __importStar(require('path')));
|
|
117
|
+
// Containment guard: never read outside the repo even if a caller passes a
|
|
118
|
+
// traversing path. The WS handler already validates, but keep this defensive
|
|
119
|
+
// so getDiff cannot be turned into an arbitrary-file read by another caller.
|
|
120
|
+
const abs = pathMod.resolve(cwd, filePath);
|
|
121
|
+
if (abs !== cwd && !abs.startsWith(cwd + pathMod.sep)) {
|
|
122
|
+
return '';
|
|
123
|
+
}
|
|
116
124
|
try {
|
|
117
|
-
return readFileSync(
|
|
125
|
+
return readFileSync(abs, 'utf8');
|
|
118
126
|
}
|
|
119
127
|
catch {
|
|
120
128
|
return '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gitService.js","sourceRoot":"","sources":["../../src/git/gitService.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,8BAkCC;AAED,wBAkBC;AAED,
|
|
1
|
+
{"version":3,"file":"gitService.js","sourceRoot":"","sources":["../../src/git/gitService.ts"],"names":[],"mappings":"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"}
|
package/out/taskLoop.d.ts
CHANGED
|
@@ -52,6 +52,13 @@ export declare class TaskLoopRunner {
|
|
|
52
52
|
/** Resolves the idle no-task sleep early when a poller appends a new task. */
|
|
53
53
|
private _idleSleepWake;
|
|
54
54
|
private _resumeAt;
|
|
55
|
+
/** When the loop is paused for reauth/rate-limit, the event+payload to re-emit
|
|
56
|
+
* on a WS reconnect INSTEAD of agent_online/task_start. Reconnects are routine
|
|
57
|
+
* (heartbeat, NAT blips, server restart); without this a reconnect during a
|
|
58
|
+
* pause flips the server status back to active/working and erases the
|
|
59
|
+
* operator's 'needs reauth' / 'rate limited' badge, stranding the agent.
|
|
60
|
+
* Cleared on retry()/resume. */
|
|
61
|
+
private _pauseReason;
|
|
55
62
|
/** When fallback is active: the saved main provider and when to switch back. */
|
|
56
63
|
private _mainProviderBeforeFallback;
|
|
57
64
|
private _mainProviderResumeAt;
|
package/out/taskLoop.js
CHANGED
|
@@ -174,6 +174,13 @@ class TaskLoopRunner {
|
|
|
174
174
|
/** Resolves the idle no-task sleep early when a poller appends a new task. */
|
|
175
175
|
_idleSleepWake = null;
|
|
176
176
|
_resumeAt;
|
|
177
|
+
/** When the loop is paused for reauth/rate-limit, the event+payload to re-emit
|
|
178
|
+
* on a WS reconnect INSTEAD of agent_online/task_start. Reconnects are routine
|
|
179
|
+
* (heartbeat, NAT blips, server restart); without this a reconnect during a
|
|
180
|
+
* pause flips the server status back to active/working and erases the
|
|
181
|
+
* operator's 'needs reauth' / 'rate limited' badge, stranding the agent.
|
|
182
|
+
* Cleared on retry()/resume. */
|
|
183
|
+
_pauseReason = null;
|
|
177
184
|
/** When fallback is active: the saved main provider and when to switch back. */
|
|
178
185
|
_mainProviderBeforeFallback = null;
|
|
179
186
|
_mainProviderResumeAt;
|
|
@@ -317,6 +324,7 @@ class TaskLoopRunner {
|
|
|
317
324
|
}
|
|
318
325
|
this._retryScheduler.clear();
|
|
319
326
|
this._resumeAt = undefined;
|
|
327
|
+
this._pauseReason = null;
|
|
320
328
|
this._mainProviderBeforeFallback = null;
|
|
321
329
|
this._mainProviderResumeAt = undefined;
|
|
322
330
|
this._setState('running');
|
|
@@ -403,6 +411,17 @@ class TaskLoopRunner {
|
|
|
403
411
|
});
|
|
404
412
|
return;
|
|
405
413
|
}
|
|
414
|
+
// If the loop is paused (reauth / rate-limit), a routine reconnect must
|
|
415
|
+
// NOT re-emit agent_online + task_start — that flips the server status
|
|
416
|
+
// back to active/working and erases the reauth/rate-limit alert, so a
|
|
417
|
+
// stranded agent looks like it is busy working. Re-assert the pause
|
|
418
|
+
// reason instead and never send task_start while paused.
|
|
419
|
+
if (this._state === 'paused') {
|
|
420
|
+
if (this._pauseReason) {
|
|
421
|
+
this._notifyWebhook(this._pauseReason.event, this._pauseReason.payload);
|
|
422
|
+
}
|
|
423
|
+
return;
|
|
424
|
+
}
|
|
406
425
|
this._notifyWebhook('agent_online', {
|
|
407
426
|
hostname: this._hostname,
|
|
408
427
|
workDir: this._workspaceRoot ?? '',
|
|
@@ -452,7 +471,7 @@ class TaskLoopRunner {
|
|
|
452
471
|
this._webhookPoller.setRdpEnabled(settings.rdpEnabled ?? false);
|
|
453
472
|
// Wake the idle no-task sleep instantly when a WS-pushed task arrives.
|
|
454
473
|
this._webhookPoller.setOnTaskAppend(() => this._wakeIdleSleep());
|
|
455
|
-
this._webhookPoller.setOnSteer((text) => this._handleSteer(text));
|
|
474
|
+
this._webhookPoller.setOnSteer((text, onDelivered) => this._handleSteer(text, onDelivered));
|
|
456
475
|
this._webhookPoller.setOnCommand((cmd) => this._handleCommand(cmd));
|
|
457
476
|
this._webhookPoller.setOnMcpUpdate((entries) => this._handleMcpUpdate(entries));
|
|
458
477
|
this._webhookPoller.setOnExportRequest((agentId) => void this._handleExportRequest(agentId));
|
|
@@ -592,6 +611,7 @@ class TaskLoopRunner {
|
|
|
592
611
|
this._setState('stopping');
|
|
593
612
|
this._retryScheduler.clear();
|
|
594
613
|
this._resumeAt = undefined;
|
|
614
|
+
this._pauseReason = null;
|
|
595
615
|
this._mainProviderBeforeFallback = null;
|
|
596
616
|
this._mainProviderResumeAt = undefined;
|
|
597
617
|
// Unblock _pause() if we're currently suspended
|
|
@@ -851,9 +871,12 @@ class TaskLoopRunner {
|
|
|
851
871
|
* and wake the idle sleep so it runs at the very next turn boundary rather
|
|
852
872
|
* than waiting for a poll interval. This is the documented fallback.
|
|
853
873
|
*/
|
|
854
|
-
_handleSteer(text) {
|
|
874
|
+
_handleSteer(text, onDelivered) {
|
|
855
875
|
const clean = text.trim();
|
|
876
|
+
// Malformed/empty steer: nothing to deliver — treat as terminally handled so
|
|
877
|
+
// the server doesn't keep replaying it.
|
|
856
878
|
if (!clean) {
|
|
879
|
+
onDelivered?.();
|
|
857
880
|
return;
|
|
858
881
|
}
|
|
859
882
|
const root = this._workspaceRoot;
|
|
@@ -863,6 +886,7 @@ class TaskLoopRunner {
|
|
|
863
886
|
if (root && provider === 'claude-tui' && (0, claudeTuiProvider_1.isClaudeTuiBusy)(root)) {
|
|
864
887
|
if ((0, claudeTuiProvider_1.steerClaudeTui)(root, clean, msg => this._cb?.log(msg))) {
|
|
865
888
|
this._cb?.log(`⚡ Steered mid-turn: "${clean.slice(0, 80)}"`);
|
|
889
|
+
onDelivered?.(); // durably injected into the live turn
|
|
866
890
|
return;
|
|
867
891
|
}
|
|
868
892
|
}
|
|
@@ -870,12 +894,21 @@ class TaskLoopRunner {
|
|
|
870
894
|
// idle sleep so an idle loop starts immediately instead of waiting a poll.
|
|
871
895
|
const todoPath = this._settings?.todoPath || (root ? path.join(root, 'TODO.md') : '');
|
|
872
896
|
if (!todoPath) {
|
|
897
|
+
// No TODO path is a terminal config error, not a transient failure —
|
|
898
|
+
// redelivery cannot help, so mark it handled to avoid an infinite replay.
|
|
873
899
|
this._cb?.log(`⚡ Steer dropped — no TODO path (text: "${clean.slice(0, 80)}")`);
|
|
900
|
+
onDelivered?.();
|
|
874
901
|
return;
|
|
875
902
|
}
|
|
876
903
|
this._cb?.log(`⚡ Steer queued for next turn boundary: "${clean.slice(0, 80)}"`);
|
|
877
904
|
todoWriteManager_1.todoWriter.append(todoPath, clean, (0, todo_1.shortId)())
|
|
878
|
-
.then(() =>
|
|
905
|
+
.then(() => {
|
|
906
|
+
// At-least-once: only mark the delivery seen AFTER the durable append
|
|
907
|
+
// succeeds, mirroring the user_message path. Left unmarked on failure so
|
|
908
|
+
// the server's reconnect replay re-delivers instead of losing the steer.
|
|
909
|
+
onDelivered?.();
|
|
910
|
+
this._wakeIdleSleep();
|
|
911
|
+
})
|
|
879
912
|
.catch(err => this._cb?.log(`⚡ Steer append failed: ${err instanceof Error ? err.message : String(err)}`));
|
|
880
913
|
}
|
|
881
914
|
// -------------------------------------------------------------------------
|
|
@@ -1773,6 +1806,20 @@ class TaskLoopRunner {
|
|
|
1773
1806
|
this._cb?.log(`⚠️ Failed to evict ${currentProvider} client before reauth pause: ${evictErr instanceof Error ? evictErr.message : String(evictErr)}`);
|
|
1774
1807
|
}
|
|
1775
1808
|
}
|
|
1809
|
+
// Remember the pause reason so a WS reconnect during the pause re-emits
|
|
1810
|
+
// reauth_required instead of clobbering it with agent_online/task_start.
|
|
1811
|
+
this._pauseReason = {
|
|
1812
|
+
event: 'reauth_required',
|
|
1813
|
+
payload: {
|
|
1814
|
+
iteration: this._iterations,
|
|
1815
|
+
task: { text: task.text },
|
|
1816
|
+
message: rawMsg,
|
|
1817
|
+
provider: currentProvider,
|
|
1818
|
+
workDir: this._workspaceRoot,
|
|
1819
|
+
gitRepo: this._gitRepo,
|
|
1820
|
+
gitBranch: this._gitBranch,
|
|
1821
|
+
},
|
|
1822
|
+
};
|
|
1776
1823
|
// Pause indefinitely (no auto-resume) — operator must re-auth + Retry.
|
|
1777
1824
|
await this._pauseLoop();
|
|
1778
1825
|
if (this._state !== 'running') {
|
|
@@ -1838,6 +1885,21 @@ class TaskLoopRunner {
|
|
|
1838
1885
|
});
|
|
1839
1886
|
// Reset task so it gets picked up again after resume
|
|
1840
1887
|
await todoWriteManager_1.todoWriter.resetToTodo(todoPath, task).catch(() => { });
|
|
1888
|
+
// Remember the pause reason so a WS reconnect during the pause re-emits
|
|
1889
|
+
// rate_limit instead of clobbering it with agent_online/task_start.
|
|
1890
|
+
this._pauseReason = {
|
|
1891
|
+
event: 'rate_limit',
|
|
1892
|
+
payload: {
|
|
1893
|
+
iteration: this._iterations,
|
|
1894
|
+
task: { text: task.text },
|
|
1895
|
+
message: rawMsg,
|
|
1896
|
+
resumeAt: resumeAt.toISOString(),
|
|
1897
|
+
provider: currentProvider,
|
|
1898
|
+
workDir: this._workspaceRoot,
|
|
1899
|
+
gitRepo: this._gitRepo,
|
|
1900
|
+
gitBranch: this._gitBranch,
|
|
1901
|
+
},
|
|
1902
|
+
};
|
|
1841
1903
|
// Block here until resumed (timer or user clicks Retry Now)
|
|
1842
1904
|
this._resumeAt = resumeAt;
|
|
1843
1905
|
await this._pauseLoop(resumeMs);
|
|
@@ -1987,6 +2049,21 @@ class TaskLoopRunner {
|
|
|
1987
2049
|
gitBranch: this._gitBranch,
|
|
1988
2050
|
});
|
|
1989
2051
|
await todoWriteManager_1.todoWriter.resetToTodo(todoPath, task).catch(() => { });
|
|
2052
|
+
// Remember the pause reason so a WS reconnect during the pause re-emits
|
|
2053
|
+
// it instead of clobbering it with agent_online/task_start.
|
|
2054
|
+
this._pauseReason = {
|
|
2055
|
+
event: 'rate_limit',
|
|
2056
|
+
payload: {
|
|
2057
|
+
iteration: this._iterations,
|
|
2058
|
+
task: { text: task.text },
|
|
2059
|
+
message: rawMsg,
|
|
2060
|
+
resumeAt: new Date(Date.now() + 60 * 60_000).toISOString(),
|
|
2061
|
+
provider,
|
|
2062
|
+
workDir: this._workspaceRoot,
|
|
2063
|
+
gitRepo: this._gitRepo,
|
|
2064
|
+
gitBranch: this._gitBranch,
|
|
2065
|
+
},
|
|
2066
|
+
};
|
|
1990
2067
|
// No auto-resume time — user must click Retry manually
|
|
1991
2068
|
this._resumeAt = undefined;
|
|
1992
2069
|
await this._pauseLoop(); // pause indefinitely
|
|
@@ -2333,12 +2410,33 @@ class TaskLoopRunner {
|
|
|
2333
2410
|
// every stdout-teeing provider so a throttled grok/copilot exit pauses
|
|
2334
2411
|
// instead of being force-marked done.
|
|
2335
2412
|
const exitStdout = readStdoutFile();
|
|
2413
|
+
// Read the process exit code. Auth-failure detection must be gated on a
|
|
2414
|
+
// NON-ZERO exit: for claude-tui the stdout capture IS the model's own
|
|
2415
|
+
// assistant transcript, so a *successful* task (exit 0) whose output
|
|
2416
|
+
// legitimately contains {"type":"authentication_error"} — e.g. code
|
|
2417
|
+
// working on Anthropic API handling, or a pasted 401 body — would trip
|
|
2418
|
+
// AuthDetector and pause the loop indefinitely over benign output. Real
|
|
2419
|
+
// auth/credit failures exit non-zero (the provider appends `[Error: …]`),
|
|
2420
|
+
// so gating on the exit code loses nothing. Rate-limit detection stays
|
|
2421
|
+
// ungated — its phrases are error-scoped and a throttle can surface on a
|
|
2422
|
+
// zero exit for some providers.
|
|
2423
|
+
const exitCodeRaw = this._workspaceRoot
|
|
2424
|
+
? (() => { try {
|
|
2425
|
+
return fs.readFileSync((0, sessionState_1.exitFilePath)(this._workspaceRoot, activeProvider), 'utf8').trim();
|
|
2426
|
+
}
|
|
2427
|
+
catch {
|
|
2428
|
+
return '';
|
|
2429
|
+
} })()
|
|
2430
|
+
: '';
|
|
2431
|
+
const exitedNonZero = exitCodeRaw !== '' && exitCodeRaw !== '0';
|
|
2336
2432
|
if (teesStdout) {
|
|
2337
|
-
|
|
2338
|
-
|
|
2339
|
-
|
|
2340
|
-
|
|
2341
|
-
|
|
2433
|
+
if (exitedNonZero) {
|
|
2434
|
+
const authFromStdout = rateLimit_1.AuthDetector.detect(exitStdout);
|
|
2435
|
+
if (authFromStdout) {
|
|
2436
|
+
cleanup();
|
|
2437
|
+
reject(authFromStdout);
|
|
2438
|
+
return;
|
|
2439
|
+
}
|
|
2342
2440
|
}
|
|
2343
2441
|
const rlFromStdout = rateLimit_1.RateLimitDetector.detect(exitStdout);
|
|
2344
2442
|
if (rlFromStdout) {
|