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.
Files changed (144) hide show
  1. package/dist/agent/browser-launcher.d.ts +19 -1
  2. package/dist/agent/browser-launcher.d.ts.map +1 -1
  3. package/dist/agent/browser-launcher.js +40 -0
  4. package/dist/agent/browser-launcher.js.map +1 -1
  5. package/dist/agent/command-handlers.js +2 -2
  6. package/dist/agent/command-handlers.js.map +1 -1
  7. package/dist/agent/engines/claude/session.d.ts +6 -0
  8. package/dist/agent/engines/claude/session.d.ts.map +1 -1
  9. package/dist/agent/engines/claude/session.js +34 -2
  10. package/dist/agent/engines/claude/session.js.map +1 -1
  11. package/dist/agent/engines/pi/tools.d.ts.map +1 -1
  12. package/dist/agent/engines/pi/tools.js +2 -1
  13. package/dist/agent/engines/pi/tools.js.map +1 -1
  14. package/dist/agent/fund-league-hold.d.ts.map +1 -1
  15. package/dist/agent/fund-league-hold.js +5 -1
  16. package/dist/agent/fund-league-hold.js.map +1 -1
  17. package/dist/agent/interrupt-handler.d.ts.map +1 -1
  18. package/dist/agent/interrupt-handler.js +4 -1
  19. package/dist/agent/interrupt-handler.js.map +1 -1
  20. package/dist/agent/lifecycle-trace.d.ts +3 -2
  21. package/dist/agent/lifecycle-trace.d.ts.map +1 -1
  22. package/dist/agent/lifecycle-trace.js +4 -9
  23. package/dist/agent/lifecycle-trace.js.map +1 -1
  24. package/dist/agent/lifecycle-transitions.d.ts +42 -0
  25. package/dist/agent/lifecycle-transitions.d.ts.map +1 -1
  26. package/dist/agent/lifecycle-transitions.js +62 -6
  27. package/dist/agent/lifecycle-transitions.js.map +1 -1
  28. package/dist/agent/loop.d.ts.map +1 -1
  29. package/dist/agent/loop.js +99 -27
  30. package/dist/agent/loop.js.map +1 -1
  31. package/dist/agent/public-activity.d.ts +1 -1
  32. package/dist/agent/public-activity.d.ts.map +1 -1
  33. package/dist/agent/public-activity.js.map +1 -1
  34. package/dist/agent/runtime-context.d.ts +2 -0
  35. package/dist/agent/runtime-context.d.ts.map +1 -1
  36. package/dist/agent/runtime-context.js +4 -0
  37. package/dist/agent/runtime-context.js.map +1 -1
  38. package/dist/agent/service-gate.d.ts.map +1 -1
  39. package/dist/agent/service-gate.js +4 -1
  40. package/dist/agent/service-gate.js.map +1 -1
  41. package/dist/agent/state.d.ts +14 -0
  42. package/dist/agent/state.d.ts.map +1 -1
  43. package/dist/agent/state.js +13 -5
  44. package/dist/agent/state.js.map +1 -1
  45. package/dist/agent/status.d.ts.map +1 -1
  46. package/dist/agent/status.js +4 -1
  47. package/dist/agent/status.js.map +1 -1
  48. package/dist/agent/system-prompt.d.ts.map +1 -1
  49. package/dist/agent/system-prompt.js +11 -1
  50. package/dist/agent/system-prompt.js.map +1 -1
  51. package/dist/agent/tool-call-watchdog.d.ts +7 -0
  52. package/dist/agent/tool-call-watchdog.d.ts.map +1 -1
  53. package/dist/agent/tool-call-watchdog.js +32 -2
  54. package/dist/agent/tool-call-watchdog.js.map +1 -1
  55. package/dist/agent/wake-cycle-runner.d.ts +11 -0
  56. package/dist/agent/wake-cycle-runner.d.ts.map +1 -1
  57. package/dist/agent/wake-cycle-runner.js +42 -9
  58. package/dist/agent/wake-cycle-runner.js.map +1 -1
  59. package/dist/channels/interface.d.ts +18 -0
  60. package/dist/channels/interface.d.ts.map +1 -1
  61. package/dist/channels/interface.js.map +1 -1
  62. package/dist/channels/qq-status.d.ts.map +1 -1
  63. package/dist/channels/qq-status.js +1 -0
  64. package/dist/channels/qq-status.js.map +1 -1
  65. package/dist/channels/telegram-status.d.ts +22 -4
  66. package/dist/channels/telegram-status.d.ts.map +1 -1
  67. package/dist/channels/telegram-status.js +216 -39
  68. package/dist/channels/telegram-status.js.map +1 -1
  69. package/dist/channels/telegram-task-board.d.ts +79 -0
  70. package/dist/channels/telegram-task-board.d.ts.map +1 -0
  71. package/dist/channels/telegram-task-board.js +384 -0
  72. package/dist/channels/telegram-task-board.js.map +1 -0
  73. package/dist/channels/telegram.d.ts +6 -1
  74. package/dist/channels/telegram.d.ts.map +1 -1
  75. package/dist/channels/telegram.js +31 -2
  76. package/dist/channels/telegram.js.map +1 -1
  77. package/dist/i18n/messages.d.ts +248 -0
  78. package/dist/i18n/messages.d.ts.map +1 -1
  79. package/dist/i18n/messages.js +79 -13
  80. package/dist/i18n/messages.js.map +1 -1
  81. package/dist/obs/tunnel.d.ts +9 -1
  82. package/dist/obs/tunnel.d.ts.map +1 -1
  83. package/dist/obs/tunnel.js +121 -54
  84. package/dist/obs/tunnel.js.map +1 -1
  85. package/dist/stt-client.d.ts +10 -0
  86. package/dist/stt-client.d.ts.map +1 -1
  87. package/dist/stt-client.js +64 -31
  88. package/dist/stt-client.js.map +1 -1
  89. package/dist/threads/foreground-task.d.ts +10 -2
  90. package/dist/threads/foreground-task.d.ts.map +1 -1
  91. package/dist/threads/foreground-task.js +18 -3
  92. package/dist/threads/foreground-task.js.map +1 -1
  93. package/dist/threads/foreman-host.d.ts +13 -1
  94. package/dist/threads/foreman-host.d.ts.map +1 -1
  95. package/dist/threads/foreman-host.js +79 -7
  96. package/dist/threads/foreman-host.js.map +1 -1
  97. package/dist/threads/foreman-protocol.d.ts +2 -0
  98. package/dist/threads/foreman-protocol.d.ts.map +1 -1
  99. package/dist/threads/foreman-protocol.js +3 -1
  100. package/dist/threads/foreman-protocol.js.map +1 -1
  101. package/dist/threads/process-group.js +7 -2
  102. package/dist/threads/process-group.js.map +1 -1
  103. package/dist/threads/relay-adapter.d.ts +2 -0
  104. package/dist/threads/relay-adapter.d.ts.map +1 -1
  105. package/dist/threads/relay-adapter.js +6 -0
  106. package/dist/threads/relay-adapter.js.map +1 -1
  107. package/dist/threads/task-settlement.d.ts +17 -0
  108. package/dist/threads/task-settlement.d.ts.map +1 -0
  109. package/dist/threads/task-settlement.js +34 -0
  110. package/dist/threads/task-settlement.js.map +1 -0
  111. package/dist/threads/thread-activity-controller.d.ts +21 -0
  112. package/dist/threads/thread-activity-controller.d.ts.map +1 -1
  113. package/dist/threads/thread-activity-controller.js +111 -3
  114. package/dist/threads/thread-activity-controller.js.map +1 -1
  115. package/dist/tools/browser-health.d.ts +2 -0
  116. package/dist/tools/browser-health.d.ts.map +1 -0
  117. package/dist/tools/browser-health.js +18 -0
  118. package/dist/tools/browser-health.js.map +1 -0
  119. package/dist/tools/browser-set-engine.js +1 -1
  120. package/dist/tools/browser-set-engine.js.map +1 -1
  121. package/dist/tools/delegation.d.ts +7 -0
  122. package/dist/tools/delegation.d.ts.map +1 -1
  123. package/dist/tools/delegation.js +30 -3
  124. package/dist/tools/delegation.js.map +1 -1
  125. package/dist/tools/fund-league.d.ts +4 -0
  126. package/dist/tools/fund-league.d.ts.map +1 -1
  127. package/dist/tools/fund-league.js +1 -1
  128. package/dist/tools/fund-league.js.map +1 -1
  129. package/dist/tools/index.d.ts.map +1 -1
  130. package/dist/tools/index.js +2 -0
  131. package/dist/tools/index.js.map +1 -1
  132. package/dist/tools/upgrade.d.ts +2 -1
  133. package/dist/tools/upgrade.d.ts.map +1 -1
  134. package/dist/tools/upgrade.js +26 -8
  135. package/dist/tools/upgrade.js.map +1 -1
  136. package/dist/utils/restart.d.ts +6 -0
  137. package/dist/utils/restart.d.ts.map +1 -1
  138. package/dist/utils/restart.js +7 -1
  139. package/dist/utils/restart.js.map +1 -1
  140. package/dist/utils/version-check.d.ts.map +1 -1
  141. package/dist/utils/version-check.js +19 -9
  142. package/dist/utils/version-check.js.map +1 -1
  143. package/dist-agent/bundle.cjs +2 -2
  144. package/package.json +1 -1
