botmux 2.99.0 → 2.101.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 +33 -7
- package/README.md +33 -7
- package/dist/adapters/backend/sandbox.d.ts +33 -4
- package/dist/adapters/backend/sandbox.d.ts.map +1 -1
- package/dist/adapters/backend/sandbox.js +90 -29
- package/dist/adapters/backend/sandbox.js.map +1 -1
- package/dist/adapters/cli/hermes.d.ts.map +1 -1
- package/dist/adapters/cli/hermes.js +6 -0
- package/dist/adapters/cli/hermes.js.map +1 -1
- package/dist/adapters/cli/opencode.d.ts.map +1 -1
- package/dist/adapters/cli/opencode.js +241 -13
- package/dist/adapters/cli/opencode.js.map +1 -1
- package/dist/adapters/cli/traex.d.ts.map +1 -1
- package/dist/adapters/cli/traex.js +8 -6
- package/dist/adapters/cli/traex.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +10 -3
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/bot-registry.d.ts +12 -0
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +10 -3
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +659 -154
- package/dist/cli.js.map +1 -1
- package/dist/core/cost-calculator.d.ts.map +1 -1
- package/dist/core/cost-calculator.js +26 -36
- package/dist/core/cost-calculator.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +37 -2
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/session-manager.d.ts +11 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +87 -17
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +6 -0
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +24 -8
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/bot-onboarding.d.ts +6 -0
- package/dist/dashboard/bot-onboarding.d.ts.map +1 -1
- package/dist/dashboard/bot-onboarding.js +3 -1
- package/dist/dashboard/bot-onboarding.js.map +1 -1
- package/dist/dashboard/web/bot-onboarding.d.ts.map +1 -1
- package/dist/dashboard/web/bot-onboarding.js +24 -3
- package/dist/dashboard/web/bot-onboarding.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +14 -4
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/sessions.d.ts.map +1 -1
- package/dist/dashboard/web/sessions.js +5 -19
- package/dist/dashboard/web/sessions.js.map +1 -1
- package/dist/dashboard-web/app.js +40 -33
- package/dist/dashboard-web/chunks/{bot-defaults-page-3EV7K6LJ.js → bot-defaults-page-HOGLABBC.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-NASYW5FD.js → chunk-ECXPBQ3J.js} +1 -1
- package/dist/dashboard-web/chunks/chunk-MR57RUVP.js +31 -0
- package/dist/dashboard-web/chunks/{connectors-XPZKEHF6.js → connectors-UGTF4Q4I.js} +1 -1
- package/dist/dashboard-web/chunks/{groups-page-C54PVKYP.js → groups-page-IKTCMQ4A.js} +1 -1
- package/dist/dashboard-web/chunks/{insights-page-BBQYR7WY.js → insights-page-7CCSHEKM.js} +1 -1
- package/dist/dashboard-web/chunks/{overview-page-5PJCAMID.js → overview-page-JOJW65P5.js} +1 -1
- package/dist/dashboard-web/chunks/{roles-page-APUDLPVM.js → roles-page-E2VN2DLV.js} +1 -1
- package/dist/dashboard-web/chunks/{schedules-WG2UKHSO.js → schedules-6QIHJIHX.js} +1 -1
- package/dist/dashboard-web/chunks/sessions-page-QN2TARF2.js +238 -0
- package/dist/dashboard-web/chunks/{settings-page-OSBZNCXL.js → settings-page-WWTXB577.js} +1 -1
- package/dist/dashboard-web/chunks/{skills-page-Y3VUAOYG.js → skills-page-2FAUPQ6H.js} +1 -1
- package/dist/dashboard-web/chunks/{team-federation-page-CRH3WZPH.js → team-federation-page-PTBQQSFS.js} +1 -1
- package/dist/dashboard-web/chunks/{workflows-UB7OPYGI.js → workflows-ZNBB5KFV.js} +1 -1
- package/dist/dashboard.js +86 -1
- package/dist/dashboard.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +2 -0
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +2 -0
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/card-builder.d.ts +2 -2
- package/dist/im/lark/card-builder.js +2 -2
- package/dist/im/lark/event-dispatcher.d.ts +8 -3
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +45 -9
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/platform/bind.d.ts.map +1 -1
- package/dist/platform/bind.js +36 -15
- package/dist/platform/bind.js.map +1 -1
- package/dist/platform/binding.d.ts +5 -0
- package/dist/platform/binding.d.ts.map +1 -1
- package/dist/platform/binding.js +11 -0
- package/dist/platform/binding.js.map +1 -1
- package/dist/platform/platform-http.d.ts +11 -0
- package/dist/platform/platform-http.d.ts.map +1 -0
- package/dist/platform/platform-http.js +41 -0
- package/dist/platform/platform-http.js.map +1 -0
- package/dist/platform/tunnel-client.d.ts +14 -0
- package/dist/platform/tunnel-client.d.ts.map +1 -1
- package/dist/platform/tunnel-client.js +40 -3
- package/dist/platform/tunnel-client.js.map +1 -1
- package/dist/services/bot-union-ids-store.d.ts +9 -0
- package/dist/services/bot-union-ids-store.d.ts.map +1 -0
- package/dist/services/bot-union-ids-store.js +59 -0
- package/dist/services/bot-union-ids-store.js.map +1 -0
- package/dist/services/coco-transcript.d.ts.map +1 -1
- package/dist/services/coco-transcript.js +59 -64
- package/dist/services/coco-transcript.js.map +1 -1
- package/dist/services/jsonl-cursor.d.ts +12 -0
- package/dist/services/jsonl-cursor.d.ts.map +1 -1
- package/dist/services/jsonl-cursor.js +63 -4
- package/dist/services/jsonl-cursor.js.map +1 -1
- package/dist/services/opencode-paths.d.ts +7 -0
- package/dist/services/opencode-paths.d.ts.map +1 -0
- package/dist/services/opencode-paths.js +18 -0
- package/dist/services/opencode-paths.js.map +1 -0
- package/dist/services/platform-team-store.d.ts +37 -0
- package/dist/services/platform-team-store.d.ts.map +1 -0
- package/dist/services/platform-team-store.js +120 -0
- package/dist/services/platform-team-store.js.map +1 -0
- package/dist/services/team-groups-store.d.ts +14 -1
- package/dist/services/team-groups-store.d.ts.map +1 -1
- package/dist/services/team-groups-store.js +28 -1
- package/dist/services/team-groups-store.js.map +1 -1
- package/dist/setup/bot-config-editor.d.ts +6 -0
- package/dist/setup/bot-config-editor.d.ts.map +1 -1
- package/dist/setup/bot-config-editor.js +18 -15
- package/dist/setup/bot-config-editor.js.map +1 -1
- package/dist/setup/interactive-select.d.ts +22 -0
- package/dist/setup/interactive-select.d.ts.map +1 -1
- package/dist/setup/interactive-select.js +101 -7
- package/dist/setup/interactive-select.js.map +1 -1
- package/dist/setup/open-platform-automation.d.ts +42 -0
- package/dist/setup/open-platform-automation.d.ts.map +1 -1
- package/dist/setup/open-platform-automation.js +107 -0
- package/dist/setup/open-platform-automation.js.map +1 -1
- package/dist/setup/setup-args.d.ts +77 -0
- package/dist/setup/setup-args.d.ts.map +1 -0
- package/dist/setup/setup-args.js +272 -0
- package/dist/setup/setup-args.js.map +1 -0
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/worker.js +12 -2
- package/dist/worker.js.map +1 -1
- package/dist/workflows/attempt-resume.d.ts.map +1 -1
- package/dist/workflows/attempt-resume.js +4 -1
- package/dist/workflows/attempt-resume.js.map +1 -1
- package/package.json +1 -1
- package/dist/dashboard-web/chunks/chunk-JXLHRRJD.js +0 -31
- package/dist/dashboard-web/chunks/sessions-page-F3U5NFPD.js +0 -238
package/dist/dashboard.js
CHANGED
|
@@ -57,6 +57,8 @@ import { isValidRoleProfileId } from './services/role-profile-store.js';
|
|
|
57
57
|
import { mergeSafeInsightOverviews } from './services/insight/report.js';
|
|
58
58
|
import { readPlatformBinding } from './platform/binding.js';
|
|
59
59
|
import { startPlatformTunnelClient } from './platform/tunnel-client.js';
|
|
60
|
+
import { applyPlatformTeamSync, getPlatformTeamSyncRev, listPlatformTeams } from './services/platform-team-store.js';
|
|
61
|
+
import { getBotUnionId } from './services/bot-union-ids-store.js';
|
|
60
62
|
import { cleanupIdleSessions, parseIdleCleanupHours } from './dashboard/session-cleanup.js';
|
|
61
63
|
const SECRET_PATH = join(homedir(), '.botmux', '.dashboard-secret');
|
|
62
64
|
const TOKEN_PATH = join(homedir(), '.botmux', '.dashboard-token');
|
|
@@ -1472,8 +1474,15 @@ const server = createServer(async (req, res) => {
|
|
|
1472
1474
|
if (bad.length > 0) {
|
|
1473
1475
|
return jsonRes(res, 400, { ok: false, error: 'invalid_working_dir', message: `目录不存在或不是目录: ${bad.join(', ')}` });
|
|
1474
1476
|
}
|
|
1477
|
+
// 目录模式: 'fixed' → defaultWorkingDir(直接启动);'card' → workingDir(弹卡)。
|
|
1478
|
+
// 缺省不传按 'card' 处理,兼容不带该字段的旧客户端。
|
|
1479
|
+
const dirModeRaw = typeof parsed.dirMode === 'string' ? parsed.dirMode.trim() : '';
|
|
1480
|
+
if (dirModeRaw && dirModeRaw !== 'fixed' && dirModeRaw !== 'card') {
|
|
1481
|
+
return jsonRes(res, 400, { ok: false, error: 'invalid_dir_mode', message: 'dirMode 必须是 fixed 或 card' });
|
|
1482
|
+
}
|
|
1483
|
+
const dirMode = dirModeRaw === 'fixed' ? 'fixed' : dirModeRaw === 'card' ? 'card' : undefined;
|
|
1475
1484
|
const model = typeof parsed.model === 'string' && parsed.model.trim() ? parsed.model.trim() : undefined;
|
|
1476
|
-
const job = botOnboarding.start({ cliId, wrapperCli, workingDir, model });
|
|
1485
|
+
const job = botOnboarding.start({ cliId, wrapperCli, workingDir, dirMode, model });
|
|
1477
1486
|
return jsonRes(res, 202, { job: botOnboarding.get(job.id) });
|
|
1478
1487
|
}
|
|
1479
1488
|
let mOwner;
|
|
@@ -2647,6 +2656,9 @@ function readPlatformBotsInfo() {
|
|
|
2647
2656
|
avatar: e.botAvatarUrl || undefined,
|
|
2648
2657
|
cli: e.cliId,
|
|
2649
2658
|
showInTeam: cfg?.showInTeam !== false, // default true
|
|
2659
|
+
// 自家消息回声学到的租户稳定 union_id(可能尚未学到 → undefined)。
|
|
2660
|
+
// 平台聚合团队 roster 用,见 bot-union-ids-store / platform-team-store。
|
|
2661
|
+
unionId: e.larkAppId ? getBotUnionId(config.session.dataDir, e.larkAppId) : undefined,
|
|
2650
2662
|
};
|
|
2651
2663
|
})
|
|
2652
2664
|
.filter((b) => b.appId);
|
|
@@ -2667,14 +2679,87 @@ function startPlatformTunnelIfBound() {
|
|
|
2667
2679
|
getDashboardToken: () => activeToken,
|
|
2668
2680
|
getVersion: () => version,
|
|
2669
2681
|
getBots: () => readPlatformBotsInfo(),
|
|
2682
|
+
getTeamSyncRev: () => getPlatformTeamSyncRev(config.session.dataDir),
|
|
2683
|
+
onTeamSync: handlePlatformTeamSync,
|
|
2670
2684
|
log: (msg, extra) => logger.info(`[platform-tunnel] ${msg}${extra ? ' ' + JSON.stringify(extra) : ''}`),
|
|
2671
2685
|
});
|
|
2672
2686
|
logger.info(`[platform-tunnel] 绑定到 ${binding.platformUrl},启动隧道`);
|
|
2687
|
+
// 大厅打卡自愈重试:team-sync 应用时会立即尝试一次;这里的低频周期兜住
|
|
2688
|
+
// "当时 daemon 离线 / bot 还没进大厅 / 发送失败"的漏拍。无平台绑定不启动。
|
|
2689
|
+
const hallTimer = setInterval(() => { void maybeAnnounceHallPresence(); }, 5 * 60 * 1000);
|
|
2690
|
+
hallTimer.unref();
|
|
2673
2691
|
}
|
|
2674
2692
|
catch (e) {
|
|
2675
2693
|
logger.warn(`[platform-tunnel] 启动失败: ${e.message}`);
|
|
2676
2694
|
}
|
|
2677
2695
|
}
|
|
2696
|
+
/** 平台 team-sync 落盘(roster + 团队群镜像),随后触发一轮大厅打卡检查。 */
|
|
2697
|
+
function handlePlatformTeamSync(payload) {
|
|
2698
|
+
const applied = applyPlatformTeamSync(config.session.dataDir, payload);
|
|
2699
|
+
if (!applied) {
|
|
2700
|
+
logger.warn('[platform-tunnel] team-sync 负载无效,忽略');
|
|
2701
|
+
return;
|
|
2702
|
+
}
|
|
2703
|
+
logger.info(`[platform-tunnel] team-sync 已应用 rev=${applied.rev} teams=${applied.teams.length}`);
|
|
2704
|
+
void maybeAnnounceHallPresence();
|
|
2705
|
+
}
|
|
2706
|
+
// 大厅打卡(union_id 自学触发)节流:per-bot 最小间隔 + 每进程尝试上限。打卡消息
|
|
2707
|
+
// 本身只有 bot 可见(大厅是 bot-only 群),上限只是防御发送持续失败时的无谓重试。
|
|
2708
|
+
const hallAnnounceState = new Map();
|
|
2709
|
+
const HALL_ANNOUNCE_MIN_INTERVAL_MS = 10 * 60 * 1000;
|
|
2710
|
+
const HALL_ANNOUNCE_MAX_TRIES = 6;
|
|
2711
|
+
/**
|
|
2712
|
+
* 让还没学到自己 union_id 的本地 bot 去团队大厅发一条打卡消息:自家消息回声
|
|
2713
|
+
* (event-dispatcher isSelfMessage 分支)带回 sender.sender_id.union_id → 落盘
|
|
2714
|
+
* bot-union-ids → 下个心跳上报平台进 roster。一辈子一次;学到即永久跳过。
|
|
2715
|
+
* 顺带的副作用:大厅在各成员机器的 team-groups 里(team-sync 镜像),其他
|
|
2716
|
+
* daemon 收到这条消息会直接 recordTeamBot 学到该 bot——roster 之外的即时互学。
|
|
2717
|
+
*/
|
|
2718
|
+
async function maybeAnnounceHallPresence() {
|
|
2719
|
+
try {
|
|
2720
|
+
const dataDir = config.session.dataDir;
|
|
2721
|
+
const teams = listPlatformTeams(dataDir);
|
|
2722
|
+
if (teams.length === 0)
|
|
2723
|
+
return;
|
|
2724
|
+
const localBotIds = new Set(readPlatformBotsInfo().map(b => b.appId));
|
|
2725
|
+
const now = Date.now();
|
|
2726
|
+
for (const team of teams) {
|
|
2727
|
+
const hallChatId = team.groupChatIds[0];
|
|
2728
|
+
if (!hallChatId)
|
|
2729
|
+
continue;
|
|
2730
|
+
for (const bot of team.bots) {
|
|
2731
|
+
if (!localBotIds.has(bot.appId))
|
|
2732
|
+
continue; // 别的机器的 bot
|
|
2733
|
+
if (getBotUnionId(dataDir, bot.appId))
|
|
2734
|
+
continue; // 已学到 → 永久跳过
|
|
2735
|
+
const st = hallAnnounceState.get(bot.appId);
|
|
2736
|
+
if (st && (now - st.lastAt < HALL_ANNOUNCE_MIN_INTERVAL_MS || st.tries >= HALL_ANNOUNCE_MAX_TRIES))
|
|
2737
|
+
continue;
|
|
2738
|
+
hallAnnounceState.set(bot.appId, { lastAt: now, tries: (st?.tries ?? 0) + 1 });
|
|
2739
|
+
try {
|
|
2740
|
+
const r = await proxyToDaemon(bot.appId, '/api/platform/hall-announce', {
|
|
2741
|
+
method: 'POST',
|
|
2742
|
+
headers: { 'content-type': 'application/json' },
|
|
2743
|
+
body: JSON.stringify({ chatId: hallChatId }),
|
|
2744
|
+
});
|
|
2745
|
+
const j = await r.json().catch(() => ({}));
|
|
2746
|
+
if (!r.ok || !j.ok) {
|
|
2747
|
+
logger.warn(`[platform-tunnel] 大厅打卡失败 bot=${bot.appId} chat=${hallChatId.substring(0, 12)}: ${j.error ?? r.status}`);
|
|
2748
|
+
}
|
|
2749
|
+
else {
|
|
2750
|
+
logger.info(`[platform-tunnel] 大厅打卡已发 bot=${bot.appId} chat=${hallChatId.substring(0, 12)}(等待回声学 union_id)`);
|
|
2751
|
+
}
|
|
2752
|
+
}
|
|
2753
|
+
catch (e) {
|
|
2754
|
+
logger.warn(`[platform-tunnel] 大厅打卡请求异常 bot=${bot.appId}: ${e.message}`);
|
|
2755
|
+
}
|
|
2756
|
+
}
|
|
2757
|
+
}
|
|
2758
|
+
}
|
|
2759
|
+
catch (e) {
|
|
2760
|
+
logger.warn(`[platform-tunnel] 大厅打卡检查异常: ${e.message}`);
|
|
2761
|
+
}
|
|
2762
|
+
}
|
|
2678
2763
|
// Graceful shutdown
|
|
2679
2764
|
function shutdown() {
|
|
2680
2765
|
for (const off of subs.values())
|