sensorium-mcp 3.1.2 → 3.1.3-board.1

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 (203) hide show
  1. package/Install-Sensorium.ps1 +61 -0
  2. package/dist/board/api/api.js +61 -0
  3. package/dist/board/api/client.js +96 -0
  4. package/dist/board/components/BottomNav.js +32 -0
  5. package/dist/board/components/Card.js +44 -0
  6. package/dist/board/components/CommentComposer.js +26 -0
  7. package/dist/board/components/CommentList.js +39 -0
  8. package/dist/board/components/Dropdown.js +66 -0
  9. package/dist/board/components/Lane.js +40 -0
  10. package/dist/board/components/PriorityChip.js +17 -0
  11. package/dist/board/components/ProfileSummary.js +39 -0
  12. package/dist/board/components/StateBanner.js +22 -0
  13. package/dist/board/components/StatusChip.js +21 -0
  14. package/dist/board/components/TokenEntry.js +42 -0
  15. package/dist/board/config.js +56 -0
  16. package/dist/board/index.html +18 -0
  17. package/dist/board/main.js +37 -0
  18. package/dist/board/mock/api.mock.js +193 -0
  19. package/dist/board/mock/fixtures.js +164 -0
  20. package/dist/board/schema/policy.js +192 -0
  21. package/dist/board/state/auth.js +55 -0
  22. package/dist/board/state/useBoard.js +149 -0
  23. package/dist/board/state/useBuilder.js +98 -0
  24. package/dist/board/state/useCard.js +67 -0
  25. package/dist/board/styles/board.css +1760 -0
  26. package/dist/board/styles/tokens.css +71 -0
  27. package/dist/board/vendor/vue.esm-browser.js +9 -0
  28. package/dist/board/views/App.js +65 -0
  29. package/dist/board/views/BoardView.js +84 -0
  30. package/dist/board/views/BuilderView.js +303 -0
  31. package/dist/board/views/CardView.js +245 -0
  32. package/dist/board/views/SettingsView.js +145 -0
  33. package/dist/config/index.d.ts +1 -0
  34. package/dist/config/index.d.ts.map +1 -1
  35. package/dist/config/index.js +12 -0
  36. package/dist/config/index.js.map +1 -1
  37. package/dist/config/misc-settings.d.ts +14 -0
  38. package/dist/config/misc-settings.d.ts.map +1 -1
  39. package/dist/config/misc-settings.js +53 -0
  40. package/dist/config/misc-settings.js.map +1 -1
  41. package/dist/dashboard/board-static.d.ts +23 -0
  42. package/dist/dashboard/board-static.d.ts.map +1 -0
  43. package/dist/dashboard/board-static.js +131 -0
  44. package/dist/dashboard/board-static.js.map +1 -0
  45. package/dist/dashboard/routes/board.d.ts +73 -0
  46. package/dist/dashboard/routes/board.d.ts.map +1 -0
  47. package/dist/dashboard/routes/board.js +623 -0
  48. package/dist/dashboard/routes/board.js.map +1 -0
  49. package/dist/dashboard/routes/settings.d.ts +2 -0
  50. package/dist/dashboard/routes/settings.d.ts.map +1 -1
  51. package/dist/dashboard/routes/settings.js +24 -1
  52. package/dist/dashboard/routes/settings.js.map +1 -1
  53. package/dist/dashboard/routes/threads-read.d.ts +7 -3
  54. package/dist/dashboard/routes/threads-read.d.ts.map +1 -1
  55. package/dist/dashboard/routes/threads-read.js +19 -4
  56. package/dist/dashboard/routes/threads-read.js.map +1 -1
  57. package/dist/dashboard/routes/types.d.ts +6 -0
  58. package/dist/dashboard/routes/types.d.ts.map +1 -1
  59. package/dist/dashboard/routes/types.js.map +1 -1
  60. package/dist/dashboard/routes.d.ts.map +1 -1
  61. package/dist/dashboard/routes.js +42 -1
  62. package/dist/dashboard/routes.js.map +1 -1
  63. package/dist/dashboard/spa.html +12 -12
  64. package/dist/data/board/board-schema.d.ts +22 -0
  65. package/dist/data/board/board-schema.d.ts.map +1 -0
  66. package/dist/data/board/board-schema.js +103 -0
  67. package/dist/data/board/board-schema.js.map +1 -0
  68. package/dist/data/board/board-types.d.ts +117 -0
  69. package/dist/data/board/board-types.d.ts.map +1 -0
  70. package/dist/data/board/board-types.js +9 -0
  71. package/dist/data/board/board-types.js.map +1 -0
  72. package/dist/data/board/card.repository.d.ts +64 -0
  73. package/dist/data/board/card.repository.d.ts.map +1 -0
  74. package/dist/data/board/card.repository.js +272 -0
  75. package/dist/data/board/card.repository.js.map +1 -0
  76. package/dist/data/board/comment.repository.d.ts +12 -0
  77. package/dist/data/board/comment.repository.d.ts.map +1 -0
  78. package/dist/data/board/comment.repository.js +31 -0
  79. package/dist/data/board/comment.repository.js.map +1 -0
  80. package/dist/data/board/lane.repository.d.ts +18 -0
  81. package/dist/data/board/lane.repository.d.ts.map +1 -0
  82. package/dist/data/board/lane.repository.js +44 -0
  83. package/dist/data/board/lane.repository.js.map +1 -0
  84. package/dist/data/board/profile-defaults.d.ts +19 -0
  85. package/dist/data/board/profile-defaults.d.ts.map +1 -0
  86. package/dist/data/board/profile-defaults.js +118 -0
  87. package/dist/data/board/profile-defaults.js.map +1 -0
  88. package/dist/data/memory/migration-runner.d.ts.map +1 -1
  89. package/dist/data/memory/migration-runner.js +4 -0
  90. package/dist/data/memory/migration-runner.js.map +1 -1
  91. package/dist/data/memory/narrative-store.d.ts +14 -0
  92. package/dist/data/memory/narrative-store.d.ts.map +1 -1
  93. package/dist/data/memory/narrative-store.js +36 -0
  94. package/dist/data/memory/narrative-store.js.map +1 -1
  95. package/dist/data/memory/narrative.d.ts.map +1 -1
  96. package/dist/data/memory/narrative.js +13 -1
  97. package/dist/data/memory/narrative.js.map +1 -1
  98. package/dist/data/memory/schema.d.ts.map +1 -1
  99. package/dist/data/memory/schema.js +4 -0
  100. package/dist/data/memory/schema.js.map +1 -1
  101. package/dist/index.js +84 -2
  102. package/dist/index.js.map +1 -1
  103. package/dist/integrations/openai/speech.d.ts.map +1 -1
  104. package/dist/integrations/openai/speech.js +52 -19
  105. package/dist/integrations/openai/speech.js.map +1 -1
  106. package/dist/lib/http-retry.d.ts +91 -0
  107. package/dist/lib/http-retry.d.ts.map +1 -0
  108. package/dist/lib/http-retry.js +177 -0
  109. package/dist/lib/http-retry.js.map +1 -0
  110. package/dist/lib/usage-metering/pricing.js +1 -1
  111. package/dist/lib/usage-metering/pricing.js.map +1 -1
  112. package/dist/lib/utils.d.ts +10 -0
  113. package/dist/lib/utils.d.ts.map +1 -1
  114. package/dist/lib/utils.js +22 -0
  115. package/dist/lib/utils.js.map +1 -1
  116. package/dist/server/http-server.d.ts +3 -1
  117. package/dist/server/http-server.d.ts.map +1 -1
  118. package/dist/server/http-server.js +6 -2
  119. package/dist/server/http-server.js.map +1 -1
  120. package/dist/services/board/board-signals.d.ts +25 -0
  121. package/dist/services/board/board-signals.d.ts.map +1 -0
  122. package/dist/services/board/board-signals.js +83 -0
  123. package/dist/services/board/board-signals.js.map +1 -0
  124. package/dist/services/board/card-briefing.d.ts +17 -0
  125. package/dist/services/board/card-briefing.d.ts.map +1 -0
  126. package/dist/services/board/card-briefing.js +86 -0
  127. package/dist/services/board/card-briefing.js.map +1 -0
  128. package/dist/services/board/orchestrator.service.d.ts +55 -0
  129. package/dist/services/board/orchestrator.service.d.ts.map +1 -0
  130. package/dist/services/board/orchestrator.service.js +198 -0
  131. package/dist/services/board/orchestrator.service.js.map +1 -0
  132. package/dist/services/board/release-worker.d.ts +32 -0
  133. package/dist/services/board/release-worker.d.ts.map +1 -0
  134. package/dist/services/board/release-worker.js +49 -0
  135. package/dist/services/board/release-worker.js.map +1 -0
  136. package/dist/services/board/report-capture.d.ts +48 -0
  137. package/dist/services/board/report-capture.d.ts.map +1 -0
  138. package/dist/services/board/report-capture.js +172 -0
  139. package/dist/services/board/report-capture.js.map +1 -0
  140. package/dist/services/board/worker-spawn.d.ts +30 -0
  141. package/dist/services/board/worker-spawn.d.ts.map +1 -0
  142. package/dist/services/board/worker-spawn.js +90 -0
  143. package/dist/services/board/worker-spawn.js.map +1 -0
  144. package/dist/services/broker-client.d.ts +30 -0
  145. package/dist/services/broker-client.d.ts.map +1 -1
  146. package/dist/services/broker-client.js +23 -0
  147. package/dist/services/broker-client.js.map +1 -1
  148. package/dist/services/http-retry.d.ts +1 -90
  149. package/dist/services/http-retry.d.ts.map +1 -1
  150. package/dist/services/http-retry.js +1 -176
  151. package/dist/services/http-retry.js.map +1 -1
  152. package/dist/services/passive-notice.service.d.ts +39 -0
  153. package/dist/services/passive-notice.service.d.ts.map +1 -0
  154. package/dist/services/passive-notice.service.js +274 -0
  155. package/dist/services/passive-notice.service.js.map +1 -0
  156. package/dist/services/spawn-common.d.ts.map +1 -1
  157. package/dist/services/spawn-common.js +14 -1
  158. package/dist/services/spawn-common.js.map +1 -1
  159. package/dist/services/telegram.d.ts +7 -5
  160. package/dist/services/telegram.d.ts.map +1 -1
  161. package/dist/services/telegram.js +18 -13
  162. package/dist/services/telegram.js.map +1 -1
  163. package/dist/services/usage/usage-inbox-notifier.d.ts +50 -0
  164. package/dist/services/usage/usage-inbox-notifier.d.ts.map +1 -0
  165. package/dist/services/usage/usage-inbox-notifier.js +118 -0
  166. package/dist/services/usage/usage-inbox-notifier.js.map +1 -0
  167. package/dist/services/usage/usage-poller.service.d.ts +41 -0
  168. package/dist/services/usage/usage-poller.service.d.ts.map +1 -0
  169. package/dist/services/usage/usage-poller.service.js +66 -0
  170. package/dist/services/usage/usage-poller.service.js.map +1 -0
  171. package/dist/services/usage/usage-snapshot-provider.d.ts +29 -0
  172. package/dist/services/usage/usage-snapshot-provider.d.ts.map +1 -0
  173. package/dist/services/usage/usage-snapshot-provider.js +59 -0
  174. package/dist/services/usage/usage-snapshot-provider.js.map +1 -0
  175. package/dist/services/usage/usage-types.d.ts +23 -0
  176. package/dist/services/usage/usage-types.d.ts.map +1 -0
  177. package/dist/services/usage/usage-types.js +14 -0
  178. package/dist/services/usage/usage-types.js.map +1 -0
  179. package/dist/services/worker-cleanup.service.d.ts +6 -1
  180. package/dist/services/worker-cleanup.service.d.ts.map +1 -1
  181. package/dist/services/worker-cleanup.service.js +123 -10
  182. package/dist/services/worker-cleanup.service.js.map +1 -1
  183. package/dist/tools/delegate-tool.d.ts.map +1 -1
  184. package/dist/tools/delegate-tool.js +32 -0
  185. package/dist/tools/delegate-tool.js.map +1 -1
  186. package/dist/tools/utility-tools.d.ts.map +1 -1
  187. package/dist/tools/utility-tools.js +7 -3
  188. package/dist/tools/utility-tools.js.map +1 -1
  189. package/dist/tools/wait/consolidation-strategy.d.ts +42 -0
  190. package/dist/tools/wait/consolidation-strategy.d.ts.map +1 -0
  191. package/dist/tools/wait/consolidation-strategy.js +50 -0
  192. package/dist/tools/wait/consolidation-strategy.js.map +1 -0
  193. package/dist/tools/wait/drive-handler.d.ts +5 -7
  194. package/dist/tools/wait/drive-handler.d.ts.map +1 -1
  195. package/dist/tools/wait/drive-handler.js +30 -48
  196. package/dist/tools/wait/drive-handler.js.map +1 -1
  197. package/dist/tools/wait/message-delivery.d.ts.map +1 -1
  198. package/dist/tools/wait/message-delivery.js +13 -0
  199. package/dist/tools/wait/message-delivery.js.map +1 -1
  200. package/package.json +2 -2
  201. package/templates/atomic-build-spec.default.md +57 -0
  202. package/templates/buildless-vue-preview.default.md +47 -0
  203. package/templates/phased-build.default.md +59 -0
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Usage inbox notifier — the one agent-touching consumer of the usage monitor.
3
+ *
4
+ * It subscribes to the poller's `onSnapshots` seam. When a source's 5h
5
+ * utilization crosses the ~90% threshold on a RISING EDGE (below → at/above,
6
+ * not on every 45 s tick), it fans a ONE-TIME graceful-park instruction out to
7
+ * every PERSISTENT thread (`keep_alive = 1 AND type != 'worker'` — this excludes
8
+ * plain workers AND board card-workers) via the pending-task mailbox.
9
+ *
10
+ * Two independent guards keep it from spamming:
11
+ * 1. In-memory rising-edge detection (per agentType) — suppresses re-fires on
12
+ * every tick while utilization stays high within a process lifetime.
13
+ * 2. Persisted dedup per `${agentType}:${reset5hAt}` window — survives an MCP
14
+ * restart inside the same 5h window, so a bounce cannot re-spam.
15
+ *
16
+ * Operator-first alerting invariant: the whole thing is gated behind
17
+ * `getUsageNotifyEnabled()` (default OFF), checked AT FIRE TIME so the live
18
+ * toggle needs no restart. Agent-type-agnostic (OCP): it iterates snapshots
19
+ * keyed by `agentType` and never branches on a specific agent name.
20
+ */
21
+ import type { UsageSnapshot } from "./usage-types.js";
22
+ /** Rising-edge threshold: 90% of the 5h budget. */
23
+ export declare const USAGE_NOTIFY_THRESHOLD = 0.9;
24
+ export interface UsageInboxNotifierDeps {
25
+ /** Toggle gate, checked at fire time (live). Default OFF (see settings). */
26
+ isEnabled: () => boolean;
27
+ /** Target thread IDs: keep-alive, non-worker persistent threads. */
28
+ getTargetThreadIds: () => number[];
29
+ /** Whether an alert already fired for this dedup key in the current window. */
30
+ hasNotified: (key: string) => boolean;
31
+ /** Record that an alert fired for `key`, expiring at `expiresAtMs`. */
32
+ markNotified: (key: string, expiresAtMs: number) => void;
33
+ /** Append a one-line message to a thread's pending-task mailbox. */
34
+ deliver: (threadId: number, message: string) => void;
35
+ log: (msg: string) => void;
36
+ }
37
+ export declare class UsageInboxNotifier {
38
+ private readonly deps;
39
+ /** Last concrete 5h utilization seen per agentType — the rising-edge memory. */
40
+ private readonly lastUtil;
41
+ constructor(deps: UsageInboxNotifierDeps);
42
+ /**
43
+ * Poller `onSnapshots` seam. Evaluates each source independently; a throw on
44
+ * one must never starve the rest, and the rising-edge memory is always
45
+ * advanced so a high plateau does not re-fire on the next tick.
46
+ */
47
+ handleSnapshots(snapshots: UsageSnapshot[]): void;
48
+ private evaluate;
49
+ }
50
+ //# sourceMappingURL=usage-inbox-notifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-inbox-notifier.d.ts","sourceRoot":"","sources":["../../../src/services/usage/usage-inbox-notifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,mDAAmD;AACnD,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAK1C,MAAM,WAAW,sBAAsB;IACrC,4EAA4E;IAC5E,SAAS,EAAE,MAAM,OAAO,CAAC;IACzB,oEAAoE;IACpE,kBAAkB,EAAE,MAAM,MAAM,EAAE,CAAC;IACnC,+EAA+E;IAC/E,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACtC,uEAAuE;IACvE,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,oEAAoE;IACpE,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5B;AAED,qBAAa,kBAAkB;IAIjB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,gFAAgF;IAChF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;gBAEzB,IAAI,EAAE,sBAAsB;IAEzD;;;;OAIG;IACH,eAAe,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,IAAI;IAYjD,OAAO,CAAC,QAAQ;CAqCjB"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Usage inbox notifier — the one agent-touching consumer of the usage monitor.
3
+ *
4
+ * It subscribes to the poller's `onSnapshots` seam. When a source's 5h
5
+ * utilization crosses the ~90% threshold on a RISING EDGE (below → at/above,
6
+ * not on every 45 s tick), it fans a ONE-TIME graceful-park instruction out to
7
+ * every PERSISTENT thread (`keep_alive = 1 AND type != 'worker'` — this excludes
8
+ * plain workers AND board card-workers) via the pending-task mailbox.
9
+ *
10
+ * Two independent guards keep it from spamming:
11
+ * 1. In-memory rising-edge detection (per agentType) — suppresses re-fires on
12
+ * every tick while utilization stays high within a process lifetime.
13
+ * 2. Persisted dedup per `${agentType}:${reset5hAt}` window — survives an MCP
14
+ * restart inside the same 5h window, so a bounce cannot re-spam.
15
+ *
16
+ * Operator-first alerting invariant: the whole thing is gated behind
17
+ * `getUsageNotifyEnabled()` (default OFF), checked AT FIRE TIME so the live
18
+ * toggle needs no restart. Agent-type-agnostic (OCP): it iterates snapshots
19
+ * keyed by `agentType` and never branches on a specific agent name.
20
+ */
21
+ /** Rising-edge threshold: 90% of the 5h budget. */
22
+ export const USAGE_NOTIFY_THRESHOLD = 0.9;
23
+ /** Fallback dedup-window length when a source reports no reset instant. */
24
+ const FALLBACK_WINDOW_MS = 5 * 60 * 60 * 1000;
25
+ export class UsageInboxNotifier {
26
+ deps;
27
+ /** Last concrete 5h utilization seen per agentType — the rising-edge memory. */
28
+ lastUtil = new Map();
29
+ constructor(deps) {
30
+ this.deps = deps;
31
+ }
32
+ /**
33
+ * Poller `onSnapshots` seam. Evaluates each source independently; a throw on
34
+ * one must never starve the rest, and the rising-edge memory is always
35
+ * advanced so a high plateau does not re-fire on the next tick.
36
+ */
37
+ handleSnapshots(snapshots) {
38
+ for (const snap of snapshots) {
39
+ try {
40
+ this.evaluate(snap);
41
+ }
42
+ catch (err) {
43
+ this.deps.log(`[usage] notifier error for ${snap.agentType}: ${err instanceof Error ? err.message : String(err)}`);
44
+ }
45
+ }
46
+ }
47
+ evaluate(snap) {
48
+ // A failed/absent reading is not a data point: don't disturb the rising-edge
49
+ // memory (a transient probe failure must not re-arm a fresh crossing).
50
+ if (!snap.ok || snap.utilization5h === null || !Number.isFinite(snap.utilization5h))
51
+ return;
52
+ const util = snap.utilization5h;
53
+ const prev = this.lastUtil.get(snap.agentType);
54
+ const prevBelow = prev === undefined || prev < USAGE_NOTIFY_THRESHOLD;
55
+ const risingEdge = prevBelow && util >= USAGE_NOTIFY_THRESHOLD;
56
+ // Toggle gate at fire time (operator-first alerting; default OFF). A disabled
57
+ // tick is treated as a NON-data-point: we return BEFORE advancing the
58
+ // rising-edge memory, so enabling the toggle live during an ongoing high
59
+ // plateau still produces one alert (prev stays below the threshold).
60
+ if (!this.deps.isEnabled())
61
+ return;
62
+ // Enabled from here: advance the rising-edge memory so a high plateau reads
63
+ // prev >= threshold on the next tick and can't re-fire until it dips and
64
+ // rises again. Done before the dedup/fan-out returns below on purpose.
65
+ this.lastUtil.set(snap.agentType, util);
66
+ if (!risingEdge)
67
+ return;
68
+ const { key, expiresAtMs } = dedupWindow(snap);
69
+ if (this.deps.hasNotified(key))
70
+ return;
71
+ const targets = this.deps.getTargetThreadIds();
72
+ const message = buildMessage(snap, util);
73
+ for (const threadId of targets) {
74
+ this.deps.deliver(threadId, message);
75
+ }
76
+ this.deps.markNotified(key, expiresAtMs);
77
+ this.deps.log(`[usage] high-utilization alert: ${snap.agentType} at ${Math.round(util * 100)}% → ${targets.length} keep-alive thread(s)`);
78
+ }
79
+ }
80
+ /**
81
+ * Stable per-window dedup identity + its expiry.
82
+ *
83
+ * When the source reports a reset instant, that instant IS the window boundary:
84
+ * key `${agentType}:${reset5hAt}`, expiring at the reset. When it doesn't
85
+ * (future credit models with no reset window), the key must STILL be stable
86
+ * across a restart — bucketing on the fluctuating utilization percent would
87
+ * mint a fresh key on every tick and defeat the persisted dedup. Instead
88
+ * quantize the probe time into fixed `FALLBACK_WINDOW_MS` buckets: identical for
89
+ * every probe within the same wall-clock window, independent of utilization.
90
+ */
91
+ function dedupWindow(snap) {
92
+ if (snap.reset5hAt) {
93
+ const t = Date.parse(snap.reset5hAt);
94
+ return {
95
+ key: `${snap.agentType}:${snap.reset5hAt}`,
96
+ expiresAtMs: Number.isFinite(t) ? t : Date.now() + FALLBACK_WINDOW_MS,
97
+ };
98
+ }
99
+ const anchor = Date.parse(snap.probedAt);
100
+ const base = Number.isFinite(anchor) ? anchor : Date.now();
101
+ const bucket = Math.floor(base / FALLBACK_WINDOW_MS);
102
+ return {
103
+ key: `${snap.agentType}:w${bucket}`,
104
+ expiresAtMs: (bucket + 1) * FALLBACK_WINDOW_MS,
105
+ };
106
+ }
107
+ /**
108
+ * One-line graceful-park instruction, structured like other cross-thread
109
+ * signals. Percent / agentType / reset time interpolate from the snapshot.
110
+ */
111
+ function buildMessage(snap, util) {
112
+ const pct = Math.round(util * 100);
113
+ const resetPart = snap.reset5hAt ? ` — resets ${snap.reset5hAt}` : "";
114
+ return (`[USAGE ALERT] ${snap.agentType} 5h utilization at ${pct}%${resetPart}. ` +
115
+ `Wait for your running workers to finish, send or park any pending results, then call ` +
116
+ `wait and stop generating until reset. Do not start new work. One-time notice for this window.`);
117
+ }
118
+ //# sourceMappingURL=usage-inbox-notifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-inbox-notifier.js","sourceRoot":"","sources":["../../../src/services/usage/usage-inbox-notifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Usage poller — the MCP-side pull loop (one-way IPC: MCP → supervisor).
3
+ *
4
+ * A small `start()/stop()` background loop in the `KeeperService` /
5
+ * `BoardOrchestrator` style. Every ~45 s it calls `brokerGetUsage()` (the broker
6
+ * client) and writes the result into the `UsageSnapshotProvider`. It only ever
7
+ * PULLS — it never pushes into the supervisor.
8
+ *
9
+ * Null handling is load-bearing: `brokerGetUsage()` returns `null` for ANY
10
+ * failure (unreachable / non-OK / unparseable). `null` means "cannot confirm",
11
+ * NEVER "usage is zero". On null the poller leaves the provider untouched so the
12
+ * last-known snapshot survives a transient supervisor hiccup. An inert monitor
13
+ * answers with an empty array (a confirmed "no sources"), which IS written.
14
+ *
15
+ * Wiring gates start on `MCP_HTTP_PORT`: every stdio agent session also boots
16
+ * `index.ts`, so an ungated poller would spawn one loop per session. Gating it
17
+ * to the HTTP transport keeps exactly one poller in the server process.
18
+ */
19
+ import type { InMemoryUsageSnapshotProvider } from "./usage-snapshot-provider.js";
20
+ import type { UsageSnapshot } from "./usage-types.js";
21
+ export interface UsagePollerDeps {
22
+ provider: InMemoryUsageSnapshotProvider;
23
+ /** Optional notifier hook — fired with the accepted batch after each write. */
24
+ onSnapshots?: (snapshots: UsageSnapshot[]) => void;
25
+ log: (msg: string) => void;
26
+ }
27
+ export declare class UsagePollerService {
28
+ private readonly deps;
29
+ private timer;
30
+ private pollInFlight;
31
+ constructor(deps: UsagePollerDeps);
32
+ /** Idempotent: poll once immediately, then every ~45 s. Re-entry is a no-op. */
33
+ start(): void;
34
+ stop(): void;
35
+ /**
36
+ * One pull cycle. A slow request must not stack ticks (the interval keeps
37
+ * firing), so an in-flight poll short-circuits re-entry.
38
+ */
39
+ private poll;
40
+ }
41
+ //# sourceMappingURL=usage-poller.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-poller.service.d.ts","sourceRoot":"","sources":["../../../src/services/usage/usage-poller.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAClF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAItD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,6BAA6B,CAAC;IACxC,+EAA+E;IAC/E,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,KAAK,IAAI,CAAC;IACnD,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5B;AAED,qBAAa,kBAAkB;IAIjB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,YAAY,CAAS;gBAEA,IAAI,EAAE,eAAe;IAElD,gFAAgF;IAChF,KAAK,IAAI,IAAI;IAQb,IAAI,IAAI,IAAI;IAKZ;;;OAGG;YACW,IAAI;CAenB"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Usage poller — the MCP-side pull loop (one-way IPC: MCP → supervisor).
3
+ *
4
+ * A small `start()/stop()` background loop in the `KeeperService` /
5
+ * `BoardOrchestrator` style. Every ~45 s it calls `brokerGetUsage()` (the broker
6
+ * client) and writes the result into the `UsageSnapshotProvider`. It only ever
7
+ * PULLS — it never pushes into the supervisor.
8
+ *
9
+ * Null handling is load-bearing: `brokerGetUsage()` returns `null` for ANY
10
+ * failure (unreachable / non-OK / unparseable). `null` means "cannot confirm",
11
+ * NEVER "usage is zero". On null the poller leaves the provider untouched so the
12
+ * last-known snapshot survives a transient supervisor hiccup. An inert monitor
13
+ * answers with an empty array (a confirmed "no sources"), which IS written.
14
+ *
15
+ * Wiring gates start on `MCP_HTTP_PORT`: every stdio agent session also boots
16
+ * `index.ts`, so an ungated poller would spawn one loop per session. Gating it
17
+ * to the HTTP transport keeps exactly one poller in the server process.
18
+ */
19
+ import { brokerGetUsage } from "../broker-client.js";
20
+ const USAGE_POLL_INTERVAL_MS = 45_000; // spec range 30–60 s
21
+ export class UsagePollerService {
22
+ deps;
23
+ timer = null;
24
+ pollInFlight = false;
25
+ constructor(deps) {
26
+ this.deps = deps;
27
+ }
28
+ /** Idempotent: poll once immediately, then every ~45 s. Re-entry is a no-op. */
29
+ start() {
30
+ if (this.timer)
31
+ return;
32
+ this.timer = setInterval(() => void this.poll(), USAGE_POLL_INTERVAL_MS);
33
+ this.timer.unref();
34
+ void this.poll();
35
+ this.deps.log(`[usage] poller started (interval ${USAGE_POLL_INTERVAL_MS / 1000}s)`);
36
+ }
37
+ stop() {
38
+ if (this.timer)
39
+ clearInterval(this.timer);
40
+ this.timer = null;
41
+ }
42
+ /**
43
+ * One pull cycle. A slow request must not stack ticks (the interval keeps
44
+ * firing), so an in-flight poll short-circuits re-entry.
45
+ */
46
+ async poll() {
47
+ if (this.pollInFlight)
48
+ return;
49
+ this.pollInFlight = true;
50
+ try {
51
+ const snapshots = await brokerGetUsage();
52
+ // null ⇒ cannot confirm ⇒ keep last known; never zero out the provider.
53
+ if (snapshots === null)
54
+ return;
55
+ this.deps.provider.setSnapshots(snapshots);
56
+ this.deps.onSnapshots?.(snapshots);
57
+ }
58
+ catch (err) {
59
+ this.deps.log(`[usage] poll failed: ${err instanceof Error ? err.message : String(err)}`);
60
+ }
61
+ finally {
62
+ this.pollInFlight = false;
63
+ }
64
+ }
65
+ }
66
+ //# sourceMappingURL=usage-poller.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-poller.service.js","sourceRoot":"","sources":["../../../src/services/usage/usage-poller.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAIrD,MAAM,sBAAsB,GAAG,MAAM,CAAC,CAAC,qBAAqB;AAS5D,MAAM,OAAO,kBAAkB;IAIA;IAHrB,KAAK,GAA0C,IAAI,CAAC;IACpD,YAAY,GAAG,KAAK,CAAC;IAE7B,YAA6B,IAAqB;QAArB,SAAI,GAAJ,IAAI,CAAiB;IAAG,CAAC;IAEtD,gFAAgF;IAChF,KAAK;QACH,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO;QACvB,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE,sBAAsB,CAAC,CAAC;QACzE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QACjB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,oCAAoC,sBAAsB,GAAG,IAAI,IAAI,CAAC,CAAC;IACvF,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,KAAK;YAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,IAAI;QAChB,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO;QAC9B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,cAAc,EAAE,CAAC;YACzC,wEAAwE;YACxE,IAAI,SAAS,KAAK,IAAI;gBAAE,OAAO;YAC/B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC3C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,wBAAwB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5F,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC5B,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * In-memory `UsageSnapshotProvider` (the port's default impl) + lazy module
3
+ * singleton. The poller calls `setSnapshots` to upsert the latest snapshot per
4
+ * `agentType`; consumers read via the port interface. A lazy singleton matches
5
+ * the project's `initMemoryDb` idiom so dashboard route handlers can reach the
6
+ * provider without threading it through `DashboardContext`.
7
+ */
8
+ import type { UsageSnapshot, UsageSnapshotProvider } from "./usage-types.js";
9
+ export declare class InMemoryUsageSnapshotProvider implements UsageSnapshotProvider {
10
+ /** Latest snapshot per agentType — upserted, so newer probes replace older. */
11
+ private readonly byAgentType;
12
+ private readonly listeners;
13
+ /**
14
+ * Upsert each snapshot by `agentType`, then notify listeners ONCE for the
15
+ * whole batch. An empty batch is still a valid signal ("monitor went inert")
16
+ * and clears nothing implicitly — callers pass what they want stored.
17
+ */
18
+ setSnapshots(snapshots: UsageSnapshot[]): void;
19
+ getAll(): UsageSnapshot[];
20
+ getByAgentType(agentType: string): UsageSnapshot | null;
21
+ onUpdate(listener: (snapshots: UsageSnapshot[]) => void): () => void;
22
+ /** Fire every listener; one listener throwing must not starve the rest. */
23
+ private notify;
24
+ }
25
+ /** Lazy module singleton — the one provider shared by poller and consumers. */
26
+ export declare function getUsageSnapshotProvider(): InMemoryUsageSnapshotProvider;
27
+ /** Test hook: drop the module singleton so each test starts from a clean slate. */
28
+ export declare function resetUsageSnapshotProviderForTest(): void;
29
+ //# sourceMappingURL=usage-snapshot-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-snapshot-provider.d.ts","sourceRoot":"","sources":["../../../src/services/usage/usage-snapshot-provider.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAE7E,qBAAa,6BAA8B,YAAW,qBAAqB;IACzE,+EAA+E;IAC/E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoC;IAChE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmD;IAE7E;;;;OAIG;IACH,YAAY,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,IAAI;IAO9C,MAAM,IAAI,aAAa,EAAE;IAIzB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAIvD,QAAQ,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,KAAK,IAAI,GAAG,MAAM,IAAI;IAOpE,2EAA2E;IAC3E,OAAO,CAAC,MAAM;CASf;AAID,+EAA+E;AAC/E,wBAAgB,wBAAwB,IAAI,6BAA6B,CAKxE;AAED,mFAAmF;AACnF,wBAAgB,iCAAiC,IAAI,IAAI,CAExD"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * In-memory `UsageSnapshotProvider` (the port's default impl) + lazy module
3
+ * singleton. The poller calls `setSnapshots` to upsert the latest snapshot per
4
+ * `agentType`; consumers read via the port interface. A lazy singleton matches
5
+ * the project's `initMemoryDb` idiom so dashboard route handlers can reach the
6
+ * provider without threading it through `DashboardContext`.
7
+ */
8
+ export class InMemoryUsageSnapshotProvider {
9
+ /** Latest snapshot per agentType — upserted, so newer probes replace older. */
10
+ byAgentType = new Map();
11
+ listeners = new Set();
12
+ /**
13
+ * Upsert each snapshot by `agentType`, then notify listeners ONCE for the
14
+ * whole batch. An empty batch is still a valid signal ("monitor went inert")
15
+ * and clears nothing implicitly — callers pass what they want stored.
16
+ */
17
+ setSnapshots(snapshots) {
18
+ for (const snap of snapshots) {
19
+ this.byAgentType.set(snap.agentType, snap);
20
+ }
21
+ this.notify(snapshots);
22
+ }
23
+ getAll() {
24
+ return [...this.byAgentType.values()];
25
+ }
26
+ getByAgentType(agentType) {
27
+ return this.byAgentType.get(agentType) ?? null;
28
+ }
29
+ onUpdate(listener) {
30
+ this.listeners.add(listener);
31
+ return () => {
32
+ this.listeners.delete(listener);
33
+ };
34
+ }
35
+ /** Fire every listener; one listener throwing must not starve the rest. */
36
+ notify(snapshots) {
37
+ for (const listener of this.listeners) {
38
+ try {
39
+ listener(snapshots);
40
+ }
41
+ catch {
42
+ /* a consumer's failure must never break the update fan-out */
43
+ }
44
+ }
45
+ }
46
+ }
47
+ let singleton = null;
48
+ /** Lazy module singleton — the one provider shared by poller and consumers. */
49
+ export function getUsageSnapshotProvider() {
50
+ if (singleton === null) {
51
+ singleton = new InMemoryUsageSnapshotProvider();
52
+ }
53
+ return singleton;
54
+ }
55
+ /** Test hook: drop the module singleton so each test starts from a clean slate. */
56
+ export function resetUsageSnapshotProviderForTest() {
57
+ singleton = null;
58
+ }
59
+ //# sourceMappingURL=usage-snapshot-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-snapshot-provider.js","sourceRoot":"","sources":["../../../src/services/usage/usage-snapshot-provider.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,OAAO,6BAA6B;IACxC,+EAA+E;IAC9D,WAAW,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC/C,SAAS,GAAG,IAAI,GAAG,EAAwC,CAAC;IAE7E;;;;OAIG;IACH,YAAY,CAAC,SAA0B;QACrC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC;IAED,MAAM;QACJ,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,cAAc,CAAC,SAAiB;QAC9B,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;IACjD,CAAC;IAED,QAAQ,CAAC,QAA8C;QACrD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC,CAAC;IACJ,CAAC;IAED,2EAA2E;IACnE,MAAM,CAAC,SAA0B;QACvC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,QAAQ,CAAC,SAAS,CAAC,CAAC;YACtB,CAAC;YAAC,MAAM,CAAC;gBACP,8DAA8D;YAChE,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,IAAI,SAAS,GAAyC,IAAI,CAAC;AAE3D,+EAA+E;AAC/E,MAAM,UAAU,wBAAwB;IACtC,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,SAAS,GAAG,IAAI,6BAA6B,EAAE,CAAC;IAClD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,iCAAiC;IAC/C,SAAS,GAAG,IAAI,CAAC;AACnB,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Usage monitor — MCP-side port (OCP seam).
3
+ *
4
+ * The `UsageSnapshotProvider` is the single interface consumers depend on: the
5
+ * poller fills it (`setSnapshots`), while the inbox-notifier and the board read
6
+ * route consume it (`getAll` / `getByAgentType` / `onUpdate`). Consumers stay
7
+ * agent-type-agnostic — they iterate snapshots keyed by `agentType` and never
8
+ * branch on a specific agent (no `if (agentType === "claude")`).
9
+ *
10
+ * The snapshot shape is re-exported from the broker client so the wire contract
11
+ * (`GET /usage` on the supervisor) and the in-process port never drift.
12
+ */
13
+ import type { BrokerUsageSnapshot } from "../broker-client.js";
14
+ export type UsageSnapshot = BrokerUsageSnapshot;
15
+ export interface UsageSnapshotProvider {
16
+ /** Latest snapshot per agentType; empty when the monitor is inert/unreachable. */
17
+ getAll(): UsageSnapshot[];
18
+ /** Latest snapshot for one agentType, or null when none is known. */
19
+ getByAgentType(agentType: string): UsageSnapshot | null;
20
+ /** Fires once per accepted update batch. Returns an unsubscribe function. */
21
+ onUpdate(listener: (snapshots: UsageSnapshot[]) => void): () => void;
22
+ }
23
+ //# sourceMappingURL=usage-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-types.d.ts","sourceRoot":"","sources":["../../../src/services/usage/usage-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,MAAM,MAAM,aAAa,GAAG,mBAAmB,CAAC;AAEhD,MAAM,WAAW,qBAAqB;IACpC,kFAAkF;IAClF,MAAM,IAAI,aAAa,EAAE,CAAC;IAC1B,qEAAqE;IACrE,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAAC;IACxD,6EAA6E;IAC7E,QAAQ,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CACtE"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Usage monitor — MCP-side port (OCP seam).
3
+ *
4
+ * The `UsageSnapshotProvider` is the single interface consumers depend on: the
5
+ * poller fills it (`setSnapshots`), while the inbox-notifier and the board read
6
+ * route consume it (`getAll` / `getByAgentType` / `onUpdate`). Consumers stay
7
+ * agent-type-agnostic — they iterate snapshots keyed by `agentType` and never
8
+ * branch on a specific agent (no `if (agentType === "claude")`).
9
+ *
10
+ * The snapshot shape is re-exported from the broker client so the wire contract
11
+ * (`GET /usage` on the supervisor) and the in-process port never drift.
12
+ */
13
+ export {};
14
+ //# sourceMappingURL=usage-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-types.js","sourceRoot":"","sources":["../../../src/services/usage/usage-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
@@ -23,8 +23,13 @@ export declare function decommissionWorker(thread: {
23
23
  };
24
24
  chatId: string;
25
25
  threadLifecycle: ThreadLifecycleService;
26
- }): Promise<void>;
26
+ },
27
+ /** Real exit code when the caller observed the process die (handleProcessExit);
28
+ * null/undefined on sweep paths where only "gone" is known. */
29
+ exitCode?: number | null): Promise<void>;
27
30
  export declare const DEFAULT_WORKER_TTL_MS: number;
