@telora/daemon 0.20.28 → 0.20.53

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 (231) hide show
  1. package/build-info.json +2 -2
  2. package/dist/agent-state.d.ts +4 -6
  3. package/dist/agent-state.d.ts.map +1 -1
  4. package/dist/agent-state.js +4 -10
  5. package/dist/agent-state.js.map +1 -1
  6. package/dist/auto-update.d.ts +87 -0
  7. package/dist/auto-update.d.ts.map +1 -1
  8. package/dist/auto-update.js +142 -8
  9. package/dist/auto-update.js.map +1 -1
  10. package/dist/branch-status.d.ts +25 -3
  11. package/dist/branch-status.d.ts.map +1 -1
  12. package/dist/branch-status.js +130 -59
  13. package/dist/branch-status.js.map +1 -1
  14. package/dist/completion/completion-decision.d.ts +29 -3
  15. package/dist/completion/completion-decision.d.ts.map +1 -1
  16. package/dist/completion/completion-decision.js +15 -3
  17. package/dist/completion/completion-decision.js.map +1 -1
  18. package/dist/completion/event-entry-phases.d.ts +57 -0
  19. package/dist/completion/event-entry-phases.d.ts.map +1 -0
  20. package/dist/completion/event-entry-phases.js +205 -0
  21. package/dist/completion/event-entry-phases.js.map +1 -0
  22. package/dist/completion/event-phases.d.ts +14 -42
  23. package/dist/completion/event-phases.d.ts.map +1 -1
  24. package/dist/completion/event-phases.js +63 -190
  25. package/dist/completion/event-phases.js.map +1 -1
  26. package/dist/completion/event.d.ts +11 -1
  27. package/dist/completion/event.d.ts.map +1 -1
  28. package/dist/completion/event.js +5 -2
  29. package/dist/completion/event.js.map +1 -1
  30. package/dist/completion/index.d.ts +0 -3
  31. package/dist/completion/index.d.ts.map +1 -1
  32. package/dist/completion/index.js +0 -3
  33. package/dist/completion/index.js.map +1 -1
  34. package/dist/completion/review-exit-phase.d.ts +2 -1
  35. package/dist/completion/review-exit-phase.d.ts.map +1 -1
  36. package/dist/completion/review-exit-phase.js +41 -1
  37. package/dist/completion/review-exit-phase.js.map +1 -1
  38. package/dist/completion/status-advance-phase.d.ts +2 -0
  39. package/dist/completion/status-advance-phase.d.ts.map +1 -1
  40. package/dist/completion/status-advance-phase.js +14 -28
  41. package/dist/completion/status-advance-phase.js.map +1 -1
  42. package/dist/completion/team-completion.js +1 -1
  43. package/dist/completion/team-completion.js.map +1 -1
  44. package/dist/completion/terminated-work-reconcile.d.ts.map +1 -1
  45. package/dist/completion/terminated-work-reconcile.js +10 -0
  46. package/dist/completion/terminated-work-reconcile.js.map +1 -1
  47. package/dist/constants.d.ts +0 -8
  48. package/dist/constants.d.ts.map +1 -1
  49. package/dist/constants.js +0 -8
  50. package/dist/constants.js.map +1 -1
  51. package/dist/delivery-close-actions.d.ts +39 -0
  52. package/dist/delivery-close-actions.d.ts.map +1 -0
  53. package/dist/delivery-close-actions.js +53 -0
  54. package/dist/delivery-close-actions.js.map +1 -0
  55. package/dist/delivery-lifecycle.d.ts +11 -0
  56. package/dist/delivery-lifecycle.d.ts.map +1 -1
  57. package/dist/delivery-lifecycle.js +13 -14
  58. package/dist/delivery-lifecycle.js.map +1 -1
  59. package/dist/delivery-reconciler.d.ts +18 -4
  60. package/dist/delivery-reconciler.d.ts.map +1 -1
  61. package/dist/delivery-reconciler.js +18 -4
  62. package/dist/delivery-reconciler.js.map +1 -1
  63. package/dist/directive-executor.d.ts +1 -1
  64. package/dist/directive-executor.js +1 -1
  65. package/dist/discovery-fetch.d.ts +76 -0
  66. package/dist/discovery-fetch.d.ts.map +1 -0
  67. package/dist/discovery-fetch.js +206 -0
  68. package/dist/discovery-fetch.js.map +1 -0
  69. package/dist/discovery-poll.d.ts +1 -51
  70. package/dist/discovery-poll.d.ts.map +1 -1
  71. package/dist/discovery-poll.js +10 -192
  72. package/dist/discovery-poll.js.map +1 -1
  73. package/dist/drain-teardown.d.ts +11 -6
  74. package/dist/drain-teardown.d.ts.map +1 -1
  75. package/dist/drain-teardown.js +3 -2
  76. package/dist/drain-teardown.js.map +1 -1
  77. package/dist/focus-branch-ahead.d.ts +42 -0
  78. package/dist/focus-branch-ahead.d.ts.map +1 -0
  79. package/dist/focus-branch-ahead.js +45 -0
  80. package/dist/focus-branch-ahead.js.map +1 -0
  81. package/dist/focus-engine.d.ts.map +1 -1
  82. package/dist/focus-engine.js +21 -43
  83. package/dist/focus-engine.js.map +1 -1
  84. package/dist/focus-executor.js +2 -2
  85. package/dist/focus-executor.js.map +1 -1
  86. package/dist/focus-lifecycle.d.ts.map +1 -1
  87. package/dist/focus-lifecycle.js +32 -3
  88. package/dist/focus-lifecycle.js.map +1 -1
  89. package/dist/focus-loop-registry.d.ts.map +1 -1
  90. package/dist/focus-loop-registry.js +27 -0
  91. package/dist/focus-loop-registry.js.map +1 -1
  92. package/dist/focus-loop.d.ts +34 -12
  93. package/dist/focus-loop.d.ts.map +1 -1
  94. package/dist/focus-loop.js +78 -15
  95. package/dist/focus-loop.js.map +1 -1
  96. package/dist/focus-merge.d.ts.map +1 -1
  97. package/dist/focus-merge.js +6 -1
  98. package/dist/focus-merge.js.map +1 -1
  99. package/dist/focus-phase.d.ts +18 -3
  100. package/dist/focus-phase.d.ts.map +1 -1
  101. package/dist/focus-phase.js +85 -31
  102. package/dist/focus-phase.js.map +1 -1
  103. package/dist/focus-prompt-builder.d.ts.map +1 -1
  104. package/dist/focus-prompt-builder.js +13 -1
  105. package/dist/focus-prompt-builder.js.map +1 -1
  106. package/dist/focus-provisioning.d.ts.map +1 -1
  107. package/dist/focus-provisioning.js +4 -0
  108. package/dist/focus-provisioning.js.map +1 -1
  109. package/dist/focus-stage-lifecycle/planning-release.d.ts +35 -17
  110. package/dist/focus-stage-lifecycle/planning-release.d.ts.map +1 -1
  111. package/dist/focus-stage-lifecycle/planning-release.js +53 -22
  112. package/dist/focus-stage-lifecycle/planning-release.js.map +1 -1
  113. package/dist/focus-worktree-state.d.ts +17 -6
  114. package/dist/focus-worktree-state.d.ts.map +1 -1
  115. package/dist/focus-worktree-state.js +21 -11
  116. package/dist/focus-worktree-state.js.map +1 -1
  117. package/dist/guard-engine.d.ts +1 -2
  118. package/dist/guard-engine.d.ts.map +1 -1
  119. package/dist/guard-engine.js +1 -2
  120. package/dist/guard-engine.js.map +1 -1
  121. package/dist/health-events.d.ts +10 -0
  122. package/dist/health-events.d.ts.map +1 -0
  123. package/dist/health-events.js +10 -0
  124. package/dist/health-events.js.map +1 -0
  125. package/dist/heartbeat.d.ts.map +1 -1
  126. package/dist/heartbeat.js +98 -21
  127. package/dist/heartbeat.js.map +1 -1
  128. package/dist/host-control/catalog.d.ts.map +1 -1
  129. package/dist/host-control/catalog.js +4 -1
  130. package/dist/host-control/catalog.js.map +1 -1
  131. package/dist/host-control/client.d.ts +3 -4
  132. package/dist/host-control/client.d.ts.map +1 -1
  133. package/dist/host-control/client.js +4 -5
  134. package/dist/host-control/client.js.map +1 -1
  135. package/dist/listener-auto-advance.d.ts +2 -1
  136. package/dist/listener-auto-advance.d.ts.map +1 -1
  137. package/dist/listener-auto-advance.js +36 -40
  138. package/dist/listener-auto-advance.js.map +1 -1
  139. package/dist/listener.d.ts +2 -7
  140. package/dist/listener.d.ts.map +1 -1
  141. package/dist/listener.js +11 -9
  142. package/dist/listener.js.map +1 -1
  143. package/dist/operator-hold.d.ts +66 -0
  144. package/dist/operator-hold.d.ts.map +1 -0
  145. package/dist/operator-hold.js +99 -0
  146. package/dist/operator-hold.js.map +1 -0
  147. package/dist/poll-trigger.d.ts +28 -0
  148. package/dist/poll-trigger.d.ts.map +1 -0
  149. package/dist/poll-trigger.js +31 -0
  150. package/dist/poll-trigger.js.map +1 -0
  151. package/dist/prompt-listing.d.ts +25 -0
  152. package/dist/prompt-listing.d.ts.map +1 -1
  153. package/dist/prompt-listing.js +67 -0
  154. package/dist/prompt-listing.js.map +1 -1
  155. package/dist/prompt-sections/execution-sections.d.ts.map +1 -1
  156. package/dist/prompt-sections/execution-sections.js +24 -0
  157. package/dist/prompt-sections/execution-sections.js.map +1 -1
  158. package/dist/queries/context-lock-queries.d.ts.map +1 -1
  159. package/dist/queries/context-lock-queries.js +4 -1
  160. package/dist/queries/context-lock-queries.js.map +1 -1
  161. package/dist/queries/deliveries.d.ts +17 -0
  162. package/dist/queries/deliveries.d.ts.map +1 -1
  163. package/dist/queries/deliveries.js.map +1 -1
  164. package/dist/queries/issues.d.ts +98 -0
  165. package/dist/queries/issues.d.ts.map +1 -1
  166. package/dist/queries/issues.js +135 -0
  167. package/dist/queries/issues.js.map +1 -1
  168. package/dist/queries/schemas.d.ts +3 -3
  169. package/dist/security-scan-engine.d.ts +9 -1
  170. package/dist/security-scan-engine.d.ts.map +1 -1
  171. package/dist/security-scan-engine.js +25 -2
  172. package/dist/security-scan-engine.js.map +1 -1
  173. package/dist/spawn/worktree-session.d.ts.map +1 -1
  174. package/dist/spawn/worktree-session.js +2 -0
  175. package/dist/spawn/worktree-session.js.map +1 -1
  176. package/dist/spawner/index.d.ts +7 -9
  177. package/dist/spawner/index.d.ts.map +1 -1
  178. package/dist/spawner/index.js +13 -11
  179. package/dist/spawner/index.js.map +1 -1
  180. package/dist/spawner/lifecycle.d.ts +1 -18
  181. package/dist/spawner/lifecycle.d.ts.map +1 -1
  182. package/dist/spawner/lifecycle.js +1 -54
  183. package/dist/spawner/lifecycle.js.map +1 -1
  184. package/dist/spawner/liveness.d.ts +5 -14
  185. package/dist/spawner/liveness.d.ts.map +1 -1
  186. package/dist/spawner/liveness.js +5 -67
  187. package/dist/spawner/liveness.js.map +1 -1
  188. package/dist/spawner/state.d.ts +8 -20
  189. package/dist/spawner/state.d.ts.map +1 -1
  190. package/dist/spawner/state.js +8 -34
  191. package/dist/spawner/state.js.map +1 -1
  192. package/dist/staleness-sensor.d.ts +153 -0
  193. package/dist/staleness-sensor.d.ts.map +1 -0
  194. package/dist/staleness-sensor.js +308 -0
  195. package/dist/staleness-sensor.js.map +1 -0
  196. package/dist/types/focus.d.ts +9 -0
  197. package/dist/types/focus.d.ts.map +1 -1
  198. package/dist/types/session.d.ts +0 -44
  199. package/dist/types/session.d.ts.map +1 -1
  200. package/dist/unified-shell.d.ts.map +1 -1
  201. package/dist/unified-shell.js +19 -0
  202. package/dist/unified-shell.js.map +1 -1
  203. package/dist/verification-engine.d.ts +6 -4
  204. package/dist/verification-engine.d.ts.map +1 -1
  205. package/dist/verification-engine.js +9 -43
  206. package/dist/verification-engine.js.map +1 -1
  207. package/dist/verification-feedback.d.ts +42 -0
  208. package/dist/verification-feedback.d.ts.map +1 -1
  209. package/dist/verification-feedback.js +93 -0
  210. package/dist/verification-feedback.js.map +1 -1
  211. package/dist/version-check.d.ts +6 -0
  212. package/dist/version-check.d.ts.map +1 -1
  213. package/dist/version-check.js +1 -1
  214. package/dist/version-check.js.map +1 -1
  215. package/package.json +2 -3
  216. package/dist/completion/agent-completion.d.ts +0 -48
  217. package/dist/completion/agent-completion.d.ts.map +0 -1
  218. package/dist/completion/agent-completion.js +0 -205
  219. package/dist/completion/agent-completion.js.map +0 -1
  220. package/dist/delivery-guards.d.ts +0 -41
  221. package/dist/delivery-guards.d.ts.map +0 -1
  222. package/dist/delivery-guards.js +0 -200
  223. package/dist/delivery-guards.js.map +0 -1
  224. package/dist/spawner/spawn-team.d.ts +0 -20
  225. package/dist/spawner/spawn-team.d.ts.map +0 -1
  226. package/dist/spawner/spawn-team.js +0 -19
  227. package/dist/spawner/spawn-team.js.map +0 -1
  228. package/dist/spawner/timeout.d.ts +0 -32
  229. package/dist/spawner/timeout.d.ts.map +0 -1
  230. package/dist/spawner/timeout.js +0 -126
  231. package/dist/spawner/timeout.js.map +0 -1
