botmux 3.11.0 → 3.12.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/.runtime-build-id +1 -1
- package/dist/adapters/backend/riff-backend.d.ts.map +1 -1
- package/dist/adapters/backend/riff-backend.js +11 -2
- package/dist/adapters/backend/riff-backend.js.map +1 -1
- package/dist/adapters/cli/coco.js +3 -3
- package/dist/adapters/cli/coco.js.map +1 -1
- package/dist/adapters/cli/codex.js +2 -2
- package/dist/adapters/cli/codex.js.map +1 -1
- package/dist/cli/dashboard-command.d.ts +23 -0
- package/dist/cli/dashboard-command.d.ts.map +1 -0
- package/dist/cli/dashboard-command.js +61 -0
- package/dist/cli/dashboard-command.js.map +1 -0
- package/dist/cli/dashboard-endpoint.d.ts +3 -3
- package/dist/cli/dashboard-endpoint.d.ts.map +1 -1
- package/dist/cli/dashboard-endpoint.js +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +36 -22
- package/dist/cli.js.map +1 -1
- package/dist/codex-rpc-engine.d.ts +33 -3
- package/dist/codex-rpc-engine.d.ts.map +1 -1
- package/dist/codex-rpc-engine.js +182 -20
- package/dist/codex-rpc-engine.js.map +1 -1
- package/dist/codex-rpc-lifecycle.d.ts +42 -7
- package/dist/codex-rpc-lifecycle.d.ts.map +1 -1
- package/dist/codex-rpc-lifecycle.js +73 -7
- package/dist/codex-rpc-lifecycle.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.js +1 -1
- package/dist/core/command-handler.d.ts +3 -2
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +3 -2
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +15 -10
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/dispatch.d.ts +9 -10
- package/dist/core/dispatch.d.ts.map +1 -1
- package/dist/core/dispatch.js +17 -10
- package/dist/core/dispatch.js.map +1 -1
- package/dist/core/role-resolver.d.ts +5 -2
- package/dist/core/role-resolver.d.ts.map +1 -1
- package/dist/core/role-resolver.js +55 -23
- package/dist/core/role-resolver.js.map +1 -1
- package/dist/core/session-manager.d.ts +2 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +20 -18
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/terminal-write-auth.d.ts +4 -4
- package/dist/core/terminal-write-auth.d.ts.map +1 -1
- package/dist/core/terminal-write-auth.js +18 -6
- package/dist/core/terminal-write-auth.js.map +1 -1
- package/dist/daemon.d.ts +1 -0
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +101 -12
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/auth.d.ts +21 -11
- package/dist/dashboard/auth.d.ts.map +1 -1
- package/dist/dashboard/auth.js +39 -25
- package/dist/dashboard/auth.js.map +1 -1
- package/dist/dashboard/bot-payload.d.ts +0 -1
- package/dist/dashboard/bot-payload.d.ts.map +1 -1
- package/dist/dashboard/bot-payload.js +0 -1
- package/dist/dashboard/bot-payload.js.map +1 -1
- package/dist/dashboard/dashboard-summary-endpoint.d.ts +39 -0
- package/dist/dashboard/dashboard-summary-endpoint.d.ts.map +1 -0
- package/dist/dashboard/dashboard-summary-endpoint.js +50 -0
- package/dist/dashboard/dashboard-summary-endpoint.js.map +1 -0
- package/dist/dashboard/dashboard-summary.d.ts +62 -0
- package/dist/dashboard/dashboard-summary.d.ts.map +1 -0
- package/dist/dashboard/dashboard-summary.js +106 -0
- package/dist/dashboard/dashboard-summary.js.map +1 -0
- package/dist/dashboard/web/feed-group-picker.d.ts +13 -0
- package/dist/dashboard/web/feed-group-picker.d.ts.map +1 -0
- package/dist/dashboard/web/feed-group-picker.js +45 -0
- package/dist/dashboard/web/feed-group-picker.js.map +1 -0
- package/dist/dashboard/web/groups-page.d.ts.map +1 -1
- package/dist/dashboard/web/groups-page.js +2 -5
- package/dist/dashboard/web/groups-page.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +8 -14
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/roles-page.d.ts.map +1 -1
- package/dist/dashboard/web/roles-page.js +36 -4
- package/dist/dashboard/web/roles-page.js.map +1 -1
- package/dist/dashboard/web/roles.d.ts +3 -1
- package/dist/dashboard/web/roles.d.ts.map +1 -1
- package/dist/dashboard/web/roles.js +10 -2
- package/dist/dashboard/web/roles.js.map +1 -1
- package/dist/dashboard/web/schedules-page.d.ts.map +1 -1
- package/dist/dashboard/web/schedules-page.js +8 -2
- package/dist/dashboard/web/schedules-page.js.map +1 -1
- package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
- package/dist/dashboard/web/sessions-page.js +2 -2
- package/dist/dashboard/web/sessions-page.js.map +1 -1
- package/dist/dashboard-web/app.js +1 -1
- package/dist/dashboard-web/chunks/{bot-defaults-page-GED4FEMS.js → bot-defaults-page-USC6EZXP.js} +1 -1
- package/dist/dashboard-web/chunks/chunk-6ALR252E.js +1 -0
- package/dist/dashboard-web/chunks/{chunk-VBXJOJFH.js → chunk-A7VC4BXR.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-HK7NIBJG.js → chunk-KOPISPHN.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-6J5LS5AU.js → chunk-M6BHWQFO.js} +6 -6
- package/dist/dashboard-web/chunks/{chunk-KRHWZEXU.js → chunk-RXRJB5SO.js} +1 -1
- package/dist/dashboard-web/chunks/{connectors-page-EELM66G3.js → connectors-page-4Z76HWRH.js} +1 -1
- package/dist/dashboard-web/chunks/groups-page-C6NSDTIN.js +8 -0
- package/dist/dashboard-web/chunks/{insights-page-54UBPPOC.js → insights-page-UTOVYLLY.js} +1 -1
- package/dist/dashboard-web/chunks/{monitor-room-PORHVKRH.js → monitor-room-UKTJYTA2.js} +1 -1
- package/dist/dashboard-web/chunks/{monitoring-page-XGA7AXNL.js → monitoring-page-Q3CEZIVX.js} +1 -1
- package/dist/dashboard-web/chunks/{office-page-AO3AFG45.js → office-page-GYCZOOVJ.js} +1 -1
- package/dist/dashboard-web/chunks/{overview-page-F5BUTYR6.js → overview-page-W2VBJ6OH.js} +1 -1
- package/dist/dashboard-web/chunks/roles-page-U4SHER4K.js +1 -0
- package/dist/dashboard-web/chunks/schedules-page-TNPW3N3Q.js +1 -0
- package/dist/dashboard-web/chunks/{sessions-page-YFRPSTIL.js → sessions-page-YWWDDV57.js} +3 -3
- package/dist/dashboard-web/chunks/{settings-page-OJAZLZQT.js → settings-page-VKW5ZK5K.js} +1 -1
- package/dist/dashboard-web/chunks/{skills-page-EFZQPWV4.js → skills-page-ZCEDFGZZ.js} +1 -1
- package/dist/dashboard-web/chunks/{team-federation-page-ZJVAP7HW.js → team-federation-page-OMFGGBT2.js} +1 -1
- package/dist/dashboard-web/chunks/{v3-page-GYWTRGO2.js → v3-page-PLXWK4KO.js} +1 -1
- package/dist/dashboard-web/chunks/{whiteboards-page-MSDAG6P7.js → whiteboards-page-NJQOEO2P.js} +1 -1
- package/dist/dashboard-web/style.css +112 -0
- package/dist/dashboard.js +116 -31
- package/dist/dashboard.js.map +1 -1
- package/dist/desktop/main/ipc.js +1 -1
- package/dist/desktop/main/runtime-service.js +2 -2
- package/dist/desktop/main/runtime-service.js.map +1 -1
- package/dist/desktop/shared/types.d.ts +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +3 -1
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +3 -1
- package/dist/i18n/zh.js.map +1 -1
- package/dist/services/adopt-input-sequence.d.ts +52 -0
- package/dist/services/adopt-input-sequence.d.ts.map +1 -0
- package/dist/services/adopt-input-sequence.js +50 -0
- package/dist/services/adopt-input-sequence.js.map +1 -0
- package/dist/services/bridge-fallback-gate.d.ts.map +1 -1
- package/dist/services/bridge-fallback-gate.js +34 -11
- package/dist/services/bridge-fallback-gate.js.map +1 -1
- package/dist/services/codex-bridge-queue.d.ts +103 -7
- package/dist/services/codex-bridge-queue.d.ts.map +1 -1
- package/dist/services/codex-bridge-queue.js +291 -17
- package/dist/services/codex-bridge-queue.js.map +1 -1
- package/dist/services/codex-transcript.d.ts +4 -3
- package/dist/services/codex-transcript.d.ts.map +1 -1
- package/dist/services/codex-transcript.js.map +1 -1
- package/dist/services/structured-bridge-clis.d.ts +8 -1
- package/dist/services/structured-bridge-clis.d.ts.map +1 -1
- package/dist/services/structured-bridge-clis.js +13 -0
- package/dist/services/structured-bridge-clis.js.map +1 -1
- package/dist/services/submit-confirmation.d.ts +50 -0
- package/dist/services/submit-confirmation.d.ts.map +1 -1
- package/dist/services/submit-confirmation.js +82 -0
- package/dist/services/submit-confirmation.js.map +1 -1
- package/dist/utils/async-serial-queue.d.ts +9 -0
- package/dist/utils/async-serial-queue.d.ts.map +1 -0
- package/dist/utils/async-serial-queue.js +13 -0
- package/dist/utils/async-serial-queue.js.map +1 -0
- package/dist/utils/runtime-screen-status.d.ts +52 -0
- package/dist/utils/runtime-screen-status.d.ts.map +1 -0
- package/dist/utils/runtime-screen-status.js +60 -0
- package/dist/utils/runtime-screen-status.js.map +1 -0
- package/dist/worker.js +1642 -452
- package/dist/worker.js.map +1 -1
- package/package.json +1 -1
- package/dist/dashboard-web/chunks/groups-page-WKUV6E42.js +0 -8
- package/dist/dashboard-web/chunks/roles-page-M5GIASJU.js +0 -1
- package/dist/dashboard-web/chunks/schedules-page-O232WQRR.js +0 -1
package/dist/dashboard/auth.d.ts
CHANGED
|
@@ -9,11 +9,13 @@ export interface HmacAttempt {
|
|
|
9
9
|
* single set of `X-Botmux-Cli-*` headers signed only over `ts:nonce` is valid
|
|
10
10
|
* for ANY `/__cli/*` route on ANY dashboard — which lets a malicious local
|
|
11
11
|
* server, handed a discovery probe, forward the headers to the real dashboard
|
|
12
|
-
* (e.g. a `/__cli/current` probe relayed to `/__cli/
|
|
12
|
+
* (e.g. a `/__cli/current` probe relayed to `/__cli/ensure` or `/__cli/rotate`
|
|
13
|
+
* to mint a token).
|
|
13
14
|
* Binding `method + path + bound-port` makes the credential single-purpose:
|
|
14
15
|
* - the verifier uses the port IT actually bound (not the attacker-controlled
|
|
15
16
|
* Host header), so a forward from port X to the dashboard on port Y mismatches;
|
|
16
|
-
* - a `/__cli/current` capture can't be replayed to
|
|
17
|
+
* - a `/__cli/current` capture can't be replayed to either token-writing route
|
|
18
|
+
* (path differs).
|
|
17
19
|
*/
|
|
18
20
|
export declare function cliAuthBind(method: string, path: string, port: number | string): string;
|
|
19
21
|
/** Mint the three `X-Botmux-Cli-*` header values for a loopback request.
|
|
@@ -44,19 +46,25 @@ export declare function loadDashboardSecret(secretPath: string): string | null;
|
|
|
44
46
|
export declare function loadOrCreateDashboardSecret(secretPath: string): string;
|
|
45
47
|
/**
|
|
46
48
|
* Load the persisted active dashboard token from `tokenPath`, or `null` when
|
|
47
|
-
* the file is absent
|
|
49
|
+
* the file is genuinely absent or empty. Unsafe credential-file shapes fail
|
|
50
|
+
* closed instead of being treated as a missing token.
|
|
48
51
|
*
|
|
49
52
|
* Persisting the active token lets a previously-issued dashboard URL survive a
|
|
50
|
-
* `botmux restart
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
* link.
|
|
53
|
+
* `botmux restart` and keeps multiple dashboard processes on one authority.
|
|
54
|
+
* Only `botmux dashboard rotate` replaces the file, which invalidates the old
|
|
55
|
+
* link for every process on its next request.
|
|
54
56
|
*/
|
|
55
57
|
export declare function loadPersistedToken(tokenPath: string): string | null;
|
|
56
|
-
/**
|
|
58
|
+
/** Durably persist the active dashboard token without following a leaf symlink. */
|
|
57
59
|
export declare function persistToken(tokenPath: string, token: string): void;
|
|
58
|
-
/**
|
|
60
|
+
/**
|
|
61
|
+
* Load the active token, creating and persisting the first one when absent.
|
|
62
|
+
* The file lock makes get-or-create linearizable across dashboard processes:
|
|
63
|
+
* every concurrent caller returns the same durable token.
|
|
64
|
+
*/
|
|
59
65
|
export declare function loadOrCreatePersistedToken(tokenPath: string): string;
|
|
66
|
+
/** Generate and durably replace the token while serialized with first creation. */
|
|
67
|
+
export declare function rotatePersistedToken(tokenPath: string): string;
|
|
60
68
|
/** Extract `botmux_dashboard_token` value from a Cookie header. */
|
|
61
69
|
export declare function parseCookie(header: string | undefined): string | undefined;
|
|
62
70
|
/** Build the `Set-Cookie` header value for a fresh dashboard token. */
|
|
@@ -78,8 +86,10 @@ export declare function buildSetCookie(token: string): string;
|
|
|
78
86
|
* - `GET /api/workflows/*` — zero-I/O legacy retirement
|
|
79
87
|
* tombstone (HTTP 410).
|
|
80
88
|
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
89
|
+
* Outside those always-public surfaces, the explicit `publicReadOnly`
|
|
90
|
+
* allow-list controls tokenless observation. Mutations and private reads still
|
|
91
|
+
* require the active session token, matching the chat web terminal's
|
|
92
|
+
* capability boundary.
|
|
83
93
|
*/
|
|
84
94
|
export type AuthDecision = {
|
|
85
95
|
kind: 'allow';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/dashboard/auth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/dashboard/auth.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,WAAW;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;CAAE;AAExE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAEvF;AAED;;gFAEgF;AAChF,wBAAgB,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CAM5E;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CACxB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,WAAW,EACpB,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,MAAM,GACZ;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CA4BlC;AAED,qEAAqE;AACrE,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIrE;AAED,gFAAgF;AAChF,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CA+CtE;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEnE;AAED,mFAAmF;AACnF,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAEnE;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CASpE;AAED,mFAAmF;AACnF,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAO9D;AAED,mEAAmE;AACnE,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAO1E;AAED,uEAAuE;AACvE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpD;AAID;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC/D;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAsBxB,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB;;;;uDAImD;IACnD,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,YAAY,CAkDf"}
|
package/dist/dashboard/auth.js
CHANGED
|
@@ -2,6 +2,8 @@ import { randomBytes, createHmac, timingSafeEqual } from 'node:crypto';
|
|
|
2
2
|
import { readFileSync, existsSync, mkdirSync, chmodSync, linkSync, unlinkSync, writeFileSync, } from 'node:fs';
|
|
3
3
|
import { atomicWriteFileSync } from '../utils/atomic-write.js';
|
|
4
4
|
import { dirname } from 'node:path';
|
|
5
|
+
import { readSecureHostFileSync, secureHostFilePath, writeSecureHostFileSync, } from '../platform/secure-host-file.js';
|
|
6
|
+
import { withFileLockSync } from '../utils/file-lock.js';
|
|
5
7
|
const NONCE_TTL_MS = 60_000;
|
|
6
8
|
const TS_WINDOW_S = 30;
|
|
7
9
|
const seenNonces = new Map(); // nonce → expiresAt
|
|
@@ -11,11 +13,13 @@ const seenNonces = new Map(); // nonce → expiresAt
|
|
|
11
13
|
* single set of `X-Botmux-Cli-*` headers signed only over `ts:nonce` is valid
|
|
12
14
|
* for ANY `/__cli/*` route on ANY dashboard — which lets a malicious local
|
|
13
15
|
* server, handed a discovery probe, forward the headers to the real dashboard
|
|
14
|
-
* (e.g. a `/__cli/current` probe relayed to `/__cli/
|
|
16
|
+
* (e.g. a `/__cli/current` probe relayed to `/__cli/ensure` or `/__cli/rotate`
|
|
17
|
+
* to mint a token).
|
|
15
18
|
* Binding `method + path + bound-port` makes the credential single-purpose:
|
|
16
19
|
* - the verifier uses the port IT actually bound (not the attacker-controlled
|
|
17
20
|
* Host header), so a forward from port X to the dashboard on port Y mismatches;
|
|
18
|
-
* - a `/__cli/current` capture can't be replayed to
|
|
21
|
+
* - a `/__cli/current` capture can't be replayed to either token-writing route
|
|
22
|
+
* (path differs).
|
|
19
23
|
*/
|
|
20
24
|
export function cliAuthBind(method, path, port) {
|
|
21
25
|
return `${String(method).toUpperCase()} ${path} ${port}`;
|
|
@@ -147,36 +151,45 @@ export function loadOrCreateDashboardSecret(secretPath) {
|
|
|
147
151
|
}
|
|
148
152
|
/**
|
|
149
153
|
* Load the persisted active dashboard token from `tokenPath`, or `null` when
|
|
150
|
-
* the file is absent
|
|
154
|
+
* the file is genuinely absent or empty. Unsafe credential-file shapes fail
|
|
155
|
+
* closed instead of being treated as a missing token.
|
|
151
156
|
*
|
|
152
157
|
* Persisting the active token lets a previously-issued dashboard URL survive a
|
|
153
|
-
* `botmux restart
|
|
154
|
-
*
|
|
155
|
-
*
|
|
156
|
-
* link.
|
|
158
|
+
* `botmux restart` and keeps multiple dashboard processes on one authority.
|
|
159
|
+
* Only `botmux dashboard rotate` replaces the file, which invalidates the old
|
|
160
|
+
* link for every process on its next request.
|
|
157
161
|
*/
|
|
158
162
|
export function loadPersistedToken(tokenPath) {
|
|
159
|
-
|
|
160
|
-
if (existsSync(tokenPath))
|
|
161
|
-
return readFileSync(tokenPath, 'utf8').trim() || null;
|
|
162
|
-
}
|
|
163
|
-
catch { /* unreadable token file → behave as if none persisted */ }
|
|
164
|
-
return null;
|
|
163
|
+
return readSecureHostFileSync(tokenPath, 256)?.trim() || null;
|
|
165
164
|
}
|
|
166
|
-
/**
|
|
165
|
+
/** Durably persist the active dashboard token without following a leaf symlink. */
|
|
167
166
|
export function persistToken(tokenPath, token) {
|
|
168
|
-
|
|
169
|
-
atomicWriteFileSync(tokenPath, token, { mode: 0o600 });
|
|
170
|
-
chmodSync(tokenPath, 0o600);
|
|
167
|
+
writeSecureHostFileSync(tokenPath, token);
|
|
171
168
|
}
|
|
172
|
-
/**
|
|
169
|
+
/**
|
|
170
|
+
* Load the active token, creating and persisting the first one when absent.
|
|
171
|
+
* The file lock makes get-or-create linearizable across dashboard processes:
|
|
172
|
+
* every concurrent caller returns the same durable token.
|
|
173
|
+
*/
|
|
173
174
|
export function loadOrCreatePersistedToken(tokenPath) {
|
|
174
|
-
const
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
175
|
+
const securePath = secureHostFilePath(tokenPath);
|
|
176
|
+
return withFileLockSync(securePath, () => {
|
|
177
|
+
const existing = loadPersistedToken(securePath);
|
|
178
|
+
if (existing)
|
|
179
|
+
return existing;
|
|
180
|
+
const token = generateToken();
|
|
181
|
+
persistToken(securePath, token);
|
|
182
|
+
return token;
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
/** Generate and durably replace the token while serialized with first creation. */
|
|
186
|
+
export function rotatePersistedToken(tokenPath) {
|
|
187
|
+
const securePath = secureHostFilePath(tokenPath);
|
|
188
|
+
return withFileLockSync(securePath, () => {
|
|
189
|
+
const token = generateToken();
|
|
190
|
+
persistToken(securePath, token);
|
|
191
|
+
return token;
|
|
192
|
+
});
|
|
180
193
|
}
|
|
181
194
|
/** Extract `botmux_dashboard_token` value from a Cookie header. */
|
|
182
195
|
export function parseCookie(header) {
|
|
@@ -203,8 +216,9 @@ export function buildSetCookie(token) {
|
|
|
203
216
|
* workflow tombstone are handled separately in decideDashboardAuth. Full v3
|
|
204
217
|
* workflow projections stay private because goals, node ids, and run ids can
|
|
205
218
|
* contain project or personal information.
|
|
206
|
-
* 口径:公开 = 会话板 / 排程(脱敏) / 设置(只读) / 群名册 / 事件流。 */
|
|
219
|
+
* 口径:公开 = 运行摘要 / 会话板 / 排程(脱敏) / 设置(只读) / 群名册 / 事件流。 */
|
|
207
220
|
const PUBLIC_READ_PATHS = new Set([
|
|
221
|
+
'/api/dashboard/v1/summary', // strongly-redacted dashboard aggregate
|
|
208
222
|
'/api/sessions', // session board
|
|
209
223
|
'/api/schedules', // schedules page — task prompt redacted for anon upstream
|
|
210
224
|
'/api/settings', // read-only settings — only public flags + authed:false
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/dashboard/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EACL,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,GACpF,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/dashboard/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -59,7 +59,6 @@ export declare function botDefaultsPayload(bot: DashboardBotDescriptor, j?: any,
|
|
|
59
59
|
readOnly: any;
|
|
60
60
|
deny: any;
|
|
61
61
|
} | null;
|
|
62
|
-
readIsolation: boolean;
|
|
63
62
|
readIsolationSupported: boolean;
|
|
64
63
|
backendType: any;
|
|
65
64
|
usageDisplay: import("../bot-registry.js").UsageDisplayMode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot-payload.d.ts","sourceRoot":"","sources":["../../src/dashboard/bot-payload.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAGnE,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;0DACsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,qEAAqE;IACrE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,aAAa,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAC/D,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAMjC;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,sBAAsB;;;;;;EAQ5D;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,sBAAsB,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,MAAM
|
|
1
|
+
{"version":3,"file":"bot-payload.d.ts","sourceRoot":"","sources":["../../src/dashboard/bot-payload.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAGnE,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;0DACsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,qEAAqE;IACrE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,aAAa,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAC/D,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAMjC;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,sBAAsB;;;;;;EAQ5D;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,sBAAsB,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsFtF"}
|
|
@@ -65,7 +65,6 @@ export function botDefaultsPayload(bot, j, error) {
|
|
|
65
65
|
deny: Array.isArray(j.sandboxPaths.deny) ? j.sandboxPaths.deny.filter((x) => typeof x === 'string') : [],
|
|
66
66
|
}
|
|
67
67
|
: null,
|
|
68
|
-
readIsolation: j?.readIsolation === true,
|
|
69
68
|
readIsolationSupported: j?.readIsolationSupported === true,
|
|
70
69
|
backendType: typeof j?.backendType === 'string' ? j.backendType : null,
|
|
71
70
|
usageDisplay: normalizeUsageDisplay(j ?? {}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot-payload.js","sourceRoot":"","sources":["../../src/dashboard/bot-payload.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"bot-payload.js","sourceRoot":"","sources":["../../src/dashboard/bot-payload.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { unavailableDashboardSummary, type DashboardSummary } from './dashboard-summary.js';
|
|
2
|
+
export type DashboardSummaryEndpointResult = {
|
|
3
|
+
status: 200;
|
|
4
|
+
headers: {
|
|
5
|
+
'cache-control': 'no-store';
|
|
6
|
+
};
|
|
7
|
+
body: DashboardSummary;
|
|
8
|
+
} | {
|
|
9
|
+
status: 429;
|
|
10
|
+
headers: {
|
|
11
|
+
'cache-control': 'no-store';
|
|
12
|
+
'retry-after': string;
|
|
13
|
+
};
|
|
14
|
+
body: {
|
|
15
|
+
error: 'rate_limited';
|
|
16
|
+
retryAfterSeconds: number;
|
|
17
|
+
};
|
|
18
|
+
} | {
|
|
19
|
+
status: 503;
|
|
20
|
+
headers: {
|
|
21
|
+
'cache-control': 'no-store';
|
|
22
|
+
};
|
|
23
|
+
body: ReturnType<typeof unavailableDashboardSummary>;
|
|
24
|
+
};
|
|
25
|
+
export interface DashboardSummaryEndpoint {
|
|
26
|
+
get(input: {
|
|
27
|
+
authenticated: boolean;
|
|
28
|
+
}): Promise<DashboardSummaryEndpointResult>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Own the public summary request policy behind one small interface. The live
|
|
32
|
+
* fleet loader is injected so callers and tests cross the same seam.
|
|
33
|
+
*/
|
|
34
|
+
export declare function createDashboardSummaryEndpoint(options: {
|
|
35
|
+
load: () => Promise<DashboardSummary>;
|
|
36
|
+
now?: () => number;
|
|
37
|
+
onError?: (error: unknown) => void;
|
|
38
|
+
}): DashboardSummaryEndpoint;
|
|
39
|
+
//# sourceMappingURL=dashboard-summary-endpoint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard-summary-endpoint.d.ts","sourceRoot":"","sources":["../../src/dashboard/dashboard-summary-endpoint.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,EAC3B,KAAK,gBAAgB,EACtB,MAAM,wBAAwB,CAAC;AAKhC,MAAM,MAAM,8BAA8B,GACtC;IACA,MAAM,EAAE,GAAG,CAAC;IACZ,OAAO,EAAE;QAAE,eAAe,EAAE,UAAU,CAAA;KAAE,CAAC;IACzC,IAAI,EAAE,gBAAgB,CAAC;CACxB,GACC;IACA,MAAM,EAAE,GAAG,CAAC;IACZ,OAAO,EAAE;QAAE,eAAe,EAAE,UAAU,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IAChE,IAAI,EAAE;QAAE,KAAK,EAAE,cAAc,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5D,GACC;IACA,MAAM,EAAE,GAAG,CAAC;IACZ,OAAO,EAAE;QAAE,eAAe,EAAE,UAAU,CAAA;KAAE,CAAC;IACzC,IAAI,EAAE,UAAU,CAAC,OAAO,2BAA2B,CAAC,CAAC;CACtD,CAAC;AAEJ,MAAM,WAAW,wBAAwB;IACvC,GAAG,CAAC,KAAK,EAAE;QAAE,aAAa,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAAC;CACjF;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAAC,OAAO,EAAE;IACtD,IAAI,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACtC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACpC,GAAG,wBAAwB,CA+C3B"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { unavailableDashboardSummary, } from './dashboard-summary.js';
|
|
2
|
+
const ANONYMOUS_WINDOW_MS = 10_000;
|
|
3
|
+
const ANONYMOUS_MAX_REQUESTS = 5;
|
|
4
|
+
/**
|
|
5
|
+
* Own the public summary request policy behind one small interface. The live
|
|
6
|
+
* fleet loader is injected so callers and tests cross the same seam.
|
|
7
|
+
*/
|
|
8
|
+
export function createDashboardSummaryEndpoint(options) {
|
|
9
|
+
const now = options.now ?? Date.now;
|
|
10
|
+
const anonymousAttempts = [];
|
|
11
|
+
return {
|
|
12
|
+
async get(input) {
|
|
13
|
+
if (!input.authenticated) {
|
|
14
|
+
const requestAt = now();
|
|
15
|
+
while (anonymousAttempts.length > 0
|
|
16
|
+
&& requestAt - anonymousAttempts[0] >= ANONYMOUS_WINDOW_MS) {
|
|
17
|
+
anonymousAttempts.shift();
|
|
18
|
+
}
|
|
19
|
+
if (anonymousAttempts.length >= ANONYMOUS_MAX_REQUESTS) {
|
|
20
|
+
const retryAfterSeconds = Math.max(1, Math.ceil((anonymousAttempts[0] + ANONYMOUS_WINDOW_MS - requestAt) / 1000));
|
|
21
|
+
return {
|
|
22
|
+
status: 429,
|
|
23
|
+
headers: {
|
|
24
|
+
'cache-control': 'no-store',
|
|
25
|
+
'retry-after': String(retryAfterSeconds),
|
|
26
|
+
},
|
|
27
|
+
body: { error: 'rate_limited', retryAfterSeconds },
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
anonymousAttempts.push(requestAt);
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
return {
|
|
34
|
+
status: 200,
|
|
35
|
+
headers: { 'cache-control': 'no-store' },
|
|
36
|
+
body: await options.load(),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
options.onError?.(error);
|
|
41
|
+
return {
|
|
42
|
+
status: 503,
|
|
43
|
+
headers: { 'cache-control': 'no-store' },
|
|
44
|
+
body: unavailableDashboardSummary(new Date(now())),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=dashboard-summary-endpoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard-summary-endpoint.js","sourceRoot":"","sources":["../../src/dashboard/dashboard-summary-endpoint.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,GAE5B,MAAM,wBAAwB,CAAC;AAEhC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AACnC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAuBjC;;;GAGG;AACH,MAAM,UAAU,8BAA8B,CAAC,OAI9C;IACC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACpC,MAAM,iBAAiB,GAAa,EAAE,CAAC;IAEvC,OAAO;QACL,KAAK,CAAC,GAAG,CAAC,KAAK;YACb,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;gBACzB,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;gBACxB,OACE,iBAAiB,CAAC,MAAM,GAAG,CAAC;uBACzB,SAAS,GAAG,iBAAiB,CAAC,CAAC,CAAC,IAAI,mBAAmB,EAC1D,CAAC;oBACD,iBAAiB,CAAC,KAAK,EAAE,CAAC;gBAC5B,CAAC;gBACD,IAAI,iBAAiB,CAAC,MAAM,IAAI,sBAAsB,EAAE,CAAC;oBACvD,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAChC,CAAC,EACD,IAAI,CAAC,IAAI,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,mBAAmB,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAC3E,CAAC;oBACF,OAAO;wBACL,MAAM,EAAE,GAAG;wBACX,OAAO,EAAE;4BACP,eAAe,EAAE,UAAU;4BAC3B,aAAa,EAAE,MAAM,CAAC,iBAAiB,CAAC;yBACzC;wBACD,IAAI,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE;qBACnD,CAAC;gBACJ,CAAC;gBACD,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACpC,CAAC;YAED,IAAI,CAAC;gBACH,OAAO;oBACL,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,EAAE,eAAe,EAAE,UAAU,EAAE;oBACxC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,EAAE;iBAC3B,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;gBACzB,OAAO;oBACL,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,EAAE,eAAe,EAAE,UAAU,EAAE;oBACxC,IAAI,EAAE,2BAA2B,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;iBACnD,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export declare const DASHBOARD_SUMMARY_SCHEMA_VERSION: 1;
|
|
2
|
+
export interface DashboardSummary {
|
|
3
|
+
schemaVersion: typeof DASHBOARD_SUMMARY_SCHEMA_VERSION;
|
|
4
|
+
generatedAt: string;
|
|
5
|
+
service: {
|
|
6
|
+
status: 'healthy' | 'degraded';
|
|
7
|
+
};
|
|
8
|
+
bots: {
|
|
9
|
+
online: number;
|
|
10
|
+
};
|
|
11
|
+
sessions: {
|
|
12
|
+
active: number;
|
|
13
|
+
attention: number;
|
|
14
|
+
};
|
|
15
|
+
schedules: {
|
|
16
|
+
enabled: number;
|
|
17
|
+
nextRunAt: string | null;
|
|
18
|
+
};
|
|
19
|
+
dashboard: {
|
|
20
|
+
href: '/';
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
interface DashboardSummarySessionRow {
|
|
24
|
+
status?: unknown;
|
|
25
|
+
pendingRepo?: unknown;
|
|
26
|
+
tuiPromptActive?: unknown;
|
|
27
|
+
agentAttention?: unknown;
|
|
28
|
+
}
|
|
29
|
+
interface DashboardSummaryScheduleRow {
|
|
30
|
+
enabled?: unknown;
|
|
31
|
+
nextRunAt?: unknown;
|
|
32
|
+
}
|
|
33
|
+
/** Validate the minimal daemon row shape consumed by the public projection.
|
|
34
|
+
* Rejecting malformed live data keeps the endpoint from publishing plausible
|
|
35
|
+
* but invented operational counts. */
|
|
36
|
+
export declare function parseDashboardSummaryRows(input: {
|
|
37
|
+
sessions: unknown;
|
|
38
|
+
schedules: unknown;
|
|
39
|
+
}): {
|
|
40
|
+
sessions: readonly DashboardSummarySessionRow[];
|
|
41
|
+
schedules: readonly DashboardSummaryScheduleRow[];
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Reduce the dashboard's rich internal read model to a deliberately tiny
|
|
45
|
+
* public summary contract. Keep the projection here as a positive allowlist:
|
|
46
|
+
* adding a field to a session, schedule, bot descriptor, or dashboard API can
|
|
47
|
+
* never make it appear in this response by accident.
|
|
48
|
+
*/
|
|
49
|
+
export declare function buildDashboardSummary(input: {
|
|
50
|
+
generatedAt: Date;
|
|
51
|
+
configuredBotAppIds: readonly string[];
|
|
52
|
+
onlineBotAppIds: readonly string[];
|
|
53
|
+
sessions: readonly DashboardSummarySessionRow[];
|
|
54
|
+
schedules: readonly DashboardSummaryScheduleRow[];
|
|
55
|
+
}): DashboardSummary;
|
|
56
|
+
/** Minimal, still-whitelisted body for an upstream snapshot failure. Counts
|
|
57
|
+
* are intentionally absent: returning plausible zeroes would turn missing
|
|
58
|
+
* daemon state into false operational health. The HTTP handler pairs this with
|
|
59
|
+
* 503 so consumers can render an unavailable state. */
|
|
60
|
+
export declare function unavailableDashboardSummary(generatedAt: Date): Pick<DashboardSummary, 'schemaVersion' | 'generatedAt' | 'service'>;
|
|
61
|
+
export {};
|
|
62
|
+
//# sourceMappingURL=dashboard-summary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard-summary.d.ts","sourceRoot":"","sources":["../../src/dashboard/dashboard-summary.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gCAAgC,EAAG,CAAU,CAAC;AAE3D,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,OAAO,gCAAgC,CAAC;IACvD,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE;QAAE,MAAM,EAAE,SAAS,GAAG,UAAU,CAAA;KAAE,CAAC;IAC5C,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACzB,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,SAAS,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACzD,SAAS,EAAE;QAAE,IAAI,EAAE,GAAG,CAAA;KAAE,CAAC;CAC1B;AAED,UAAU,0BAA0B;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,UAAU,2BAA2B;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAiBD;;sCAEsC;AACtC,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAC/C,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB,GAAG;IACF,QAAQ,EAAE,SAAS,0BAA0B,EAAE,CAAC;IAChD,SAAS,EAAE,SAAS,2BAA2B,EAAE,CAAC;CACnD,CAgCA;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,WAAW,EAAE,IAAI,CAAC;IAClB,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,EAAE,SAAS,0BAA0B,EAAE,CAAC;IAChD,SAAS,EAAE,SAAS,2BAA2B,EAAE,CAAC;CACnD,GAAG,gBAAgB,CAoCnB;AAED;;;uDAGuD;AACvD,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC,gBAAgB,EAAE,eAAe,GAAG,aAAa,GAAG,SAAS,CAAC,CAMlI"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
export const DASHBOARD_SUMMARY_SCHEMA_VERSION = 1;
|
|
2
|
+
const DASHBOARD_SUMMARY_SESSION_STATUSES = new Set([
|
|
3
|
+
'working',
|
|
4
|
+
'idle',
|
|
5
|
+
'analyzing',
|
|
6
|
+
'limited',
|
|
7
|
+
'stalled',
|
|
8
|
+
'starting',
|
|
9
|
+
'closed',
|
|
10
|
+
'dormant',
|
|
11
|
+
]);
|
|
12
|
+
function objectRow(value) {
|
|
13
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
14
|
+
}
|
|
15
|
+
/** Validate the minimal daemon row shape consumed by the public projection.
|
|
16
|
+
* Rejecting malformed live data keeps the endpoint from publishing plausible
|
|
17
|
+
* but invented operational counts. */
|
|
18
|
+
export function parseDashboardSummaryRows(input) {
|
|
19
|
+
if (!Array.isArray(input.sessions))
|
|
20
|
+
throw new Error('dashboard summary sessions must be an array');
|
|
21
|
+
if (!Array.isArray(input.schedules))
|
|
22
|
+
throw new Error('dashboard summary schedules must be an array');
|
|
23
|
+
for (const row of input.sessions) {
|
|
24
|
+
if (!objectRow(row)
|
|
25
|
+
|| typeof row.status !== 'string'
|
|
26
|
+
|| !DASHBOARD_SUMMARY_SESSION_STATUSES.has(row.status)) {
|
|
27
|
+
throw new Error('dashboard summary session status is invalid');
|
|
28
|
+
}
|
|
29
|
+
if (row.pendingRepo !== undefined && typeof row.pendingRepo !== 'boolean') {
|
|
30
|
+
throw new Error('dashboard summary session pendingRepo must be a boolean');
|
|
31
|
+
}
|
|
32
|
+
if (row.tuiPromptActive !== undefined && typeof row.tuiPromptActive !== 'boolean') {
|
|
33
|
+
throw new Error('dashboard summary session tuiPromptActive must be a boolean');
|
|
34
|
+
}
|
|
35
|
+
if (row.agentAttention !== undefined && row.agentAttention !== null && !objectRow(row.agentAttention)) {
|
|
36
|
+
throw new Error('dashboard summary session agentAttention must be an object or null');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
for (const row of input.schedules) {
|
|
40
|
+
if (!objectRow(row) || typeof row.enabled !== 'boolean') {
|
|
41
|
+
throw new Error('dashboard summary schedule enabled must be a boolean');
|
|
42
|
+
}
|
|
43
|
+
if (row.nextRunAt !== undefined
|
|
44
|
+
&& (typeof row.nextRunAt !== 'string' || !Number.isFinite(Date.parse(row.nextRunAt)))) {
|
|
45
|
+
throw new Error('dashboard summary schedule nextRunAt must be a valid timestamp');
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
sessions: input.sessions,
|
|
50
|
+
schedules: input.schedules,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Reduce the dashboard's rich internal read model to a deliberately tiny
|
|
55
|
+
* public summary contract. Keep the projection here as a positive allowlist:
|
|
56
|
+
* adding a field to a session, schedule, bot descriptor, or dashboard API can
|
|
57
|
+
* never make it appear in this response by accident.
|
|
58
|
+
*/
|
|
59
|
+
export function buildDashboardSummary(input) {
|
|
60
|
+
const onlineBotAppIds = new Set(input.onlineBotAppIds);
|
|
61
|
+
const configuredFleetOnline = input.configuredBotAppIds.every(appId => onlineBotAppIds.has(appId));
|
|
62
|
+
const activeSessions = input.sessions.filter(row => row.status !== 'closed');
|
|
63
|
+
const attentionSessions = activeSessions.filter(row => (!!row.agentAttention
|
|
64
|
+
|| !!row.pendingRepo
|
|
65
|
+
|| !!row.tuiPromptActive
|
|
66
|
+
|| row.status === 'limited'
|
|
67
|
+
|| row.status === 'stalled'));
|
|
68
|
+
const enabledSchedules = input.schedules.filter(row => row.enabled === true);
|
|
69
|
+
const nextRunMs = enabledSchedules.reduce((earliest, row) => {
|
|
70
|
+
if (typeof row.nextRunAt !== 'string')
|
|
71
|
+
return earliest;
|
|
72
|
+
const candidate = Date.parse(row.nextRunAt);
|
|
73
|
+
if (!Number.isFinite(candidate))
|
|
74
|
+
return earliest;
|
|
75
|
+
return earliest === null || candidate < earliest ? candidate : earliest;
|
|
76
|
+
}, null);
|
|
77
|
+
return {
|
|
78
|
+
schemaVersion: DASHBOARD_SUMMARY_SCHEMA_VERSION,
|
|
79
|
+
generatedAt: input.generatedAt.toISOString(),
|
|
80
|
+
service: {
|
|
81
|
+
status: configuredFleetOnline ? 'healthy' : 'degraded',
|
|
82
|
+
},
|
|
83
|
+
bots: { online: input.onlineBotAppIds.length },
|
|
84
|
+
sessions: {
|
|
85
|
+
active: activeSessions.length,
|
|
86
|
+
attention: attentionSessions.length,
|
|
87
|
+
},
|
|
88
|
+
schedules: {
|
|
89
|
+
enabled: enabledSchedules.length,
|
|
90
|
+
nextRunAt: nextRunMs === null ? null : new Date(nextRunMs).toISOString(),
|
|
91
|
+
},
|
|
92
|
+
dashboard: { href: '/' },
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/** Minimal, still-whitelisted body for an upstream snapshot failure. Counts
|
|
96
|
+
* are intentionally absent: returning plausible zeroes would turn missing
|
|
97
|
+
* daemon state into false operational health. The HTTP handler pairs this with
|
|
98
|
+
* 503 so consumers can render an unavailable state. */
|
|
99
|
+
export function unavailableDashboardSummary(generatedAt) {
|
|
100
|
+
return {
|
|
101
|
+
schemaVersion: DASHBOARD_SUMMARY_SCHEMA_VERSION,
|
|
102
|
+
generatedAt: generatedAt.toISOString(),
|
|
103
|
+
service: { status: 'degraded' },
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=dashboard-summary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard-summary.js","sourceRoot":"","sources":["../../src/dashboard/dashboard-summary.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type React from 'react';
|
|
2
|
+
export type FeedGroupPickerOption = {
|
|
3
|
+
groupId: string;
|
|
4
|
+
name: string;
|
|
5
|
+
};
|
|
6
|
+
export declare function FeedGroupPicker(props: {
|
|
7
|
+
groups: FeedGroupPickerOption[];
|
|
8
|
+
selectedId: string;
|
|
9
|
+
newName: string;
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
onChange(selectedId: string, newName: string): void;
|
|
12
|
+
}): React.JSX.Element;
|
|
13
|
+
//# sourceMappingURL=feed-group-picker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feed-group-picker.d.ts","sourceRoot":"","sources":["../../../src/dashboard/web/feed-group-picker.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,MAAM,MAAM,qBAAqB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtE,wBAAgB,eAAe,CAAC,KAAK,EAAE;IACrC,MAAM,EAAE,qBAAqB,EAAE,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACrD,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAiFpB"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef } from 'react';
|
|
3
|
+
export function FeedGroupPicker(props) {
|
|
4
|
+
const detailsRef = useRef(null);
|
|
5
|
+
const summaryRef = useRef(null);
|
|
6
|
+
const selectedName = props.groups.find(group => group.groupId === props.selectedId)?.name;
|
|
7
|
+
const label = props.newName.trim()
|
|
8
|
+
? `新建标签:${props.newName.trim()}`
|
|
9
|
+
: selectedName || '不选择标签';
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
const closeOnOutside = (event) => {
|
|
12
|
+
const details = detailsRef.current;
|
|
13
|
+
if (!details?.open)
|
|
14
|
+
return;
|
|
15
|
+
if (event.target instanceof Node && details.contains(event.target))
|
|
16
|
+
return;
|
|
17
|
+
details.open = false;
|
|
18
|
+
};
|
|
19
|
+
const closeOnEscape = (event) => {
|
|
20
|
+
if (event.key === 'Escape' && detailsRef.current?.open)
|
|
21
|
+
detailsRef.current.open = false;
|
|
22
|
+
};
|
|
23
|
+
document.addEventListener('pointerdown', closeOnOutside, true);
|
|
24
|
+
document.addEventListener('keydown', closeOnEscape);
|
|
25
|
+
return () => {
|
|
26
|
+
document.removeEventListener('pointerdown', closeOnOutside, true);
|
|
27
|
+
document.removeEventListener('keydown', closeOnEscape);
|
|
28
|
+
};
|
|
29
|
+
}, []);
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
if (props.disabled && detailsRef.current?.open)
|
|
32
|
+
detailsRef.current.open = false;
|
|
33
|
+
}, [props.disabled]);
|
|
34
|
+
const choose = (selectedId, newName) => {
|
|
35
|
+
props.onChange(selectedId, newName);
|
|
36
|
+
detailsRef.current?.removeAttribute('open');
|
|
37
|
+
queueMicrotask(() => summaryRef.current?.focus());
|
|
38
|
+
};
|
|
39
|
+
return (_jsxs("details", { ref: detailsRef, className: `feed-group-picker${props.disabled ? ' is-disabled' : ''}`, children: [_jsx("summary", { ref: summaryRef, "aria-label": `飞书标签,当前:${label}`, "aria-disabled": props.disabled || undefined, tabIndex: props.disabled ? -1 : undefined, onClick: event => { if (props.disabled)
|
|
40
|
+
event.preventDefault(); }, children: _jsx("span", { children: label }) }), _jsxs("div", { className: "feed-group-picker-pop", children: [_jsxs("label", { className: "feed-group-picker-new", children: [_jsx("span", { children: "\u65B0\u5EFA\u6807\u7B7E" }), _jsx("input", { type: "text", maxLength: 60, value: props.newName, placeholder: "\u8F93\u5165\u65B0\u6807\u7B7E\u540D\u79F0", onChange: event => props.onChange('', event.currentTarget.value.trimStart()), onKeyDown: event => {
|
|
41
|
+
if (event.key === 'Enter')
|
|
42
|
+
event.preventDefault();
|
|
43
|
+
} })] }), _jsx("button", { type: "button", "aria-current": !props.selectedId && !props.newName.trim() ? 'true' : undefined, onClick: () => choose('', ''), children: "\u4E0D\u9009\u62E9\u6807\u7B7E" }), props.groups.map(group => (_jsx("button", { type: "button", "aria-current": props.selectedId === group.groupId && !props.newName.trim() ? 'true' : undefined, onClick: () => choose(group.groupId, ''), children: group.name }, group.groupId)))] })] }));
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=feed-group-picker.js.map
|