@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,363 @@
1
+ import {
2
+ SessionCatalogProjectClient
3
+ } from "./chunk-F3JWNST7.js";
4
+ import {
5
+ sessionCatalogProjectServerMetadataPath
6
+ } from "./chunk-AYW5YINX.js";
7
+
8
+ // src/session-catalog/registry.ts
9
+ import { randomUUID } from "node:crypto";
10
+ import * as fs from "node:fs/promises";
11
+ import * as path from "node:path";
12
+ var HEARTBEAT_INTERVAL_MS = 5e3;
13
+ var AGENT_WRITE_THROTTLE_MS = 300;
14
+ var MAX_PROJECT_CLIENTS = 128;
15
+ var MAX_GLOBAL_ROOTS = 16;
16
+ var ProjectSessionRegistry = class {
17
+ constructor(globalRoot) {
18
+ this.globalRoot = globalRoot;
19
+ }
20
+ globalRoot;
21
+ instanceId = randomUUID();
22
+ clients = /* @__PURE__ */ new Map();
23
+ current;
24
+ heartbeatTimer;
25
+ agentRevision = 0;
26
+ pendingAgents;
27
+ agentTimer;
28
+ lastAgentWriteAt = 0;
29
+ bindingKey(projectDir) {
30
+ const resolved = path.resolve(projectDir);
31
+ return process.platform === "win32" ? resolved.toLowerCase() : resolved;
32
+ }
33
+ async closeBinding(binding) {
34
+ if (this.current?.binding === binding) return;
35
+ const key = this.bindingKey(binding.projectDir);
36
+ if (this.clients.get(key) === binding) this.clients.delete(key);
37
+ await binding.client.close();
38
+ }
39
+ binding(projectSlug, projectRoot) {
40
+ const projectDir = path.join(this.globalRoot, "projects", projectSlug);
41
+ const key = this.bindingKey(projectDir);
42
+ let binding = this.clients.get(key);
43
+ if (!binding) {
44
+ if (this.clients.size >= MAX_PROJECT_CLIENTS) {
45
+ const oldest = [...this.clients.entries()].find(
46
+ ([, candidate]) => candidate !== this.current?.binding
47
+ );
48
+ if (oldest) {
49
+ this.clients.delete(oldest[0]);
50
+ void oldest[1].client.close();
51
+ }
52
+ }
53
+ binding = {
54
+ projectDir,
55
+ projectRoot: path.resolve(projectRoot),
56
+ client: new SessionCatalogProjectClient({ projectDir, projectRoot })
57
+ };
58
+ this.clients.set(key, binding);
59
+ } else {
60
+ this.clients.delete(key);
61
+ this.clients.set(key, binding);
62
+ }
63
+ return binding;
64
+ }
65
+ fullEntry(entry) {
66
+ const agents = entry.agents ?? [];
67
+ return {
68
+ ...entry,
69
+ status: agents.some((agent) => agent.status !== "idle") ? "active" : "idle",
70
+ lastHeartbeatAt: (/* @__PURE__ */ new Date()).toISOString(),
71
+ agentCount: agents.length,
72
+ agents
73
+ };
74
+ }
75
+ async register(entry) {
76
+ const full = this.fullEntry(entry);
77
+ if (this.current?.entry.sessionId === full.sessionId && this.current.entry.pid === full.pid) {
78
+ this.current.entry = full;
79
+ this.current.credential = await this.current.binding.client.call("heartbeat", {
80
+ credential: this.current.credential,
81
+ status: full.status
82
+ });
83
+ return;
84
+ }
85
+ const nextBinding = this.binding(full.projectSlug, full.projectRoot);
86
+ let nextCredential;
87
+ try {
88
+ nextCredential = await nextBinding.client.call("claim_new", {
89
+ entry: full,
90
+ ownerInstanceId: this.instanceId
91
+ });
92
+ } catch (error) {
93
+ await this.closeBinding(nextBinding).catch(() => void 0);
94
+ throw error;
95
+ }
96
+ const previous = this.current;
97
+ this.current = { binding: nextBinding, credential: nextCredential, entry: full };
98
+ this.agentRevision = 0;
99
+ this.cancelAgentTimer();
100
+ this.startHeartbeat();
101
+ if (previous) {
102
+ await previous.binding.client.call("release", { credential: previous.credential }).catch(() => void 0);
103
+ if (previous.binding !== nextBinding) await this.closeBinding(previous.binding);
104
+ }
105
+ }
106
+ /** Reserve before transcript hydration; activation swaps ownership only after the writer opened. */
107
+ async reserveResume(target) {
108
+ const binding = this.binding(target.projectSlug, target.projectRoot);
109
+ let reservation;
110
+ try {
111
+ reservation = await binding.client.call("reserve_resume", {
112
+ targetSessionId: target.sessionId,
113
+ requesterInstanceId: this.instanceId,
114
+ ...this.current ? { currentSessionId: this.current.entry.sessionId } : {},
115
+ ...target.reservationMs !== void 0 ? { reservationMs: target.reservationMs } : {}
116
+ });
117
+ } catch (error) {
118
+ await this.closeBinding(binding).catch(() => void 0);
119
+ throw error;
120
+ }
121
+ let settled = false;
122
+ return {
123
+ get reservation() {
124
+ return reservation;
125
+ },
126
+ renew: async (reservationMs) => {
127
+ if (settled) return false;
128
+ reservation = await binding.client.call("renew_reservation", {
129
+ reservationId: reservation.reservationId,
130
+ requesterInstanceId: this.instanceId,
131
+ ...reservationMs !== void 0 ? { reservationMs } : {}
132
+ });
133
+ return true;
134
+ },
135
+ activate: async (registration) => {
136
+ if (settled) throw new Error("Resume reservation is already settled");
137
+ const entry = this.fullEntry(registration);
138
+ const credential = await binding.client.call("activate_reservation", {
139
+ reservation,
140
+ entry
141
+ });
142
+ const previous = this.current;
143
+ this.current = { binding, credential, entry };
144
+ settled = true;
145
+ this.agentRevision = 0;
146
+ this.cancelAgentTimer();
147
+ this.startHeartbeat();
148
+ if (previous) {
149
+ await previous.binding.client.call("release", { credential: previous.credential }).catch(() => void 0);
150
+ if (previous.binding !== binding) await this.closeBinding(previous.binding);
151
+ }
152
+ },
153
+ cancel: async () => {
154
+ if (settled) return;
155
+ settled = true;
156
+ try {
157
+ await binding.client.call("cancel_reservation", {
158
+ reservationId: reservation.reservationId,
159
+ requesterInstanceId: this.instanceId
160
+ }).catch(() => void 0);
161
+ } finally {
162
+ await this.closeBinding(binding).catch(() => void 0);
163
+ }
164
+ }
165
+ };
166
+ }
167
+ async updateAgents(agents) {
168
+ if (!this.current) return;
169
+ this.pendingAgents = agents;
170
+ this.current.entry = {
171
+ ...this.current.entry,
172
+ agents,
173
+ agentCount: agents.length,
174
+ status: agents.some((agent) => agent.status !== "idle") ? "active" : "idle",
175
+ lastHeartbeatAt: (/* @__PURE__ */ new Date()).toISOString()
176
+ };
177
+ const elapsed = Date.now() - this.lastAgentWriteAt;
178
+ if (!this.agentTimer && elapsed >= AGENT_WRITE_THROTTLE_MS) {
179
+ await this.flushAgents();
180
+ return;
181
+ }
182
+ if (!this.agentTimer) {
183
+ this.agentTimer = setTimeout(
184
+ () => {
185
+ this.agentTimer = void 0;
186
+ void this.flushAgents();
187
+ },
188
+ Math.max(0, AGENT_WRITE_THROTTLE_MS - elapsed)
189
+ );
190
+ this.agentTimer.unref?.();
191
+ }
192
+ }
193
+ async flushAgents() {
194
+ const agents = this.pendingAgents;
195
+ const current = this.current;
196
+ if (!agents || !current) return;
197
+ this.pendingAgents = void 0;
198
+ this.lastAgentWriteAt = Date.now();
199
+ const revision = ++this.agentRevision;
200
+ await current.binding.client.call("publish_agents", {
201
+ credential: current.credential,
202
+ revision,
203
+ agents
204
+ });
205
+ }
206
+ async markClosing() {
207
+ this.stopHeartbeat();
208
+ this.cancelAgentTimer();
209
+ if (this.current)
210
+ await this.current.binding.client.call("mark_closing", {
211
+ credential: this.current.credential
212
+ });
213
+ }
214
+ async unregister() {
215
+ this.stopHeartbeat();
216
+ this.cancelAgentTimer();
217
+ const current = this.current;
218
+ this.current = void 0;
219
+ if (current) {
220
+ try {
221
+ await current.binding.client.call("release", { credential: current.credential });
222
+ } finally {
223
+ await this.closeBinding(current.binding);
224
+ }
225
+ }
226
+ }
227
+ async list() {
228
+ const projectsDir = path.join(this.globalRoot, "projects");
229
+ let directories = [];
230
+ try {
231
+ directories = (await fs.readdir(projectsDir, { withFileTypes: true })).filter((entry) => entry.isDirectory()).slice(0, 1e3).map((entry) => entry.name);
232
+ } catch {
233
+ return [];
234
+ }
235
+ const snapshots = await Promise.all(
236
+ directories.map(async (slug) => {
237
+ const projectDir = path.join(projectsDir, slug);
238
+ let client;
239
+ try {
240
+ const metadata = JSON.parse(
241
+ await fs.readFile(sessionCatalogProjectServerMetadataPath(projectDir), "utf8")
242
+ );
243
+ if (typeof metadata.projectRoot !== "string" || !metadata.projectRoot) return [];
244
+ client = new SessionCatalogProjectClient({
245
+ projectDir,
246
+ projectRoot: metadata.projectRoot
247
+ });
248
+ return await client.callExisting("list_live", {});
249
+ } catch {
250
+ return [];
251
+ } finally {
252
+ await client?.close().catch(() => void 0);
253
+ }
254
+ })
255
+ );
256
+ return snapshots.flat();
257
+ }
258
+ async listByProject(projectSlug) {
259
+ const current = this.current;
260
+ if (current && path.basename(current.binding.projectDir) === projectSlug) {
261
+ return current.binding.client.call("list_live", {}).catch(() => []);
262
+ }
263
+ const projectDir = path.join(this.globalRoot, "projects", projectSlug);
264
+ let client;
265
+ try {
266
+ const metadata = JSON.parse(
267
+ await fs.readFile(sessionCatalogProjectServerMetadataPath(projectDir), "utf8")
268
+ );
269
+ if (typeof metadata.projectRoot !== "string") return [];
270
+ client = new SessionCatalogProjectClient({ projectDir, projectRoot: metadata.projectRoot });
271
+ return await client.callExisting("list_live", {}).catch(() => []);
272
+ } catch {
273
+ return [];
274
+ } finally {
275
+ await client?.close().catch(() => void 0);
276
+ }
277
+ }
278
+ async get(sessionId) {
279
+ return (await this.list()).find((entry) => entry.sessionId === sessionId);
280
+ }
281
+ subscribeProject(projectSlug, projectRoot, listener) {
282
+ const binding = this.binding(projectSlug, projectRoot);
283
+ return binding.client.subscribe(listener).then((unsubscribe) => async () => {
284
+ await unsubscribe();
285
+ await this.closeBinding(binding);
286
+ });
287
+ }
288
+ get registryPath() {
289
+ return path.join(this.globalRoot, "projects");
290
+ }
291
+ async dispose() {
292
+ await this.unregister().catch(() => void 0);
293
+ await Promise.all([...this.clients.values()].map((binding) => binding.client.close()));
294
+ this.clients.clear();
295
+ }
296
+ /** Whether this facade currently owns a live session lease. */
297
+ ownsSession() {
298
+ return this.current !== void 0;
299
+ }
300
+ startHeartbeat() {
301
+ this.stopHeartbeat();
302
+ this.heartbeatTimer = setInterval(() => {
303
+ void this.heartbeat();
304
+ }, HEARTBEAT_INTERVAL_MS);
305
+ this.heartbeatTimer.unref?.();
306
+ }
307
+ stopHeartbeat() {
308
+ if (this.heartbeatTimer) clearInterval(this.heartbeatTimer);
309
+ this.heartbeatTimer = void 0;
310
+ }
311
+ cancelAgentTimer() {
312
+ if (this.agentTimer) clearTimeout(this.agentTimer);
313
+ this.agentTimer = void 0;
314
+ this.pendingAgents = void 0;
315
+ }
316
+ async heartbeat() {
317
+ const current = this.current;
318
+ if (!current) return;
319
+ try {
320
+ const credential = await current.binding.client.call("heartbeat", {
321
+ credential: current.credential,
322
+ status: current.entry.status
323
+ });
324
+ if (this.current === current) current.credential = credential;
325
+ } catch {
326
+ }
327
+ }
328
+ };
329
+ var registries = /* @__PURE__ */ new Map();
330
+ var lastRegistryKey;
331
+ function getProjectSessionRegistry(globalRoot) {
332
+ const key = globalRoot !== void 0 ? path.resolve(globalRoot) : lastRegistryKey;
333
+ if (!key)
334
+ throw new Error("SessionRegistry not initialized. Call getSessionRegistry(globalRoot) first.");
335
+ let registry = registries.get(key);
336
+ if (!registry) {
337
+ if (registries.size >= MAX_GLOBAL_ROOTS) {
338
+ const idle = [...registries.entries()].find(([, candidate]) => !candidate.ownsSession());
339
+ if (!idle)
340
+ throw new Error(`Session Registry global-root limit reached (${MAX_GLOBAL_ROOTS})`);
341
+ registries.delete(idle[0]);
342
+ void idle[1].dispose();
343
+ }
344
+ registry = new ProjectSessionRegistry(key);
345
+ registries.set(key, registry);
346
+ } else {
347
+ registries.delete(key);
348
+ registries.set(key, registry);
349
+ }
350
+ lastRegistryKey = key;
351
+ return registry;
352
+ }
353
+ function hasProjectSessionRegistry(globalRoot) {
354
+ if (globalRoot === void 0) return registries.size > 0;
355
+ return registries.has(path.resolve(globalRoot));
356
+ }
357
+
358
+ export {
359
+ ProjectSessionRegistry,
360
+ getProjectSessionRegistry,
361
+ hasProjectSessionRegistry
362
+ };
363
+ //# sourceMappingURL=chunk-4I7HGVVA.js.map
@@ -0,0 +1,317 @@
1
+ import {
2
+ validateResolution,
3
+ validateTransition
4
+ } from "./chunk-UJILKYES.js";
5
+ import {
6
+ SECRET_FILE_MODE
7
+ } from "./chunk-6FHWXLPT.js";
8
+ import {
9
+ atomicWrite,
10
+ withFileLock
11
+ } from "./chunk-OSGLYW5J.js";
12
+
13
+ // src/plugins/review-finding-store.ts
14
+ import { randomUUID } from "node:crypto";
15
+ import * as fsp from "node:fs/promises";
16
+ import * as path from "node:path";
17
+ var FINDING_RESOLVED_RETENTION_MS = 30 * 24 * 60 * 60 * 1e3;
18
+ var FINDING_IGNORED_RETENTION_MS = 14 * 24 * 60 * 60 * 1e3;
19
+ var FINDING_DEFAULT_PAGE_SIZE = 50;
20
+ var NL = "\n";
21
+ var LINE_SEPARATOR = NL;
22
+ var FINDING_STORE_FILE = "review-findings.jsonl";
23
+ function resolveFindingStorePath(projectDir) {
24
+ return path.join(projectDir, FINDING_STORE_FILE);
25
+ }
26
+ var JsonlFindingStore = class {
27
+ filePath;
28
+ constructor(projectDir) {
29
+ this.filePath = resolveFindingStorePath(projectDir);
30
+ }
31
+ get storePath() {
32
+ return this.filePath;
33
+ }
34
+ // ── Path helpers ─────────────────────────────────────────────────
35
+ async upsert(newFindings, context) {
36
+ if (newFindings.length === 0) return { created: 0, relinked: 0, reopened: 0 };
37
+ const result = { created: 0, relinked: 0, reopened: 0 };
38
+ return withFileLock(this.filePath, async () => {
39
+ const existing = await this._readAll();
40
+ for (const finding of newFindings) {
41
+ const match = existing.find((e) => e.finding.fingerprint === finding.fingerprint);
42
+ if (match) {
43
+ const materialized = this._materialize(match);
44
+ if (materialized.status === "resolved" || materialized.status === "ignored") {
45
+ const reopenEvent = this._makeEvent(
46
+ match.finding.id,
47
+ "reopened",
48
+ materialized.status,
49
+ "active",
50
+ context
51
+ );
52
+ match.finding.status = "active";
53
+ match.finding.resolution = void 0;
54
+ const updatedRecord = { __finding: 1, data: match.finding };
55
+ await fsp.appendFile(
56
+ this.filePath,
57
+ JSON.stringify(updatedRecord) + LINE_SEPARATOR + JSON.stringify({ __findingEvent: 1, data: reopenEvent }) + LINE_SEPARATOR,
58
+ { encoding: "utf8", mode: SECRET_FILE_MODE }
59
+ );
60
+ result.reopened++;
61
+ } else {
62
+ const relinkEvent = this._makeEvent(
63
+ match.finding.id,
64
+ "relinked",
65
+ match.finding.status,
66
+ match.finding.status,
67
+ context
68
+ );
69
+ await fsp.appendFile(
70
+ this.filePath,
71
+ JSON.stringify({ __findingEvent: 1, data: relinkEvent }) + LINE_SEPARATOR,
72
+ { encoding: "utf8", mode: SECRET_FILE_MODE }
73
+ );
74
+ result.relinked++;
75
+ }
76
+ } else {
77
+ const record = { __finding: 1, data: finding };
78
+ const createdEvent = this._makeEvent(finding.id, "created", null, "active", context);
79
+ const lines = JSON.stringify(record) + LINE_SEPARATOR + JSON.stringify({ __findingEvent: 1, data: createdEvent }) + LINE_SEPARATOR;
80
+ await fsp.appendFile(this.filePath, lines, { encoding: "utf8", mode: SECRET_FILE_MODE });
81
+ result.created++;
82
+ }
83
+ }
84
+ return result;
85
+ });
86
+ }
87
+ async transition(findingId, to, actor, opts) {
88
+ return withFileLock(this.filePath, async () => {
89
+ const all = await this._readAll();
90
+ const entry = all.find((e) => e.finding.id === findingId);
91
+ if (!entry) throw new Error(`Finding not found: ${findingId}`);
92
+ const from = this._materialize(entry).status;
93
+ validateTransition(from, to);
94
+ validateResolution(to, opts?.outcome);
95
+ const event = {
96
+ id: randomUUID(),
97
+ findingId,
98
+ eventType: to === "resolved" ? "resolved" : to === "ignored" ? "ignored" : this._eventTypeFor(to),
99
+ fromStatus: from,
100
+ toStatus: to,
101
+ actorId: actor.id,
102
+ actorKind: actor.kind,
103
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
104
+ reason: opts?.reason
105
+ };
106
+ entry.finding.status = to;
107
+ if (to === "resolved" && opts?.outcome) {
108
+ entry.finding.resolution = {
109
+ outcome: opts.outcome,
110
+ resolvedAt: event.timestamp,
111
+ resolvedBy: actor.id,
112
+ notes: opts.reason
113
+ };
114
+ }
115
+ const updatedRecord = { __finding: 1, data: entry.finding };
116
+ await fsp.appendFile(
117
+ this.filePath,
118
+ JSON.stringify(updatedRecord) + LINE_SEPARATOR + JSON.stringify({ __findingEvent: 1, data: event }) + LINE_SEPARATOR,
119
+ { encoding: "utf8", mode: SECRET_FILE_MODE }
120
+ );
121
+ return { ...entry.finding };
122
+ });
123
+ }
124
+ async list(opts) {
125
+ const all = await this._readAll();
126
+ let findings = all.map((e) => this._materialize(e));
127
+ if (opts?.severities && opts.severities.length > 0) {
128
+ const sevs = new Set(opts.severities);
129
+ findings = findings.filter((f) => sevs.has(f.severity));
130
+ }
131
+ if (opts?.statuses && opts.statuses.length > 0) {
132
+ const sts = new Set(opts.statuses);
133
+ findings = findings.filter((f) => sts.has(f.status));
134
+ }
135
+ if (opts?.file) {
136
+ const pattern = opts.file.toLowerCase();
137
+ findings = findings.filter((f) => f.location?.file.toLowerCase().includes(pattern));
138
+ }
139
+ if (opts?.reportId) {
140
+ findings = findings.filter((f) => f.originReport.reportId === opts.reportId);
141
+ }
142
+ const severityRank = {
143
+ critical: 0,
144
+ high: 1,
145
+ medium: 2,
146
+ low: 3
147
+ };
148
+ findings.sort((a, b) => {
149
+ const sa = severityRank[a.severity] - severityRank[b.severity];
150
+ if (sa !== 0) return sa;
151
+ return a.createdAt.localeCompare(b.createdAt);
152
+ });
153
+ const limit = opts?.limit ?? FINDING_DEFAULT_PAGE_SIZE;
154
+ return findings.slice(0, limit);
155
+ }
156
+ async get(idOrFingerprint) {
157
+ const all = await this._readAll();
158
+ const entry = all.find(
159
+ (e) => e.finding.id === idOrFingerprint || e.finding.fingerprint === idOrFingerprint
160
+ );
161
+ return entry ? this._materialize(entry) : null;
162
+ }
163
+ async getEvents(findingId) {
164
+ const all = await this._readAllLines();
165
+ const events = [];
166
+ for (const line of all) {
167
+ try {
168
+ const parsed = JSON.parse(line);
169
+ if (this._isLifecycleEvent(parsed) && parsed.data.findingId === findingId) {
170
+ events.push(parsed.data);
171
+ }
172
+ } catch {
173
+ }
174
+ }
175
+ return events.sort((a, b) => a.timestamp.localeCompare(b.timestamp));
176
+ }
177
+ async compact(opts) {
178
+ return withFileLock(this.filePath, async () => {
179
+ const resolvedMaxAge = opts?.resolvedMaxAgeMs ?? FINDING_RESOLVED_RETENTION_MS;
180
+ const ignoredMaxAge = opts?.ignoredMaxAgeMs ?? FINDING_IGNORED_RETENTION_MS;
181
+ const now = Date.now();
182
+ const all = await this._readAll();
183
+ const kept = [];
184
+ let removed = 0;
185
+ let eventsFolded = 0;
186
+ for (const entry of all) {
187
+ const age = now - new Date(entry.finding.createdAt).getTime();
188
+ const isResolved = entry.finding.status === "resolved";
189
+ const isIgnored = entry.finding.status === "ignored";
190
+ const maxAge = isResolved ? resolvedMaxAge : isIgnored ? ignoredMaxAge : Infinity;
191
+ if (age > maxAge && (isResolved || isIgnored)) {
192
+ removed++;
193
+ eventsFolded += entry.events.length;
194
+ continue;
195
+ }
196
+ const oldEvents = entry.events.filter(
197
+ (ev) => now - new Date(ev.timestamp).getTime() > maxAge
198
+ );
199
+ if (oldEvents.length > 1) {
200
+ eventsFolded += oldEvents.length - 1;
201
+ const newestOld = oldEvents.sort((a, b) => b.timestamp.localeCompare(a.timestamp))[0];
202
+ entry.events = [
203
+ newestOld,
204
+ ...entry.events.filter((ev) => now - new Date(ev.timestamp).getTime() <= maxAge)
205
+ ];
206
+ }
207
+ kept.push({ record: { __finding: 1, data: entry.finding }, events: entry.events });
208
+ }
209
+ const lines = [];
210
+ for (const { record, events } of kept) {
211
+ if (record) lines.push(JSON.stringify(record));
212
+ for (const ev of events) {
213
+ lines.push(JSON.stringify({ __findingEvent: 1, data: ev }));
214
+ }
215
+ }
216
+ lines.push(
217
+ JSON.stringify({
218
+ __findingCompact: 1,
219
+ compactedAt: (/* @__PURE__ */ new Date()).toISOString(),
220
+ removedFindings: removed,
221
+ foldedEvents: eventsFolded
222
+ })
223
+ );
224
+ await atomicWrite(this.filePath, lines.join(LINE_SEPARATOR) + LINE_SEPARATOR, {
225
+ mode: 384
226
+ });
227
+ return { removed, eventsFolded };
228
+ });
229
+ }
230
+ // ── Private helpers ──────────────────────────────────────────────
231
+ async _readAllLines() {
232
+ try {
233
+ const raw = await fsp.readFile(this.filePath, "utf8");
234
+ return raw.split(LINE_SEPARATOR).filter((l) => l.trim().length > 0);
235
+ } catch (err) {
236
+ if (err.code === "ENOENT") return [];
237
+ throw err;
238
+ }
239
+ }
240
+ _isFindingRecord(v) {
241
+ return typeof v === "object" && v !== null && v["__finding"] === 1;
242
+ }
243
+ _isLifecycleEvent(v) {
244
+ return typeof v === "object" && v !== null && v["__findingEvent"] === 1;
245
+ }
246
+ async _readAll() {
247
+ const lines = await this._readAllLines();
248
+ const findings = /* @__PURE__ */ new Map();
249
+ const eventsMap = /* @__PURE__ */ new Map();
250
+ for (const line of lines) {
251
+ try {
252
+ const parsed = JSON.parse(line);
253
+ if (this._isFindingRecord(parsed)) {
254
+ findings.set(parsed.data.id, parsed.data);
255
+ if (!eventsMap.has(parsed.data.id)) eventsMap.set(parsed.data.id, []);
256
+ } else if (this._isLifecycleEvent(parsed)) {
257
+ const list = eventsMap.get(parsed.data.findingId);
258
+ if (list) list.push(parsed.data);
259
+ }
260
+ } catch {
261
+ }
262
+ }
263
+ return Array.from(findings.entries()).map(([id, finding]) => ({
264
+ finding,
265
+ events: eventsMap.get(id) ?? []
266
+ }));
267
+ }
268
+ /** Materialize a finding's current status from its events. */
269
+ _materialize(entry) {
270
+ if (entry.events.length === 0) return { ...entry.finding };
271
+ const sorted = [...entry.events].sort((a, b) => a.timestamp.localeCompare(b.timestamp));
272
+ const latest = sorted[sorted.length - 1];
273
+ return {
274
+ ...entry.finding,
275
+ status: latest.toStatus
276
+ };
277
+ }
278
+ _makeEvent(findingId, eventType, fromStatus, toStatus, context) {
279
+ return {
280
+ id: randomUUID(),
281
+ findingId,
282
+ eventType,
283
+ fromStatus,
284
+ toStatus,
285
+ actorId: context.agentId,
286
+ actorKind: "agent",
287
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
288
+ reason: `session:${context.sessionId} report:${context.reportId}`
289
+ };
290
+ }
291
+ _eventTypeFor(to) {
292
+ switch (to) {
293
+ case "triaged":
294
+ return "triaged";
295
+ case "in_progress":
296
+ return "started";
297
+ case "resolved":
298
+ return "resolved";
299
+ case "ignored":
300
+ return "ignored";
301
+ case "active":
302
+ return "reopened";
303
+ default:
304
+ return "created";
305
+ }
306
+ }
307
+ };
308
+
309
+ export {
310
+ FINDING_RESOLVED_RETENTION_MS,
311
+ FINDING_IGNORED_RETENTION_MS,
312
+ FINDING_DEFAULT_PAGE_SIZE,
313
+ FINDING_STORE_FILE,
314
+ resolveFindingStorePath,
315
+ JsonlFindingStore
316
+ };
317
+ //# sourceMappingURL=chunk-4LCZVJVF.js.map