@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,152 @@
1
+ // src/utils/wstack-paths.ts
2
+ import { createHash } from "node:crypto";
3
+ import * as fs from "node:fs";
4
+ import * as os from "node:os";
5
+ import * as path from "node:path";
6
+ function canonicalProjectRoot(absRoot) {
7
+ const checkoutRoot = path.resolve(absRoot);
8
+ const dotGit = path.join(checkoutRoot, ".git");
9
+ try {
10
+ if (!fs.statSync(dotGit).isFile()) return checkoutRoot;
11
+ const gitDirLine = fs.readFileSync(dotGit, "utf8").trim();
12
+ const match = /^gitdir:\s*(.+)$/i.exec(gitDirLine);
13
+ if (!match?.[1]) return checkoutRoot;
14
+ const gitDir = path.resolve(checkoutRoot, match[1].trim());
15
+ const commonDirFile = path.join(gitDir, "commondir");
16
+ if (!fs.statSync(commonDirFile).isFile()) return checkoutRoot;
17
+ const commonDir = path.resolve(gitDir, fs.readFileSync(commonDirFile, "utf8").trim());
18
+ const worktreesDir = path.dirname(gitDir);
19
+ if (path.basename(worktreesDir).toLowerCase() !== "worktrees") return checkoutRoot;
20
+ if (path.resolve(worktreesDir, "..") !== commonDir) return checkoutRoot;
21
+ if (path.basename(commonDir).toLowerCase() !== ".git") return checkoutRoot;
22
+ return path.dirname(commonDir);
23
+ } catch {
24
+ return checkoutRoot;
25
+ }
26
+ }
27
+ function projectHash(absRoot) {
28
+ return createHash("sha256").update(canonicalProjectRoot(absRoot)).digest("hex").slice(0, 12);
29
+ }
30
+ function projectSlug(absRoot) {
31
+ const identityRoot = canonicalProjectRoot(absRoot);
32
+ const base = slugify(path.basename(identityRoot));
33
+ const hash = createHash("sha256").update(identityRoot).digest("hex").slice(0, 6);
34
+ return `${base}-${hash}`;
35
+ }
36
+ function slugify(name) {
37
+ return name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 40) || "project";
38
+ }
39
+ function safeProfileName(name) {
40
+ const safe = (name ?? "").replace(/[/\\:]/g, "_").replace(/\.\./g, "_").trim();
41
+ return safe || "default";
42
+ }
43
+ function bootstrapProfileName(globalRoot) {
44
+ try {
45
+ const parsed = JSON.parse(fs.readFileSync(path.join(globalRoot, "config.json"), "utf8"));
46
+ return safeProfileName(
47
+ typeof parsed.activeProfile === "string" ? parsed.activeProfile : void 0
48
+ );
49
+ } catch {
50
+ return "default";
51
+ }
52
+ }
53
+ function wstackGlobalRoot() {
54
+ const fromEnv = process.env["WRONGSTACK_HOME"];
55
+ if (fromEnv && fromEnv.trim().length > 0) return path.resolve(fromEnv);
56
+ return path.join(os.homedir(), ".wrongstack");
57
+ }
58
+ function resolveWstackPaths(opts) {
59
+ const globalRoot = opts.globalRoot ?? (opts.userHome ? path.join(opts.userHome, ".wrongstack") : wstackGlobalRoot());
60
+ const homeDir = opts.userHome ?? os.homedir();
61
+ const profileName = safeProfileName(opts.profileName ?? bootstrapProfileName(globalRoot));
62
+ const profileDir = path.join(globalRoot, "profiles", profileName);
63
+ const hash = projectHash(opts.projectRoot);
64
+ const slug = projectSlug(opts.projectRoot);
65
+ const projectDir = path.join(globalRoot, "projects", slug);
66
+ return {
67
+ globalRoot,
68
+ profileName,
69
+ profileDir,
70
+ projectRoot: opts.projectRoot,
71
+ homeDir,
72
+ configDir: profileDir,
73
+ globalConfig: path.join(globalRoot, "config.json"),
74
+ profilesDir: path.join(globalRoot, "profiles"),
75
+ profileConfig: (name) => {
76
+ return path.join(globalRoot, "profiles", safeProfileName(name), "config.json");
77
+ },
78
+ profileStatuslineConfig: (name) => {
79
+ return path.join(globalRoot, "profiles", safeProfileName(name), "statusline.json");
80
+ },
81
+ profileModeConfig: (name) => {
82
+ return path.join(globalRoot, "profiles", safeProfileName(name), "mode.json");
83
+ },
84
+ profileProviderStatus: (name) => {
85
+ return path.join(globalRoot, "profiles", safeProfileName(name), "provider-status.json");
86
+ },
87
+ profileProviderAudit: (name) => {
88
+ return path.join(globalRoot, "profiles", safeProfileName(name), "provider-status-audit.jsonl");
89
+ },
90
+ profileUpdateCache: (name) => {
91
+ return path.join(globalRoot, "profiles", safeProfileName(name), "update-cache.json");
92
+ },
93
+ secretsKey: path.join(globalRoot, ".key"),
94
+ globalMemory: path.join(profileDir, "memory.md"),
95
+ globalSkills: path.join(profileDir, "skills"),
96
+ globalClaudeSkills: path.join(homeDir, ".claude", "skills"),
97
+ globalDesignKits: path.join(profileDir, "design-kits"),
98
+ globalPrompts: path.join(profileDir, "prompts"),
99
+ globalInstructions: path.join(profileDir, "instructions"),
100
+ promptUsage: path.join(profileDir, "prompt-usage.json"),
101
+ cacheDir: path.join(globalRoot, "cache"),
102
+ modelsCache: path.join(globalRoot, "cache", "models.dev.json"),
103
+ modelsOverlayCache: path.join(globalRoot, "cache", "models-overlay.json"),
104
+ historyFile: path.join(profileDir, "history"),
105
+ logFile: path.join(globalRoot, "logs", "wrongstack.log"),
106
+ projectDir,
107
+ projectCodebaseIndex: path.join(projectDir, "codebase-index"),
108
+ projectMemory: path.join(projectDir, "memory.md"),
109
+ projectSessions: path.join(projectDir, "sessions"),
110
+ projectTrust: path.join(projectDir, "trust.json"),
111
+ projectMeta: path.join(projectDir, "meta.json"),
112
+ projectLocalConfig: path.join(projectDir, "config.local.json"),
113
+ inProjectConfig: path.join(opts.projectRoot, ".wrongstack", "config.json"),
114
+ inProjectAgentsFile: path.join(opts.projectRoot, ".wrongstack", "AGENTS.md"),
115
+ inProjectSkills: path.join(opts.projectRoot, ".wrongstack", "skills"),
116
+ inProjectClaudeSkills: path.join(opts.projectRoot, ".claude", "skills"),
117
+ inProjectPrompts: path.join(opts.projectRoot, ".wrongstack", "prompts"),
118
+ inProjectInstructions: path.join(opts.projectRoot, ".wrongstack", "instructions"),
119
+ inProjectDesignKits: path.join(opts.projectRoot, ".wrongstack", "design-kits"),
120
+ inProjectWorktrees: path.join(opts.projectRoot, ".wrongstack", "worktrees"),
121
+ projectHash: hash,
122
+ projectSlug: slug,
123
+ projectGoal: path.join(projectDir, "goal.json"),
124
+ projectInputHistory: path.join(projectDir, "input-history.json"),
125
+ projectSpecs: path.join(projectDir, "specs"),
126
+ projectTaskGraphs: path.join(projectDir, "task-graphs"),
127
+ projectSddSession: path.join(projectDir, "sdd-session.json"),
128
+ projectPlan: path.join(projectDir, "plan.json"),
129
+ projectAutophase: path.join(projectDir, "autophase"),
130
+ projectSddBoards: path.join(projectDir, "sdd-boards"),
131
+ projectRequirementIntakes: path.join(projectDir, "requirement-intakes"),
132
+ syncConfig: path.join(profileDir, "sync.json"),
133
+ configHistoryDir: path.join(globalRoot, "config-history"),
134
+ projectStatus: (statusProjectSlug) => {
135
+ if (!/^[a-z0-9](?:[a-z0-9-]{0,39})-[a-f0-9]{6}$/.test(statusProjectSlug)) {
136
+ throw new Error(`Invalid project slug: ${statusProjectSlug}`);
137
+ }
138
+ return path.join(globalRoot, "projects", statusProjectSlug, "status.json");
139
+ }
140
+ };
141
+ }
142
+
143
+ export {
144
+ canonicalProjectRoot,
145
+ projectHash,
146
+ projectSlug,
147
+ safeProfileName,
148
+ bootstrapProfileName,
149
+ wstackGlobalRoot,
150
+ resolveWstackPaths
151
+ };
152
+ //# sourceMappingURL=chunk-SAFHACFA.js.map
@@ -0,0 +1,41 @@
1
+ // src/core/btw.ts
2
+ var META_KEY = "_btwNotes";
3
+ var MAX_PENDING = 20;
4
+ function readQueue(ctx) {
5
+ const raw = ctx.meta[META_KEY];
6
+ return Array.isArray(raw) ? raw : [];
7
+ }
8
+ function setBtwNote(ctx, text) {
9
+ const trimmed = text.trim();
10
+ if (!trimmed) return readQueue(ctx).length;
11
+ const next = [...readQueue(ctx), trimmed].slice(-MAX_PENDING);
12
+ ctx.meta[META_KEY] = next;
13
+ return next.length;
14
+ }
15
+ function pendingBtwCount(ctx) {
16
+ return readQueue(ctx).length;
17
+ }
18
+ function consumeBtwNotes(ctx) {
19
+ const notes = readQueue(ctx);
20
+ if (notes.length > 0) delete ctx.meta[META_KEY];
21
+ return notes;
22
+ }
23
+ function buildBtwBlock(notes) {
24
+ const body = notes.map((n) => `- ${n}`).join("\n");
25
+ return [
26
+ "[BY THE WAY \u2014 the user added this while you were working. Fold it into",
27
+ "your current task; do not restart from scratch unless it contradicts the",
28
+ "goal:",
29
+ "",
30
+ body,
31
+ "]"
32
+ ].join("\n");
33
+ }
34
+
35
+ export {
36
+ setBtwNote,
37
+ pendingBtwCount,
38
+ consumeBtwNotes,
39
+ buildBtwBlock
40
+ };
41
+ //# sourceMappingURL=chunk-SQJVFEBV.js.map
@@ -0,0 +1,49 @@
1
+ // src/utils/sage-output-block.ts
2
+ var SAGE_INJECTOR_HEADINGS = /* @__PURE__ */ new Set([
3
+ "--- SAGE: task-aware project knowledge (Memory Injector) ---",
4
+ "--- SAGE: related project knowledge (Memory Injector) ---"
5
+ ]);
6
+ var SAGE_MEMORY_LINE = /^- \[[^\]]+\](?:\[[^\]]+\])* <memory id="[^"]+">.*<\/memory>(?: .*)?$/;
7
+ var SAGE_MEMORY_LINE_TRUNCATED = /^- \[[^\]]+\](?:\[[^\]]+\])* <memory id="[^"]+">.*…$/;
8
+ function splitSageOutputBlock(output) {
9
+ if (!output.includes("--- SAGE: ")) return { body: output, sageLines: [] };
10
+ const lines = output.split("\n");
11
+ for (let sageIdx = lines.length - 1; sageIdx >= 0; sageIdx--) {
12
+ if (!SAGE_INJECTOR_HEADINGS.has(lines[sageIdx] ?? "")) continue;
13
+ const candidate = lines.slice(sageIdx);
14
+ if (candidate.length < 2) continue;
15
+ const memoryLines = candidate.slice(1).filter((line) => line.trim().length > 0);
16
+ if (memoryLines.length === 0) continue;
17
+ const bodyOk = memoryLines.every(
18
+ (line, index) => SAGE_MEMORY_LINE.test(line) || index === memoryLines.length - 1 && SAGE_MEMORY_LINE_TRUNCATED.test(line)
19
+ );
20
+ if (!bodyOk) continue;
21
+ let end = candidate.length;
22
+ while (end > 1 && candidate[end - 1].trim().length === 0) end--;
23
+ return {
24
+ body: lines.slice(0, sageIdx).join("\n").trimEnd(),
25
+ sageLines: candidate.slice(0, end)
26
+ };
27
+ }
28
+ return { body: output, sageLines: [] };
29
+ }
30
+ function capSageLines(sageLines, maxChars) {
31
+ if (sageLines.length < 2) return [];
32
+ const header = sageLines[0];
33
+ if (header.length >= maxChars) return [];
34
+ const out = [header];
35
+ let used = header.length;
36
+ for (const line of sageLines.slice(1)) {
37
+ if (used + 1 + line.length > maxChars) break;
38
+ out.push(line);
39
+ used += 1 + line.length;
40
+ }
41
+ return out.length > 1 ? out : [];
42
+ }
43
+
44
+ export {
45
+ SAGE_INJECTOR_HEADINGS,
46
+ splitSageOutputBlock,
47
+ capSageLines
48
+ };
49
+ //# sourceMappingURL=chunk-SVT4RNTR.js.map
@@ -0,0 +1,43 @@
1
+ // src/replay/hash.ts
2
+ import { createHash } from "node:crypto";
3
+ function stableStringify(value) {
4
+ return JSON.stringify(sortKeys(value));
5
+ }
6
+ function sortKeys(value) {
7
+ if (Array.isArray(value)) return value.map(sortKeys);
8
+ if (value && typeof value === "object") {
9
+ const obj = value;
10
+ const sorted = {};
11
+ for (const key of Object.keys(obj).sort()) {
12
+ sorted[key] = sortKeys(obj[key]);
13
+ }
14
+ return sorted;
15
+ }
16
+ return value;
17
+ }
18
+ function semanticMessage(message) {
19
+ const { ts: _ts, _estTokens: _estimate, origin: _origin, ...semantic } = message;
20
+ return semantic;
21
+ }
22
+ function hashRequest(request) {
23
+ const payload = {
24
+ model: request.model,
25
+ system: request.system,
26
+ messages: request.messages.map(semanticMessage),
27
+ tools: request.tools,
28
+ maxTokens: request.maxTokens,
29
+ temperature: request.temperature,
30
+ topP: request.topP,
31
+ stopSequences: request.stopSequences,
32
+ toolChoice: request.toolChoice
33
+ };
34
+ const json = stableStringify(payload);
35
+ const digest = createHash("sha256").update(json, "utf8").digest("hex");
36
+ return `sha256:${digest}`;
37
+ }
38
+
39
+ export {
40
+ stableStringify,
41
+ hashRequest
42
+ };
43
+ //# sourceMappingURL=chunk-SWUFN7XM.js.map
@@ -0,0 +1,174 @@
1
+ // src/security/permission-policy-schema.ts
2
+ var TRUST_POLICY_SCHEMA_VERSION = 1;
3
+ var TRUST_POLICY_LIMITS = Object.freeze({
4
+ maxTools: 1e3,
5
+ maxPatternsPerRule: 1e3,
6
+ maxToolNameChars: 256,
7
+ maxPatternChars: 4096
8
+ });
9
+ var TRUST_POLICY_JSON_SCHEMA = Object.freeze({
10
+ $schema: "https://json-schema.org/draft/2020-12/schema",
11
+ $id: "https://wrongstack.dev/schemas/trust-policy-v1.json",
12
+ title: "WrongStack Trust Policy",
13
+ type: "object",
14
+ maxProperties: TRUST_POLICY_LIMITS.maxTools,
15
+ propertyNames: {
16
+ minLength: 1,
17
+ maxLength: TRUST_POLICY_LIMITS.maxToolNameChars,
18
+ not: { enum: ["__proto__", "prototype", "constructor"] }
19
+ },
20
+ additionalProperties: {
21
+ type: "object",
22
+ additionalProperties: false,
23
+ properties: {
24
+ allow: {
25
+ type: "array",
26
+ maxItems: TRUST_POLICY_LIMITS.maxPatternsPerRule,
27
+ items: { type: "string", minLength: 1, maxLength: TRUST_POLICY_LIMITS.maxPatternChars }
28
+ },
29
+ deny: {
30
+ type: "array",
31
+ maxItems: TRUST_POLICY_LIMITS.maxPatternsPerRule,
32
+ items: { type: "string", minLength: 1, maxLength: TRUST_POLICY_LIMITS.maxPatternChars }
33
+ },
34
+ auto: { type: "boolean" },
35
+ trustWorkdir: { type: "boolean" },
36
+ denyPrivate: { type: "boolean" }
37
+ }
38
+ }
39
+ });
40
+ var RULE_FIELDS = /* @__PURE__ */ new Set(["allow", "deny", "auto", "trustWorkdir", "denyPrivate"]);
41
+ var UNSAFE_PROPERTY_NAMES = /* @__PURE__ */ new Set(["__proto__", "prototype", "constructor"]);
42
+ function isRecord(value) {
43
+ return typeof value === "object" && value !== null && !Array.isArray(value);
44
+ }
45
+ function error(diagnostics, code, path, message) {
46
+ diagnostics.push({ severity: "error", code, path, message });
47
+ }
48
+ function validatePatterns(value, path, diagnostics) {
49
+ if (!Array.isArray(value)) {
50
+ error(diagnostics, "invalid_pattern_list", path, "must be an array of strings");
51
+ return void 0;
52
+ }
53
+ if (value.length > TRUST_POLICY_LIMITS.maxPatternsPerRule) {
54
+ error(
55
+ diagnostics,
56
+ "too_many_patterns",
57
+ path,
58
+ `must contain at most ${TRUST_POLICY_LIMITS.maxPatternsPerRule} patterns`
59
+ );
60
+ return void 0;
61
+ }
62
+ const patterns = [];
63
+ const seen = /* @__PURE__ */ new Set();
64
+ for (const [index, pattern] of value.entries()) {
65
+ const itemPath = `${path}[${index}]`;
66
+ if (typeof pattern !== "string" || pattern.length === 0 || pattern.length > TRUST_POLICY_LIMITS.maxPatternChars) {
67
+ error(
68
+ diagnostics,
69
+ "invalid_pattern",
70
+ itemPath,
71
+ `must be a non-empty string up to ${TRUST_POLICY_LIMITS.maxPatternChars} characters`
72
+ );
73
+ continue;
74
+ }
75
+ if (seen.has(pattern)) {
76
+ diagnostics.push({
77
+ severity: "warning",
78
+ code: "duplicate_pattern",
79
+ path: itemPath,
80
+ message: "duplicates an earlier pattern and was normalized away"
81
+ });
82
+ continue;
83
+ }
84
+ seen.add(pattern);
85
+ patterns.push(pattern);
86
+ }
87
+ return patterns;
88
+ }
89
+ function validateTrustPolicy(value) {
90
+ const diagnostics = [];
91
+ if (!isRecord(value)) {
92
+ return {
93
+ ok: false,
94
+ diagnostics: [
95
+ {
96
+ severity: "error",
97
+ code: "invalid_root",
98
+ path: "$",
99
+ message: "trust policy must be an object"
100
+ }
101
+ ]
102
+ };
103
+ }
104
+ const entries = Object.entries(value);
105
+ if (entries.length > TRUST_POLICY_LIMITS.maxTools) {
106
+ error(
107
+ diagnostics,
108
+ "too_many_tools",
109
+ "$",
110
+ `must contain at most ${TRUST_POLICY_LIMITS.maxTools} tool rules`
111
+ );
112
+ }
113
+ const policy = {};
114
+ for (const [toolName, rawRule] of entries.slice(0, TRUST_POLICY_LIMITS.maxTools)) {
115
+ const toolPath = `$[${JSON.stringify(toolName)}]`;
116
+ if (toolName.length === 0 || toolName.length > TRUST_POLICY_LIMITS.maxToolNameChars) {
117
+ error(
118
+ diagnostics,
119
+ "invalid_tool_name",
120
+ toolPath,
121
+ `tool name must be 1-${TRUST_POLICY_LIMITS.maxToolNameChars} characters`
122
+ );
123
+ continue;
124
+ }
125
+ if (UNSAFE_PROPERTY_NAMES.has(toolName)) {
126
+ error(
127
+ diagnostics,
128
+ "unsafe_tool_name",
129
+ toolPath,
130
+ "reserved object property names are not valid tool rules"
131
+ );
132
+ continue;
133
+ }
134
+ if (!isRecord(rawRule)) {
135
+ error(diagnostics, "invalid_rule", toolPath, "tool rule must be an object");
136
+ continue;
137
+ }
138
+ for (const field of Object.keys(rawRule)) {
139
+ if (!RULE_FIELDS.has(field)) {
140
+ error(
141
+ diagnostics,
142
+ "unknown_field",
143
+ `${toolPath}.${field}`,
144
+ `unknown policy field "${field}"`
145
+ );
146
+ }
147
+ }
148
+ const rule = {};
149
+ for (const field of ["allow", "deny"]) {
150
+ if (rawRule[field] === void 0) continue;
151
+ const patterns = validatePatterns(rawRule[field], `${toolPath}.${field}`, diagnostics);
152
+ if (patterns) rule[field] = patterns;
153
+ }
154
+ for (const field of ["auto", "trustWorkdir", "denyPrivate"]) {
155
+ const setting = rawRule[field];
156
+ if (setting === void 0) continue;
157
+ if (typeof setting !== "boolean") {
158
+ error(diagnostics, "invalid_boolean", `${toolPath}.${field}`, "must be a boolean");
159
+ } else {
160
+ rule[field] = setting;
161
+ }
162
+ }
163
+ policy[toolName] = rule;
164
+ }
165
+ return diagnostics.some((diagnostic) => diagnostic.severity === "error") ? { ok: false, diagnostics } : { ok: true, policy, diagnostics };
166
+ }
167
+
168
+ export {
169
+ TRUST_POLICY_SCHEMA_VERSION,
170
+ TRUST_POLICY_LIMITS,
171
+ TRUST_POLICY_JSON_SCHEMA,
172
+ validateTrustPolicy
173
+ };
174
+ //# sourceMappingURL=chunk-SXMVYC5H.js.map
@@ -0,0 +1,23 @@
1
+ // src/storage/storage-concurrency.ts
2
+ async function mapWithConcurrency(items, concurrency, mapper) {
3
+ if (items.length === 0) return [];
4
+ const limit = Math.max(1, Math.floor(concurrency));
5
+ const results = new Array(items.length);
6
+ let next = 0;
7
+ async function worker() {
8
+ while (true) {
9
+ const index = next;
10
+ next++;
11
+ if (index >= items.length) return;
12
+ results[index] = await mapper(items[index], index);
13
+ }
14
+ }
15
+ const workers = Array.from({ length: Math.min(limit, items.length) }, () => worker());
16
+ await Promise.all(workers);
17
+ return results;
18
+ }
19
+
20
+ export {
21
+ mapWithConcurrency
22
+ };
23
+ //# sourceMappingURL=chunk-SZ6AYUIZ.js.map
@@ -0,0 +1,9 @@
1
+ // src/utils/error.ts
2
+ function toErrorMessage(err) {
3
+ return err instanceof Error ? err.message : String(err);
4
+ }
5
+
6
+ export {
7
+ toErrorMessage
8
+ };
9
+ //# sourceMappingURL=chunk-TBRL2RCC.js.map