botmux 2.88.1 → 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.
Files changed (171) hide show
  1. package/dist/bot-registry.d.ts +2 -0
  2. package/dist/bot-registry.d.ts.map +1 -1
  3. package/dist/bot-registry.js +4 -0
  4. package/dist/bot-registry.js.map +1 -1
  5. package/dist/cli/dashboard-endpoint.d.ts.map +1 -1
  6. package/dist/cli/dashboard-endpoint.js +9 -3
  7. package/dist/cli/dashboard-endpoint.js.map +1 -1
  8. package/dist/cli.d.ts.map +1 -1
  9. package/dist/cli.js +11 -3
  10. package/dist/cli.js.map +1 -1
  11. package/dist/core/command-handler.d.ts.map +1 -1
  12. package/dist/core/command-handler.js +9 -1
  13. package/dist/core/command-handler.js.map +1 -1
  14. package/dist/core/dashboard-command/groups.d.ts +20 -0
  15. package/dist/core/dashboard-command/groups.d.ts.map +1 -0
  16. package/dist/core/dashboard-command/groups.js +52 -0
  17. package/dist/core/dashboard-command/groups.js.map +1 -0
  18. package/dist/core/dashboard-command/index.d.ts +30 -0
  19. package/dist/core/dashboard-command/index.d.ts.map +1 -0
  20. package/dist/core/dashboard-command/index.js +81 -0
  21. package/dist/core/dashboard-command/index.js.map +1 -0
  22. package/dist/core/dashboard-command/overview.d.ts +29 -0
  23. package/dist/core/dashboard-command/overview.d.ts.map +1 -0
  24. package/dist/core/dashboard-command/overview.js +61 -0
  25. package/dist/core/dashboard-command/overview.js.map +1 -0
  26. package/dist/core/dashboard-command/owner-gate.d.ts +41 -0
  27. package/dist/core/dashboard-command/owner-gate.d.ts.map +1 -0
  28. package/dist/core/dashboard-command/owner-gate.js +40 -0
  29. package/dist/core/dashboard-command/owner-gate.js.map +1 -0
  30. package/dist/core/dashboard-command/schedules.d.ts +20 -0
  31. package/dist/core/dashboard-command/schedules.d.ts.map +1 -0
  32. package/dist/core/dashboard-command/schedules.js +47 -0
  33. package/dist/core/dashboard-command/schedules.js.map +1 -0
  34. package/dist/core/dashboard-command/sessions.d.ts +22 -0
  35. package/dist/core/dashboard-command/sessions.d.ts.map +1 -0
  36. package/dist/core/dashboard-command/sessions.js +43 -0
  37. package/dist/core/dashboard-command/sessions.js.map +1 -0
  38. package/dist/core/dashboard-command/settings.d.ts +21 -0
  39. package/dist/core/dashboard-command/settings.d.ts.map +1 -0
  40. package/dist/core/dashboard-command/settings.js +55 -0
  41. package/dist/core/dashboard-command/settings.js.map +1 -0
  42. package/dist/core/dashboard-command/stub.d.ts +16 -0
  43. package/dist/core/dashboard-command/stub.d.ts.map +1 -0
  44. package/dist/core/dashboard-command/stub.js +28 -0
  45. package/dist/core/dashboard-command/stub.js.map +1 -0
  46. package/dist/core/dashboard-command/workflows.d.ts +20 -0
  47. package/dist/core/dashboard-command/workflows.d.ts.map +1 -0
  48. package/dist/core/dashboard-command/workflows.js +45 -0
  49. package/dist/core/dashboard-command/workflows.js.map +1 -0
  50. package/dist/core/passthrough-commands.d.ts.map +1 -1
  51. package/dist/core/passthrough-commands.js +1 -1
  52. package/dist/core/passthrough-commands.js.map +1 -1
  53. package/dist/daemon-internal-client-wrapper.d.ts +41 -0
  54. package/dist/daemon-internal-client-wrapper.d.ts.map +1 -0
  55. package/dist/daemon-internal-client-wrapper.js +65 -0
  56. package/dist/daemon-internal-client-wrapper.js.map +1 -0
  57. package/dist/dashboard/aggregator.d.ts +12 -0
  58. package/dist/dashboard/aggregator.d.ts.map +1 -1
  59. package/dist/dashboard/aggregator.js +16 -0
  60. package/dist/dashboard/aggregator.js.map +1 -1
  61. package/dist/dashboard/auth.d.ts +7 -0
  62. package/dist/dashboard/auth.d.ts.map +1 -1
  63. package/dist/dashboard/auth.js +21 -0
  64. package/dist/dashboard/auth.js.map +1 -1
  65. package/dist/dashboard/card-model-types.d.ts +50 -0
  66. package/dist/dashboard/card-model-types.d.ts.map +1 -0
  67. package/dist/dashboard/card-model-types.js +9 -0
  68. package/dist/dashboard/card-model-types.js.map +1 -0
  69. package/dist/dashboard/daemon-internal-api.d.ts +90 -0
  70. package/dist/dashboard/daemon-internal-api.d.ts.map +1 -0
  71. package/dist/dashboard/daemon-internal-api.js +534 -0
  72. package/dist/dashboard/daemon-internal-api.js.map +1 -0
  73. package/dist/dashboard/daemon-internal-auth.d.ts +124 -0
  74. package/dist/dashboard/daemon-internal-auth.d.ts.map +1 -0
  75. package/dist/dashboard/daemon-internal-auth.js +188 -0
  76. package/dist/dashboard/daemon-internal-auth.js.map +1 -0
  77. package/dist/dashboard/daemon-internal-client.d.ts +67 -0
  78. package/dist/dashboard/daemon-internal-client.d.ts.map +1 -0
  79. package/dist/dashboard/daemon-internal-client.js +157 -0
  80. package/dist/dashboard/daemon-internal-client.js.map +1 -0
  81. package/dist/dashboard/dashboard-admins.d.ts +8 -0
  82. package/dist/dashboard/dashboard-admins.d.ts.map +1 -0
  83. package/dist/dashboard/dashboard-admins.js +15 -0
  84. package/dist/dashboard/dashboard-admins.js.map +1 -0
  85. package/dist/dashboard/federation-spoke-api.d.ts +3 -0
  86. package/dist/dashboard/federation-spoke-api.d.ts.map +1 -1
  87. package/dist/dashboard/federation-spoke-api.js +11 -8
  88. package/dist/dashboard/federation-spoke-api.js.map +1 -1
  89. package/dist/dashboard/groups-action-helpers.d.ts +69 -0
  90. package/dist/dashboard/groups-action-helpers.d.ts.map +1 -0
  91. package/dist/dashboard/groups-action-helpers.js +141 -0
  92. package/dist/dashboard/groups-action-helpers.js.map +1 -0
  93. package/dist/dashboard/groups-card-model.d.ts +120 -0
  94. package/dist/dashboard/groups-card-model.d.ts.map +1 -0
  95. package/dist/dashboard/groups-card-model.js +175 -0
  96. package/dist/dashboard/groups-card-model.js.map +1 -0
  97. package/dist/dashboard/schedule-card-model.d.ts +172 -0
  98. package/dist/dashboard/schedule-card-model.d.ts.map +1 -0
  99. package/dist/dashboard/schedule-card-model.js +290 -0
  100. package/dist/dashboard/schedule-card-model.js.map +1 -0
  101. package/dist/dashboard/session-card-model.d.ts +83 -0
  102. package/dist/dashboard/session-card-model.d.ts.map +1 -0
  103. package/dist/dashboard/session-card-model.js +196 -0
  104. package/dist/dashboard/session-card-model.js.map +1 -0
  105. package/dist/dashboard/settings-card-model.d.ts +73 -0
  106. package/dist/dashboard/settings-card-model.d.ts.map +1 -0
  107. package/dist/dashboard/settings-card-model.js +94 -0
  108. package/dist/dashboard/settings-card-model.js.map +1 -0
  109. package/dist/dashboard/settings-owner-resolver.d.ts +32 -0
  110. package/dist/dashboard/settings-owner-resolver.d.ts.map +1 -0
  111. package/dist/dashboard/settings-owner-resolver.js +43 -0
  112. package/dist/dashboard/settings-owner-resolver.js.map +1 -0
  113. package/dist/dashboard/settings-write-applier.d.ts +84 -0
  114. package/dist/dashboard/settings-write-applier.d.ts.map +1 -0
  115. package/dist/dashboard/settings-write-applier.js +119 -0
  116. package/dist/dashboard/settings-write-applier.js.map +1 -0
  117. package/dist/dashboard/workflow-api.d.ts.map +1 -1
  118. package/dist/dashboard/workflow-api.js +38 -119
  119. package/dist/dashboard/workflow-api.js.map +1 -1
  120. package/dist/dashboard/workflow-card-model.d.ts +127 -0
  121. package/dist/dashboard/workflow-card-model.d.ts.map +1 -0
  122. package/dist/dashboard/workflow-card-model.js +186 -0
  123. package/dist/dashboard/workflow-card-model.js.map +1 -0
  124. package/dist/dashboard/workflows-action-helpers.d.ts +105 -0
  125. package/dist/dashboard/workflows-action-helpers.d.ts.map +1 -0
  126. package/dist/dashboard/workflows-action-helpers.js +196 -0
  127. package/dist/dashboard/workflows-action-helpers.js.map +1 -0
  128. package/dist/dashboard.js +196 -269
  129. package/dist/dashboard.js.map +1 -1
  130. package/dist/i18n/en.d.ts.map +1 -1
  131. package/dist/i18n/en.js +266 -0
  132. package/dist/i18n/en.js.map +1 -1
  133. package/dist/i18n/zh.d.ts.map +1 -1
  134. package/dist/i18n/zh.js +266 -0
  135. package/dist/i18n/zh.js.map +1 -1
  136. package/dist/im/lark/card-builder.d.ts +2 -0
  137. package/dist/im/lark/card-builder.d.ts.map +1 -1
  138. package/dist/im/lark/card-builder.js +2 -1
  139. package/dist/im/lark/card-builder.js.map +1 -1
  140. package/dist/im/lark/card-handler.d.ts +54 -2
  141. package/dist/im/lark/card-handler.d.ts.map +1 -1
  142. package/dist/im/lark/card-handler.js +127 -1
  143. package/dist/im/lark/card-handler.js.map +1 -1
  144. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  145. package/dist/im/lark/event-dispatcher.js +22 -0
  146. package/dist/im/lark/event-dispatcher.js.map +1 -1
  147. package/dist/im/lark/groups-card.d.ts +90 -0
  148. package/dist/im/lark/groups-card.d.ts.map +1 -0
  149. package/dist/im/lark/groups-card.js +832 -0
  150. package/dist/im/lark/groups-card.js.map +1 -0
  151. package/dist/im/lark/overview-card.d.ts +101 -0
  152. package/dist/im/lark/overview-card.d.ts.map +1 -0
  153. package/dist/im/lark/overview-card.js +475 -0
  154. package/dist/im/lark/overview-card.js.map +1 -0
  155. package/dist/im/lark/schedules-card.d.ts +96 -0
  156. package/dist/im/lark/schedules-card.d.ts.map +1 -0
  157. package/dist/im/lark/schedules-card.js +892 -0
  158. package/dist/im/lark/schedules-card.js.map +1 -0
  159. package/dist/im/lark/sessions-card.d.ts +117 -0
  160. package/dist/im/lark/sessions-card.d.ts.map +1 -0
  161. package/dist/im/lark/sessions-card.js +870 -0
  162. package/dist/im/lark/sessions-card.js.map +1 -0
  163. package/dist/im/lark/settings-card.d.ts +125 -0
  164. package/dist/im/lark/settings-card.d.ts.map +1 -0
  165. package/dist/im/lark/settings-card.js +433 -0
  166. package/dist/im/lark/settings-card.js.map +1 -0
  167. package/dist/im/lark/workflows-card.d.ts +102 -0
  168. package/dist/im/lark/workflows-card.d.ts.map +1 -0
  169. package/dist/im/lark/workflows-card.js +737 -0
  170. package/dist/im/lark/workflows-card.js.map +1 -0
  171. package/package.json +1 -1
