botmux 2.95.0 → 2.96.1
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 +6 -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/config.d.ts +18 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +27 -0
- package/dist/config.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/settings-write-applier.d.ts +2 -1
- package/dist/dashboard/settings-write-applier.d.ts.map +1 -1
- package/dist/dashboard/settings-write-applier.js +6 -0
- package/dist/dashboard/settings-write-applier.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 +58 -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/web/settings.d.ts.map +1 -1
- package/dist/dashboard/web/settings.js +10 -0
- package/dist/dashboard/web/settings.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 +827 -751
- package/dist/dashboard-web/style.css +47 -0
- package/dist/dashboard.js +85 -6
- package/dist/dashboard.js.map +1 -1
- package/dist/global-config.d.ts +4 -0
- package/dist/global-config.d.ts.map +1 -1
- package/dist/global-config.js +2 -0
- package/dist/global-config.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 +154 -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 +200 -16
- 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/seen-message-store.d.ts +12 -0
- package/dist/services/seen-message-store.d.ts.map +1 -0
- package/dist/services/seen-message-store.js +119 -0
- package/dist/services/seen-message-store.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 +75 -6
- 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
|
@@ -5,6 +5,10 @@ export declare function newTriggerId(): string;
|
|
|
5
5
|
export type TriggerApiDeps = {
|
|
6
6
|
proxyToDaemon: (larkAppId: string, daemonPath: string, init: RequestInit) => Promise<Response>;
|
|
7
7
|
};
|
|
8
|
+
export declare function queryTriggerResult(botId: string, sessionId: string, deps: TriggerApiDeps, triggerId?: string): Promise<{
|
|
9
|
+
status: number;
|
|
10
|
+
body: TriggerResponse;
|
|
11
|
+
}>;
|
|
8
12
|
export declare function dispatchTriggerRequest(body: TriggerRequest, deps: TriggerApiDeps): Promise<{
|
|
9
13
|
status: number;
|
|
10
14
|
body: TriggerResponse;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trigger-api.d.ts","sourceRoot":"","sources":["../../src/dashboard/trigger-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAOpF,wBAAsB,qBAAqB,CAAC,CAAC,GAAG,OAAO,EACrD,GAAG,EAAE,eAAe,EACpB,QAAQ,GAAE,MAA+B,GACxC,OAAO,CAAC,CAAC,CAAC,CAWZ;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;CAChG,CAAC;AAEF,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,eAAe,CAAA;CAAE,CAAC,CAuCpD;AAED,wBAAsB,yBAAyB,CAC7C,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,IAAI,CAAC,CAef"}
|
|
1
|
+
{"version":3,"file":"trigger-api.d.ts","sourceRoot":"","sources":["../../src/dashboard/trigger-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAOpF,wBAAsB,qBAAqB,CAAC,CAAC,GAAG,OAAO,EACrD,GAAG,EAAE,eAAe,EACpB,QAAQ,GAAE,MAA+B,GACxC,OAAO,CAAC,CAAC,CAAC,CAWZ;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;CAChG,CAAC;AAEF,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,cAAc,EACpB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,eAAe,CAAA;CAAE,CAAC,CAkBpD;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,eAAe,CAAA;CAAE,CAAC,CAuCpD;AAED,wBAAsB,yBAAyB,CAC7C,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,IAAI,CAAC,CAef"}
|
|
@@ -20,6 +20,26 @@ export async function readJsonBodyWithLimit(req, maxBytes = MAX_TRIGGER_BODY_BYT
|
|
|
20
20
|
export function newTriggerId() {
|
|
21
21
|
return `trg_${randomUUID()}`;
|
|
22
22
|
}
|
|
23
|
+
export async function queryTriggerResult(botId, sessionId, deps, triggerId) {
|
|
24
|
+
const suffix = triggerId ? `?triggerId=${encodeURIComponent(triggerId)}` : '';
|
|
25
|
+
const upstream = await deps.proxyToDaemon(botId, `/api/sessions/${encodeURIComponent(sessionId)}/trigger-result${suffix}`, {
|
|
26
|
+
method: 'GET',
|
|
27
|
+
});
|
|
28
|
+
const text = await upstream.text();
|
|
29
|
+
let parsed;
|
|
30
|
+
try {
|
|
31
|
+
parsed = JSON.parse(text);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
parsed = {
|
|
35
|
+
ok: false,
|
|
36
|
+
triggerId: newTriggerId(),
|
|
37
|
+
error: `non-json upstream response (${upstream.status})`,
|
|
38
|
+
errorCode: 'trigger_failed',
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
return { status: upstream.status, body: parsed };
|
|
42
|
+
}
|
|
23
43
|
export async function dispatchTriggerRequest(body, deps) {
|
|
24
44
|
// Both turn and workflow are proxied by botId to the owning daemon's
|
|
25
45
|
// /api/trigger; the daemon IPC handler dispatches turn vs workflow.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trigger-api.js","sourceRoot":"","sources":["../../src/dashboard/trigger-api.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"trigger-api.js","sourceRoot":"","sources":["../../src/dashboard/trigger-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export declare function displayCliId(bot: any, sessionFallback: string): string;
|
|
2
|
+
export declare function renderBotAgentSection(b: any, sessionFallback: string): string;
|
|
2
3
|
export declare function renderBotDefaultsPage(root: HTMLElement): Promise<void>;
|
|
3
4
|
//# sourceMappingURL=bot-defaults.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot-defaults.d.ts","sourceRoot":"","sources":["../../../src/dashboard/web/bot-defaults.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bot-defaults.d.ts","sourceRoot":"","sources":["../../../src/dashboard/web/bot-defaults.ts"],"names":[],"mappings":"AA2BA,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAEtE;AAiED,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,GAAG,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAiC7E;AAyDD,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,WAAW,iBA89C5D"}
|
|
@@ -7,6 +7,14 @@ import { store } from './store.js';
|
|
|
7
7
|
import { botAvatarHtml, escapeHtml, loadNameMaps, loadingHtml, t } from './ui.js';
|
|
8
8
|
let cache = { bots: [] };
|
|
9
9
|
let loadError = null;
|
|
10
|
+
let cliOptions = [
|
|
11
|
+
{ id: 'claude-code', label: 'Claude' },
|
|
12
|
+
{ id: 'codex', label: 'Codex' },
|
|
13
|
+
{ id: 'traex', label: 'traex' },
|
|
14
|
+
];
|
|
15
|
+
let cliOptionsLoaded = false;
|
|
16
|
+
let ttadkModelDefault = 'glm-5.1';
|
|
17
|
+
let ttadkModelSuggestions = [];
|
|
10
18
|
// master-detail:左侧员工名册选中谁,右侧就渲染谁的档案
|
|
11
19
|
let selectedAppId = null;
|
|
12
20
|
export function displayCliId(bot, sessionFallback) {
|
|
@@ -24,6 +32,76 @@ function cliIdOf(appId) {
|
|
|
24
32
|
}
|
|
25
33
|
return best?.cliId ?? '';
|
|
26
34
|
}
|
|
35
|
+
async function loadCliOptions() {
|
|
36
|
+
if (cliOptionsLoaded)
|
|
37
|
+
return;
|
|
38
|
+
cliOptionsLoaded = true;
|
|
39
|
+
try {
|
|
40
|
+
const r = await fetch('/api/cli-options');
|
|
41
|
+
const body = await r.json().catch(() => ({}));
|
|
42
|
+
if (r.ok && Array.isArray(body?.options)) {
|
|
43
|
+
cliOptions = body.options.filter((o) => o && typeof o.id === 'string' && typeof o.label === 'string');
|
|
44
|
+
if (typeof body.ttadkModelDefault === 'string' && body.ttadkModelDefault.trim()) {
|
|
45
|
+
ttadkModelDefault = body.ttadkModelDefault.trim();
|
|
46
|
+
}
|
|
47
|
+
if (Array.isArray(body.ttadkModelSuggestions)) {
|
|
48
|
+
ttadkModelSuggestions = body.ttadkModelSuggestions.filter((s) => typeof s === 'string');
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Keep the static fallback; saving still works for plain claude-code.
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function agentSelectionKey(bot, sessionFallback) {
|
|
57
|
+
const explicit = typeof bot?.agentSelectionKey === 'string' && bot.agentSelectionKey ? bot.agentSelectionKey : '';
|
|
58
|
+
if (explicit)
|
|
59
|
+
return explicit;
|
|
60
|
+
const cli = displayCliId(bot, sessionFallback);
|
|
61
|
+
return cli || 'claude-code';
|
|
62
|
+
}
|
|
63
|
+
function selectedCliOption(key) {
|
|
64
|
+
return cliOptions.find(o => o.id === key);
|
|
65
|
+
}
|
|
66
|
+
function modelSuggestionsForOption(opt) {
|
|
67
|
+
if (opt?.gateway === 'ttadk' && opt.acceptsModel !== false)
|
|
68
|
+
return ttadkModelSuggestions;
|
|
69
|
+
return [];
|
|
70
|
+
}
|
|
71
|
+
export function renderBotAgentSection(b, sessionFallback) {
|
|
72
|
+
const key = agentSelectionKey(b, sessionFallback);
|
|
73
|
+
const optHtml = cliOptions
|
|
74
|
+
.map(o => `<option value="${escapeHtml(o.id)}" ${o.id === key ? 'selected' : ''}>${escapeHtml(o.label)}(${escapeHtml(o.id)})</option>`)
|
|
75
|
+
.join('');
|
|
76
|
+
const model = typeof b?.model === 'string' ? b.model : '';
|
|
77
|
+
const suggestions = modelSuggestionsForOption(selectedCliOption(key));
|
|
78
|
+
const disabled = selectedCliOption(key)?.gateway === 'ttadk' && selectedCliOption(key)?.acceptsModel === false;
|
|
79
|
+
return `<section class="bd-section">
|
|
80
|
+
<h3 class="bd-section-title">${t('botDefaults.sectionAgent')}</h3>
|
|
81
|
+
<div class="bd-row">
|
|
82
|
+
<label>
|
|
83
|
+
<span>${t('botDefaults.agentCli')}</span>
|
|
84
|
+
<select data-input="agentCliId">${optHtml}</select>
|
|
85
|
+
</label>
|
|
86
|
+
</div>
|
|
87
|
+
<div class="bd-row">
|
|
88
|
+
<label>
|
|
89
|
+
<span>${t('botDefaults.agentModel')}</span>
|
|
90
|
+
<input type="text" data-input="agentModel" list="agent-model-suggestions-${escapeHtml(b.larkAppId)}"
|
|
91
|
+
placeholder="${escapeHtml(t('botDefaults.agentModelPlaceholder'))}"
|
|
92
|
+
value="${escapeHtml(model)}" ${disabled ? 'disabled' : ''}>
|
|
93
|
+
<datalist id="agent-model-suggestions-${escapeHtml(b.larkAppId)}">
|
|
94
|
+
${suggestions.map(m => `<option value="${escapeHtml(m)}"></option>`).join('')}
|
|
95
|
+
</datalist>
|
|
96
|
+
</label>
|
|
97
|
+
<small class="bd-help">${t('botDefaults.agentHelp')}</small>
|
|
98
|
+
<div class="actions">
|
|
99
|
+
<button type="button" class="primary" data-action="save-agent">${t('botDefaults.agentSave')}</button>
|
|
100
|
+
<span class="oncall-status" data-agent-status></span>
|
|
101
|
+
</div>
|
|
102
|
+
</div>
|
|
103
|
+
</section>`;
|
|
104
|
+
}
|
|
27
105
|
function pageHtml() {
|
|
28
106
|
return `<section class="page">
|
|
29
107
|
<div class="page-heading">
|
|
@@ -89,7 +167,7 @@ export async function renderBotDefaultsPage(root) {
|
|
|
89
167
|
refreshBtn.disabled = true;
|
|
90
168
|
try {
|
|
91
169
|
botProfileRoleCache.clear();
|
|
92
|
-
await loadBots();
|
|
170
|
+
await Promise.all([loadBots(), loadCliOptions()]);
|
|
93
171
|
rerender();
|
|
94
172
|
}
|
|
95
173
|
finally {
|
|
@@ -107,7 +185,7 @@ export async function renderBotDefaultsPage(root) {
|
|
|
107
185
|
});
|
|
108
186
|
// /api/bots 要逐 daemon 探活,慢——先亮 loading 占住右侧详情区。
|
|
109
187
|
listEl.innerHTML = loadingHtml();
|
|
110
|
-
await loadBots();
|
|
188
|
+
await Promise.all([loadBots(), loadCliOptions()]);
|
|
111
189
|
function rerender() {
|
|
112
190
|
const f = new FormData(form);
|
|
113
191
|
const q = (f.get('q') ?? '').toLowerCase();
|
|
@@ -189,6 +267,7 @@ export async function renderBotDefaultsPage(root) {
|
|
|
189
267
|
</header>
|
|
190
268
|
<div class="bd-body bd-grid">
|
|
191
269
|
<section class="bd-tile">
|
|
270
|
+
${renderBotAgentSection(b, cli)}
|
|
192
271
|
<section class="bd-section">
|
|
193
272
|
<h3 class="bd-section-title">${t('botDefaults.sectionWorkingDir')}</h3>
|
|
194
273
|
<div class="bd-row">
|
|
@@ -219,7 +298,7 @@ export async function renderBotDefaultsPage(root) {
|
|
|
219
298
|
</section>
|
|
220
299
|
<section class="bd-tile">${renderRoleSection(b)}</section>
|
|
221
300
|
<section class="bd-tile">${renderSessionModeSection(b)}${renderCrossBotSection(b)}${renderSessionCapSection(b)}${renderStartupCommandsSection(b)}${renderLaunchShellSection(b)}${renderEnvSection(b)}</section>
|
|
222
|
-
<section class="bd-tile">${renderCardBehaviorSection(b)}${renderBrandSection(b)}</section>
|
|
301
|
+
<section class="bd-tile">${renderCardBehaviorSection(b)}${renderSummaryTriggerSection(b)}${renderBrandSection(b)}</section>
|
|
223
302
|
<section class="bd-tile">${renderGrantSection(b)}</section>
|
|
224
303
|
</div>
|
|
225
304
|
</article>`;
|
|
@@ -363,6 +442,29 @@ export async function renderBotDefaultsPage(root) {
|
|
|
363
442
|
<div class="actions"><span class="oncall-status" data-crossbot-status></span></div>
|
|
364
443
|
</section>`;
|
|
365
444
|
}
|
|
445
|
+
function renderSummaryTriggerSection(b) {
|
|
446
|
+
const range = b.summaryRange ?? { limit: 50, sinceHours: 24 };
|
|
447
|
+
const limit = Number.isInteger(range.limit) && range.limit >= 0 ? range.limit : 50;
|
|
448
|
+
const sinceHours = Number.isInteger(range.sinceHours) && range.sinceHours >= 0 ? range.sinceHours : 24;
|
|
449
|
+
return `<section class="bd-section">
|
|
450
|
+
<h3 class="bd-section-title">${t('botDefaults.sectionSummaryTrigger')}</h3>
|
|
451
|
+
<div class="bd-row bd-summary-limits">
|
|
452
|
+
<label>
|
|
453
|
+
<span>${t('botDefaults.summaryLimit')}</span>
|
|
454
|
+
<input type="number" min="0" step="1" data-input="summaryLimit" value="${limit}">
|
|
455
|
+
</label>
|
|
456
|
+
<label>
|
|
457
|
+
<span>${t('botDefaults.summarySinceHours')}</span>
|
|
458
|
+
<input type="number" min="0" step="1" data-input="summarySinceHours" value="${sinceHours}">
|
|
459
|
+
</label>
|
|
460
|
+
</div>
|
|
461
|
+
<small class="bd-help">${t('botDefaults.summaryLimitHelp')}</small>
|
|
462
|
+
<div class="actions">
|
|
463
|
+
<button type="button" class="primary" data-action="save-summary-trigger">${t('botDefaults.summarySave')}</button>
|
|
464
|
+
<span class="oncall-status" data-summary-trigger-status></span>
|
|
465
|
+
</div>
|
|
466
|
+
</section>`;
|
|
467
|
+
}
|
|
366
468
|
// 会话模式:私聊(p2pMode)+ 普通群(regularGroupReplyMode)两个默认会话方式
|
|
367
469
|
// 放在同一板块,各自一个下拉、一改即保存。
|
|
368
470
|
// • p2pMode → PUT /api/bots/:appId/p2p-mode(走 applyConfigField,与 /botconfig 同路径)
|
|
@@ -373,7 +475,7 @@ export async function renderBotDefaultsPage(root) {
|
|
|
373
475
|
const p2p = b.p2pMode === 'chat' ? 'chat' : 'thread';
|
|
374
476
|
const regular = (b.regularGroupReplyMode === 'new-topic' || b.regularGroupReplyMode === 'shared' || b.regularGroupReplyMode === 'chat-topic')
|
|
375
477
|
? b.regularGroupReplyMode : 'chat';
|
|
376
|
-
const mention = (b.regularGroupMentionMode === 'topic' || b.regularGroupMentionMode === 'never')
|
|
478
|
+
const mention = (b.regularGroupMentionMode === 'topic' || b.regularGroupMentionMode === 'never' || b.regularGroupMentionMode === 'ambient')
|
|
377
479
|
? b.regularGroupMentionMode : 'always';
|
|
378
480
|
const docMode = b.docSubscribeDefaultMode === 'all' ? 'all' : 'mention-only';
|
|
379
481
|
const opt = (v, label) => `<option value="${v}" ${regular === v ? 'selected' : ''}>${escapeHtml(label)}</option>`;
|
|
@@ -416,6 +518,7 @@ export async function renderBotDefaultsPage(root) {
|
|
|
416
518
|
${mopt('always', t('botDefaults.mentionModeAlways'))}
|
|
417
519
|
${mopt('topic', t('botDefaults.mentionModeTopic'))}
|
|
418
520
|
${mopt('never', t('botDefaults.mentionModeNever'))}
|
|
521
|
+
${mopt('ambient', t('botDefaults.mentionModeAmbient'))}
|
|
419
522
|
</select>
|
|
420
523
|
</label>
|
|
421
524
|
<small class="bd-help">${t('botDefaults.mentionModeHelp')}</small>
|
|
@@ -710,6 +813,85 @@ export async function renderBotDefaultsPage(root) {
|
|
|
710
813
|
const statusEl = card.querySelector('[data-status]');
|
|
711
814
|
if (!wdModeSel || !input || !saveBtn || !statusEl)
|
|
712
815
|
return; // error card
|
|
816
|
+
// ── Agent CLI / model (next-session) ─────────────────────────────────
|
|
817
|
+
const agentCliSel = card.querySelector('select[data-input=agentCliId]');
|
|
818
|
+
const agentModelInput = card.querySelector('input[data-input=agentModel]');
|
|
819
|
+
const agentSaveBtn = card.querySelector('button[data-action=save-agent]');
|
|
820
|
+
const agentStatusEl = card.querySelector('[data-agent-status]');
|
|
821
|
+
function syncAgentModelField() {
|
|
822
|
+
if (!agentCliSel || !agentModelInput)
|
|
823
|
+
return;
|
|
824
|
+
const list = card.querySelector(`#agent-model-suggestions-${CSS.escape(appId)}`);
|
|
825
|
+
const opt = selectedCliOption(agentCliSel.value);
|
|
826
|
+
const isTtadk = opt?.gateway === 'ttadk';
|
|
827
|
+
const acceptsModel = isTtadk && opt.acceptsModel !== false;
|
|
828
|
+
if (isTtadk && !acceptsModel) {
|
|
829
|
+
if (list)
|
|
830
|
+
list.innerHTML = '';
|
|
831
|
+
agentModelInput.value = '';
|
|
832
|
+
agentModelInput.disabled = true;
|
|
833
|
+
agentModelInput.placeholder = t('botOnboarding.modelTtadkCocoPlaceholder');
|
|
834
|
+
return;
|
|
835
|
+
}
|
|
836
|
+
agentModelInput.disabled = false;
|
|
837
|
+
if (acceptsModel) {
|
|
838
|
+
if (list)
|
|
839
|
+
list.innerHTML = ttadkModelSuggestions.map(m => `<option value="${escapeHtml(m)}"></option>`).join('');
|
|
840
|
+
agentModelInput.placeholder = t('botOnboarding.modelTtadkPlaceholder').replace('{model}', ttadkModelDefault);
|
|
841
|
+
if (!agentModelInput.value.trim())
|
|
842
|
+
agentModelInput.value = ttadkModelDefault;
|
|
843
|
+
}
|
|
844
|
+
else {
|
|
845
|
+
if (list)
|
|
846
|
+
list.innerHTML = '';
|
|
847
|
+
agentModelInput.placeholder = t('botDefaults.agentModelPlaceholder');
|
|
848
|
+
if (agentModelInput.value.trim() === ttadkModelDefault)
|
|
849
|
+
agentModelInput.value = '';
|
|
850
|
+
}
|
|
851
|
+
}
|
|
852
|
+
if (agentCliSel && agentModelInput && agentSaveBtn && agentStatusEl) {
|
|
853
|
+
agentCliSel.addEventListener('change', syncAgentModelField);
|
|
854
|
+
agentSaveBtn.addEventListener('click', async () => {
|
|
855
|
+
agentStatusEl.textContent = '';
|
|
856
|
+
agentStatusEl.className = 'oncall-status';
|
|
857
|
+
agentSaveBtn.disabled = true;
|
|
858
|
+
agentCliSel.disabled = true;
|
|
859
|
+
agentModelInput.disabled = true;
|
|
860
|
+
try {
|
|
861
|
+
const r = await fetch(`/api/bots/${encodeURIComponent(appId)}/agent`, {
|
|
862
|
+
method: 'PUT',
|
|
863
|
+
headers: { 'content-type': 'application/json' },
|
|
864
|
+
body: JSON.stringify({ cliId: agentCliSel.value, model: agentModelInput.value }),
|
|
865
|
+
});
|
|
866
|
+
const body = await r.json().catch(() => ({}));
|
|
867
|
+
if (r.ok && body.ok) {
|
|
868
|
+
agentStatusEl.textContent = `✓ ${t('botDefaults.agentSaved')}`;
|
|
869
|
+
agentStatusEl.classList.add('hint-ok');
|
|
870
|
+
const cached = cache.bots.find((bb) => bb.larkAppId === appId);
|
|
871
|
+
if (cached) {
|
|
872
|
+
cached.cliId = body.cliId;
|
|
873
|
+
cached.wrapperCli = body.wrapperCli ?? null;
|
|
874
|
+
cached.model = body.model ?? '';
|
|
875
|
+
cached.agentSelectionKey = body.selectionKey ?? agentCliSel.value;
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
else {
|
|
879
|
+
agentStatusEl.textContent = `✗ ${body.error ?? r.status}`;
|
|
880
|
+
agentStatusEl.classList.add('hint-warn-inline');
|
|
881
|
+
}
|
|
882
|
+
}
|
|
883
|
+
catch (e) {
|
|
884
|
+
agentStatusEl.textContent = `✗ ${e?.message ?? e}`;
|
|
885
|
+
agentStatusEl.classList.add('hint-warn-inline');
|
|
886
|
+
}
|
|
887
|
+
finally {
|
|
888
|
+
agentSaveBtn.disabled = false;
|
|
889
|
+
agentCliSel.disabled = false;
|
|
890
|
+
agentModelInput.disabled = false;
|
|
891
|
+
syncAgentModelField();
|
|
892
|
+
}
|
|
893
|
+
});
|
|
894
|
+
}
|
|
713
895
|
// 选「关闭」隐藏目录输入框;选其它则显示并聚焦(off 不需要目录)。
|
|
714
896
|
wdModeSel.addEventListener('change', () => {
|
|
715
897
|
const off = wdModeSel.value === 'off';
|
|
@@ -920,6 +1102,67 @@ export async function renderBotDefaultsPage(root) {
|
|
|
920
1102
|
putCardPref({ botToBotSameDir: crossBotCb.checked }, crossBotCb, crossBotStatusEl);
|
|
921
1103
|
});
|
|
922
1104
|
}
|
|
1105
|
+
// ── /summary 总结范围 ───────────────────────────────────────────────
|
|
1106
|
+
const summaryLimitInput = card.querySelector('input[data-input=summaryLimit]');
|
|
1107
|
+
const summarySinceInput = card.querySelector('input[data-input=summarySinceHours]');
|
|
1108
|
+
const summarySaveBtn = card.querySelector('button[data-action=save-summary-trigger]');
|
|
1109
|
+
const summaryStatusEl = card.querySelector('[data-summary-trigger-status]');
|
|
1110
|
+
function readNonNegativeInt(input, fallback) {
|
|
1111
|
+
const raw = input.value.trim();
|
|
1112
|
+
if (raw === '')
|
|
1113
|
+
return fallback;
|
|
1114
|
+
if (!/^(0|[1-9]\d*)$/.test(raw))
|
|
1115
|
+
return null;
|
|
1116
|
+
return Number(raw);
|
|
1117
|
+
}
|
|
1118
|
+
if (summaryLimitInput && summarySinceInput && summarySaveBtn) {
|
|
1119
|
+
summarySaveBtn.addEventListener('click', async () => {
|
|
1120
|
+
if (!summaryStatusEl)
|
|
1121
|
+
return;
|
|
1122
|
+
summaryStatusEl.textContent = '';
|
|
1123
|
+
summaryStatusEl.className = 'oncall-status';
|
|
1124
|
+
const limit = readNonNegativeInt(summaryLimitInput, 50);
|
|
1125
|
+
const sinceHours = readNonNegativeInt(summarySinceInput, 24);
|
|
1126
|
+
if (limit == null || sinceHours == null) {
|
|
1127
|
+
summaryStatusEl.textContent = `✗ ${t('botDefaults.summaryNumberInvalid')}`;
|
|
1128
|
+
summaryStatusEl.classList.add('hint-warn-inline');
|
|
1129
|
+
return;
|
|
1130
|
+
}
|
|
1131
|
+
summarySaveBtn.disabled = true;
|
|
1132
|
+
try {
|
|
1133
|
+
const r = await fetch(`/api/bots/${encodeURIComponent(appId)}/summary-range`, {
|
|
1134
|
+
method: 'PUT',
|
|
1135
|
+
headers: { 'content-type': 'application/json' },
|
|
1136
|
+
body: JSON.stringify({
|
|
1137
|
+
limit,
|
|
1138
|
+
sinceHours,
|
|
1139
|
+
}),
|
|
1140
|
+
});
|
|
1141
|
+
const body = await r.json().catch(() => ({}));
|
|
1142
|
+
if (r.ok && body.ok) {
|
|
1143
|
+
summaryStatusEl.textContent = `✓ ${t('botDefaults.cardPrefSaved')}`;
|
|
1144
|
+
summaryStatusEl.classList.add('hint-ok');
|
|
1145
|
+
const next = body.summaryRange ?? { limit, sinceHours };
|
|
1146
|
+
summaryLimitInput.value = String(Number.isInteger(next.limit) && next.limit >= 0 ? next.limit : limit);
|
|
1147
|
+
summarySinceInput.value = String(Number.isInteger(next.sinceHours) && next.sinceHours >= 0 ? next.sinceHours : sinceHours);
|
|
1148
|
+
const cached = cache.bots.find((bb) => bb.larkAppId === appId);
|
|
1149
|
+
if (cached)
|
|
1150
|
+
cached.summaryRange = next;
|
|
1151
|
+
}
|
|
1152
|
+
else {
|
|
1153
|
+
summaryStatusEl.textContent = `✗ ${body.error ?? r.status}`;
|
|
1154
|
+
summaryStatusEl.classList.add('hint-warn-inline');
|
|
1155
|
+
}
|
|
1156
|
+
}
|
|
1157
|
+
catch (e) {
|
|
1158
|
+
summaryStatusEl.textContent = `✗ ${e?.message ?? e}`;
|
|
1159
|
+
summaryStatusEl.classList.add('hint-warn-inline');
|
|
1160
|
+
}
|
|
1161
|
+
finally {
|
|
1162
|
+
summarySaveBtn.disabled = false;
|
|
1163
|
+
}
|
|
1164
|
+
});
|
|
1165
|
+
}
|
|
923
1166
|
// ── File sandbox toggle (auto-save on change) ─────────────────────────
|
|
924
1167
|
const sandboxCb = card.querySelector('input[data-action=toggle-sandbox]');
|
|
925
1168
|
const sandboxStatusEl = card.querySelector('[data-sandbox-status]');
|