@wrongstack/core 0.313.1 → 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 (290) hide show
  1. package/dist/chronicle/index.js +31 -31
  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 +39 -31
  7. package/dist/chronicle/sink.d.ts +13 -0
  8. package/dist/chronicle/sqlite-journal.d.ts +20 -2
  9. package/dist/{chunk-WOEZV3Q4.js → chunk-25LSLC3G.js} +2 -1
  10. package/dist/{chunk-AI4LLQ2U.js → chunk-27QIURLN.js} +229 -12
  11. package/dist/{chunk-I45KAW2N.js → chunk-3AGWVSS7.js} +38 -450
  12. package/dist/chunk-3BDV7RL3.js +211 -0
  13. package/dist/{chunk-NFAYHPRH.js → chunk-3ECENVHL.js} +10 -8
  14. package/dist/{chunk-FW5LDDMJ.js → chunk-45WI72ZB.js} +1576 -1156
  15. package/dist/{chunk-AT4V4XGI.js → chunk-4BMVPOHO.js} +539 -313
  16. package/dist/{chunk-YBUJCZ57.js → chunk-4I7HGVVA.js} +17 -5
  17. package/dist/{chunk-JVGPR3TS.js → chunk-4LCZVJVF.js} +7 -55
  18. package/dist/{chunk-4ZHTKJHM.js → chunk-4SJNS7OB.js} +36 -2
  19. package/dist/{chunk-AD7ZFZCS.js → chunk-5BMIE7QG.js} +3 -3
  20. package/dist/{chunk-IQ35HMQL.js → chunk-5YPSXQXM.js} +71 -24
  21. package/dist/chunk-6FHWXLPT.js +10 -0
  22. package/dist/{chunk-FIV4IJL7.js → chunk-6H5GEOET.js} +163 -20
  23. package/dist/{chunk-VB3H5WWB.js → chunk-6NWEVFEL.js} +2 -2
  24. package/dist/{chunk-E6I5RXVK.js → chunk-AYW5YINX.js} +2 -2
  25. package/dist/{chunk-DEIQMBD2.js → chunk-B7F4WVP4.js} +2 -2
  26. package/dist/{chunk-XQ2XGIBF.js → chunk-BPBKKBUK.js} +6 -7
  27. package/dist/{chunk-K4YUNKU7.js → chunk-BYD345OX.js} +2 -2
  28. package/dist/{chunk-LZDDLNCZ.js → chunk-C27KDLOX.js} +4 -4
  29. package/dist/{chunk-6AKOTGLM.js → chunk-CU546ESW.js} +7 -7
  30. package/dist/{chunk-ZZ4V3WIZ.js → chunk-DLHHXUAM.js} +10 -1
  31. package/dist/{chunk-BAKVJLEV.js → chunk-DOTHQSJ2.js} +28 -16
  32. package/dist/{chunk-KBZGE6LN.js → chunk-DYLPMV4Q.js} +4 -3
  33. package/dist/{chunk-52RTVH4M.js → chunk-F3JWNST7.js} +2 -2
  34. package/dist/{chunk-WEBMSQP2.js → chunk-FC2ZGRF3.js} +21 -4
  35. package/dist/{chunk-FHAMQS7Q.js → chunk-FCBTO76Z.js} +76 -146
  36. package/dist/{chunk-4LJJYBAU.js → chunk-FHZVFYSL.js} +9 -1
  37. package/dist/{chunk-W4A6QA3D.js → chunk-FWNLEZYG.js} +4 -3
  38. package/dist/{chunk-OJZEX73F.js → chunk-GDQ7CZRQ.js} +5 -1
  39. package/dist/{chunk-QVOVMXJR.js → chunk-GJJGJB2R.js} +32 -9
  40. package/dist/{chunk-4XV6IR37.js → chunk-HI3JGZR2.js} +7 -6
  41. package/dist/{chunk-FSWCWSTS.js → chunk-HMLIGAU7.js} +26 -26
  42. package/dist/{chunk-PFXFQQRT.js → chunk-HXKZ7OBQ.js} +7 -43
  43. package/dist/{chunk-2FQL4PDC.js → chunk-I7DALG7J.js} +5 -5
  44. package/dist/{chunk-GM54GJBU.js → chunk-IRUTEHCE.js} +3 -3
  45. package/dist/{chunk-TYW2GI5I.js → chunk-J2WRWR37.js} +40 -13
  46. package/dist/{chunk-ZEHUCJHY.js → chunk-JFPJ6LLQ.js} +2 -2
  47. package/dist/chunk-JMULFFLN.js +9 -0
  48. package/dist/{chunk-RD6DEE36.js → chunk-JO4MGB6Z.js} +94 -8
  49. package/dist/{chunk-5DSMEVA4.js → chunk-K6BXGITA.js} +7 -7
  50. package/dist/{chunk-O74MJHXU.js → chunk-KZMSZV32.js} +2 -2
  51. package/dist/{chunk-GFJOMSHG.js → chunk-LA7CLDRW.js} +6 -2
  52. package/dist/{chunk-M2WF6AXG.js → chunk-LSMMOS2Z.js} +7 -3
  53. package/dist/{chunk-ASX6AW36.js → chunk-LXWCMQNJ.js} +3 -3
  54. package/dist/{chunk-WZO23AWO.js → chunk-M27LIEKV.js} +72 -22
  55. package/dist/{chunk-JTHKOYWU.js → chunk-MJPHJRAL.js} +15 -15
  56. package/dist/{chunk-G5AAKEEZ.js → chunk-MTL4O5YR.js} +5 -5
  57. package/dist/chunk-NHJ75HXY.js +1 -0
  58. package/dist/{chunk-ZYU2YOJ6.js → chunk-NIOAGFPB.js} +29 -15
  59. package/dist/{chunk-Y2GE5TSI.js → chunk-NS52ISWS.js} +2 -2
  60. package/dist/{chunk-UIWONWVG.js → chunk-NSOFPKGT.js} +541 -148
  61. package/dist/{chunk-RCQYT2I4.js → chunk-NVIZG63R.js} +2 -2
  62. package/dist/{chunk-EPC3GZD4.js → chunk-OOYZPOXM.js} +2 -2
  63. package/dist/{chunk-7ZHZE5EO.js → chunk-OSGLYW5J.js} +2 -2
  64. package/dist/{chunk-CE4ZOCOI.js → chunk-PFCMSSUF.js} +9 -9
  65. package/dist/{chunk-GFXZTHNI.js → chunk-PGRVXIMY.js} +5 -5
  66. package/dist/{chunk-JJPMWPB6.js → chunk-PISBFBJN.js} +6 -6
  67. package/dist/chunk-POOOIWE5.js +9 -0
  68. package/dist/{chunk-5RP3QTRL.js → chunk-PQNS3U7Z.js} +20 -3
  69. package/dist/{chunk-3E244UDA.js → chunk-QSTSJOCK.js} +52 -6
  70. package/dist/{chunk-YUPMXOGP.js → chunk-RFQMOKWK.js} +3 -3
  71. package/dist/chunk-RTOTNK3P.js +484 -0
  72. package/dist/{chunk-SN2DQRL6.js → chunk-RXKSDUAU.js} +7 -7
  73. package/dist/{chunk-T3KGZBU5.js → chunk-S45JPKQN.js} +189 -43
  74. package/dist/{chunk-YNCVSFGF.js → chunk-SAFHACFA.js} +4 -1
  75. package/dist/{chunk-KI4L2DUL.js → chunk-TCCHINEF.js} +114 -19
  76. package/dist/{chunk-AWNQ6ED6.js → chunk-THEGTRAG.js} +7 -2
  77. package/dist/{chunk-2KKODIQU.js → chunk-TR4LQE7L.js} +15 -15
  78. package/dist/{chunk-GPQ3NJPR.js → chunk-TWJMGXCI.js} +3 -3
  79. package/dist/{chunk-H72H4XDU.js → chunk-U45AXT5D.js} +9 -9
  80. package/dist/{chunk-62V2AFVG.js → chunk-U4FWBSO3.js} +160 -73
  81. package/dist/{chunk-A455ATZB.js → chunk-UBGDX6FI.js} +8 -1
  82. package/dist/chunk-UJILKYES.js +75 -0
  83. package/dist/{chunk-KSJ5UTP7.js → chunk-ULMAQV3T.js} +84 -4
  84. package/dist/{chunk-CB2HFKTP.js → chunk-VVBP6KGT.js} +1 -1
  85. package/dist/{chunk-RPOA7IAE.js → chunk-W5VITDM2.js} +43 -25
  86. package/dist/{chunk-QRTG4XTI.js → chunk-WAHQVNWT.js} +7 -1
  87. package/dist/{chunk-SQP64RCS.js → chunk-WGGYRBXH.js} +3019 -2976
  88. package/dist/{chunk-K3G6JBUC.js → chunk-WLYKU45P.js} +679 -141
  89. package/dist/chunk-WP7BVANJ.js +53 -0
  90. package/dist/{chunk-GAZEWQEZ.js → chunk-XF4VUMKW.js} +2 -2
  91. package/dist/{chunk-PAAWLLZX.js → chunk-Y5YXDM7D.js} +2 -2
  92. package/dist/{chunk-65RDIOR2.js → chunk-YOPAUVU4.js} +162 -44
  93. package/dist/{chunk-FFSX2QDQ.js → chunk-YPT4A46F.js} +3 -3
  94. package/dist/chunk-YWXT3JNM.js +425 -0
  95. package/dist/{chunk-EFEHDQGY.js → chunk-ZHZ2Y2DH.js} +64 -10
  96. package/dist/{chunk-CQQL4ZOQ.js → chunk-ZT7JNIGX.js} +4 -3
  97. package/dist/coordination/agent-monitor.d.ts +9 -1
  98. package/dist/coordination/agent-subagent-runner.d.ts +1 -1
  99. package/dist/coordination/agents/agent-prompts.d.ts +8 -0
  100. package/dist/coordination/agents/index.d.ts +33 -1
  101. package/dist/coordination/agents/index.js +52 -22
  102. package/dist/coordination/agents/phase3-wave1-platform.d.ts +1 -3
  103. package/dist/coordination/agents/phase3-wave2-meta.d.ts +1 -3
  104. package/dist/coordination/agents/phase8-wave3-products.d.ts +1 -3
  105. package/dist/coordination/agents/phase9-wave4-platform-meta.d.ts +1 -3
  106. package/dist/coordination/agents/project-agent-identity.d.ts +11 -11
  107. package/dist/coordination/agents/types.d.ts +13 -2
  108. package/dist/coordination/brain-monitor.d.ts +30 -7
  109. package/dist/coordination/collab-debug.d.ts +1 -1
  110. package/dist/coordination/collab-pause.d.ts +1 -1
  111. package/dist/coordination/delegate-tool.d.ts +7 -5
  112. package/dist/coordination/director-kanban-queue-helpers.d.ts +1 -0
  113. package/dist/coordination/director-options.d.ts +7 -0
  114. package/dist/coordination/director-spawn-model.d.ts +17 -0
  115. package/dist/coordination/director-tools.d.ts +2 -2
  116. package/dist/coordination/director.d.ts +12 -0
  117. package/dist/coordination/dispatcher.d.ts +8 -0
  118. package/dist/coordination/fleet-bus.d.ts +35 -4
  119. package/dist/coordination/fleet-supervisor.d.ts +10 -2
  120. package/dist/coordination/fleet.d.ts +16 -7
  121. package/dist/coordination/index.d.ts +4 -0
  122. package/dist/coordination/index.js +86 -49
  123. package/dist/coordination/kanban-dispatch-port.d.ts +2 -2
  124. package/dist/coordination/mailbox-http-router.d.ts +4 -3
  125. package/dist/coordination/mailbox-http-validation.d.ts +1 -1
  126. package/dist/coordination/mailbox-project-server.js +15 -15
  127. package/dist/coordination/mailbox-types.d.ts +24 -6
  128. package/dist/coordination/model-tier-leader.d.ts +122 -0
  129. package/dist/coordination/model-tier.d.ts +122 -0
  130. package/dist/coordination/multi-agent-coordinator.d.ts +24 -0
  131. package/dist/coordination/origin-session.d.ts +16 -0
  132. package/dist/coordination/provider-status-tracker.d.ts +37 -5
  133. package/dist/coordination/session-note-hub.d.ts +44 -0
  134. package/dist/coordination/session-note-tool.d.ts +10 -0
  135. package/dist/core/agent.d.ts +1 -1
  136. package/dist/core/context.d.ts +22 -3
  137. package/dist/core/index.d.ts +2 -0
  138. package/dist/core/index.js +130 -38
  139. package/dist/core/request-conversation-binding.d.ts +37 -0
  140. package/dist/core/session-notes.d.ts +25 -0
  141. package/dist/core/system-prompt-builder.d.ts +11 -2
  142. package/dist/core/system-prompt-variants.d.ts +78 -0
  143. package/dist/design/index.js +3 -3
  144. package/dist/execution/auto-compaction-middleware.d.ts +11 -0
  145. package/dist/execution/autonomy-brain.d.ts +2 -1
  146. package/dist/execution/autonomy-prompt-contributor.d.ts +7 -2
  147. package/dist/execution/compaction-core.d.ts +4 -4
  148. package/dist/execution/eternal-autonomy.d.ts +1 -1
  149. package/dist/execution/index.js +138 -129
  150. package/dist/execution/model-runtime.d.ts +0 -7
  151. package/dist/execution/parallel-eternal-engine.d.ts +7 -7
  152. package/dist/extension/index.js +3 -3
  153. package/dist/goal/index.js +6 -6
  154. package/dist/hooks/index.js +3 -3
  155. package/dist/hq/index.js +14 -12
  156. package/dist/hq/persistence/event-log.d.ts +0 -1
  157. package/dist/hq/persistence.d.ts +4 -4
  158. package/dist/hq/publisher.d.ts +2 -0
  159. package/dist/index.d.ts +14 -11
  160. package/dist/index.js +728 -635
  161. package/dist/infrastructure/index.d.ts +4 -4
  162. package/dist/infrastructure/index.js +281 -260
  163. package/dist/infrastructure/token-counter.d.ts +9 -0
  164. package/dist/kernel/events/agent-events.d.ts +77 -3
  165. package/dist/kernel/events/brain-events.d.ts +12 -0
  166. package/dist/kernel/events/provider-events.d.ts +7 -1
  167. package/dist/kernel/events/session-events.d.ts +14 -0
  168. package/dist/kernel/events/tool-events.d.ts +13 -0
  169. package/dist/kernel/index.js +4 -4
  170. package/dist/mailbox-attach.d.ts +1 -1
  171. package/dist/models/index.js +10 -9
  172. package/dist/observability/event-bridge.d.ts +25 -5
  173. package/dist/observability/index.d.ts +9 -8
  174. package/dist/observability/index.js +459 -351
  175. package/dist/observability/tool-usage-source.d.ts +65 -0
  176. package/dist/plugin/index.d.ts +5 -0
  177. package/dist/plugin/index.js +66 -50
  178. package/dist/plugins/auto-review-plugin.d.ts +3 -2
  179. package/dist/plugins/review-finding-commands.d.ts +0 -8
  180. package/dist/{review-finding-store-DKAV3AS6.js → plugins/review-finding-store.js} +7 -6
  181. package/dist/plugins/review-finding-types.js +19 -0
  182. package/dist/plugins/review-report-integration.js +21 -0
  183. package/dist/{review-report-store-OWY3EC3N.js → plugins/review-report-store.js} +7 -6
  184. package/dist/plugins/review-report-types.js +13 -0
  185. package/dist/prompts/index.js +5 -5
  186. package/dist/registry/index.js +3 -3
  187. package/dist/registry/tool-registry.d.ts +59 -9
  188. package/dist/{registry-R23UBE7H.js → registry-7N4O3E7W.js} +5 -5
  189. package/dist/security/capabilities.d.ts +6 -0
  190. package/dist/security/file-permissions.d.ts +1 -1
  191. package/dist/security/index.js +47 -33
  192. package/dist/security/permission-policy.d.ts +12 -1
  193. package/dist/security/secret-scrubber.d.ts +15 -0
  194. package/dist/session-catalog/index.d.ts +1 -0
  195. package/dist/session-catalog/index.js +19 -14
  196. package/dist/session-catalog/project-server.js +30 -13
  197. package/dist/session-catalog/protocol.d.ts +32 -1
  198. package/dist/session-catalog/registry.d.ts +17 -1
  199. package/dist/session-catalog/session-agents.d.ts +56 -0
  200. package/dist/session-catalog/store-rebuild.d.ts +14 -0
  201. package/dist/session-catalog/store-schema.d.ts +26 -0
  202. package/dist/session-catalog/store.d.ts +27 -1
  203. package/dist/session-note-attach.d.ts +9 -0
  204. package/dist/skills/index.js +5 -5
  205. package/dist/statusline/index.d.ts +43 -0
  206. package/dist/statusline/index.js +102 -0
  207. package/dist/storage/board-store-port.d.ts +2 -2
  208. package/dist/storage/config-loader/in-project-policy.d.ts +29 -0
  209. package/dist/storage/config-loader.d.ts +3 -2
  210. package/dist/storage/file-session-writer.d.ts +4 -2
  211. package/dist/storage/goal-coordination.d.ts +6 -1
  212. package/dist/storage/goal-kanban.d.ts +4 -1
  213. package/dist/storage/index.d.ts +12 -4
  214. package/dist/storage/index.js +76 -61
  215. package/dist/storage/input-history-store.d.ts +2 -4
  216. package/dist/storage/memory-curator.d.ts +133 -0
  217. package/dist/storage/session-agent-attribution.d.ts +39 -0
  218. package/dist/storage/session-doctor.d.ts +109 -0
  219. package/dist/storage/session-event-bridge.d.ts +5 -7
  220. package/dist/storage/session-outcome.d.ts +42 -0
  221. package/dist/storage/session-recovery.d.ts +55 -0
  222. package/dist/storage/session-store/load-session-data.d.ts +11 -0
  223. package/dist/storage/session-store/prune-helpers.d.ts +1 -1
  224. package/dist/storage/session-store/resume-session.d.ts +0 -2
  225. package/dist/storage/session-store/types.d.ts +8 -0
  226. package/dist/storage/session-store.d.ts +3 -3
  227. package/dist/storage/session-summary-tracker.d.ts +8 -1
  228. package/dist/storage/session-write-buffer.d.ts +18 -0
  229. package/dist/storage/session-writer-truncate.d.ts +2 -0
  230. package/dist/tasking/index.js +2 -2
  231. package/dist/tools/fallback-manage-tools.d.ts +6 -4
  232. package/dist/tools/index.js +21 -21
  233. package/dist/tools/model-tier-set-tool.d.ts +66 -0
  234. package/dist/types/agent-bridge.d.ts +2 -1
  235. package/dist/types/config/mcp-features.d.ts +7 -0
  236. package/dist/types/config/model-tiers.d.ts +148 -0
  237. package/dist/types/config/root.d.ts +9 -0
  238. package/dist/types/config/tools.d.ts +73 -0
  239. package/dist/types/config.d.ts +1 -0
  240. package/dist/types/context.d.ts +2 -0
  241. package/dist/types/default-config.d.ts +6 -0
  242. package/dist/types/errors.d.ts +2 -1
  243. package/dist/types/index.d.ts +11 -9
  244. package/dist/types/index.js +25 -15
  245. package/dist/types/multi-agent.d.ts +43 -0
  246. package/dist/types/plugin.d.ts +1 -1
  247. package/dist/types/provider.d.ts +15 -0
  248. package/dist/types/runtime-capability-manifest.d.ts +1 -1
  249. package/dist/types/secret-scrubber.d.ts +15 -0
  250. package/dist/types/session-markers.d.ts +37 -10
  251. package/dist/types/session-markers.js +1 -1
  252. package/dist/types/session-timeline.d.ts +197 -0
  253. package/dist/types/session-timeline.js +12 -0
  254. package/dist/types/session.d.ts +172 -11
  255. package/dist/types/system-prompt.d.ts +27 -0
  256. package/dist/utils/config-backup.d.ts +9 -1
  257. package/dist/utils/heap-watchdog.js +2 -2
  258. package/dist/utils/index.js +50 -48
  259. package/dist/utils/message-invariants.d.ts +4 -1
  260. package/dist/utils/regex-guard.d.ts +1 -1
  261. package/dist/utils/socket-path.d.ts +1 -1
  262. package/dist/utils/token-estimate.d.ts +6 -2
  263. package/dist/utils/wstack-paths.d.ts +2 -0
  264. package/dist/wiring/proxy-rewrite.d.ts +28 -0
  265. package/dist/wiring/proxy-rewrite.js +7 -1
  266. package/dist/worktree/index.js +2 -2
  267. package/instructions/agents/explore-companion.md +45 -18
  268. package/instructions/agents/memory-curator.md +34 -22
  269. package/instructions/coordination/director-preamble.md +12 -7
  270. package/instructions/coordination/subagent-baseline.md +26 -5
  271. package/instructions/leader-after-task.md +4 -1
  272. package/instructions/llm/chimera-review.md +30 -9
  273. package/instructions/llm/memory-curator.md +31 -0
  274. package/instructions/sections/tool/delegation-compact.md +2 -0
  275. package/instructions/sections/tool/delegation-full.md +5 -1
  276. package/instructions/sections/tool/mailbox-compact.md +5 -1
  277. package/instructions/sections/tool/mailbox-full.md +3 -0
  278. package/instructions/sections/tool/session-note-compact.md +3 -0
  279. package/instructions/sections/tool/session-note-full.md +15 -0
  280. package/instructions/system-lite.md +9 -4
  281. package/instructions/system-pro.md +66 -143
  282. package/instructions/system.md +73 -175
  283. package/package.json +32 -4
  284. package/dist/chunk-2BUUIMQB.js +0 -225
  285. package/dist/chunk-FAYRX2AD.js +0 -13
  286. package/dist/chunk-H5E77KUJ.js +0 -15
  287. package/dist/chunk-M7BS2K6U.js +0 -1
  288. package/dist/coordination/agents.d.ts +0 -8
  289. package/dist/coordination/transport.d.ts +0 -2
  290. 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
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  computeMessageTokens
3
- } from "./chunk-FSWCWSTS.js";
4
- import {
5
- isTextBlock
6
- } from "./chunk-O37BQ65S.js";
3
+ } from "./chunk-HMLIGAU7.js";
7
4
  import {
8
5
  expectDefined
9
6
  } from "./chunk-PFZO3C6H.js";
