visionclaw 0.1.219-dev.codex-issue-2805-worker-runtime.3 → 0.1.219-dev.codex-2941-task-board-on-main.1
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/dist/agent/browser-launcher.d.ts +19 -1
- package/dist/agent/browser-launcher.d.ts.map +1 -1
- package/dist/agent/browser-launcher.js +40 -0
- package/dist/agent/browser-launcher.js.map +1 -1
- package/dist/agent/command-handlers.js +2 -2
- package/dist/agent/command-handlers.js.map +1 -1
- package/dist/agent/engines/claude/session.d.ts +6 -0
- package/dist/agent/engines/claude/session.d.ts.map +1 -1
- package/dist/agent/engines/claude/session.js +34 -2
- package/dist/agent/engines/claude/session.js.map +1 -1
- package/dist/agent/engines/pi/tools.d.ts.map +1 -1
- package/dist/agent/engines/pi/tools.js +2 -1
- package/dist/agent/engines/pi/tools.js.map +1 -1
- package/dist/agent/fund-league-hold.d.ts.map +1 -1
- package/dist/agent/fund-league-hold.js +5 -1
- package/dist/agent/fund-league-hold.js.map +1 -1
- package/dist/agent/interrupt-handler.d.ts.map +1 -1
- package/dist/agent/interrupt-handler.js +4 -1
- package/dist/agent/interrupt-handler.js.map +1 -1
- package/dist/agent/lifecycle-trace.d.ts +3 -2
- package/dist/agent/lifecycle-trace.d.ts.map +1 -1
- package/dist/agent/lifecycle-trace.js +4 -9
- package/dist/agent/lifecycle-trace.js.map +1 -1
- package/dist/agent/lifecycle-transitions.d.ts +42 -0
- package/dist/agent/lifecycle-transitions.d.ts.map +1 -1
- package/dist/agent/lifecycle-transitions.js +62 -6
- package/dist/agent/lifecycle-transitions.js.map +1 -1
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +99 -27
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/public-activity.d.ts +1 -1
- package/dist/agent/public-activity.d.ts.map +1 -1
- package/dist/agent/public-activity.js.map +1 -1
- package/dist/agent/runtime-context.d.ts +2 -0
- package/dist/agent/runtime-context.d.ts.map +1 -1
- package/dist/agent/runtime-context.js +4 -0
- package/dist/agent/runtime-context.js.map +1 -1
- package/dist/agent/service-gate.d.ts.map +1 -1
- package/dist/agent/service-gate.js +4 -1
- package/dist/agent/service-gate.js.map +1 -1
- package/dist/agent/state.d.ts +14 -0
- package/dist/agent/state.d.ts.map +1 -1
- package/dist/agent/state.js +13 -5
- package/dist/agent/state.js.map +1 -1
- package/dist/agent/status.d.ts.map +1 -1
- package/dist/agent/status.js +4 -1
- package/dist/agent/status.js.map +1 -1
- package/dist/agent/system-prompt.d.ts.map +1 -1
- package/dist/agent/system-prompt.js +11 -1
- package/dist/agent/system-prompt.js.map +1 -1
- package/dist/agent/tool-call-watchdog.d.ts +7 -0
- package/dist/agent/tool-call-watchdog.d.ts.map +1 -1
- package/dist/agent/tool-call-watchdog.js +32 -2
- package/dist/agent/tool-call-watchdog.js.map +1 -1
- package/dist/agent/wake-cycle-runner.d.ts +11 -0
- package/dist/agent/wake-cycle-runner.d.ts.map +1 -1
- package/dist/agent/wake-cycle-runner.js +42 -9
- package/dist/agent/wake-cycle-runner.js.map +1 -1
- package/dist/channels/interface.d.ts +18 -0
- package/dist/channels/interface.d.ts.map +1 -1
- package/dist/channels/interface.js.map +1 -1
- package/dist/channels/qq-status.d.ts.map +1 -1
- package/dist/channels/qq-status.js +1 -0
- package/dist/channels/qq-status.js.map +1 -1
- package/dist/channels/telegram-status.d.ts +22 -4
- package/dist/channels/telegram-status.d.ts.map +1 -1
- package/dist/channels/telegram-status.js +216 -39
- package/dist/channels/telegram-status.js.map +1 -1
- package/dist/channels/telegram-task-board.d.ts +79 -0
- package/dist/channels/telegram-task-board.d.ts.map +1 -0
- package/dist/channels/telegram-task-board.js +384 -0
- package/dist/channels/telegram-task-board.js.map +1 -0
- package/dist/channels/telegram.d.ts +6 -1
- package/dist/channels/telegram.d.ts.map +1 -1
- package/dist/channels/telegram.js +31 -2
- package/dist/channels/telegram.js.map +1 -1
- package/dist/i18n/messages.d.ts +248 -0
- package/dist/i18n/messages.d.ts.map +1 -1
- package/dist/i18n/messages.js +79 -13
- package/dist/i18n/messages.js.map +1 -1
- package/dist/obs/tunnel.d.ts +9 -1
- package/dist/obs/tunnel.d.ts.map +1 -1
- package/dist/obs/tunnel.js +121 -54
- package/dist/obs/tunnel.js.map +1 -1
- package/dist/stt-client.d.ts +10 -0
- package/dist/stt-client.d.ts.map +1 -1
- package/dist/stt-client.js +64 -31
- package/dist/stt-client.js.map +1 -1
- package/dist/threads/foreground-task.d.ts +10 -2
- package/dist/threads/foreground-task.d.ts.map +1 -1
- package/dist/threads/foreground-task.js +18 -3
- package/dist/threads/foreground-task.js.map +1 -1
- package/dist/threads/foreman-host.d.ts +13 -1
- package/dist/threads/foreman-host.d.ts.map +1 -1
- package/dist/threads/foreman-host.js +79 -7
- package/dist/threads/foreman-host.js.map +1 -1
- package/dist/threads/foreman-protocol.d.ts +2 -0
- package/dist/threads/foreman-protocol.d.ts.map +1 -1
- package/dist/threads/foreman-protocol.js +3 -1
- package/dist/threads/foreman-protocol.js.map +1 -1
- package/dist/threads/process-group.js +7 -2
- package/dist/threads/process-group.js.map +1 -1
- package/dist/threads/relay-adapter.d.ts +2 -0
- package/dist/threads/relay-adapter.d.ts.map +1 -1
- package/dist/threads/relay-adapter.js +6 -0
- package/dist/threads/relay-adapter.js.map +1 -1
- package/dist/threads/task-settlement.d.ts +17 -0
- package/dist/threads/task-settlement.d.ts.map +1 -0
- package/dist/threads/task-settlement.js +34 -0
- package/dist/threads/task-settlement.js.map +1 -0
- package/dist/threads/thread-activity-controller.d.ts +21 -0
- package/dist/threads/thread-activity-controller.d.ts.map +1 -1
- package/dist/threads/thread-activity-controller.js +111 -3
- package/dist/threads/thread-activity-controller.js.map +1 -1
- package/dist/tools/browser-health.d.ts +2 -0
- package/dist/tools/browser-health.d.ts.map +1 -0
- package/dist/tools/browser-health.js +18 -0
- package/dist/tools/browser-health.js.map +1 -0
- package/dist/tools/browser-set-engine.js +1 -1
- package/dist/tools/browser-set-engine.js.map +1 -1
- package/dist/tools/delegation.d.ts +7 -0
- package/dist/tools/delegation.d.ts.map +1 -1
- package/dist/tools/delegation.js +30 -3
- package/dist/tools/delegation.js.map +1 -1
- package/dist/tools/fund-league.d.ts +4 -0
- package/dist/tools/fund-league.d.ts.map +1 -1
- package/dist/tools/fund-league.js +1 -1
- package/dist/tools/fund-league.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/upgrade.d.ts +2 -1
- package/dist/tools/upgrade.d.ts.map +1 -1
- package/dist/tools/upgrade.js +26 -8
- package/dist/tools/upgrade.js.map +1 -1
- package/dist/utils/restart.d.ts +6 -0
- package/dist/utils/restart.d.ts.map +1 -1
- package/dist/utils/restart.js +7 -1
- package/dist/utils/restart.js.map +1 -1
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +19 -9
- package/dist/utils/version-check.js.map +1 -1
- package/dist-agent/bundle.cjs +2 -2
- package/package.json +1 -1
package/dist/stt-client.js
CHANGED
|
@@ -62,6 +62,22 @@ function mergeVocabulary(...groups) {
|
|
|
62
62
|
* request no one is waiting for.
|
|
63
63
|
*/
|
|
64
64
|
export const STT_CLIENT_TIMEOUT_MS = 90_000;
|
|
65
|
+
/**
|
|
66
|
+
* Total attempts when cloud STT fails with a transient URL-intake / transport
|
|
67
|
+
* `fetch failed` (Telegram CDN fetches are the usual case). Prefer 3 attempts
|
|
68
|
+
* total rather than "3 retries after the first".
|
|
69
|
+
*/
|
|
70
|
+
export const STT_TRANSIENT_FETCH_MAX_ATTEMPTS = 3;
|
|
71
|
+
/** Short backoff between transient fetch retries. */
|
|
72
|
+
export const STT_TRANSIENT_FETCH_RETRY_DELAY_MS = 300;
|
|
73
|
+
/** True when the failure looks like a transient undici/CDN fetch failure. */
|
|
74
|
+
export function isTransientSttFetchError(err) {
|
|
75
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
76
|
+
return /\bfetch failed\b/i.test(message);
|
|
77
|
+
}
|
|
78
|
+
function sleep(ms) {
|
|
79
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
80
|
+
}
|
|
65
81
|
export class SttNotConfiguredError extends Error {
|
|
66
82
|
constructor() {
|
|
67
83
|
super("cloud STT service is not configured (no API key)");
|
|
@@ -136,40 +152,57 @@ export async function transcribeViaSttService(config, request) {
|
|
|
136
152
|
else {
|
|
137
153
|
throw new Error("transcribeViaSttService requires either url or bytes");
|
|
138
154
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
const { recordVocabularyUsage } = await import("./agent/vocabulary-glossary.js");
|
|
159
|
-
// Injection alone is not evidence of use. Reward only terms present in
|
|
160
|
-
// the successful transcript, with word boundaries for Latin terms.
|
|
161
|
-
const { containsVocabularyTerm } = await import("./agent/vocabulary-evidence.js");
|
|
162
|
-
const used = vocabularyTermsForUsage.filter((term) => vocabulary.includes(term) && containsVocabularyTerm(text, term));
|
|
163
|
-
recordVocabularyUsage(request.ownerPublicId, used, vocabularySnapshotVersion);
|
|
155
|
+
// URL intake (Telegram CDN → STT service) occasionally fails with undici
|
|
156
|
+
// "fetch failed". Retry a few times here so channel pre-transcription can
|
|
157
|
+
// still succeed before marking the voice note unheard. Do not log the
|
|
158
|
+
// request URL: Telegram file links embed the bot token.
|
|
159
|
+
let lastError;
|
|
160
|
+
for (let attempt = 1; attempt <= STT_TRANSIENT_FETCH_MAX_ATTEMPTS; attempt += 1) {
|
|
161
|
+
const controller = new AbortController();
|
|
162
|
+
const timer = setTimeout(() => controller.abort(), STT_CLIENT_TIMEOUT_MS);
|
|
163
|
+
try {
|
|
164
|
+
const res = await fetch(url, {
|
|
165
|
+
method: "POST",
|
|
166
|
+
headers,
|
|
167
|
+
body,
|
|
168
|
+
signal: controller.signal,
|
|
169
|
+
});
|
|
170
|
+
const payload = (await res.json().catch(() => null));
|
|
171
|
+
if (!res.ok) {
|
|
172
|
+
const detail = payload?.error ?? `HTTP ${res.status}`;
|
|
173
|
+
throw new Error(`cloud STT failed: ${detail}`);
|
|
164
174
|
}
|
|
165
|
-
|
|
166
|
-
|
|
175
|
+
const text = payload?.text?.trim();
|
|
176
|
+
if (!text)
|
|
177
|
+
throw new Error("cloud STT returned no text");
|
|
178
|
+
if (request.ownerPublicId && vocabularySnapshotVersion !== undefined && vocabularyTermsForUsage?.length) {
|
|
179
|
+
try {
|
|
180
|
+
const { recordVocabularyUsage } = await import("./agent/vocabulary-glossary.js");
|
|
181
|
+
// Injection alone is not evidence of use. Reward only terms present in
|
|
182
|
+
// the successful transcript, with word boundaries for Latin terms.
|
|
183
|
+
const { containsVocabularyTerm } = await import("./agent/vocabulary-evidence.js");
|
|
184
|
+
const used = vocabularyTermsForUsage.filter((term) => vocabulary.includes(term) && containsVocabularyTerm(text, term));
|
|
185
|
+
recordVocabularyUsage(request.ownerPublicId, used, vocabularySnapshotVersion);
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
logger.debug("[stt-client] Vocabulary usage update unavailable");
|
|
189
|
+
}
|
|
167
190
|
}
|
|
191
|
+
return { text, vendor: payload?.vendor ?? "unknown" };
|
|
192
|
+
}
|
|
193
|
+
catch (err) {
|
|
194
|
+
lastError = err;
|
|
195
|
+
const canRetry = isTransientSttFetchError(err) && attempt < STT_TRANSIENT_FETCH_MAX_ATTEMPTS;
|
|
196
|
+
if (!canRetry)
|
|
197
|
+
throw err;
|
|
198
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
199
|
+
logger.warn(`[stt-client] Transient STT fetch failure (attempt ${attempt}/${STT_TRANSIENT_FETCH_MAX_ATTEMPTS}): ${detail}`);
|
|
200
|
+
await sleep(STT_TRANSIENT_FETCH_RETRY_DELAY_MS);
|
|
201
|
+
}
|
|
202
|
+
finally {
|
|
203
|
+
clearTimeout(timer);
|
|
168
204
|
}
|
|
169
|
-
return { text, vendor: payload?.vendor ?? "unknown" };
|
|
170
|
-
}
|
|
171
|
-
finally {
|
|
172
|
-
clearTimeout(timer);
|
|
173
205
|
}
|
|
206
|
+
throw lastError instanceof Error ? lastError : new Error(String(lastError));
|
|
174
207
|
}
|
|
175
208
|
//# sourceMappingURL=stt-client.js.map
|
package/dist/stt-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stt-client.js","sourceRoot":"","sources":["../src/stt-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,QAAQ;IACR,OAAO;IACP,OAAO;IACP,UAAU;IACV,YAAY;IACZ,WAAW;IACX,UAAU;IACV,IAAI;IACJ,QAAQ;CACA,CAAC;AAEX,MAAM,CAAC,MAAM,uBAAuB,GAAG,QAAQ,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAErF,wEAAwE;AACxE,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAE5C,SAAS,eAAe,CAAC,GAAG,MAAsC;IAChE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACrC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YACrC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,IAAI,KAAK,CAAC,MAAM,IAAI,wBAAwB;gBAAE,OAAO,KAAK,CAAC;QAC7D,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"stt-client.js","sourceRoot":"","sources":["../src/stt-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -51,6 +51,8 @@ export type ForegroundAdmission = {
|
|
|
51
51
|
export declare class ForegroundTaskTracker {
|
|
52
52
|
private readonly now;
|
|
53
53
|
private readonly isExempt;
|
|
54
|
+
/** Task ids the host accepted since the last reset; in memory for this wake only. */
|
|
55
|
+
private handedOffIds;
|
|
54
56
|
private record;
|
|
55
57
|
private readonly filePath;
|
|
56
58
|
/**
|
|
@@ -69,8 +71,14 @@ export declare class ForegroundTaskTracker {
|
|
|
69
71
|
admit(toolName: string): ForegroundAdmission;
|
|
70
72
|
/** The current task, created when no task call has been made yet, for a handoff. */
|
|
71
73
|
taskForHandoff(): ForegroundTaskRecord;
|
|
72
|
-
/**
|
|
73
|
-
|
|
74
|
+
/**
|
|
75
|
+
* The worker accepted the task: General must not keep writing for it.
|
|
76
|
+
* `acceptedTaskIds` are the ids the host admitted (a batch admits several),
|
|
77
|
+
* kept so the status card can wait for every one of them.
|
|
78
|
+
*/
|
|
79
|
+
markHandedOff(taskId: string, acceptedTaskIds?: readonly string[]): void;
|
|
80
|
+
/** Every task id the host accepted during this wake, in order. */
|
|
81
|
+
handedOffTaskIds(): readonly string[];
|
|
74
82
|
/**
|
|
75
83
|
* A new wake starts. A task handed off in an earlier wake belongs to its
|
|
76
84
|
* worker: follow-ups for it go through the coordination tools, so new task
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"foreground-task.d.ts","sourceRoot":"","sources":["../../src/threads/foreground-task.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAC5C,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AAkB3D,QAAA,MAAM,YAAY;;;;;;;kBASP,CAAC;AAEZ,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAEhE,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED,MAAM,MAAM,mBAAmB,GAC3B;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAC/D;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9E,qBAAa,qBAAqB;
|
|
1
|
+
{"version":3,"file":"foreground-task.d.ts","sourceRoot":"","sources":["../../src/threads/foreground-task.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAC5C,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AAkB3D,QAAA,MAAM,YAAY;;;;;;;kBASP,CAAC;AAEZ,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAEhE,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED,MAAM,MAAM,mBAAmB,GAC3B;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAC/D;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9E,qBAAa,qBAAqB;IAa9B,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAb3B,qFAAqF;IACrF,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAElC;;;;OAIG;gBAED,GAAG,EAAE,MAAM,EACM,GAAG,GAAE,MAAM,IAAuB,EAClC,QAAQ,GAAE,MAAM,OAAqB;IAMxD,IAAI,OAAO,IAAI,oBAAoB,GAAG,IAAI,CAEzC;IAED,IAAI,mBAAmB,IAAI,MAAM,CAEhC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB;IA+B5C,oFAAoF;IACpF,cAAc,IAAI,oBAAoB;IAMtC;;;;OAIG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,GAAE,SAAS,MAAM,EAAa,GAAG,IAAI;IAQlF,kEAAkE;IAClE,gBAAgB,IAAI,SAAS,MAAM,EAAE;IAIrC;;;;;OAKG;IACH,SAAS,IAAI,IAAI;IAKjB,sDAAsD;IACtD,KAAK,IAAI,IAAI;IAUb,OAAO,CAAC,MAAM;IAYd,OAAO,CAAC,IAAI;IASZ,OAAO,CAAC,IAAI;CAGb;AAID,+EAA+E;AAC/E,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI,GAAG,IAAI,CAExF;AAED,wBAAgB,wBAAwB,IAAI,qBAAqB,GAAG,IAAI,CAEvE"}
|
|
@@ -67,6 +67,8 @@ export function countsAsForegroundWork(toolName) {
|
|
|
67
67
|
export class ForegroundTaskTracker {
|
|
68
68
|
now;
|
|
69
69
|
isExempt;
|
|
70
|
+
/** Task ids the host accepted since the last reset; in memory for this wake only. */
|
|
71
|
+
handedOffIds = [];
|
|
70
72
|
record;
|
|
71
73
|
filePath;
|
|
72
74
|
/**
|
|
@@ -112,7 +114,7 @@ export class ForegroundTaskTracker {
|
|
|
112
114
|
reason: [
|
|
113
115
|
`Foreground limit reached: this task already used ${record.toolCallsUsed} of ${FOREGROUND_TOOL_CALL_LIMIT} task tool calls in the conversation.`,
|
|
114
116
|
"If you already have enough to answer, answer now. If you only need a clarification, ask the user.",
|
|
115
|
-
"Otherwise hand the remaining work to a background worker with delegate_task (say what is done, what remains, and any artifacts), tell the user it
|
|
117
|
+
"Otherwise hand the remaining work to a background worker with delegate_task (say what is done, what remains, and any artifacts), tell the user in the first person that you are on it (never mention a background task, a worker or this limit), then call finish.",
|
|
116
118
|
].join(" "),
|
|
117
119
|
};
|
|
118
120
|
}
|
|
@@ -127,14 +129,25 @@ export class ForegroundTaskTracker {
|
|
|
127
129
|
this.save();
|
|
128
130
|
return { ...record, calls: [...record.calls] };
|
|
129
131
|
}
|
|
130
|
-
/**
|
|
131
|
-
|
|
132
|
+
/**
|
|
133
|
+
* The worker accepted the task: General must not keep writing for it.
|
|
134
|
+
* `acceptedTaskIds` are the ids the host admitted (a batch admits several),
|
|
135
|
+
* kept so the status card can wait for every one of them.
|
|
136
|
+
*/
|
|
137
|
+
markHandedOff(taskId, acceptedTaskIds = [taskId]) {
|
|
138
|
+
for (const id of acceptedTaskIds)
|
|
139
|
+
if (!this.handedOffIds.includes(id))
|
|
140
|
+
this.handedOffIds.push(id);
|
|
132
141
|
if (this.record?.taskId !== taskId)
|
|
133
142
|
return;
|
|
134
143
|
this.record.handedOff = true;
|
|
135
144
|
this.record.accountedToolCalls = this.record.toolCallsUsed;
|
|
136
145
|
this.save();
|
|
137
146
|
}
|
|
147
|
+
/** Every task id the host accepted during this wake, in order. */
|
|
148
|
+
handedOffTaskIds() {
|
|
149
|
+
return this.handedOffIds;
|
|
150
|
+
}
|
|
138
151
|
/**
|
|
139
152
|
* A new wake starts. A task handed off in an earlier wake belongs to its
|
|
140
153
|
* worker: follow-ups for it go through the coordination tools, so new task
|
|
@@ -142,12 +155,14 @@ export class ForegroundTaskTracker {
|
|
|
142
155
|
* foreground keeps its count across wakes.
|
|
143
156
|
*/
|
|
144
157
|
beginWake() {
|
|
158
|
+
this.handedOffIds = [];
|
|
145
159
|
if (this.record?.handedOff)
|
|
146
160
|
this.reset();
|
|
147
161
|
}
|
|
148
162
|
/** The task ended: the next task starts from zero. */
|
|
149
163
|
reset() {
|
|
150
164
|
this.record = null;
|
|
165
|
+
this.handedOffIds = [];
|
|
151
166
|
try {
|
|
152
167
|
fs.rmSync(this.filePath, { force: true });
|
|
153
168
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"foreground-task.js","sourceRoot":"","sources":["../../src/threads/foreground-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC;AAC5C,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;AAE3D,iGAAiG;AACjG,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,sBAAsB;IACtB,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI;IAC1E,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM;IAC9D,oBAAoB;IACpB,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IACrD,6CAA6C;IAC7C,QAAQ,EAAE,0BAA0B,EAAE,0BAA0B;IAChE,2EAA2E;IAC3E,2EAA2E;IAC3E,2EAA2E;IAC3E,mCAAmC;IACnC,oCAAoC,EAAE,yBAAyB;CAChE,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IAC7C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,iFAAiF;IACjF,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACtC,2DAA2D;IAC3D,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACrC,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;CAC9D,CAAC,CAAC,MAAM,EAAE,CAAC;AAIZ,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,MAAM,KAAK,GAAG,gCAAgC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9D,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACrD,OAAO,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;AACrD,CAAC;AAMD,MAAM,OAAO,qBAAqB;
|
|
1
|
+
{"version":3,"file":"foreground-task.js","sourceRoot":"","sources":["../../src/threads/foreground-task.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type CommandMessage, type DeliveryTarget } from "../channels/interface.js";
|
|
1
|
+
import { type BackgroundTaskFailure, type BackgroundTaskView, type CommandMessage, type DeliveryTarget } from "../channels/interface.js";
|
|
2
2
|
import type { DeliveryResult } from "../channels/manager.js";
|
|
3
3
|
import type { ExecutionService } from "../agent/state.js";
|
|
4
4
|
import { type Locale } from "../i18n/index.js";
|
|
@@ -19,11 +19,17 @@ export interface ForemanHostDeps {
|
|
|
19
19
|
enqueueToGeneral: (threadId: string, message: CommandMessage) => void;
|
|
20
20
|
/** Send a fallback notice to a recorded reply target. */
|
|
21
21
|
deliver: (target: DeliveryTarget, text: string, threadId: string) => Promise<DeliveryResult>;
|
|
22
|
+
/** Mirror a task's state to the task board of its reply target's channel. */
|
|
23
|
+
publishTask?: (target: DeliveryTarget, task: BackgroundTaskView) => void;
|
|
24
|
+
/** A conversation's Task reached a final state; its progress card stops waiting for it. */
|
|
25
|
+
settleTask?: (threadId: string, taskId: string, state: "completed" | "failed") => void;
|
|
22
26
|
/** The owner's primary target, for a default-thread task dispatched without an inbound message. */
|
|
23
27
|
ownerTarget: () => DeliveryTarget | null;
|
|
24
28
|
locale: () => Locale;
|
|
25
29
|
now?: () => Date;
|
|
26
30
|
}
|
|
31
|
+
/** The plain category the user is told for a failure code (worker-reported failures have none). */
|
|
32
|
+
export declare function failureKind(code: string | undefined): BackgroundTaskFailure;
|
|
27
33
|
export declare class ForemanHost {
|
|
28
34
|
private readonly deps;
|
|
29
35
|
private readonly pendingBatches;
|
|
@@ -44,12 +50,18 @@ export declare class ForemanHost {
|
|
|
44
50
|
* in the thread's durable queue; a throw makes the outbox retry it.
|
|
45
51
|
*/
|
|
46
52
|
deliverEvent(event: ExecutionEvent, caller: ExecutionCaller): Promise<boolean>;
|
|
53
|
+
/** Live execution events: show the delegating chat where each of its tasks stands. */
|
|
54
|
+
publishTaskState(event: ExecutionEvent, caller: ExecutionCaller): void;
|
|
55
|
+
/** A task's current board row from the ledger; null when the task or its run is unknown. */
|
|
56
|
+
taskView(taskId: string): BackgroundTaskView | null;
|
|
47
57
|
/** Deliver the public event content for every obligation that is due. */
|
|
48
58
|
sweep(): Promise<void>;
|
|
49
59
|
private run;
|
|
50
60
|
private envelope;
|
|
51
61
|
/** A task dispatched by this thread; any other thread's task is not visible. */
|
|
52
62
|
private ownedDispatch;
|
|
63
|
+
/** Why the task's latest run did not finish, in plain words for the fallback notice. */
|
|
64
|
+
private failureText;
|
|
53
65
|
private latest;
|
|
54
66
|
private childRecords;
|
|
55
67
|
private parentState;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"foreman-host.d.ts","sourceRoot":"","sources":["../../src/threads/foreman-host.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"foreman-host.d.ts","sourceRoot":"","sources":["../../src/threads/foreman-host.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
-
import { DEFAULT_THREAD_ID } from "../channels/interface.js";
|
|
2
|
+
import { DEFAULT_THREAD_ID, } from "../channels/interface.js";
|
|
3
3
|
import { isDeliveryTarget } from "../channels/delivery-target.js";
|
|
4
4
|
import { taskContinuationRouting } from "../agent/reply-target.js";
|
|
5
5
|
import { resolveWorkspaceCwd } from "../agent/workspace-cwd.js";
|
|
@@ -70,6 +70,27 @@ function describeState(record) {
|
|
|
70
70
|
case "cancelled": return "cancelled";
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
|
+
function boardState(state) {
|
|
74
|
+
switch (state) {
|
|
75
|
+
case "queued": return "queued";
|
|
76
|
+
case "running":
|
|
77
|
+
case "cancel_requested": return "running";
|
|
78
|
+
case "waiting_input": return "waiting";
|
|
79
|
+
case "succeeded": return "completed";
|
|
80
|
+
case "failed": return "failed";
|
|
81
|
+
case "cancelled": return "cancelled";
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/** The plain category the user is told for a failure code (worker-reported failures have none). */
|
|
85
|
+
export function failureKind(code) {
|
|
86
|
+
switch (code) {
|
|
87
|
+
case "budget_exhausted": return "limit";
|
|
88
|
+
case "interrupted":
|
|
89
|
+
case "executor_exit":
|
|
90
|
+
case "executor_refused": return "interrupted";
|
|
91
|
+
default: return "error";
|
|
92
|
+
}
|
|
93
|
+
}
|
|
73
94
|
function fallbackKey(obligation) {
|
|
74
95
|
if (obligation.kind === "question")
|
|
75
96
|
return "foreman.fallback.question";
|
|
@@ -180,6 +201,43 @@ export class ForemanHost {
|
|
|
180
201
|
}
|
|
181
202
|
return direct ? this.sweep().then(() => true) : Promise.resolve(true);
|
|
182
203
|
}
|
|
204
|
+
/** Live execution events: show the delegating chat where each of its tasks stands. */
|
|
205
|
+
publishTaskState(event, caller) {
|
|
206
|
+
if (caller.kind !== "general" || event.type === "progress")
|
|
207
|
+
return;
|
|
208
|
+
const dispatch = this.ownedDispatch(caller.ref, event.taskId);
|
|
209
|
+
const record = this.latest(event.taskId);
|
|
210
|
+
// An older execution's late event must not overwrite its retry's state.
|
|
211
|
+
if (!dispatch || record?.executionId !== event.executionId)
|
|
212
|
+
return;
|
|
213
|
+
const state = boardState(record.state);
|
|
214
|
+
if (state === "completed" || state === "failed" || state === "cancelled") {
|
|
215
|
+
this.deps.settleTask?.(caller.ref, dispatch.taskId, state === "completed" ? "completed" : "failed");
|
|
216
|
+
}
|
|
217
|
+
if (!dispatch.replyTarget || !this.deps.publishTask)
|
|
218
|
+
return;
|
|
219
|
+
this.deps.publishTask(dispatch.replyTarget, {
|
|
220
|
+
taskId: dispatch.taskId,
|
|
221
|
+
title: dispatch.title,
|
|
222
|
+
state,
|
|
223
|
+
...(record.state === "failed" ? { failure: failureKind(record.result?.error?.code) } : {}),
|
|
224
|
+
at: record.updatedAt,
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
/** A task's current board row from the ledger; null when the task or its run is unknown. */
|
|
228
|
+
taskView(taskId) {
|
|
229
|
+
const dispatch = this.deps.store.dispatch(taskId);
|
|
230
|
+
const record = dispatch ? this.latest(taskId) : null;
|
|
231
|
+
if (!dispatch || !record)
|
|
232
|
+
return null;
|
|
233
|
+
return {
|
|
234
|
+
taskId: dispatch.taskId,
|
|
235
|
+
title: dispatch.title,
|
|
236
|
+
state: boardState(record.state),
|
|
237
|
+
...(record.state === "failed" ? { failure: failureKind(record.result?.error?.code) } : {}),
|
|
238
|
+
at: record.updatedAt,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
183
241
|
/** Deliver the public event content for every obligation that is due. */
|
|
184
242
|
async sweep() {
|
|
185
243
|
if (this.sweeping)
|
|
@@ -201,9 +259,11 @@ export class ForemanHost {
|
|
|
201
259
|
? this.allEvents(obligation.executionId).find((event) => event.eventId === obligation.eventId) : undefined;
|
|
202
260
|
const publicText = obligation.publicText ?? (legacyEvent ? publicTaskText(legacyEvent) : null);
|
|
203
261
|
const text = obligation.deliveryMode === "direct" && publicText ? `${dispatch.title}\n\n${publicText}`
|
|
204
|
-
|
|
262
|
+
// A finished result still waits for General's reply; a task that did
|
|
263
|
+
// not finish says so, with the plain reason.
|
|
264
|
+
: obligation.deliveryMode === "review" && obligation.kind === "result" && obligation.status === "succeeded"
|
|
205
265
|
? t("foreman.fallback.review", this.deps.locale(), dispatch.title)
|
|
206
|
-
: [t(fallbackKey(obligation), this.deps.locale(), dispatch.title), publicText].filter(Boolean).join("\n\n");
|
|
266
|
+
: [t(fallbackKey(obligation), this.deps.locale(), dispatch.title, this.failureText(obligation.taskId)), publicText].filter(Boolean).join("\n\n");
|
|
207
267
|
let result;
|
|
208
268
|
try {
|
|
209
269
|
result = await this.deps.deliver(dispatch.replyTarget, text, dispatch.threadId);
|
|
@@ -268,6 +328,10 @@ export class ForemanHost {
|
|
|
268
328
|
const dispatch = this.deps.store.dispatch(taskId);
|
|
269
329
|
return dispatch?.threadId === threadId ? dispatch : null;
|
|
270
330
|
}
|
|
331
|
+
/** Why the task's latest run did not finish, in plain words for the fallback notice. */
|
|
332
|
+
failureText(taskId) {
|
|
333
|
+
return t(`task.failure.${failureKind(this.latest(taskId)?.result?.error?.code)}`, this.deps.locale());
|
|
334
|
+
}
|
|
271
335
|
latest(taskId) {
|
|
272
336
|
return this.deps.executions.latestForTask(taskId, FOREMAN_SCOPE);
|
|
273
337
|
}
|
|
@@ -888,14 +952,14 @@ export class ForemanHost {
|
|
|
888
952
|
lines.push(`Review the child results together. Deliver the overall result with notify_user(${quote}, purpose="completion"). Retry only children that need further work using their child task_id; do not repeat successful children. The parent does not occupy a worker.`);
|
|
889
953
|
}
|
|
890
954
|
else if (status === "succeeded") {
|
|
891
|
-
lines.push(`Check the result against the request before you deliver it. If it holds up, tell the requester with notify_user(${quote}, purpose="completion") in your own words, and
|
|
955
|
+
lines.push(`Check the result against the request before you deliver it. If it holds up, tell the requester with notify_user(${quote}, purpose="completion") in your own words, as your own work and without calling it a background task. Put the actual result in that message (what was found, made, or the output that was asked for), not only that it is done. Send any drafts it contains with the right tool. If it falls short, run it again with delegate_task(retry_task_id="${event.taskId}") and say what must change.`);
|
|
892
956
|
}
|
|
893
957
|
else {
|
|
894
|
-
lines.push(`Tell the requester
|
|
958
|
+
lines.push(`Tell the requester with notify_user(${quote}, purpose="completion") in your own first-person words what went wrong, in plain terms without internal details, and what happens next. Or run it again with delegate_task(retry_task_id="${event.taskId}") if a retry can succeed.`);
|
|
895
959
|
}
|
|
896
960
|
}
|
|
897
961
|
if (obligationOpens)
|
|
898
|
-
lines.push("If this turn ends without that notify_user, the requester gets a short automatic notice instead.");
|
|
962
|
+
lines.push("Send one notify_user per task that names it, even when several tasks report in the same turn. If this turn ends without that notify_user, the requester gets a short automatic notice instead.");
|
|
899
963
|
const routing = taskContinuationRouting(dispatch?.replyTarget
|
|
900
964
|
? { sender: dispatch.sender, delivery: dispatch.replyTarget }
|
|
901
965
|
: undefined);
|
|
@@ -908,7 +972,15 @@ export class ForemanHost {
|
|
|
908
972
|
attachments: [],
|
|
909
973
|
timestamp: event.createdAt,
|
|
910
974
|
...routing,
|
|
911
|
-
meta: {
|
|
975
|
+
meta: {
|
|
976
|
+
...routing.meta,
|
|
977
|
+
[FOREMAN_EVENT_META_KEY]: {
|
|
978
|
+
taskId: event.taskId,
|
|
979
|
+
eventId: event.eventId,
|
|
980
|
+
kind: event.type,
|
|
981
|
+
...(event.type === "result" ? { status: String(payload.status) } : {}),
|
|
982
|
+
},
|
|
983
|
+
},
|
|
912
984
|
...(threadId !== DEFAULT_THREAD_ID ? { threadId } : {}),
|
|
913
985
|
};
|
|
914
986
|
}
|