cli-jaw 2.17.46 → 2.17.47

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 (169) hide show
  1. package/README.md +4 -0
  2. package/dist/bin/commands/browser-web-ai.js +29 -10
  3. package/dist/bin/commands/browser-web-ai.js.map +1 -1
  4. package/dist/server.js +2 -2
  5. package/dist/server.js.map +1 -1
  6. package/dist/src/agent/claude-runtime-run.js +2 -1
  7. package/dist/src/agent/claude-runtime-run.js.map +1 -1
  8. package/dist/src/agent/lifecycle-handler.js +15 -4
  9. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  10. package/dist/src/agent/pi-runtime.js +103 -86
  11. package/dist/src/agent/pi-runtime.js.map +1 -1
  12. package/dist/src/agent/spawn/exit-settle.js +74 -0
  13. package/dist/src/agent/spawn/exit-settle.js.map +1 -0
  14. package/dist/src/agent/spawn/kill-reason.js +38 -0
  15. package/dist/src/agent/spawn/kill-reason.js.map +1 -0
  16. package/dist/src/agent/spawn/queue.js +8 -0
  17. package/dist/src/agent/spawn/queue.js.map +1 -1
  18. package/dist/src/agent/spawn/steer-event.js +33 -0
  19. package/dist/src/agent/spawn/steer-event.js.map +1 -0
  20. package/dist/src/agent/spawn.js +157 -173
  21. package/dist/src/agent/spawn.js.map +1 -1
  22. package/dist/src/agent/watchdog.js +9 -4
  23. package/dist/src/agent/watchdog.js.map +1 -1
  24. package/dist/src/browser/adaptive-fetch/browser-escalation.js +18 -1
  25. package/dist/src/browser/adaptive-fetch/browser-escalation.js.map +1 -1
  26. package/dist/src/browser/adaptive-fetch/browser-flow.js +36 -9
  27. package/dist/src/browser/adaptive-fetch/browser-flow.js.map +1 -1
  28. package/dist/src/browser/adaptive-fetch/browser-session.js +10 -1
  29. package/dist/src/browser/adaptive-fetch/browser-session.js.map +1 -1
  30. package/dist/src/browser/adaptive-fetch/camoufox-session.js +16 -1
  31. package/dist/src/browser/adaptive-fetch/camoufox-session.js.map +1 -1
  32. package/dist/src/browser/adaptive-fetch/defuddle-provenance.js +49 -0
  33. package/dist/src/browser/adaptive-fetch/defuddle-provenance.js.map +1 -0
  34. package/dist/src/browser/adaptive-fetch/endpoint-resolvers.js +61 -31
  35. package/dist/src/browser/adaptive-fetch/endpoint-resolvers.js.map +1 -1
  36. package/dist/src/browser/adaptive-fetch/fetcher.js +12 -1
  37. package/dist/src/browser/adaptive-fetch/fetcher.js.map +1 -1
  38. package/dist/src/browser/adaptive-fetch/live-smoke-manifest.js +12 -18
  39. package/dist/src/browser/adaptive-fetch/live-smoke-manifest.js.map +1 -1
  40. package/dist/src/browser/adaptive-fetch/public-endpoint-normalizers.js +85 -1
  41. package/dist/src/browser/adaptive-fetch/public-endpoint-normalizers.js.map +1 -1
  42. package/dist/src/browser/adaptive-fetch/safety.js +5 -3
  43. package/dist/src/browser/adaptive-fetch/safety.js.map +1 -1
  44. package/dist/src/browser/adaptive-fetch/scheduler.js +34 -5
  45. package/dist/src/browser/adaptive-fetch/scheduler.js.map +1 -1
  46. package/dist/src/browser/adaptive-fetch/tls-fetch.js +54 -33
  47. package/dist/src/browser/adaptive-fetch/tls-fetch.js.map +1 -1
  48. package/dist/src/browser/adaptive-fetch/vendor/README.md +33 -1
  49. package/dist/src/browser/adaptive-fetch/ytdlp-reader.js +54 -9
  50. package/dist/src/browser/adaptive-fetch/ytdlp-reader.js.map +1 -1
  51. package/dist/src/browser/web-ai/capability-observation-presets.js +12 -10
  52. package/dist/src/browser/web-ai/capability-observation-presets.js.map +1 -1
  53. package/dist/src/browser/web-ai/chatgpt-model.js +80 -7
  54. package/dist/src/browser/web-ai/chatgpt-model.js.map +1 -1
  55. package/dist/src/browser/web-ai/gemini-model.js +18 -0
  56. package/dist/src/browser/web-ai/gemini-model.js.map +1 -1
  57. package/dist/src/browser/web-ai/grok-model.js +64 -15
  58. package/dist/src/browser/web-ai/grok-model.js.map +1 -1
  59. package/dist/src/code-mode/providers/codex-app.js +83 -0
  60. package/dist/src/code-mode/providers/codex-app.js.map +1 -1
  61. package/dist/src/core/config.js +77 -73
  62. package/dist/src/core/config.js.map +1 -1
  63. package/dist/src/core/db.js +227 -151
  64. package/dist/src/core/db.js.map +1 -1
  65. package/dist/src/core/settings-merge.js +78 -102
  66. package/dist/src/core/settings-merge.js.map +1 -1
  67. package/dist/src/discord/bot.js +37 -54
  68. package/dist/src/discord/bot.js.map +1 -1
  69. package/dist/src/discord/discord-file.js +29 -3
  70. package/dist/src/discord/discord-file.js.map +1 -1
  71. package/dist/src/discord/send-only-client.js +56 -8
  72. package/dist/src/discord/send-only-client.js.map +1 -1
  73. package/dist/src/manager/routes/telegram-hub.js +8 -1
  74. package/dist/src/manager/routes/telegram-hub.js.map +1 -1
  75. package/dist/src/manager/telegram-hub/hub-bot.js +7 -1
  76. package/dist/src/manager/telegram-hub/hub-bot.js.map +1 -1
  77. package/dist/src/messaging/delivery-outcome.js +30 -0
  78. package/dist/src/messaging/delivery-outcome.js.map +1 -1
  79. package/dist/src/messaging/file-receipt.js +49 -0
  80. package/dist/src/messaging/file-receipt.js.map +1 -0
  81. package/dist/src/messaging/native-body.js +31 -0
  82. package/dist/src/messaging/native-body.js.map +1 -0
  83. package/dist/src/messaging/queue-notice-record.js +48 -0
  84. package/dist/src/messaging/queue-notice-record.js.map +1 -0
  85. package/dist/src/messaging/send.js +13 -2
  86. package/dist/src/messaging/send.js.map +1 -1
  87. package/dist/src/messaging/target-reply-guard.js +66 -0
  88. package/dist/src/messaging/target-reply-guard.js.map +1 -0
  89. package/dist/src/orchestrator/collect.js +18 -3
  90. package/dist/src/orchestrator/collect.js.map +1 -1
  91. package/dist/src/orchestrator/gateway.js +3 -1
  92. package/dist/src/orchestrator/gateway.js.map +1 -1
  93. package/dist/src/orchestrator/pipeline.js +7 -1
  94. package/dist/src/orchestrator/pipeline.js.map +1 -1
  95. package/dist/src/orchestrator/session-lanes.js +2 -2
  96. package/dist/src/orchestrator/session-lanes.js.map +1 -1
  97. package/dist/src/prompt/builder.js +2 -2
  98. package/dist/src/prompt/builder.js.map +1 -1
  99. package/dist/src/routes/i18n.js +9 -4
  100. package/dist/src/routes/i18n.js.map +1 -1
  101. package/dist/src/routes/instance.js +8 -4
  102. package/dist/src/routes/instance.js.map +1 -1
  103. package/dist/src/routes/jaw-memory.js +5 -5
  104. package/dist/src/routes/jaw-memory.js.map +1 -1
  105. package/dist/src/routes/link-preview.js +5 -1
  106. package/dist/src/routes/link-preview.js.map +1 -1
  107. package/dist/src/routes/memory.js +9 -7
  108. package/dist/src/routes/memory.js.map +1 -1
  109. package/dist/src/routes/messaging.js +21 -10
  110. package/dist/src/routes/messaging.js.map +1 -1
  111. package/dist/src/routes/orchestrate.js +127 -118
  112. package/dist/src/routes/orchestrate.js.map +1 -1
  113. package/dist/src/routes/settings.js +7 -7
  114. package/dist/src/routes/settings.js.map +1 -1
  115. package/dist/src/routes/system.js +9 -4
  116. package/dist/src/routes/system.js.map +1 -1
  117. package/dist/src/slack/bot.js +199 -132
  118. package/dist/src/slack/bot.js.map +1 -1
  119. package/dist/src/slack/events.js +31 -8
  120. package/dist/src/slack/events.js.map +1 -1
  121. package/dist/src/slack/ingress.js +3 -1
  122. package/dist/src/slack/ingress.js.map +1 -1
  123. package/dist/src/slack/progress-activity.js +24 -3
  124. package/dist/src/slack/progress-activity.js.map +1 -1
  125. package/dist/src/slack/progress-lifecycle.js +29 -0
  126. package/dist/src/slack/progress-lifecycle.js.map +1 -1
  127. package/dist/src/slack/progress.js +1 -1
  128. package/dist/src/slack/progress.js.map +1 -1
  129. package/dist/src/slack/send-only-client.js +16 -3
  130. package/dist/src/slack/send-only-client.js.map +1 -1
  131. package/dist/src/slack/slack-file.js +5 -3
  132. package/dist/src/slack/slack-file.js.map +1 -1
  133. package/dist/src/slack/workflow.js +134 -0
  134. package/dist/src/slack/workflow.js.map +1 -0
  135. package/dist/src/telegram/bot.js +60 -55
  136. package/dist/src/telegram/bot.js.map +1 -1
  137. package/dist/src/telegram/rich-message.js +28 -20
  138. package/dist/src/telegram/rich-message.js.map +1 -1
  139. package/dist/src/telegram/telegram-file.js +45 -9
  140. package/dist/src/telegram/telegram-file.js.map +1 -1
  141. package/dist/src/trace/activity-journal.js +3 -6
  142. package/dist/src/trace/activity-journal.js.map +1 -1
  143. package/dist/src/trace/activity-retention.js +29 -0
  144. package/dist/src/trace/activity-retention.js.map +1 -1
  145. package/package.json +1 -1
  146. package/public/dist/.vite/manifest.json +20 -20
  147. package/public/dist/assets/{ChannelEnablementControl-DwUDKjX9.js → ChannelEnablementControl-egwTtO9-.js} +8 -8
  148. package/public/dist/assets/{ChannelSetupEntry-DH0AuNNX.js → ChannelSetupEntry-CCrUYd2-.js} +1 -1
  149. package/public/dist/assets/{ChannelsDiscord-7NmoTjR7.js → ChannelsDiscord-B6rJAsQG.js} +1 -1
  150. package/public/dist/assets/{ChannelsSlack-Ba0ax6iT.js → ChannelsSlack-CrSIw4Wd.js} +1 -1
  151. package/public/dist/assets/{ChannelsTelegram-DKA9atf2.js → ChannelsTelegram-DPrdLEnT.js} +1 -1
  152. package/public/dist/assets/CodeCanvas-D5jp8-t5.js +2 -0
  153. package/public/dist/assets/{manager-iX7KosWI.js → manager-CFwOAoe0.js} +2 -2
  154. package/public/dist/assets/{settings-embedding-DIqST-91.js → settings-embedding-DspkJ6sr.js} +1 -1
  155. package/public/dist/assets/{settings-KIPNUOIV.js → settings-qkC0NuQ7.js} +1 -1
  156. package/public/dist/manager/index.html +1 -1
  157. package/public/dist/settings/index.html +1 -1
  158. package/public/locales/en.json +9 -3
  159. package/public/locales/ja.json +9 -3
  160. package/public/locales/ko.json +9 -3
  161. package/public/locales/zh.json +9 -3
  162. package/public/manager/src/code/CodeWorkbench.tsx +11 -4
  163. package/public/manager/src/code/code-controller-draft-storage.ts +7 -3
  164. package/public/manager/src/code/code-controller-drafts.ts +9 -2
  165. package/public/manager/src/code/code-controller-runtime.ts +125 -12
  166. package/public/manager/src/code/code-controller-types.ts +2 -0
  167. package/public/manager/src/code/pending-user-item.ts +5 -0
  168. package/scripts/ci/windows-unit-manifest.txt +6 -0
  169. package/public/dist/assets/CodeCanvas-DWsx6sv5.js +0 -2
