@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,21 @@
1
+ // src/types/blocks.ts
2
+ function isTextBlock(b) {
3
+ return b.type === "text";
4
+ }
5
+ function isToolUseBlock(b) {
6
+ return b.type === "tool_use";
7
+ }
8
+ function isToolResultBlock(b) {
9
+ return b.type === "tool_result";
10
+ }
11
+ function isImageBlock(b) {
12
+ return b.type === "image";
13
+ }
14
+
15
+ export {
16
+ isTextBlock,
17
+ isToolUseBlock,
18
+ isToolResultBlock,
19
+ isImageBlock
20
+ };
21
+ //# sourceMappingURL=chunk-O37BQ65S.js.map
@@ -0,0 +1,308 @@
1
+ // src/security/kanban-governance-port.ts
2
+ var notWired = () => {
3
+ throw new Error(
4
+ "KanbanGovernancePort is not wired \u2014 register the implementation at the CLI composition root (see setKanbanGovernance)."
5
+ );
6
+ };
7
+ var port;
8
+ function setKanbanGovernance(impl) {
9
+ port = impl;
10
+ }
11
+ function kanbanGovernance() {
12
+ return port ?? notWired();
13
+ }
14
+
15
+ // src/security/kanban-boundary.ts
16
+ import { realpath } from "node:fs/promises";
17
+ import * as path from "node:path";
18
+ var GOVERNANCE_CONTROL_TOOLS = /* @__PURE__ */ new Set(["kanban", "plan", "task", "todo", "nextsteps"]);
19
+ var PATH_KEYS = /* @__PURE__ */ new Set([
20
+ "path",
21
+ "paths",
22
+ "file",
23
+ "files",
24
+ "directory",
25
+ "dir",
26
+ "cwd",
27
+ "root",
28
+ "baseDir",
29
+ "out",
30
+ "outputPath",
31
+ "sourcePath",
32
+ "targetPath",
33
+ "destinationPath",
34
+ "fromPath",
35
+ "toPath",
36
+ "worktreePath"
37
+ ]);
38
+ var TOOL_PATH_KEYS = {
39
+ // `target` is an identifier in tools such as plan/task/document, but a
40
+ // filesystem target in language_info. Keep ambiguous names tool-specific.
41
+ language_info: ["target"]
42
+ };
43
+ async function evaluateToolKanbanBoundary(tool, input, ctx, options = {}) {
44
+ if (tool.name === "kanban") return { decision: "allow" };
45
+ const identity = resolveKanbanIdentity(ctx);
46
+ const governanceRequired = options.requireGovernance && isGovernedMutation(tool, input);
47
+ if (!identity.boardId) {
48
+ return governanceRequired ? {
49
+ decision: "block",
50
+ reason: "Kanban governance is mandatory before product mutation. Create a managed card, add its required details and executable acceptance criteria, then call kanban start_task to bind it to this run."
51
+ } : { decision: "allow" };
52
+ }
53
+ const board = await kanbanGovernance().readBoard(
54
+ identity.policyRoot ?? ctx.projectRoot,
55
+ identity.boardId
56
+ );
57
+ if (!board) {
58
+ return governanceRequired ? {
59
+ decision: "block",
60
+ reason: `Active Kanban board not found: ${identity.boardId}. Recreate or select a valid managed card before mutation.`,
61
+ boardId: identity.boardId,
62
+ ...identity.taskId ? { taskId: identity.taskId } : {}
63
+ } : { decision: "allow" };
64
+ }
65
+ const task = identity.taskId ? board.tasks.find((candidate) => candidate.id === identity.taskId) : void 0;
66
+ if (governanceRequired && board.lifecycle?.mode === "managed") {
67
+ if (!identity.taskId) {
68
+ return {
69
+ decision: "block",
70
+ reason: "Kanban governance requires an active task, not only a board. Complete the card details and call kanban start_task before mutation.",
71
+ boardId: board.id
72
+ };
73
+ }
74
+ if (!task) {
75
+ return {
76
+ decision: "block",
77
+ reason: `Active Kanban task not found: ${identity.taskId}. Call kanban start_task with a valid card.`,
78
+ boardId: board.id,
79
+ taskId: identity.taskId
80
+ };
81
+ }
82
+ const readiness = kanbanGovernance().evaluateContractGraphReadiness(board, task.id);
83
+ if (!readiness.ready) {
84
+ const issueLines = readiness.issues.map((issue, index) => ` ${index + 1}. ${issue.message}`).join("\n");
85
+ return {
86
+ decision: "block",
87
+ reason: `Active card failed contract-readiness check (${readiness.issues.length} issue(s)):
88
+ ` + issueLines + `
89
+ Resolve the readiness issues, then call kanban start_task to retry.`,
90
+ boardId: board.id,
91
+ taskId: task.id,
92
+ readinessIssues: readiness.issues
93
+ };
94
+ }
95
+ const lifecycleStage = task.lifecycle?.currentStage;
96
+ const assignmentStatus = task.assignment?.status;
97
+ const lifecycleOk = lifecycleStage === "running";
98
+ const assignmentOk = assignmentStatus === "running";
99
+ if (!lifecycleOk || !assignmentOk) {
100
+ const failed = [];
101
+ let reassessmentNote = "";
102
+ if (!lifecycleOk) {
103
+ failed.push(`lifecycle.currentStage (got: ${lifecycleStage ?? "missing"}; want: 'running')`);
104
+ }
105
+ if (!assignmentOk) {
106
+ failed.push(`assignment.status (got: ${assignmentStatus ?? "missing"}; want: 'running')`);
107
+ if (lifecycleOk && (assignmentStatus === "queued" || assignmentStatus === void 0 || assignmentStatus === null)) {
108
+ reassessmentNote = '\nNote: lifecycle is still "running" but the assignment was cleared \u2014 the automated kanban reassessment agent likely reset the binding. Re-issue kanban start_task to re-bind the leader to this card.';
109
+ }
110
+ }
111
+ return {
112
+ decision: "block",
113
+ reason: `Active card failed ${failed.length} governance check(s) before product mutation:
114
+ ` + failed.map((line, index) => ` ${index + 1}. ${line}`).join("\n") + reassessmentNote,
115
+ boardId: board.id,
116
+ taskId: task.id
117
+ };
118
+ }
119
+ }
120
+ if (identity.leaseId && task?.assignment) {
121
+ const caps2 = tool.capabilities ?? [];
122
+ const isWrite = caps2.includes("fs.write") || caps2.includes("fs.write.outside-project") || caps2.some((c) => c.startsWith("shell."));
123
+ if (isWrite && tool.name !== "kanban" && task.assignment.leaseId !== identity.leaseId) {
124
+ return {
125
+ decision: "block",
126
+ reason: `Task ${task.id} lease mismatch: the current worker's lease (${identity.leaseId}) does not match the active lease on the board (${task.assignment.leaseId}). This task was likely recovered and reassigned to another worker. File modifications from a stale worker are blocked. Use kanban mark_assignment with expectedLeaseId to resolve, or use kanban get_board to reassess the current state.`,
127
+ boardId: board.id,
128
+ taskId: task.id
129
+ };
130
+ }
131
+ }
132
+ const layers = kanbanGovernance().resolveKanbanBoundaryLayers(board, task);
133
+ if (layers.length === 0) return { decision: "allow" };
134
+ const caps = tool.capabilities ?? [];
135
+ const access = caps.includes("fs.write") || caps.includes("fs.write.outside-project") ? "write" : caps.includes("fs.read") ? "read" : void 0;
136
+ const shellLike = caps.some((capability) => capability.startsWith("shell."));
137
+ const candidates = access ? await extractCandidatePaths(tool.name, input, ctx) : [];
138
+ let evaluation;
139
+ if (shellLike || access && candidates.length === 0) {
140
+ evaluation = kanbanGovernance().evaluateKanbanBoundaryOpaque(layers, tool.name);
141
+ } else if (access) {
142
+ const results = candidates.map(
143
+ (candidate) => kanbanGovernance().evaluateKanbanBoundaryPath(layers, candidate, access)
144
+ );
145
+ evaluation = results.find((result) => result.decision === "block") ?? results.find((result) => result.decision === "confirm") ?? { decision: "allow" };
146
+ } else {
147
+ evaluation = { decision: "allow" };
148
+ }
149
+ return {
150
+ ...evaluation,
151
+ boardId: board.id,
152
+ ...task ? { taskId: task.id } : {}
153
+ };
154
+ }
155
+ function isGovernedMutation(tool, input) {
156
+ if (!tool.mutating || GOVERNANCE_CONTROL_TOOLS.has(tool.name)) return false;
157
+ if (tool.capabilities?.includes("tool.meta")) return false;
158
+ if (tool.name === "git") {
159
+ const command = input["command"];
160
+ if (command === "status" || command === "log" || command === "diff") return false;
161
+ if (command === "worktree" && input["worktreeAction"] === "list") return false;
162
+ }
163
+ const capabilities = tool.capabilities ?? [];
164
+ return capabilities.some(
165
+ (capability) => capability === "fs.write" || capability === "fs.write.outside-project" || capability === "package.install" || capability === "tool.mutate.any" || capability.startsWith("shell.") || capability === "net.outbound"
166
+ );
167
+ }
168
+ function resolveKanbanIdentity(ctx) {
169
+ const metaKanban = ctx.meta["kanban"];
170
+ const record = metaKanban && typeof metaKanban === "object" ? metaKanban : void 0;
171
+ const boardId = ctx.currentKanbanBoardId ?? (typeof record?.["boardId"] === "string" ? record["boardId"] : void 0);
172
+ const taskId = ctx.currentKanbanTaskId ?? (typeof record?.["taskId"] === "string" ? record["taskId"] : void 0);
173
+ const policyRoot = typeof record?.["projectRoot"] === "string" ? record["projectRoot"] : void 0;
174
+ const leaseId = typeof record?.["leaseId"] === "string" ? record["leaseId"] : void 0;
175
+ return {
176
+ ...boardId ? { boardId } : {},
177
+ ...taskId ? { taskId } : {},
178
+ ...policyRoot ? { policyRoot } : {},
179
+ ...leaseId ? { leaseId } : {}
180
+ };
181
+ }
182
+ async function extractCandidatePaths(toolName, input, ctx) {
183
+ if (toolName === "patch" && typeof input["patch"] === "string") {
184
+ const directoryInput = stringValue(input["directory"]) ?? ctx.workingDir;
185
+ const directory = path.isAbsolute(directoryInput) ? directoryInput : path.resolve(ctx.workingDir, directoryInput);
186
+ const strip = Math.max(1, numericValue(input["strip"]) ?? 1);
187
+ const targets = extractPatchTargets(input["patch"], strip).map(
188
+ (target) => relativeToProject(path.resolve(directory, target), ctx.projectRoot)
189
+ );
190
+ return Promise.all(targets.map((target) => canonicalizeCandidatePath(target, ctx)));
191
+ }
192
+ const values = [];
193
+ const pathKeys = new Set(PATH_KEYS);
194
+ for (const key of TOOL_PATH_KEYS[toolName] ?? []) pathKeys.add(key);
195
+ collectPathValues(input, values, pathKeys);
196
+ if (toolName === "scaffold" && typeof input["name"] === "string") {
197
+ const cwd = stringValue(input["cwd"]) ?? ctx.workingDir;
198
+ values.push(path.join(cwd, input["name"]));
199
+ }
200
+ const candidates = [
201
+ ...new Set(values.flatMap(splitPathList).map((value) => resolveInputPath(value, ctx)))
202
+ ];
203
+ return Promise.all(candidates.map((candidate) => canonicalizeCandidatePath(candidate, ctx)));
204
+ }
205
+ async function canonicalizeCandidatePath(candidate, ctx) {
206
+ if (path.isAbsolute(candidate)) return candidate;
207
+ const absolute = path.resolve(ctx.projectRoot, candidate);
208
+ const canonicalRoot = await realpath(ctx.projectRoot).catch(() => ctx.projectRoot);
209
+ let probe = absolute;
210
+ const missingSegments = [];
211
+ while (true) {
212
+ try {
213
+ const canonical = path.join(await realpath(probe), ...missingSegments);
214
+ return relativeToProject(canonical, canonicalRoot);
215
+ } catch (cause) {
216
+ const code = cause.code;
217
+ if (code !== "ENOENT" && code !== "ENOTDIR") return absolute;
218
+ const parent = path.dirname(probe);
219
+ if (parent === probe) return absolute;
220
+ missingSegments.unshift(path.basename(probe));
221
+ probe = parent;
222
+ }
223
+ }
224
+ }
225
+ function collectPathValues(value, output, pathKeys, key) {
226
+ if (typeof value === "string") {
227
+ if (key && pathKeys.has(key)) output.push(value);
228
+ return;
229
+ }
230
+ if (Array.isArray(value)) {
231
+ for (const item of value) collectPathValues(item, output, pathKeys, key);
232
+ return;
233
+ }
234
+ if (!value || typeof value !== "object") return;
235
+ for (const [childKey, child] of Object.entries(value)) {
236
+ collectPathValues(child, output, pathKeys, childKey);
237
+ }
238
+ }
239
+ function splitPathList(value) {
240
+ return value.split(",").map((item) => item.trim()).filter(Boolean);
241
+ }
242
+ function resolveInputPath(value, ctx) {
243
+ const absolute = path.isAbsolute(value) ? value : path.resolve(ctx.workingDir, value);
244
+ return relativeToProject(absolute, ctx.projectRoot);
245
+ }
246
+ function relativeToProject(absolute, projectRoot) {
247
+ const relative2 = path.relative(projectRoot, absolute).replace(/\\/g, "/");
248
+ return relative2.startsWith("../") || path.isAbsolute(relative2) ? absolute : relative2 || ".";
249
+ }
250
+ function extractPatchTargets(patchText, strip) {
251
+ const targets = [];
252
+ for (const match of patchText.matchAll(/^\+\+\+\s+([^\t\r\n]+)/gm)) {
253
+ const raw = match[1]?.trim();
254
+ if (!raw || raw === "/dev/null") continue;
255
+ const parts = raw.replace(/\\/g, "/").split("/").filter((part) => part && part !== ".");
256
+ if (parts.length > strip) targets.push(parts.slice(strip).join("/"));
257
+ }
258
+ return targets;
259
+ }
260
+ function stringValue(value) {
261
+ return typeof value === "string" && value.trim() ? value : void 0;
262
+ }
263
+ function numericValue(value) {
264
+ return typeof value === "number" && Number.isFinite(value) ? value : void 0;
265
+ }
266
+
267
+ // src/utils/lru-cache.ts
268
+ var LruCache = class {
269
+ store = /* @__PURE__ */ new Map();
270
+ capacity;
271
+ constructor(capacity) {
272
+ if (capacity < 1) throw new Error(`LruCache capacity must be >= 1, got ${capacity}`);
273
+ this.capacity = capacity;
274
+ }
275
+ get(key) {
276
+ if (!this.store.has(key)) return void 0;
277
+ const value = this.store.get(key);
278
+ this.store.delete(key);
279
+ this.store.set(key, value);
280
+ return value;
281
+ }
282
+ set(key, value) {
283
+ if (this.store.has(key)) this.store.delete(key);
284
+ this.store.set(key, value);
285
+ while (this.store.size > this.capacity) {
286
+ const oldest = this.store.keys().next();
287
+ if (oldest.done) break;
288
+ this.store.delete(oldest.value);
289
+ }
290
+ }
291
+ has(key) {
292
+ return this.store.has(key);
293
+ }
294
+ clear() {
295
+ this.store.clear();
296
+ }
297
+ get size() {
298
+ return this.store.size;
299
+ }
300
+ };
301
+
302
+ export {
303
+ LruCache,
304
+ setKanbanGovernance,
305
+ kanbanGovernance,
306
+ evaluateToolKanbanBoundary
307
+ };
308
+ //# sourceMappingURL=chunk-OOYZPOXM.js.map
@@ -0,0 +1,28 @@
1
+ import {
2
+ FsError
3
+ } from "./chunk-25LSLC3G.js";
4
+
5
+ // src/utils/atomic-write.ts
6
+ import {
7
+ createPersistencePrimitives
8
+ } from "@wrongstack/persistence";
9
+ var primitives = createPersistencePrimitives({
10
+ createLockTimeoutError: ({ targetPath, timeoutMs }) => new FsError({
11
+ message: `Timed out waiting for file lock: ${targetPath}`,
12
+ code: "FS_ATOMIC_WRITE_FAILED",
13
+ path: targetPath,
14
+ context: { timeoutMs }
15
+ })
16
+ });
17
+ var atomicWrite = primitives.atomicWrite;
18
+ var atomicReplaceWithWriter = primitives.atomicReplaceWithWriter;
19
+ var ensureDir = primitives.ensureDir;
20
+ var withFileLock = primitives.withFileLock;
21
+
22
+ export {
23
+ atomicWrite,
24
+ atomicReplaceWithWriter,
25
+ ensureDir,
26
+ withFileLock
27
+ };
28
+ //# sourceMappingURL=chunk-OSGLYW5J.js.map