botmux 2.71.4 → 2.72.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/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +8 -93
- package/dist/cli.js.map +1 -1
- package/dist/core/ask-api.d.ts +2 -20
- package/dist/core/ask-api.d.ts.map +1 -1
- package/dist/core/ask-api.js +2 -25
- package/dist/core/ask-api.js.map +1 -1
- package/dist/core/ask-args.d.ts +3 -3
- package/dist/core/ask-args.js +3 -3
- package/dist/core/ask-broker.d.ts +3 -1
- package/dist/core/ask-broker.d.ts.map +1 -1
- package/dist/core/ask-broker.js +20 -5
- package/dist/core/ask-broker.js.map +1 -1
- package/dist/core/ask-types.d.ts +3 -8
- package/dist/core/ask-types.d.ts.map +1 -1
- package/dist/core/ask-types.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +134 -2
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/dashboard-rows.d.ts +4 -0
- package/dist/core/dashboard-rows.d.ts.map +1 -1
- package/dist/core/dashboard-rows.js +4 -0
- package/dist/core/dashboard-rows.js.map +1 -1
- package/dist/core/session-board.d.ts +9 -0
- package/dist/core/session-board.d.ts.map +1 -0
- package/dist/core/session-board.js +24 -0
- package/dist/core/session-board.js.map +1 -0
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +14 -35
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/federated-group-core.d.ts.map +1 -1
- package/dist/dashboard/federated-group-core.js +5 -0
- package/dist/dashboard/federated-group-core.js.map +1 -1
- package/dist/dashboard/federation-api.d.ts.map +1 -1
- package/dist/dashboard/federation-api.js +70 -1
- package/dist/dashboard/federation-api.js.map +1 -1
- package/dist/dashboard/federation-spoke-api.d.ts +16 -2
- package/dist/dashboard/federation-spoke-api.d.ts.map +1 -1
- package/dist/dashboard/federation-spoke-api.js +96 -3
- package/dist/dashboard/federation-spoke-api.js.map +1 -1
- package/dist/dashboard/web/app.d.ts.map +1 -1
- package/dist/dashboard/web/app.js +52 -0
- package/dist/dashboard/web/app.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +64 -0
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/kanban-model.d.ts +19 -0
- package/dist/dashboard/web/kanban-model.d.ts.map +1 -0
- package/dist/dashboard/web/kanban-model.js +40 -0
- package/dist/dashboard/web/kanban-model.js.map +1 -0
- package/dist/dashboard/web/preferences.d.ts +12 -1
- package/dist/dashboard/web/preferences.d.ts.map +1 -1
- package/dist/dashboard/web/preferences.js +32 -1
- package/dist/dashboard/web/preferences.js.map +1 -1
- package/dist/dashboard/web/sessions.d.ts.map +1 -1
- package/dist/dashboard/web/sessions.js +1059 -10
- package/dist/dashboard/web/sessions.js.map +1 -1
- package/dist/dashboard-web/app.js +519 -433
- package/dist/dashboard-web/index.html +3 -0
- package/dist/dashboard-web/style.css +692 -1
- package/dist/dashboard.js +72 -3
- 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/ask-card.js +4 -7
- package/dist/im/lark/ask-card.js.map +1 -1
- package/dist/im/lark/client.d.ts +8 -0
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +32 -0
- package/dist/im/lark/client.js.map +1 -1
- package/dist/services/team-board-store.d.ts +33 -0
- package/dist/services/team-board-store.d.ts.map +1 -0
- package/dist/services/team-board-store.js +88 -0
- package/dist/services/team-board-store.js.map +1 -0
- package/dist/services/team-groups-store.d.ts +8 -0
- package/dist/services/team-groups-store.d.ts.map +1 -0
- package/dist/services/team-groups-store.js +31 -0
- package/dist/services/team-groups-store.js.map +1 -0
- package/dist/setup/bot-config-editor.d.ts +3 -2
- package/dist/setup/bot-config-editor.d.ts.map +1 -1
- package/dist/setup/bot-config-editor.js +1 -2
- package/dist/setup/bot-config-editor.js.map +1 -1
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/core/ask-api.d.ts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Pure helpers for the daemon's `POST /api/asks` IPC route.
|
|
3
3
|
*
|
|
4
|
-
* Kept separate from daemon.ts so the body-validator
|
|
5
|
-
*
|
|
6
|
-
* registering bots, or mounting a full session map.
|
|
4
|
+
* Kept separate from daemon.ts so the body-validator is unit-testable without
|
|
5
|
+
* spinning up an HTTP server, registering bots, or mounting a full session map.
|
|
7
6
|
*/
|
|
8
7
|
import type { AskQuestion } from './ask-types.js';
|
|
9
8
|
export interface AskApiBody {
|
|
@@ -15,8 +14,6 @@ export interface AskApiBody {
|
|
|
15
14
|
questions: AskQuestion[];
|
|
16
15
|
/** Already in milliseconds. CLI side converts from `--timeout` seconds. */
|
|
17
16
|
timeoutMs: number;
|
|
18
|
-
/** Empty array → use the §6 fallback chain. */
|
|
19
|
-
approvers: string[];
|
|
20
17
|
}
|
|
21
18
|
export type AskApiBodyError = 'bad_body' | 'bad_sessionId' | 'bad_chatId' | 'bad_larkAppId' | 'bad_rootMessageId' | 'bad_prompt' | 'bad_timeoutMs' | 'bad_options' | 'bad_option_shape' | 'bad_option_key' | 'bad_option_label' | 'duplicate_option_key' | 'bad_questions' | 'bad_question_shape' | 'bad_multiSelect';
|
|
22
19
|
/** Validate the request body. Returns either the parsed body or an error code
|
|
@@ -29,19 +26,4 @@ export type AskApiBodyError = 'bad_body' | 'bad_sessionId' | 'bad_chatId' | 'bad
|
|
|
29
26
|
export declare function parseAskBody(raw: unknown): AskApiBody | {
|
|
30
27
|
error: AskApiBodyError;
|
|
31
28
|
};
|
|
32
|
-
/** Resolve the approver allowlist per §6 fallback chain:
|
|
33
|
-
* 1. explicit `--approver` list from CLI args (non-empty wins outright)
|
|
34
|
-
* 2. session.ownerOpenId ∩ bot.allowedUsers (single-owner topic chats)
|
|
35
|
-
* 3. bot.allowedUsers (shared chats / no owner / owner not in allow)
|
|
36
|
-
*
|
|
37
|
-
* Pure function: caller injects the lookups. The daemon wires
|
|
38
|
-
* `getBotAllowedUsers = (id) => getBot(id).resolvedAllowedUsers` and
|
|
39
|
-
* `getSessionOwner` = scan over activeSessions; tests pass stub funcs. */
|
|
40
|
-
export declare function resolveAskApprovers(args: {
|
|
41
|
-
larkAppId: string;
|
|
42
|
-
sessionId: string;
|
|
43
|
-
explicit: ReadonlyArray<string>;
|
|
44
|
-
getBotAllowedUsers: (larkAppId: string) => ReadonlyArray<string>;
|
|
45
|
-
getSessionOwner: (sessionId: string) => string | undefined;
|
|
46
|
-
}): Set<string>;
|
|
47
29
|
//# sourceMappingURL=ask-api.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask-api.d.ts","sourceRoot":"","sources":["../../src/core/ask-api.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ask-api.d.ts","sourceRoot":"","sources":["../../src/core/ask-api.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAa,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7D,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,yCAAyC;IACzC,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,2EAA2E;IAC3E,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,eAAe,GACvB,UAAU,GACV,eAAe,GACf,YAAY,GACZ,eAAe,GACf,mBAAmB,GACnB,YAAY,GACZ,eAAe,GACf,aAAa,GACb,kBAAkB,GAClB,gBAAgB,GAChB,kBAAkB,GAClB,sBAAsB,GACtB,eAAe,GACf,oBAAoB,GACpB,iBAAiB,CAAC;AAkCtB;;;;;;gCAMgC;AAChC,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,GAAG;IAAE,KAAK,EAAE,eAAe,CAAA;CAAE,CAuDlF"}
|
package/dist/core/ask-api.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Pure helpers for the daemon's `POST /api/asks` IPC route.
|
|
3
3
|
*
|
|
4
|
-
* Kept separate from daemon.ts so the body-validator
|
|
5
|
-
*
|
|
6
|
-
* registering bots, or mounting a full session map.
|
|
4
|
+
* Kept separate from daemon.ts so the body-validator is unit-testable without
|
|
5
|
+
* spinning up an HTTP server, registering bots, or mounting a full session map.
|
|
7
6
|
*/
|
|
8
7
|
/** 校验单个 option 对象,返回解析后的 AskOption 或错误码。 */
|
|
9
8
|
function parseOption(o) {
|
|
@@ -69,9 +68,6 @@ export function parseAskBody(raw) {
|
|
|
69
68
|
r.timeoutMs < 1000) {
|
|
70
69
|
return { error: 'bad_timeoutMs' };
|
|
71
70
|
}
|
|
72
|
-
const approvers = Array.isArray(r.approvers)
|
|
73
|
-
? r.approvers.filter((s) => typeof s === 'string' && s.trim().length > 0)
|
|
74
|
-
: [];
|
|
75
71
|
let questions;
|
|
76
72
|
if (Array.isArray(r.questions)) {
|
|
77
73
|
// 新格式:questions[] 多问多选
|
|
@@ -115,25 +111,6 @@ export function parseAskBody(raw) {
|
|
|
115
111
|
rootMessageId: r.rootMessageId,
|
|
116
112
|
questions,
|
|
117
113
|
timeoutMs: r.timeoutMs,
|
|
118
|
-
approvers,
|
|
119
114
|
};
|
|
120
115
|
}
|
|
121
|
-
/** Resolve the approver allowlist per §6 fallback chain:
|
|
122
|
-
* 1. explicit `--approver` list from CLI args (non-empty wins outright)
|
|
123
|
-
* 2. session.ownerOpenId ∩ bot.allowedUsers (single-owner topic chats)
|
|
124
|
-
* 3. bot.allowedUsers (shared chats / no owner / owner not in allow)
|
|
125
|
-
*
|
|
126
|
-
* Pure function: caller injects the lookups. The daemon wires
|
|
127
|
-
* `getBotAllowedUsers = (id) => getBot(id).resolvedAllowedUsers` and
|
|
128
|
-
* `getSessionOwner` = scan over activeSessions; tests pass stub funcs. */
|
|
129
|
-
export function resolveAskApprovers(args) {
|
|
130
|
-
const explicit = args.explicit.filter((s) => s.trim().length > 0);
|
|
131
|
-
if (explicit.length > 0)
|
|
132
|
-
return new Set(explicit);
|
|
133
|
-
const allow = args.getBotAllowedUsers(args.larkAppId);
|
|
134
|
-
const owner = args.getSessionOwner(args.sessionId);
|
|
135
|
-
if (owner && allow.includes(owner))
|
|
136
|
-
return new Set([owner]);
|
|
137
|
-
return new Set(allow);
|
|
138
|
-
}
|
|
139
116
|
//# sourceMappingURL=ask-api.js.map
|
package/dist/core/ask-api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask-api.js","sourceRoot":"","sources":["../../src/core/ask-api.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ask-api.js","sourceRoot":"","sources":["../../src/core/ask-api.ts"],"names":[],"mappings":"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"}
|
package/dist/core/ask-args.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Pure helpers for `botmux ask` argument parsing.
|
|
3
3
|
*
|
|
4
|
-
* Kept in its own file (no I/O, no env reads) so the CSV / timeout
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Kept in its own file (no I/O, no env reads) so the CSV / timeout parsing can
|
|
5
|
+
* be unit-tested without spinning up a daemon. The actual CLI dispatch
|
|
6
|
+
* (`cmdAsk`) lives in cli.ts and calls these helpers.
|
|
7
7
|
*/
|
|
8
8
|
import type { AskOption } from './ask-types.js';
|
|
9
9
|
export declare class AskArgsError extends Error {
|
package/dist/core/ask-args.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Pure helpers for `botmux ask` argument parsing.
|
|
3
3
|
*
|
|
4
|
-
* Kept in its own file (no I/O, no env reads) so the CSV / timeout
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Kept in its own file (no I/O, no env reads) so the CSV / timeout parsing can
|
|
5
|
+
* be unit-tested without spinning up a daemon. The actual CLI dispatch
|
|
6
|
+
* (`cmdAsk`) lives in cli.ts and calls these helpers.
|
|
7
7
|
*/
|
|
8
8
|
export class AskArgsError extends Error {
|
|
9
9
|
code;
|
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
* §3 / §6 / §7 / §8 of /tmp/botmux-ask.md.
|
|
9
9
|
*/
|
|
10
10
|
import type { AskCardDispatcher, AskClickOutcome, AskResult, CreateAskInput, PendingAsk } from './ask-types.js';
|
|
11
|
+
/** Wire the canTalk predicate. Called once during daemon bootstrap. */
|
|
12
|
+
export declare function setCanTalkChecker(fn: (larkAppId: string, chatId: string, openId: string) => boolean): void;
|
|
11
13
|
/** Wire the IM-side dispatcher. Called once during daemon bootstrap from
|
|
12
14
|
* daemon.ts after im/lark/ask-card.ts is constructed. */
|
|
13
15
|
export declare function setCardDispatcher(d: AskCardDispatcher): void;
|
|
@@ -62,7 +64,7 @@ export declare function submitAsk(args: {
|
|
|
62
64
|
/**
|
|
63
65
|
* 提交一段自定义回复(用户在话题里直接打字作答,替代点按钮)并 settle。
|
|
64
66
|
*
|
|
65
|
-
* 校验:askId 存在 / 未 settle / `by`
|
|
67
|
+
* 校验:askId 存在 / 未 settle / `by` 可 canTalk / text trim 后非空。
|
|
66
68
|
* settle 为 `kind:'answered'`,各问 `answers` 为空数组、`comment` 携带 trim 后原文
|
|
67
69
|
* (替代语义:没有任何选项被选中,CLI 侧 formatAnswer 用 comment 回落作答)。
|
|
68
70
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask-broker.d.ts","sourceRoot":"","sources":["../../src/core/ask-broker.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,SAAS,EACT,cAAc,EACd,UAAU,EACX,MAAM,gBAAgB,CAAC;AAwBxB;0DAC0D;AAC1D,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAE5D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"ask-broker.d.ts","sourceRoot":"","sources":["../../src/core/ask-broker.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,SAAS,EACT,cAAc,EACd,UAAU,EACX,MAAM,gBAAgB,CAAC;AAwBxB,uEAAuE;AACvE,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,GACjE,IAAI,CAEN;AAeD;0DAC0D;AAC1D,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAE5D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CAkErE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;CACZ,GAAG,eAAe,CA4BlB;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,CAAC,EAAE,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;CACnD,GAAG,eAAe,CA2ClB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,eAAe,CAiBlB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,UAAU,GAAG,SAAS,CAUzB;AAED;;;;;;;;;uCASuC;AACvC,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;CACZ,GAAG,eAAe,CAOlB;AAED;;;uEAGuE;AACvE,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAkBpD;AA8DD;kFACkF;AAClF,wBAAgB,aAAa,IAAI,MAAM,CAItC;AAED;oEACoE;AACpE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAGpE;AAED;qCACqC;AACrC,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAEjE;AAED;cACc;AACd,wBAAgB,UAAU,IAAI,MAAM,EAAE,CAErC;AAED;6EAC6E;AAC7E,wBAAgB,aAAa,IAAI,IAAI,CAKpC"}
|
package/dist/core/ask-broker.js
CHANGED
|
@@ -11,6 +11,21 @@ import { randomUUID } from 'node:crypto';
|
|
|
11
11
|
import { logger } from '../utils/logger.js';
|
|
12
12
|
const pending = new Map();
|
|
13
13
|
let dispatcher = null;
|
|
14
|
+
/** IM-side canTalk predicate, wired by the daemon at bootstrap. Lets the broker
|
|
15
|
+
* honour the bot's canTalk gate without importing Lark types: whoever may
|
|
16
|
+
* address the bot in this chat may answer its `botmux ask`. Returns false until
|
|
17
|
+
* wired, so an unwired broker authorizes no one (daemon always wires it). */
|
|
18
|
+
let canTalkChecker = null;
|
|
19
|
+
/** Wire the canTalk predicate. Called once during daemon bootstrap. */
|
|
20
|
+
export function setCanTalkChecker(fn) {
|
|
21
|
+
canTalkChecker = fn;
|
|
22
|
+
}
|
|
23
|
+
/** A click is authorized iff the clicker may `canTalk` to the bot in this chat.
|
|
24
|
+
* `botmux ask` is a talk-level interaction (answering the agent's question),
|
|
25
|
+
* so it follows the canTalk gate — not the stricter canOperate / allowedUsers. */
|
|
26
|
+
function isAuthorizedToAnswer(ask, by) {
|
|
27
|
+
return canTalkChecker?.(ask.larkAppId, ask.chatId, by) ?? false;
|
|
28
|
+
}
|
|
14
29
|
/** Window during which a settled ask is still queryable so race-losers get a
|
|
15
30
|
* precise `already_settled` outcome (and the card click handler can show
|
|
16
31
|
* "已被 X 答了" instead of a generic "已失效"). After this window expires,
|
|
@@ -67,7 +82,6 @@ export function registerAsk(input) {
|
|
|
67
82
|
chatId: input.chatId,
|
|
68
83
|
rootMessageId: input.rootMessageId,
|
|
69
84
|
sessionId: input.sessionId,
|
|
70
|
-
approvers: input.approvers,
|
|
71
85
|
questions: input.questions,
|
|
72
86
|
createdAt,
|
|
73
87
|
deadlineAt,
|
|
@@ -119,7 +133,7 @@ export function toggleAsk(args) {
|
|
|
119
133
|
return 'stale';
|
|
120
134
|
if (ask.settled)
|
|
121
135
|
return 'already_settled';
|
|
122
|
-
if (!ask
|
|
136
|
+
if (!isAuthorizedToAnswer(ask, args.by))
|
|
123
137
|
return 'unauthorized';
|
|
124
138
|
const question = ask.questions[args.questionIndex];
|
|
125
139
|
if (!question)
|
|
@@ -161,7 +175,7 @@ export function submitAsk(args) {
|
|
|
161
175
|
return 'stale';
|
|
162
176
|
if (ask.settled)
|
|
163
177
|
return 'already_settled';
|
|
164
|
-
if (!ask
|
|
178
|
+
if (!isAuthorizedToAnswer(ask, args.by))
|
|
165
179
|
return 'unauthorized';
|
|
166
180
|
// 构建最终答案数组(按问题顺序)
|
|
167
181
|
let answers;
|
|
@@ -204,7 +218,7 @@ export function submitAsk(args) {
|
|
|
204
218
|
/**
|
|
205
219
|
* 提交一段自定义回复(用户在话题里直接打字作答,替代点按钮)并 settle。
|
|
206
220
|
*
|
|
207
|
-
* 校验:askId 存在 / 未 settle / `by`
|
|
221
|
+
* 校验:askId 存在 / 未 settle / `by` 可 canTalk / text trim 后非空。
|
|
208
222
|
* settle 为 `kind:'answered'`,各问 `answers` 为空数组、`comment` 携带 trim 后原文
|
|
209
223
|
* (替代语义:没有任何选项被选中,CLI 侧 formatAnswer 用 comment 回落作答)。
|
|
210
224
|
*
|
|
@@ -220,7 +234,7 @@ export function submitCustomReply(args) {
|
|
|
220
234
|
return 'stale';
|
|
221
235
|
if (ask.settled)
|
|
222
236
|
return 'already_settled';
|
|
223
|
-
if (!ask
|
|
237
|
+
if (!isAuthorizedToAnswer(ask, args.by))
|
|
224
238
|
return 'unauthorized';
|
|
225
239
|
const text = args.text.trim();
|
|
226
240
|
if (!text)
|
|
@@ -383,5 +397,6 @@ export function _resetForTest() {
|
|
|
383
397
|
clearTimeout(ask.timeoutHandle);
|
|
384
398
|
pending.clear();
|
|
385
399
|
dispatcher = null;
|
|
400
|
+
canTalkChecker = null;
|
|
386
401
|
}
|
|
387
402
|
//# sourceMappingURL=ask-broker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask-broker.js","sourceRoot":"","sources":["../../src/core/ask-broker.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAsB5C,MAAM,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAC;AACnD,IAAI,UAAU,GAA6B,IAAI,CAAC;AAEhD;;;iEAGiE;AACjE,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAEpC;0DAC0D;AAC1D,MAAM,UAAU,iBAAiB,CAAC,CAAoB;IACpD,UAAU,GAAG,CAAC,CAAC;AACjB,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,WAAW,CAAC,KAAqB;IAC/C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAG,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;IAE/C,OAAO,IAAI,OAAO,CAAY,CAAC,OAAO,EAAE,EAAE;QACxC,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;YACpC,MAAM,CAAC,KAAK,EAAE;gBACZ,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE,IAAI;gBACd,EAAE,EAAE,IAAI;gBACR,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;QACL,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QACpB,kEAAkE;QAClE,aAAa,CAAC,KAAK,EAAE,EAAE,CAAC;QAExB,iBAAiB;QACjB,MAAM,UAAU,GAAG,IAAI,GAAG,EAAuB,CAAC;QAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChD,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,EAAU,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,GAAG,GAAoB;YAC3B,KAAK;YACL,KAAK;YACL,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,SAAS
|
|
1
|
+
{"version":3,"file":"ask-broker.js","sourceRoot":"","sources":["../../src/core/ask-broker.ts"],"names":[],"mappings":"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"}
|
package/dist/core/ask-types.d.ts
CHANGED
|
@@ -74,8 +74,8 @@ export interface AskJsonOutput {
|
|
|
74
74
|
timedOut: boolean;
|
|
75
75
|
}
|
|
76
76
|
/** Input accepted by broker.registerAsk. Caller (CLI subcommand → daemon IPC
|
|
77
|
-
* handler) is responsible for env validation
|
|
78
|
-
* the
|
|
77
|
+
* handler) is responsible for env validation and parameter parsing. Click
|
|
78
|
+
* authorization is the bot's canTalk gate, injected via `setCanTalkChecker`.
|
|
79
79
|
*
|
|
80
80
|
* v0.1.8 变更:`options`/`prompt` 字段替换为 `questions: ReadonlyArray<AskQuestion>`。 */
|
|
81
81
|
export interface CreateAskInput {
|
|
@@ -85,10 +85,6 @@ export interface CreateAskInput {
|
|
|
85
85
|
rootMessageId: string | null;
|
|
86
86
|
/** Session that issued the ask — used for audit + future replay scoping. */
|
|
87
87
|
sessionId: string;
|
|
88
|
-
/** Pre-resolved open_id allowlist. Empty set means no one can answer; the
|
|
89
|
-
* caller (not the broker) must enforce the §6 approver fallback chain so the
|
|
90
|
-
* broker stays IM-agnostic. */
|
|
91
|
-
approvers: ReadonlySet<string>;
|
|
92
88
|
/** 问题列表,调用方保证每问 `options.length ≥ 2` 且 key 唯一。 */
|
|
93
89
|
questions: ReadonlyArray<AskQuestion>;
|
|
94
90
|
/** Absolute deadline; computed by caller from `--timeout`. Broker won't
|
|
@@ -109,7 +105,6 @@ export interface PendingAsk {
|
|
|
109
105
|
chatId: string;
|
|
110
106
|
rootMessageId: string | null;
|
|
111
107
|
sessionId: string;
|
|
112
|
-
approvers: ReadonlySet<string>;
|
|
113
108
|
/** 问题列表,替代旧的 `options` + `prompt`。 */
|
|
114
109
|
questions: ReadonlyArray<AskQuestion>;
|
|
115
110
|
/** 当前已勾选答案快照。仅 daemon/card 内部使用;CLI IPC 边界不暴露。 */
|
|
@@ -127,7 +122,7 @@ export interface PendingAsk {
|
|
|
127
122
|
export type AskClickOutcome =
|
|
128
123
|
/** First valid click — caller's Promise resolves with `kind:'answered'`. */
|
|
129
124
|
'accepted'
|
|
130
|
-
/** Clicker'
|
|
125
|
+
/** Clicker can't canTalk to the bot in this chat — caller shows "你没有权限". */
|
|
131
126
|
| 'unauthorized'
|
|
132
127
|
/** No such askId, nonce mismatch, or unknown option — caller shows
|
|
133
128
|
* "此 ask 已失效(daemon 重启)". Covers the §8 stale-card case. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask-types.d.ts","sourceRoot":"","sources":["../../src/core/ask-types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;oCAGoC;AACpC,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;kDAEkD;AAClD,MAAM,WAAW,WAAW;IAC1B,oBAAoB;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IAClC,kDAAkD;IAClD,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;;;;oDAWoD;AACpD,MAAM,MAAM,SAAS,GACjB;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,4CAA4C;IAC5C,OAAO,EAAE,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9C,EAAE,EAAE,MAAM,CAAC;IACX,yCAAyC;IACzC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,KAAK,CAAC;CACjB,GACD;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,IAAI,CAAC;IACf,EAAE,EAAE,IAAI,CAAC;IACT,OAAO,EAAE,IAAI,CAAC;IACd,QAAQ,EAAE,IAAI,CAAC;CAChB,GACD;IACE,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,IAAI,CAAC;IACf,EAAE,EAAE,IAAI,CAAC;IACT,OAAO,EAAE,IAAI,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC;CACjB,CAAC;AAEN;;;;gDAIgD;AAChD,MAAM,WAAW,aAAa;IAC5B,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,6CAA6C;IAC7C,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC;IAC3B,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,qCAAqC;IACrC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;kFAIkF;AAClF,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,4EAA4E;IAC5E,SAAS,EAAE,MAAM,CAAC;IAClB
|
|
1
|
+
{"version":3,"file":"ask-types.d.ts","sourceRoot":"","sources":["../../src/core/ask-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask-types.js","sourceRoot":"","sources":["../../src/core/ask-types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"ask-types.js","sourceRoot":"","sources":["../../src/core/ask-types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA0IH;8CAC8C;AAC9C,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClE,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-ipc-server.d.ts","sourceRoot":"","sources":["../../src/core/dashboard-ipc-server.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,eAAe,EAAE,KAAK,cAAc,EAAe,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"dashboard-ipc-server.d.ts","sourceRoot":"","sources":["../../src/core/dashboard-ipc-server.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,eAAe,EAAE,KAAK,cAAc,EAAe,MAAM,WAAW,CAAC;AAyCjG,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAM/E,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,CAE3F;AACD,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EAIpB,KAAK,UAAU,EAChB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,KAAK,EAAiB,cAAc,EAAW,MAAM,aAAa,CAAC;AAE1E,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,MAAM,MAAM,OAAO,GAAG,CACpB,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAC3B,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAW1B,0FAA0F;AAC1F,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAM7E;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAGhF;AAED,wBAAsB,YAAY,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC,CAKhF;AAiBD,sEAAsE;AACtE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAgC;AAyB7F,YAAY,EAAE,UAAU,EAAE,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,CAAC;AAMtD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAA0B;AAKxE,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAA0B;AAsbxE,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,cAAc,EAAE,MAAM,CAAC;CACxB;AA2gBD,wBAAgB,cAAc,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAiC7F"}
|
|
@@ -14,6 +14,8 @@ import * as oncallStore from '../services/oncall-store.js';
|
|
|
14
14
|
import * as brandStore from '../services/brand-store.js';
|
|
15
15
|
import * as sandboxStore from '../services/sandbox-store.js';
|
|
16
16
|
import * as cardPrefsStore from '../services/card-prefs-store.js';
|
|
17
|
+
import * as observedBotsStore from '../services/observed-bots-store.js';
|
|
18
|
+
import { getDeploymentIdentity } from '../services/deployment-identity.js';
|
|
17
19
|
import * as grantPrefsStore from '../services/grant-prefs-store.js';
|
|
18
20
|
import { findConfigField, applyConfigField } from '../services/bot-config-store.js';
|
|
19
21
|
import { config } from '../config.js';
|
|
@@ -27,7 +29,8 @@ import * as chatFirstSeenStore from '../services/chat-first-seen-store.js';
|
|
|
27
29
|
import * as scheduler from './scheduler.js';
|
|
28
30
|
import { listActiveSessions, findActiveBySessionId, closeSession, getActiveSessionsRegistry, transferSession, deliverWriteLinkCardToOwners } from './worker-pool.js';
|
|
29
31
|
import { listOnlineDaemons } from '../utils/daemon-discovery.js';
|
|
30
|
-
import { getChatMode, replyMessage, sendMessage, resolveUnionIdFromOpenId } from '../im/lark/client.js';
|
|
32
|
+
import { getChatMode, replyMessage, sendMessage, resolveUnionIdFromOpenId, listThreadMessages, listChatMessages, getUserProfile } from '../im/lark/client.js';
|
|
33
|
+
import { parseApiMessage, cardContentHasUpgradeFallback, resolveMergedCardContent } from '../im/lark/message-parser.js';
|
|
31
34
|
import { resumeSession } from './session-manager.js';
|
|
32
35
|
import { getCliDisplayName } from '../im/lark/card-builder.js';
|
|
33
36
|
import { locateLimiter } from './dashboard-locate.js';
|
|
@@ -46,6 +49,7 @@ export function setWorkflowRunner(fn) {
|
|
|
46
49
|
}
|
|
47
50
|
import { composeRowFromActive, composeRowFromClosed, feishuChatLink, setBotName as setRowsBotName, getBotName, } from './dashboard-rows.js';
|
|
48
51
|
import { getBotBrand, getBot } from '../bot-registry.js';
|
|
52
|
+
import { normalizeKanbanColumn, normalizeKanbanPosition, normalizeSessionTitle } from './session-board.js';
|
|
49
53
|
const routes = [];
|
|
50
54
|
/** Register a handler. Path supports `:name` segments captured into the params object. */
|
|
51
55
|
export function ipcRoute(method, path, handler) {
|
|
@@ -138,6 +142,129 @@ ipcRoute('POST', '/api/sessions/:sessionId/close', async (_req, res, params) =>
|
|
|
138
142
|
const r = await closeSession(params.sessionId);
|
|
139
143
|
jsonRes(res, 200, r);
|
|
140
144
|
});
|
|
145
|
+
/** 解析 session(活跃优先,已关闭兜底)。活跃会话取 ds.session —— registry 与
|
|
146
|
+
* store 持有同一对象,改字段后 updateSession 即落盘。 */
|
|
147
|
+
function findSessionRecord(sessionId) {
|
|
148
|
+
return findActiveBySessionId(sessionId)?.session ?? sessionStore.getSession(sessionId);
|
|
149
|
+
}
|
|
150
|
+
// 看板放置:dashboard 看板视图拖拽卡片后持久化列 + 列内排序位置。
|
|
151
|
+
// 改完广播 session.update,所有打开的 dashboard 实时同步。
|
|
152
|
+
ipcRoute('POST', '/api/sessions/:sessionId/board', async (req, res, params) => {
|
|
153
|
+
let body;
|
|
154
|
+
try {
|
|
155
|
+
body = await readJsonBody(req);
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return jsonRes(res, 400, { ok: false, error: 'bad_json' });
|
|
159
|
+
}
|
|
160
|
+
const column = normalizeKanbanColumn(body.column);
|
|
161
|
+
const position = normalizeKanbanPosition(body.position);
|
|
162
|
+
if (!column && position === null)
|
|
163
|
+
return jsonRes(res, 400, { ok: false, error: 'bad_request' });
|
|
164
|
+
const session = findSessionRecord(params.sessionId);
|
|
165
|
+
if (!session)
|
|
166
|
+
return jsonRes(res, 404, { ok: false, error: 'session_not_found' });
|
|
167
|
+
if (column)
|
|
168
|
+
session.kanbanColumn = column;
|
|
169
|
+
if (position !== null)
|
|
170
|
+
session.kanbanPosition = position;
|
|
171
|
+
sessionStore.updateSession(session);
|
|
172
|
+
dashboardEventBus.publish({
|
|
173
|
+
type: 'session.update',
|
|
174
|
+
body: {
|
|
175
|
+
sessionId: params.sessionId,
|
|
176
|
+
patch: { kanbanColumn: session.kanbanColumn, kanbanPosition: session.kanbanPosition },
|
|
177
|
+
},
|
|
178
|
+
});
|
|
179
|
+
jsonRes(res, 200, { ok: true });
|
|
180
|
+
});
|
|
181
|
+
// 会话历史:实时拉取该会话所在话题/群的飞书消息(与 botmux history 同链路,
|
|
182
|
+
// 消息体不落盘),给 dashboard 的会话历史弹窗。复杂卡片的「请升级」兜底文本
|
|
183
|
+
// 用 message.get 的完整表示补齐;merge_forward 保持占位符(原型不展开)。
|
|
184
|
+
ipcRoute('GET', '/api/sessions/:sessionId/history', async (req, res, params) => {
|
|
185
|
+
const session = findSessionRecord(params.sessionId);
|
|
186
|
+
if (!session)
|
|
187
|
+
return jsonRes(res, 404, { ok: false, error: 'session_not_found' });
|
|
188
|
+
const appId = session.larkAppId || cachedLarkAppId;
|
|
189
|
+
if (!appId)
|
|
190
|
+
return jsonRes(res, 422, { ok: false, error: 'no_lark_app' });
|
|
191
|
+
const url = new URL(req.url ?? '/', 'http://localhost');
|
|
192
|
+
const limit = Math.min(Math.max(parseInt(url.searchParams.get('limit') ?? '80', 10) || 80, 1), 200);
|
|
193
|
+
try {
|
|
194
|
+
const raw = session.scope === 'chat'
|
|
195
|
+
? await listChatMessages(appId, session.chatId, limit)
|
|
196
|
+
: await listThreadMessages(appId, session.chatId, session.rootMessageId, limit);
|
|
197
|
+
const messages = await Promise.all(raw.map(async (m) => {
|
|
198
|
+
const parsed = parseApiMessage(m);
|
|
199
|
+
if (parsed.msgType === 'interactive' && cardContentHasUpgradeFallback(parsed.content)) {
|
|
200
|
+
const merged = await resolveMergedCardContent(appId, parsed.messageId).catch(() => null);
|
|
201
|
+
if (merged)
|
|
202
|
+
parsed.content = merged.text;
|
|
203
|
+
}
|
|
204
|
+
return {
|
|
205
|
+
messageId: parsed.messageId,
|
|
206
|
+
senderId: parsed.senderId,
|
|
207
|
+
senderType: parsed.senderType,
|
|
208
|
+
msgType: parsed.msgType,
|
|
209
|
+
content: parsed.content,
|
|
210
|
+
// Lark create_time 是毫秒 epoch 字符串——规范成数字,前端 new Date 直接用
|
|
211
|
+
createTime: Number(parsed.createTime) || undefined,
|
|
212
|
+
};
|
|
213
|
+
}));
|
|
214
|
+
// 真人发送者补名字+头像(contact API,带缓存;不在可见范围的回退占位)
|
|
215
|
+
const senders = new Map();
|
|
216
|
+
await Promise.all([...new Set(messages.filter(m => m.senderType === 'user' && m.senderId).map(m => m.senderId))]
|
|
217
|
+
.map(async (id) => { senders.set(id, await getUserProfile(appId, id)); }));
|
|
218
|
+
jsonRes(res, 200, {
|
|
219
|
+
ok: true,
|
|
220
|
+
scope: session.scope ?? 'thread',
|
|
221
|
+
ownerOpenId: session.ownerOpenId,
|
|
222
|
+
messages: messages.map(m => {
|
|
223
|
+
const p = m.senderType === 'user' ? senders.get(m.senderId) : null;
|
|
224
|
+
return p ? { ...m, senderName: p.name, senderAvatar: p.avatarUrl } : m;
|
|
225
|
+
}),
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
catch (err) {
|
|
229
|
+
jsonRes(res, 502, { ok: false, error: String(err?.message ?? err) });
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
// 部署 owner 的资料(名字 + 头像)——dashboard 左上角和历史弹窗展示「我」。
|
|
233
|
+
// owner 身份来自 deployment identity(ownerUnionId),头像经 contact API 查询
|
|
234
|
+
// (带缓存);未绑定 owner 或查不到时回退名字/null。
|
|
235
|
+
ipcRoute('GET', '/api/owner-profile', async (_req, res) => {
|
|
236
|
+
if (!cachedLarkAppId)
|
|
237
|
+
return jsonRes(res, 503, { ok: false, error: 'larkAppId_not_set' });
|
|
238
|
+
const me = getDeploymentIdentity(config.session.dataDir);
|
|
239
|
+
if (!me.ownerUnionId)
|
|
240
|
+
return jsonRes(res, 200, { ok: false, error: 'owner_unbound', name: me.ownerName ?? null });
|
|
241
|
+
const p = await getUserProfile(cachedLarkAppId, me.ownerUnionId, 'union_id');
|
|
242
|
+
jsonRes(res, 200, { ok: true, name: p?.name ?? me.ownerName ?? null, avatarUrl: p?.avatarUrl ?? null });
|
|
243
|
+
});
|
|
244
|
+
// 会话重命名:dashboard 看板卡片就地编辑标题。title 只是展示元数据(飞书话题
|
|
245
|
+
// 标题不受影响),但全视图(看板/状态板/表格/抽屉)读同一字段,改一处全变。
|
|
246
|
+
ipcRoute('POST', '/api/sessions/:sessionId/rename', async (req, res, params) => {
|
|
247
|
+
let body;
|
|
248
|
+
try {
|
|
249
|
+
body = await readJsonBody(req);
|
|
250
|
+
}
|
|
251
|
+
catch {
|
|
252
|
+
return jsonRes(res, 400, { ok: false, error: 'bad_json' });
|
|
253
|
+
}
|
|
254
|
+
const title = normalizeSessionTitle(body.title);
|
|
255
|
+
if (!title)
|
|
256
|
+
return jsonRes(res, 400, { ok: false, error: 'bad_title' });
|
|
257
|
+
const session = findSessionRecord(params.sessionId);
|
|
258
|
+
if (!session)
|
|
259
|
+
return jsonRes(res, 404, { ok: false, error: 'session_not_found' });
|
|
260
|
+
session.title = title;
|
|
261
|
+
sessionStore.updateSession(session);
|
|
262
|
+
dashboardEventBus.publish({
|
|
263
|
+
type: 'session.update',
|
|
264
|
+
body: { sessionId: params.sessionId, patch: { title } },
|
|
265
|
+
});
|
|
266
|
+
jsonRes(res, 200, { ok: true, title });
|
|
267
|
+
});
|
|
141
268
|
/**
|
|
142
269
|
* Mint the WRITABLE web-terminal link for a live session — the dashboard
|
|
143
270
|
* counterpart to the Lark card's "🔑 获取操作链接" button. Returns the URL with
|
|
@@ -519,7 +646,12 @@ ipcRoute('GET', '/api/groups', async (_req, res) => {
|
|
|
519
646
|
const enriched = chats.map(c => {
|
|
520
647
|
const oncall = oncallStore.getOncallStatus(cachedLarkAppId, c.chatId);
|
|
521
648
|
const hasRole = resolveRoleFile(cachedLarkAppId, c.chatId) !== null;
|
|
522
|
-
|
|
649
|
+
// /introduce 记录的外部 botmux 机器人(按名字)——dashboard 团队看板用
|
|
650
|
+
// 它识别「介绍过同团队机器人的协作群」。
|
|
651
|
+
const observedBotNames = observedBotsStore
|
|
652
|
+
.listObservedBots(config.session.dataDir, cachedLarkAppId, c.chatId)
|
|
653
|
+
.map(b => b.name);
|
|
654
|
+
return { ...c, oncallChat: oncall ?? null, firstSeenAt: seenMap.get(c.chatId) ?? null, hasRole, observedBotNames };
|
|
523
655
|
});
|
|
524
656
|
jsonRes(res, 200, { chats: enriched });
|
|
525
657
|
}
|