@wrongstack/core 0.313.0 → 0.316.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 (343) hide show
  1. package/dist/chronicle/index.js +84 -6391
  2. package/dist/chronicle/legacy-journal-import.d.ts +0 -6
  3. package/dist/chronicle/metrics-ingest.d.ts +14 -0
  4. package/dist/chronicle/metrics-schema.d.ts +10 -1
  5. package/dist/chronicle/metrics-store.d.ts +20 -2
  6. package/dist/chronicle/project-server.js +98 -4874
  7. package/dist/chronicle/sink.d.ts +13 -0
  8. package/dist/chronicle/sqlite-journal.d.ts +20 -2
  9. package/dist/chunk-25LSLC3G.js +334 -0
  10. package/dist/chunk-27QIURLN.js +1073 -0
  11. package/dist/chunk-2FK4WTFF.js +207 -0
  12. package/dist/chunk-2YU4WVBW.js +134 -0
  13. package/dist/chunk-3AGWVSS7.js +4608 -0
  14. package/dist/chunk-3BDV7RL3.js +211 -0
  15. package/dist/chunk-3ECENVHL.js +325 -0
  16. package/dist/chunk-3XPVB7BA.js +135 -0
  17. package/dist/chunk-45WI72ZB.js +16884 -0
  18. package/dist/chunk-4BMVPOHO.js +3748 -0
  19. package/dist/chunk-4I7HGVVA.js +363 -0
  20. package/dist/chunk-4LCZVJVF.js +317 -0
  21. package/dist/chunk-4SJNS7OB.js +217 -0
  22. package/dist/chunk-4VWO3ZXL.js +342 -0
  23. package/dist/chunk-57GEWK5X.js +26 -0
  24. package/dist/chunk-5BMIE7QG.js +46 -0
  25. package/dist/chunk-5S437PRC.js +50 -0
  26. package/dist/chunk-5XDUGTKN.js +511 -0
  27. package/dist/chunk-5YPSXQXM.js +1443 -0
  28. package/dist/chunk-6FHWXLPT.js +10 -0
  29. package/dist/chunk-6H5GEOET.js +2406 -0
  30. package/dist/chunk-6NWEVFEL.js +151 -0
  31. package/dist/chunk-AYW5YINX.js +58 -0
  32. package/dist/chunk-B4AMLZPB.js +9 -0
  33. package/dist/chunk-B7F4WVP4.js +65 -0
  34. package/dist/chunk-BJHVULHO.js +55 -0
  35. package/dist/chunk-BPBKKBUK.js +2085 -0
  36. package/dist/chunk-BYD345OX.js +589 -0
  37. package/dist/chunk-C27KDLOX.js +279 -0
  38. package/dist/chunk-CU546ESW.js +597 -0
  39. package/dist/chunk-DLHHXUAM.js +172 -0
  40. package/dist/chunk-DOTHQSJ2.js +429 -0
  41. package/dist/chunk-DYLPMV4Q.js +711 -0
  42. package/dist/chunk-EODDVJBM.js +82 -0
  43. package/dist/chunk-F3JWNST7.js +361 -0
  44. package/dist/chunk-FC2ZGRF3.js +140 -0
  45. package/dist/chunk-FCBTO76Z.js +5786 -0
  46. package/dist/chunk-FHZVFYSL.js +396 -0
  47. package/dist/chunk-FNXVT7HF.js +52 -0
  48. package/dist/chunk-FWNLEZYG.js +259 -0
  49. package/dist/chunk-FXQLIX3K.js +211 -0
  50. package/dist/chunk-G5S3S5ZN.js +38 -0
  51. package/dist/chunk-GDQ7CZRQ.js +116 -0
  52. package/dist/chunk-GJJGJB2R.js +1374 -0
  53. package/dist/chunk-GTCU6DZ3.js +1 -0
  54. package/dist/chunk-HA4ZYA6T.js +178 -0
  55. package/dist/chunk-HI3JGZR2.js +188 -0
  56. package/dist/chunk-HMLIGAU7.js +395 -0
  57. package/dist/chunk-HXKZ7OBQ.js +303 -0
  58. package/dist/chunk-I7DALG7J.js +292 -0
  59. package/dist/chunk-IRUTEHCE.js +960 -0
  60. package/dist/chunk-IYFBFX34.js +86 -0
  61. package/dist/chunk-J2WRWR37.js +1104 -0
  62. package/dist/chunk-JFPJ6LLQ.js +129 -0
  63. package/dist/chunk-JMULFFLN.js +9 -0
  64. package/dist/chunk-JO4MGB6Z.js +1264 -0
  65. package/dist/chunk-JVKB2TBL.js +48 -0
  66. package/dist/chunk-JX7VBZDK.js +31 -0
  67. package/dist/chunk-K6BXGITA.js +931 -0
  68. package/dist/chunk-KDQJCT2J.js +45 -0
  69. package/dist/chunk-KJ2ZTQSL.js +47 -0
  70. package/dist/chunk-KZMSZV32.js +187 -0
  71. package/dist/chunk-LA7CLDRW.js +129 -0
  72. package/dist/chunk-LHOA5DWA.js +28 -0
  73. package/dist/chunk-LSMMOS2Z.js +119 -0
  74. package/dist/chunk-LX5QWLBL.js +27 -0
  75. package/dist/chunk-LXWCMQNJ.js +789 -0
  76. package/dist/chunk-M27LIEKV.js +2829 -0
  77. package/dist/chunk-MJPHJRAL.js +663 -0
  78. package/dist/chunk-MTL4O5YR.js +228 -0
  79. package/dist/chunk-NDBIPFNY.js +102 -0
  80. package/dist/chunk-NEMIWEXC.js +1199 -0
  81. package/dist/chunk-NHJ75HXY.js +1 -0
  82. package/dist/chunk-NIOAGFPB.js +1510 -0
  83. package/dist/chunk-NS52ISWS.js +355 -0
  84. package/dist/chunk-NSOFPKGT.js +5352 -0
  85. package/dist/chunk-NVIZG63R.js +757 -0
  86. package/dist/chunk-O37BQ65S.js +21 -0
  87. package/dist/chunk-OOYZPOXM.js +308 -0
  88. package/dist/chunk-OSGLYW5J.js +28 -0
  89. package/dist/chunk-PFCMSSUF.js +1640 -0
  90. package/dist/chunk-PFZO3C6H.js +14 -0
  91. package/dist/chunk-PGRVXIMY.js +158 -0
  92. package/dist/chunk-PHH7LD45.js +113 -0
  93. package/dist/chunk-PISBFBJN.js +109 -0
  94. package/dist/chunk-POOOIWE5.js +9 -0
  95. package/dist/chunk-PQNS3U7Z.js +1240 -0
  96. package/dist/chunk-QSTSJOCK.js +402 -0
  97. package/dist/chunk-RFQMOKWK.js +282 -0
  98. package/dist/chunk-RJIZEJ42.js +30 -0
  99. package/dist/chunk-RTOTNK3P.js +484 -0
  100. package/dist/chunk-RXKSDUAU.js +1172 -0
  101. package/dist/chunk-S45JPKQN.js +3317 -0
  102. package/dist/chunk-SAFHACFA.js +152 -0
  103. package/dist/chunk-SQJVFEBV.js +41 -0
  104. package/dist/chunk-SVT4RNTR.js +49 -0
  105. package/dist/chunk-SWUFN7XM.js +43 -0
  106. package/dist/chunk-SXMVYC5H.js +174 -0
  107. package/dist/chunk-SZ6AYUIZ.js +23 -0
  108. package/dist/chunk-TBRL2RCC.js +9 -0
  109. package/dist/chunk-TCCHINEF.js +655 -0
  110. package/dist/chunk-THEGTRAG.js +316 -0
  111. package/dist/chunk-TR4LQE7L.js +2256 -0
  112. package/dist/chunk-TRT2HRWZ.js +18 -0
  113. package/dist/chunk-TWJMGXCI.js +900 -0
  114. package/dist/chunk-U45AXT5D.js +1023 -0
  115. package/dist/chunk-U4FWBSO3.js +509 -0
  116. package/dist/chunk-UBGDX6FI.js +147 -0
  117. package/dist/chunk-UJILKYES.js +75 -0
  118. package/dist/chunk-ULMAQV3T.js +234 -0
  119. package/dist/chunk-VVBP6KGT.js +9 -0
  120. package/dist/chunk-W5VITDM2.js +168 -0
  121. package/dist/chunk-WAHQVNWT.js +194 -0
  122. package/dist/chunk-WBPVKEEE.js +227 -0
  123. package/dist/chunk-WGGYRBXH.js +5434 -0
  124. package/dist/chunk-WLYKU45P.js +5770 -0
  125. package/dist/chunk-WP7BVANJ.js +53 -0
  126. package/dist/chunk-WQQON3SV.js +473 -0
  127. package/dist/chunk-WQTOVMGV.js +119 -0
  128. package/dist/chunk-XBDP4QPW.js +7 -0
  129. package/dist/chunk-XEBHSJLT.js +103 -0
  130. package/dist/chunk-XF4VUMKW.js +231 -0
  131. package/dist/chunk-XQ2ECNK3.js +1 -0
  132. package/dist/chunk-Y5YXDM7D.js +74 -0
  133. package/dist/chunk-YOPAUVU4.js +2588 -0
  134. package/dist/chunk-YPT4A46F.js +362 -0
  135. package/dist/chunk-YWXT3JNM.js +425 -0
  136. package/dist/chunk-YY6APYUM.js +49 -0
  137. package/dist/chunk-Z2IJUO45.js +691 -0
  138. package/dist/chunk-ZHZ2Y2DH.js +1643 -0
  139. package/dist/chunk-ZT7JNIGX.js +152 -0
  140. package/dist/coordination/agent-monitor.d.ts +9 -1
  141. package/dist/coordination/agent-subagent-runner.d.ts +1 -1
  142. package/dist/coordination/agents/agent-prompts.d.ts +8 -0
  143. package/dist/coordination/agents/index.d.ts +33 -1
  144. package/dist/coordination/agents/index.js +184 -6269
  145. package/dist/coordination/agents/phase3-wave1-platform.d.ts +1 -3
  146. package/dist/coordination/agents/phase3-wave2-meta.d.ts +1 -3
  147. package/dist/coordination/agents/phase8-wave3-products.d.ts +1 -3
  148. package/dist/coordination/agents/phase9-wave4-platform-meta.d.ts +1 -3
  149. package/dist/coordination/agents/project-agent-identity.d.ts +11 -11
  150. package/dist/coordination/agents/types.d.ts +13 -2
  151. package/dist/coordination/brain-monitor.d.ts +30 -7
  152. package/dist/coordination/collab-debug.d.ts +1 -1
  153. package/dist/coordination/collab-pause.d.ts +1 -1
  154. package/dist/coordination/delegate-tool.d.ts +7 -5
  155. package/dist/coordination/director-kanban-queue-helpers.d.ts +1 -0
  156. package/dist/coordination/director-options.d.ts +7 -0
  157. package/dist/coordination/director-spawn-model.d.ts +17 -0
  158. package/dist/coordination/director-tools.d.ts +2 -2
  159. package/dist/coordination/director.d.ts +12 -0
  160. package/dist/coordination/dispatcher.d.ts +8 -0
  161. package/dist/coordination/fleet-bus.d.ts +35 -4
  162. package/dist/coordination/fleet-supervisor.d.ts +10 -2
  163. package/dist/coordination/fleet.d.ts +16 -7
  164. package/dist/coordination/index.d.ts +4 -0
  165. package/dist/coordination/index.js +402 -34324
  166. package/dist/coordination/kanban-dispatch-port.d.ts +2 -2
  167. package/dist/coordination/mailbox-http-router.d.ts +4 -3
  168. package/dist/coordination/mailbox-http-validation.d.ts +1 -1
  169. package/dist/coordination/mailbox-project-server.js +48 -3276
  170. package/dist/coordination/mailbox-types.d.ts +24 -6
  171. package/dist/coordination/model-tier-leader.d.ts +122 -0
  172. package/dist/coordination/model-tier.d.ts +122 -0
  173. package/dist/coordination/multi-agent-coordinator.d.ts +24 -0
  174. package/dist/coordination/origin-session.d.ts +16 -0
  175. package/dist/coordination/provider-status-tracker.d.ts +41 -5
  176. package/dist/coordination/session-note-hub.d.ts +44 -0
  177. package/dist/coordination/session-note-tool.d.ts +10 -0
  178. package/dist/core/agent.d.ts +15 -2
  179. package/dist/core/context.d.ts +22 -3
  180. package/dist/core/index.d.ts +2 -0
  181. package/dist/core/index.js +239 -12360
  182. package/dist/core/model-ref.js +5 -23
  183. package/dist/core/provider-runner.d.ts +36 -1
  184. package/dist/core/request-conversation-binding.d.ts +37 -0
  185. package/dist/core/session-notes.d.ts +25 -0
  186. package/dist/core/system-prompt-builder.d.ts +11 -2
  187. package/dist/core/system-prompt-variants.d.ts +78 -0
  188. package/dist/design/index.js +50 -1087
  189. package/dist/execution/auto-compaction-middleware.d.ts +11 -0
  190. package/dist/execution/autonomy-brain.d.ts +2 -1
  191. package/dist/execution/autonomy-prompt-contributor.d.ts +7 -2
  192. package/dist/execution/compaction-core.d.ts +4 -4
  193. package/dist/execution/eternal-autonomy.d.ts +1 -1
  194. package/dist/execution/index.d.ts +1 -1
  195. package/dist/execution/index.js +1615 -21895
  196. package/dist/execution/model-runtime.d.ts +0 -7
  197. package/dist/execution/parallel-eternal-engine.d.ts +7 -7
  198. package/dist/execution/prompt-enhancer.js +16 -535
  199. package/dist/execution/retry-policy.d.ts +31 -1
  200. package/dist/extension/index.js +7 -311
  201. package/dist/goal/index.js +33 -3435
  202. package/dist/hooks/index.js +14 -1138
  203. package/dist/hq/index.js +114 -5139
  204. package/dist/hq/persistence/event-log.d.ts +0 -1
  205. package/dist/hq/persistence.d.ts +4 -4
  206. package/dist/hq/protocol.js +21 -668
  207. package/dist/hq/publisher.d.ts +2 -0
  208. package/dist/index.d.ts +14 -11
  209. package/dist/index.js +1502 -92655
  210. package/dist/infrastructure/index.d.ts +4 -4
  211. package/dist/infrastructure/index.js +504 -5230
  212. package/dist/infrastructure/token-counter.d.ts +9 -0
  213. package/dist/kernel/events/agent-events.d.ts +77 -3
  214. package/dist/kernel/events/brain-events.d.ts +12 -0
  215. package/dist/kernel/events/provider-events.d.ts +22 -1
  216. package/dist/kernel/events/session-events.d.ts +14 -0
  217. package/dist/kernel/events/tool-events.d.ts +13 -0
  218. package/dist/kernel/index.js +14 -992
  219. package/dist/mailbox-attach.d.ts +1 -1
  220. package/dist/models/index.js +41 -1117
  221. package/dist/notifications/index.js +3 -108
  222. package/dist/observability/event-bridge.d.ts +25 -5
  223. package/dist/observability/index.d.ts +9 -8
  224. package/dist/observability/index.js +477 -631
  225. package/dist/observability/tool-usage-source.d.ts +65 -0
  226. package/dist/plugin/index.d.ts +5 -0
  227. package/dist/plugin/index.js +600 -14835
  228. package/dist/plugins/auto-review-plugin.d.ts +3 -2
  229. package/dist/plugins/review-finding-commands.d.ts +0 -8
  230. package/dist/plugins/review-finding-store.js +22 -0
  231. package/dist/plugins/review-finding-types.js +19 -0
  232. package/dist/plugins/review-report-integration.js +21 -0
  233. package/dist/plugins/review-report-store.js +20 -0
  234. package/dist/plugins/review-report-types.js +13 -0
  235. package/dist/prompts/index.js +14 -948
  236. package/dist/registry/index.js +9 -822
  237. package/dist/registry/tool-registry.d.ts +59 -9
  238. package/dist/registry-7N4O3E7W.js +14 -0
  239. package/dist/replay/index.js +6 -84
  240. package/dist/security/capabilities.d.ts +6 -0
  241. package/dist/security/file-permissions.d.ts +1 -1
  242. package/dist/security/index.js +161 -2235
  243. package/dist/security/permission-policy.d.ts +12 -1
  244. package/dist/security/secret-scrubber.d.ts +15 -0
  245. package/dist/session-catalog/index.d.ts +1 -0
  246. package/dist/session-catalog/index.js +41 -2103
  247. package/dist/session-catalog/project-server.js +59 -1435
  248. package/dist/session-catalog/protocol.d.ts +32 -1
  249. package/dist/session-catalog/registry.d.ts +17 -1
  250. package/dist/session-catalog/session-agents.d.ts +56 -0
  251. package/dist/session-catalog/store-rebuild.d.ts +14 -0
  252. package/dist/session-catalog/store-schema.d.ts +26 -0
  253. package/dist/session-catalog/store.d.ts +27 -1
  254. package/dist/session-note-attach.d.ts +9 -0
  255. package/dist/skills/index.js +35 -1578
  256. package/dist/statusline/index.d.ts +43 -0
  257. package/dist/statusline/index.js +102 -0
  258. package/dist/storage/board-store-port.d.ts +2 -2
  259. package/dist/storage/config-loader/in-project-policy.d.ts +29 -0
  260. package/dist/storage/config-loader.d.ts +3 -2
  261. package/dist/storage/file-session-writer.d.ts +4 -2
  262. package/dist/storage/goal-coordination.d.ts +6 -1
  263. package/dist/storage/goal-kanban.d.ts +4 -1
  264. package/dist/storage/index.d.ts +12 -4
  265. package/dist/storage/index.js +198 -15601
  266. package/dist/storage/input-history-store.d.ts +2 -4
  267. package/dist/storage/memory-curator.d.ts +133 -0
  268. package/dist/storage/session-agent-attribution.d.ts +39 -0
  269. package/dist/storage/session-doctor.d.ts +109 -0
  270. package/dist/storage/session-event-bridge.d.ts +5 -7
  271. package/dist/storage/session-outcome.d.ts +42 -0
  272. package/dist/storage/session-recovery.d.ts +55 -0
  273. package/dist/storage/session-store/load-session-data.d.ts +11 -0
  274. package/dist/storage/session-store/prune-helpers.d.ts +1 -1
  275. package/dist/storage/session-store/resume-session.d.ts +0 -2
  276. package/dist/storage/session-store/types.d.ts +8 -0
  277. package/dist/storage/session-store.d.ts +3 -3
  278. package/dist/storage/session-summary-tracker.d.ts +8 -1
  279. package/dist/storage/session-write-buffer.d.ts +18 -0
  280. package/dist/storage/session-writer-truncate.d.ts +2 -0
  281. package/dist/tasking/index.js +10 -676
  282. package/dist/tools/fallback-manage-tools.d.ts +6 -4
  283. package/dist/tools/index.js +52 -9590
  284. package/dist/tools/model-tier-set-tool.d.ts +66 -0
  285. package/dist/types/agent-bridge.d.ts +2 -1
  286. package/dist/types/config/autonomy.d.ts +5 -0
  287. package/dist/types/config/mcp-features.d.ts +7 -0
  288. package/dist/types/config/model-tiers.d.ts +148 -0
  289. package/dist/types/config/root.d.ts +9 -0
  290. package/dist/types/config/tools.d.ts +73 -0
  291. package/dist/types/config/ui.d.ts +1 -1
  292. package/dist/types/config.d.ts +1 -0
  293. package/dist/types/context.d.ts +2 -0
  294. package/dist/types/default-config.d.ts +6 -0
  295. package/dist/types/errors.d.ts +20 -1
  296. package/dist/types/index.d.ts +11 -9
  297. package/dist/types/index.js +131 -1342
  298. package/dist/types/multi-agent.d.ts +43 -0
  299. package/dist/types/plugin.d.ts +1 -1
  300. package/dist/types/provider-runner.d.ts +8 -0
  301. package/dist/types/provider.d.ts +15 -0
  302. package/dist/types/runtime-capability-manifest.d.ts +1 -1
  303. package/dist/types/secret-scrubber.d.ts +15 -0
  304. package/dist/types/session-markers.d.ts +37 -10
  305. package/dist/types/session-markers.js +8 -144
  306. package/dist/types/session-timeline.d.ts +197 -0
  307. package/dist/types/session-timeline.js +12 -0
  308. package/dist/types/session.d.ts +172 -11
  309. package/dist/types/system-prompt.d.ts +27 -0
  310. package/dist/utils/config-backup.d.ts +9 -1
  311. package/dist/utils/error.js +3 -4
  312. package/dist/utils/expect-defined.js +3 -9
  313. package/dist/utils/heap-watchdog.js +6 -706
  314. package/dist/utils/index.js +271 -5685
  315. package/dist/utils/message-invariants.d.ts +4 -1
  316. package/dist/utils/regex-guard.d.ts +1 -1
  317. package/dist/utils/sage-output-block.js +5 -42
  318. package/dist/utils/socket-path.d.ts +1 -1
  319. package/dist/utils/token-estimate.d.ts +6 -2
  320. package/dist/utils/wstack-paths.d.ts +2 -0
  321. package/dist/wiring/proxy-rewrite.d.ts +46 -0
  322. package/dist/wiring/proxy-rewrite.js +24 -121
  323. package/dist/worktree/index.js +6 -887
  324. package/instructions/agents/explore-companion.md +45 -18
  325. package/instructions/agents/memory-curator.md +34 -22
  326. package/instructions/coordination/director-preamble.md +12 -7
  327. package/instructions/coordination/subagent-baseline.md +26 -5
  328. package/instructions/leader-after-task.md +4 -1
  329. package/instructions/llm/chimera-review.md +30 -9
  330. package/instructions/llm/memory-curator.md +31 -0
  331. package/instructions/sections/tool/delegation-compact.md +2 -0
  332. package/instructions/sections/tool/delegation-full.md +5 -1
  333. package/instructions/sections/tool/mailbox-compact.md +5 -1
  334. package/instructions/sections/tool/mailbox-full.md +3 -0
  335. package/instructions/sections/tool/session-note-compact.md +3 -0
  336. package/instructions/sections/tool/session-note-full.md +15 -0
  337. package/instructions/system-lite.md +9 -4
  338. package/instructions/system-pro.md +66 -143
  339. package/instructions/system.md +73 -175
  340. package/package.json +32 -4
  341. package/dist/coordination/agents.d.ts +0 -8
  342. package/dist/coordination/transport.d.ts +0 -2
  343. package/dist/storage/session-writer/session-writer-summary-tracker.d.ts +0 -28