package/build-info.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
- "commitSha": "a885540b4",
3
- "builtAt": "2026-07-24T22:22:34.401Z",
2
+ "commitSha": "ac45f221c",
3
+ "builtAt": "2026-07-26T11:48:14.301Z",
4
4
  "expectedMigrations": [
5
5
  "20250829113330_create_org_nodes_table.sql",
6
6
  "20250829113402_fix_function_security_search_path.sql",
@@ -3,15 +3,13 @@
3
3
  * heartbeat.ts and spawner.ts by centralizing state that both modules need.
4
4
  *
5
5
  * Contains:
6
- * - Running agents map (read by heartbeat, written by spawner)
7
6
  * - Session completion counters (written by spawner/completion-handler, read by heartbeat)
8
7
  * - Activity tracking (written by spawner/listener, read by heartbeat)
8
+ *
9
+ * The legacy per-delivery `runningAgents` map was removed: the only live spawn
10
+ * path (`spawnFocusTeam`) tracks team leads in `activeTeams`, reaped by the
11
+ * single `reapWorkerFleet` teardown. See packages/daemon/CLAUDE.md.
9
12
  */
10
- import type { RunningAgent } from './types.js';
11
- /**
12
- * Get map of running agents.
13
- */
14
- export declare function getRunningAgents(): Map<string, RunningAgent>;
15
13
  /**
16
14
  * Record a completed session (called by spawner when an agent finishes).
17
15
  */
@@ -1 +1 @@
1
- {"version":3,"file":"agent-state.d.ts","sourceRoot":"","sources":["../src/agent-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAO/C;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAE5D;AAQD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAIzE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI;IACpC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB,CAEA;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE;IAC3C,qBAAqB,EAAE,MAAM,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,CAIP;AAMD;;;GAGG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
1
+ {"version":3,"file":"agent-state.d.ts","sourceRoot":"","sources":["../src/agent-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAIzE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI;IACpC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB,CAEA;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE;IAC3C,qBAAqB,EAAE,MAAM,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,CAIP;AAMD;;;GAGG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
@@ -3,19 +3,13 @@
3
3
  * heartbeat.ts and spawner.ts by centralizing state that both modules need.
4
4
  *
5
5
  * Contains:
6
- * - Running agents map (read by heartbeat, written by spawner)
7
6
  * - Session completion counters (written by spawner/completion-handler, read by heartbeat)
8
7
  * - Activity tracking (written by spawner/listener, read by heartbeat)
8
+ *
9
+ * The legacy per-delivery `runningAgents` map was removed: the only live spawn
10
+ * path (`spawnFocusTeam`) tracks team leads in `activeTeams`, reaped by the
11
+ * single `reapWorkerFleet` teardown. See packages/daemon/CLAUDE.md.
9
12
  */
10
- // ── Running agents map ──────────────────────────────────────────────
11
- /** Running agents map: sessionId -> RunningAgent */
12
- const runningAgents = new Map();
13
- /**
14
- * Get map of running agents.
15
- */
16
- export function getRunningAgents() {
17
- return runningAgents;
18
- }
19
13
  // ── Session completion counters ─────────────────────────────────────
20
14
  let completedSessionCount = 0;
21
15
  let totalTokensUsed = 0;
@@ -1 +1 @@
1
- {"version":3,"file":"agent-state.js","sourceRoot":"","sources":["../src/agent-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,uEAAuE;AAEvE,oDAAoD;AACpD,MAAM,aAAa,GAAG,IAAI,GAAG,EAAwB,CAAC;AAEtD;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,uEAAuE;AAEvE,IAAI,qBAAqB,GAAG,CAAC,CAAC;AAC9B,IAAI,eAAe,GAAG,CAAC,CAAC;AACxB,IAAI,SAAS,GAAG,CAAC,CAAC;AAElB;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAc,EAAE,IAAY;IACjE,qBAAqB,EAAE,CAAC;IACxB,eAAe,IAAI,MAAM,CAAC;IAC1B,SAAS,IAAI,IAAI,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAKhC,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAIlC;IACC,qBAAqB,GAAG,QAAQ,CAAC,qBAAqB,CAAC;IACvD,eAAe,GAAG,QAAQ,CAAC,eAAe,CAAC;IAC3C,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;AACjC,CAAC;AAED,uEAAuE;AAEvE,IAAI,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC;AAEhC;;;GAGG;AACH,MAAM,UAAU,cAAc;IAC5B,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,cAAc,CAAC;AACxB,CAAC"}
1
+ {"version":3,"file":"agent-state.js","sourceRoot":"","sources":["../src/agent-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,uEAAuE;AAEvE,IAAI,qBAAqB,GAAG,CAAC,CAAC;AAC9B,IAAI,eAAe,GAAG,CAAC,CAAC;AACxB,IAAI,SAAS,GAAG,CAAC,CAAC;AAElB;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAc,EAAE,IAAY;IACjE,qBAAqB,EAAE,CAAC;IACxB,eAAe,IAAI,MAAM,CAAC;IAC1B,SAAS,IAAI,IAAI,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAKhC,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAIlC;IACC,qBAAqB,GAAG,QAAQ,CAAC,qBAAqB,CAAC;IACvD,eAAe,GAAG,QAAQ,CAAC,eAAe,CAAC;IAC3C,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;AACjC,CAAC;AAED,uEAAuE;AAEvE,IAAI,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC;AAEhC;;;GAGG;AACH,MAAM,UAAU,cAAc;IAC5B,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,cAAc,CAAC;AACxB,CAAC"}
@@ -21,6 +21,83 @@ export declare const EXIT_CODE_UPDATE = 75;
21
21
  * traffic is unaffected (the candidate version comes from the warm cache).
22
22
  */
23
23
  export declare const DEFAULT_SAMPLE_INTERVAL_MS = 30000;
24
+ /**
25
+ * Steady-state heartbeat for the default decision-logging sink. In the common
26
+ * "checked and current" / "candidate pending" states the sink suppresses
27
+ * duplicate consecutive lines, but re-emits at least this often so that an
28
+ * ABSENT trace positively identifies a controller that is NOT running (the
29
+ * invisibility this module exists to close: a 7-version gap survived 198h
30
+ * precisely because ran-and-found-nothing looked identical to never-ran).
31
+ * With ~30s sampling, a 1h heartbeat caps steady-state log volume at ~24
32
+ * lines/day while making any >1h silence diagnostic.
33
+ */
34
+ export declare const DEFAULT_DECISION_HEARTBEAT_MS = 3600000;
35
+ /**
36
+ * The classified outcome of a controller tick, handed to
37
+ * {@link AutoUpdateDeps.onDecision}. Every tick emits at least one decision (its
38
+ * terminal state); the drain-arming boundary emits an extra `drain-armed` event
39
+ * alongside the pending state. This is the durable trace that makes the
40
+ * controller's activity observable so an absent trace means "not running".
41
+ */
42
+ export type UpdateDecision = {
43
+ kind: 'current';
44
+ } | {
45
+ kind: 'candidate-pending';
46
+ candidate: string;
47
+ reason: 'busy' | 'awaiting-idle-edge';
48
+ } | {
49
+ kind: 'drain-armed';
50
+ candidate: string;
51
+ } | {
52
+ kind: 'applying';
53
+ candidate: string;
54
+ trigger: 'idle-seam' | 'urgent';
55
+ } | {
56
+ kind: 'applied';
57
+ candidate: string;
58
+ } | {
59
+ kind: 'failed';
60
+ candidate: string;
61
+ trigger: 'idle-seam' | 'urgent';
62
+ error: string;
63
+ } | {
64
+ kind: 'error';
65
+ error: string;
66
+ };
67
+ /** A decision rendered for logging: level, message, and steady-state throttle keys. */
68
+ export interface DescribedDecision {
69
+ level: 'info' | 'warn';
70
+ message: string;
71
+ /** True for the recurring no-action states ('current' / 'candidate-pending') the sink throttles. */
72
+ steady: boolean;
73
+ /** Stable identity used to suppress duplicate consecutive steady-state lines. */
74
+ signature: string;
75
+ }
76
+ /**
77
+ * Render a decision into a loggable line. Exhaustive over {@link UpdateDecision}
78
+ * (the trailing `never` assignment fails the build if a case is added without a
79
+ * message). All lines share the `[auto-update]` prefix so the trace is greppable
80
+ * and assertable.
81
+ */
82
+ export declare function describeUpdateDecision(decision: UpdateDecision, currentVersion: string): DescribedDecision;
83
+ /** Minimal logger shape the decision sink needs (satisfied by {@link createLogger}). */
84
+ export interface DecisionLogger {
85
+ info: (message: string) => void;
86
+ warn: (message: string) => void;
87
+ }
88
+ /**
89
+ * Build the default {@link AutoUpdateDeps.onDecision} sink: it logs every
90
+ * actionable decision immediately (loud on failure), and throttles the
91
+ * recurring steady-state decisions to at most one line per heartbeat window so
92
+ * the log stays readable without ever going fully silent while the controller
93
+ * runs.
94
+ */
95
+ export declare function createLoggingDecisionSink(opts: {
96
+ logger: DecisionLogger;
97
+ currentVersion: string;
98
+ heartbeatMs?: number;
99
+ now?: () => number;
100
+ }): (decision: UpdateDecision) => void;
24
101
  /** Dependencies for the update controller (all injectable for tests). */
25
102
  export interface AutoUpdateDeps {
26
103
  /** Current daemon version string (e.g., "0.10.48"). */
@@ -63,6 +140,16 @@ export interface AutoUpdateDeps {
63
140
  * implemented here): it would be OR-ed into this predicate.
64
141
  */
65
142
  isUrgent?: () => boolean;
143
+ /**
144
+ * Observability sink: called with the classified {@link UpdateDecision} on
145
+ * EVERY tick, so the controller's activity leaves a durable trace and an
146
+ * absent trace identifies a controller that is not running. Defaults to a
147
+ * heartbeat-throttled logging sink ({@link createLoggingDecisionSink}).
148
+ * Injected in tests to assert the decision contract directly.
149
+ */
150
+ onDecision?: (decision: UpdateDecision) => void;
151
+ /** Steady-state heartbeat (ms) for the default logging sink. Default: {@link DEFAULT_DECISION_HEARTBEAT_MS}. */
152
+ decisionHeartbeatMs?: number;
66
153
  }
67
154
  /** Options for {@link startAutoUpdateLoop}: controller deps + sampling cadence. */
68
155
  export interface AutoUpdateOptions extends AutoUpdateDeps {
@@ -1 +1 @@
1
- {"version":3,"file":"auto-update.d.ts","sourceRoot":"","sources":["../src/auto-update.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAWH,0DAA0D;AAC1D,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,QAAS,CAAC;AAEjD,yEAAyE;AACzE,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,cAAc,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,OAAO,CAAC;IACtB;;;;OAIG;IACH,yBAAyB,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAC/C,8EAA8E;IAC9E,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,sFAAsF;IACtF,aAAa,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,mCAAmC;IACnC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,kFAAkF;IAClF,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,0FAA0F;IAC1F,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B;;;;;;;;;OASG;IACH,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC;CAC1B;AAED,mFAAmF;AACnF,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAmBvE;AAED,sFAAsF;AACtF,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,cAAc,GAAG,gBAAgB,CA4G7E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,IAAI,CA4BvE"}
1
+ {"version":3,"file":"auto-update.d.ts","sourceRoot":"","sources":["../src/auto-update.ts"],"names":[],"mappings":"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"}
@@ -27,6 +27,117 @@ export const EXIT_CODE_UPDATE = 75;
27
27
  * traffic is unaffected (the candidate version comes from the warm cache).
28
28
  */
29
29
  export const DEFAULT_SAMPLE_INTERVAL_MS = 30_000;
30
+ /**
31
+ * Steady-state heartbeat for the default decision-logging sink. In the common
32
+ * "checked and current" / "candidate pending" states the sink suppresses
33
+ * duplicate consecutive lines, but re-emits at least this often so that an
34
+ * ABSENT trace positively identifies a controller that is NOT running (the
35
+ * invisibility this module exists to close: a 7-version gap survived 198h
36
+ * precisely because ran-and-found-nothing looked identical to never-ran).
37
+ * With ~30s sampling, a 1h heartbeat caps steady-state log volume at ~24
38
+ * lines/day while making any >1h silence diagnostic.
39
+ */
40
+ export const DEFAULT_DECISION_HEARTBEAT_MS = 3_600_000;
41
+ /**
42
+ * Render a decision into a loggable line. Exhaustive over {@link UpdateDecision}
43
+ * (the trailing `never` assignment fails the build if a case is added without a
44
+ * message). All lines share the `[auto-update]` prefix so the trace is greppable
45
+ * and assertable.
46
+ */
47
+ export function describeUpdateDecision(decision, currentVersion) {
48
+ switch (decision.kind) {
49
+ case 'current':
50
+ return {
51
+ level: 'info',
52
+ steady: true,
53
+ signature: 'current',
54
+ message: `[auto-update] Checked: up to date (v${currentVersion}); no newer version available`,
55
+ };
56
+ case 'candidate-pending':
57
+ return {
58
+ level: 'info',
59
+ steady: true,
60
+ signature: `pending:${decision.reason}:${decision.candidate}`,
61
+ message: decision.reason === 'busy'
62
+ ? `[auto-update] Candidate v${decision.candidate} available but daemon busy; waiting for a safe seam (current v${currentVersion})`
63
+ : `[auto-update] Candidate v${decision.candidate} available and idle; awaiting rising idle edge (current v${currentVersion})`,
64
+ };
65
+ case 'drain-armed':
66
+ return {
67
+ level: 'info',
68
+ steady: false,
69
+ signature: `drain-armed:${decision.candidate}`,
70
+ message: `[auto-update] Drain armed to create a safe seam for v${decision.candidate} (current v${currentVersion})`,
71
+ };
72
+ case 'applying':
73
+ return {
74
+ level: 'info',
75
+ steady: false,
76
+ signature: `applying:${decision.trigger}:${decision.candidate}`,
77
+ message: decision.trigger === 'urgent'
78
+ ? `[auto-update] URGENT signal set -- applying update v${decision.candidate} mid-batch, preempting in-flight work (current v${currentVersion})`
79
+ : `[auto-update] Batch-safe idle seam reached; applying update v${decision.candidate} (current v${currentVersion})`,
80
+ };
81
+ case 'applied':
82
+ return {
83
+ level: 'info',
84
+ steady: false,
85
+ signature: `applied:${decision.candidate}`,
86
+ message: `[auto-update] Update to v${decision.candidate} installed; signaling restart (exit ${EXIT_CODE_UPDATE})`,
87
+ };
88
+ case 'failed':
89
+ return {
90
+ level: 'warn',
91
+ steady: false,
92
+ signature: `failed:${decision.trigger}:${decision.candidate}`,
93
+ message: decision.trigger === 'urgent'
94
+ ? `[auto-update] Urgent install of v${decision.candidate} FAILED: ${decision.error}; will retry next tick`
95
+ : `[auto-update] Install of v${decision.candidate} FAILED at idle seam: ${decision.error}; will retry on the next idle edge`,
96
+ };
97
+ case 'error':
98
+ return {
99
+ level: 'warn',
100
+ steady: false,
101
+ signature: 'error',
102
+ message: `[auto-update] Unexpected error: ${decision.error}`,
103
+ };
104
+ default: {
105
+ const _exhaustive = decision;
106
+ return _exhaustive;
107
+ }
108
+ }
109
+ }
110
+ /**
111
+ * Build the default {@link AutoUpdateDeps.onDecision} sink: it logs every
112
+ * actionable decision immediately (loud on failure), and throttles the
113
+ * recurring steady-state decisions to at most one line per heartbeat window so
114
+ * the log stays readable without ever going fully silent while the controller
115
+ * runs.
116
+ */
117
+ export function createLoggingDecisionSink(opts) {
118
+ const { logger, currentVersion, heartbeatMs = DEFAULT_DECISION_HEARTBEAT_MS, now = Date.now } = opts;
119
+ let lastSteadySignature = null;
120
+ let lastSteadyLoggedAt = Number.NEGATIVE_INFINITY;
121
+ return (decision) => {
122
+ const described = describeUpdateDecision(decision, currentVersion);
123
+ if (described.steady) {
124
+ const heartbeatDue = now() - lastSteadyLoggedAt >= heartbeatMs;
125
+ if (described.signature === lastSteadySignature && !heartbeatDue)
126
+ return;
127
+ lastSteadySignature = described.signature;
128
+ lastSteadyLoggedAt = now();
129
+ }
130
+ else {
131
+ // An actionable event breaks the steady-state run; the next steady tick
132
+ // re-logs its current state rather than being suppressed as a duplicate.
133
+ lastSteadySignature = null;
134
+ }
135
+ if (described.level === 'warn')
136
+ logger.warn(described.message);
137
+ else
138
+ logger.info(described.message);
139
+ };
140
+ }
30
141
  /**
31
142
  * Run `npm install -g <package>@latest` as a child process.
32
143
  * Returns true on success, false on failure.
@@ -64,7 +175,12 @@ export function performSelfUpdate(packageName) {
64
175
  * re-arms only when the daemon leaves and re-enters the ready state.
65
176
  */
66
177
  export function createUpdateController(deps) {
67
- const { currentVersion, packageName = '@telora/daemon', isIdle, getCachedCandidateVersion, onUpdateReady, performUpdate = performSelfUpdate, now = Date.now, stalenessThresholdMs = Number.POSITIVE_INFINITY, armDrain = armDrainForUpdate, releaseDrain = releaseDrainForUpdate, isUrgent = () => false, } = deps;
178
+ const { currentVersion, packageName = '@telora/daemon', isIdle, getCachedCandidateVersion, onUpdateReady, performUpdate = performSelfUpdate, now = Date.now, stalenessThresholdMs = Number.POSITIVE_INFINITY, armDrain = armDrainForUpdate, releaseDrain = releaseDrainForUpdate, isUrgent = () => false, decisionHeartbeatMs = DEFAULT_DECISION_HEARTBEAT_MS, onDecision, } = deps;
179
+ // Observability sink: every tick emits exactly one classified decision here.
180
+ // Default logs (heartbeat-throttled) so activity is never fully silent; tests
181
+ // inject their own sink to assert the decision contract.
182
+ const emit = onDecision ??
183
+ createLoggingDecisionSink({ logger: log, currentVersion, heartbeatMs: decisionHeartbeatMs, now });
68
184
  // True while the "ready to update" condition (idle + newer version) held on
69
185
  // the previous tick. The controller acts only on the false->true transition.
70
186
  let wasReady = false;
@@ -103,13 +219,15 @@ export function createUpdateController(deps) {
103
219
  // interrupt an in-flight batch, and it is NEVER the loop's own decision.
104
220
  // Absent the signal, behavior is exactly deliveries A-C.
105
221
  if (haveNewer && isUrgent()) {
106
- log.info(`[auto-update] URGENT signal set -- applying update v${candidate} mid-batch, ` +
107
- `preempting in-flight work (current v${currentVersion})`);
222
+ // candidate is non-null here (haveNewer implies it).
223
+ const target = candidate;
224
+ emit({ kind: 'applying', candidate: target, trigger: 'urgent' });
108
225
  const ok = await performUpdate(packageName);
109
226
  if (!ok) {
110
- log.warn('Urgent install failed; will retry next tick');
227
+ emit({ kind: 'failed', candidate: target, trigger: 'urgent', error: 'npm install did not succeed' });
111
228
  return;
112
229
  }
230
+ emit({ kind: 'applied', candidate: target });
113
231
  onUpdateReady();
114
232
  return;
115
233
  }
@@ -124,24 +242,40 @@ export function createUpdateController(deps) {
124
242
  !idleNow &&
125
243
  now() - pendingSince >= stalenessThresholdMs) {
126
244
  armDrain();
245
+ emit({ kind: 'drain-armed', candidate: candidate });
127
246
  }
128
247
  const ready = idleNow && haveNewer;
129
248
  const risingEdge = ready && !wasReady;
130
249
  wasReady = ready;
131
- if (!risingEdge)
250
+ if (!risingEdge) {
251
+ // No install this tick -- still emit the classified steady state so the
252
+ // controller's liveness is observable (silence never means "not run").
253
+ if (!haveNewer) {
254
+ emit({ kind: 'current' });
255
+ }
256
+ else {
257
+ emit({
258
+ kind: 'candidate-pending',
259
+ candidate: candidate,
260
+ reason: idleNow ? 'awaiting-idle-edge' : 'busy',
261
+ });
262
+ }
132
263
  return;
133
- log.info(`[auto-update] Batch-safe idle seam reached; applying update v${candidate} (current v${currentVersion})`);
264
+ }
265
+ const target = candidate;
266
+ emit({ kind: 'applying', candidate: target, trigger: 'idle-seam' });
134
267
  const ok = await performUpdate(packageName);
135
268
  if (!ok) {
136
269
  // Consume the edge: do not retry until the daemon leaves and re-enters
137
270
  // the ready state, so a persistent install failure cannot spam npm.
138
- log.warn('Install failed; will retry on the next idle edge');
271
+ emit({ kind: 'failed', candidate: target, trigger: 'idle-seam', error: 'npm install did not succeed' });
139
272
  return;
140
273
  }
274
+ emit({ kind: 'applied', candidate: target });
141
275
  onUpdateReady();
142
276
  }
143
277
  catch (err) {
144
- log.warn(`[auto-update] Unexpected error: ${err instanceof Error ? err.message : String(err)}`);
278
+ emit({ kind: 'error', error: err instanceof Error ? err.message : String(err) });
145
279
  }
146
280
  }
147
281
  return { tick };
@@ -1 +1 @@
1
- {"version":3,"file":"auto-update.js","sourceRoot":"","sources":["../src/auto-update.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auto-update.js","sourceRoot":"","sources":["../src/auto-update.ts"],"names":[],"mappings":"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"}
@@ -7,10 +7,30 @@
7
7
  * 3. Each focus worktree vs integration
8
8
  *
9
9
  * Results ride in the heartbeat metadata field (no new tables).
10
+ *
11
+ * Multi-product: computeBranchStatus is called once per configured product
12
+ * with a product-scoped config (configForProduct). The focus worktree map
13
+ * spans all products, so this module scopes it by each entry's productId and
14
+ * runs git against the entry's own repoPath — evaluating a worktree against
15
+ * a repository that does not own it is unrepresentable here. All caches are
16
+ * keyed per product so one product's tick cannot evict another's state.
17
+ *
18
+ * Failure semantics (two distinct kinds, deliberately kept apart):
19
+ * - TRANSIENT git failures (lock contention, mid-rebase, timeouts) fall
20
+ * back to the last good cached status without raising anything — this
21
+ * tolerance predates this module split and prevents UI flicker.
22
+ * - PERMANENT failures (unknown revision, not a git repository, bad
23
+ * object) mean the branch we believe exists cannot be resolved where we
24
+ * looked: an attribution error, not contention. These are surfaced via
25
+ * a healthEvent + error log (once per focus per daemon run) instead of
26
+ * silently rendering identically to "no worktree". A worktree entry in
27
+ * the map IS the claim that its branch should exist; a legitimately
28
+ * deleted branch is removed from the map (removeFocusWorktree) before
29
+ * ever being evaluated here, so ordinary deletions raise no events.
10
30
  */
11
31
  import type { DaemonConfig } from './types.js';
12
32
  import type { BranchMonitorEntry } from './queries/products.js';
13
- /** Reset the cache. Exported for tests only. */
33
+ /** Reset all caches. Exported for tests only. */
14
34
  export declare function resetBranchStatusCache(): void;
15
35
  export type BranchHealth = 'clean' | 'dirty' | 'conflict';
16
36
  export interface IntegrationBranchStatus {
@@ -44,13 +64,15 @@ export interface BranchStatusOptions {
44
64
  branchMonitors?: BranchMonitorEntry[];
45
65
  }
46
66
  /**
47
- * Compute branch status for all three tiers.
67
+ * Compute branch status for all three tiers of ONE product.
48
68
  *
49
69
  * Safe to call from the heartbeat loop: uses short git timeouts
50
70
  * and catches all errors so a single failure skips that entry
51
71
  * rather than failing the entire heartbeat.
52
72
  *
53
- * @param config - Daemon config (provides repoPath, integrationBranch)
73
+ * @param config - Product-scoped daemon config (configForProduct); provides
74
+ * productId, repoPath, integrationBranch. Only worktrees owned by
75
+ * config.productId are evaluated, each against its own repoPath.
54
76
  * @param options - Optional overrides for mainBranch and branchMonitors from the product record
55
77
  */
56
78
  export declare function computeBranchStatus(config: DaemonConfig, options?: BranchStatusOptions): BranchStatusPayload;
@@ -1 +1 @@
1
- {"version":3,"file":"branch-status.d.ts","sourceRoot":"","sources":["../src/branch-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAK/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAyBhE,gDAAgD;AAChD,wBAAgB,sBAAsB,IAAI,IAAI,CAI7C;AAID,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;AAE1D,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,YAAY,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC5C,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,OAAO,EAAE,iBAAiB,EAAE,CAAC;CAC9B;AAED,kDAAkD;AAClD,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACvC;AA2BD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,mBAAmB,CA4K5G"}
1
+ {"version":3,"file":"branch-status.d.ts","sourceRoot":"","sources":["../src/branch-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAM/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAsChE,iDAAiD;AACjD,wBAAgB,sBAAsB,IAAI,IAAI,CAG7C;AAID,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;AAE1D,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,YAAY,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC5C,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,OAAO,EAAE,iBAAiB,EAAE,CAAC;CAC9B;AAED,kDAAkD;AAClD,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACvC;AA6ED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,mBAAmB,CAuM5G"}