botmux 2.88.0 → 2.89.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/bot-registry.d.ts +2 -0
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +4 -0
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli/dashboard-endpoint.d.ts.map +1 -1
- package/dist/cli/dashboard-endpoint.js +9 -3
- package/dist/cli/dashboard-endpoint.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +11 -3
- package/dist/cli.js.map +1 -1
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +9 -1
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/dashboard-command/groups.d.ts +20 -0
- package/dist/core/dashboard-command/groups.d.ts.map +1 -0
- package/dist/core/dashboard-command/groups.js +52 -0
- package/dist/core/dashboard-command/groups.js.map +1 -0
- package/dist/core/dashboard-command/index.d.ts +30 -0
- package/dist/core/dashboard-command/index.d.ts.map +1 -0
- package/dist/core/dashboard-command/index.js +81 -0
- package/dist/core/dashboard-command/index.js.map +1 -0
- package/dist/core/dashboard-command/overview.d.ts +29 -0
- package/dist/core/dashboard-command/overview.d.ts.map +1 -0
- package/dist/core/dashboard-command/overview.js +61 -0
- package/dist/core/dashboard-command/overview.js.map +1 -0
- package/dist/core/dashboard-command/owner-gate.d.ts +41 -0
- package/dist/core/dashboard-command/owner-gate.d.ts.map +1 -0
- package/dist/core/dashboard-command/owner-gate.js +40 -0
- package/dist/core/dashboard-command/owner-gate.js.map +1 -0
- package/dist/core/dashboard-command/schedules.d.ts +20 -0
- package/dist/core/dashboard-command/schedules.d.ts.map +1 -0
- package/dist/core/dashboard-command/schedules.js +47 -0
- package/dist/core/dashboard-command/schedules.js.map +1 -0
- package/dist/core/dashboard-command/sessions.d.ts +22 -0
- package/dist/core/dashboard-command/sessions.d.ts.map +1 -0
- package/dist/core/dashboard-command/sessions.js +43 -0
- package/dist/core/dashboard-command/sessions.js.map +1 -0
- package/dist/core/dashboard-command/settings.d.ts +21 -0
- package/dist/core/dashboard-command/settings.d.ts.map +1 -0
- package/dist/core/dashboard-command/settings.js +55 -0
- package/dist/core/dashboard-command/settings.js.map +1 -0
- package/dist/core/dashboard-command/stub.d.ts +16 -0
- package/dist/core/dashboard-command/stub.d.ts.map +1 -0
- package/dist/core/dashboard-command/stub.js +28 -0
- package/dist/core/dashboard-command/stub.js.map +1 -0
- package/dist/core/dashboard-command/workflows.d.ts +20 -0
- package/dist/core/dashboard-command/workflows.d.ts.map +1 -0
- package/dist/core/dashboard-command/workflows.js +45 -0
- package/dist/core/dashboard-command/workflows.js.map +1 -0
- package/dist/core/passthrough-commands.d.ts.map +1 -1
- package/dist/core/passthrough-commands.js +1 -1
- package/dist/core/passthrough-commands.js.map +1 -1
- package/dist/core/session-create.d.ts +0 -1
- package/dist/core/session-create.d.ts.map +1 -1
- package/dist/core/session-create.js +0 -3
- package/dist/core/session-create.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +3 -2
- package/dist/core/session-manager.js.map +1 -1
- package/dist/daemon-internal-client-wrapper.d.ts +41 -0
- package/dist/daemon-internal-client-wrapper.d.ts.map +1 -0
- package/dist/daemon-internal-client-wrapper.js +65 -0
- package/dist/daemon-internal-client-wrapper.js.map +1 -0
- package/dist/dashboard/aggregator.d.ts +12 -0
- package/dist/dashboard/aggregator.d.ts.map +1 -1
- package/dist/dashboard/aggregator.js +16 -0
- package/dist/dashboard/aggregator.js.map +1 -1
- package/dist/dashboard/auth.d.ts +7 -0
- package/dist/dashboard/auth.d.ts.map +1 -1
- package/dist/dashboard/auth.js +21 -0
- package/dist/dashboard/auth.js.map +1 -1
- package/dist/dashboard/card-model-types.d.ts +50 -0
- package/dist/dashboard/card-model-types.d.ts.map +1 -0
- package/dist/dashboard/card-model-types.js +9 -0
- package/dist/dashboard/card-model-types.js.map +1 -0
- package/dist/dashboard/daemon-internal-api.d.ts +90 -0
- package/dist/dashboard/daemon-internal-api.d.ts.map +1 -0
- package/dist/dashboard/daemon-internal-api.js +534 -0
- package/dist/dashboard/daemon-internal-api.js.map +1 -0
- package/dist/dashboard/daemon-internal-auth.d.ts +124 -0
- package/dist/dashboard/daemon-internal-auth.d.ts.map +1 -0
- package/dist/dashboard/daemon-internal-auth.js +188 -0
- package/dist/dashboard/daemon-internal-auth.js.map +1 -0
- package/dist/dashboard/daemon-internal-client.d.ts +67 -0
- package/dist/dashboard/daemon-internal-client.d.ts.map +1 -0
- package/dist/dashboard/daemon-internal-client.js +157 -0
- package/dist/dashboard/daemon-internal-client.js.map +1 -0
- package/dist/dashboard/dashboard-admins.d.ts +8 -0
- package/dist/dashboard/dashboard-admins.d.ts.map +1 -0
- package/dist/dashboard/dashboard-admins.js +15 -0
- package/dist/dashboard/dashboard-admins.js.map +1 -0
- package/dist/dashboard/federation-spoke-api.d.ts +3 -0
- package/dist/dashboard/federation-spoke-api.d.ts.map +1 -1
- package/dist/dashboard/federation-spoke-api.js +11 -8
- package/dist/dashboard/federation-spoke-api.js.map +1 -1
- package/dist/dashboard/groups-action-helpers.d.ts +69 -0
- package/dist/dashboard/groups-action-helpers.d.ts.map +1 -0
- package/dist/dashboard/groups-action-helpers.js +141 -0
- package/dist/dashboard/groups-action-helpers.js.map +1 -0
- package/dist/dashboard/groups-card-model.d.ts +120 -0
- package/dist/dashboard/groups-card-model.d.ts.map +1 -0
- package/dist/dashboard/groups-card-model.js +175 -0
- package/dist/dashboard/groups-card-model.js.map +1 -0
- package/dist/dashboard/schedule-card-model.d.ts +172 -0
- package/dist/dashboard/schedule-card-model.d.ts.map +1 -0
- package/dist/dashboard/schedule-card-model.js +290 -0
- package/dist/dashboard/schedule-card-model.js.map +1 -0
- package/dist/dashboard/session-card-model.d.ts +83 -0
- package/dist/dashboard/session-card-model.d.ts.map +1 -0
- package/dist/dashboard/session-card-model.js +196 -0
- package/dist/dashboard/session-card-model.js.map +1 -0
- package/dist/dashboard/settings-card-model.d.ts +73 -0
- package/dist/dashboard/settings-card-model.d.ts.map +1 -0
- package/dist/dashboard/settings-card-model.js +94 -0
- package/dist/dashboard/settings-card-model.js.map +1 -0
- package/dist/dashboard/settings-owner-resolver.d.ts +32 -0
- package/dist/dashboard/settings-owner-resolver.d.ts.map +1 -0
- package/dist/dashboard/settings-owner-resolver.js +43 -0
- package/dist/dashboard/settings-owner-resolver.js.map +1 -0
- package/dist/dashboard/settings-write-applier.d.ts +84 -0
- package/dist/dashboard/settings-write-applier.d.ts.map +1 -0
- package/dist/dashboard/settings-write-applier.js +119 -0
- package/dist/dashboard/settings-write-applier.js.map +1 -0
- package/dist/dashboard/workflow-api.d.ts.map +1 -1
- package/dist/dashboard/workflow-api.js +38 -119
- package/dist/dashboard/workflow-api.js.map +1 -1
- package/dist/dashboard/workflow-card-model.d.ts +127 -0
- package/dist/dashboard/workflow-card-model.d.ts.map +1 -0
- package/dist/dashboard/workflow-card-model.js +186 -0
- package/dist/dashboard/workflow-card-model.js.map +1 -0
- package/dist/dashboard/workflows-action-helpers.d.ts +105 -0
- package/dist/dashboard/workflows-action-helpers.d.ts.map +1 -0
- package/dist/dashboard/workflows-action-helpers.js +196 -0
- package/dist/dashboard/workflows-action-helpers.js.map +1 -0
- package/dist/dashboard.js +196 -271
- package/dist/dashboard.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +266 -0
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +266 -0
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/card-builder.d.ts +2 -0
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +2 -1
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts +54 -2
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +127 -1
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +22 -0
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/im/lark/groups-card.d.ts +90 -0
- package/dist/im/lark/groups-card.d.ts.map +1 -0
- package/dist/im/lark/groups-card.js +832 -0
- package/dist/im/lark/groups-card.js.map +1 -0
- package/dist/im/lark/overview-card.d.ts +101 -0
- package/dist/im/lark/overview-card.d.ts.map +1 -0
- package/dist/im/lark/overview-card.js +475 -0
- package/dist/im/lark/overview-card.js.map +1 -0
- package/dist/im/lark/schedules-card.d.ts +96 -0
- package/dist/im/lark/schedules-card.d.ts.map +1 -0
- package/dist/im/lark/schedules-card.js +892 -0
- package/dist/im/lark/schedules-card.js.map +1 -0
- package/dist/im/lark/sessions-card.d.ts +117 -0
- package/dist/im/lark/sessions-card.d.ts.map +1 -0
- package/dist/im/lark/sessions-card.js +870 -0
- package/dist/im/lark/sessions-card.js.map +1 -0
- package/dist/im/lark/settings-card.d.ts +125 -0
- package/dist/im/lark/settings-card.d.ts.map +1 -0
- package/dist/im/lark/settings-card.js +433 -0
- package/dist/im/lark/settings-card.js.map +1 -0
- package/dist/im/lark/workflows-card.d.ts +102 -0
- package/dist/im/lark/workflows-card.d.ts.map +1 -0
- package/dist/im/lark/workflows-card.js +737 -0
- package/dist/im/lark/workflows-card.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,534 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daemon-internal API — typed Route B server for `/__daemon/*`.
|
|
3
|
+
*
|
|
4
|
+
* Dispatch pipeline:
|
|
5
|
+
* 1) `verifyDaemonRequest` checks HMAC + loopback + ts ±60s + nonce replay.
|
|
6
|
+
* Reads the body stream EXACTLY ONCE and returns `bodyRaw`.
|
|
7
|
+
* 2) `bodyRaw` is JSON-parsed (empty body → `undefined`); a parse failure
|
|
8
|
+
* after a valid HMAC returns 400 `bad_json` without re-reading `req`.
|
|
9
|
+
* 3) Dispatch matches `(method, path)` against a typed allowlist
|
|
10
|
+
* endpoints — there is intentionally NO generic forward, so a daemon
|
|
11
|
+
* can never use Route B as a path-shifting proxy.
|
|
12
|
+
*
|
|
13
|
+
* Settings-write also enforces the union_id owner gate: the body must
|
|
14
|
+
* carry an `ownerUnionId` (`on_`-prefixed) that resolves to a candidate in
|
|
15
|
+
* the global owner set, or the request returns 403 `owner_only`.
|
|
16
|
+
*
|
|
17
|
+
* The factory exposes both `handle(req,res,url)` (production wiring) and
|
|
18
|
+
* `dispatchForTest(method, url, bodyRaw)` (skips HMAC for unit tests that
|
|
19
|
+
* focus on route shape; full HMAC flow is covered by daemon-internal-auth).
|
|
20
|
+
*/
|
|
21
|
+
import { createNonceStore, verifyDaemonRequest, } from './daemon-internal-auth.js';
|
|
22
|
+
import { addBotsToGroup, bindOncall, disbandGroup, leaveGroup, unbindOncall, } from './groups-action-helpers.js';
|
|
23
|
+
import { applySettingsWrite, } from './settings-write-applier.js';
|
|
24
|
+
import { isAuthorizedForGlobalSettings, } from './settings-owner-resolver.js';
|
|
25
|
+
import { listWorkflowRuns, runApproveReject, runCancel, } from './workflows-action-helpers.js';
|
|
26
|
+
/** ─── Helpers ──────────────────────────────────────────────────────── */
|
|
27
|
+
function parseStatusesParam(raw) {
|
|
28
|
+
if (raw === null)
|
|
29
|
+
return undefined;
|
|
30
|
+
const s = new Set(raw.split(',').map(x => x.trim()).filter(Boolean));
|
|
31
|
+
return s.size > 0 ? s : undefined;
|
|
32
|
+
}
|
|
33
|
+
async function readUpstream(upstream) {
|
|
34
|
+
const text = await upstream.text();
|
|
35
|
+
try {
|
|
36
|
+
return JSON.parse(text);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return text;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function bodyField(body, name) {
|
|
43
|
+
if (body && typeof body === 'object' && !Array.isArray(body)) {
|
|
44
|
+
return body[name];
|
|
45
|
+
}
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Generic per-bot scoping helper — restricts aggregator rows to those owned
|
|
50
|
+
* by the authenticated caller's bot.
|
|
51
|
+
*
|
|
52
|
+
* Default list reads are per-bot: a caller authenticated as bot A should not
|
|
53
|
+
* see bot B rows unless the route explicitly opts into `?scope=global`.
|
|
54
|
+
*
|
|
55
|
+
* Rows whose owner getter returns undefined / empty string (legacy
|
|
56
|
+
* persistence shape) are KEPT so they don't disappear from a freshly-
|
|
57
|
+
* upgraded deploy. callerAppId === undefined means the test seam
|
|
58
|
+
* (`dispatchForTest`) is in use; the test is trusted to assert its own
|
|
59
|
+
* scope so we pass everything through.
|
|
60
|
+
*
|
|
61
|
+
* The owner getter argument lets workflows (nested
|
|
62
|
+
* `chatBinding.larkAppId`) reuse the same filter pipeline as sessions /
|
|
63
|
+
* schedules (top-level `larkAppId`).
|
|
64
|
+
*/
|
|
65
|
+
function scopeRowsByCaller(rows, callerAppId, getOwnerAppId) {
|
|
66
|
+
if (!callerAppId)
|
|
67
|
+
return rows.slice();
|
|
68
|
+
return rows.filter(r => {
|
|
69
|
+
const owner = getOwnerAppId(r);
|
|
70
|
+
// Keep legacy rows (no owner resolvable) so a fresh deploy doesn't lose them.
|
|
71
|
+
if (typeof owner !== 'string' || owner.length === 0)
|
|
72
|
+
return true;
|
|
73
|
+
return owner === callerAppId;
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Thin wrapper around `scopeRowsByCaller` for rows with a top-level
|
|
78
|
+
* `larkAppId` field (sessions / schedules / aggregator-shape). Workflows
|
|
79
|
+
* call `scopeRowsByCaller` directly with their own owner getter.
|
|
80
|
+
*/
|
|
81
|
+
function scopeByCaller(rows, callerAppId) {
|
|
82
|
+
return scopeRowsByCaller(rows, callerAppId, r => r?.larkAppId);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Per-bot scoping for the `groups-matrix` endpoint.
|
|
86
|
+
*
|
|
87
|
+
* The groups matrix returns `{ chats, bots }` where neither container has a
|
|
88
|
+
* top-level `larkAppId`, so the generic `scopeByCaller` / `scopeRowsByCaller`
|
|
89
|
+
* helpers don't fit. Default fail-closed rules:
|
|
90
|
+
*
|
|
91
|
+
* - bots: filter to ONLY entries whose `larkAppId === callerAppId`.
|
|
92
|
+
* - chats: keep ONLY chats where some memberBots entry has
|
|
93
|
+
* `larkAppId === callerAppId AND inChat === true`. A bot that's listed as
|
|
94
|
+
* a member but `inChat=false` does NOT qualify.
|
|
95
|
+
* - each retained chat's `memberBots` is trimmed to JUST the caller's
|
|
96
|
+
* single entry, so other bots' roster never leaks.
|
|
97
|
+
* - NO legacy fallback: rows / bots without a recognized `larkAppId` are
|
|
98
|
+
* dropped (fail-closed). Unlike sessions / schedules, the groups matrix
|
|
99
|
+
* has no historical persistence shape to preserve.
|
|
100
|
+
*
|
|
101
|
+
* `callerAppId === undefined` is the `dispatchForTest` seam — pass through
|
|
102
|
+
* the full unscoped matrix so tests can assert raw aggregator output.
|
|
103
|
+
*
|
|
104
|
+
* The helper does NOT mutate the input matrix: each kept chat is spread into
|
|
105
|
+
* a new object before its `memberBots` is overwritten.
|
|
106
|
+
*/
|
|
107
|
+
function scopeGroupsMatrixByCaller(matrix, callerAppId) {
|
|
108
|
+
if (callerAppId === undefined)
|
|
109
|
+
return matrix;
|
|
110
|
+
const filteredBots = matrix.bots.filter(b => typeof b?.larkAppId === 'string' &&
|
|
111
|
+
b.larkAppId === callerAppId);
|
|
112
|
+
const filteredChats = [];
|
|
113
|
+
for (const c of matrix.chats) {
|
|
114
|
+
const members = c?.memberBots;
|
|
115
|
+
if (!Array.isArray(members))
|
|
116
|
+
continue;
|
|
117
|
+
const ourMember = members.find(m => m?.larkAppId === callerAppId && m?.inChat === true);
|
|
118
|
+
if (!ourMember)
|
|
119
|
+
continue;
|
|
120
|
+
filteredChats.push({ ...c, memberBots: [ourMember] });
|
|
121
|
+
}
|
|
122
|
+
return { chats: filteredChats, bots: filteredBots };
|
|
123
|
+
}
|
|
124
|
+
/** ─── Route table ────────────────────────────────────────────────── */
|
|
125
|
+
const ROUTES = [
|
|
126
|
+
// ── READ ──────────────────────────────
|
|
127
|
+
{
|
|
128
|
+
method: 'GET',
|
|
129
|
+
pathRe: /^\/__daemon\/sessions-list$/,
|
|
130
|
+
handle: async (_m, ctx, deps) => {
|
|
131
|
+
const isGlobal = ctx.url.searchParams.get('scope') === 'global';
|
|
132
|
+
const sessions = isGlobal
|
|
133
|
+
? deps.getSessions()
|
|
134
|
+
: scopeByCaller(deps.getSessions(), ctx.callerAppId);
|
|
135
|
+
return { status: 200, body: { sessions } };
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
// Dedicated schedules list endpoint. `?scope=global` widens only the read
|
|
139
|
+
// row set; HMAC, admin, invoker, and write owner-routing gates are unchanged.
|
|
140
|
+
{
|
|
141
|
+
method: 'GET',
|
|
142
|
+
pathRe: /^\/__daemon\/schedules-list$/,
|
|
143
|
+
handle: async (_m, ctx, deps) => {
|
|
144
|
+
const isGlobal = ctx.url.searchParams.get('scope') === 'global';
|
|
145
|
+
const schedules = isGlobal
|
|
146
|
+
? deps.getSchedules()
|
|
147
|
+
: scopeByCaller(deps.getSchedules(), ctx.callerAppId);
|
|
148
|
+
return { status: 200, body: { schedules } };
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
method: 'GET',
|
|
153
|
+
pathRe: /^\/__daemon\/settings-snapshot$/,
|
|
154
|
+
handle: async (_m, _ctx, deps) => ({ status: 200, body: { settings: deps.resolveDashboardSettings() } }),
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
method: 'GET',
|
|
158
|
+
pathRe: /^\/__daemon\/groups-matrix$/,
|
|
159
|
+
handle: async (_m, ctx, deps) => {
|
|
160
|
+
// Default: per-bot owner gate. Filter the matrix so the caller's bot
|
|
161
|
+
// only sees rows where it's actually a member (`inChat`), and trim
|
|
162
|
+
// each chat's memberBots to the caller's single entry to avoid leaking
|
|
163
|
+
// other bots' membership state.
|
|
164
|
+
//
|
|
165
|
+
// `?scope=global`: `/dashboard` is a Bot Owner global tool panel, so
|
|
166
|
+
// return the full matrix. HMAC / owner / invoker gates are unchanged;
|
|
167
|
+
// only the read row scope widens.
|
|
168
|
+
const matrix = await deps.buildGroupsMatrix();
|
|
169
|
+
const scoped = ctx.url.searchParams.get('scope') === 'global'
|
|
170
|
+
? matrix
|
|
171
|
+
: scopeGroupsMatrixByCaller(matrix, ctx.callerAppId);
|
|
172
|
+
return { status: 200, body: scoped };
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
method: 'GET',
|
|
177
|
+
pathRe: /^\/__daemon\/workflows-runs-snapshot$/,
|
|
178
|
+
handle: async (_m, ctx, deps) => {
|
|
179
|
+
const query = {
|
|
180
|
+
all: ctx.url.searchParams.get('all') === '1',
|
|
181
|
+
statuses: parseStatusesParam(ctx.url.searchParams.get('status')),
|
|
182
|
+
};
|
|
183
|
+
// listWorkflowRuns returns HandlerResult, not a raw array. Filter only
|
|
184
|
+
// successful `{ runs }` bodies; pass through errors and malformed bodies
|
|
185
|
+
// so callers see the real failure instead of an empty list.
|
|
186
|
+
const result = await listWorkflowRuns(query, deps.workflowsActionDeps);
|
|
187
|
+
if (result.status === 200 &&
|
|
188
|
+
result.body &&
|
|
189
|
+
typeof result.body === 'object' &&
|
|
190
|
+
Array.isArray(result.body.runs)) {
|
|
191
|
+
const runs = result.body.runs;
|
|
192
|
+
const scoped = ctx.url.searchParams.get('scope') === 'global'
|
|
193
|
+
? runs.slice()
|
|
194
|
+
: scopeRowsByCaller(runs, ctx.callerAppId, r => r?.chatBinding?.larkAppId);
|
|
195
|
+
return {
|
|
196
|
+
status: 200,
|
|
197
|
+
body: { ...result.body, runs: scoped },
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
return result;
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
method: 'GET',
|
|
205
|
+
pathRe: /^\/__daemon\/overview-snapshot$/,
|
|
206
|
+
handle: async (_m, ctx, deps) => {
|
|
207
|
+
// Default: apply the same per-bot scoping as the dedicated list
|
|
208
|
+
// endpoints when overview bundles aggregator state.
|
|
209
|
+
//
|
|
210
|
+
// `?scope=global`: `/dashboard` is a global tool panel. All list
|
|
211
|
+
// modules except settings widen their read scope together; settings
|
|
212
|
+
// remains per-calling-bot until it has an explicit global write model.
|
|
213
|
+
const isGlobal = ctx.url.searchParams.get('scope') === 'global';
|
|
214
|
+
const groups = await deps.buildGroupsMatrix();
|
|
215
|
+
return {
|
|
216
|
+
status: 200,
|
|
217
|
+
body: {
|
|
218
|
+
sessions: isGlobal
|
|
219
|
+
? deps.getSessions()
|
|
220
|
+
: scopeByCaller(deps.getSessions(), ctx.callerAppId),
|
|
221
|
+
schedules: isGlobal
|
|
222
|
+
? deps.getSchedules()
|
|
223
|
+
: scopeByCaller(deps.getSchedules(), ctx.callerAppId),
|
|
224
|
+
settings: deps.resolveDashboardSettings(),
|
|
225
|
+
groups,
|
|
226
|
+
},
|
|
227
|
+
};
|
|
228
|
+
},
|
|
229
|
+
},
|
|
230
|
+
// ── WRITE: settings ───────────────────
|
|
231
|
+
{
|
|
232
|
+
method: 'PUT',
|
|
233
|
+
pathRe: /^\/__daemon\/settings-write$/,
|
|
234
|
+
handle: async (_m, ctx, deps) => {
|
|
235
|
+
const ownerUnionId = bodyField(ctx.body, 'ownerUnionId');
|
|
236
|
+
const allowed = await isAuthorizedForGlobalSettings({ senderUnionId: typeof ownerUnionId === 'string' ? ownerUnionId : undefined }, deps.settingsOwnerDeps);
|
|
237
|
+
if (!allowed)
|
|
238
|
+
return { status: 403, body: { ok: false, error: 'owner_only' } };
|
|
239
|
+
const patch = bodyField(ctx.body, 'patch');
|
|
240
|
+
const r = await applySettingsWrite(patch, deps.settingsApplierDeps);
|
|
241
|
+
if (!r.ok)
|
|
242
|
+
return { status: 400, body: { ok: false, error: r.error } };
|
|
243
|
+
return { status: 200, body: { ok: true, settings: r.settings } };
|
|
244
|
+
},
|
|
245
|
+
},
|
|
246
|
+
// ── WRITE: sessions × 3 ───────────────
|
|
247
|
+
{
|
|
248
|
+
method: 'POST',
|
|
249
|
+
pathRe: /^\/__daemon\/sessions\/([^/]+)\/(close|resume|locate)$/,
|
|
250
|
+
handle: async (m, ctx, deps) => {
|
|
251
|
+
const sessionId = decodeURIComponent(m[1]);
|
|
252
|
+
const action = m[2];
|
|
253
|
+
// Three-state routing mirrors schedules:
|
|
254
|
+
// - owner !== undefined + caller mismatch → 403 session_owner_mismatch
|
|
255
|
+
// - owner !== undefined + caller match (or test seam) → proxy owner
|
|
256
|
+
// - owner === undefined + sessionExists + callerAppId set → legacy,
|
|
257
|
+
// proxy to caller's bot (same bot that fetched the row via the
|
|
258
|
+
// scoped read endpoint).
|
|
259
|
+
// - row genuinely missing → 404 unknown_session
|
|
260
|
+
// Route B fails closed too, not only the IM card layer.
|
|
261
|
+
const owner = deps.ownerOf(sessionId);
|
|
262
|
+
if (owner === undefined) {
|
|
263
|
+
if (!deps.sessionExists(sessionId)) {
|
|
264
|
+
return { status: 404, body: { ok: false, error: 'unknown_session' } };
|
|
265
|
+
}
|
|
266
|
+
if (ctx.callerAppId === undefined) {
|
|
267
|
+
// test seam preserves the historical 404 — production callers
|
|
268
|
+
// always have an HMAC-resolved appId.
|
|
269
|
+
return { status: 404, body: { ok: false, error: 'unknown_session' } };
|
|
270
|
+
}
|
|
271
|
+
const upstream = await deps.proxyToDaemon(ctx.callerAppId, `/api/sessions/${encodeURIComponent(sessionId)}/${action}`, {
|
|
272
|
+
method: 'POST',
|
|
273
|
+
headers: { 'content-type': 'application/json' },
|
|
274
|
+
body: ctx.bodyRaw.length > 0 ? ctx.bodyRaw : '{}',
|
|
275
|
+
});
|
|
276
|
+
return { status: upstream.status, body: await readUpstream(upstream) };
|
|
277
|
+
}
|
|
278
|
+
const isGlobal = ctx.url.searchParams.get('scope') === 'global';
|
|
279
|
+
if (!isGlobal && ctx.callerAppId !== undefined && owner !== ctx.callerAppId) {
|
|
280
|
+
return { status: 403, body: { ok: false, error: 'session_owner_mismatch' } };
|
|
281
|
+
}
|
|
282
|
+
const upstream = await deps.proxyToDaemon(owner, `/api/sessions/${encodeURIComponent(sessionId)}/${action}`, {
|
|
283
|
+
method: 'POST',
|
|
284
|
+
headers: { 'content-type': 'application/json' },
|
|
285
|
+
body: ctx.bodyRaw.length > 0 ? ctx.bodyRaw : '{}',
|
|
286
|
+
});
|
|
287
|
+
return { status: upstream.status, body: await readUpstream(upstream) };
|
|
288
|
+
},
|
|
289
|
+
},
|
|
290
|
+
// ── WRITE: groups × 5 ─────────────────
|
|
291
|
+
{
|
|
292
|
+
method: 'POST',
|
|
293
|
+
pathRe: /^\/__daemon\/groups\/([^/]+)\/leave$/,
|
|
294
|
+
handle: async (m, ctx, deps) => leaveGroup(decodeURIComponent(m[1]), ctx.body, deps.groupsActionDeps),
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
method: 'POST',
|
|
298
|
+
pathRe: /^\/__daemon\/groups\/([^/]+)\/disband$/,
|
|
299
|
+
handle: async (m, ctx, deps) => disbandGroup(decodeURIComponent(m[1]), ctx.body, deps.groupsActionDeps),
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
method: 'POST',
|
|
303
|
+
pathRe: /^\/__daemon\/groups\/([^/]+)\/add-bots$/,
|
|
304
|
+
handle: async (m, ctx, deps) => addBotsToGroup(decodeURIComponent(m[1]), ctx.bodyRaw, deps.groupsActionDeps),
|
|
305
|
+
},
|
|
306
|
+
{
|
|
307
|
+
method: 'POST',
|
|
308
|
+
pathRe: /^\/__daemon\/groups\/([^/]+)\/oncall\/([^/]+)\/bind$/,
|
|
309
|
+
handle: async (m, ctx, deps) => bindOncall(decodeURIComponent(m[1]), decodeURIComponent(m[2]), ctx.bodyRaw, deps.groupsActionDeps),
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
method: 'POST',
|
|
313
|
+
pathRe: /^\/__daemon\/groups\/([^/]+)\/oncall\/([^/]+)\/unbind$/,
|
|
314
|
+
handle: async (m, _ctx, deps) => unbindOncall(decodeURIComponent(m[1]), decodeURIComponent(m[2]), deps.groupsActionDeps),
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
method: 'GET',
|
|
318
|
+
pathRe: /^\/__daemon\/groups\/([^/]+)\/roles\/([^/]+)$/,
|
|
319
|
+
handle: async (m, _ctx, deps) => {
|
|
320
|
+
const chatId = decodeURIComponent(m[1]);
|
|
321
|
+
const appId = decodeURIComponent(m[2]);
|
|
322
|
+
const upstream = await deps.proxyToDaemon(appId, `/api/roles/${encodeURIComponent(chatId)}`, { method: 'GET' });
|
|
323
|
+
return { status: upstream.status, body: await readUpstream(upstream) };
|
|
324
|
+
},
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
method: 'PUT',
|
|
328
|
+
pathRe: /^\/__daemon\/groups\/([^/]+)\/roles\/([^/]+)$/,
|
|
329
|
+
handle: async (m, ctx, deps) => {
|
|
330
|
+
const chatId = decodeURIComponent(m[1]);
|
|
331
|
+
const appId = decodeURIComponent(m[2]);
|
|
332
|
+
const upstream = await deps.proxyToDaemon(appId, `/api/roles/${encodeURIComponent(chatId)}`, {
|
|
333
|
+
method: 'PUT',
|
|
334
|
+
headers: { 'content-type': 'application/json' },
|
|
335
|
+
body: ctx.bodyRaw.length > 0 ? ctx.bodyRaw : '{}',
|
|
336
|
+
});
|
|
337
|
+
return { status: upstream.status, body: await readUpstream(upstream) };
|
|
338
|
+
},
|
|
339
|
+
},
|
|
340
|
+
{
|
|
341
|
+
method: 'DELETE',
|
|
342
|
+
pathRe: /^\/__daemon\/groups\/([^/]+)\/roles\/([^/]+)$/,
|
|
343
|
+
handle: async (m, _ctx, deps) => {
|
|
344
|
+
const chatId = decodeURIComponent(m[1]);
|
|
345
|
+
const appId = decodeURIComponent(m[2]);
|
|
346
|
+
const upstream = await deps.proxyToDaemon(appId, `/api/roles/${encodeURIComponent(chatId)}`, { method: 'DELETE' });
|
|
347
|
+
return { status: upstream.status, body: await readUpstream(upstream) };
|
|
348
|
+
},
|
|
349
|
+
},
|
|
350
|
+
// ── WRITE: workflows × 3 ──────────────
|
|
351
|
+
//
|
|
352
|
+
// Cross-bot owner gate. The workflow helpers resolve routing from
|
|
353
|
+
// readRunSnapshot, so Route B checks the owner before proxying. Unlike
|
|
354
|
+
// sessions/schedules, workflows have no legacy "proxy to caller" fallback:
|
|
355
|
+
// a run without chatBinding has no routable owner and should fall through to
|
|
356
|
+
// the helper's existing 409 (`needs_lark_or_cli` / `needs_cli_cancel`).
|
|
357
|
+
//
|
|
358
|
+
// - snapshot null → 404 unknown_run (don't expose the helper's
|
|
359
|
+
// non-existent run path)
|
|
360
|
+
// - owner !== undefined + caller mismatch → 403 workflow_owner_mismatch
|
|
361
|
+
// - owner !== undefined + caller match (or test seam) → fall through
|
|
362
|
+
// - owner === undefined → fall through (helper returns 409)
|
|
363
|
+
//
|
|
364
|
+
// Apply the same gate to approve/reject even if the current card only
|
|
365
|
+
// exposes cancel.
|
|
366
|
+
{
|
|
367
|
+
method: 'POST',
|
|
368
|
+
pathRe: /^\/__daemon\/workflows-runs\/([^/]+)\/(approve|reject)$/,
|
|
369
|
+
handle: async (m, ctx, deps) => {
|
|
370
|
+
const runId = decodeURIComponent(m[1]);
|
|
371
|
+
const action = m[2];
|
|
372
|
+
// Preserve bad-input semantics: invalid ids return 400 bad_run_id rather
|
|
373
|
+
// than being shadowed as 404 unknown_run by the owner snapshot lookup.
|
|
374
|
+
if (!deps.workflowsActionDeps.isValidRunId(runId)) {
|
|
375
|
+
return { status: 400, body: { ok: false, error: 'bad_run_id' } };
|
|
376
|
+
}
|
|
377
|
+
const snap = await deps.workflowsActionDeps.readRunSnapshot(deps.workflowsActionDeps.runsDir, runId);
|
|
378
|
+
if (!snap)
|
|
379
|
+
return { status: 404, body: { ok: false, error: 'unknown_run' } };
|
|
380
|
+
const owner = snap.chatBinding?.larkAppId;
|
|
381
|
+
const isGlobal = ctx.url.searchParams.get('scope') === 'global';
|
|
382
|
+
if (!isGlobal && owner !== undefined && ctx.callerAppId !== undefined && owner !== ctx.callerAppId) {
|
|
383
|
+
return { status: 403, body: { ok: false, error: 'workflow_owner_mismatch' } };
|
|
384
|
+
}
|
|
385
|
+
return runApproveReject(runId, action, ctx.bodyRaw, deps.workflowsActionDeps);
|
|
386
|
+
},
|
|
387
|
+
},
|
|
388
|
+
{
|
|
389
|
+
method: 'POST',
|
|
390
|
+
pathRe: /^\/__daemon\/workflows-runs\/([^/]+)\/cancel$/,
|
|
391
|
+
handle: async (m, ctx, deps) => {
|
|
392
|
+
const runId = decodeURIComponent(m[1]);
|
|
393
|
+
// Preserve the same bad-input semantics as approve/reject.
|
|
394
|
+
if (!deps.workflowsActionDeps.isValidRunId(runId)) {
|
|
395
|
+
return { status: 400, body: { ok: false, error: 'bad_run_id' } };
|
|
396
|
+
}
|
|
397
|
+
const snap = await deps.workflowsActionDeps.readRunSnapshot(deps.workflowsActionDeps.runsDir, runId);
|
|
398
|
+
if (!snap)
|
|
399
|
+
return { status: 404, body: { ok: false, error: 'unknown_run' } };
|
|
400
|
+
const owner = snap.chatBinding?.larkAppId;
|
|
401
|
+
const isGlobal = ctx.url.searchParams.get('scope') === 'global';
|
|
402
|
+
if (!isGlobal && owner !== undefined && ctx.callerAppId !== undefined && owner !== ctx.callerAppId) {
|
|
403
|
+
return { status: 403, body: { ok: false, error: 'workflow_owner_mismatch' } };
|
|
404
|
+
}
|
|
405
|
+
return runCancel(runId, ctx.bodyRaw, deps.workflowsActionDeps);
|
|
406
|
+
},
|
|
407
|
+
},
|
|
408
|
+
// ── WRITE: schedules × 4 ──────────────
|
|
409
|
+
{
|
|
410
|
+
method: 'POST',
|
|
411
|
+
pathRe: /^\/__daemon\/schedules\/([^/]+)\/(run|pause|resume|delivery)$/,
|
|
412
|
+
handle: async (m, ctx, deps) => {
|
|
413
|
+
const id = decodeURIComponent(m[1]);
|
|
414
|
+
const action = m[2];
|
|
415
|
+
// Three-state routing:
|
|
416
|
+
// - row missing entirely → 404 unknown_schedule
|
|
417
|
+
// - row present with larkAppId → cross-bot gate (403 on mismatch)
|
|
418
|
+
// - row present WITHOUT larkAppId (legacy, e.g. pre-v0.4 persistence)
|
|
419
|
+
// → proxy to the caller's own bot. legacy rows are kept visible
|
|
420
|
+
// in the read path (`scopeByCaller` short-circuits when caller is
|
|
421
|
+
// undefined OR when the row has no owner) AND continue to be
|
|
422
|
+
// executed by `scheduler.belongsToOwner` on the primary daemon.
|
|
423
|
+
// Without this branch, the user would see the row + actionable
|
|
424
|
+
// buttons but every POST would 404. With this branch, the caller's
|
|
425
|
+
// bot proxies the action just like an explicit-owner row would.
|
|
426
|
+
const owner = deps.scheduleOwnerOf(id);
|
|
427
|
+
if (owner === undefined) {
|
|
428
|
+
if (!deps.scheduleExists(id)) {
|
|
429
|
+
return { status: 404, body: { ok: false, error: 'unknown_schedule' } };
|
|
430
|
+
}
|
|
431
|
+
// Legacy row. Production: route to the authenticated caller's bot.
|
|
432
|
+
// Test seam (callerAppId undefined): preserve historical behaviour
|
|
433
|
+
// (404) so existing dispatchForTest tests stay deterministic.
|
|
434
|
+
if (ctx.callerAppId === undefined) {
|
|
435
|
+
return { status: 404, body: { ok: false, error: 'unknown_schedule' } };
|
|
436
|
+
}
|
|
437
|
+
const upstream = await deps.proxyToDaemon(ctx.callerAppId, `/api/schedules/${encodeURIComponent(id)}/${action}`, {
|
|
438
|
+
method: 'POST',
|
|
439
|
+
headers: { 'content-type': 'application/json' },
|
|
440
|
+
body: ctx.bodyRaw.length > 0 ? ctx.bodyRaw : '{}',
|
|
441
|
+
});
|
|
442
|
+
return { status: upstream.status, body: await readUpstream(upstream) };
|
|
443
|
+
}
|
|
444
|
+
// Owned row. Cross-bot guard: refuse when the caller is not the
|
|
445
|
+
// owning bot. test seam keeps the historical pass-through.
|
|
446
|
+
//
|
|
447
|
+
// In global dashboard scope, the card can show rows from any bot. We
|
|
448
|
+
// still proxy to the row's true owner daemon, so global only changes
|
|
449
|
+
// "owner exists + caller mismatch" from 403 to "proxy owner".
|
|
450
|
+
const isGlobal = ctx.url.searchParams.get('scope') === 'global';
|
|
451
|
+
if (!isGlobal && ctx.callerAppId !== undefined && owner !== ctx.callerAppId) {
|
|
452
|
+
return { status: 403, body: { ok: false, error: 'schedule_owner_mismatch' } };
|
|
453
|
+
}
|
|
454
|
+
const upstream = await deps.proxyToDaemon(owner, `/api/schedules/${encodeURIComponent(id)}/${action}`, {
|
|
455
|
+
method: 'POST',
|
|
456
|
+
headers: { 'content-type': 'application/json' },
|
|
457
|
+
body: ctx.bodyRaw.length > 0 ? ctx.bodyRaw : '{}',
|
|
458
|
+
});
|
|
459
|
+
return { status: upstream.status, body: await readUpstream(upstream) };
|
|
460
|
+
},
|
|
461
|
+
},
|
|
462
|
+
];
|
|
463
|
+
Object.freeze(ROUTES);
|
|
464
|
+
for (const r of ROUTES)
|
|
465
|
+
Object.freeze(r);
|
|
466
|
+
/**
|
|
467
|
+
* Pure dispatcher: matches `(method, path)` against the typed allowlist.
|
|
468
|
+
* Returns `unknown_endpoint` (404) when no path matches, `method_not_allowed`
|
|
469
|
+
* (405) when a path matches but the method does not, or hands off to the
|
|
470
|
+
* matched handler.
|
|
471
|
+
*/
|
|
472
|
+
export async function dispatchDaemonInternalRequest(method, url, bodyRaw, deps, callerAppId) {
|
|
473
|
+
let body = undefined;
|
|
474
|
+
if (bodyRaw.length > 0) {
|
|
475
|
+
try {
|
|
476
|
+
body = JSON.parse(bodyRaw);
|
|
477
|
+
}
|
|
478
|
+
catch {
|
|
479
|
+
return { status: 400, body: { ok: false, error: 'bad_json' } };
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
const ctx = { bodyRaw, body, url, callerAppId };
|
|
483
|
+
let pathMatchedButMethodWrong = false;
|
|
484
|
+
for (const route of ROUTES) {
|
|
485
|
+
const m = url.pathname.match(route.pathRe);
|
|
486
|
+
if (!m)
|
|
487
|
+
continue;
|
|
488
|
+
if (route.method !== method) {
|
|
489
|
+
pathMatchedButMethodWrong = true;
|
|
490
|
+
continue;
|
|
491
|
+
}
|
|
492
|
+
return route.handle(m, ctx, deps);
|
|
493
|
+
}
|
|
494
|
+
if (pathMatchedButMethodWrong) {
|
|
495
|
+
return { status: 405, body: { ok: false, error: 'method_not_allowed' } };
|
|
496
|
+
}
|
|
497
|
+
return { status: 404, body: { ok: false, error: 'unknown_endpoint' } };
|
|
498
|
+
}
|
|
499
|
+
/** Render a HandlerResult onto a ServerResponse. */
|
|
500
|
+
function writeHandlerResult(res, result) {
|
|
501
|
+
const headers = { 'content-type': 'application/json', ...(result.headers ?? {}) };
|
|
502
|
+
res.writeHead(result.status, headers);
|
|
503
|
+
res.end(typeof result.body === 'string' ? result.body : JSON.stringify(result.body));
|
|
504
|
+
}
|
|
505
|
+
export function createDaemonInternalApi(deps) {
|
|
506
|
+
const nonceStore = deps.nonceStore ?? createNonceStore();
|
|
507
|
+
async function handle(req, res, url) {
|
|
508
|
+
// ⚠️ Source-of-truth for both the `/__daemon/` gate and dispatch routing
|
|
509
|
+
// MUST be `req.url` (the exact bytes the HMAC was computed over). The
|
|
510
|
+
// caller's `url` is only trusted for its `origin` so URL parsing succeeds.
|
|
511
|
+
// Decoupling these allows a signature minted for path X to drive
|
|
512
|
+
// dispatch to path Y if a caller passes a mismatched `url`.
|
|
513
|
+
const reqPath = req.url ?? '/';
|
|
514
|
+
const requestUrl = new URL(reqPath, url.origin);
|
|
515
|
+
if (!requestUrl.pathname.startsWith('/__daemon/'))
|
|
516
|
+
return false;
|
|
517
|
+
const verify = await verifyDaemonRequest(req, deps.secret, nonceStore, { clock: deps.clock });
|
|
518
|
+
if (!verify.ok) {
|
|
519
|
+
writeHandlerResult(res, {
|
|
520
|
+
status: verify.httpStatus,
|
|
521
|
+
body: { ok: false, error: verify.reason },
|
|
522
|
+
});
|
|
523
|
+
return true;
|
|
524
|
+
}
|
|
525
|
+
const result = await dispatchDaemonInternalRequest(req.method ?? 'GET', requestUrl, verify.bodyRaw, deps, verify.appId);
|
|
526
|
+
writeHandlerResult(res, result);
|
|
527
|
+
return true;
|
|
528
|
+
}
|
|
529
|
+
async function dispatchForTest(method, url, bodyRaw = '', callerAppId) {
|
|
530
|
+
return dispatchDaemonInternalRequest(method, url, bodyRaw, deps, callerAppId);
|
|
531
|
+
}
|
|
532
|
+
return { handle, dispatchForTest };
|
|
533
|
+
}
|
|
534
|
+
//# sourceMappingURL=daemon-internal-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-internal-api.js","sourceRoot":"","sources":["../../src/dashboard/daemon-internal-api.ts"],"names":[],"mappings":"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"}
|