@@ -105,123 +105,99 @@ export function sanitizeSettingsInput(input, source) {
105
105
  rejectedPaths,
106
106
  };
107
107
  }
108
+ export const SETTINGS_MERGE_SPEC = {
109
+ perCli: { kind: 'perEntry' },
110
+ activeOverrides: { kind: 'perEntry' },
111
+ telegram: { kind: 'nested', children: ['ack'] },
112
+ discord: { kind: 'nested', children: ['ack'] },
113
+ slack: { kind: 'nested', children: ['ack', 'autoJoin'] },
114
+ dispatchApproval: { kind: 'nested', children: ['operators'] },
115
+ network: { kind: 'nested', children: ['remoteAccess'] },
116
+ runtime: { kind: 'nested', children: ['codexApp'] },
117
+ multiSession: { kind: 'nested', children: ['channels'] },
118
+ avatar: { kind: 'nested', children: ['agent', 'user'] },
119
+ messaging: { kind: 'nested', children: ['latestSeen', 'lastActive'] },
120
+ heartbeat: { kind: 'shallow' },
121
+ telegramHub: { kind: 'shallow' },
122
+ memory: { kind: 'shallow' },
123
+ stt: { kind: 'shallow' },
124
+ jawCeo: { kind: 'shallow' },
125
+ pi: { kind: 'shallow' },
126
+ tui: { kind: 'shallow' },
127
+ wiki: { kind: 'shallow' },
128
+ code: { kind: 'shallow' },
129
+ search: { kind: 'shallow' },
130
+ trace: { kind: 'shallow' },
131
+ presentation: { kind: 'shallow' },
132
+ };
133
+ /** Lay the incoming document over the base per SETTINGS_MERGE_SPEC, mutating neither. */
134
+ export function mergeSettingsLayer(base, incoming) {
135
+ const result = { ...base };
136
+ for (const [key, value] of Object.entries(incoming)) {
137
+ const rule = SETTINGS_MERGE_SPEC[key];
138
+ // A scalar, an array or an explicit null replaces the block. Only an
139
+ // object can be merged into one, and only a named key is merged at all.
140
+ if (!rule || !isPlainRecord(value)) {
141
+ result[key] = value;
142
+ continue;
143
+ }
144
+ const current = isPlainRecord(base[key]) ? base[key] : {};
145
+ if (rule.kind === 'perEntry') {
146
+ const merged = { ...current };
147
+ for (const [entry, cfg] of Object.entries(value)) {
148
+ merged[entry] = isPlainRecord(cfg) && isPlainRecord(merged[entry])
149
+ ? { ...merged[entry], ...cfg }
150
+ : cfg;
151
+ }
152
+ result[key] = merged;
153
+ continue;
154
+ }
155
+ const merged = { ...current, ...value };
156
+ if (rule.kind === 'nested') {
157
+ for (const child of rule.children) {
158
+ if (!isPlainRecord(value[child]))
159
+ continue;
160
+ const childBase = isPlainRecord(current[child]) ? current[child] : {};
161
+ merged[child] = { ...childBase, ...value[child] };
162
+ }
163
+ }
164
+ result[key] = merged;
165
+ }
166
+ return result;
167
+ }
108
168
  /**
109
169
  * settings 객체에 patch를 deep merge
110
- * perCli와 activeOverrides는 CLI별로 개별 merge (기존 effort/model 보존)
111
170
  * @param {object} current - 현재 settings
112
171
  * @param {object} patch - 적용할 패치
113
172
  * @returns {object} 새 settings (current를 직접 변경하지 않음)
114
173
  */
