botmux 2.95.0 → 2.96.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 +4 -4
- package/README.md +3 -3
- package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-backend.js +1 -10
- package/dist/adapters/backend/tmux-backend.js.map +1 -1
- package/dist/adapters/cli/kimi.d.ts +4 -0
- package/dist/adapters/cli/kimi.d.ts.map +1 -0
- package/dist/adapters/cli/kimi.js +54 -0
- package/dist/adapters/cli/kimi.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 +6 -20
- 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/adapters/hook-installer.d.ts.map +1 -1
- package/dist/adapters/hook-installer.js +138 -28
- package/dist/adapters/hook-installer.js.map +1 -1
- package/dist/bot-registry.d.ts +61 -4
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +164 -3
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli/stdin-encoding.d.ts +21 -0
- package/dist/cli/stdin-encoding.d.ts.map +1 -1
- package/dist/cli/stdin-encoding.js +37 -0
- package/dist/cli/stdin-encoding.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +14 -4
- package/dist/cli.js.map +1 -1
- package/dist/core/ask-hook/opencode.d.ts +15 -17
- package/dist/core/ask-hook/opencode.d.ts.map +1 -1
- package/dist/core/ask-hook/opencode.js +17 -19
- package/dist/core/ask-hook/opencode.js.map +1 -1
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +1 -0
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +193 -5
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/dashboard-rows.d.ts +2 -0
- package/dist/core/dashboard-rows.d.ts.map +1 -1
- package/dist/core/dashboard-rows.js +2 -0
- package/dist/core/dashboard-rows.js.map +1 -1
- package/dist/core/trigger-session.d.ts.map +1 -1
- package/dist/core/trigger-session.js +99 -7
- package/dist/core/trigger-session.js.map +1 -1
- package/dist/core/types.d.ts +16 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-pool.d.ts +1 -1
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +68 -11
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/dashboard/bot-payload.d.ts +7 -0
- package/dist/dashboard/bot-payload.d.ts.map +1 -1
- package/dist/dashboard/bot-payload.js +7 -1
- package/dist/dashboard/bot-payload.js.map +1 -1
- package/dist/dashboard/session-cleanup.d.ts +1 -0
- package/dist/dashboard/session-cleanup.d.ts.map +1 -1
- package/dist/dashboard/session-cleanup.js +2 -0
- package/dist/dashboard/session-cleanup.js.map +1 -1
- package/dist/dashboard/trigger-api.d.ts +4 -0
- package/dist/dashboard/trigger-api.d.ts.map +1 -1
- package/dist/dashboard/trigger-api.js +20 -0
- package/dist/dashboard/trigger-api.js.map +1 -1
- package/dist/dashboard/web/bot-defaults.d.ts +1 -0
- package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults.js +247 -4
- package/dist/dashboard/web/bot-defaults.js.map +1 -1
- package/dist/dashboard/web/connectors.d.ts +11 -0
- package/dist/dashboard/web/connectors.d.ts.map +1 -1
- package/dist/dashboard/web/connectors.js +45 -1
- package/dist/dashboard/web/connectors.js.map +1 -1
- package/dist/dashboard/web/groups.d.ts +7 -0
- package/dist/dashboard/web/groups.d.ts.map +1 -1
- package/dist/dashboard/web/groups.js +62 -15
- package/dist/dashboard/web/groups.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +52 -2
- 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 +149 -5
- package/dist/dashboard/web/sessions.js.map +1 -1
- package/dist/dashboard/webhook-routes.d.ts.map +1 -1
- package/dist/dashboard/webhook-routes.js +126 -6
- package/dist/dashboard/webhook-routes.js.map +1 -1
- package/dist/dashboard-web/app.js +818 -751
- package/dist/dashboard-web/style.css +47 -0
- package/dist/dashboard.js +84 -6
- package/dist/dashboard.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 +12 -0
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +45 -9
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts +13 -0
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +180 -11
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/im/lark/message-parser.d.ts +11 -0
- package/dist/im/lark/message-parser.d.ts.map +1 -1
- package/dist/im/lark/message-parser.js +2 -1
- package/dist/im/lark/message-parser.js.map +1 -1
- package/dist/im/lark/summary-command.d.ts +19 -0
- package/dist/im/lark/summary-command.d.ts.map +1 -0
- package/dist/im/lark/summary-command.js +276 -0
- package/dist/im/lark/summary-command.js.map +1 -0
- package/dist/mir-local-runtime.d.ts +40 -0
- package/dist/mir-local-runtime.d.ts.map +1 -1
- package/dist/mir-local-runtime.js +246 -52
- package/dist/mir-local-runtime.js.map +1 -1
- package/dist/mir-runner.js +26 -1
- package/dist/mir-runner.js.map +1 -1
- package/dist/services/card-prefs-store.d.ts +2 -2
- package/dist/services/card-prefs-store.d.ts.map +1 -1
- package/dist/services/card-prefs-store.js +5 -5
- package/dist/services/card-prefs-store.js.map +1 -1
- package/dist/services/chat-reply-mode-store.d.ts +6 -4
- package/dist/services/chat-reply-mode-store.d.ts.map +1 -1
- package/dist/services/chat-reply-mode-store.js +6 -4
- package/dist/services/chat-reply-mode-store.js.map +1 -1
- package/dist/services/pi-transcript.d.ts +19 -0
- package/dist/services/pi-transcript.d.ts.map +1 -0
- package/dist/services/pi-transcript.js +222 -0
- package/dist/services/pi-transcript.js.map +1 -0
- package/dist/services/summary-range-store.d.ts +21 -0
- package/dist/services/summary-range-store.d.ts.map +1 -0
- package/dist/services/summary-range-store.js +89 -0
- package/dist/services/summary-range-store.js.map +1 -0
- package/dist/services/trigger-types.d.ts +14 -2
- package/dist/services/trigger-types.d.ts.map +1 -1
- package/dist/services/trigger-types.js +15 -1
- package/dist/services/trigger-types.js.map +1 -1
- package/dist/setup/bot-config-editor.d.ts.map +1 -1
- package/dist/setup/bot-config-editor.js +2 -0
- package/dist/setup/bot-config-editor.js.map +1 -1
- package/dist/types.d.ts +20 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/executable.d.ts +3 -0
- package/dist/utils/executable.d.ts.map +1 -0
- package/dist/utils/executable.js +24 -0
- package/dist/utils/executable.js.map +1 -0
- package/dist/worker.js +69 -5
- package/dist/worker.js.map +1 -1
- package/dist/workflows/definition.d.ts +8 -8
- package/dist/workflows/events/payloads.d.ts +10 -10
- package/dist/workflows/events/schema.d.ts +28 -28
- package/package.json +1 -1
|
@@ -919,6 +919,22 @@ button.primary {
|
|
|
919
919
|
border: 1px solid var(--border-soft);
|
|
920
920
|
}
|
|
921
921
|
|
|
922
|
+
.session-lock-badge {
|
|
923
|
+
display: inline-flex;
|
|
924
|
+
align-items: center;
|
|
925
|
+
min-height: 22px;
|
|
926
|
+
margin-left: 6px;
|
|
927
|
+
padding: 0 8px;
|
|
928
|
+
border-radius: var(--radius-sm);
|
|
929
|
+
border: 1px solid color-mix(in srgb, var(--warning) 38%, var(--border-soft));
|
|
930
|
+
background: color-mix(in srgb, var(--warning) 10%, var(--surface-muted));
|
|
931
|
+
color: var(--warning);
|
|
932
|
+
font-size: 11px;
|
|
933
|
+
font-weight: 800;
|
|
934
|
+
line-height: 1;
|
|
935
|
+
text-transform: uppercase;
|
|
936
|
+
}
|
|
937
|
+
|
|
922
938
|
.cli-claude-code { background: #e8f0ff; color: #234fb4; border-color: #c8d9ff; }
|
|
923
939
|
.cli-codex { background: #fff0df; color: #a14c11; border-color: #ffd8ad; }
|
|
924
940
|
.cli-codex-app { background: #e9f7ff; color: #11638f; border-color: #bde4fa; }
|
|
@@ -1140,6 +1156,10 @@ button.primary {
|
|
|
1140
1156
|
background: color-mix(in srgb, var(--accent) 5%, var(--surface-raised));
|
|
1141
1157
|
}
|
|
1142
1158
|
|
|
1159
|
+
.session-card.locked {
|
|
1160
|
+
border-color: color-mix(in srgb, var(--warning) 45%, var(--border));
|
|
1161
|
+
}
|
|
1162
|
+
|
|
1143
1163
|
@media (prefers-reduced-motion: reduce) {
|
|
1144
1164
|
.session-card { animation: none; transition: none; }
|
|
1145
1165
|
.session-board-needs-you h2::before { animation: none; }
|
|
@@ -1197,6 +1217,19 @@ button.primary {
|
|
|
1197
1217
|
font-size: 12px;
|
|
1198
1218
|
}
|
|
1199
1219
|
|
|
1220
|
+
.session-card-status-group,
|
|
1221
|
+
.drawer-status-line {
|
|
1222
|
+
display: inline-flex;
|
|
1223
|
+
align-items: center;
|
|
1224
|
+
gap: 6px;
|
|
1225
|
+
flex-wrap: wrap;
|
|
1226
|
+
}
|
|
1227
|
+
|
|
1228
|
+
.session-card-status-group .session-lock-badge,
|
|
1229
|
+
.drawer-status-line .session-lock-badge {
|
|
1230
|
+
margin-left: 0;
|
|
1231
|
+
}
|
|
1232
|
+
|
|
1200
1233
|
.session-signal {
|
|
1201
1234
|
display: inline-flex;
|
|
1202
1235
|
align-items: center;
|
|
@@ -1487,6 +1520,10 @@ button.primary {
|
|
|
1487
1520
|
background: color-mix(in srgb, var(--accent) 4%, var(--surface-raised));
|
|
1488
1521
|
}
|
|
1489
1522
|
|
|
1523
|
+
.kanban-card.locked {
|
|
1524
|
+
border-color: color-mix(in srgb, var(--warning) 45%, var(--border));
|
|
1525
|
+
}
|
|
1526
|
+
|
|
1490
1527
|
.kanban-card:focus-visible {
|
|
1491
1528
|
outline: 2px solid var(--accent);
|
|
1492
1529
|
outline-offset: 1px;
|
|
@@ -1873,6 +1910,11 @@ button.primary {
|
|
|
1873
1910
|
border-color: var(--danger);
|
|
1874
1911
|
background: color-mix(in srgb, var(--danger) 9%, var(--surface-raised));
|
|
1875
1912
|
}
|
|
1913
|
+
.card-act.locked {
|
|
1914
|
+
color: var(--warning);
|
|
1915
|
+
border-color: color-mix(in srgb, var(--warning) 45%, var(--border));
|
|
1916
|
+
background: color-mix(in srgb, var(--warning) 8%, var(--surface-raised));
|
|
1917
|
+
}
|
|
1876
1918
|
.card-act:active { transform: scale(0.9); }
|
|
1877
1919
|
|
|
1878
1920
|
/* 终端访问药丸:左「终端」段(accent ghost·只读旁观) + 右「钥匙」段(accent 实心·
|
|
@@ -4216,6 +4258,11 @@ button.contrast:hover { background: var(--danger-soft); border-color: var(--dang
|
|
|
4216
4258
|
box-shadow: 0 0 8px color-mix(in srgb, var(--accent) 55%, transparent);
|
|
4217
4259
|
flex: none;
|
|
4218
4260
|
}
|
|
4261
|
+
.bd-summary-limits {
|
|
4262
|
+
display: grid;
|
|
4263
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
4264
|
+
gap: 10px;
|
|
4265
|
+
}
|
|
4219
4266
|
|
|
4220
4267
|
.settings-grid {
|
|
4221
4268
|
display: grid;
|
package/dist/dashboard.js
CHANGED
|
@@ -475,8 +475,27 @@ function configuredCliIds() {
|
|
|
475
475
|
return new Map();
|
|
476
476
|
}
|
|
477
477
|
}
|
|
478
|
+
function configuredBotAgentFields() {
|
|
479
|
+
try {
|
|
480
|
+
return new Map(loadBotConfigs().map(b => [b.larkAppId, {
|
|
481
|
+
cliId: b.cliId,
|
|
482
|
+
wrapperCli: b.wrapperCli,
|
|
483
|
+
model: b.model,
|
|
484
|
+
}]));
|
|
485
|
+
}
|
|
486
|
+
catch {
|
|
487
|
+
return new Map();
|
|
488
|
+
}
|
|
489
|
+
}
|
|
478
490
|
function withConfiguredCliId(bot, ids) {
|
|
479
|
-
|
|
491
|
+
const raw = ids.get(bot.larkAppId);
|
|
492
|
+
const fallback = typeof raw === 'string' ? { cliId: raw } : raw;
|
|
493
|
+
return {
|
|
494
|
+
...bot,
|
|
495
|
+
cliId: bot.cliId || fallback?.cliId,
|
|
496
|
+
wrapperCli: bot.wrapperCli || fallback?.wrapperCli,
|
|
497
|
+
model: bot.model || fallback?.model,
|
|
498
|
+
};
|
|
480
499
|
}
|
|
481
500
|
function liveBots() {
|
|
482
501
|
const ids = configuredCliIds();
|
|
@@ -1526,9 +1545,9 @@ const server = createServer(async (req, res) => {
|
|
|
1526
1545
|
return jsonRes(res, 400, { ok: false, error: 'bad_request' });
|
|
1527
1546
|
return jsonRes(res, 200, { ok: true, entry });
|
|
1528
1547
|
}
|
|
1529
|
-
// 看板放置 /
|
|
1548
|
+
// 看板放置 / 重命名 / 锁定:带 JSON body 的会话写操作,原样转发给 owner daemon。
|
|
1530
1549
|
// 不在公开读白名单内 → 只读访客在 decideDashboardAuth 已被 401。
|
|
1531
|
-
if (req.method === 'POST' && (m = url.pathname.match(/^\/api\/sessions\/([^/]+)\/(board|rename)$/))) {
|
|
1550
|
+
if (req.method === 'POST' && (m = url.pathname.match(/^\/api\/sessions\/([^/]+)\/(board|rename|lock)$/))) {
|
|
1532
1551
|
const sid = decodeURIComponent(m[1]);
|
|
1533
1552
|
const op = m[2];
|
|
1534
1553
|
const owner = aggregator.ownerOf(sid);
|
|
@@ -1894,8 +1913,8 @@ const server = createServer(async (req, res) => {
|
|
|
1894
1913
|
// [{larkAppId, botName, defaultOncall, ...}]
|
|
1895
1914
|
// PUT /api/bots/:appId/default-oncall — proxy to that bot's daemon
|
|
1896
1915
|
if (req.method === 'GET' && url.pathname === '/api/bots') {
|
|
1897
|
-
const
|
|
1898
|
-
const onlineBots = [...registry.list()].map(b => withConfiguredCliId(b,
|
|
1916
|
+
const agentFields = configuredBotAgentFields();
|
|
1917
|
+
const onlineBots = [...registry.list()].map(b => withConfiguredCliId(b, agentFields)).sort((a, b) => a.botIndex - b.botIndex);
|
|
1899
1918
|
const out = await Promise.all(onlineBots.map(async (d) => {
|
|
1900
1919
|
try {
|
|
1901
1920
|
const r = await fetch(`http://127.0.0.1:${d.ipcPort}/api/bot-default-oncall`);
|
|
@@ -1903,7 +1922,13 @@ const server = createServer(async (req, res) => {
|
|
|
1903
1922
|
return botDefaultsPayload(d, undefined, `http_${r.status}`);
|
|
1904
1923
|
}
|
|
1905
1924
|
const j = await r.json();
|
|
1906
|
-
return botDefaultsPayload({
|
|
1925
|
+
return botDefaultsPayload({
|
|
1926
|
+
...d,
|
|
1927
|
+
botName: d.botName ?? j.botName,
|
|
1928
|
+
cliId: j.cliId || d.cliId,
|
|
1929
|
+
wrapperCli: j.wrapperCli || d.wrapperCli,
|
|
1930
|
+
model: j.model || d.model,
|
|
1931
|
+
}, j);
|
|
1907
1932
|
}
|
|
1908
1933
|
catch (e) {
|
|
1909
1934
|
return botDefaultsPayload(d, undefined, e?.message ?? String(e));
|
|
@@ -1946,6 +1971,24 @@ const server = createServer(async (req, res) => {
|
|
|
1946
1971
|
res.end(await upstream.text());
|
|
1947
1972
|
return;
|
|
1948
1973
|
}
|
|
1974
|
+
// PUT /api/bots/:appId/agent — proxy to that bot's daemon. Body
|
|
1975
|
+
// `{ cliId, model }`; cliId is the dashboard selection key.
|
|
1976
|
+
let mBotAgent;
|
|
1977
|
+
if (req.method === 'PUT' && (mBotAgent = url.pathname.match(/^\/api\/bots\/([^/]+)\/agent$/))) {
|
|
1978
|
+
const appId = decodeURIComponent(mBotAgent[1]);
|
|
1979
|
+
const chunks = [];
|
|
1980
|
+
for await (const c of req)
|
|
1981
|
+
chunks.push(c);
|
|
1982
|
+
const raw = Buffer.concat(chunks).toString('utf8') || '{}';
|
|
1983
|
+
const upstream = await proxyToDaemon(appId, `/api/bot-agent`, {
|
|
1984
|
+
method: 'PUT',
|
|
1985
|
+
headers: { 'content-type': 'application/json' },
|
|
1986
|
+
body: raw,
|
|
1987
|
+
});
|
|
1988
|
+
res.writeHead(upstream.status, { 'content-type': 'application/json' });
|
|
1989
|
+
res.end(await upstream.text());
|
|
1990
|
+
return;
|
|
1991
|
+
}
|
|
1949
1992
|
// PUT /api/bots/:appId/skills — proxy to that bot's daemon. Body accepts
|
|
1950
1993
|
// `{ action:'attach'|'detach', name }` or `{ action:'set', policy|null }`.
|
|
1951
1994
|
let mBotSkills;
|
|
@@ -2071,6 +2114,41 @@ const server = createServer(async (req, res) => {
|
|
|
2071
2114
|
res.end(await upstream.text());
|
|
2072
2115
|
return;
|
|
2073
2116
|
}
|
|
2117
|
+
// PUT /api/bots/:appId/summary-range — proxy to that bot's daemon. Body
|
|
2118
|
+
// `{ limit, sinceHours }`; daemon updates the explicit /summary range.
|
|
2119
|
+
let mBotSummaryRange;
|
|
2120
|
+
if (req.method === 'PUT' && (mBotSummaryRange = url.pathname.match(/^\/api\/bots\/([^/]+)\/summary-range$/))) {
|
|
2121
|
+
const appId = decodeURIComponent(mBotSummaryRange[1]);
|
|
2122
|
+
const chunks = [];
|
|
2123
|
+
for await (const c of req)
|
|
2124
|
+
chunks.push(c);
|
|
2125
|
+
const raw = Buffer.concat(chunks).toString('utf8') || '{}';
|
|
2126
|
+
const upstream = await proxyToDaemon(appId, `/api/bot-summary-range`, {
|
|
2127
|
+
method: 'PUT',
|
|
2128
|
+
headers: { 'content-type': 'application/json' },
|
|
2129
|
+
body: raw,
|
|
2130
|
+
});
|
|
2131
|
+
res.writeHead(upstream.status, { 'content-type': 'application/json' });
|
|
2132
|
+
res.end(await upstream.text());
|
|
2133
|
+
return;
|
|
2134
|
+
}
|
|
2135
|
+
// Backward-compatible alias from the short-lived keyword-trigger dashboard.
|
|
2136
|
+
let mBotSummaryTrigger;
|
|
2137
|
+
if (req.method === 'PUT' && (mBotSummaryTrigger = url.pathname.match(/^\/api\/bots\/([^/]+)\/summary-trigger$/))) {
|
|
2138
|
+
const appId = decodeURIComponent(mBotSummaryTrigger[1]);
|
|
2139
|
+
const chunks = [];
|
|
2140
|
+
for await (const c of req)
|
|
2141
|
+
chunks.push(c);
|
|
2142
|
+
const raw = Buffer.concat(chunks).toString('utf8') || '{}';
|
|
2143
|
+
const upstream = await proxyToDaemon(appId, `/api/bot-summary-trigger`, {
|
|
2144
|
+
method: 'PUT',
|
|
2145
|
+
headers: { 'content-type': 'application/json' },
|
|
2146
|
+
body: raw,
|
|
2147
|
+
});
|
|
2148
|
+
res.writeHead(upstream.status, { 'content-type': 'application/json' });
|
|
2149
|
+
res.end(await upstream.text());
|
|
2150
|
+
return;
|
|
2151
|
+
}
|
|
2074
2152
|
// PUT /api/bots/:appId/p2p-mode — proxy to that bot's daemon. Body
|
|
2075
2153
|
// `{ p2pMode: 'chat' | 'thread' }` ('chat' = flat continuous DM session;
|
|
2076
2154
|
// anything else clears back to the per-message thread default).
|