31
+ export declare const CARD_WORKER_TTL_MS: number;
32
+ export declare const CARD_WORKER_TTL_MAX_MS: number;
28
33
  export declare function cleanupExpiredWorkers(db: ReturnType<typeof import("../data/memory/index.js").initMemoryDb>, telegram: {
29
34
  deleteForumTopic(chatId: string, threadId: number): Promise<void>;
30
35
  sendMessage?(chatId: string, text: string, parseMode?: string, threadId?: number): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"worker-cleanup.service.d.ts","sourceRoot":"","sources":["../../src/services/worker-cleanup.service.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAe,KAAK,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAyBzF,eAAO,MAAM,eAAe,QAGxB,CAAC;AAQL;;;qFAGqF;AACrF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;oFAGoF;AACpF,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAEvD;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE;IACN,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,EACD,IAAI,EAAE;IACJ,EAAE,EAAE,UAAU,CAAC,cAAc,yBAAyB,EAAE,YAAY,CAAC,CAAC;IACtE,QAAQ,EAAE;QAAE,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC;IAChF,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,sBAAsB,CAAC;CACzC,GACA,OAAO,CAAC,IAAI,CAAC,CA+Ff;AAoED,eAAO,MAAM,qBAAqB,QAAiB,CAAC;AAqEpD,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,UAAU,CAAC,cAAc,yBAAyB,EAAE,YAAY,CAAC,EACrE,QAAQ,EAAE;IACR,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,WAAW,CAAC,CACV,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB,EACD,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,sBAAsB,EACvC,KAAK,GAAE,MAA8B,GACpC,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAkThD"}
1
+ {"version":3,"file":"worker-cleanup.service.d.ts","sourceRoot":"","sources":["../../src/services/worker-cleanup.service.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAe,KAAK,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AA6BzF,eAAO,MAAM,eAAe,QAGxB,CAAC;AAQL;;;qFAGqF;AACrF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;oFAGoF;AACpF,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAEvD;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE;IACN,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,EACD,IAAI,EAAE;IACJ,EAAE,EAAE,UAAU,CAAC,cAAc,yBAAyB,EAAE,YAAY,CAAC,CAAC;IACtE,QAAQ,EAAE;QAAE,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC;IAChF,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,sBAAsB,CAAC;CACzC;AACD;gEACgE;AAChE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GACvB,OAAO,CAAC,IAAI,CAAC,CAoGf;AAsED,eAAO,MAAM,qBAAqB,QAAiB,CAAC;AAWpD,eAAO,MAAM,kBAAkB,QAG3B,CAAC;AAGL,eAAO,MAAM,sBAAsB,QAG/B,CAAC;AAwJL,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,UAAU,CAAC,cAAc,yBAAyB,EAAE,YAAY,CAAC,EACrE,QAAQ,EAAE;IACR,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,WAAW,CAAC,CACV,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB,EACD,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,sBAAsB,EACvC,KAAK,GAAE,MAA8B,GACpC,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAoVhD"}