@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,425 @@
1
+ import {
2
+ JsonlFindingStore
3
+ } from "./chunk-4LCZVJVF.js";
4
+ import {
5
+ computeFindingFingerprint
6
+ } from "./chunk-UJILKYES.js";
7
+ import {
8
+ JsonlReportStore
9
+ } from "./chunk-HXKZ7OBQ.js";
10
+
11
+ // src/plugins/review-finding-parser.ts
12
+ import { randomUUID } from "node:crypto";
13
+ var SEVERITIES = /* @__PURE__ */ new Set(["critical", "high", "medium", "low"]);
14
+ var CATEGORIES = /* @__PURE__ */ new Set([
15
+ "bug",
16
+ "security",
17
+ "performance",
18
+ "type",
19
+ "contract",
20
+ "test",
21
+ "other"
22
+ ]);
23
+ var CONFIDENCES = /* @__PURE__ */ new Set(["high", "medium", "low"]);
24
+ var FENCED_BLOCK = /```json[ \t]*\r?\n([\s\S]*?)\r?\n```/gi;
25
+ function extractStructuredFindingsBlock(reportText) {
26
+ if (!reportText) return null;
27
+ let best = null;
28
+ for (const match of reportText.matchAll(FENCED_BLOCK)) {
29
+ const body = match[1];
30
+ if (!body?.trim()) continue;
31
+ let parsed;
32
+ try {
33
+ parsed = JSON.parse(body);
34
+ } catch {
35
+ continue;
36
+ }
37
+ if (typeof parsed !== "object" || parsed === null) continue;
38
+ const findings = parsed.findings;
39
+ if (!Array.isArray(findings)) continue;
40
+ const items = [];
41
+ for (const raw of findings) {
42
+ const item = normalizeStructuredItem(raw);
43
+ if (item) items.push(item);
44
+ }
45
+ if (findings.length > 0 && items.length === 0) continue;
46
+ const durationRaw = parsed.durationSeconds;
47
+ const durationSeconds = typeof durationRaw === "number" && Number.isFinite(durationRaw) && durationRaw > 0 ? Math.floor(durationRaw) : void 0;
48
+ best = { findings: items, ...durationSeconds !== void 0 ? { durationSeconds } : {} };
49
+ }
50
+ return best;
51
+ }
52
+ function normalizeStructuredItem(raw) {
53
+ if (typeof raw !== "object" || raw === null) return null;
54
+ const item = raw;
55
+ const severity = typeof item.severity === "string" ? item.severity.toLowerCase() : "";
56
+ if (!SEVERITIES.has(severity)) return null;
57
+ const title = typeof item.title === "string" ? item.title.trim() : "";
58
+ if (title.length === 0) return null;
59
+ const file = typeof item.file === "string" && item.file.trim().length > 0 ? item.file.trim() : void 0;
60
+ const line = typeof item.line === "number" && Number.isInteger(item.line) && item.line >= 1 ? item.line : void 0;
61
+ const categoryRaw = typeof item.category === "string" ? item.category.toLowerCase() : "";
62
+ const category = CATEGORIES.has(categoryRaw) ? categoryRaw : void 0;
63
+ const confidenceRaw = typeof item.confidence === "string" ? item.confidence.toLowerCase() : "";
64
+ const confidence = CONFIDENCES.has(confidenceRaw) ? confidenceRaw : void 0;
65
+ return {
66
+ severity,
67
+ ...file ? { file } : {},
68
+ ...line !== void 0 ? { line } : {},
69
+ ...category ? { category } : {},
70
+ ...confidence ? { confidence } : {},
71
+ title,
72
+ ...typeof item.description === "string" && item.description.trim().length > 0 ? { description: item.description.trim() } : {},
73
+ ...typeof item.suggestedFix === "string" && item.suggestedFix.trim().length > 0 ? { suggestedFix: item.suggestedFix.trim() } : {}
74
+ };
75
+ }
76
+ var SUGGEST_LINE = /^\s*(?:→|->|=>)\s*(.+)$/;
77
+ var DURATION_LINE = /^Duration:\s*(\d+)s\s*$/im;
78
+ function parseChimeraReviewReport(reportText, context = {}) {
79
+ if (!reportText || reportText.trim().length === 0) {
80
+ return { findings: [], unparseableCount: 0 };
81
+ }
82
+ const structured = extractStructuredFindingsBlock(reportText);
83
+ if (structured) {
84
+ const reportId2 = context.reportId ?? randomUUID();
85
+ const findings2 = structured.findings.map(
86
+ (item) => buildFindingFromStructuredItem(item, { ...context, reportId: reportId2 })
87
+ );
88
+ return {
89
+ findings: findings2,
90
+ unparseableCount: 0,
91
+ ...structured.durationSeconds !== void 0 ? { durationSeconds: structured.durationSeconds } : {},
92
+ structured: true
93
+ };
94
+ }
95
+ const findings = [];
96
+ const reportId = context.reportId ?? randomUUID();
97
+ let unparseableCount = 0;
98
+ let durationSeconds;
99
+ let currentSeverity = null;
100
+ let currentLines = [];
101
+ const lines = reportText.split("\n");
102
+ for (let i = 0; i < lines.length; i++) {
103
+ const line = lines[i];
104
+ const headingMatch = line.trim().match(/^###\s+(critical|high|medium|low)\b/i);
105
+ if (headingMatch) {
106
+ flushSection();
107
+ currentSeverity = headingMatch[1].toLowerCase();
108
+ continue;
109
+ }
110
+ const durMatch = line.match(DURATION_LINE);
111
+ if (durMatch) {
112
+ durationSeconds = Number.parseInt(durMatch[1], 10);
113
+ continue;
114
+ }
115
+ if (currentSeverity !== null) {
116
+ currentLines.push(line);
117
+ }
118
+ }
119
+ flushSection();
120
+ return { findings, unparseableCount, durationSeconds };
121
+ function flushSection() {
122
+ if (currentSeverity === null || currentLines.length === 0) {
123
+ currentSeverity = null;
124
+ currentLines = [];
125
+ return;
126
+ }
127
+ const combined = currentLines.join("\n");
128
+ const segments = combined.split(/\n\s*(?=\d+\.\s)/).filter((s) => s.trim().length > 0);
129
+ for (const segment of segments) {
130
+ const finding = parseFindingSegment(segment, currentSeverity, { ...context, reportId });
131
+ if (finding) {
132
+ findings.push(finding);
133
+ } else {
134
+ unparseableCount++;
135
+ }
136
+ }
137
+ currentSeverity = null;
138
+ currentLines = [];
139
+ }
140
+ }
141
+ function parseFindingSegment(segment, severity, context) {
142
+ const lines = segment.split("\n").map((l) => l.trim()).filter((l) => l.length > 0);
143
+ if (lines.length === 0) return null;
144
+ const first = lines[0];
145
+ const match = first.match(/^\d+\.\s+(.*)$/);
146
+ if (!match) return null;
147
+ const content = match[1].trim();
148
+ let remaining = content;
149
+ const tagMatch = content.match(/^\[(\w+)\]\s*/);
150
+ if (tagMatch) {
151
+ remaining = content.slice(tagMatch[0].length).trim();
152
+ }
153
+ const citationMatch = remaining.match(
154
+ /^(`+)([a-zA-Z_./\\:][^`]*[a-zA-Z0-9_./\\:])\1(?=\s*[—–-]|\s*$)/
155
+ );
156
+ if (citationMatch) {
157
+ const inner = citationMatch[2];
158
+ const afterCitation = remaining.slice(citationMatch[0].length);
159
+ remaining = `${inner}${afterCitation}`;
160
+ }
161
+ let file;
162
+ let line;
163
+ let desc = remaining;
164
+ const refMatch = remaining.match(
165
+ /^([a-zA-Z_./\\][a-zA-Z0-9_./\\-]*\.\w+)(?::(\d+))?\s+(?:[—–]|-)\s+(.+)$/
166
+ );
167
+ if (refMatch) {
168
+ file = refMatch[1].trim();
169
+ if (refMatch[2] !== void 0) {
170
+ line = Number.parseInt(refMatch[2], 10);
171
+ }
172
+ desc = refMatch[3].trim();
173
+ }
174
+ if (!file) {
175
+ const pathMatch = remaining.match(/^([a-zA-Z_./\\][a-zA-Z0-9_./\\-]*\.\w+)(?::(\d+))?/);
176
+ if (pathMatch) {
177
+ file = pathMatch[1].trim();
178
+ if (pathMatch[2] !== void 0) {
179
+ line = Number.parseInt(pathMatch[2], 10);
180
+ }
181
+ const afterFile = remaining.slice(pathMatch[0].length).trim();
182
+ desc = afterFile.replace(/^[—–-]\s*/, "").trim() || desc;
183
+ }
184
+ }
185
+ const cleanDesc = desc.replace(/^[—–-]\s*/, "").trim();
186
+ const suggestions = [];
187
+ for (let i = 1; i < lines.length; i++) {
188
+ const suggest = lines[i].match(SUGGEST_LINE);
189
+ if (suggest) {
190
+ suggestions.push(suggest[1].trim());
191
+ }
192
+ }
193
+ const title = cleanDesc.split(/\.\s/)[0].trim() || content;
194
+ const fullDesc = suggestions.length > 0 ? cleanDesc + "\n" + suggestions.map((s) => " \u2192 " + s).join("\n") : cleanDesc;
195
+ const suggestedFix = suggestions.length > 0 ? suggestions.join("\n") : void 0;
196
+ return {
197
+ id: randomUUID(),
198
+ fingerprint: computeFindingFingerprint(file ?? "", line ?? null, title),
199
+ severity,
200
+ source: normalizeFindingSource(context.reviewType),
201
+ ...file ? { location: { file, ...line !== void 0 ? { line } : {} } } : {},
202
+ title,
203
+ description: fullDesc,
204
+ ...suggestedFix ? { suggestedFix } : {},
205
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
206
+ status: "active",
207
+ originReport: {
208
+ reportId: context.reportId ?? randomUUID(),
209
+ sessionId: context.sessionId ?? "",
210
+ agentId: context.agentId ?? "",
211
+ reviewerModel: context.reviewerModel ?? ""
212
+ }
213
+ };
214
+ }
215
+ function normalizeFindingSource(reviewType) {
216
+ switch (reviewType) {
217
+ case "auto":
218
+ case "chimera":
219
+ case "cascade":
220
+ case "security-scanner":
221
+ return reviewType;
222
+ default:
223
+ return "chimera";
224
+ }
225
+ }
226
+ function buildFindingFromStructuredItem(item, context) {
227
+ const file = item.file;
228
+ const line = item.line;
229
+ const title = item.title;
230
+ const description = item.description ?? title;
231
+ return {
232
+ id: randomUUID(),
233
+ fingerprint: computeFindingFingerprint(file ?? "", line ?? null, title),
234
+ severity: item.severity,
235
+ source: normalizeFindingSource(context.reviewType),
236
+ ...file ? { location: { file, ...line !== void 0 ? { line } : {} } } : {},
237
+ ...item.category ? { category: item.category } : {},
238
+ ...item.confidence ? { confidence: item.confidence } : {},
239
+ title,
240
+ description,
241
+ ...item.suggestedFix ? { suggestedFix: item.suggestedFix } : {},
242
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
243
+ status: "active",
244
+ originReport: {
245
+ reportId: context.reportId ?? randomUUID(),
246
+ sessionId: context.sessionId ?? "",
247
+ agentId: context.agentId ?? "",
248
+ reviewerModel: context.reviewerModel ?? ""
249
+ }
250
+ };
251
+ }
252
+
253
+ // src/plugins/review-finding-integration.ts
254
+ function classifyChimeraReviewSource(bundle) {
255
+ const cascadeDepth = bundle.cascadeDepth ?? 0;
256
+ if (cascadeDepth > 0) return "cascade";
257
+ const cascadeOn = bundle.cascadeOn;
258
+ if (cascadeOn !== void 0 && cascadeOn !== "off") return "auto";
259
+ return "chimera";
260
+ }
261
+ async function integrateFindings(payload, projectDir, reportId) {
262
+ if ((!payload.reviewText || payload.reviewText.trim().length === 0) && !payload.parsedReport) {
263
+ return { created: 0, relinked: 0, reopened: 0, totalFindings: 0, unparseableCount: 0 };
264
+ }
265
+ const store = new JsonlFindingStore(projectDir);
266
+ const source = classifyChimeraReviewSource(payload.bundle);
267
+ const agentId = payload.bundle.fileProvenance?.find((entry) => entry.agentId)?.agentId ?? "chimera-review";
268
+ const sessionId = payload.sessionId ?? payload.cwd;
269
+ const model = payload.bundle.config.model;
270
+ const parsed = payload.parsedReport ?? parseChimeraReviewReport(payload.reviewText, {
271
+ sessionId,
272
+ agentId,
273
+ reviewerModel: model,
274
+ reviewType: source,
275
+ reportId
276
+ });
277
+ if (parsed.findings.length === 0) {
278
+ return {
279
+ created: 0,
280
+ relinked: 0,
281
+ reopened: 0,
282
+ totalFindings: 0,
283
+ unparseableCount: parsed.unparseableCount
284
+ };
285
+ }
286
+ const result = await store.upsert(parsed.findings, {
287
+ sessionId,
288
+ reportId,
289
+ agentId,
290
+ model
291
+ });
292
+ return {
293
+ created: result.created,
294
+ relinked: result.relinked,
295
+ reopened: result.reopened,
296
+ reportId,
297
+ totalFindings: parsed.findings.length,
298
+ unparseableCount: parsed.unparseableCount
299
+ };
300
+ }
301
+
302
+ // src/plugins/review-report-integration.ts
303
+ async function updateReviewReportEvidence(reportId, projectDir, evidenceStatus, evidenceChecks) {
304
+ await new JsonlReportStore(projectDir).updateEvidence(
305
+ reportId,
306
+ evidenceStatus,
307
+ evidenceChecks
308
+ );
309
+ }
310
+ async function persistReviewReport(payload, reportId, projectDir) {
311
+ const store = new JsonlReportStore(projectDir);
312
+ const existed = await store.get(reportId);
313
+ const source = classifyChimeraReviewSource(payload.bundle);
314
+ const agentId = payload.bundle.fileProvenance?.find((entry) => entry.agentId)?.agentId ?? "chimera-review";
315
+ const sessionId = payload.sessionId ?? payload.cwd;
316
+ const model = payload.bundle.config.model;
317
+ const cascadeDepth = payload.bundle.cascadeDepth;
318
+ const files = payload.bundle.files.map((f) => ({
319
+ path: f.path,
320
+ status: f.status
321
+ }));
322
+ const reviewStatus = payload.status === "success" ? "success" : "failed";
323
+ const parsed = reviewStatus === "success" ? payload.parsedReport ?? parseChimeraReviewReport(payload.reviewText, {
324
+ sessionId,
325
+ agentId,
326
+ reviewerModel: model,
327
+ reviewType: source,
328
+ reportId
329
+ }) : { findings: [], unparseableCount: 0, durationSeconds: void 0 };
330
+ const counts = { critical: 0, high: 0, medium: 0, low: 0 };
331
+ for (const finding of parsed.findings) {
332
+ counts[finding.severity]++;
333
+ }
334
+ const input = {
335
+ id: reportId,
336
+ sessionId,
337
+ agentId,
338
+ reviewerModel: model,
339
+ source,
340
+ reviewStatus,
341
+ files,
342
+ counts,
343
+ totalFindings: parsed.findings.length,
344
+ unparseableCount: parsed.unparseableCount,
345
+ durationSeconds: parsed.durationSeconds,
346
+ rawText: payload.reviewText,
347
+ ...cascadeDepth !== void 0 ? { cascadeDepth } : {},
348
+ // P0-3: carry the cascade evidence verification (status + per-check
349
+ // comparisons) so the persisted report is auditable. Absent on initial
350
+ // reviews — no cascade step produced evidence yet.
351
+ ...payload.bundle.evidenceStatus !== void 0 ? { evidenceStatus: payload.bundle.evidenceStatus } : {},
352
+ ...payload.bundle.evidenceChecks !== void 0 ? { evidenceChecks: payload.bundle.evidenceChecks } : {}
353
+ };
354
+ await store.persist(input);
355
+ if (reviewStatus === "success" && parsed.findings.length === 0 && parsed.unparseableCount === 0 && isExplicitAllClearReview(payload.reviewText)) {
356
+ await store.transition(
357
+ reportId,
358
+ "completed",
359
+ { id: "chimera", kind: "system" },
360
+ {
361
+ reason: "Successful Chimera review produced no actionable findings"
362
+ }
363
+ );
364
+ }
365
+ return {
366
+ reportId,
367
+ created: !existed,
368
+ totalFindings: parsed.findings.length
369
+ };
370
+ }
371
+ function isExplicitAllClearReview(text) {
372
+ const normalized = text.trim().toLowerCase();
373
+ return normalized.startsWith("## \u{1F982} chimera review \u2014 all clear") || normalized.includes("chimera review: all clear");
374
+ }
375
+ async function syncReportCompletion(reportId, projectDir, actor) {
376
+ const reportStore = new JsonlReportStore(projectDir);
377
+ const findingStore = new JsonlFindingStore(projectDir);
378
+ const report = await reportStore.get(reportId);
379
+ if (!report) {
380
+ return { reportId, completed: false, totalFindings: 0, remaining: 0 };
381
+ }
382
+ if (report.lifecycle === "completed" || report.lifecycle === "skipped") {
383
+ return { reportId, completed: false, totalFindings: 0, remaining: 0 };
384
+ }
385
+ const findings = await findingStore.list({ reportId, limit: 9999 });
386
+ const total = findings.length;
387
+ if (total === 0) {
388
+ return { reportId, completed: false, totalFindings: 0, remaining: 0 };
389
+ }
390
+ const remaining = findings.filter(
391
+ (f) => f.status !== "resolved" && f.status !== "ignored"
392
+ ).length;
393
+ if (remaining > 0) {
394
+ return { reportId, completed: false, totalFindings: total, remaining };
395
+ }
396
+ await reportStore.transition(reportId, "completed", actor, {
397
+ reason: `All ${total} finding(s) resolved or ignored`
398
+ });
399
+ return { reportId, completed: true, totalFindings: total, remaining: 0 };
400
+ }
401
+ async function syncReportReopen(reportId, projectDir, actor, reason) {
402
+ const reportStore = new JsonlReportStore(projectDir);
403
+ const report = await reportStore.get(reportId);
404
+ if (!report) {
405
+ return { reportId, reopened: false, previousLifecycle: "not_found" };
406
+ }
407
+ if (report.lifecycle !== "completed" && report.lifecycle !== "skipped") {
408
+ return { reportId, reopened: false, previousLifecycle: report.lifecycle };
409
+ }
410
+ await reportStore.transition(reportId, "open", actor, {
411
+ reason: reason ?? `Finding reopened \u2014 report was ${report.lifecycle}`
412
+ });
413
+ return { reportId, reopened: true, previousLifecycle: report.lifecycle };
414
+ }
415
+
416
+ export {
417
+ parseChimeraReviewReport,
418
+ classifyChimeraReviewSource,
419
+ integrateFindings,
420
+ updateReviewReportEvidence,
421
+ persistReviewReport,
422
+ syncReportCompletion,
423
+ syncReportReopen
424
+ };
425
+ //# sourceMappingURL=chunk-YWXT3JNM.js.map
@@ -0,0 +1,49 @@
1
+ // src/security/config-secrets.ts
2
+ function decryptConfigSecrets(cfg, vault, opts) {
3
+ const warn = opts?.warn ?? ((msg) => console.warn(msg));
4
+ return walk(cfg, vault, (v, key) => {
5
+ try {
6
+ return vault.decrypt(v);
7
+ } catch (err) {
8
+ warn(
9
+ `[secret-vault] Failed to decrypt "${key}": ${err instanceof Error ? err.message : err}`
10
+ );
11
+ return "";
12
+ }
13
+ });
14
+ }
15
+ function encryptConfigSecrets(cfg, vault, _opts) {
16
+ return walk(cfg, vault, (v) => vault.encrypt(v));
17
+ }
18
+ function walk(node, vault, transform) {
19
+ if (node === null || node === void 0) return node;
20
+ if (typeof node !== "object") return node;
21
+ if (Array.isArray(node)) {
22
+ return node.map((item) => walk(item, vault, transform));
23
+ }
24
+ const out = /* @__PURE__ */ Object.create(null);
25
+ for (const [k, v] of Object.entries(node)) {
26
+ if (typeof v === "string" && isSecretField(k)) {
27
+ out[k] = transform(v, k);
28
+ } else if (typeof v === "object" && v !== null) {
29
+ out[k] = walk(v, vault, transform);
30
+ } else {
31
+ out[k] = v;
32
+ }
33
+ }
34
+ return out;
35
+ }
36
+ var SECRET_KEY_PATTERN = /(?:api[-_]?key|auth[-_]?token|authorization|proxy-authorization|cookie|bearer|secret|password|passwd|pwd|refresh[-_]?token|session[-_]?key|access[_-]?token|private[_-]?key|token\b)/i;
37
+ var NON_SECRET_OVERRIDES = /* @__PURE__ */ new Set(["publickey", "public_key"]);
38
+ function isSecretField(name) {
39
+ const lc = name.toLowerCase();
40
+ if (NON_SECRET_OVERRIDES.has(lc)) return false;
41
+ return SECRET_KEY_PATTERN.test(lc);
42
+ }
43
+
44
+ export {
45
+ decryptConfigSecrets,
46
+ encryptConfigSecrets,
47
+ isSecretField
48
+ };
49
+ //# sourceMappingURL=chunk-YY6APYUM.js.map