botmux 2.9.0 → 2.9.2
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 +140 -76
- package/README.md +134 -75
- package/dist/adapters/backend/pty-backend.d.ts +6 -0
- package/dist/adapters/backend/pty-backend.d.ts.map +1 -1
- package/dist/adapters/backend/pty-backend.js +10 -0
- package/dist/adapters/backend/pty-backend.js.map +1 -1
- package/dist/adapters/backend/session-backend-selector.d.ts +11 -0
- package/dist/adapters/backend/session-backend-selector.d.ts.map +1 -0
- package/dist/adapters/backend/session-backend-selector.js +26 -0
- package/dist/adapters/backend/session-backend-selector.js.map +1 -0
- package/dist/adapters/backend/tmux-backend.d.ts +80 -3
- package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-backend.js +301 -49
- package/dist/adapters/backend/tmux-backend.js.map +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.d.ts +100 -0
- package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -0
- package/dist/adapters/backend/tmux-pipe-backend.js +473 -0
- package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -0
- package/dist/adapters/cli/aiden.d.ts.map +1 -1
- package/dist/adapters/cli/aiden.js +5 -0
- package/dist/adapters/cli/aiden.js.map +1 -1
- package/dist/adapters/cli/claude-code.d.ts +40 -1
- package/dist/adapters/cli/claude-code.d.ts.map +1 -1
- package/dist/adapters/cli/claude-code.js +470 -49
- package/dist/adapters/cli/claude-code.js.map +1 -1
- package/dist/adapters/cli/coco.d.ts.map +1 -1
- package/dist/adapters/cli/coco.js +191 -9
- package/dist/adapters/cli/coco.js.map +1 -1
- package/dist/adapters/cli/codex.d.ts.map +1 -1
- package/dist/adapters/cli/codex.js +94 -17
- package/dist/adapters/cli/codex.js.map +1 -1
- package/dist/adapters/cli/shared-hints.d.ts +2 -2
- package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
- package/dist/adapters/cli/shared-hints.js +7 -5
- package/dist/adapters/cli/shared-hints.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +38 -1
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/autostart.d.ts +14 -0
- package/dist/autostart.d.ts.map +1 -0
- package/dist/autostart.js +357 -0
- package/dist/autostart.js.map +1 -0
- package/dist/bot-registry.d.ts +29 -3
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +91 -12
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli/arg-utils.d.ts +11 -0
- package/dist/cli/arg-utils.d.ts.map +1 -0
- package/dist/cli/arg-utils.js +25 -0
- package/dist/cli/arg-utils.js.map +1 -0
- package/dist/cli/create-group-resolver.d.ts +32 -0
- package/dist/cli/create-group-resolver.d.ts.map +1 -0
- package/dist/cli/create-group-resolver.js +70 -0
- package/dist/cli/create-group-resolver.js.map +1 -0
- package/dist/cli/quoted-render.d.ts +30 -0
- package/dist/cli/quoted-render.d.ts.map +1 -0
- package/dist/cli/quoted-render.js +29 -0
- package/dist/cli/quoted-render.js.map +1 -0
- package/dist/cli.js +916 -272
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +18 -8
- package/dist/config.js.map +1 -1
- package/dist/core/command-handler.d.ts +43 -0
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +167 -64
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/dashboard-events.d.ts +57 -0
- package/dist/core/dashboard-events.d.ts.map +1 -0
- package/dist/core/dashboard-events.js +23 -0
- package/dist/core/dashboard-events.js.map +1 -0
- package/dist/core/dashboard-ipc-server.d.ts +43 -0
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -0
- package/dist/core/dashboard-ipc-server.js +481 -0
- package/dist/core/dashboard-ipc-server.js.map +1 -0
- package/dist/core/dashboard-locate.d.ts +20 -0
- package/dist/core/dashboard-locate.d.ts.map +1 -0
- package/dist/core/dashboard-locate.js +26 -0
- package/dist/core/dashboard-locate.js.map +1 -0
- package/dist/core/dashboard-rows.d.ts +31 -0
- package/dist/core/dashboard-rows.d.ts.map +1 -0
- package/dist/core/dashboard-rows.js +65 -0
- package/dist/core/dashboard-rows.js.map +1 -0
- package/dist/core/inherit-peer.d.ts +14 -0
- package/dist/core/inherit-peer.d.ts.map +1 -0
- package/dist/core/inherit-peer.js +32 -0
- package/dist/core/inherit-peer.js.map +1 -0
- package/dist/core/scheduler.d.ts +24 -0
- package/dist/core/scheduler.d.ts.map +1 -1
- package/dist/core/scheduler.js +93 -2
- package/dist/core/scheduler.js.map +1 -1
- package/dist/core/session-activity.d.ts +3 -0
- package/dist/core/session-activity.d.ts.map +1 -0
- package/dist/core/session-activity.js +20 -0
- package/dist/core/session-activity.js.map +1 -0
- package/dist/core/session-discovery.d.ts +39 -0
- package/dist/core/session-discovery.d.ts.map +1 -1
- package/dist/core/session-discovery.js +114 -21
- package/dist/core/session-discovery.js.map +1 -1
- package/dist/core/session-manager.d.ts +72 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +396 -106
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/types.d.ts +27 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +14 -3
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-pool.d.ts +72 -3
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +459 -38
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +601 -309
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/aggregator.d.ts +41 -0
- package/dist/dashboard/aggregator.d.ts.map +1 -0
- package/dist/dashboard/aggregator.js +125 -0
- package/dist/dashboard/aggregator.js.map +1 -0
- package/dist/dashboard/auth.d.ts +23 -0
- package/dist/dashboard/auth.d.ts.map +1 -0
- package/dist/dashboard/auth.js +66 -0
- package/dist/dashboard/auth.js.map +1 -0
- package/dist/dashboard/operator-selector.d.ts +20 -0
- package/dist/dashboard/operator-selector.d.ts.map +1 -0
- package/dist/dashboard/operator-selector.js +39 -0
- package/dist/dashboard/operator-selector.js.map +1 -0
- package/dist/dashboard/registry.d.ts +35 -0
- package/dist/dashboard/registry.d.ts.map +1 -0
- package/dist/dashboard/registry.js +74 -0
- package/dist/dashboard/registry.js.map +1 -0
- package/dist/dashboard/web/app.d.ts +2 -0
- package/dist/dashboard/web/app.d.ts.map +1 -0
- package/dist/dashboard/web/app.js +45 -0
- package/dist/dashboard/web/app.js.map +1 -0
- package/dist/dashboard/web/bot-defaults.d.ts +2 -0
- package/dist/dashboard/web/bot-defaults.d.ts.map +1 -0
- package/dist/dashboard/web/bot-defaults.js +201 -0
- package/dist/dashboard/web/bot-defaults.js.map +1 -0
- package/dist/dashboard/web/groups.d.ts +16 -0
- package/dist/dashboard/web/groups.d.ts.map +1 -0
- package/dist/dashboard/web/groups.js +584 -0
- package/dist/dashboard/web/groups.js.map +1 -0
- package/dist/dashboard/web/schedules.d.ts +2 -0
- package/dist/dashboard/web/schedules.d.ts.map +1 -0
- package/dist/dashboard/web/schedules.js +105 -0
- package/dist/dashboard/web/schedules.js.map +1 -0
- package/dist/dashboard/web/sessions.d.ts +2 -0
- package/dist/dashboard/web/sessions.d.ts.map +1 -0
- package/dist/dashboard/web/sessions.js +374 -0
- package/dist/dashboard/web/sessions.js.map +1 -0
- package/dist/dashboard/web/store.d.ts +23 -0
- package/dist/dashboard/web/store.d.ts.map +1 -0
- package/dist/dashboard/web/store.js +82 -0
- package/dist/dashboard/web/store.js.map +1 -0
- package/dist/dashboard-web/app.js +263 -0
- package/dist/dashboard-web/index.html +23 -0
- package/dist/dashboard-web/style.css +93 -0
- package/dist/dashboard.d.ts +2 -0
- package/dist/dashboard.d.ts.map +1 -0
- package/dist/dashboard.js +639 -0
- package/dist/dashboard.js.map +1 -0
- package/dist/im/lark/card-builder.d.ts +18 -1
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +70 -9
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +123 -109
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts +36 -0
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +119 -13
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts +92 -8
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +410 -89
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/im/lark/forwarded-renderer.d.ts +23 -0
- package/dist/im/lark/forwarded-renderer.d.ts.map +1 -0
- package/dist/im/lark/forwarded-renderer.js +105 -0
- package/dist/im/lark/forwarded-renderer.js.map +1 -0
- package/dist/im/lark/md-card.d.ts +73 -0
- package/dist/im/lark/md-card.d.ts.map +1 -0
- package/dist/im/lark/md-card.js +332 -0
- package/dist/im/lark/md-card.js.map +1 -0
- package/dist/im/lark/merge-forward.d.ts +32 -0
- package/dist/im/lark/merge-forward.d.ts.map +1 -0
- package/dist/im/lark/merge-forward.js +110 -0
- package/dist/im/lark/merge-forward.js.map +1 -0
- package/dist/im/lark/message-parser.d.ts +9 -3
- package/dist/im/lark/message-parser.d.ts.map +1 -1
- package/dist/im/lark/message-parser.js +48 -13
- package/dist/im/lark/message-parser.js.map +1 -1
- package/dist/im/lark/quote-hint.d.ts +18 -0
- package/dist/im/lark/quote-hint.d.ts.map +1 -0
- package/dist/im/lark/quote-hint.js +23 -0
- package/dist/im/lark/quote-hint.js.map +1 -0
- package/dist/services/bridge-fallback-gate.d.ts +42 -0
- package/dist/services/bridge-fallback-gate.d.ts.map +1 -0
- package/dist/services/bridge-fallback-gate.js +12 -0
- package/dist/services/bridge-fallback-gate.js.map +1 -0
- package/dist/services/bridge-rotation-policy.d.ts +139 -0
- package/dist/services/bridge-rotation-policy.d.ts.map +1 -0
- package/dist/services/bridge-rotation-policy.js +125 -0
- package/dist/services/bridge-rotation-policy.js.map +1 -0
- package/dist/services/bridge-turn-queue.d.ts +154 -0
- package/dist/services/bridge-turn-queue.d.ts.map +1 -0
- package/dist/services/bridge-turn-queue.js +316 -0
- package/dist/services/bridge-turn-queue.js.map +1 -0
- package/dist/services/chat-first-seen-store.d.ts +27 -0
- package/dist/services/chat-first-seen-store.d.ts.map +1 -0
- package/dist/services/chat-first-seen-store.js +114 -0
- package/dist/services/chat-first-seen-store.js.map +1 -0
- package/dist/services/claude-transcript.d.ts +268 -0
- package/dist/services/claude-transcript.d.ts.map +1 -0
- package/dist/services/claude-transcript.js +798 -0
- package/dist/services/claude-transcript.js.map +1 -0
- package/dist/services/coco-transcript.d.ts +35 -0
- package/dist/services/coco-transcript.d.ts.map +1 -0
- package/dist/services/coco-transcript.js +192 -0
- package/dist/services/coco-transcript.js.map +1 -0
- package/dist/services/codex-bridge-queue.d.ts +56 -0
- package/dist/services/codex-bridge-queue.d.ts.map +1 -0
- package/dist/services/codex-bridge-queue.js +150 -0
- package/dist/services/codex-bridge-queue.js.map +1 -0
- package/dist/services/codex-transcript.d.ts +84 -0
- package/dist/services/codex-transcript.d.ts.map +1 -0
- package/dist/services/codex-transcript.js +298 -0
- package/dist/services/codex-transcript.js.map +1 -0
- package/dist/services/group-creator.d.ts +23 -0
- package/dist/services/group-creator.d.ts.map +1 -0
- package/dist/services/group-creator.js +75 -0
- package/dist/services/group-creator.js.map +1 -0
- package/dist/services/groups-store.d.ts +98 -0
- package/dist/services/groups-store.d.ts.map +1 -0
- package/dist/services/groups-store.js +213 -0
- package/dist/services/groups-store.js.map +1 -0
- package/dist/services/oncall-store.d.ts +80 -8
- package/dist/services/oncall-store.d.ts.map +1 -1
- package/dist/services/oncall-store.js +265 -55
- package/dist/services/oncall-store.js.map +1 -1
- package/dist/services/project-scanner.d.ts +1 -2
- package/dist/services/project-scanner.d.ts.map +1 -1
- package/dist/services/project-scanner.js +118 -68
- package/dist/services/project-scanner.js.map +1 -1
- package/dist/services/schedule-store.d.ts +5 -0
- package/dist/services/schedule-store.d.ts.map +1 -1
- package/dist/services/schedule-store.js +77 -1
- package/dist/services/schedule-store.js.map +1 -1
- package/dist/services/session-store.d.ts +22 -0
- package/dist/services/session-store.d.ts.map +1 -1
- package/dist/services/session-store.js +62 -4
- package/dist/services/session-store.js.map +1 -1
- package/dist/setup/bots-store.d.ts +3 -0
- package/dist/setup/bots-store.d.ts.map +1 -0
- package/dist/setup/bots-store.js +24 -0
- package/dist/setup/bots-store.js.map +1 -0
- package/dist/setup/detect-platform.d.ts +14 -0
- package/dist/setup/detect-platform.d.ts.map +1 -0
- package/dist/setup/detect-platform.js +139 -0
- package/dist/setup/detect-platform.js.map +1 -0
- package/dist/setup/ensure-fonts.d.ts +13 -0
- package/dist/setup/ensure-fonts.d.ts.map +1 -0
- package/dist/setup/ensure-fonts.js +225 -0
- package/dist/setup/ensure-fonts.js.map +1 -0
- package/dist/setup/ensure-tmux.d.ts +60 -0
- package/dist/setup/ensure-tmux.d.ts.map +1 -0
- package/dist/setup/ensure-tmux.js +236 -0
- package/dist/setup/ensure-tmux.js.map +1 -0
- package/dist/setup/index.d.ts +9 -0
- package/dist/setup/index.d.ts.map +1 -0
- package/dist/setup/index.js +46 -0
- package/dist/setup/index.js.map +1 -0
- package/dist/setup/lark-scopes.json +301 -0
- package/dist/setup/register-app.d.ts +52 -0
- package/dist/setup/register-app.d.ts.map +1 -0
- package/dist/setup/register-app.js +91 -0
- package/dist/setup/register-app.js.map +1 -0
- package/dist/setup/verify-permissions.d.ts +115 -0
- package/dist/setup/verify-permissions.d.ts.map +1 -0
- package/dist/setup/verify-permissions.js +207 -0
- package/dist/setup/verify-permissions.js.map +1 -0
- package/dist/skills/definitions.d.ts +4 -0
- package/dist/skills/definitions.d.ts.map +1 -1
- package/dist/skills/definitions.js +133 -19
- package/dist/skills/definitions.js.map +1 -1
- package/dist/skills/installer.d.ts +3 -1
- package/dist/skills/installer.d.ts.map +1 -1
- package/dist/skills/installer.js +18 -3
- package/dist/skills/installer.js.map +1 -1
- package/dist/types.d.ts +44 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/bot-routing.d.ts +6 -0
- package/dist/utils/bot-routing.d.ts.map +1 -0
- package/dist/utils/bot-routing.js +50 -0
- package/dist/utils/bot-routing.js.map +1 -0
- package/dist/utils/file-lock.d.ts +2 -0
- package/dist/utils/file-lock.d.ts.map +1 -0
- package/dist/utils/file-lock.js +114 -0
- package/dist/utils/file-lock.js.map +1 -0
- package/dist/utils/font-installer.js +1 -1
- package/dist/utils/font-installer.js.map +1 -1
- package/dist/utils/idle-detector.d.ts +6 -0
- package/dist/utils/idle-detector.d.ts.map +1 -1
- package/dist/utils/idle-detector.js +25 -4
- package/dist/utils/idle-detector.js.map +1 -1
- package/dist/utils/logger.d.ts +10 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +60 -8
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/render-dimensions.d.ts +48 -0
- package/dist/utils/render-dimensions.d.ts.map +1 -0
- package/dist/utils/render-dimensions.js +55 -0
- package/dist/utils/render-dimensions.js.map +1 -0
- package/dist/utils/screen-analyzer.d.ts.map +1 -1
- package/dist/utils/screen-analyzer.js +24 -0
- package/dist/utils/screen-analyzer.js.map +1 -1
- package/dist/utils/screenshot-renderer.d.ts.map +1 -1
- package/dist/utils/screenshot-renderer.js +67 -23
- package/dist/utils/screenshot-renderer.js.map +1 -1
- package/dist/utils/terminal-renderer.d.ts +16 -0
- package/dist/utils/terminal-renderer.d.ts.map +1 -1
- package/dist/utils/terminal-renderer.js +40 -23
- package/dist/utils/terminal-renderer.js.map +1 -1
- package/dist/utils/transient-snapshot.d.ts +28 -0
- package/dist/utils/transient-snapshot.d.ts.map +1 -0
- package/dist/utils/transient-snapshot.js +96 -0
- package/dist/utils/transient-snapshot.js.map +1 -0
- package/dist/worker.js +2220 -83
- package/dist/worker.js.map +1 -1
- package/package.json +12 -5
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thin wrappers over Feishu IM v1 chat APIs for the dashboard's groups board.
|
|
3
|
+
*
|
|
4
|
+
* Phase B (Web Dashboard) — Task 24. These wrappers are stateless; they reuse
|
|
5
|
+
* the per-bot Lark SDK client created by `bot-registry`.
|
|
6
|
+
*
|
|
7
|
+
* The "proxy bot" pattern in `addBotToChat`: Feishu requires the inviter to
|
|
8
|
+
* already be a member of the chat, so the dashboard picks an existing-member
|
|
9
|
+
* bot to do the invite. This wrapper just exposes the underlying call —
|
|
10
|
+
* proxy selection happens at the route layer.
|
|
11
|
+
*/
|
|
12
|
+
import { getBotClient } from '../bot-registry.js';
|
|
13
|
+
/**
|
|
14
|
+
* List chats the given bot is a member of, draining pagination internally.
|
|
15
|
+
* Uses /open-apis/im/v1/chats.
|
|
16
|
+
*/
|
|
17
|
+
export async function listChats(larkAppId) {
|
|
18
|
+
const client = getBotClient(larkAppId);
|
|
19
|
+
const out = [];
|
|
20
|
+
let pageToken;
|
|
21
|
+
do {
|
|
22
|
+
const res = await client.im.v1.chat.list({
|
|
23
|
+
params: {
|
|
24
|
+
page_size: 100,
|
|
25
|
+
user_id_type: 'open_id',
|
|
26
|
+
...(pageToken ? { page_token: pageToken } : {}),
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
if (res.code !== 0 && res.code !== undefined) {
|
|
30
|
+
throw new Error(`Failed to list chats: ${res.msg} (code: ${res.code})`);
|
|
31
|
+
}
|
|
32
|
+
for (const c of res.data?.items ?? []) {
|
|
33
|
+
out.push({
|
|
34
|
+
chatId: c.chat_id,
|
|
35
|
+
name: c.name,
|
|
36
|
+
description: c.description,
|
|
37
|
+
chatMode: c.chat_mode,
|
|
38
|
+
ownerId: c.owner_id,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
pageToken = res.data?.has_more ? res.data?.page_token : undefined;
|
|
42
|
+
} while (pageToken);
|
|
43
|
+
return out;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Check whether the given bot is a member of the given chat.
|
|
47
|
+
* Uses /open-apis/im/v1/chats/:chat_id/members/is_in_chat — the bot's own
|
|
48
|
+
* access token implicitly identifies the bot being checked.
|
|
49
|
+
*
|
|
50
|
+
* Errors (chat not found, no permission, etc.) are swallowed and treated as
|
|
51
|
+
* "not in chat" so callers can use this as a simple boolean predicate.
|
|
52
|
+
*/
|
|
53
|
+
export async function isInChat(larkAppId, chatId) {
|
|
54
|
+
const client = getBotClient(larkAppId);
|
|
55
|
+
try {
|
|
56
|
+
const res = await client.im.v1.chatMembers.isInChat({
|
|
57
|
+
path: { chat_id: chatId },
|
|
58
|
+
});
|
|
59
|
+
if (res.code !== 0 && res.code !== undefined)
|
|
60
|
+
return false;
|
|
61
|
+
return !!res.data?.is_in_chat;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Create a brand-new chat with `bot_id_list` as initial bot members. The
|
|
69
|
+
* `creatorLarkAppId` bot becomes the chat's owner and an implicit member; the
|
|
70
|
+
* other bots in `botIds` are added in the same call. Used by the dashboard's
|
|
71
|
+
* "Create new group" flow.
|
|
72
|
+
*
|
|
73
|
+
* Returns the new chatId on success. Throws on any non-zero Lark response so
|
|
74
|
+
* the route can surface a real error. We deliberately don't soften failures
|
|
75
|
+
* here (unlike `isInChat`) because the caller wants to know whether the chat
|
|
76
|
+
* actually got created.
|
|
77
|
+
*/
|
|
78
|
+
export async function createChat(creatorLarkAppId, opts) {
|
|
79
|
+
const client = getBotClient(creatorLarkAppId);
|
|
80
|
+
// Filter out the creator from bot_id_list — Lark errors if the inviter
|
|
81
|
+
// appears in their own invite list.
|
|
82
|
+
const otherBots = opts.botIds.filter(id => id !== creatorLarkAppId);
|
|
83
|
+
const userIds = (opts.userIds ?? []).filter(Boolean);
|
|
84
|
+
const data = {};
|
|
85
|
+
if (opts.name)
|
|
86
|
+
data.name = opts.name;
|
|
87
|
+
if (otherBots.length > 0)
|
|
88
|
+
data.bot_id_list = otherBots;
|
|
89
|
+
if (userIds.length > 0)
|
|
90
|
+
data.user_id_list = userIds;
|
|
91
|
+
const params = {};
|
|
92
|
+
if (userIds.length > 0)
|
|
93
|
+
params.user_id_type = 'open_id';
|
|
94
|
+
const res = await client.im.v1.chat.create({ data, params });
|
|
95
|
+
if (res.code !== 0 && res.code !== undefined) {
|
|
96
|
+
throw new Error(`Failed to create chat: ${res.msg ?? 'unknown'} (code: ${res.code})`);
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
chatId: res.data?.chat_id,
|
|
100
|
+
invalidBotIds: res.data?.invalid_bot_id_list ?? [],
|
|
101
|
+
invalidUserIds: res.data?.invalid_user_id_list ?? [],
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Transfer ownership of a chat from the calling bot to a Feishu user. Used
|
|
106
|
+
* after `createChat` so the dashboard operator (who's been invited as a
|
|
107
|
+
* member) ends up as the actual owner — otherwise the bot stays group owner
|
|
108
|
+
* and the user can't manage the chat.
|
|
109
|
+
*
|
|
110
|
+
* Calls /open-apis/im/v1/chats/:chat_id with `owner_id` in the body and
|
|
111
|
+
* `user_id_type=open_id`. The caller's bot must currently be the owner; this
|
|
112
|
+
* is the case right after createChat since the creator bot is the implicit
|
|
113
|
+
* owner.
|
|
114
|
+
*
|
|
115
|
+
* `newOwnerOpenId` must be in the calling bot's app scope — Lark open_ids are
|
|
116
|
+
* app-scoped, see operator-selector.ts for why.
|
|
117
|
+
*/
|
|
118
|
+
export async function transferChatOwner(ownerLarkAppId, chatId, newOwnerOpenId) {
|
|
119
|
+
const client = getBotClient(ownerLarkAppId);
|
|
120
|
+
try {
|
|
121
|
+
const res = await client.im.v1.chat.update({
|
|
122
|
+
path: { chat_id: chatId },
|
|
123
|
+
params: { user_id_type: 'open_id' },
|
|
124
|
+
data: { owner_id: newOwnerOpenId },
|
|
125
|
+
});
|
|
126
|
+
if (res.code !== 0 && res.code !== undefined) {
|
|
127
|
+
return { ok: false, error: `${res.msg ?? 'unknown'} (code: ${res.code})` };
|
|
128
|
+
}
|
|
129
|
+
return { ok: true };
|
|
130
|
+
}
|
|
131
|
+
catch (e) {
|
|
132
|
+
return { ok: false, error: e?.message ?? String(e) };
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Disband (delete) a chat. The Lark API only succeeds when the calling bot is
|
|
137
|
+
* the chat's current owner, OR is the creator AND the app holds
|
|
138
|
+
* `im:chat:operate_as_owner`. Routes that fan-out to multiple bots can use
|
|
139
|
+
* this best-effort: try each in-chat bot until one succeeds.
|
|
140
|
+
*/
|
|
141
|
+
export async function disbandChat(larkAppId, chatId) {
|
|
142
|
+
const client = getBotClient(larkAppId);
|
|
143
|
+
try {
|
|
144
|
+
const res = await client.im.v1.chat.delete({ path: { chat_id: chatId } });
|
|
145
|
+
if (res.code !== 0 && res.code !== undefined) {
|
|
146
|
+
return { ok: false, error: `${res.msg ?? 'unknown'} (code: ${res.code})` };
|
|
147
|
+
}
|
|
148
|
+
return { ok: true };
|
|
149
|
+
}
|
|
150
|
+
catch (e) {
|
|
151
|
+
return { ok: false, error: e?.message ?? String(e) };
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Make the calling bot leave a chat. Per Lark docs, self-removal succeeds
|
|
156
|
+
* regardless of role (owner/manager/member). Useful when the bot can't disband
|
|
157
|
+
* (not owner, no operate_as_owner scope) but still wants to detach.
|
|
158
|
+
*/
|
|
159
|
+
export async function leaveChat(larkAppId, chatId) {
|
|
160
|
+
const client = getBotClient(larkAppId);
|
|
161
|
+
try {
|
|
162
|
+
const res = await client.im.v1.chatMembers.delete({
|
|
163
|
+
path: { chat_id: chatId },
|
|
164
|
+
params: { member_id_type: 'app_id' },
|
|
165
|
+
data: { id_list: [larkAppId] },
|
|
166
|
+
});
|
|
167
|
+
if (res.code !== 0 && res.code !== undefined) {
|
|
168
|
+
return { ok: false, error: `${res.msg ?? 'unknown'} (code: ${res.code})` };
|
|
169
|
+
}
|
|
170
|
+
return { ok: true };
|
|
171
|
+
}
|
|
172
|
+
catch (e) {
|
|
173
|
+
return { ok: false, error: e?.message ?? String(e) };
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Add bot apps to a chat using a "proxy" bot that's already a member.
|
|
178
|
+
* Uses /open-apis/im/v1/chats/:chat_id/members with member_id_type=app_id.
|
|
179
|
+
* Returns per-id result derived from the API's invalid_id_list.
|
|
180
|
+
*
|
|
181
|
+
* On total failure (network error, non-zero code) every id reports the same
|
|
182
|
+
* error so the caller can present a uniform per-id status.
|
|
183
|
+
*/
|
|
184
|
+
export async function addBotToChat(proxyLarkAppId, chatId, targetLarkAppIds) {
|
|
185
|
+
if (targetLarkAppIds.length === 0)
|
|
186
|
+
return [];
|
|
187
|
+
const client = getBotClient(proxyLarkAppId);
|
|
188
|
+
const out = [];
|
|
189
|
+
try {
|
|
190
|
+
const res = await client.im.v1.chatMembers.create({
|
|
191
|
+
path: { chat_id: chatId },
|
|
192
|
+
params: { member_id_type: 'app_id' },
|
|
193
|
+
data: { id_list: targetLarkAppIds },
|
|
194
|
+
});
|
|
195
|
+
if (res.code !== 0 && res.code !== undefined) {
|
|
196
|
+
const errMsg = `${res.msg ?? 'unknown'} (code: ${res.code})`;
|
|
197
|
+
for (const id of targetLarkAppIds)
|
|
198
|
+
out.push({ id, ok: false, error: errMsg });
|
|
199
|
+
return out;
|
|
200
|
+
}
|
|
201
|
+
const invalid = new Set(res.data?.invalid_id_list ?? []);
|
|
202
|
+
for (const id of targetLarkAppIds) {
|
|
203
|
+
out.push(invalid.has(id) ? { id, ok: false, error: 'invalid_id' } : { id, ok: true });
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
catch (e) {
|
|
207
|
+
const msg = e?.message ?? String(e);
|
|
208
|
+
for (const id of targetLarkAppIds)
|
|
209
|
+
out.push({ id, ok: false, error: msg });
|
|
210
|
+
}
|
|
211
|
+
return out;
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=groups-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"groups-store.js","sourceRoot":"","sources":["../../src/services/groups-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAUlD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,SAAiB;IAC/C,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,GAAG,GAAgB,EAAE,CAAC;IAC5B,IAAI,SAA6B,CAAC;IAClC,GAAG,CAAC;QACF,MAAM,GAAG,GAAQ,MAAO,MAAc,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;YACrD,MAAM,EAAE;gBACN,SAAS,EAAE,GAAG;gBACd,YAAY,EAAE,SAAS;gBACvB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAChD;SACF,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7C,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,CAAC,GAAG,WAAW,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;QAC1E,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC;YACtC,GAAG,CAAC,IAAI,CAAC;gBACP,MAAM,EAAE,CAAC,CAAC,OAAO;gBACjB,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,QAAQ,EAAE,CAAC,CAAC,SAAS;gBACrB,OAAO,EAAE,CAAC,CAAC,QAAQ;aACpB,CAAC,CAAC;QACL,CAAC;QACD,SAAS,GAAG,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IACpE,CAAC,QAAQ,SAAS,EAAE;IACpB,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,SAAiB,EAAE,MAAc;IAC9D,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAQ,MAAO,MAAc,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC;YAChE,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;SAC1B,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAC3D,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,gBAAwB,EACxB,IAA6D;IAE7D,MAAM,MAAM,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;IAC9C,uEAAuE;IACvE,oCAAoC;IACpC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,gBAAgB,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,IAAI,IAAI,CAAC,IAAI;QAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACrC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;QAAE,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;IACvD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;IACpD,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC;IACxD,MAAM,GAAG,GAAQ,MAAO,MAAc,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3E,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,CAAC,GAAG,IAAI,SAAS,WAAW,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;IACxF,CAAC;IACD,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO;QACzB,aAAa,EAAE,GAAG,CAAC,IAAI,EAAE,mBAAmB,IAAI,EAAE;QAClD,cAAc,EAAE,GAAG,CAAC,IAAI,EAAE,oBAAoB,IAAI,EAAE;KACrD,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,cAAsB,EACtB,MAAc,EACd,cAAsB;IAEtB,MAAM,MAAM,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,GAAG,GAAQ,MAAO,MAAc,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;YACvD,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;YACzB,MAAM,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE;YACnC,IAAI,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE;SACnC,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,GAAG,IAAI,SAAS,WAAW,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;QAC7E,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,SAAiB,EAAE,MAAc;IAEjC,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAQ,MAAO,MAAc,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACxF,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,GAAG,IAAI,SAAS,WAAW,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;QAC7E,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,SAAiB,EAAE,MAAc;IAEjC,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAQ,MAAO,MAAc,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC;YAC9D,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;YACzB,MAAM,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE;YACpC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE;SAC/B,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,GAAG,IAAI,SAAS,WAAW,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;QAC7E,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,cAAsB,EACtB,MAAc,EACd,gBAA0B;IAE1B,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7C,MAAM,MAAM,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAkD,EAAE,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,GAAG,GAAQ,MAAO,MAAc,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC;YAC9D,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;YACzB,MAAM,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE;YACpC,IAAI,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE;SACpC,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,SAAS,WAAW,GAAG,CAAC,IAAI,GAAG,CAAC;YAC7D,KAAK,MAAM,EAAE,IAAI,gBAAgB;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAC9E,OAAO,GAAG,CAAC;QACb,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAS,GAAG,CAAC,IAAI,EAAE,eAAe,IAAI,EAAE,CAAC,CAAC;QACjE,KAAK,MAAM,EAAE,IAAI,gBAAgB,EAAE,CAAC;YAClC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,MAAM,GAAG,GAAG,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;QACpC,KAAK,MAAM,EAAE,IAAI,gBAAgB;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -1,22 +1,94 @@
|
|
|
1
|
-
import { type OncallChat } from '../bot-registry.js';
|
|
1
|
+
import { type BotDefaultOncall, type OncallChat } from '../bot-registry.js';
|
|
2
2
|
/**
|
|
3
|
-
* Upsert an oncall binding.
|
|
4
|
-
* can update the workingDir (ownerOpenId must be in owners). First-time bind
|
|
5
|
-
* puts the caller into owners automatically.
|
|
3
|
+
* Upsert an oncall binding. Returns whether it was newly created.
|
|
6
4
|
*/
|
|
7
|
-
export declare function bindOncall(larkAppId: string, chatId: string, workingDir: string
|
|
5
|
+
export declare function bindOncall(larkAppId: string, chatId: string, workingDir: string): Promise<{
|
|
8
6
|
ok: true;
|
|
9
7
|
entry: OncallChat;
|
|
10
8
|
created: boolean;
|
|
11
9
|
} | {
|
|
12
10
|
ok: false;
|
|
13
11
|
reason: string;
|
|
14
|
-
}
|
|
15
|
-
|
|
12
|
+
}>;
|
|
13
|
+
/**
|
|
14
|
+
* Unbind oncall for `chatId` and ALWAYS write a tombstone into
|
|
15
|
+
* `defaultOncallAutoboundChats`. The tombstone protects against the case
|
|
16
|
+
* where a user manually fiddled with a chat (bound then unbound, or just
|
|
17
|
+
* unbound) and we then mis-classify it as "new" on the next observation
|
|
18
|
+
* and re-auto-bind. Treating unbind as "default's one shot is spent" is
|
|
19
|
+
* symmetric with auto-bind already adding to the same list.
|
|
20
|
+
*
|
|
21
|
+
* Idempotent: never errors on "not bound". `wasBound` reports whether an
|
|
22
|
+
* existing binding was actually removed so callers can phrase UI text
|
|
23
|
+
* accordingly (the Lark `/oncall unbind` command still wants to say "未绑定"
|
|
24
|
+
* vs "已解绑").
|
|
25
|
+
*/
|
|
26
|
+
export declare function unbindOncall(larkAppId: string, chatId: string): Promise<{
|
|
16
27
|
ok: true;
|
|
28
|
+
wasBound: boolean;
|
|
17
29
|
} | {
|
|
18
30
|
ok: false;
|
|
19
31
|
reason: string;
|
|
20
|
-
}
|
|
32
|
+
}>;
|
|
21
33
|
export declare function getOncallStatus(larkAppId: string, chatId: string): OncallChat | undefined;
|
|
34
|
+
/** Read the current defaultOncall config + autobound list for a bot. Used by
|
|
35
|
+
* the dashboard GET route and by the daemon's auto-bind judge. Sync because
|
|
36
|
+
* it only reads the in-memory snapshot — file-level consistency comes from
|
|
37
|
+
* the daemon never racing with itself on reads. */
|
|
38
|
+
export declare function getBotDefaultOncall(larkAppId: string): {
|
|
39
|
+
defaultOncall: BotDefaultOncall | undefined;
|
|
40
|
+
autoboundChats: string[];
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Persist a defaultOncall change for the given bot. The dashboard PUT route
|
|
44
|
+
* is the only authorized caller — `since` is server-side authoritative so the
|
|
45
|
+
* frontend can't backdate the cut-off and accidentally include existing chats.
|
|
46
|
+
*
|
|
47
|
+
* `since` is stamped on every enabled save, not just the first transition.
|
|
48
|
+
* This matches the dashboard copy/requirement and prevents a later workingDir
|
|
49
|
+
* edit from reaching chats that were first observed before that edit.
|
|
50
|
+
*
|
|
51
|
+
* When disabled with an empty `workingDir`, the prior workingDir is preserved
|
|
52
|
+
* so the UI can round-trip (toggle off → toggle back on) without forcing the
|
|
53
|
+
* user to retype the path. Disable with a non-empty workingDir overwrites.
|
|
54
|
+
*/
|
|
55
|
+
export declare function updateBotDefaultOncall(larkAppId: string, patch: {
|
|
56
|
+
enabled: boolean;
|
|
57
|
+
workingDir: string;
|
|
58
|
+
}): Promise<{
|
|
59
|
+
ok: true;
|
|
60
|
+
defaultOncall: BotDefaultOncall;
|
|
61
|
+
} | {
|
|
62
|
+
ok: false;
|
|
63
|
+
reason: string;
|
|
64
|
+
}>;
|
|
65
|
+
/**
|
|
66
|
+
* Auto-bind a chat as part of the defaultOncall flow. Atomically:
|
|
67
|
+
* 1. RE-CHECK tombstone + existing binding against the freshest on-disk
|
|
68
|
+
* snapshot. The daemon's fast-path tombstone check is informational —
|
|
69
|
+
* if a concurrent `unbindOncall` wrote a tombstone between then and
|
|
70
|
+
* now, the lock-internal view sees it and we skip.
|
|
71
|
+
* 2. Upsert the oncallChats entry (same shape as manual bindOncall).
|
|
72
|
+
* 3. Append chatId to defaultOncallAutoboundChats (idempotent).
|
|
73
|
+
*
|
|
74
|
+
* Returns `skipped: 'tombstoned'` when the lock-internal tombstone check
|
|
75
|
+
* trips, `skipped: 'already_bound'` when another writer (manual bind by
|
|
76
|
+
* the user, or a sibling daemon) bound the chat between the fast-path read
|
|
77
|
+
* and the lock acquisition. Neither is an error.
|
|
78
|
+
*/
|
|
79
|
+
export declare function autoBindOncallFromDefault(larkAppId: string, chatId: string, workingDir: string): Promise<{
|
|
80
|
+
ok: true;
|
|
81
|
+
entry: OncallChat;
|
|
82
|
+
created: boolean;
|
|
83
|
+
skipped?: undefined;
|
|
84
|
+
} | {
|
|
85
|
+
ok: true;
|
|
86
|
+
skipped: 'tombstoned' | 'already_bound';
|
|
87
|
+
entry?: undefined;
|
|
88
|
+
created?: undefined;
|
|
89
|
+
} | {
|
|
90
|
+
ok: false;
|
|
91
|
+
reason: string;
|
|
92
|
+
}>;
|
|
93
|
+
export declare function _readRawConfigSyncForTesting(path: string): any[];
|
|
22
94
|
//# sourceMappingURL=oncall-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oncall-store.d.ts","sourceRoot":"","sources":["../../src/services/oncall-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"oncall-store.d.ts","sourceRoot":"","sources":["../../src/services/oncall-store.ts"],"names":[],"mappings":"AAkBA,OAAO,EAA+B,KAAK,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAsDzG;;GAEG;AACH,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAuB5F;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA0B1E;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAQzF;AAID;;;oDAGoD;AACpD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG;IACtD,aAAa,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC5C,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B,CASA;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC9C,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,aAAa,EAAE,gBAAgB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAgCxF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,OAAO,CACN;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,SAAS,CAAA;CAAE,GACtE;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,YAAY,GAAG,eAAe,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,CAAC;IAAC,OAAO,CAAC,EAAE,SAAS,CAAA;CAAE,GAC7F;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAChC,CAiDA;AAGD,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,EAAE,CAEhE"}
|