@@ -0,0 +1,396 @@
1
+ // src/kernel/events.ts
2
+ var MAX_WILDCARDS = 500;
3
+ var MAX_NAMED_LISTENERS = 2e3;
4
+ var EventBus = class {
5
+ listeners = /* @__PURE__ */ new Map();
6
+ wildcards = [];
7
+ logger;
8
+ /**
9
+ * Dispatch arrays cached per event name, rebuilt lazily after a
10
+ * subscription change. See {@link namedSnapshot}. Every mutation of
11
+ * `listeners` must invalidate the matching entry, and every mutation of
12
+ * `wildcards` must null `wildcardSnapshotCache` — a missed invalidation
13
+ * means an emit dispatches to a stale listener set.
14
+ */
15
+ listenerSnapshots = /* @__PURE__ */ new Map();
16
+ wildcardSnapshotCache = null;
17
+ setLogger(logger) {
18
+ this.logger = logger;
19
+ }
20
+ on(event, fn) {
21
+ if (this.listenerCount() >= MAX_NAMED_LISTENERS) {
22
+ this.logger?.error(
23
+ `EventBus named listener limit (~${MAX_NAMED_LISTENERS}) reached \u2014 rejecting on("${event}"). Callers must dispose their named listeners to prevent unbounded memory growth.`
24
+ );
25
+ return () => {
26
+ };
27
+ }
28
+ let set = this.listeners.get(event);
29
+ if (!set) {
30
+ set = /* @__PURE__ */ new Set();
31
+ this.listeners.set(event, set);
32
+ }
33
+ set.add(fn);
34
+ this.listenerSnapshots.delete(event);
35
+ return () => this.off(event, fn);
36
+ }
37
+ off(event, fn) {
38
+ const set = this.listeners.get(event);
39
+ if (!set) return;
40
+ set.delete(fn);
41
+ this.listenerSnapshots.delete(event);
42
+ if (set.size === 0) this.listeners.delete(event);
43
+ }
44
+ once(event, fn) {
45
+ const wrapper = (payload) => {
46
+ this.off(event, wrapper);
47
+ fn(payload);
48
+ };
49
+ this.on(event, wrapper);
50
+ return () => {
51
+ this.off(event, wrapper);
52
+ };
53
+ }
54
+ /**
55
+ * Subscribe to all events, regardless of name. Short-hand for
56
+ * `onPattern('*')`. Use for logging, debugging, or forwarding every
57
+ * event to another bus (as FleetBus does).
58
+ *
59
+ * Returns an unsubscribe function.
60
+ */
61
+ onAny(fn, owner) {
62
+ return this.onPattern("*", fn, owner);
63
+ }
64
+ /**
65
+ * Subscribe to all events whose name matches a glob-style prefix.
66
+ * `'tool.*'` matches `tool.started`, `tool.executed`, `tool.progress`, etc.
67
+ * `'*'` matches every event.
68
+ *
69
+ * The handler receives `(eventName, payload)` with the event name as a
70
+ * string and the payload as `unknown`. Use for logging, debugging, or
71
+ * metrics collection across a family of events.
72
+ *
73
+ * Returns an unsubscribe function.
74
+ */
75
+ onPattern(pattern, fn, owner) {
76
+ if (this.wildcards.length >= MAX_WILDCARDS) {
77
+ this.logger?.error(
78
+ `EventBus wildcard limit (${MAX_WILDCARDS}) reached \u2014 rejecting onPattern("${pattern}")` + (owner ? ` (owner: ${owner})` : "") + ". Callers must dispose their wildcard listeners to prevent unbounded growth."
79
+ );
80
+ return () => {
81
+ };
82
+ }
83
+ const match = makePatternMatcher(pattern);
84
+ const entry = { match, fn, owner };
85
+ this.wildcards.push(entry);
86
+ this.wildcardSnapshotCache = null;
87
+ return () => {
88
+ const idx = this.wildcards.indexOf(entry);
89
+ if (idx >= 0) {
90
+ this.wildcards.splice(idx, 1);
91
+ this.wildcardSnapshotCache = null;
92
+ }
93
+ };
94
+ }
95
+ /**
96
+ * Subscribe to all events whose name matches a RegExp.
97
+ * More flexible than `onPattern` — use when you need regex features
98
+ * (alternation, character classes, capture groups).
99
+ *
100
+ * Returns an unsubscribe function.
101
+ */
102
+ onRegex(regex, fn, owner) {
103
+ if (this.wildcards.length >= MAX_WILDCARDS) {
104
+ this.logger?.error(
105
+ `EventBus wildcard limit (${MAX_WILDCARDS}) reached \u2014 rejecting onRegex(${regex})` + (owner ? ` (owner: ${owner})` : "") + ". Callers must dispose their wildcard listeners to prevent unbounded growth."
106
+ );
107
+ return () => {
108
+ };
109
+ }
110
+ const entry = { match: (e) => regex.test(e), fn, owner };
111
+ this.wildcards.push(entry);
112
+ this.wildcardSnapshotCache = null;
113
+ return () => {
114
+ const idx = this.wildcards.indexOf(entry);
115
+ if (idx >= 0) {
116
+ this.wildcards.splice(idx, 1);
117
+ this.wildcardSnapshotCache = null;
118
+ }
119
+ };
120
+ }
121
+ emit(event, payload) {
122
+ const snapshot = this.namedSnapshot(event);
123
+ if (snapshot !== void 0) {
124
+ for (const fn of snapshot) {
125
+ try {
126
+ fn(payload);
127
+ } catch (err) {
128
+ this.logger?.error(`EventBus listener for "${event}" threw`, err);
129
+ }
130
+ }
131
+ }
132
+ if (this.wildcards.length > 0) {
133
+ const name = event;
134
+ for (const { match, fn } of this.wildcardSnapshot()) {
135
+ if (!match(name)) continue;
136
+ try {
137
+ fn(name, payload);
138
+ } catch (err) {
139
+ this.logger?.error(`EventBus wildcard listener for "${name}" threw`, err);
140
+ }
141
+ }
142
+ }
143
+ }
144
+ /**
145
+ * Dispatch array for one event name, or `undefined` when nothing is
146
+ * subscribed.
147
+ *
148
+ * Dispatch iterates a stable array rather than the live Set so a listener
149
+ * that subscribes or unsubscribes mid-emit cannot change what this round
150
+ * delivers: an addition fires from the next emit, a removal may still fire
151
+ * this round. That is the contract callers rely on, and it is unchanged.
152
+ *
153
+ * What changed is who pays for it. Building the array per emit did O(number
154
+ * of listeners) copying on every event, including `tool.progress` and
155
+ * streaming deltas — the highest-frequency paths in the process. The array
156
+ * is now cached and rebuilt only when the subscription set actually changes,
157
+ * which is wiring time and essentially never during a run. Measured at 2M
158
+ * emits with 12 named + 6 wildcard listeners: 207 ms → 141 ms.
159
+ *
160
+ * This is a throughput win, not a footprint one: the per-emit arrays died in
161
+ * the nursery and never showed up as retained heap (measured heap growth was
162
+ * the same either way). Do not cite this as a memory fix.
163
+ *
164
+ * A mutation during dispatch invalidates the cache for the *next* emit while
165
+ * the in-flight loop keeps walking the array it started with — which is
166
+ * exactly the snapshot semantics described above.
167
+ */
168
+ namedSnapshot(event) {
169
+ const cached = this.listenerSnapshots.get(event);
170
+ if (cached !== void 0) return cached;
171
+ const set = this.listeners.get(event);
172
+ if (!set || set.size === 0) return void 0;
173
+ const snapshot = [...set];
174
+ this.listenerSnapshots.set(event, snapshot);
175
+ return snapshot;
176
+ }
177
+ /** Wildcard counterpart to {@link namedSnapshot}; same caching rationale. */
178
+ wildcardSnapshot() {
179
+ this.wildcardSnapshotCache ??= this.wildcards.slice();
180
+ return this.wildcardSnapshotCache;
181
+ }
182
+ /**
183
+ * Emit a plugin-defined event that is intentionally outside EventMap.
184
+ * Custom events are delivered to wildcard/pattern listeners only; typed
185
+ * listeners remain reserved for core EventMap keys.
186
+ */
187
+ emitCustom(event, payload) {
188
+ if (this.wildcards.length === 0) return;
189
+ for (const { match, fn } of this.wildcardSnapshot()) {
190
+ if (!match(event)) continue;
191
+ try {
192
+ fn(event, payload);
193
+ } catch (err) {
194
+ this.logger?.error(`EventBus wildcard listener for "${event}" threw`, err);
195
+ }
196
+ }
197
+ }
198
+ clear() {
199
+ this.listeners.clear();
200
+ this.wildcards.length = 0;
201
+ this.listenerSnapshots.clear();
202
+ this.wildcardSnapshotCache = null;
203
+ }
204
+ /**
205
+ * V2-D: introspection helper. Pass an `event` to count handlers for a
206
+ * single key, or omit to get the total across every event. Used by the
207
+ * leak-detection smoke test to flag handler accumulation across runs.
208
+ * Does NOT include wildcard listeners.
209
+ */
210
+ listenerCount(event) {
211
+ if (event !== void 0) return this.listeners.get(event)?.size ?? 0;
212
+ let total = 0;
213
+ for (const set of this.listeners.values()) total += set.size;
214
+ return total;
215
+ }
216
+ /**
217
+ * Number of wildcard listeners currently registered.
218
+ */
219
+ wildcardCount() {
220
+ return this.wildcards.length;
221
+ }
222
+ /**
223
+ * True if anything would receive an emit for `event` — a named listener
224
+ * OR a wildcard/regex pattern that matches the event name. Unlike
225
+ * `listenerCount`, this DOES account for wildcards, so callers that gate
226
+ * behavior on "is anyone listening?" (e.g. SubagentBudget deciding whether
227
+ * to negotiate a soft limit vs hard-stop) don't misfire when the only
228
+ * subscriber is a pattern listener like the FleetBus's `onPattern('*')`.
229
+ */
230
+ hasListenerFor(event) {
231
+ if ((this.listeners.get(event)?.size ?? 0) > 0) return true;
232
+ return this.wildcards.some((w) => w.match(event));
233
+ }
234
+ };
235
+ var ScopedEventBus = class extends EventBus {
236
+ // Track registrations by a unique counter key so that EventBus.once()'s
237
+ // internal listener-removal doesn't affect our tracking (once removes the
238
+ // fn from EventBus but we still need to call our unsub during teardown).
239
+ registrations = /* @__PURE__ */ new Map();
240
+ nextKey = 0;
241
+ /**
242
+ * Identical to `EventBus.on` but the listener is tracked so that
243
+ * `teardown()` will remove it automatically.
244
+ */
245
+ on(event, fn) {
246
+ const key = this.nextKey++;
247
+ const unsub = super.on(event, fn);
248
+ this.registrations.set(key, unsub);
249
+ return () => {
250
+ this.registrations.delete(key);
251
+ unsub();
252
+ };
253
+ }
254
+ /**
255
+ * Identical to `EventBus.once` but the listener is tracked so that
256
+ * `teardown()` will remove it automatically.
257
+ *
258
+ * Uses EventBus's public API directly to avoid triggering our own `on()`
259
+ * override (which would consume a key slot for the wrapper, then orphan
260
+ * our registration entry under a different key).
261
+ *
262
+ * When the wrapper fires, it cleans up BOTH the underlying EventBus
263
+ * listener AND the tracking entry — so `scopedListenerCount` returns to
264
+ * its pre-`once()` value without requiring the caller to invoke the
265
+ * returned unsubscribe. The returned `unsub` is still safe to call
266
+ * after auto-removal (its delete is a no-op and its off() finds
267
+ * nothing to remove).
268
+ */
269
+ once(event, fn) {
270
+ const key = this.nextKey++;
271
+ const wrapper = (payload) => {
272
+ EventBus.prototype.off.call(this, event, wrapper);
273
+ this.registrations.delete(key);
274
+ fn(payload);
275
+ };
276
+ EventBus.prototype.on.call(this, event, wrapper);
277
+ const unsub = () => {
278
+ this.registrations.delete(key);
279
+ EventBus.prototype.off.call(this, event, wrapper);
280
+ };
281
+ this.registrations.set(key, unsub);
282
+ return unsub;
283
+ }
284
+ /**
285
+ * Subscribe to all events. Alias for `onPattern('*')` — the listener is
286
+ * tracked so that `teardown()` will remove it automatically.
287
+ */
288
+ onAny(fn, owner) {
289
+ if (this.wildcards.length >= MAX_WILDCARDS) {
290
+ this.logger?.error(
291
+ `EventBus wildcard limit (${MAX_WILDCARDS}) reached \u2014 rejecting onAny()` + (owner ? ` (owner: ${owner})` : "") + ". Callers must dispose their wildcard listeners to prevent unbounded growth."
292
+ );
293
+ return () => {
294
+ };
295
+ }
296
+ const key = this.nextKey++;
297
+ const unsub = EventBus.prototype.onPattern.call(this, "*", fn, owner);
298
+ this.registrations.set(key, unsub);
299
+ return () => {
300
+ this.registrations.delete(key);
301
+ unsub();
302
+ };
303
+ }
304
+ /**
305
+ * Identical to `EventBus.onPattern` but the listener is tracked so that
306
+ * `teardown()` will remove it automatically.
307
+ */
308
+ onPattern(pattern, fn, owner) {
309
+ if (this.wildcards.length >= MAX_WILDCARDS) {
310
+ this.logger?.error(
311
+ `EventBus wildcard limit (${MAX_WILDCARDS}) reached \u2014 rejecting onPattern("${pattern}")` + (owner ? ` (owner: ${owner})` : "") + ". Callers must dispose their wildcard listeners to prevent unbounded growth."
312
+ );
313
+ return () => {
314
+ };
315
+ }
316
+ const key = this.nextKey++;
317
+ const unsub = super.onPattern(pattern, fn, owner);
318
+ this.registrations.set(key, unsub);
319
+ return () => {
320
+ this.registrations.delete(key);
321
+ unsub();
322
+ };
323
+ }
324
+ /**
325
+ * Identical to `EventBus.onRegex` but the listener is tracked so that
326
+ * `teardown()` will remove it automatically.
327
+ */
328
+ onRegex(regex, fn, owner) {
329
+ if (this.wildcards.length >= MAX_WILDCARDS) {
330
+ this.logger?.error(
331
+ `EventBus wildcard limit (${MAX_WILDCARDS}) reached \u2014 rejecting onRegex(${regex})` + (owner ? ` (owner: ${owner})` : "") + ". Callers must dispose their wildcard listeners to prevent unbounded growth."
332
+ );
333
+ return () => {
334
+ };
335
+ }
336
+ const key = this.nextKey++;
337
+ const unsub = super.onRegex(regex, fn, owner);
338
+ this.registrations.set(key, unsub);
339
+ return () => {
340
+ this.registrations.delete(key);
341
+ unsub();
342
+ };
343
+ }
344
+ /**
345
+ * Remove every listener that was registered through this scoped bus.
346
+ * Idempotent — calling it multiple times is safe.
347
+ *
348
+ * Also available as `[Symbol.dispose]` for explicit resource management:
349
+ * ```ts
350
+ * using scope = new ScopedEventBus();
351
+ * scope.on('tool.executed', handler);
352
+ * // automatically teardown()'d when scope exits
353
+ * ```
354
+ */
355
+ teardown() {
356
+ for (const unsub of this.registrations.values()) {
357
+ try {
358
+ unsub();
359
+ } catch {
360
+ }
361
+ }
362
+ this.registrations.clear();
363
+ this.clear();
364
+ }
365
+ /** Alias for `teardown()` — enables `using new ScopedEventBus()` in Node ≥ 22. */
366
+ [Symbol.dispose]() {
367
+ this.teardown();
368
+ }
369
+ /** Number of tracked registrations. */
370
+ get scopedListenerCount() {
371
+ return this.registrations.size;
372
+ }
373
+ };
374
+ var MATCH_ALL = () => true;
375
+ function makePatternMatcher(pattern) {
376
+ if (pattern === "*") return MATCH_ALL;
377
+ if (pattern.endsWith(".*")) {
378
+ const prefix = pattern.slice(0, -2);
379
+ return (e) => e.startsWith(`${prefix}.`);
380
+ }
381
+ if (pattern.endsWith(":*")) {
382
+ const prefix = pattern.slice(0, -2);
383
+ return (e) => e.startsWith(`${prefix}:`);
384
+ }
385
+ if (pattern.endsWith("*")) {
386
+ const prefix = pattern.slice(0, -1);
387
+ return (e) => e.startsWith(prefix);
388
+ }
389
+ return (e) => e === pattern;
390
+ }
391
+
392
+ export {
393
+ EventBus,
394
+ ScopedEventBus
395
+ };
396
+ //# sourceMappingURL=chunk-FHZVFYSL.js.map
@@ -0,0 +1,52 @@
1
+ // src/utils/perf-profile.ts
2
+ var daemonDefaults = false;
3
+ function useDaemonPerfDefaults() {
4
+ daemonDefaults = true;
5
+ }
6
+ function getPerfProfile() {
7
+ const explicit = process.env.WRONGSTACK_PERF_PROFILE ?? process.env.WSTACK_PERF_PROFILE;
8
+ if (explicit === void 0 || explicit.trim() === "") {
9
+ return daemonDefaults ? "frugal" : "balanced";
10
+ }
11
+ const raw = explicit.trim().toLowerCase();
12
+ if (raw === "frugal" || raw === "cimri" || raw === "low" || raw === "eco") {
13
+ return "frugal";
14
+ }
15
+ return "balanced";
16
+ }
17
+ function isFrugalPerf() {
18
+ return getPerfProfile() === "frugal";
19
+ }
20
+ function indexParallelBatchSize(availableCores) {
21
+ const cores = Math.max(1, Math.floor(availableCores) || 1);
22
+ if (isFrugalPerf()) {
23
+ return Math.min(4, cores);
24
+ }
25
+ return Math.min(cores * 4, 40);
26
+ }
27
+ function sqliteCachePragmas() {
28
+ if (isFrugalPerf()) {
29
+ return { cacheSizeKiB: 16384, mmapBytes: 64 * 1024 * 1024 };
30
+ }
31
+ return { cacheSizeKiB: 131072, mmapBytes: 512 * 1024 * 1024 };
32
+ }
33
+ function SageCachePragmas() {
34
+ if (isFrugalPerf()) {
35
+ return { cacheSizeKiB: 8192, mmapBytes: 32 * 1024 * 1024 };
36
+ }
37
+ return { cacheSizeKiB: 65536, mmapBytes: 256 * 1024 * 1024 };
38
+ }
39
+ function tuiStreamFlushMs() {
40
+ return isFrugalPerf() ? 150 : 100;
41
+ }
42
+
43
+ export {
44
+ useDaemonPerfDefaults,
45
+ getPerfProfile,
46
+ isFrugalPerf,
47
+ indexParallelBatchSize,
48
+ sqliteCachePragmas,
49
+ SageCachePragmas,
50
+ tuiStreamFlushMs
51
+ };
52
+ //# sourceMappingURL=chunk-FNXVT7HF.js.map
@@ -0,0 +1,259 @@
1
+ // src/coordination/mailbox-type-properties.ts
2
+ var MAILBOX_TYPE_PROPERTIES = {
3
+ note: {
4
+ category: "informational",
5
+ expectsReply: false,
6
+ requiresAction: false,
7
+ backgroundEligible: false,
8
+ outOfBand: false,
9
+ renderPriority: 20,
10
+ recipientObligation: "Read for context; no reply needed.",
11
+ senderGuidance: "General-purpose FYI. Use when no more specific type applies."
12
+ },
13
+ ask: {
14
+ category: "actionable",
15
+ expectsReply: true,
16
+ requiresAction: true,
17
+ backgroundEligible: true,
18
+ outOfBand: false,
19
+ renderPriority: 10,
20
+ recipientObligation: "Answer as soon as possible \u2014 the sender is waiting.",
21
+ senderGuidance: "Blocking question. Only use when you need an answer to proceed."
22
+ },
23
+ assign: {
24
+ category: "actionable",
25
+ expectsReply: false,
26
+ requiresAction: true,
27
+ backgroundEligible: true,
28
+ outOfBand: false,
29
+ renderPriority: 10,
30
+ recipientObligation: "Accept or decline; act on it when current operation allows.",
31
+ senderGuidance: 'Task delegation. Must be directed to a specific recipient (not "*").'
32
+ },
33
+ steer: {
34
+ category: "actionable",
35
+ expectsReply: false,
36
+ requiresAction: true,
37
+ backgroundEligible: true,
38
+ outOfBand: false,
39
+ renderPriority: 0,
40
+ // Always rendered first
41
+ recipientObligation: "Pause current approach, adjust per instruction, then resume.",
42
+ senderGuidance: "Mid-task direction change. The recipient is already working on something."
43
+ },
44
+ btw: {
45
+ category: "informational",
46
+ expectsReply: false,
47
+ requiresAction: false,
48
+ backgroundEligible: false,
49
+ outOfBand: false,
50
+ renderPriority: 30,
51
+ recipientObligation: "Absorb the information and stay on current task; no reply needed.",
52
+ senderGuidance: "Low-priority aside. Non-urgent info that can wait."
53
+ },
54
+ broadcast: {
55
+ category: "routing",
56
+ expectsReply: false,
57
+ requiresAction: false,
58
+ backgroundEligible: false,
59
+ outOfBand: false,
60
+ renderPriority: 20,
61
+ recipientObligation: 'Read if addressed to you (direct recipient, alias, or "*").',
62
+ senderGuidance: 'Multi-recipient envelope. Auto-selected when to is "*" or "@session".'
63
+ },
64
+ status: {
65
+ category: "informational",
66
+ expectsReply: false,
67
+ requiresAction: false,
68
+ backgroundEligible: false,
69
+ outOfBand: false,
70
+ renderPriority: 40,
71
+ recipientObligation: "Use to avoid redundant work; never act on as a task or question.",
72
+ senderGuidance: "Agent/system status update. Machine-generated, not for human-originated messages."
73
+ },
74
+ result: {
75
+ category: "informational",
76
+ expectsReply: false,
77
+ requiresAction: false,
78
+ backgroundEligible: true,
79
+ outOfBand: false,
80
+ renderPriority: 10,
81
+ recipientObligation: "Factor into next decision; treat as evidence, not a new task.",
82
+ senderGuidance: "Task completion notice. Share the outcome of finished work."
83
+ },
84
+ review: {
85
+ category: "actionable",
86
+ expectsReply: false,
87
+ requiresAction: true,
88
+ backgroundEligible: true,
89
+ outOfBand: false,
90
+ renderPriority: 10,
91
+ recipientObligation: "Inspect when convenient; no immediate reply required.",
92
+ senderGuidance: "Passive review request (code/doc/PR). No reply required."
93
+ },
94
+ control: {
95
+ category: "control_signal",
96
+ expectsReply: false,
97
+ requiresAction: false,
98
+ backgroundEligible: false,
99
+ outOfBand: true,
100
+ renderPriority: 999,
101
+ // Never rendered
102
+ recipientObligation: 'Handled by the agent loop, NOT folded into conversation. "interrupt" causes cooperative halt.',
103
+ senderGuidance: "RESERVED for runtime use. Agents must NOT send control messages."
104
+ }
105
+ };
106
+
107
+ // src/coordination/mailbox-predicates.ts
108
+ function mailboxIdentityBase(agentId) {
109
+ if (typeof agentId !== "string") return "";
110
+ return agentId.split(/[@#]/, 1)[0].trim().toLowerCase();
111
+ }
112
+ function isMailboxLeader(agentId, role) {
113
+ return mailboxIdentityBase(agentId) === "leader" || role?.trim().toLowerCase() === "leader";
114
+ }
115
+ function isMailboxSenderInFamily(senderId, family) {
116
+ const base = mailboxIdentityBase(senderId);
117
+ const normalizedFamily = family.trim().toLowerCase();
118
+ if (normalizedFamily.length === 0) return false;
119
+ return base === normalizedFamily || base.startsWith(`${normalizedFamily}-`);
120
+ }
121
+ function isMailboxMessageVisibleTo(message, agentId, role) {
122
+ return message.audience !== "leaders" || isMailboxLeader(agentId, role);
123
+ }
124
+ function validateSendType(type, to) {
125
+ if (type === "control") {
126
+ throw new TypeError('Type "control" is reserved for runtime use and cannot be set by agents');
127
+ }
128
+ const isMultiRecipient = to === "*" || to.startsWith("@session:");
129
+ if (type === "assign" && isMultiRecipient) {
130
+ throw new TypeError(
131
+ `Type "assign" requires a specific recipient \u2014 multi-recipient target "${to}" is ambiguous`
132
+ );
133
+ }
134
+ if (type === "steer" && isMultiRecipient) {
135
+ throw new TypeError(
136
+ `Type "steer" requires a specific recipient \u2014 multi-recipient target "${to}" is ambiguous`
137
+ );
138
+ }
139
+ }
140
+ var SESSION_RECIPIENT_PREFIX = "@session:";
141
+ function sessionRecipient(sessionId) {
142
+ const normalizedSessionId = sessionId.trim().replace(/\\/g, "/");
143
+ if (!normalizedSessionId) {
144
+ throw new TypeError('sessionId is required for the "@session" recipient');
145
+ }
146
+ return `${SESSION_RECIPIENT_PREFIX}${normalizedSessionId}`;
147
+ }
148
+ function normalizeRecipient(to, sessionId) {
149
+ const trimmed = to.trim();
150
+ const normalized = trimmed.toLowerCase();
151
+ if (normalized === "all") return "*";
152
+ if (normalized === "@session") return sessionRecipient(sessionId ?? "");
153
+ return trimmed;
154
+ }
155
+ function isMailboxReceiptRecordV2(value) {
156
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
157
+ const v = value;
158
+ if (v["__mailboxReceipt"] !== 2) return false;
159
+ if (typeof v["messageId"] !== "string" || v["messageId"].length === 0) return false;
160
+ if (typeof v["actorId"] !== "string" || v["actorId"].length === 0) return false;
161
+ if (typeof v["timestamp"] !== "string" || v["timestamp"].length === 0) return false;
162
+ if ("read" in v && typeof v["read"] !== "boolean") return false;
163
+ if ("completed" in v && typeof v["completed"] !== "boolean") return false;
164
+ if ("outcome" in v && v["outcome"] !== void 0 && typeof v["outcome"] !== "string")
165
+ return false;
166
+ return true;
167
+ }
168
+ function isActionRequiredForActor(message, projection) {
169
+ if (projection.legacyGlobalCompletion) return false;
170
+ if (message.deletedAt !== void 0) return false;
171
+ if (projection.completedByMe) return false;
172
+ return MAILBOX_TYPE_PROPERTIES[message.type]?.requiresAction === true;
173
+ }
174
+
175
+ // src/coordination/mailbox-auth-types.ts
176
+ var MAILBOX_CAPABILITY_IMPLICATIONS = {
177
+ "mail.read.all": ["mail.read.self"],
178
+ "mail.events.all": ["mail.events.self"],
179
+ "mail.send.directive": ["mail.send.actionable", "mail.send.informational"],
180
+ "mail.send.actionable": ["mail.send.informational"],
181
+ // Leaf capabilities imply nothing further.
182
+ "mail.send.informational": [],
183
+ "mail.read.self": [],
184
+ "mail.ack.self": [],
185
+ "mail.events.self": [],
186
+ "mail.presence.register.self": [],
187
+ "mail.presence.heartbeat.self": [],
188
+ "mail.presence.deregister.self": [],
189
+ "mail.presence.read": [],
190
+ "mail.retention.purge": [],
191
+ "mail.retention.clear": [],
192
+ "mail.admin.receipts": []
193
+ };
194
+ function expandMailboxCapabilities(caps) {
195
+ const result = /* @__PURE__ */ new Set();
196
+ const queue = [...caps];
197
+ while (queue.length > 0) {
198
+ const cap = queue.pop();
199
+ if (result.has(cap)) continue;
200
+ result.add(cap);
201
+ const implied = MAILBOX_CAPABILITY_IMPLICATIONS[cap];
202
+ if (implied) queue.push(...implied);
203
+ }
204
+ return result;
205
+ }
206
+ function hasMailboxCapability(actor, cap) {
207
+ if (actor.capabilities.has(cap)) return true;
208
+ const expanded = expandMailboxCapabilities(actor.capabilities);
209
+ return expanded.has(cap);
210
+ }
211
+
212
+ // src/coordination/mailbox-session-sync.ts
213
+ function isAffectedBySessionAffinity(message) {
214
+ return message.sessionAffinity !== void 0;
215
+ }
216
+ async function acceptMailboxMessageForSession(message, currentSessionId, ctx) {
217
+ if (!isAffectedBySessionAffinity(message)) return true;
218
+ const affinity = message.sessionAffinity;
219
+ if (affinity === null || typeof affinity !== "object" || Array.isArray(affinity)) {
220
+ return false;
221
+ }
222
+ if (affinity.sessionId !== void 0 && typeof affinity.sessionId !== "string" || affinity.reportId !== void 0 && typeof affinity.reportId !== "string") {
223
+ return false;
224
+ }
225
+ if (!currentSessionId) {
226
+ return ctx?.allowUnscoped === true;
227
+ }
228
+ if (typeof affinity.sessionId === "string" && affinity.sessionId.length > 0) {
229
+ if (affinity.sessionId !== currentSessionId) return false;
230
+ return true;
231
+ }
232
+ if (affinity.reportId && ctx?.resolveChimeraReportSessionId) {
233
+ try {
234
+ const resolved = await ctx.resolveChimeraReportSessionId(affinity.reportId);
235
+ if (resolved === currentSessionId) return true;
236
+ if (resolved !== void 0) return false;
237
+ } catch {
238
+ }
239
+ }
240
+ if (ctx?.allowUnscoped === true) return true;
241
+ return false;
242
+ }
243
+
244
+ export {
245
+ hasMailboxCapability,
246
+ MAILBOX_TYPE_PROPERTIES,
247
+ mailboxIdentityBase,
248
+ isMailboxLeader,
249
+ isMailboxSenderInFamily,
250
+ isMailboxMessageVisibleTo,
251
+ validateSendType,
252
+ SESSION_RECIPIENT_PREFIX,
253
+ sessionRecipient,
254
+ normalizeRecipient,
255
+ isMailboxReceiptRecordV2,
256
+ isActionRequiredForActor,
257
+ acceptMailboxMessageForSession
258
+ };
259
+ //# sourceMappingURL=chunk-FWNLEZYG.js.map