@@ -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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"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Daemon-internal HMAC auth (PR2 / Route B) — signs & verifies internal
3
+ * `/__daemon/*` requests sent by botmux daemons to the dashboard process.
4
+ *
5
+ * Why a new module instead of `auth.ts:verifyHmac`?
6
+ * - `/__cli/rotate` signs only `ts:nonce` (auth.ts:43-45) — a captured signature
7
+ * can be replayed against a DIFFERENT path/method/body.
8
+ * - Route B signs the full request envelope (ts/nonce/method/pathWithQuery/body),
9
+ * so each signature is only valid for one specific call.
10
+ * - We deliberately use the SAME `.dashboard-secret` file as the HMAC key so
11
+ * operators don't have to manage two secrets; the differing signing material
12
+ * prevents cross-protocol replay.
13
+ *
14
+ * Wire format mirrors the existing `/__cli/rotate` convention:
15
+ * - sender: `digest('base64url')` and ships sig as base64url string
16
+ * - receiver: `Buffer.from(sig, 'base64url')` vs raw `.digest()` Buffer with
17
+ * `timingSafeEqual` (see `auth.ts:43-49`)
18
+ *
19
+ * Body rule (B1): request body stream MUST only be read once. `verifyDaemonRequest`
20
+ * consumes it and returns `bodyRaw`; the dispatcher consumes `bodyRaw`, NEVER
21
+ * `req` again.
22
+ */
23
+ import type { IncomingMessage } from 'node:http';
24
+ /** Window during which a (ts, nonce) tuple is accepted; mirrors the spec ±60s. */
25
+ export declare const TS_WINDOW_MS = 60000;
26
+ /** Nonce time-to-live before it can be reused (10 minutes — well over TS_WINDOW). */
27
+ export declare const NONCE_TTL_MS: number;
28
+ /** Hard cap on body size we'll read into memory for signing. */
29
+ export declare const BODY_LIMIT_BYTES: number;
30
+ /** Canonical input fed into `signDaemonRequest`. All fields participate in the digest. */
31
+ export interface SignInput {
32
+ /** `.dashboard-secret` file contents — opaque string used directly as HMAC key. */
33
+ secret: string;
34
+ /** Epoch milliseconds, as a string (no trimming, no normalisation). */
35
+ ts: string;
36
+ /** One-time random base64url string (32 random bytes recommended). */
37
+ nonce: string;
38
+ /** HTTP method; uppercased before being mixed into the digest. */
39
+ method: string;
40
+ /** Request `url` exactly as the server will receive it (path + query, including '?' and '&'). */
41
+ pathWithQuery: string;
42
+ /** Raw body bytes as a UTF-8 string. Empty body → ''. */
43
+ bodyRaw: string;
44
+ }
45
+ export interface SignOutput {
46
+ /** Wire-format signature (base64url, no padding). */
47
+ wire: string;
48
+ /** Raw HMAC digest bytes — used by `timingSafeEqual` on the server side. */
49
+ raw: Buffer;
50
+ }
51
+ /**
52
+ * Compute the HMAC signature for one request. Pure — no IO, no clock reads.
53
+ *
54
+ * Signing material is the canonical 5-line block:
55
+ * ts \n nonce \n METHOD \n pathWithQuery \n sha256(bodyRaw)
56
+ *
57
+ * Query string order is significant (not canonicalised). Server and client MUST
58
+ * agree on the exact `pathWithQuery` byte-for-byte.
59
+ */
60
+ export declare function signDaemonRequest(input: SignInput): SignOutput;
61
+ /**
62
+ * Timing-safe comparison between a wire-format signature and the raw expected
63
+ * digest. Returns `false` on any decoding error rather than throwing — the
64
+ * caller treats a `false` result as `sig_mismatch` without leaking the reason.
65
+ */
66
+ export declare function checkSig(wireSig: string, expectedRaw: Buffer): boolean;
67
+ /** All-or-nothing loopback predicate, identical to `auth.ts`'s inline check. */
68
+ export declare function isLoopback(remoteAddr: string | undefined): boolean;
69
+ /** Persistent (in-memory) nonce store with lazy GC. */
70
+ export interface NonceStore {
71
+ has(nonce: string): boolean;
72
+ add(nonce: string, expiresAt: number): void;
73
+ /** Number of currently tracked nonces. Useful for diagnostics / tests. */
74
+ size(): number;
75
+ }
76
+ export interface ClockLike {
77
+ now(): number;
78
+ }
79
+ /** Default clock — wraps `Date.now`. Replace in tests via the optional `clock` arg. */
80
+ export declare const realClock: ClockLike;
81
+ /**
82
+ * Create an in-process nonce store. Each `has()` triggers a lazy sweep of
83
+ * expired entries so the map cannot grow unbounded across a daemon lifetime.
84
+ */
85
+ export declare function createNonceStore(clock?: ClockLike): NonceStore;
86
+ /**
87
+ * Read the body stream into a single UTF-8 string, with a hard byte cap.
88
+ * Returns `null` when the cap is exceeded (caller maps to 413).
89
+ *
90
+ * Body MUST only be read once per request; `verifyDaemonRequest` is the only
91
+ * site that calls this, and downstream dispatch consumes the returned string.
92
+ */
93
+ export declare function readBodyRaw(req: IncomingMessage, opts?: {
94
+ maxBytes?: number;
95
+ }): Promise<string | null>;
96
+ /** Reasons the verifier may reject a request. Mirror these in HTTP responses. */
97
+ export type VerifyRejection = 'missing_header' | 'remote_not_loopback' | 'ts_malformed' | 'ts_window' | 'replay' | 'sig_mismatch' | 'body_too_large';
98
+ export interface VerifyOk {
99
+ ok: true;
100
+ /** Self-reported daemon app id (audit only — NOT used for authn / authz). */
101
+ appId: string;
102
+ /** Body raw bytes read by verify; dispatcher MUST consume this, not `req`. */
103
+ bodyRaw: string;
104
+ }
105
+ export interface VerifyFail {
106
+ ok: false;
107
+ reason: VerifyRejection;
108
+ /** Suggested HTTP status code for the rejection. */
109
+ httpStatus: number;
110
+ }
111
+ export type VerifyResult = VerifyOk | VerifyFail;
112
+ export interface VerifyOptions {
113
+ /** Override the default clock — used by tests to advance time deterministically. */
114
+ clock?: ClockLike;
115
+ /** Override the default body cap (rare; tests use this to assert 413 quickly). */
116
+ maxBodyBytes?: number;
117
+ }
118
+ /**
119
+ * Verify an inbound `/__daemon/*` request. Consumes the body stream exactly
120
+ * once and returns `bodyRaw` for the dispatcher. On success, the nonce is
121
+ * recorded with a TTL to block replays.
122
+ */
123
+ export declare function verifyDaemonRequest(req: IncomingMessage, secret: string, nonceStore: NonceStore, opts?: VerifyOptions): Promise<VerifyResult>;
124
+ //# sourceMappingURL=daemon-internal-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-internal-auth.d.ts","sourceRoot":"","sources":["../../src/dashboard/daemon-internal-auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,kFAAkF;AAClF,eAAO,MAAM,YAAY,QAAS,CAAC;AAEnC,qFAAqF;AACrF,eAAO,MAAM,YAAY,QAAc,CAAC;AAExC,gEAAgE;AAChE,eAAO,MAAM,gBAAgB,QAAc,CAAC;AAE5C,0FAA0F;AAC1F,MAAM,WAAW,SAAS;IACxB,mFAAmF;IACnF,MAAM,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,EAAE,EAAE,MAAM,CAAC;IACX,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;IACf,iGAAiG;IACjG,aAAa,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,UAAU,CAW9D;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAStE;AAED,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAKlE;AAED,uDAAuD;AACvD,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,0EAA0E;IAC1E,IAAI,IAAI,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,IAAI,MAAM,CAAC;CACf;AAED,uFAAuF;AACvF,eAAO,MAAM,SAAS,EAAE,SAAqC,CAAC;AAE9D;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,GAAE,SAAqB,GAAG,UAAU,CAsBzE;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,eAAe,EACpB,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAWxB;AAED,iFAAiF;AACjF,MAAM,MAAM,eAAe,GACvB,gBAAgB,GAChB,qBAAqB,GACrB,cAAc,GACd,WAAW,GACX,QAAQ,GACR,cAAc,GACd,gBAAgB,CAAC;AAErB,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,IAAI,CAAC;IACT,6EAA6E;IAC7E,KAAK,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,eAAe,CAAC;IACxB,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEjD,MAAM,WAAW,aAAa;IAC5B,oFAAoF;IACpF,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAYD;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,UAAU,EACtB,IAAI,GAAE,aAAkB,GACvB,OAAO,CAAC,YAAY,CAAC,CAsDvB"}
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Daemon-internal HMAC auth (PR2 / Route B) — signs & verifies internal
3
+ * `/__daemon/*` requests sent by botmux daemons to the dashboard process.
4
+ *
5
+ * Why a new module instead of `auth.ts:verifyHmac`?
6
+ * - `/__cli/rotate` signs only `ts:nonce` (auth.ts:43-45) — a captured signature
7
+ * can be replayed against a DIFFERENT path/method/body.
8
+ * - Route B signs the full request envelope (ts/nonce/method/pathWithQuery/body),
9
+ * so each signature is only valid for one specific call.
10
+ * - We deliberately use the SAME `.dashboard-secret` file as the HMAC key so
11
+ * operators don't have to manage two secrets; the differing signing material
12
+ * prevents cross-protocol replay.
13
+ *
14
+ * Wire format mirrors the existing `/__cli/rotate` convention:
15
+ * - sender: `digest('base64url')` and ships sig as base64url string
16
+ * - receiver: `Buffer.from(sig, 'base64url')` vs raw `.digest()` Buffer with
17
+ * `timingSafeEqual` (see `auth.ts:43-49`)
18
+ *
19
+ * Body rule (B1): request body stream MUST only be read once. `verifyDaemonRequest`
20
+ * consumes it and returns `bodyRaw`; the dispatcher consumes `bodyRaw`, NEVER
21
+ * `req` again.
22
+ */
23
+ import { createHash, createHmac, timingSafeEqual } from 'node:crypto';
24
+ /** Window during which a (ts, nonce) tuple is accepted; mirrors the spec ±60s. */
25
+ export const TS_WINDOW_MS = 60_000;
26
+ /** Nonce time-to-live before it can be reused (10 minutes — well over TS_WINDOW). */
27
+ export const NONCE_TTL_MS = 10 * 60_000;
28
+ /** Hard cap on body size we'll read into memory for signing. */
29
+ export const BODY_LIMIT_BYTES = 1024 * 1024;
30
+ /**
31
+ * Compute the HMAC signature for one request. Pure — no IO, no clock reads.
32
+ *
33
+ * Signing material is the canonical 5-line block:
34
+ * ts \n nonce \n METHOD \n pathWithQuery \n sha256(bodyRaw)
35
+ *
36
+ * Query string order is significant (not canonicalised). Server and client MUST
37
+ * agree on the exact `pathWithQuery` byte-for-byte.
38
+ */
39
+ export function signDaemonRequest(input) {
40
+ const bodyHashHex = createHash('sha256').update(input.bodyRaw).digest('hex');
41
+ const material = [
42
+ input.ts,
43
+ input.nonce,
44
+ input.method.toUpperCase(),
45
+ input.pathWithQuery,
46
+ bodyHashHex,
47
+ ].join('\n');
48
+ const raw = createHmac('sha256', input.secret).update(material).digest();
49
+ return { wire: raw.toString('base64url'), raw };
50
+ }
51
+ /**
52
+ * Timing-safe comparison between a wire-format signature and the raw expected
53
+ * digest. Returns `false` on any decoding error rather than throwing — the
54
+ * caller treats a `false` result as `sig_mismatch` without leaking the reason.
55
+ */
56
+ export function checkSig(wireSig, expectedRaw) {
57
+ let provided;
58
+ try {
59
+ provided = Buffer.from(wireSig, 'base64url');
60
+ }
61
+ catch {
62
+ return false;
63
+ }
64
+ if (provided.length !== expectedRaw.length)
65
+ return false;
66
+ return timingSafeEqual(provided, expectedRaw);
67
+ }
68
+ /** All-or-nothing loopback predicate, identical to `auth.ts`'s inline check. */
69
+ export function isLoopback(remoteAddr) {
70
+ if (!remoteAddr)
71
+ return false;
72
+ if (remoteAddr === '127.0.0.1' || remoteAddr === '::1')
73
+ return true;
74
+ if (remoteAddr.endsWith('::ffff:127.0.0.1'))
75
+ return true;
76
+ return false;
77
+ }
78
+ /** Default clock — wraps `Date.now`. Replace in tests via the optional `clock` arg. */
79
+ export const realClock = { now: () => Date.now() };
80
+ /**
81
+ * Create an in-process nonce store. Each `has()` triggers a lazy sweep of
82
+ * expired entries so the map cannot grow unbounded across a daemon lifetime.
83
+ */
84
+ export function createNonceStore(clock = realClock) {
85
+ const m = new Map();
86
+ const gc = (now) => {
87
+ for (const [n, exp] of m) {
88
+ if (exp <= now)
89
+ m.delete(n);
90
+ }
91
+ };
92
+ return {
93
+ has(nonce) {
94
+ gc(clock.now());
95
+ return m.has(nonce);
96
+ },
97
+ add(nonce, expiresAt) {
98
+ m.set(nonce, expiresAt);
99
+ },
100
+ size() {
101
+ gc(clock.now());
102
+ return m.size;
103
+ },
104
+ };
105
+ }
106
+ /**
107
+ * Read the body stream into a single UTF-8 string, with a hard byte cap.
108
+ * Returns `null` when the cap is exceeded (caller maps to 413).
109
+ *
110
+ * Body MUST only be read once per request; `verifyDaemonRequest` is the only
111
+ * site that calls this, and downstream dispatch consumes the returned string.
112
+ */
113
+ export async function readBodyRaw(req, opts = {}) {
114
+ const cap = opts.maxBytes ?? BODY_LIMIT_BYTES;
115
+ let total = 0;
116
+ const chunks = [];
117
+ for await (const chunk of req) {
118
+ const buf = chunk;
119
+ total += buf.length;
120
+ if (total > cap)
121
+ return null;
122
+ chunks.push(buf);
123
+ }
124
+ return Buffer.concat(chunks).toString('utf8');
125
+ }
126
+ /**
127
+ * Read a single header value. Node normally comma-joins duplicate wire headers;
128
+ * array-valued headers can still appear in tests/custom callers. Accept only
129
+ * strings so malformed arrays fail as missing headers instead of picking one.
130
+ */
131
+ function headerStr(req, name) {
132
+ const v = req.headers[name];
133
+ return typeof v === 'string' ? v : undefined;
134
+ }
135
+ /**
136
+ * Verify an inbound `/__daemon/*` request. Consumes the body stream exactly
137
+ * once and returns `bodyRaw` for the dispatcher. On success, the nonce is
138
+ * recorded with a TTL to block replays.
139
+ */
140
+ export async function verifyDaemonRequest(req, secret, nonceStore, opts = {}) {
141
+ const clock = opts.clock ?? realClock;
142
+ const ts = headerStr(req, 'x-botmux-daemon-ts');
143
+ const nonce = headerStr(req, 'x-botmux-daemon-nonce');
144
+ const sig = headerStr(req, 'x-botmux-daemon-sig');
145
+ const appId = headerStr(req, 'x-botmux-daemon-appid');
146
+ if (!ts || !nonce || !sig || !appId) {
147
+ return { ok: false, reason: 'missing_header', httpStatus: 400 };
148
+ }
149
+ if (!isLoopback(req.socket?.remoteAddress)) {
150
+ return { ok: false, reason: 'remote_not_loopback', httpStatus: 403 };
151
+ }
152
+ // Stricter than parseInt — rejects '123abc' / '1.5' / '' / 'NaN' / Infinity.
153
+ const tsMs = Number(ts);
154
+ if (!Number.isFinite(tsMs) || !Number.isInteger(tsMs)) {
155
+ return { ok: false, reason: 'ts_malformed', httpStatus: 401 };
156
+ }
157
+ if (Math.abs(clock.now() - tsMs) > TS_WINDOW_MS) {
158
+ return { ok: false, reason: 'ts_window', httpStatus: 401 };
159
+ }
160
+ // Body must be read BEFORE the nonce check so that the `has → add` window
161
+ // contains no `await` — concurrent requests with the same nonce can each
162
+ // pass `has()` only one at a time, which then `add()`s the entry before any
163
+ // other microtask can run. See test: "concurrent requests with the same
164
+ // nonce — exactly one is accepted".
165
+ const bodyRaw = await readBodyRaw(req, { maxBytes: opts.maxBodyBytes ?? BODY_LIMIT_BYTES });
166
+ if (bodyRaw === null) {
167
+ return { ok: false, reason: 'body_too_large', httpStatus: 413 };
168
+ }
169
+ // ─── Synchronous block — no `await` until `add()` finishes. ───
170
+ if (nonceStore.has(nonce)) {
171
+ return { ok: false, reason: 'replay', httpStatus: 401 };
172
+ }
173
+ const { raw: expected } = signDaemonRequest({
174
+ secret,
175
+ ts,
176
+ nonce,
177
+ method: req.method ?? 'GET',
178
+ pathWithQuery: req.url ?? '/',
179
+ bodyRaw,
180
+ });
181
+ if (!checkSig(sig, expected)) {
182
+ return { ok: false, reason: 'sig_mismatch', httpStatus: 401 };
183
+ }
184
+ nonceStore.add(nonce, clock.now() + NONCE_TTL_MS);
185
+ // ─── End synchronous block. ───
186
+ return { ok: true, appId, bodyRaw };
187
+ }
188
+ //# sourceMappingURL=daemon-internal-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-internal-auth.js","sourceRoot":"","sources":["../../src/dashboard/daemon-internal-auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Daemon-internal HTTP client (PR2 C7) — used by daemon processes to talk to
3
+ * the dashboard's `/__daemon/*` Route B endpoints with HMAC auth.
4
+ *
5
+ * Retry policy (codex C7 gate):
6
+ * - GET defaults to N retries with exponential backoff. Each attempt mints
7
+ * a fresh `ts + nonce + sig`; we never reuse a signature.
8
+ * - Non-GET (POST/PUT/DELETE) defaults to NO retry to avoid double-effect
9
+ * on close/resume/leave/disband/settings-write/etc. Callers can opt in
10
+ * with `retryUnsafeWrites: true` when they're confident the endpoint is
11
+ * idempotent end-to-end.
12
+ * - 401 is never retried (sig will not become valid by retrying).
13
+ * - 4xx other than 408/429 is also never retried.
14
+ * - Network errors and timeouts follow the same per-method policy.
15
+ *
16
+ * Signed `pathWithQuery` is forwarded BYTE-FOR-BYTE to fetch; we never
17
+ * canonicalise the query string. Callers that build URLs MUST control their
18
+ * own parameter order.
19
+ *
20
+ * The client never touches the real dashboard in tests — `fetch` / `now` /
21
+ * `randomNonce` / `secret` are all injectable.
22
+ */
23
+ export interface DaemonClientOptions {
24
+ /** Base URL of the dashboard process (default `http://127.0.0.1:7891`). */
25
+ dashboardUrl?: string;
26
+ /** Override the HMAC key. Production loads from `.dashboard-secret` if omitted. */
27
+ secret?: string;
28
+ /** Override `.dashboard-secret` path (tests). */
29
+ secretPath?: string;
30
+ /** Identifier this daemon reports in the `X-Botmux-Daemon-AppId` header (audit, not authn). */
31
+ appId: string;
32
+ /** Override `fetch` (tests). */
33
+ fetch?: typeof fetch;
34
+ /** Override `Date.now` (tests). */
35
+ now?: () => number;
36
+ /** Override nonce source (tests). Default 32 random bytes base64url. */
37
+ randomNonce?: () => string;
38
+ /** Default retry count for GETs / write+retryUnsafeWrites. Default 3. */
39
+ retries?: number;
40
+ /** Override backoff schedule. Default: min(100ms * 2^attempt, 5000ms). */
41
+ backoffMs?: (attempt: number) => number;
42
+ /** Per-request timeout default. Default 5000ms. */
43
+ timeoutMs?: number;
44
+ /** Skip sleeping between retries — used by tests to keep runtime O(ms). */
45
+ skipBackoffSleep?: boolean;
46
+ }
47
+ export interface DaemonRequestOptions {
48
+ method?: string;
49
+ /** Path + query as a single string, e.g. '/__daemon/sessions-list?all=1'. Signed verbatim. */
50
+ path: string;
51
+ body?: unknown;
52
+ retryUnsafeWrites?: boolean;
53
+ retries?: number;
54
+ timeoutMs?: number;
55
+ }
56
+ export interface DaemonClientResponse {
57
+ status: number;
58
+ /** Decoded JSON when the response was JSON; otherwise the raw text. */
59
+ body: unknown;
60
+ /** Raw response text (whether or not it was JSON-parseable). */
61
+ raw: string;
62
+ }
63
+ export interface DaemonClient {
64
+ request(opts: DaemonRequestOptions): Promise<DaemonClientResponse>;
65
+ }
66
+ export declare function createDaemonClient(opts: DaemonClientOptions): DaemonClient;
67
+ //# sourceMappingURL=daemon-internal-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-internal-client.d.ts","sourceRoot":"","sources":["../../src/dashboard/daemon-internal-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAiBH,MAAM,WAAW,mBAAmB;IAClC,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mFAAmF;IACnF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+FAA+F;IAC/F,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,mCAAmC;IACnC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,MAAM,CAAC;IAC3B,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;IACxC,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8FAA8F;IAC9F,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,IAAI,EAAE,OAAO,CAAC;IACd,gEAAgE;IAChE,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACpE;AAsCD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,GAAG,YAAY,CAgF1E"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Daemon-internal HTTP client (PR2 C7) — used by daemon processes to talk to
3
+ * the dashboard's `/__daemon/*` Route B endpoints with HMAC auth.
4
+ *
5
+ * Retry policy (codex C7 gate):
6
+ * - GET defaults to N retries with exponential backoff. Each attempt mints
7
+ * a fresh `ts + nonce + sig`; we never reuse a signature.
8
+ * - Non-GET (POST/PUT/DELETE) defaults to NO retry to avoid double-effect
9
+ * on close/resume/leave/disband/settings-write/etc. Callers can opt in
10
+ * with `retryUnsafeWrites: true` when they're confident the endpoint is
11
+ * idempotent end-to-end.
12
+ * - 401 is never retried (sig will not become valid by retrying).
13
+ * - 4xx other than 408/429 is also never retried.
14
+ * - Network errors and timeouts follow the same per-method policy.
15
+ *
16
+ * Signed `pathWithQuery` is forwarded BYTE-FOR-BYTE to fetch; we never
17
+ * canonicalise the query string. Callers that build URLs MUST control their
18
+ * own parameter order.
19
+ *
20
+ * The client never touches the real dashboard in tests — `fetch` / `now` /
21
+ * `randomNonce` / `secret` are all injectable.
22
+ */
23
+ import { homedir } from 'node:os';
24
+ import { join } from 'node:path';
25
+ import { randomBytes } from 'node:crypto';
26
+ import { loadDashboardSecret } from './auth.js';
27
+ import { signDaemonRequest } from './daemon-internal-auth.js';
28
+ const DEFAULT_DASHBOARD_URL = 'http://127.0.0.1:7891';
29
+ const DEFAULT_RETRIES = 3;
30
+ const DEFAULT_TIMEOUT_MS = 5000;
31
+ const DEFAULT_BASE_BACKOFF_MS = 100;
32
+ const DEFAULT_MAX_BACKOFF_MS = 5_000;
33
+ const SECRET_PATH_DEFAULT = join(homedir(), '.botmux', '.dashboard-secret');
34
+ function defaultBackoffMs(attempt) {
35
+ return Math.min(DEFAULT_BASE_BACKOFF_MS * 2 ** attempt, DEFAULT_MAX_BACKOFF_MS);
36
+ }
37
+ function defaultNonce() {
38
+ return randomBytes(32).toString('base64url');
39
+ }
40
+ function loadSecretFromFile(secretPath) {
41
+ const secret = loadDashboardSecret(secretPath);
42
+ if (!secret)
43
+ throw new Error('dashboard_secret_missing');
44
+ return secret;
45
+ }
46
+ /**
47
+ * Decide whether the failed attempt is retriable.
48
+ * - 401 → never (signature mismatch / replay etc. — retrying with the same
49
+ * parameters cannot fix it).
50
+ * - Other 4xx except 408 (Request Timeout) and 429 (Too Many Requests) →
51
+ * never retry; these are caller-side errors.
52
+ * - 5xx / 408 / 429 / network error → retry only when `retryAllowed`.
53
+ */
54
+ function isRetriable(status, retryAllowed) {
55
+ if (!retryAllowed)
56
+ return false;
57
+ if (status === undefined)
58
+ return true; // network error / timeout
59
+ if (status === 401)
60
+ return false;
61
+ if (status >= 400 && status < 500) {
62
+ return status === 408 || status === 429;
63
+ }
64
+ return status >= 500;
65
+ }
66
+ function sleep(ms) {
67
+ return new Promise(resolve => setTimeout(resolve, ms));
68
+ }
69
+ export function createDaemonClient(opts) {
70
+ const dashboardUrl = opts.dashboardUrl ?? DEFAULT_DASHBOARD_URL;
71
+ const secret = opts.secret?.trim() ?? loadSecretFromFile(opts.secretPath ?? SECRET_PATH_DEFAULT);
72
+ if (!secret)
73
+ throw new Error('dashboard_secret_missing');
74
+ const appId = opts.appId;
75
+ const fetchFn = opts.fetch ?? fetch;
76
+ const now = opts.now ?? Date.now;
77
+ const nonceFn = opts.randomNonce ?? defaultNonce;
78
+ const defaultRetries = opts.retries ?? DEFAULT_RETRIES;
79
+ const backoffMs = opts.backoffMs ?? defaultBackoffMs;
80
+ const defaultTimeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
81
+ const skipSleep = opts.skipBackoffSleep === true;
82
+ async function request(reqOpts) {
83
+ const method = (reqOpts.method ?? 'GET').toUpperCase();
84
+ const isGet = method === 'GET';
85
+ const retryAllowed = isGet || reqOpts.retryUnsafeWrites === true;
86
+ // `retries` is the number of EXTRA attempts on top of the initial one,
87
+ // so `retries=0` means one attempt and no retry. Negative values clamp
88
+ // to 0 rather than throwing — caller intent is "no retry".
89
+ const retryCount = Math.max(0, reqOpts.retries ?? defaultRetries);
90
+ const maxAttempts = retryAllowed ? retryCount + 1 : 1;
91
+ const timeoutMs = reqOpts.timeoutMs ?? defaultTimeoutMs;
92
+ const bodyRaw = reqOpts.body === undefined ? '' : JSON.stringify(reqOpts.body);
93
+ const fetchUrl = dashboardUrl + reqOpts.path;
94
+ let lastResponse;
95
+ let lastError;
96
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
97
+ // Every attempt MUST mint a fresh ts + nonce + sig — server enforces a
98
+ // 10-min nonce TTL but ALSO has a ±60s ts window, and reusing the same
99
+ // (ts, nonce) just causes a guaranteed `replay` rejection.
100
+ const ts = String(now());
101
+ const nonce = nonceFn();
102
+ const { wire } = signDaemonRequest({
103
+ secret, ts, nonce, method, pathWithQuery: reqOpts.path, bodyRaw,
104
+ });
105
+ const controller = new AbortController();
106
+ const timeoutHandle = setTimeout(() => controller.abort(), timeoutMs);
107
+ try {
108
+ const res = await fetchFn(fetchUrl, {
109
+ method,
110
+ headers: {
111
+ 'x-botmux-daemon-ts': ts,
112
+ 'x-botmux-daemon-nonce': nonce,
113
+ 'x-botmux-daemon-sig': wire,
114
+ 'x-botmux-daemon-appid': appId,
115
+ 'content-type': 'application/json',
116
+ },
117
+ body: bodyRaw.length > 0 ? bodyRaw : undefined,
118
+ signal: controller.signal,
119
+ });
120
+ const text = await res.text();
121
+ let parsed;
122
+ try {
123
+ parsed = text.length > 0 ? JSON.parse(text) : undefined;
124
+ }
125
+ catch {
126
+ parsed = text;
127
+ }
128
+ lastResponse = { status: res.status, body: parsed, raw: text };
129
+ if (res.status < 400)
130
+ return lastResponse;
131
+ if (!isRetriable(res.status, retryAllowed))
132
+ return lastResponse;
133
+ if (attempt === maxAttempts - 1)
134
+ return lastResponse;
135
+ if (!skipSleep)
136
+ await sleep(backoffMs(attempt));
137
+ }
138
+ catch (error) {
139
+ lastError = error;
140
+ if (!isRetriable(undefined, retryAllowed))
141
+ throw error;
142
+ if (attempt === maxAttempts - 1)
143
+ throw error;
144
+ if (!skipSleep)
145
+ await sleep(backoffMs(attempt));
146
+ }
147
+ finally {
148
+ clearTimeout(timeoutHandle);
149
+ }
150
+ }
151
+ if (lastResponse)
152
+ return lastResponse;
153
+ throw lastError ?? new Error('daemon_client_unknown_error');
154
+ }
155
+ return { request };
156
+ }
157
+ //# sourceMappingURL=daemon-internal-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-internal-client.js","sourceRoot":"","sources":["../../src/dashboard/daemon-internal-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,MAAM,qBAAqB,GAAG,uBAAuB,CAAC;AACtD,MAAM,eAAe,GAAG,CAAC,CAAC;AAC1B,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AACpC,MAAM,sBAAsB,GAAG,KAAK,CAAC;AAErC,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC;AAiD5E,SAAS,gBAAgB,CAAC,OAAe;IACvC,OAAO,IAAI,CAAC,GAAG,CAAC,uBAAuB,GAAG,CAAC,IAAI,OAAO,EAAE,sBAAsB,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,YAAY;IACnB,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,kBAAkB,CAAC,UAAkB;IAC5C,MAAM,MAAM,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACzD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,WAAW,CAAC,MAA0B,EAAE,YAAqB;IACpE,IAAI,CAAC,YAAY;QAAE,OAAO,KAAK,CAAC;IAChC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,CAAC,0BAA0B;IACjE,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IACjC,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;QAClC,OAAO,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC;IAC1C,CAAC;IACD,OAAO,MAAM,IAAI,GAAG,CAAC;AACvB,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAyB;IAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,qBAAqB,CAAC;IAChE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,kBAAkB,CAAC,IAAI,CAAC,UAAU,IAAI,mBAAmB,CAAC,CAAC;IACjG,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACzB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC;IACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,IAAI,YAAY,CAAC;IACjD,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,IAAI,eAAe,CAAC;IACvD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,gBAAgB,CAAC;IACrD,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAC;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,KAAK,IAAI,CAAC;IAEjD,KAAK,UAAU,OAAO,CAAC,OAA6B;QAClD,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QACvD,MAAM,KAAK,GAAG,MAAM,KAAK,KAAK,CAAC;QAC/B,MAAM,YAAY,GAAG,KAAK,IAAI,OAAO,CAAC,iBAAiB,KAAK,IAAI,CAAC;QACjE,uEAAuE;QACvE,uEAAuE;QACvE,2DAA2D;QAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,IAAI,cAAc,CAAC,CAAC;QAClE,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,gBAAgB,CAAC;QACxD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/E,MAAM,QAAQ,GAAG,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;QAE7C,IAAI,YAA8C,CAAC;QACnD,IAAI,SAAkB,CAAC;QAEvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;YACvD,uEAAuE;YACvE,uEAAuE;YACvE,2DAA2D;YAC3D,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;YACzB,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC;YACxB,MAAM,EAAE,IAAI,EAAE,GAAG,iBAAiB,CAAC;gBACjC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO;aAChE,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;YAEtE,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE;oBAClC,MAAM;oBACN,OAAO,EAAE;wBACP,oBAAoB,EAAE,EAAE;wBACxB,uBAAuB,EAAE,KAAK;wBAC9B,qBAAqB,EAAE,IAAI;wBAC3B,uBAAuB,EAAE,KAAK;wBAC9B,cAAc,EAAE,kBAAkB;qBACnC;oBACD,IAAI,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;oBAC9C,MAAM,EAAE,UAAU,CAAC,MAAM;iBAC1B,CAAC,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC9B,IAAI,MAAe,CAAC;gBACpB,IAAI,CAAC;oBAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAAC,CAAC;gBAChE,MAAM,CAAC;oBAAC,MAAM,GAAG,IAAI,CAAC;gBAAC,CAAC;gBACxB,YAAY,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;gBAE/D,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG;oBAAE,OAAO,YAAY,CAAC;gBAC1C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC;oBAAE,OAAO,YAAY,CAAC;gBAChE,IAAI,OAAO,KAAK,WAAW,GAAG,CAAC;oBAAE,OAAO,YAAY,CAAC;gBACrD,IAAI,CAAC,SAAS;oBAAE,MAAM,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YAClD,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,SAAS,GAAG,KAAK,CAAC;gBAClB,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,YAAY,CAAC;oBAAE,MAAM,KAAK,CAAC;gBACvD,IAAI,OAAO,KAAK,WAAW,GAAG,CAAC;oBAAE,MAAM,KAAK,CAAC;gBAC7C,IAAI,CAAC,SAAS;oBAAE,MAAM,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YAClD,CAAC;oBAAS,CAAC;gBACT,YAAY,CAAC,aAAa,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,IAAI,YAAY;YAAE,OAAO,YAAY,CAAC;QACtC,MAAM,SAAS,IAAI,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface DashboardAdminLookupDeps {
2
+ getDashboardAdminOpenIds?: (larkAppId: string) => ReadonlyArray<string> | undefined;
3
+ /** Legacy test seam retained while callers migrate from first-owner checks. */
4
+ getOwnerOpenId?: (larkAppId: string) => string | undefined;
5
+ }
6
+ export declare function resolveDashboardAdminOpenIds(larkAppId: string, deps?: DashboardAdminLookupDeps): string[];
7
+ export declare function isDashboardAdmin(larkAppId: string, openId: string | undefined, deps?: DashboardAdminLookupDeps): openId is string;
8
+ //# sourceMappingURL=dashboard-admins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-admins.d.ts","sourceRoot":"","sources":["../../src/dashboard/dashboard-admins.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,wBAAwB;IACvC,wBAAwB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,aAAa,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IACpF,+EAA+E;IAC/E,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CAC5D;AAED,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,wBAA6B,GAClC,MAAM,EAAE,CASV;AAED,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,IAAI,GAAE,wBAA6B,GAClC,MAAM,IAAI,MAAM,CAElB"}
@@ -0,0 +1,15 @@
1
+ import { getDashboardAdminOpenIds as defaultGetDashboardAdminOpenIds } from '../bot-registry.js';
2
+ export function resolveDashboardAdminOpenIds(larkAppId, deps = {}) {
3
+ if (deps.getDashboardAdminOpenIds) {
4
+ return [...(deps.getDashboardAdminOpenIds(larkAppId) ?? [])].filter(Boolean);
5
+ }
6
+ if (deps.getOwnerOpenId) {
7
+ const owner = deps.getOwnerOpenId(larkAppId);
8
+ return owner ? [owner] : [];
9
+ }
10
+ return defaultGetDashboardAdminOpenIds(larkAppId).filter(Boolean);
11
+ }
12
+ export function isDashboardAdmin(larkAppId, openId, deps = {}) {
13
+ return !!openId && resolveDashboardAdminOpenIds(larkAppId, deps).includes(openId);
14
+ }
15
+ //# sourceMappingURL=dashboard-admins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-admins.js","sourceRoot":"","sources":["../../src/dashboard/dashboard-admins.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,IAAI,+BAA+B,EAAE,MAAM,oBAAoB,CAAC;AAQjG,MAAM,UAAU,4BAA4B,CAC1C,SAAiB,EACjB,OAAiC,EAAE;IAEnC,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAC7C,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,+BAA+B,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,SAAiB,EACjB,MAA0B,EAC1B,OAAiC,EAAE;IAEnC,OAAO,CAAC,CAAC,MAAM,IAAI,4BAA4B,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACpF,CAAC"}