115
174
  export function mergeSettingsPatch(current, patch) {
116
- const result = structuredClone(current);
117
- const remaining = { ...patch };
118
- // Deep merge perCli at per-CLI level
119
- if (remaining["perCli"] && typeof remaining["perCli"] === 'object') {
120
- result["perCli"] = result["perCli"] || {};
121
- for (const [cli, cfg] of Object.entries(remaining["perCli"])) {
122
- result["perCli"][cli] = { ...result["perCli"][cli], ...cfg };
123
- }
124
- delete remaining["perCli"];
125
- }
126
- // Deep merge activeOverrides at per-CLI level
127
- if (remaining["activeOverrides"] && typeof remaining["activeOverrides"] === 'object') {
128
- result["activeOverrides"] = result["activeOverrides"] || {};
129
- for (const [cli, cfg] of Object.entries(remaining["activeOverrides"])) {
130
- result["activeOverrides"][cli] = { ...result["activeOverrides"][cli], ...cfg };
131
- }
132
- delete remaining["activeOverrides"];
133
- }
134
- // Deep merge nested objects. A key missing from this list is REPLACED wholesale by a
135
- // partial patch, so `{wiki:{promptDigest:true}}` would silently drop the root and the
136
- // enabled flag along with it.
137
- if (remaining["dispatchApproval"]?.operators && typeof remaining["dispatchApproval"].operators === 'object') {
138
- result["dispatchApproval"] = result["dispatchApproval"] || {};
139
- remaining["dispatchApproval"] = { ...remaining["dispatchApproval"] };
140
- result["dispatchApproval"].operators = {
141
- ...(result["dispatchApproval"].operators || {}),
142
- ...remaining["dispatchApproval"].operators,
143
- };
144
- delete remaining["dispatchApproval"].operators;
145
- }
146
- for (const key of ['heartbeat', 'telegram', 'telegramHub', 'discord', 'slack', 'dispatchApproval', 'memory', 'stt', 'jawCeo', 'pi', 'tui', 'messaging', 'network', 'wiki', 'presentation']) {
147
- if (remaining[key] && typeof remaining[key] === 'object') {
148
- result[key] = { ...result[key], ...remaining[key] };
149
- delete remaining[key];
150
- }
151
- }
152
- // The loop above merges channel objects one level deep, so a patch carrying
153
- // only {ack:{enabled:true}} would drop scope, emoji and removeAfterReply.
154
- // Reads `patch` rather than `remaining` because the loop already deleted the
155
- // key. Shares mergeAckSettings with the boot merge in config.ts so the three
156
- // ingresses (boot/api/watch) cannot diverge.
175
+ // The layer speaks in unknown so it adds no any-typed surface; the patch API
176
+ // has always handed callers an indexable settings object, so it keeps doing so.
177
+ const result = mergeSettingsLayer(structuredClone(current), patch);
178
+ // Normalization, not merging. ack.emoji is a third level the spec does not
179
+ // reach, and slack.autoJoin has to be REPAIRED rather than combined: its
180
+ // budget reaches a loop that joins real channels, so {autoJoin:null} and
181
+ // {autoJoin:'yes'} must not survive to disk, where the next boot would read
182
+ // them as absent and quietly restore default-on. Reads the original patch
183
+ // because the layer above has already consumed the key.
157
184
  for (const key of ['telegram', 'discord', 'slack']) {
158
185
  const patchChannel = patch[key];
159
- if (!patchChannel || typeof patchChannel !== 'object')
186
+ if (!isPlainRecord(patchChannel))
160
187
  continue;
161
- const patchAck = patchChannel["ack"];
162
- const currentChannel = current[key];
163
- if (patchAck && typeof patchAck === 'object' && !Array.isArray(patchAck)) {
188
+ const currentChannel = isPlainRecord(current[key]) ? current[key] : undefined;
189
+ const patchAck = patchChannel['ack'];
190
+ if (isPlainRecord(patchAck)) {
191
+ result[key] = { ...result[key], ack: mergeAckSettings(currentChannel?.['ack'], patchAck) };
192
+ }
193
+ // Any mention of autoJoin is repaired, including a malformed one.
194
+ if (key === 'slack' && 'autoJoin' in patchChannel) {
164
195
  result[key] = {
165
196
  ...result[key],
166
- ack: mergeAckSettings(currentChannel?.["ack"], patchAck),
167
- };
168
- }
169
- // slack.autoJoin is the same nested-group case, and its budget reaches
170
- // a loop that joins real channels — so this path normalizes as well as
171
- // merges. A PUT carrying {autoJoin:{enabled:false}} must not erase
172
- // maxJoinsPerRun, and {maxJoinsPerRun:-1} must not reach the runner.
173
- if (key === 'slack') {
174
- const slackPatch = patchChannel;
175
- const patchAutoJoin = slackPatch["autoJoin"];
176
- // Any mention of the key is repaired, including a malformed one.
177
- // Testing for a well-formed object would let {autoJoin:null} and
178
- // {autoJoin:'yes'} through the one-level spread above and survive
179
- // to disk, where the next boot reads them as "absent" and quietly
180
- // restores default-on. A patch that names the key gets a valid
181
- // block or nothing.
182
- if ('autoJoin' in slackPatch) {
183
- result[key] = {
184
- ...result[key],
185
- autoJoin: mergeSlackAutoJoin(currentChannel?.["autoJoin"], patchAutoJoin),
186
- };
187
- }
188
- }
189
- }
190
- // Deep merge nested network.remoteAccess
191
- if (remaining["network"]?.remoteAccess && typeof remaining["network"].remoteAccess === 'object') {
192
- result["network"] = result["network"] || {};
193
- result["network"].remoteAccess = { ...result["network"].remoteAccess, ...remaining["network"].remoteAccess };
194
- delete remaining["network"].remoteAccess;
195
- }
196
- // runtime.codexApp is a two-level merge boundary: a multiplex-only patch
197
- // must preserve both other runtime blocks and codexApp-owned siblings.
198
- if (isPlainRecord(remaining["runtime"])) {
199
- const runtimePatch = remaining["runtime"];
200
- result["runtime"] = { ...(result["runtime"] || {}), ...runtimePatch };
201
- if (isPlainRecord(runtimePatch["codexApp"])) {
202
- result["runtime"].codexApp = {
203
- ...(current["runtime"]?.codexApp || {}),
204
- ...runtimePatch["codexApp"],
205
- };
206
- }
207
- delete remaining["runtime"];
208
- }
209
- // multiSession.channels is the same shape of boundary. An enabled-only patch must
210
- // keep midRunPolicy and the channel gates, and a single-channel patch must keep the
211
- // other two channels — which is exactly what a per-channel session gate will send.
212
- if (isPlainRecord(remaining["multiSession"])) {
213
- const sessionPatch = remaining["multiSession"];
214
- result["multiSession"] = { ...(result["multiSession"] || {}), ...sessionPatch };
215
- if (isPlainRecord(sessionPatch["channels"])) {
216
- result["multiSession"].channels = {
217
- ...(current["multiSession"]?.channels || {}),
218
- ...sessionPatch["channels"],
197
+ autoJoin: mergeSlackAutoJoin(currentChannel?.['autoJoin'], patchChannel['autoJoin']),
219
198
  };
220
199
  }
221
- delete remaining["multiSession"];
222
200
  }
223
- // Top-level scalar fields
224
- Object.assign(result, remaining);
225
201
  return result;
226
202
  }
227
203
  //# sourceMappingURL=settings-merge.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings-merge.js","sourceRoot":"","sources":["../../../src/core/settings-merge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"settings-merge.js","sourceRoot":"","sources":["../../../src/core/settings-merge.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,gEAAgE;AAEhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAC1F,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAa/D,SAAS,aAAa,CAAC,KAAc;IACjC,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACzE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACjC,KAA0B,EAC1B,MAA2B;IAE3B,MAAM,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;IAC3B,MAAM,gBAAgB,GAAa,EAAE,CAAC;IACtC,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,IAAI,gBAAgB,GAA6B,QAAQ,CAAC;IAE1D,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;YACxC,OAAO,KAAK,CAAC,cAAc,CAAC,CAAC;YAC7B,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACJ,MAAM,YAAY,GAAG,EAAE,GAAG,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;YAClD,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;gBACnF,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;gBAC5B,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAC3C,CAAC;YACD,KAAK,CAAC,cAAc,CAAC,GAAG,YAAY,CAAC;QACzC,CAAC;IACL,CAAC;IAED,IAAI,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YACnF,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;gBAAE,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;YAC9B,IAAI,qBAAqB,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC;mBAC/D,CAAC,kBAAkB,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;gBAChD,OAAO,QAAQ,CAAC,WAAW,CAAC,CAAC;gBAC7B,YAAY,CAAC,IAAI,CAAC,UAAU,GAAG,YAAY,CAAC,CAAC;YACjD,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC,CAAC;QACJ,KAAK,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC;IAC7B,CAAC;IAED,MAAM,YAAY,GAAG,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/E,MAAM,aAAa,GAAG,YAAY,IAAI,aAAa,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QACzE,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC;QAC1B,CAAC,CAAC,IAAI,CAAC;IACX,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,EAAE,GAAG,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE3D,IAAI,aAAa,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,EAAE,CAAC;QACnF,MAAM,IAAI,GAAG,2BAA2B,CAAC;QACzC,OAAO,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC5B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,MAAM,KAAK,KAAK;YAAE,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,aAAa,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,EAAE,CAAC;QACpF,IAAI,OAAO,aAAa,CAAC,WAAW,CAAC,KAAK,SAAS,EAAE,CAAC;YAClD,gBAAgB,GAAG,SAAS,CAAC;QACjC,CAAC;aAAM,CAAC;YACJ,OAAO,QAAQ,CAAC,WAAW,CAAC,CAAC;YAC7B,YAAY,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACpD,CAAC;IACL,CAAC;IAED,IAAI,MAAM,KAAK,KAAK,IAAI,gBAAgB,KAAK,QAAQ,EAAE,CAAC;QACpD,QAAQ,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC;IAClC,CAAC;IAED,IAAI,YAAY,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACnC,OAAO,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAC;QAC/B,KAAK,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;IAC/B,CAAC;IAED,uFAAuF;IACvF,qFAAqF;IACrF,oFAAoF;IACpF,sFAAsF;IACtF,oFAAoF;IACpF,mFAAmF;IACnF,wCAAwC;IACxC,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;QACvG,OAAO,KAAK,CAAC,cAAc,CAAC,CAAC;QAC7B,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACtC,CAAC;SAAM,IAAI,aAAa,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,EAAE,GAAG,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;QAC3C,iFAAiF;QACjF,4CAA4C;QAC5C,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YAC/F,OAAO,KAAK,CAAC,UAAU,CAAC,CAAC;YACzB,YAAY,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC/C,CAAC;QACD,KAAK,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC;IAClC,CAAC;IAED,OAAO;QACH,KAAK;QACL,gBAAgB;QAChB,gBAAgB;QAChB,YAAY;QACZ,aAAa;KAChB,CAAC;AACN,CAAC;AAoBD,MAAM,CAAC,MAAM,mBAAmB,GAA8C;IAC1E,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;IAC5B,eAAe,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;IACrC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE;IAC/C,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE;IAC9C,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE;IACxD,gBAAgB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,WAAW,CAAC,EAAE;IAC7D,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,cAAc,CAAC,EAAE;IACvD,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,UAAU,CAAC,EAAE;IACnD,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,UAAU,CAAC,EAAE;IACxD,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE;IACvD,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC,EAAE;IACrE,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;IAC9B,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;IAChC,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;IAC3B,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;IACxB,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;IAC3B,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;IACvB,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;IACxB,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;IACzB,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;IACzB,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;IAC3B,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;IAC1B,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;CACpC,CAAC;AAEF,yFAAyF;AACzF,MAAM,UAAU,kBAAkB,CAC9B,IAA6B,EAC7B,QAAiC;IAEjC,MAAM,MAAM,GAA4B,EAAE,GAAG,IAAI,EAAE,CAAC;IACpD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACtC,qEAAqE;QACrE,wEAAwE;QACxE,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACpB,SAAS;QACb,CAAC;QACD,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC3B,MAAM,MAAM,GAA4B,EAAE,GAAG,OAAO,EAAE,CAAC;YACvD,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/C,MAAM,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBAC9D,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE;oBAC9B,CAAC,CAAC,GAAG,CAAC;YACd,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;YACrB,SAAS;QACb,CAAC;QACD,MAAM,MAAM,GAA4B,EAAE,GAAG,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;QACjE,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBAAE,SAAS;gBAC3C,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtE,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACtD,CAAC;QACL,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;IACzB,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAA4B,EAAE,KAA0B;IACvF,6EAA6E;IAC7E,gFAAgF;IAChF,MAAM,MAAM,GAAG,kBAAkB,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,KAAK,CAAwB,CAAC;IAE1F,2EAA2E;IAC3E,yEAAyE;IACzE,yEAAyE;IACzE,4EAA4E;IAC5E,0EAA0E;IAC1E,wDAAwD;IACxD,KAAK,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC;QACjD,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC;YAAE,SAAS;QAC3C,MAAM,cAAc,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9E,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,gBAAgB,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC/F,CAAC;QACD,kEAAkE;QAClE,IAAI,GAAG,KAAK,OAAO,IAAI,UAAU,IAAI,YAAY,EAAE,CAAC;YAChD,MAAM,CAAC,GAAG,CAAC,GAAG;gBACV,GAAG,MAAM,CAAC,GAAG,CAAC;gBACd,QAAQ,EAAE,kBAAkB,CAAC,cAAc,EAAE,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;aACvF,CAAC;QACN,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -23,9 +23,13 @@ import { handleDiscordSlashCommand, registerDiscordSlashCommands } from './comma
23
23
  import { createDiscordForwarder, relayDiscordImages } from './forwarder.js';
24
24
  import { nextDeliverySeq, pendingDeliveryAnchor, wasSelfDelivered } from '../messaging/turn-delivery.js';
25
25
  import { shouldSkipForwarding } from '../messaging/forwarder-origin.js';
26
+ import { requiresNativeBodyDelivery } from '../messaging/native-body.js';
27
+ import { createQueueNoticeRecorder } from '../messaging/queue-notice-record.js';
28
+ import { admitTargetReply } from '../messaging/target-reply-guard.js';
26
29
  import { sendDiscordFile } from './discord-file.js';
27
30
  import { getDiscordSendClient, sendDiscordFileRest, sendDiscordTextRest } from './send-only-client.js';
28
31
  import { invalidateDiscordSendClient } from './send-only-client.js';
32
+ import { deliverySent } from '../messaging/delivery-outcome.js';
29
33
  import { OutboundSendRegistry } from '../messaging/outbound-lifecycle.js';
30
34
  import { asSendable, asThreadLike, asTypingChannel } from './channel-types.js';
31
35
  import { log } from '../core/logger.js';
@@ -98,30 +102,26 @@ const pendingQueueRequestIds = new Set();
98
102
  let targetReplyForwarderInstalled = false;
99
103
  // Identity-local option: survives the existing router without adding an HTTP field.
100
104
  const nativeBodyRequests = new WeakSet();
101
- function requiresNativeBodyDelivery(data) {
102
- return (data['runtimeFinality'] === 'present' || data['runtimeFinality'] === 'absent')
103
- && (data['runtimeStatus'] === 'done' || data['runtimeStatus'] === 'error' || data['runtimeStatus'] === 'stopped');
104
- }
105
105
  function installDiscordTargetReplyForwarder() {
106
106
  if (targetReplyForwarderInstalled)
107
107
  return;
108
108
  targetReplyForwarderInstalled = true;
109
109
  addBroadcastListener((type, data) => {
110
- if (type !== 'orchestrate_done' || data["origin"] !== 'discord' || !data["text"])
111
- return;
112
110
  // Queued turns only: an ordinary reply is posted by the dispatch path
113
111
  // that is still awaiting it, and answering here too would double-post.
114
112
  // Errors included: after a restart nothing else will show them.
115
- if (data["fromQueue"] !== true)
116
- return;
117
- const target = data["target"];
118
- if (!target || target.channel !== 'discord' || !target.targetId)
119
- return;
120
- if (data["requestId"] && pendingQueueRequestIds.has(String(data["requestId"])))
113
+ const admitted = admitTargetReply(type, data, {
114
+ channel: 'discord',
115
+ event: 'orchestrate_done',
116
+ accept: ['fromQueue'],
117
+ requireText: true,
118
+ hasPendingWaiter: requestId => pendingQueueRequestIds.has(requestId),
119
+ });
120
+ if (!admitted)
121
121
  return;
122
- const text = String(data['text']);
122
+ const { target, text } = admitted;
123
123
  const request = { channel: 'discord', type: 'text', text, target };
124
- if (requiresNativeBodyDelivery(data)) {
124
+ if (admitted.requireBodyDelivery) {
125
125
  if (!text.trim())
126
126
  return;
127
127
  nativeBodyRequests.add(request);
@@ -199,33 +199,11 @@ const discordOutboundRegistry = new OutboundSendRegistry();
199
199
  /** Covers a notice edit plus a remove-then-add reaction chain. */
200
200
  const DISCORD_NOTICE_DRAIN_MS = DISCORD_REACTION_TIMEOUT_MS * 2 + 3000;
201
201
  // ─── Durable notice records (#418) ──────────────────
202
- // The registry above is process-local; these wrap the store that outlives the
202
+ // The registry above is process-local; this wraps the store that outlives the
203
203
  // process. Best-effort by contract: a durable write is a convenience for the NEXT
204
- // boot, so letting it throw would fail the turn the user is waiting on.
205
- function reserveDiscordNoticeRecord(requestId, target) {
206
- try {
207
- getQueueNoticeStore()?.reserve({ requestId, channel: 'discord', target });
208
- }
209
- catch (e) {
210
- log.info('[discord:queue-notice] reserve failed', logErrorText(e));
211
- }
212
- }
213
- function attachDiscordNoticeRecord(requestId, messageId) {
214
- try {
215
- getQueueNoticeStore()?.attachMessageId(requestId, messageId);
216
- }
217
- catch (e) {
218
- log.info('[discord:queue-notice] attach failed', logErrorText(e));
219
- }
220
- }
221
- function closeDiscordNoticeRecord(requestId) {
222
- try {
223
- getQueueNoticeStore()?.close(requestId);
224
- }
225
- catch (e) {
226
- log.info('[discord:queue-notice] close failed', logErrorText(e));
227
- }
228
- }
204
+ // boot, so letting it throw would fail the turn the user is waiting on. The
205
+ // contract is shared with the other two bots (#699).
206
+ const discordNoticeRecord = createQueueNoticeRecorder('discord', '[discord:queue-notice]');
229
207
  /**
230
208
  * Close a queue notice as ANSWERED from the standing forwarder, which never
231
209
  * held the live handle. Mirrors the Slack fix: when the forwarder delivers a
@@ -263,7 +241,7 @@ async function closeDiscordNoticeAsAnsweredByRequestId(requestId) {
263
241
  throw e;
264
242
  }
265
243
  }
266
- closeDiscordNoticeRecord(requestId);
244
+ discordNoticeRecord.close(requestId);
267
245
  }
268
246
  catch (e) {
269
247
  log.info('[discord:queue-notice] answered-close failed', logErrorText(e));
@@ -372,7 +350,7 @@ async function dcOrchestrate(msg, prompt, displayMsg) {
372
350
  // Closed in-process, so the durable record has nothing left to
373
351
  // restore on the next boot.
374
352
  if (requestId)
375
- closeDiscordNoticeRecord(requestId);
353
+ discordNoticeRecord.close(requestId);
376
354
  }
377
355
  finally {
378
356
  // Centralized here: every terminal path routes through a claim, so
@@ -416,7 +394,7 @@ async function dcOrchestrate(msg, prompt, displayMsg) {
416
394
  ack?.settle('failure') ?? Promise.resolve(),
417
395
  ]);
418
396
  if (requestId)
419
- closeDiscordNoticeRecord(requestId);
397
+ discordNoticeRecord.close(requestId);
420
398
  return;
421
399
  }
422
400
  const channel = asSendable(msg.channel);
@@ -465,7 +443,7 @@ async function dcOrchestrate(msg, prompt, displayMsg) {
465
443
  ack?.settle(delivered ? 'success' : 'failure') ?? Promise.resolve(),
466
444
  ]);
467
445
  if (requestId)
468
- closeDiscordNoticeRecord(requestId);
446
+ discordNoticeRecord.close(requestId);
469
447
  {
470
448
  const relayScope = discordOutboundRegistry.start();
471
449
  await relayDiscordImages(msg.client, target, body, {
@@ -492,7 +470,7 @@ async function dcOrchestrate(msg, prompt, displayMsg) {
492
470
  // Reserved BEFORE the post: a record with no id restores to nothing, while
493
471
  // a posted message with no record is unreachable forever (#418).
494
472
  if (requestId)
495
- reserveDiscordNoticeRecord(requestId, target);
473
+ discordNoticeRecord.reserve(requestId, target);
496
474
  const posted = await msg.reply(t('tg.queued', { count: result.pending }, currentLocale())).catch((e) => {
497
475
  log.info('[discord:queue-notice] post failed', logErrorText(e));
498
476
  return undefined;
@@ -500,7 +478,7 @@ async function dcOrchestrate(msg, prompt, displayMsg) {
500
478
  if (posted) {
501
479
  notice.bind(createDiscordNoticeTransport(posted));
502
480
  if (requestId)
503
- attachDiscordNoticeRecord(requestId, posted.id);
481
+ discordNoticeRecord.attach(requestId, posted.id);
504
482
  }
505
483
  else {
506
484
  // No handle will ever arrive, so a deferred close would wait for a
@@ -508,7 +486,7 @@ async function dcOrchestrate(msg, prompt, displayMsg) {
508
486
  notice.abandon();
509
487
  // The reservation describes a message that does not exist.
510
488
  if (requestId)
511
- closeDiscordNoticeRecord(requestId);
489
+ discordNoticeRecord.close(requestId);
512
490
  // Then close the turn out properly: abandoning the notice alone would
513
491
  // leave the listener, the request-id claim, the timer and the running
514
492
  // reaction alive until the 5-minute timeout or shutdown.
@@ -939,16 +917,17 @@ export async function discordSendHandler(req) {
939
917
  if (!restToken)
940
918
  return { ok: false, error: 'Discord client token unavailable' };
941
919
  const outbound = discordOutboundRegistry.start();
920
+ let restResult;
942
921
  try {
943
- const sendResult = await sendDiscordTextRest(restToken, String(channelId), text, { signal: outbound.signal,
922
+ restResult = await sendDiscordTextRest(restToken, String(channelId), text, { signal: outbound.signal,
944
923
  ...(nativeBodyRequests.has(req) ? { requireBodyDelivery: true } : {}) });
945
- if (!sendResult.ok)
946
- return { ok: false, error: sendResult.error || 'send failed' };
924
+ if (!restResult.ok)
925
+ return { ok: false, error: restResult.error || 'send failed' };
947
926
  }
948
927
  finally {
949
928
  outbound.done();
950
929
  }
951
- return { ok: true, channel_id: channelId, type: 'text' };
930
+ return { ok: true, channel_id: channelId, type: 'text', ...deliverySent(restResult.platformMessageId) };
952
931
  }
953
932
  catch (e) {
954
933
  return { ok: false, error: e.message };
@@ -966,7 +945,9 @@ export async function discordSendHandler(req) {
966
945
  const fileResult = await sendDiscordFile(discordClient, target, filePath, stripUndefined({ caption: req.caption }));
967
946
  if (!fileResult.ok)
968
947
  return fileResult;
969
- return { ok: true, channel_id: channelId, type: req.type };
948
+ return { ok: true, channel_id: channelId, type: req.type,
949
+ ...(fileResult.confirmation ? { confirmation: fileResult.confirmation } : {}),
950
+ ...deliverySent(fileResult.platformMessageId ?? null) };
970
951
  }
971
952
  const sendClient = getDiscordSendClient();
972
953
  if (!sendClient.token) {
@@ -979,7 +960,7 @@ export async function discordSendHandler(req) {
979
960
  const result = await sendDiscordTextRest(sendClient.token, String(channelId), text, nativeBodyRequests.has(req) ? { requireBodyDelivery: true } : undefined);
980
961
  if (!result.ok)
981
962
  return result;
982
- return { ok: true, channel_id: channelId, type: 'text' };
963
+ return { ok: true, channel_id: channelId, type: 'text', ...deliverySent(result.platformMessageId) };
983
964
  }
984
965
  const filePath = req.filePath;
985
966
  if (!filePath)
@@ -987,7 +968,9 @@ export async function discordSendHandler(req) {
987
968
  const fileResult = await sendDiscordFileRest(sendClient.token, String(channelId), filePath, req.caption);
988
969
  if (!fileResult.ok)
989
970
  return fileResult;
990
- return { ok: true, channel_id: channelId, type: req.type };
971
+ return { ok: true, channel_id: channelId, type: req.type,
972
+ ...(fileResult.confirmation ? { confirmation: fileResult.confirmation } : {}),
973
+ ...deliverySent(fileResult.platformMessageId) };
991
974
  }
992
975
  // Transport registration moved to ./register.js (lazy loader) so importing
993
976
  // this module — and discord.js's ~48MB with it — happens on first use only.