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.
- package/README.md +4 -0
- package/dist/bin/commands/browser-web-ai.js +29 -10
- package/dist/bin/commands/browser-web-ai.js.map +1 -1
- package/dist/server.js +2 -2
- package/dist/server.js.map +1 -1
- package/dist/src/agent/claude-runtime-run.js +2 -1
- package/dist/src/agent/claude-runtime-run.js.map +1 -1
- package/dist/src/agent/lifecycle-handler.js +15 -4
- package/dist/src/agent/lifecycle-handler.js.map +1 -1
- package/dist/src/agent/pi-runtime.js +103 -86
- package/dist/src/agent/pi-runtime.js.map +1 -1
- package/dist/src/agent/spawn/exit-settle.js +74 -0
- package/dist/src/agent/spawn/exit-settle.js.map +1 -0
- package/dist/src/agent/spawn/kill-reason.js +38 -0
- package/dist/src/agent/spawn/kill-reason.js.map +1 -0
- package/dist/src/agent/spawn/queue.js +8 -0
- package/dist/src/agent/spawn/queue.js.map +1 -1
- package/dist/src/agent/spawn/steer-event.js +33 -0
- package/dist/src/agent/spawn/steer-event.js.map +1 -0
- package/dist/src/agent/spawn.js +157 -173
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/agent/watchdog.js +9 -4
- package/dist/src/agent/watchdog.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/browser-escalation.js +18 -1
- package/dist/src/browser/adaptive-fetch/browser-escalation.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/browser-flow.js +36 -9
- package/dist/src/browser/adaptive-fetch/browser-flow.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/browser-session.js +10 -1
- package/dist/src/browser/adaptive-fetch/browser-session.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/camoufox-session.js +16 -1
- package/dist/src/browser/adaptive-fetch/camoufox-session.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/defuddle-provenance.js +49 -0
- package/dist/src/browser/adaptive-fetch/defuddle-provenance.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/endpoint-resolvers.js +61 -31
- package/dist/src/browser/adaptive-fetch/endpoint-resolvers.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/fetcher.js +12 -1
- package/dist/src/browser/adaptive-fetch/fetcher.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/live-smoke-manifest.js +12 -18
- package/dist/src/browser/adaptive-fetch/live-smoke-manifest.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/public-endpoint-normalizers.js +85 -1
- package/dist/src/browser/adaptive-fetch/public-endpoint-normalizers.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/safety.js +5 -3
- package/dist/src/browser/adaptive-fetch/safety.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/scheduler.js +34 -5
- package/dist/src/browser/adaptive-fetch/scheduler.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/tls-fetch.js +54 -33
- package/dist/src/browser/adaptive-fetch/tls-fetch.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/vendor/README.md +33 -1
- package/dist/src/browser/adaptive-fetch/ytdlp-reader.js +54 -9
- package/dist/src/browser/adaptive-fetch/ytdlp-reader.js.map +1 -1
- package/dist/src/browser/web-ai/capability-observation-presets.js +12 -10
- package/dist/src/browser/web-ai/capability-observation-presets.js.map +1 -1
- package/dist/src/browser/web-ai/chatgpt-model.js +80 -7
- package/dist/src/browser/web-ai/chatgpt-model.js.map +1 -1
- package/dist/src/browser/web-ai/gemini-model.js +18 -0
- package/dist/src/browser/web-ai/gemini-model.js.map +1 -1
- package/dist/src/browser/web-ai/grok-model.js +64 -15
- package/dist/src/browser/web-ai/grok-model.js.map +1 -1
- package/dist/src/code-mode/providers/codex-app.js +83 -0
- package/dist/src/code-mode/providers/codex-app.js.map +1 -1
- package/dist/src/core/config.js +77 -73
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/db.js +227 -151
- package/dist/src/core/db.js.map +1 -1
- package/dist/src/core/settings-merge.js +78 -102
- package/dist/src/core/settings-merge.js.map +1 -1
- package/dist/src/discord/bot.js +37 -54
- package/dist/src/discord/bot.js.map +1 -1
- package/dist/src/discord/discord-file.js +29 -3
- package/dist/src/discord/discord-file.js.map +1 -1
- package/dist/src/discord/send-only-client.js +56 -8
- package/dist/src/discord/send-only-client.js.map +1 -1
- package/dist/src/manager/routes/telegram-hub.js +8 -1
- package/dist/src/manager/routes/telegram-hub.js.map +1 -1
- package/dist/src/manager/telegram-hub/hub-bot.js +7 -1
- package/dist/src/manager/telegram-hub/hub-bot.js.map +1 -1
- package/dist/src/messaging/delivery-outcome.js +30 -0
- package/dist/src/messaging/delivery-outcome.js.map +1 -1
- package/dist/src/messaging/file-receipt.js +49 -0
- package/dist/src/messaging/file-receipt.js.map +1 -0
- package/dist/src/messaging/native-body.js +31 -0
- package/dist/src/messaging/native-body.js.map +1 -0
- package/dist/src/messaging/queue-notice-record.js +48 -0
- package/dist/src/messaging/queue-notice-record.js.map +1 -0
- package/dist/src/messaging/send.js +13 -2
- package/dist/src/messaging/send.js.map +1 -1
- package/dist/src/messaging/target-reply-guard.js +66 -0
- package/dist/src/messaging/target-reply-guard.js.map +1 -0
- package/dist/src/orchestrator/collect.js +18 -3
- package/dist/src/orchestrator/collect.js.map +1 -1
- package/dist/src/orchestrator/gateway.js +3 -1
- package/dist/src/orchestrator/gateway.js.map +1 -1
- package/dist/src/orchestrator/pipeline.js +7 -1
- package/dist/src/orchestrator/pipeline.js.map +1 -1
- package/dist/src/orchestrator/session-lanes.js +2 -2
- package/dist/src/orchestrator/session-lanes.js.map +1 -1
- package/dist/src/prompt/builder.js +2 -2
- package/dist/src/prompt/builder.js.map +1 -1
- package/dist/src/routes/i18n.js +9 -4
- package/dist/src/routes/i18n.js.map +1 -1
- package/dist/src/routes/instance.js +8 -4
- package/dist/src/routes/instance.js.map +1 -1
- package/dist/src/routes/jaw-memory.js +5 -5
- package/dist/src/routes/jaw-memory.js.map +1 -1
- package/dist/src/routes/link-preview.js +5 -1
- package/dist/src/routes/link-preview.js.map +1 -1
- package/dist/src/routes/memory.js +9 -7
- package/dist/src/routes/memory.js.map +1 -1
- package/dist/src/routes/messaging.js +21 -10
- package/dist/src/routes/messaging.js.map +1 -1
- package/dist/src/routes/orchestrate.js +127 -118
- package/dist/src/routes/orchestrate.js.map +1 -1
- package/dist/src/routes/settings.js +7 -7
- package/dist/src/routes/settings.js.map +1 -1
- package/dist/src/routes/system.js +9 -4
- package/dist/src/routes/system.js.map +1 -1
- package/dist/src/slack/bot.js +199 -132
- package/dist/src/slack/bot.js.map +1 -1
- package/dist/src/slack/events.js +31 -8
- package/dist/src/slack/events.js.map +1 -1
- package/dist/src/slack/ingress.js +3 -1
- package/dist/src/slack/ingress.js.map +1 -1
- package/dist/src/slack/progress-activity.js +24 -3
- package/dist/src/slack/progress-activity.js.map +1 -1
- package/dist/src/slack/progress-lifecycle.js +29 -0
- package/dist/src/slack/progress-lifecycle.js.map +1 -1
- package/dist/src/slack/progress.js +1 -1
- package/dist/src/slack/progress.js.map +1 -1
- package/dist/src/slack/send-only-client.js +16 -3
- package/dist/src/slack/send-only-client.js.map +1 -1
- package/dist/src/slack/slack-file.js +5 -3
- package/dist/src/slack/slack-file.js.map +1 -1
- package/dist/src/slack/workflow.js +134 -0
- package/dist/src/slack/workflow.js.map +1 -0
- package/dist/src/telegram/bot.js +60 -55
- package/dist/src/telegram/bot.js.map +1 -1
- package/dist/src/telegram/rich-message.js +28 -20
- package/dist/src/telegram/rich-message.js.map +1 -1
- package/dist/src/telegram/telegram-file.js +45 -9
- package/dist/src/telegram/telegram-file.js.map +1 -1
- package/dist/src/trace/activity-journal.js +3 -6
- package/dist/src/trace/activity-journal.js.map +1 -1
- package/dist/src/trace/activity-retention.js +29 -0
- package/dist/src/trace/activity-retention.js.map +1 -1
- package/package.json +1 -1
- package/public/dist/.vite/manifest.json +20 -20
- package/public/dist/assets/{ChannelEnablementControl-DwUDKjX9.js → ChannelEnablementControl-egwTtO9-.js} +8 -8
- package/public/dist/assets/{ChannelSetupEntry-DH0AuNNX.js → ChannelSetupEntry-CCrUYd2-.js} +1 -1
- package/public/dist/assets/{ChannelsDiscord-7NmoTjR7.js → ChannelsDiscord-B6rJAsQG.js} +1 -1
- package/public/dist/assets/{ChannelsSlack-Ba0ax6iT.js → ChannelsSlack-CrSIw4Wd.js} +1 -1
- package/public/dist/assets/{ChannelsTelegram-DKA9atf2.js → ChannelsTelegram-DPrdLEnT.js} +1 -1
- package/public/dist/assets/CodeCanvas-D5jp8-t5.js +2 -0
- package/public/dist/assets/{manager-iX7KosWI.js → manager-CFwOAoe0.js} +2 -2
- package/public/dist/assets/{settings-embedding-DIqST-91.js → settings-embedding-DspkJ6sr.js} +1 -1
- package/public/dist/assets/{settings-KIPNUOIV.js → settings-qkC0NuQ7.js} +1 -1
- package/public/dist/manager/index.html +1 -1
- package/public/dist/settings/index.html +1 -1
- package/public/locales/en.json +9 -3
- package/public/locales/ja.json +9 -3
- package/public/locales/ko.json +9 -3
- package/public/locales/zh.json +9 -3
- package/public/manager/src/code/CodeWorkbench.tsx +11 -4
- package/public/manager/src/code/code-controller-draft-storage.ts +7 -3
- package/public/manager/src/code/code-controller-drafts.ts +9 -2
- package/public/manager/src/code/code-controller-runtime.ts +125 -12
- package/public/manager/src/code/code-controller-types.ts +2 -0
- package/public/manager/src/code/pending-user-item.ts +5 -0
- package/scripts/ci/windows-unit-manifest.txt +6 -0
- 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
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
|
186
|
+
if (!isPlainRecord(patchChannel))
|
|
160
187
|
continue;
|
|
161
|
-
const
|
|
162
|
-
const
|
|
163
|
-
if (
|
|
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
|
-
|
|
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":"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;
|
|
1
|
+
{"version":3,"file":"settings-merge.js","sourceRoot":"","sources":["../../../src/core/settings-merge.ts"],"names":[],"mappings":"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"}
|
package/dist/src/discord/bot.js
CHANGED
|
@@ -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
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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 =
|
|
122
|
+
const { target, text } = admitted;
|
|
123
123
|
const request = { channel: 'discord', type: 'text', text, target };
|
|
124
|
-
if (
|
|
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;
|
|
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
|
-
|
|
206
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
922
|
+
restResult = await sendDiscordTextRest(restToken, String(channelId), text, { signal: outbound.signal,
|
|
944
923
|
...(nativeBodyRequests.has(req) ? { requireBodyDelivery: true } : {}) });
|
|
945
|
-
if (!
|
|
946
|
-
return { ok: false, error:
|
|
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.
|