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.
Files changed (178) 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/core/session-create.d.ts +0 -1
  54. package/dist/core/session-create.d.ts.map +1 -1
  55. package/dist/core/session-create.js +0 -3
  56. package/dist/core/session-create.js.map +1 -1
  57. package/dist/core/session-manager.d.ts.map +1 -1
  58. package/dist/core/session-manager.js +3 -2
  59. package/dist/core/session-manager.js.map +1 -1
  60. package/dist/daemon-internal-client-wrapper.d.ts +41 -0
  61. package/dist/daemon-internal-client-wrapper.d.ts.map +1 -0
  62. package/dist/daemon-internal-client-wrapper.js +65 -0
  63. package/dist/daemon-internal-client-wrapper.js.map +1 -0
  64. package/dist/dashboard/aggregator.d.ts +12 -0
  65. package/dist/dashboard/aggregator.d.ts.map +1 -1
  66. package/dist/dashboard/aggregator.js +16 -0
  67. package/dist/dashboard/aggregator.js.map +1 -1
  68. package/dist/dashboard/auth.d.ts +7 -0
  69. package/dist/dashboard/auth.d.ts.map +1 -1
  70. package/dist/dashboard/auth.js +21 -0
  71. package/dist/dashboard/auth.js.map +1 -1
  72. package/dist/dashboard/card-model-types.d.ts +50 -0
  73. package/dist/dashboard/card-model-types.d.ts.map +1 -0
  74. package/dist/dashboard/card-model-types.js +9 -0
  75. package/dist/dashboard/card-model-types.js.map +1 -0
  76. package/dist/dashboard/daemon-internal-api.d.ts +90 -0
  77. package/dist/dashboard/daemon-internal-api.d.ts.map +1 -0
  78. package/dist/dashboard/daemon-internal-api.js +534 -0
  79. package/dist/dashboard/daemon-internal-api.js.map +1 -0
  80. package/dist/dashboard/daemon-internal-auth.d.ts +124 -0
  81. package/dist/dashboard/daemon-internal-auth.d.ts.map +1 -0
  82. package/dist/dashboard/daemon-internal-auth.js +188 -0
  83. package/dist/dashboard/daemon-internal-auth.js.map +1 -0
  84. package/dist/dashboard/daemon-internal-client.d.ts +67 -0
  85. package/dist/dashboard/daemon-internal-client.d.ts.map +1 -0
  86. package/dist/dashboard/daemon-internal-client.js +157 -0
  87. package/dist/dashboard/daemon-internal-client.js.map +1 -0
  88. package/dist/dashboard/dashboard-admins.d.ts +8 -0
  89. package/dist/dashboard/dashboard-admins.d.ts.map +1 -0
  90. package/dist/dashboard/dashboard-admins.js +15 -0
  91. package/dist/dashboard/dashboard-admins.js.map +1 -0
  92. package/dist/dashboard/federation-spoke-api.d.ts +3 -0
  93. package/dist/dashboard/federation-spoke-api.d.ts.map +1 -1
  94. package/dist/dashboard/federation-spoke-api.js +11 -8
  95. package/dist/dashboard/federation-spoke-api.js.map +1 -1
  96. package/dist/dashboard/groups-action-helpers.d.ts +69 -0
  97. package/dist/dashboard/groups-action-helpers.d.ts.map +1 -0
  98. package/dist/dashboard/groups-action-helpers.js +141 -0
  99. package/dist/dashboard/groups-action-helpers.js.map +1 -0
  100. package/dist/dashboard/groups-card-model.d.ts +120 -0
  101. package/dist/dashboard/groups-card-model.d.ts.map +1 -0
  102. package/dist/dashboard/groups-card-model.js +175 -0
  103. package/dist/dashboard/groups-card-model.js.map +1 -0
  104. package/dist/dashboard/schedule-card-model.d.ts +172 -0
  105. package/dist/dashboard/schedule-card-model.d.ts.map +1 -0
  106. package/dist/dashboard/schedule-card-model.js +290 -0
  107. package/dist/dashboard/schedule-card-model.js.map +1 -0
  108. package/dist/dashboard/session-card-model.d.ts +83 -0
  109. package/dist/dashboard/session-card-model.d.ts.map +1 -0
  110. package/dist/dashboard/session-card-model.js +196 -0
  111. package/dist/dashboard/session-card-model.js.map +1 -0
  112. package/dist/dashboard/settings-card-model.d.ts +73 -0
  113. package/dist/dashboard/settings-card-model.d.ts.map +1 -0
  114. package/dist/dashboard/settings-card-model.js +94 -0
  115. package/dist/dashboard/settings-card-model.js.map +1 -0
  116. package/dist/dashboard/settings-owner-resolver.d.ts +32 -0
  117. package/dist/dashboard/settings-owner-resolver.d.ts.map +1 -0
  118. package/dist/dashboard/settings-owner-resolver.js +43 -0
  119. package/dist/dashboard/settings-owner-resolver.js.map +1 -0
  120. package/dist/dashboard/settings-write-applier.d.ts +84 -0
  121. package/dist/dashboard/settings-write-applier.d.ts.map +1 -0
  122. package/dist/dashboard/settings-write-applier.js +119 -0
  123. package/dist/dashboard/settings-write-applier.js.map +1 -0
  124. package/dist/dashboard/workflow-api.d.ts.map +1 -1
  125. package/dist/dashboard/workflow-api.js +38 -119
  126. package/dist/dashboard/workflow-api.js.map +1 -1
  127. package/dist/dashboard/workflow-card-model.d.ts +127 -0
  128. package/dist/dashboard/workflow-card-model.d.ts.map +1 -0
  129. package/dist/dashboard/workflow-card-model.js +186 -0
  130. package/dist/dashboard/workflow-card-model.js.map +1 -0
  131. package/dist/dashboard/workflows-action-helpers.d.ts +105 -0
  132. package/dist/dashboard/workflows-action-helpers.d.ts.map +1 -0
  133. package/dist/dashboard/workflows-action-helpers.js +196 -0
  134. package/dist/dashboard/workflows-action-helpers.js.map +1 -0
  135. package/dist/dashboard.js +196 -271
  136. package/dist/dashboard.js.map +1 -1
  137. package/dist/i18n/en.d.ts.map +1 -1
  138. package/dist/i18n/en.js +266 -0
  139. package/dist/i18n/en.js.map +1 -1
  140. package/dist/i18n/zh.d.ts.map +1 -1
  141. package/dist/i18n/zh.js +266 -0
  142. package/dist/i18n/zh.js.map +1 -1
  143. package/dist/im/lark/card-builder.d.ts +2 -0
  144. package/dist/im/lark/card-builder.d.ts.map +1 -1
  145. package/dist/im/lark/card-builder.js +2 -1
  146. package/dist/im/lark/card-builder.js.map +1 -1
  147. package/dist/im/lark/card-handler.d.ts +54 -2
  148. package/dist/im/lark/card-handler.d.ts.map +1 -1
  149. package/dist/im/lark/card-handler.js +127 -1
  150. package/dist/im/lark/card-handler.js.map +1 -1
  151. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  152. package/dist/im/lark/event-dispatcher.js +22 -0
  153. package/dist/im/lark/event-dispatcher.js.map +1 -1
  154. package/dist/im/lark/groups-card.d.ts +90 -0
  155. package/dist/im/lark/groups-card.d.ts.map +1 -0
  156. package/dist/im/lark/groups-card.js +832 -0
  157. package/dist/im/lark/groups-card.js.map +1 -0
  158. package/dist/im/lark/overview-card.d.ts +101 -0
  159. package/dist/im/lark/overview-card.d.ts.map +1 -0
  160. package/dist/im/lark/overview-card.js +475 -0
  161. package/dist/im/lark/overview-card.js.map +1 -0
  162. package/dist/im/lark/schedules-card.d.ts +96 -0
  163. package/dist/im/lark/schedules-card.d.ts.map +1 -0
  164. package/dist/im/lark/schedules-card.js +892 -0
  165. package/dist/im/lark/schedules-card.js.map +1 -0
  166. package/dist/im/lark/sessions-card.d.ts +117 -0
  167. package/dist/im/lark/sessions-card.d.ts.map +1 -0
  168. package/dist/im/lark/sessions-card.js +870 -0
  169. package/dist/im/lark/sessions-card.js.map +1 -0
  170. package/dist/im/lark/settings-card.d.ts +125 -0
  171. package/dist/im/lark/settings-card.d.ts.map +1 -0
  172. package/dist/im/lark/settings-card.js +433 -0
  173. package/dist/im/lark/settings-card.js.map +1 -0
  174. package/dist/im/lark/workflows-card.d.ts +102 -0
  175. package/dist/im/lark/workflows-card.d.ts.map +1 -0
  176. package/dist/im/lark/workflows-card.js +737 -0
  177. package/dist/im/lark/workflows-card.js.map +1 -0
  178. package/package.json +1 -1
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Daemon-side wrapper around the PR2 `createDaemonClient` (PR3 C3).
3
+ *
4
+ * Daemons calling Route B (`/__daemon/*`) live in the same host as the
5
+ * dashboard but use a separate process; they need a `DaemonClient` that:
6
+ * - signs with `~/.botmux/.dashboard-secret`
7
+ * - targets the port the dashboard is actually bound to (which may differ
8
+ * from the configured default when EADDRINUSE forces a probe upward),
9
+ * read from `~/.botmux/.dashboard-port`
10
+ * - reports the daemon's own larkAppId in the audit header
11
+ *
12
+ * Caching rationale (plan v3 B6): we do NOT cache the resulting client per
13
+ * larkAppId. `createDaemonClient` is cheap (one secret file read + a closure)
14
+ * and a cached instance would route to a stale port if the dashboard
15
+ * process restarts on a different bound port. Per-request `create + sign +
16
+ * fetch` is the safe default.
17
+ *
18
+ * Port parser strictness (plan v4 B4): we use `Number(raw.trim())` plus
19
+ * `Number.isInteger` and a `1..65535` range check. `parseInt('7891abc', 10)`
20
+ * silently returns `7891`, which would make a corrupt file indistinguishable
21
+ * from the default — exactly the case the regression tests pin down.
22
+ */
23
+ import { createDaemonClient as defaultCreateDaemonClient, type DaemonClient } from './dashboard/daemon-internal-client.js';
24
+ /** Optional injection seam — tests provide alternate paths / factories. */
25
+ export interface ClientWrapperOptions {
26
+ /** Override `.dashboard-port` location (tests point at tmp files). */
27
+ portPath?: string;
28
+ /** Override the underlying `createDaemonClient` factory (tests assert call count). */
29
+ createClient?: typeof defaultCreateDaemonClient;
30
+ }
31
+ /**
32
+ * Read `.dashboard-port` if present and parseable; otherwise return the
33
+ * default 7891. Pure with respect to its `portPath` argument.
34
+ */
35
+ export declare function resolveDashboardUrl(portPath?: string): string;
36
+ /**
37
+ * Build a fresh `DaemonClient` for the given larkAppId. New instance per
38
+ * call by design — see the caching rationale in the module-level comment.
39
+ */
40
+ export declare function createDaemonClientFor(larkAppId: string, opts?: ClientWrapperOptions): DaemonClient;
41
+ //# sourceMappingURL=daemon-internal-client-wrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-internal-client-wrapper.d.ts","sourceRoot":"","sources":["../src/daemon-internal-client-wrapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAMH,OAAO,EACL,kBAAkB,IAAI,yBAAyB,EAC/C,KAAK,YAAY,EAClB,MAAM,uCAAuC,CAAC;AAO/C,2EAA2E;AAC3E,MAAM,WAAW,oBAAoB;IACnC,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sFAAsF;IACtF,YAAY,CAAC,EAAE,OAAO,yBAAyB,CAAC;CACjD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,GAAE,MAA0B,GAAG,MAAM,CAmBhF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,oBAAyB,GAC9B,YAAY,CAMd"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Daemon-side wrapper around the PR2 `createDaemonClient` (PR3 C3).
3
+ *
4
+ * Daemons calling Route B (`/__daemon/*`) live in the same host as the
5
+ * dashboard but use a separate process; they need a `DaemonClient` that:
6
+ * - signs with `~/.botmux/.dashboard-secret`
7
+ * - targets the port the dashboard is actually bound to (which may differ
8
+ * from the configured default when EADDRINUSE forces a probe upward),
9
+ * read from `~/.botmux/.dashboard-port`
10
+ * - reports the daemon's own larkAppId in the audit header
11
+ *
12
+ * Caching rationale (plan v3 B6): we do NOT cache the resulting client per
13
+ * larkAppId. `createDaemonClient` is cheap (one secret file read + a closure)
14
+ * and a cached instance would route to a stale port if the dashboard
15
+ * process restarts on a different bound port. Per-request `create + sign +
16
+ * fetch` is the safe default.
17
+ *
18
+ * Port parser strictness (plan v4 B4): we use `Number(raw.trim())` plus
19
+ * `Number.isInteger` and a `1..65535` range check. `parseInt('7891abc', 10)`
20
+ * silently returns `7891`, which would make a corrupt file indistinguishable
21
+ * from the default — exactly the case the regression tests pin down.
22
+ */
23
+ import { existsSync, readFileSync } from 'node:fs';
24
+ import { homedir } from 'node:os';
25
+ import { join } from 'node:path';
26
+ import { createDaemonClient as defaultCreateDaemonClient, } from './dashboard/daemon-internal-client.js';
27
+ const DEFAULT_PORT_PATH = join(homedir(), '.botmux', '.dashboard-port');
28
+ const DEFAULT_PORT = 7891;
29
+ const MIN_TCP_PORT = 1;
30
+ const MAX_TCP_PORT = 65535;
31
+ /**
32
+ * Read `.dashboard-port` if present and parseable; otherwise return the
33
+ * default 7891. Pure with respect to its `portPath` argument.
34
+ */
35
+ export function resolveDashboardUrl(portPath = DEFAULT_PORT_PATH) {
36
+ let port = DEFAULT_PORT;
37
+ if (existsSync(portPath)) {
38
+ try {
39
+ const raw = readFileSync(portPath, 'utf8').trim();
40
+ const parsed = Number(raw);
41
+ if (Number.isFinite(parsed) &&
42
+ Number.isInteger(parsed) &&
43
+ parsed >= MIN_TCP_PORT &&
44
+ parsed <= MAX_TCP_PORT) {
45
+ port = parsed;
46
+ }
47
+ }
48
+ catch {
49
+ // Unreadable file — fall through to the default.
50
+ }
51
+ }
52
+ return `http://127.0.0.1:${port}`;
53
+ }
54
+ /**
55
+ * Build a fresh `DaemonClient` for the given larkAppId. New instance per
56
+ * call by design — see the caching rationale in the module-level comment.
57
+ */
58
+ export function createDaemonClientFor(larkAppId, opts = {}) {
59
+ const create = opts.createClient ?? defaultCreateDaemonClient;
60
+ return create({
61
+ dashboardUrl: resolveDashboardUrl(opts.portPath),
62
+ appId: larkAppId,
63
+ });
64
+ }
65
+ //# sourceMappingURL=daemon-internal-client-wrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-internal-client-wrapper.js","sourceRoot":"","sources":["../src/daemon-internal-client-wrapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EACL,kBAAkB,IAAI,yBAAyB,GAEhD,MAAM,uCAAuC,CAAC;AAE/C,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC;AACxE,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,MAAM,YAAY,GAAG,CAAC,CAAC;AACvB,MAAM,YAAY,GAAG,KAAK,CAAC;AAU3B;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAmB,iBAAiB;IACtE,IAAI,IAAI,GAAG,YAAY,CAAC;IACxB,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YAClD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3B,IACE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACvB,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;gBACxB,MAAM,IAAI,YAAY;gBACtB,MAAM,IAAI,YAAY,EACtB,CAAC;gBACD,IAAI,GAAG,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,iDAAiD;QACnD,CAAC;IACH,CAAC;IACD,OAAO,oBAAoB,IAAI,EAAE,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,SAAiB,EACjB,OAA6B,EAAE;IAE/B,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,IAAI,yBAAyB,CAAC;IAC9D,OAAO,MAAM,CAAC;QACZ,YAAY,EAAE,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC;QAChD,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;AACL,CAAC"}
@@ -27,7 +27,19 @@ export declare class Aggregator {
27
27
  getSchedules(): Sched[];
28
28
  /** sessionId → owning daemon's larkAppId (used for write routing). */
29
29
  ownerOf(sessionId: string): string | undefined;
30
+ /** Whether a session row with this id exists at all in the aggregator,
31
+ * regardless of `larkAppId` presence. Mirrors `scheduleExists`; lets
32
+ * the Route B write gate tell apart "legacy row with no owner" from
33
+ * "unknown id" so the close/resume/locate handler can route legacy rows
34
+ * to the caller's bot instead of 404'ing them. */
35
+ sessionExists(sessionId: string): boolean;
30
36
  scheduleOwnerOf(id: string): string | undefined;
37
+ /** Whether a schedule row with this id exists at all in the aggregator,
38
+ * regardless of `larkAppId` presence. Used by the Route B write gate to
39
+ * distinguish a "legacy row with no owner" from a genuinely "unknown id"
40
+ * — the former should still proxy somewhere (the caller's bot), the
41
+ * latter is a 404 (codex 2026-06-10 schedules slice 2a blocker). */
42
+ scheduleExists(id: string): boolean;
31
43
  on(fn: (e: DashboardEvent & {
32
44
  larkAppId: string;
33
45
  }) => void): () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"aggregator.d.ts","sourceRoot":"","sources":["../../src/dashboard/aggregator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAElE,KAAK,GAAG,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AAC1E,KAAK,KAAK,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AAElD;;;;;GAKG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,SAAS,CAAkE;IAEnF,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,cAAc,GAAG,IAAI;IAmCvD,sEAAsE;IACtE,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAGrD,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI;IAIrC,WAAW,IAAI,GAAG,EAAE;IACpB,YAAY,IAAI,KAAK,EAAE;IAEvB,sEAAsE;IACtE,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAG9C,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI/C,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,cAAc,GAAG;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,MAAM,IAAI;CAIxE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,CAAC,EAAE,UAAU,EACb,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,GAC1B,MAAM,IAAI,CA0CZ"}
1
+ {"version":3,"file":"aggregator.d.ts","sourceRoot":"","sources":["../../src/dashboard/aggregator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAElE,KAAK,GAAG,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AAC1E,KAAK,KAAK,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AAElD;;;;;GAKG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,SAAS,CAAkE;IAEnF,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,cAAc,GAAG,IAAI;IAmCvD,sEAAsE;IACtE,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAGrD,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI;IAIrC,WAAW,IAAI,GAAG,EAAE;IACpB,YAAY,IAAI,KAAK,EAAE;IAEvB,sEAAsE;IACtE,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI9C;;;;uDAImD;IACnD,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAGzC,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI/C;;;;yEAIqE;IACrE,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAInC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,cAAc,GAAG;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,MAAM,IAAI;CAIxE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,CAAC,EAAE,UAAU,EACb,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,GAC1B,MAAM,IAAI,CA0CZ"}
@@ -63,9 +63,25 @@ export class Aggregator {
63
63
  ownerOf(sessionId) {
64
64
  return this.sessions.get(sessionId)?.larkAppId;
65
65
  }
66
+ /** Whether a session row with this id exists at all in the aggregator,
67
+ * regardless of `larkAppId` presence. Mirrors `scheduleExists`; lets
68
+ * the Route B write gate tell apart "legacy row with no owner" from
69
+ * "unknown id" so the close/resume/locate handler can route legacy rows
70
+ * to the caller's bot instead of 404'ing them. */
71
+ sessionExists(sessionId) {
72
+ return this.sessions.has(sessionId);
73
+ }
66
74
  scheduleOwnerOf(id) {
67
75
  return this.schedules.get(id)?.larkAppId;
68
76
  }
77
+ /** Whether a schedule row with this id exists at all in the aggregator,
78
+ * regardless of `larkAppId` presence. Used by the Route B write gate to
79
+ * distinguish a "legacy row with no owner" from a genuinely "unknown id"
80
+ * — the former should still proxy somewhere (the caller's bot), the
81
+ * latter is a 404 (codex 2026-06-10 schedules slice 2a blocker). */
82
+ scheduleExists(id) {
83
+ return this.schedules.has(id);
84
+ }
69
85
  on(fn) {
70
86
  this.listeners.add(fn);
71
87
  return () => this.listeners.delete(fn);
@@ -1 +1 @@
1
- {"version":3,"file":"aggregator.js","sourceRoot":"","sources":["../../src/dashboard/aggregator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"aggregator.js","sourceRoot":"","sources":["../../src/dashboard/aggregator.ts"],"names":[],"mappings":"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"}
@@ -35,6 +35,13 @@ export declare function verifyHmac(secretB64Url: string, attempt: HmacAttempt, r
35
35
  };
36
36
  /** 32 random bytes base64url-encoded (43 characters, no padding). */
37
37
  export declare function generateToken(): string;
38
+ /**
39
+ * Load a dashboard HMAC secret from disk. Empty / whitespace-only files are
40
+ * treated as missing so callers never sign requests with an empty key.
41
+ */
42
+ export declare function loadDashboardSecret(secretPath: string): string | null;
43
+ /** Load the dashboard HMAC secret, creating a fresh 0600 secret when absent. */
44
+ export declare function loadOrCreateDashboardSecret(secretPath: string): string;
38
45
  /**
39
46
  * Load the persisted active dashboard token from `tokenPath`, or `null` when
40
47
  * the file is absent / empty / unreadable.
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/dashboard/auth.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,WAAW;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;CAAE;AAExE;;;;;;;;;;;GAWG;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;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKnE;AAED,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAInE;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;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;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;AAmBxB,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,CA6Cf"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/dashboard/auth.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,WAAW;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;CAAE;AAExE;;;;;;;;;;;GAWG;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,CAQtE;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKnE;AAED,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAInE;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;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;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;AAmBxB,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,CA6Cf"}
@@ -77,6 +77,27 @@ export function verifyHmac(secretB64Url, attempt, remoteAddr, bind) {
77
77
  export function generateToken() {
78
78
  return randomBytes(32).toString('base64url');
79
79
  }
80
+ /**
81
+ * Load a dashboard HMAC secret from disk. Empty / whitespace-only files are
82
+ * treated as missing so callers never sign requests with an empty key.
83
+ */
84
+ export function loadDashboardSecret(secretPath) {
85
+ if (!existsSync(secretPath))
86
+ return null;
87
+ const secret = readFileSync(secretPath, 'utf8').trim();
88
+ return secret.length > 0 ? secret : null;
89
+ }
90
+ /** Load the dashboard HMAC secret, creating a fresh 0600 secret when absent. */
91
+ export function loadOrCreateDashboardSecret(secretPath) {
92
+ const existing = loadDashboardSecret(secretPath);
93
+ if (existing)
94
+ return existing;
95
+ const secret = randomBytes(32).toString('base64url');
96
+ mkdirSync(dirname(secretPath), { recursive: true });
97
+ atomicWriteFileSync(secretPath, secret, { mode: 0o600 });
98
+ chmodSync(secretPath, 0o600);
99
+ return secret;
100
+ }
80
101
  /**
81
102
  * Load the persisted active dashboard token from `tokenPath`, or `null` when
82
103
  * the file is absent / empty / unreadable.
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/dashboard/auth.ts"],"names":[],"mappings":"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"}
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,GAC/C,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,YAAY,GAAG,MAAM,CAAC;AAC5B,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAG,oBAAoB;AAIpE;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,IAAY,EAAE,IAAqB;IAC7E,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;AAC3D,CAAC;AAED;;gFAEgF;AAChF,MAAM,UAAU,WAAW,CAAC,YAAoB,EAAE,IAAa;IAC7D,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;IACpD,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,EAAE,CAAC;IAC/D,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC/E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAC5B,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,UAAU,CACxB,YAAoB,EACpB,OAAoB,EACpB,UAAkB,EAClB,IAAa;IAEb,IACE,UAAU,KAAK,WAAW;QAC1B,UAAU,KAAK,KAAK;QACpB,CAAC,UAAU,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EACxC,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC;IACtD,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACjC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACpE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC3C,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,WAAW;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAEpF,YAAY;IACZ,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,KAAK,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,UAAU;QAAE,IAAI,GAAG,GAAG,GAAG;YAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACvE,IAAI,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAE1E,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAC/F,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;IACzE,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QAAC,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAAC,CAAC;IACzD,MAAM,CAAC;QAAC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAAC,CAAC;IAClD,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;QAChF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IAC/C,CAAC;IACD,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,YAAY,CAAC,CAAC;IAClD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,aAAa;IAC3B,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAAkB;IACpD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACvD,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3C,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,2BAA2B,CAAC,UAAkB;IAC5D,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACjD,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACrD,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACzD,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC7B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;IACnF,CAAC;IAAC,MAAM,CAAC,CAAC,yDAAyD,CAAC,CAAC;IACrE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,YAAY,CAAC,SAAiB,EAAE,KAAa;IAC3D,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,mBAAmB,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACvD,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,WAAW,CAAC,MAA0B;IACpD,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,wBAAwB;YAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAO,0BAA0B,KAAK,kCAAkC,CAAC;AAC3E,CAAC;AAkCD;;;;;;;;+DAQ+D;AAC/D,MAAM,iBAAiB,GAAwB,IAAI,GAAG,CAAC;IACrD,eAAe,EAAK,gBAAgB;IACpC,gBAAgB,EAAI,0DAA0D;IAC9E,eAAe,EAAK,wDAAwD;IAC5E,aAAa,EAAO,kDAAkD;IACtE,SAAS,EAAW,0DAA0D;CAC/E,CAAC,CAAC;AAEH,MAAM,UAAU,mBAAmB,CAAC,IAYnC;IACC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;IAE9F,wEAAwE;IACxE,0EAA0E;IAC1E,0EAA0E;IAC1E,4EAA4E;IAC5E,MAAM,gBAAgB,GAAG,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAEhE,6EAA6E;IAC7E,+DAA+D;IAC/D,6EAA6E;IAC7E,MAAM,kBAAkB,GACtB,MAAM,KAAK,KAAK;QAChB,QAAQ,CAAC,UAAU,CAAC,iBAAiB,CAAC;QACtC,CAAC,gBAAgB,CAAC;IACpB,MAAM,aAAa,GACjB,MAAM,KAAK,KAAK;QAChB,CAAC,QAAQ,KAAK,GAAG,IAAI,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEzF,uEAAuE;IACvE,8EAA8E;IAC9E,4EAA4E;IAC5E,MAAM,YAAY,GAChB,CAAC,CAAC,cAAc;QAChB,CAAC,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM,CAAC;QACvC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAElC,MAAM,MAAM,GAAG,CAAC,CAAC,cAAc,IAAI,cAAc,KAAK,WAAW,CAAC;IAElE,IAAI,CAAC,MAAM,IAAI,CAAC,kBAAkB,IAAI,CAAC,aAAa,IAAI,CAAC,YAAY,EAAE,CAAC;QACtE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC7B,CAAC;IAED,yEAAyE;IACzE,uEAAuE;IACvE,IAAI,aAAa,IAAI,MAAM,IAAI,cAAc,EAAE,CAAC;QAC9C,OAAO;YACL,IAAI,EAAE,kBAAkB;YACxB,KAAK,EAAE,cAAc;YACrB,UAAU,EAAE,QAAQ,IAAI,GAAG;SAC5B,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Shared pure-type primitives for dashboard card models (PR1).
3
+ *
4
+ * Zero runtime — only `interface` and string-literal unions. Imported as
5
+ * `import type { ... }` by every dashboard card model so the model layer
6
+ * stays erasable and IO-free.
7
+ */
8
+ /** Pagination query input shared by list-style modules (sessions/workflows/groups/schedules). */
9
+ export interface PaginationParams {
10
+ /** 1-based page index. Values < 1 are coerced to 1; values > totalPages coerce to totalPages. */
11
+ page?: number;
12
+ /** Page size; values < 1 coerce to default 20; values > 100 coerce to 100. */
13
+ pageSize?: number;
14
+ }
15
+ /** Pagination metadata returned alongside paged results. */
16
+ export interface PaginationMeta {
17
+ /** Active 1-based page after clamp. */
18
+ page: number;
19
+ /** Page size after clamp. */
20
+ pageSize: number;
21
+ /** Filtered total before slicing. */
22
+ total: number;
23
+ /** Math.max(1, Math.ceil(total / pageSize)). */
24
+ totalPages: number;
25
+ }
26
+ /** Semantic status dot — color tone + animation flag + i18n-free label key. */
27
+ export interface StatusDot {
28
+ /** Semantic color token; renderer maps to concrete hex. */
29
+ tone: 'neutral' | 'info' | 'success' | 'warning' | 'danger';
30
+ /** True hints the renderer to apply a pulsing animation. */
31
+ pulse: boolean;
32
+ /** Short label key; renderer translates via t(). */
33
+ label: string;
34
+ }
35
+ /** Action button availability — enabled flag plus optional i18n reason for tooltips. */
36
+ export interface ButtonState {
37
+ enabled: boolean;
38
+ /** Optional i18n key explaining why the button is disabled. */
39
+ reasonKey?: string;
40
+ }
41
+ /** Explicit "now" injection — keeps relative-time formatters pure and deterministic. */
42
+ export interface NowContext {
43
+ /** Epoch milliseconds representing the current instant. */
44
+ nowMs: number;
45
+ }
46
+ /** Section limit option bag — caps items per section (default 5, clamp [1, 50]). */
47
+ export interface SectionLimit {
48
+ limit?: number;
49
+ }
50
+ //# sourceMappingURL=card-model-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card-model-types.d.ts","sourceRoot":"","sources":["../../src/dashboard/card-model-types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,iGAAiG;AACjG,MAAM,WAAW,gBAAgB;IAC/B,iGAAiG;IACjG,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,4DAA4D;AAC5D,MAAM,WAAW,cAAc;IAC7B,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,+EAA+E;AAC/E,MAAM,WAAW,SAAS;IACxB,2DAA2D;IAC3D,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC5D,4DAA4D;IAC5D,KAAK,EAAE,OAAO,CAAC;IACf,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wFAAwF;AACxF,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wFAAwF;AACxF,MAAM,WAAW,UAAU;IACzB,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;CACf;AAED,oFAAoF;AACpF,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Shared pure-type primitives for dashboard card models (PR1).
3
+ *
4
+ * Zero runtime — only `interface` and string-literal unions. Imported as
5
+ * `import type { ... }` by every dashboard card model so the model layer
6
+ * stays erasable and IO-free.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=card-model-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card-model-types.js","sourceRoot":"","sources":["../../src/dashboard/card-model-types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,90 @@
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 type { IncomingMessage, ServerResponse } from 'node:http';
22
+ import { type ClockLike, type NonceStore } from './daemon-internal-auth.js';
23
+ import { type GroupsActionDeps, type HandlerResult } from './groups-action-helpers.js';
24
+ import { type ResolvedDashboardSettingsView, type SettingsWriteApplierDeps } from './settings-write-applier.js';
25
+ import { type SettingsOwnerResolverDeps } from './settings-owner-resolver.js';
26
+ import { type WorkflowsActionDeps } from './workflows-action-helpers.js';
27
+ export type SimpleHttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE';
28
+ /** Deps the dispatcher needs — all IO is injected. */
29
+ export interface DaemonInternalApiDeps {
30
+ /** `.dashboard-secret` body (string used directly as HMAC key — same convention as `/__cli/rotate`). */
31
+ secret: string;
32
+ /** Override for tests to inject a fake clock-aware nonce store. Production uses `createNonceStore()`. */
33
+ nonceStore?: NonceStore;
34
+ /** Override for tests to advance time deterministically inside verifyDaemonRequest. */
35
+ clock?: ClockLike;
36
+ getSessions: () => unknown[];
37
+ getSchedules: () => unknown[];
38
+ resolveDashboardSettings: () => ResolvedDashboardSettingsView;
39
+ /** Returns `{ chats, bots }`; groups model requires both for missingOnly accuracy. */
40
+ buildGroupsMatrix: () => Promise<{
41
+ chats: unknown[];
42
+ bots: unknown[];
43
+ }>;
44
+ settingsApplierDeps: SettingsWriteApplierDeps;
45
+ groupsActionDeps: GroupsActionDeps;
46
+ workflowsActionDeps: WorkflowsActionDeps<any>;
47
+ proxyToDaemon: (larkAppId: string, daemonPath: string, init: RequestInit) => Promise<Response>;
48
+ ownerOf: (sessionId: string) => string | undefined;
49
+ /** Companion of `ownerOf` — tells "row missing" apart from "legacy row".
50
+ * Same rationale as `scheduleExists`. */
51
+ sessionExists: (sessionId: string) => boolean;
52
+ scheduleOwnerOf: (id: string) => string | undefined;
53
+ /** True iff a schedule row with this id exists at all in the aggregator,
54
+ * regardless of its `larkAppId` presence. Used by the Route B write gate
55
+ * to tell apart "legacy schedule (no owner field)" from "unknown id". */
56
+ scheduleExists: (id: string) => boolean;
57
+ /** Override for unit tests; production omits and uses the real federation helper. */
58
+ settingsOwnerDeps?: SettingsOwnerResolverDeps;
59
+ }
60
+ export interface DispatchContext {
61
+ bodyRaw: string;
62
+ body: unknown;
63
+ url: URL;
64
+ /**
65
+ * Authenticated caller's bot `larkAppId` — populated by `handle()` from
66
+ * `verify.appId` (`daemon-internal-auth.ts:232`). Aggregated read routes
67
+ * use this id for their default per-bot view; `?scope=global` explicitly
68
+ * widens `/dashboard` list reads to the Bot Owner's deployment-wide view.
69
+ * undefined only on the test seam (`dispatchForTest`) where the caller is
70
+ * trusted to assert their own scope.
71
+ */
72
+ callerAppId?: string;
73
+ }
74
+ /**
75
+ * Pure dispatcher: matches `(method, path)` against the typed allowlist.
76
+ * Returns `unknown_endpoint` (404) when no path matches, `method_not_allowed`
77
+ * (405) when a path matches but the method does not, or hands off to the
78
+ * matched handler.
79
+ */
80
+ export declare function dispatchDaemonInternalRequest(method: string, url: URL, bodyRaw: string, deps: DaemonInternalApiDeps, callerAppId?: string): Promise<HandlerResult>;
81
+ export interface DaemonInternalApi {
82
+ /** Production entry point: verify HMAC, JSON-parse, dispatch, write response. */
83
+ handle(req: IncomingMessage, res: ServerResponse, url: URL): Promise<boolean>;
84
+ /** Test seam: bypass HMAC, exercise dispatch shape directly. `callerAppId`
85
+ * emulates the authenticated bot id so read-scoping tests can drive the
86
+ * per-bot filter without going through HMAC. */
87
+ dispatchForTest(method: string, url: URL, bodyRaw?: string, callerAppId?: string): Promise<HandlerResult>;
88
+ }
89
+ export declare function createDaemonInternalApi(deps: DaemonInternalApiDeps): DaemonInternalApi;
90
+ //# sourceMappingURL=daemon-internal-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-internal-api.d.ts","sourceRoot":"","sources":["../../src/dashboard/daemon-internal-api.ts"],"names":[],"mappings":"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"}