@@ -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
- const controller = new AbortController();
140
- const timer = setTimeout(() => controller.abort(), STT_CLIENT_TIMEOUT_MS);
141
- try {
142
- const res = await fetch(url, {
143
- method: "POST",
144
- headers,
145
- body,
146
- signal: controller.signal,
147
- });
148
- const payload = (await res.json().catch(() => null));
149
- if (!res.ok) {
150
- const detail = payload?.error ?? `HTTP ${res.status}`;
151
- throw new Error(`cloud STT failed: ${detail}`);
152
- }
153
- const text = payload?.text?.trim();
154
- if (!text)
155
- throw new Error("cloud STT returned no text");
156
- if (request.ownerPublicId && vocabularySnapshotVersion !== undefined && vocabularyTermsForUsage?.length) {
157
- try {
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
- catch {
166
- logger.debug("[stt-client] Vocabulary usage update unavailable");
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
@@ -1 +1 @@
1
- {"version":3,"file":"stt-client.js","sourceRoot":"","sources":["../src/stt-client.ts"],"names":[],"mappings":"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"}
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;AAE5C;;;;GAIG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,CAAC;AAElD,qDAAqD;AACrD,MAAM,CAAC,MAAM,kCAAkC,GAAG,GAAG,CAAC;AAEtD,6EAA6E;AAC7E,MAAM,UAAU,wBAAwB,CAAC,GAAY;IACnD,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AA8BD,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C;QACE,KAAK,CAAC,kDAAkD,CAAC,CAAC;QAC1D,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED,oEAAoE;AACpE,MAAM,UAAU,eAAe,CAAC,MAAwB;IACtD,OAAO,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAAwB,EACxB,OAAyB;IAEzB,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,qBAAqB,EAAE,CAAC;IAE/C,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,uBAAuB,CAAC;IACvD,MAAM,mBAAmB,GAAG,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACjG,IAAI,UAAU,GAAG,eAAe,CAAC,wBAAwB,EAAE,mBAAmB,CAAC,CAAC;IAChF,IAAI,uBAA6C,CAAC;IAClD,IAAI,yBAA6C,CAAC;IAElD,gEAAgE;IAChE,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,EAAE,sBAAsB,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;YAClF,MAAM,EAAE,0BAA0B,EAAE,GAAG,MAAM,MAAM,CAAC,iCAAiC,CAAC,CAAC;YAEvF,MAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC/D,MAAM,SAAS,GAAG,0BAA0B,CAAC,QAAQ,EAAE,MAAM,EAAE;gBAC7D,QAAQ,EAAE,OAAO,CAAC,kBAAkB,IAAI,OAAO,CAAC,QAAQ;aACzD,CAAC,CAAC;YAEH,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;gBAC1B,UAAU,GAAG,eAAe,CAAC,wBAAwB,EAAE,SAAS,CAAC,kBAAkB,EAAE,mBAAmB,CAAC,CAAC;gBAC1G,uBAAuB,GAAG,SAAS,CAAC,aAAa,CAAC;gBAClD,yBAAyB,GAAG,SAAS,CAAC,eAAe,CAAC;gBACtD,MAAM,CAAC,IAAI,CACT,yBAAyB,SAAS,CAAC,iBAAiB,gCAAgC,SAAS,CAAC,eAAe,GAAG,CACjH,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,2EAA2E;YAC3E,MAAM,CAAC,IAAI,CACT,+CAA+C,CAChD,CAAC;QACJ,CAAC;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,GAAG,iBAAiB,CAAC,MAAM,CAAC,iBAAiB,CAAC;IAE/D,MAAM,OAAO,GAA2B,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE,CAAC;IAC9E,IAAI,IAAqB,CAAC;IAC1B,MAAM,GAAG,GAAG,QAAQ,CAAC;IAErB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;QAC7C,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;YACpB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,MAAM;YACN,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,UAAU;SACX,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACzB,mEAAmE;QACnE,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;QAC7C,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;YACpB,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC1D,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,0BAA0B;YACxD,MAAM;YACN,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,UAAU;SACX,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IAED,yEAAyE;IACzE,0EAA0E;IAC1E,sEAAsE;IACtE,wDAAwD;IACxD,IAAI,SAAkB,CAAC;IACvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,gCAAgC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QAChF,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,qBAAqB,CAAC,CAAC;QAC1E,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAC3B,MAAM,EAAE,MAAM;gBACd,OAAO;gBACP,IAAI;gBACJ,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAE3C,CAAC;YACT,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,MAAM,GAAG,OAAO,EAAE,KAAK,IAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;gBACtD,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,EAAE,CAAC,CAAC;YACjD,CAAC;YACD,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YACnC,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;YACzD,IAAI,OAAO,CAAC,aAAa,IAAI,yBAAyB,KAAK,SAAS,IAAI,uBAAuB,EAAE,MAAM,EAAE,CAAC;gBACxG,IAAI,CAAC;oBACH,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;oBACjF,uEAAuE;oBACvE,mEAAmE;oBACnE,MAAM,EAAE,sBAAsB,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;oBAClF,MAAM,IAAI,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,sBAAsB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;oBACvH,qBAAqB,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,EAAE,yBAAyB,CAAC,CAAC;gBAChF,CAAC;gBAAC,MAAM,CAAC;oBACP,MAAM,CAAC,KAAK,CACV,kDAAkD,CACnD,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,GAAG,GAAG,CAAC;YAChB,MAAM,QAAQ,GACZ,wBAAwB,CAAC,GAAG,CAAC,IAAI,OAAO,GAAG,gCAAgC,CAAC;YAC9E,IAAI,CAAC,QAAQ;gBAAE,MAAM,GAAG,CAAC;YACzB,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAChE,MAAM,CAAC,IAAI,CACT,qDAAqD,OAAO,IAAI,gCAAgC,MAAM,MAAM,EAAE,CAC/G,CAAC;YACF,MAAM,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAClD,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,MAAM,SAAS,YAAY,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;AAC9E,CAAC"}
@@ -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
- /** The worker accepted the task: General must not keep writing for it. */
73
- markHandedOff(taskId: string): void;
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;IAW9B,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAX3B,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,0EAA0E;IAC1E,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAOnC;;;;;OAKG;IACH,SAAS,IAAI,IAAI;IAIjB,sDAAsD;IACtD,KAAK,IAAI,IAAI;IASb,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"}
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 is running in the background, then call finish.",
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
- /** The worker accepted the task: General must not keep writing for it. */
131
- markHandedOff(taskId) {
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":"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"}
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":"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"}
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
- : obligation.deliveryMode === "review" && obligation.kind === "result"
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 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.`);
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 what happened with notify_user(${quote}, purpose="completion"), or run it again with delegate_task(retry_task_id="${event.taskId}") if a retry can succeed.`);
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: { ...routing.meta, [FOREMAN_EVENT_META_KEY]: { taskId: event.taskId, eventId: event.eventId } },
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
  }