7
+ import {
8
+ isTextBlock
9
+ } from "./chunk-O37BQ65S.js";
10
10
 
11
11
  // src/utils/context-evidence.ts
12
12
  import * as path from "node:path";
@@ -695,6 +695,12 @@ function wrapAsState(ctx) {
695
695
  // src/core/context.ts
696
696
  import { realpathSync } from "node:fs";
697
697
  import * as path2 from "node:path";
698
+ import { requireSessionId } from "@wrongstack/primitives";
699
+ function isAppendableSessionWriter(writer) {
700
+ return Boolean(
701
+ writer && typeof writer === "object" && typeof writer.append === "function"
702
+ );
703
+ }
698
704
  var Context = class _Context {
699
705
  messages = [];
700
706
  /**
@@ -979,6 +985,7 @@ var Context = class _Context {
979
985
  _conversationJournalQueue = [];
980
986
  _conversationJournalBytes = 0;
981
987
  _conversationJournalDrain = null;
988
+ _conversationJournalLastError = null;
982
989
  static CONVERSATION_JOURNAL_MAX_EVENTS = 256;
983
990
  static CONVERSATION_JOURNAL_MAX_BYTES = 4 * 1024 * 1024;
984
991
  static MAX_FILE_EVENTS = 1e3;
@@ -990,9 +997,13 @@ var Context = class _Context {
990
997
  const drain = this._conversationJournalDrain;
991
998
  if (!drain) break;
992
999
  await drain;
1000
+ if (this._conversationJournalQueue.length > 0 && this._conversationJournalLastError) {
1001
+ throw this._conversationJournalLastError;
1002
+ }
993
1003
  }
994
1004
  this._conversationJournalQueue.length = 0;
995
1005
  this._conversationJournalBytes = 0;
1006
+ this._conversationJournalLastError = null;
996
1007
  }
997
1008
  conversationJournalBytes(event) {
998
1009
  try {
@@ -1024,6 +1035,11 @@ var Context = class _Context {
1024
1035
  );
1025
1036
  }
1026
1037
  enqueueConversationJournal(event, writer) {
1038
+ if (!isAppendableSessionWriter(writer)) {
1039
+ this.warnConversationJournalDrop(event.type);
1040
+ return;
1041
+ }
1042
+ this._conversationJournalLastError = null;
1027
1043
  const bytes = this.conversationJournalBytes(event);
1028
1044
  const shouldSnapshot = event.type === "messages_replaced" || this._conversationJournalQueue.length >= _Context.CONVERSATION_JOURNAL_MAX_EVENTS || this._conversationJournalBytes + bytes > _Context.CONVERSATION_JOURNAL_MAX_BYTES;
1029
1045
  if (shouldSnapshot) {
@@ -1065,12 +1081,42 @@ var Context = class _Context {
1065
1081
  const queued = this._conversationJournalQueue.shift();
1066
1082
  if (!queued) continue;
1067
1083
  this._conversationJournalBytes = Math.max(0, this._conversationJournalBytes - queued.bytes);
1068
- await queued.writer.append(queued.event).catch(() => {
1069
- });
1084
+ if (!isAppendableSessionWriter(queued.writer)) {
1085
+ this.warnConversationJournalDrop(queued.event.type);
1086
+ continue;
1087
+ }
1088
+ try {
1089
+ await queued.writer.append(queued.event);
1090
+ this._conversationJournalLastError = null;
1091
+ } catch (err) {
1092
+ const attempts = (queued.attempts ?? 0) + 1;
1093
+ this._conversationJournalQueue.unshift({ ...queued, attempts });
1094
+ this._conversationJournalBytes += queued.bytes;
1095
+ const error = err instanceof Error ? err : new Error(String(err));
1096
+ this._conversationJournalLastError = error;
1097
+ if (attempts < 3) {
1098
+ await new Promise((resolve3) => setTimeout(resolve3, attempts * 25));
1099
+ continue;
1100
+ }
1101
+ console.warn(
1102
+ JSON.stringify({
1103
+ level: "error",
1104
+ event: "session.conversation_journal_write_failed",
1105
+ sessionId: this.session?.id,
1106
+ eventType: queued.event.type,
1107
+ attempts,
1108
+ message: error.message,
1109
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
1110
+ })
1111
+ );
1112
+ break;
1113
+ }
1070
1114
  }
1071
1115
  })().finally(() => {
1072
1116
  if (this._conversationJournalDrain === drain) this._conversationJournalDrain = null;
1073
- if (this._conversationJournalQueue.length > 0) this.startConversationJournalDrain();
1117
+ if (this._conversationJournalQueue.length > 0 && !this._conversationJournalLastError) {
1118
+ this.startConversationJournalDrain();
1119
+ }
1074
1120
  });
1075
1121
  this._conversationJournalDrain = drain;
1076
1122
  }
@@ -1456,9 +1502,16 @@ var Context = class _Context {
1456
1502
  }
1457
1503
  };
1458
1504
  function resolveEventSessionId(ctx) {
1459
- if (ctx.activeRunSessionId) return ctx.activeRunSessionId;
1505
+ if (ctx.activeRunSessionId) {
1506
+ return requireSessionId(ctx.activeRunSessionId, "agent event emission");
1507
+ }
1460
1508
  const session = ctx.session;
1461
- return session?.id ?? "";
1509
+ return requireSessionId(session?.id, "agent event emission");
1510
+ }
1511
+ function resolveOwningSessionId(ctx) {
1512
+ const owning = ctx.meta?.["sessionId"];
1513
+ if (typeof owning === "string" && owning.length > 0) return owning;
1514
+ return resolveEventSessionId(ctx);
1462
1515
  }
1463
1516
 
1464
1517
  // src/utils/json-repair.ts
@@ -1582,8 +1635,9 @@ export {
1582
1635
  wrapAsState,
1583
1636
  Context,
1584
1637
  resolveEventSessionId,
1638
+ resolveOwningSessionId,
1585
1639
  bindRequestProvider,
1586
1640
  providerBoundToRequest,
1587
1641
  completePartialObject
1588
1642
  };
1589
- //# sourceMappingURL=chunk-EFEHDQGY.js.map
1643
+ //# sourceMappingURL=chunk-ZHZ2Y2DH.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ensureProjectGitignore
3
- } from "./chunk-4XV6IR37.js";
3
+ } from "./chunk-HI3JGZR2.js";
4
4
 
5
5
  // src/utils/config-backup.ts
6
6
  import * as fs from "node:fs/promises";
@@ -11,7 +11,7 @@ function configHistoryDir(globalRoot) {
11
11
  function configSlug(absolutePath, globalRoot) {
12
12
  const rel = path.relative(globalRoot, absolutePath);
13
13
  const normalized = rel.replace(/\\/g, "/").replace(/\.json$/i, "");
14
- return normalized.replace(/\//g, "-");
14
+ return normalized.replace(/[^a-zA-Z0-9_-]+/g, "-").replace(/^-+|-+$/g, "") || "config";
15
15
  }
16
16
  async function backupConfigFile(filePath, paths) {
17
17
  let currentContent;
@@ -144,8 +144,9 @@ async function activateProjectStateGuard(projectRoot, options = {}) {
144
144
 
145
145
  export {
146
146
  configHistoryDir,
147
+ configSlug,
147
148
  backupConfigFile,
148
149
  startProjectStateGuard,
149
150
  activateProjectStateGuard
150
151
  };
151
- //# sourceMappingURL=chunk-CQQL4ZOQ.js.map
152
+ //# sourceMappingURL=chunk-ZT7JNIGX.js.map
@@ -104,8 +104,16 @@ export declare class AgentMonitorService {
104
104
  *
105
105
  * Entries already in the ring win: a live subagent's in-memory segment is
106
106
  * newer than its JSONL, which is only written when a segment closes.
107
+ *
108
+ * `only` restricts BOTH the disk scan and the returned set to a known list of
109
+ * subagent ids. This is how a session gets ITS OWN subagents back: the
110
+ * transcripts directory is shared by every session of the project, so the
111
+ * unfiltered form hands each of four open tabs the union of all four tabs'
112
+ * workers. The caller derives the list from the session's own journal
113
+ * (`deriveSessionAgents`), which is the only record that says which agents
114
+ * belong to which session.
107
115
  */
108
- loadSessionsFromDisk(): Promise<AgentVirtualSession[]>;
116
+ loadSessionsFromDisk(only?: readonly string[]): Promise<AgentVirtualSession[]>;
109
117
  private _readTranscriptFile;
110
118
  /** Get a specific agent's virtual session, or undefined. */
111
119
  getSession(subagentId: string): AgentVirtualSession | undefined;
@@ -36,7 +36,7 @@ export interface AgentFactoryResult {
36
36
  * thrown here are swallowed so a flaky cleanup can't mask the task's
37
37
  * real result.
38
38
  */
39
- dispose?: ((() => Promise<void> | void)) | undefined;
39
+ dispose?: (() => Promise<void> | void) | undefined;
40
40
  }
41
41
  export interface AgentRunnerOptions {
42
42
  factory: AgentFactory;
@@ -1,2 +1,10 @@
1
+ /**
2
+ * Number of live prompt-cache entries.
3
+ *
4
+ * Exposed so the "one entry per role, regardless of how many times the overlay
5
+ * is rewritten" bound above is testable. The old fingerprint-in-key scheme grew
6
+ * this without limit and nothing could observe it.
7
+ */
8
+ export declare function agentPromptCacheSize(): number;
1
9
  export declare function agentPrompt(id: string): string;
2
10
  //# sourceMappingURL=agent-prompts.d.ts.map
@@ -23,13 +23,33 @@ import { WAVE3_AGENTS } from './phase8-wave3-products.js';
23
23
  import { META_AGENTS } from './phase9-meta.js';
24
24
  import { WAVE4_AGENTS } from './phase9-wave4-platform-meta.js';
25
25
  import { ROLE_SKILL_SETS, SHADOW_AGENT_SKILLS } from './role-skills.js';
26
- import type { AgentDefinition } from './types.js';
26
+ import type { AgentCapability, AgentDefinition } from './types.js';
27
27
  export * from './capability-manifest.js';
28
28
  export * from './phase3-wave1-platform.js';
29
29
  export * from './phase3-wave2-meta.js';
30
30
  export * from './phase8-wave3-products.js';
31
31
  export * from './phase9-wave4-platform-meta.js';
32
+ export * from './project-agent-auto-optimize.js';
33
+ export * from './project-agent-capture-window.js';
34
+ export * from './project-agent-capture.js';
35
+ export * from './project-agent-config-io.js';
36
+ export * from './project-agent-config-validation.js';
37
+ export * from './project-agent-consolidation.js';
38
+ export * from './project-agent-directive-outcome.js';
39
+ export * from './project-agent-files.js';
40
+ export * from './project-agent-identity-types.js';
32
41
  export * from './project-agent-identity.js';
42
+ export * from './project-agent-knowledge-manifests.js';
43
+ export * from './project-agent-learning-entries.js';
44
+ export * from './project-agent-learning-normalize.js';
45
+ export * from './project-agent-learning-policy.js';
46
+ export * from './project-agent-learning-structured.js';
47
+ export * from './project-agent-optimizer.js';
48
+ export * from './project-agent-paths.js';
49
+ export * from './project-agent-profile.js';
50
+ export * from './project-agent-quarantine.js';
51
+ export * from './project-agent-roster.js';
52
+ export * from './project-agent-skill-layer.js';
33
53
  export * from './role-skills.js';
34
54
  export * from './types.js';
35
55
  export { BUILD_AGENTS, DELIVERY_AGENTS, DISCOVERY_AGENTS, DOMAIN_AGENTS, KNOWLEDGE_AGENTS, META_AGENTS, PLANNING_AGENTS, REVIEW_AGENTS, VERIFY_AGENTS, WAVE1_AGENTS, WAVE2_AGENTS, WAVE3_AGENTS, WAVE4_AGENTS, };
@@ -53,5 +73,17 @@ export declare const AGENTS_BY_PHASE: {
53
73
  export declare const AGENT_CATALOG: Record<string, AgentDefinition>;
54
74
  /** Role lookup helper. Returns undefined for unknown roles. */
55
75
  export declare function getAgentDefinition(role: string): AgentDefinition | undefined;
76
+ /**
77
+ * Role → dispatcher rationale, for every role that declares one.
78
+ *
79
+ * Derived from the catalog rather than hand-listed. There used to be four
80
+ * hand-maintained `WAVE*_ROLE_METAS` maps beside the agent arrays; nothing
81
+ * read them, and `WAVE2_ROLE_METAS` had drifted to carry six roles that live
82
+ * in `WAVE4_AGENTS` — a duplicate set no consumer would ever have noticed
83
+ * because the map itself was dead. Deriving from `AGENT_CATALOG` makes that
84
+ * class of drift impossible: a role is listed here exactly when its own
85
+ * `capability.rationale` is set.
86
+ */
87
+ export declare const ROLE_DISPATCH_RATIONALE: Record<string, NonNullable<AgentCapability['rationale']>>;
56
88
  export { ROLE_SKILL_SETS, SHADOW_AGENT_SKILLS };
57
89
  //# sourceMappingURL=index.d.ts.map