botmux 2.31.1 → 2.32.0
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.en.md +69 -18
- package/README.md +70 -19
- package/dist/adapters/cli/antigravity.d.ts +4 -0
- package/dist/adapters/cli/antigravity.d.ts.map +1 -0
- package/dist/adapters/cli/antigravity.js +264 -0
- package/dist/adapters/cli/antigravity.js.map +1 -0
- package/dist/adapters/cli/registry.d.ts +2 -1
- package/dist/adapters/cli/registry.d.ts.map +1 -1
- package/dist/adapters/cli/registry.js +3 -1
- package/dist/adapters/cli/registry.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +1 -1
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/cli.js +73 -8
- package/dist/cli.js.map +1 -1
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +23 -2
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +5 -1
- package/dist/core/session-manager.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +27 -0
- package/dist/daemon.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +1 -0
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +1 -0
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +1 -0
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/client.d.ts +23 -0
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +30 -0
- package/dist/im/lark/client.js.map +1 -1
- package/dist/setup/bot-config-editor.d.ts +1 -1
- package/dist/setup/bot-config-editor.d.ts.map +1 -1
- package/dist/setup/bot-config-editor.js +3 -2
- package/dist/setup/bot-config-editor.js.map +1 -1
- package/dist/skills/definitions.d.ts.map +1 -1
- package/dist/skills/definitions.js +19 -4
- package/dist/skills/definitions.js.map +1 -1
- package/dist/utils/working-dir.d.ts +11 -0
- package/dist/utils/working-dir.d.ts.map +1 -0
- package/dist/utils/working-dir.js +45 -0
- package/dist/utils/working-dir.js.map +1 -0
- package/dist/worker.js +1 -1
- package/dist/worker.js.map +1 -1
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/adapters/cli/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/adapters/cli/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -114,5 +114,5 @@ export interface CliAdapter {
|
|
|
114
114
|
/** Whether CLI uses alternate screen buffer */
|
|
115
115
|
readonly altScreen: boolean;
|
|
116
116
|
}
|
|
117
|
-
export type CliId = 'claude-code' | 'aiden' | 'coco' | 'codex' | 'cursor' | 'gemini' | 'opencode';
|
|
117
|
+
export type CliId = 'claude-code' | 'aiden' | 'coco' | 'codex' | 'cursor' | 'gemini' | 'opencode' | 'antigravity';
|
|
118
118
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,kEAAkE;IAClE,QAAQ,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,4FAA4F;IAC5F,eAAe,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC1C,8FAA8F;IAC9F,SAAS,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B;;2FAEuF;IACvF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;yEAEqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;+DAC2D;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,wBAAwB;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB,+CAA+C;IAC/C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B;;;;yCAIqC;IACrC,SAAS,CAAC,IAAI,EAAE;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;QAChB,sFAAsF;QACtF,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,+EAA+E;QAC/E,MAAM,CAAC,EAAE,OAAO,qBAAqB,EAAE,MAAM,CAAC;KAC/C,GAAG,MAAM,EAAE,CAAC;IAEb;+DAC2D;IAC3D,QAAQ,CAAC,0BAA0B,CAAC,EAAE,OAAO,CAAC;IAE9C;;;;;;;;;;;;;0DAasD;IACtD,kBAAkB,CAAC,CAAC,IAAI,EAAE;QACxB,SAAS,EAAE,MAAM,CAAC;QAClB,uEAAuE;QACvE,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GAAG,MAAM,GAAG,IAAI,CAAC;IAElB;;;;;;;;;;;;;gEAa4D;IAC5D,UAAU,CACR,GAAG,EAAE,SAAS,EACd,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,GAAG;QAChB,SAAS,EAAE,OAAO,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB;;sEAE8D;QAC9D,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,OAAO,CAAC,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;KAC5C,CAAC,CAAC;IAEH;;;4EAGwE;IACxE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAE5B,wFAAwF;IACxF,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAEpC;;;;;sEAKkE;IAClE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAE/B;qEACiE;IACjE,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;IAE/B;;2EAEuE;IACvE,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEzC;;;;6EAIyE;IACzE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAErC,+CAA+C;IAC/C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,MAAM,KAAK,GAAG,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,kEAAkE;IAClE,QAAQ,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,4FAA4F;IAC5F,eAAe,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC1C,8FAA8F;IAC9F,SAAS,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B;;2FAEuF;IACvF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;yEAEqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;+DAC2D;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,wBAAwB;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB,+CAA+C;IAC/C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B;;;;yCAIqC;IACrC,SAAS,CAAC,IAAI,EAAE;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;QAChB,sFAAsF;QACtF,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,+EAA+E;QAC/E,MAAM,CAAC,EAAE,OAAO,qBAAqB,EAAE,MAAM,CAAC;KAC/C,GAAG,MAAM,EAAE,CAAC;IAEb;+DAC2D;IAC3D,QAAQ,CAAC,0BAA0B,CAAC,EAAE,OAAO,CAAC;IAE9C;;;;;;;;;;;;;0DAasD;IACtD,kBAAkB,CAAC,CAAC,IAAI,EAAE;QACxB,SAAS,EAAE,MAAM,CAAC;QAClB,uEAAuE;QACvE,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GAAG,MAAM,GAAG,IAAI,CAAC;IAElB;;;;;;;;;;;;;gEAa4D;IAC5D,UAAU,CACR,GAAG,EAAE,SAAS,EACd,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,GAAG;QAChB,SAAS,EAAE,OAAO,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB;;sEAE8D;QAC9D,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,OAAO,CAAC,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;KAC5C,CAAC,CAAC;IAEH;;;4EAGwE;IACxE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAE5B,wFAAwF;IACxF,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAEpC;;;;;sEAKkE;IAClE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAE/B;qEACiE;IACjE,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;IAE/B;;2EAEuE;IACvE,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEzC;;;;6EAIyE;IACzE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAErC,+CAA+C;IAC/C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,MAAM,KAAK,GAAG,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,aAAa,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -30,6 +30,7 @@ import { tmuxEnv } from './setup/ensure-tmux.js';
|
|
|
30
30
|
import { writeBotsJsonAtomic as writeBotsAtomic } from './setup/bots-store.js';
|
|
31
31
|
import { applyBotConfigEdits, assertUniqueBotProcessNames, botProcessName, normalizeBotConfig, parseBotConfigsJson, parseBotSelection, removeBotConfig, resolveCliId, } from './setup/bot-config-editor.js';
|
|
32
32
|
import { logger } from './utils/logger.js';
|
|
33
|
+
import { invalidWorkingDirs } from './utils/working-dir.js';
|
|
33
34
|
import { firstPositional } from './cli/arg-utils.js';
|
|
34
35
|
import { isLocale, setDefaultLocale, SUPPORTED_LOCALES } from './i18n/index.js';
|
|
35
36
|
import { readGlobalConfig, setGlobalLocale, globalConfigPath } from './global-config.js';
|
|
@@ -173,6 +174,16 @@ function loadBotsJson() {
|
|
|
173
174
|
}
|
|
174
175
|
return [];
|
|
175
176
|
}
|
|
177
|
+
function ensureBotWorkingDirsExist(bot, context = 'workingDir') {
|
|
178
|
+
const invalid = invalidWorkingDirs(bot);
|
|
179
|
+
if (invalid.length === 0)
|
|
180
|
+
return true;
|
|
181
|
+
console.log(`\n❌ ${context} 指向的目录不存在或不是目录:`);
|
|
182
|
+
for (const dir of invalid)
|
|
183
|
+
console.log(` - ${dir}`);
|
|
184
|
+
console.log(' 请先创建目录,或重新填写一个已存在的工作目录。');
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
176
187
|
function ensureUniqueBotProcessNames(bots) {
|
|
177
188
|
try {
|
|
178
189
|
assertUniqueBotProcessNames(bots, PM2_NAME);
|
|
@@ -421,7 +432,7 @@ async function promptBotConfig(rl) {
|
|
|
421
432
|
return null;
|
|
422
433
|
}
|
|
423
434
|
console.log('✅ 凭证有效(tenant_access_token 已成功获取)\n');
|
|
424
|
-
console.log('支持的 CLI: 1) claude-code 2) aiden 3) coco 4) codex 5) cursor 6) gemini 7) opencode');
|
|
435
|
+
console.log('支持的 CLI: 1) claude-code 2) aiden 3) coco 4) codex 5) cursor 6) gemini 7) opencode 8) antigravity');
|
|
425
436
|
const cliChoice = await ask(rl, 'CLI 适配器 [1]: ');
|
|
426
437
|
let cliId;
|
|
427
438
|
try {
|
|
@@ -450,6 +461,8 @@ async function promptBotConfig(rl) {
|
|
|
450
461
|
// 字段即可. 手动 fallback 场景没 open_id, 字段直接不写 (== 不限制).
|
|
451
462
|
if (creds.userOpenId)
|
|
452
463
|
bot.allowedUsers = [creds.userOpenId];
|
|
464
|
+
if (!ensureBotWorkingDirsExist(bot, '默认工作目录'))
|
|
465
|
+
return null;
|
|
453
466
|
return normalizeBotConfig(bot);
|
|
454
467
|
}
|
|
455
468
|
function formatOptionalValue(v) {
|
|
@@ -498,7 +511,7 @@ async function promptEditBotConfig(rl, bot) {
|
|
|
498
511
|
'留空保留当前值。',
|
|
499
512
|
]);
|
|
500
513
|
input.larkAppSecret = await ask(rl, `LARK_APP_SECRET [保留当前值]: `);
|
|
501
|
-
console.log('\n支持的 CLI: 1) claude-code 2) aiden 3) coco 4) codex 5) cursor 6) gemini 7) opencode');
|
|
514
|
+
console.log('\n支持的 CLI: 1) claude-code 2) aiden 3) coco 4) codex 5) cursor 6) gemini 7) opencode 8) antigravity');
|
|
502
515
|
printInputHelp('CLI 适配器', [
|
|
503
516
|
'选择 botmux 需要套用哪一种 CLI 参数协议和会话恢复方式。',
|
|
504
517
|
'留空保留当前值;可以输入序号,也可以直接输入适配器 ID。',
|
|
@@ -638,6 +651,11 @@ async function cmdSetup() {
|
|
|
638
651
|
console.log(`\n❌ 编辑失败: ${err?.message ?? String(err)}`);
|
|
639
652
|
return;
|
|
640
653
|
}
|
|
654
|
+
if (!ensureBotWorkingDirsExist(edited, '默认工作目录')) {
|
|
655
|
+
rl.close();
|
|
656
|
+
console.log(' 配置未修改。');
|
|
657
|
+
return;
|
|
658
|
+
}
|
|
641
659
|
// 凭证字段有变化时, 像 promptBotConfig 一样跑一次 tenant_access_token
|
|
642
660
|
// 校验. 失败不写盘——避免编辑后 typo 一个字符, daemon 重启时才发现.
|
|
643
661
|
// (cmdRestart 不校验凭证, 只 cmdStart 校验, 所以编辑路径必须自己兜.)
|
|
@@ -1934,7 +1952,9 @@ botmux v${getVersion()} — IM ↔ AI 编程 CLI 桥接
|
|
|
1934
1952
|
--top-level 发顶层消息(不回复进当前话题)
|
|
1935
1953
|
--chat-id <oc_xxx> 指定目标群(默认当前话题所在群)
|
|
1936
1954
|
bots list 列出当前群聊中的机器人(含 open_id)
|
|
1937
|
-
history [--limit N]
|
|
1955
|
+
history [--limit N] [--scope session|thread|chat|ambient]
|
|
1956
|
+
拉取当前会话的消息历史 (JSON)。默认按 session scope:话题/话题群 → 话题内,普通群 → 整群;
|
|
1957
|
+
thread 会话里可用 --scope ambient 读取 thread 外的群聊上下文
|
|
1938
1958
|
quoted <message_id> 拉取被引用的单条消息 (JSON),message_id 取自 daemon 注入的引用提示行
|
|
1939
1959
|
|
|
1940
1960
|
新建飞书群:
|
|
@@ -2206,19 +2226,56 @@ async function resolveSessionAppId(sessionIdArg) {
|
|
|
2206
2226
|
}
|
|
2207
2227
|
async function cmdHistory(rest) {
|
|
2208
2228
|
const limit = parseInt(argValue(rest, '--limit') ?? '50', 10);
|
|
2229
|
+
const scopeArg = argValue(rest, '--scope') ?? 'session';
|
|
2209
2230
|
const sessionIdArg = argValue(rest, '--session-id');
|
|
2210
2231
|
const { sid, larkAppId: appId, session: s } = await resolveSessionAppId(sessionIdArg);
|
|
2211
|
-
const
|
|
2232
|
+
const validScopes = new Set(['session', 'thread', 'chat', 'ambient']);
|
|
2233
|
+
if (!validScopes.has(scopeArg)) {
|
|
2234
|
+
console.error(`无效 --scope: ${scopeArg}。可用: session | thread | chat | ambient`);
|
|
2235
|
+
process.exit(1);
|
|
2236
|
+
}
|
|
2237
|
+
const { getMessageDetail, listAmbientChatMessages, listThreadMessages, listChatMessages } = await import('./im/lark/client.js');
|
|
2212
2238
|
const { parseApiMessage, cardContentHasUpgradeFallback, resolveMergedCardContent } = await import('./im/lark/message-parser.js');
|
|
2213
2239
|
const { expandMergeForward } = await import('./im/lark/merge-forward.js');
|
|
2214
2240
|
try {
|
|
2215
2241
|
// Chat-scope sessions (普通群整群一会话) have no thread to walk — list the
|
|
2216
2242
|
// chat container directly and let the caller cap with --limit. Thread-scope
|
|
2217
|
-
// sessions walk the thread container by root_id.
|
|
2243
|
+
// sessions walk the thread container by root_id. `--scope chat|ambient`
|
|
2244
|
+
// lets a thread-scope session intentionally read outside its thread when
|
|
2245
|
+
// it needs the surrounding group conversation (for example `/t` spawned
|
|
2246
|
+
// from an ongoing 普通群 discussion).
|
|
2218
2247
|
const isChatScope = s.scope === 'chat';
|
|
2219
|
-
const
|
|
2248
|
+
const effectiveScope = scopeArg === 'session'
|
|
2249
|
+
? (isChatScope ? 'chat' : 'thread')
|
|
2250
|
+
: scopeArg;
|
|
2251
|
+
if (effectiveScope === 'thread' && isChatScope) {
|
|
2252
|
+
console.error('当前 session 是 chat-scope,没有 thread 历史可读取。请使用 --scope chat。');
|
|
2253
|
+
process.exit(1);
|
|
2254
|
+
}
|
|
2255
|
+
if (effectiveScope === 'ambient' && isChatScope) {
|
|
2256
|
+
console.error('当前 session 是 chat-scope,没有 thread root 可作为 ambient 边界。请使用 --scope chat。');
|
|
2257
|
+
process.exit(1);
|
|
2258
|
+
}
|
|
2259
|
+
let ambientBeforeCreateTime;
|
|
2260
|
+
if (effectiveScope === 'ambient') {
|
|
2261
|
+
try {
|
|
2262
|
+
const detail = await getMessageDetail(appId, s.rootMessageId, { userCardContent: false });
|
|
2263
|
+
ambientBeforeCreateTime = detail?.items?.[0]?.create_time;
|
|
2264
|
+
}
|
|
2265
|
+
catch {
|
|
2266
|
+
// Best-effort only: ambient history should still work if the root
|
|
2267
|
+
// message was withdrawn or is otherwise unavailable; it will then fall
|
|
2268
|
+
// back to the chat tail with current-thread messages filtered out.
|
|
2269
|
+
}
|
|
2270
|
+
}
|
|
2271
|
+
const raw = effectiveScope === 'chat'
|
|
2220
2272
|
? await listChatMessages(appId, s.chatId, limit)
|
|
2221
|
-
:
|
|
2273
|
+
: effectiveScope === 'ambient'
|
|
2274
|
+
? await listAmbientChatMessages(appId, s.chatId, limit, {
|
|
2275
|
+
beforeCreateTime: ambientBeforeCreateTime,
|
|
2276
|
+
excludeRootMessageId: s.rootMessageId,
|
|
2277
|
+
})
|
|
2278
|
+
: await listThreadMessages(appId, s.chatId, s.rootMessageId, limit);
|
|
2222
2279
|
// Expand merge_forward to <forwarded_messages> XML, mirroring the live event
|
|
2223
2280
|
// path in daemon.ts. Each merge_forward gets its own numberer (we don't
|
|
2224
2281
|
// download resources here — only [图片 N] placeholders matter).
|
|
@@ -2243,8 +2300,16 @@ async function cmdHistory(rest) {
|
|
|
2243
2300
|
console.log(JSON.stringify({
|
|
2244
2301
|
sessionId: sid,
|
|
2245
2302
|
chatId: s.chatId,
|
|
2246
|
-
scope:
|
|
2303
|
+
scope: effectiveScope,
|
|
2304
|
+
sessionScope: isChatScope ? 'chat' : 'thread',
|
|
2247
2305
|
...(isChatScope ? {} : { rootMessageId: s.rootMessageId }),
|
|
2306
|
+
...(effectiveScope === 'ambient' ? {
|
|
2307
|
+
ambient: {
|
|
2308
|
+
source: 'chat',
|
|
2309
|
+
beforeCreateTime: ambientBeforeCreateTime,
|
|
2310
|
+
excludeRootMessageId: s.rootMessageId,
|
|
2311
|
+
},
|
|
2312
|
+
} : {}),
|
|
2248
2313
|
messages,
|
|
2249
2314
|
total: messages.length,
|
|
2250
2315
|
}, null, 2));
|