@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,82 @@
1
+ // src/utils/merge-models-payload.ts
2
+ var REMOVE_PROVIDERS_KEY = "_removeProviders";
3
+ var REMOVE_MODELS_KEY = "_removeModels";
4
+ function mergeModelsPayload(base, overlay) {
5
+ const removeProviders = Array.isArray(overlay[REMOVE_PROVIDERS_KEY]) ? overlay[REMOVE_PROVIDERS_KEY] : [];
6
+ const removeModels = overlay[REMOVE_MODELS_KEY] && typeof overlay[REMOVE_MODELS_KEY] === "object" ? overlay[REMOVE_MODELS_KEY] : {};
7
+ const out = {};
8
+ for (const [id, provider] of Object.entries(base)) {
9
+ out[id] = cloneProvider(provider);
10
+ }
11
+ for (const [id, ovProvider] of Object.entries(overlay)) {
12
+ if (id === REMOVE_PROVIDERS_KEY || id === REMOVE_MODELS_KEY) continue;
13
+ const existing = out[id];
14
+ out[id] = existing ? mergeProvider(existing, ovProvider) : cloneProvider(ovProvider);
15
+ }
16
+ for (const providerId of removeProviders) {
17
+ delete out[providerId];
18
+ }
19
+ for (const [providerId, modelIds] of Object.entries(removeModels)) {
20
+ const provider = out[providerId];
21
+ if (!provider?.models) continue;
22
+ for (const modelId of modelIds) {
23
+ delete provider.models[modelId];
24
+ }
25
+ }
26
+ return out;
27
+ }
28
+ function mergeProvider(base, overlay) {
29
+ const models = {};
30
+ for (const [mid, m] of Object.entries(base.models ?? {})) {
31
+ models[mid] = { ...m };
32
+ }
33
+ for (const [mid, ovModel] of Object.entries(overlay.models ?? {})) {
34
+ const existing = models[mid];
35
+ models[mid] = existing ? mergeModel(existing, ovModel) : { ...ovModel };
36
+ }
37
+ return {
38
+ ...base,
39
+ // Overlay scalar fields win when explicitly provided; otherwise keep base.
40
+ ...stripUndefined({
41
+ id: overlay.id,
42
+ name: overlay.name,
43
+ npm: overlay.npm,
44
+ api: overlay.api,
45
+ env: overlay.env,
46
+ doc: overlay.doc
47
+ }),
48
+ models
49
+ };
50
+ }
51
+ function mergeModel(base, overlay) {
52
+ const merged = { ...base, ...overlay };
53
+ if (base.limit || overlay.limit) {
54
+ merged.limit = { ...base.limit, ...overlay.limit };
55
+ }
56
+ if (base.cost || overlay.cost) {
57
+ merged.cost = { ...base.cost, ...overlay.cost };
58
+ }
59
+ if (base.modalities || overlay.modalities) {
60
+ merged.modalities = { ...base.modalities, ...overlay.modalities };
61
+ }
62
+ return merged;
63
+ }
64
+ function cloneProvider(p) {
65
+ const models = {};
66
+ for (const [mid, m] of Object.entries(p.models ?? {})) {
67
+ models[mid] = { ...m };
68
+ }
69
+ return { ...p, models };
70
+ }
71
+ function stripUndefined(obj) {
72
+ const out = {};
73
+ for (const [k, v] of Object.entries(obj)) {
74
+ if (v !== void 0) out[k] = v;
75
+ }
76
+ return out;
77
+ }
78
+
79
+ export {
80
+ mergeModelsPayload
81
+ };
82
+ //# sourceMappingURL=chunk-EODDVJBM.js.map
@@ -0,0 +1,361 @@
1
+ import {
2
+ SESSION_CATALOG_MAX_FRAME_CHARS,
3
+ SESSION_CATALOG_PROTOCOL_VERSION,
4
+ encodeSessionCatalogMessage,
5
+ sessionCatalogProjectServerEndpoint,
6
+ sessionCatalogProjectServerMetadataPath
7
+ } from "./chunk-AYW5YINX.js";
8
+
9
+ // src/session-catalog/client.ts
10
+ import { spawn } from "node:child_process";
11
+ import * as fs from "node:fs";
12
+ import * as net from "node:net";
13
+ import * as path from "node:path";
14
+ import { fileURLToPath } from "node:url";
15
+ var CONNECT_TIMEOUT_MS = 750;
16
+ var START_TIMEOUT_MS = 1e4;
17
+ var CALL_TIMEOUT_MS = 3e4;
18
+ var MAX_PENDING_REQUESTS = 1024;
19
+ var MAX_EVENT_LISTENERS = 64;
20
+ function locateServer(moduleUrl, exists) {
21
+ for (const candidate of [
22
+ "./project-server.js",
23
+ "../session-catalog/project-server.js",
24
+ "./session-catalog/project-server.js",
25
+ "../../dist/session-catalog/project-server.js"
26
+ ]) {
27
+ try {
28
+ const url = new URL(candidate, moduleUrl);
29
+ if (url.protocol === "file:" && exists(fileURLToPath(url))) return url;
30
+ } catch {
31
+ }
32
+ }
33
+ return null;
34
+ }
35
+ function resolveSessionCatalogDaemonAvailability(moduleUrl = import.meta.url, exists = fs.existsSync) {
36
+ if (process.env["WRONGSTACK_SESSION_CATALOG_INLINE"] || process.env["WRONGSTACK_SESSION_CATALOG_SERVER"] === "0")
37
+ return { kind: "inline-requested" };
38
+ const url = locateServer(moduleUrl, exists);
39
+ return url ? { kind: "available", url } : { kind: "missing-build" };
40
+ }
41
+ function resolveSessionCatalogProjectServerUrl(moduleUrl = import.meta.url, exists = fs.existsSync) {
42
+ const availability = resolveSessionCatalogDaemonAvailability(moduleUrl, exists);
43
+ return availability.kind === "available" ? availability.url : null;
44
+ }
45
+ function normalize(value) {
46
+ const resolved = path.resolve(value);
47
+ return process.platform === "win32" ? resolved.toLowerCase() : resolved;
48
+ }
49
+ function delay(ms) {
50
+ return new Promise((resolve2) => setTimeout(resolve2, ms));
51
+ }
52
+ var SessionCatalogProjectClient = class {
53
+ constructor(options) {
54
+ this.options = options;
55
+ this.endpoint = sessionCatalogProjectServerEndpoint(options.projectDir);
56
+ }
57
+ options;
58
+ endpoint;
59
+ socket = null;
60
+ info = null;
61
+ buffer = "";
62
+ connecting = null;
63
+ connectResolve = null;
64
+ connectReject = null;
65
+ authToken;
66
+ nextId = 1;
67
+ pending = /* @__PURE__ */ new Map();
68
+ eventListeners = /* @__PURE__ */ new Set();
69
+ reconnectTimer;
70
+ explicitlyClosed = false;
71
+ async call(op, args, options = {}) {
72
+ await this.ensureConnected(true);
73
+ return this.request({ type: "request", op, args }, options.timeoutMs ?? CALL_TIMEOUT_MS);
74
+ }
75
+ /**
76
+ * Call an already-running project daemon without starting one.
77
+ *
78
+ * Cross-project discovery must use this path: observing another project is
79
+ * never sufficient authority to wake that project's IPC owner.
80
+ */
81
+ async callExisting(op, args, options = {}) {
82
+ await this.ensureConnected(false);
83
+ return this.request({ type: "request", op, args }, options.timeoutMs ?? CALL_TIMEOUT_MS);
84
+ }
85
+ ping() {
86
+ return this.call("ping", {}, { timeoutMs: 3e3 });
87
+ }
88
+ async subscribe(listener) {
89
+ if (!this.eventListeners.has(listener) && this.eventListeners.size >= MAX_EVENT_LISTENERS) {
90
+ throw new Error(`Session Catalog listener limit reached (${MAX_EVENT_LISTENERS})`);
91
+ }
92
+ this.explicitlyClosed = false;
93
+ this.eventListeners.add(listener);
94
+ try {
95
+ await this.call("subscribe", {});
96
+ } catch (error) {
97
+ this.eventListeners.delete(listener);
98
+ throw error;
99
+ }
100
+ return async () => {
101
+ this.eventListeners.delete(listener);
102
+ if (this.eventListeners.size === 0)
103
+ await this.callExisting("unsubscribe", {}).catch(() => void 0);
104
+ };
105
+ }
106
+ async shutdown(reason) {
107
+ try {
108
+ await this.ensureConnected(false);
109
+ } catch {
110
+ return { stopped: false };
111
+ }
112
+ const result = await this.request({ type: "shutdown", ...reason !== void 0 ? { reason } : {} }, 5e3).catch(
113
+ () => ({ stopped: false })
114
+ );
115
+ if (result.stopped) {
116
+ const metadataPath = sessionCatalogProjectServerMetadataPath(this.options.projectDir);
117
+ const deadline = Date.now() + 5e3;
118
+ while (fs.existsSync(metadataPath) && Date.now() < deadline) await delay(20);
119
+ if (result.pid && result.pid !== process.pid) {
120
+ while (Date.now() < deadline) {
121
+ try {
122
+ process.kill(result.pid, 0);
123
+ await delay(20);
124
+ } catch {
125
+ break;
126
+ }
127
+ }
128
+ }
129
+ }
130
+ return result;
131
+ }
132
+ async close() {
133
+ this.explicitlyClosed = true;
134
+ if (this.reconnectTimer) clearTimeout(this.reconnectTimer);
135
+ this.reconnectTimer = void 0;
136
+ const socket = this.socket;
137
+ this.socket = null;
138
+ this.info = null;
139
+ if (socket && !socket.destroyed)
140
+ await new Promise((resolve2) => {
141
+ socket.once("close", resolve2);
142
+ socket.end();
143
+ });
144
+ }
145
+ async ensureConnected(spawnIfMissing) {
146
+ if (this.socket && !this.socket.destroyed && this.info) return;
147
+ if (this.connecting) return this.connecting;
148
+ this.connecting = this.connectWithElection(spawnIfMissing).finally(() => {
149
+ this.connecting = null;
150
+ });
151
+ return this.connecting;
152
+ }
153
+ async connectWithElection(spawnIfMissing) {
154
+ const deadline = Date.now() + (spawnIfMissing ? START_TIMEOUT_MS : CONNECT_TIMEOUT_MS);
155
+ let spawned = false;
156
+ let lastError = new Error("Session Catalog project server unavailable");
157
+ while (Date.now() < deadline) {
158
+ try {
159
+ await this.connectOnce();
160
+ return;
161
+ } catch (error) {
162
+ lastError = error;
163
+ }
164
+ if (!spawnIfMissing) break;
165
+ if (!spawned) {
166
+ this.spawnDetached();
167
+ spawned = true;
168
+ }
169
+ await delay(75);
170
+ }
171
+ throw lastError;
172
+ }
173
+ connectOnce() {
174
+ this.socket?.destroy();
175
+ this.socket = null;
176
+ this.info = null;
177
+ this.authToken = void 0;
178
+ this.buffer = "";
179
+ return new Promise((resolve2, reject) => {
180
+ const socket = net.createConnection(this.endpoint);
181
+ this.socket = socket;
182
+ socket.setEncoding("utf8");
183
+ const timer = setTimeout(() => {
184
+ reject(new Error("Session Catalog handshake timed out"));
185
+ socket.destroy();
186
+ }, CONNECT_TIMEOUT_MS);
187
+ timer.unref?.();
188
+ this.connectResolve = () => {
189
+ clearTimeout(timer);
190
+ this.connectResolve = null;
191
+ this.connectReject = null;
192
+ resolve2();
193
+ };
194
+ this.connectReject = (error) => {
195
+ clearTimeout(timer);
196
+ this.connectResolve = null;
197
+ this.connectReject = null;
198
+ reject(error);
199
+ };
200
+ socket.on("data", (chunk) => this.onData(socket, chunk));
201
+ socket.on("error", (error) => {
202
+ if (!this.info) this.connectReject?.(error);
203
+ });
204
+ socket.on("close", () => this.onClose(socket));
205
+ });
206
+ }
207
+ currentAuthToken() {
208
+ if (this.authToken === void 0) {
209
+ try {
210
+ const parsed = JSON.parse(
211
+ fs.readFileSync(sessionCatalogProjectServerMetadataPath(this.options.projectDir), "utf8")
212
+ );
213
+ if (typeof parsed.authToken === "string" && parsed.authToken)
214
+ this.authToken = parsed.authToken;
215
+ } catch {
216
+ }
217
+ }
218
+ return this.authToken;
219
+ }
220
+ request(message, timeoutMs) {
221
+ const socket = this.socket;
222
+ if (!socket || socket.destroyed)
223
+ return Promise.reject(new Error("Session Catalog connection is unavailable"));
224
+ const id = this.nextId++;
225
+ if (this.pending.size >= MAX_PENDING_REQUESTS) {
226
+ return Promise.reject(
227
+ new Error(`Session Catalog pending request limit reached (${MAX_PENDING_REQUESTS})`)
228
+ );
229
+ }
230
+ const encoded = encodeSessionCatalogMessage({
231
+ ...message,
232
+ id,
233
+ authToken: this.currentAuthToken()
234
+ });
235
+ if (encoded.length > SESSION_CATALOG_MAX_FRAME_CHARS)
236
+ return Promise.reject(new Error("Session Catalog request exceeded frame limit"));
237
+ return new Promise((resolve2, reject) => {
238
+ const timer = setTimeout(() => {
239
+ const pending = this.pending.get(id);
240
+ if (!pending) return;
241
+ this.pending.delete(id);
242
+ pending.reject(
243
+ new Error(
244
+ `Session Catalog ${message.type === "request" ? message.op : message.type} timed out`
245
+ )
246
+ );
247
+ }, timeoutMs);
248
+ timer.unref?.();
249
+ this.pending.set(id, { resolve: resolve2, reject, timer });
250
+ socket.write(encoded);
251
+ });
252
+ }
253
+ onData(socket, chunk) {
254
+ if (socket !== this.socket) return;
255
+ this.buffer += chunk;
256
+ if (this.buffer.length > SESSION_CATALOG_MAX_FRAME_CHARS) {
257
+ socket.destroy(new Error("Session Catalog response exceeded frame limit"));
258
+ return;
259
+ }
260
+ while (true) {
261
+ const newline = this.buffer.indexOf("\n");
262
+ if (newline < 0) return;
263
+ const line = this.buffer.slice(0, newline);
264
+ this.buffer = this.buffer.slice(newline + 1);
265
+ if (!line) continue;
266
+ try {
267
+ this.onMessage(JSON.parse(line));
268
+ } catch {
269
+ socket.destroy(new Error("Invalid Session Catalog response"));
270
+ return;
271
+ }
272
+ }
273
+ }
274
+ onMessage(message) {
275
+ if (message.type === "hello") {
276
+ if (message.protocolVersion !== SESSION_CATALOG_PROTOCOL_VERSION) {
277
+ this.connectReject?.(
278
+ new Error(
279
+ `Session Catalog protocol mismatch: client=${SESSION_CATALOG_PROTOCOL_VERSION}, server=${message.protocolVersion}`
280
+ )
281
+ );
282
+ this.socket?.destroy();
283
+ return;
284
+ }
285
+ if (normalize(message.projectDir) !== normalize(this.options.projectDir) || normalize(message.projectRoot) !== normalize(this.options.projectRoot)) {
286
+ this.connectReject?.(new Error("Session Catalog project identity mismatch"));
287
+ this.socket?.destroy();
288
+ return;
289
+ }
290
+ this.info = message;
291
+ this.connectResolve?.();
292
+ return;
293
+ }
294
+ if (message.type === "event") {
295
+ for (const listener of this.eventListeners) {
296
+ try {
297
+ listener(message.event);
298
+ } catch {
299
+ }
300
+ }
301
+ return;
302
+ }
303
+ const pending = this.pending.get(message.id);
304
+ if (!pending) return;
305
+ this.pending.delete(message.id);
306
+ clearTimeout(pending.timer);
307
+ if (message.ok) pending.resolve(message.result);
308
+ else {
309
+ const error = new Error(message.error);
310
+ if (message.errorName) error.name = message.errorName;
311
+ pending.reject(error);
312
+ }
313
+ }
314
+ onClose(socket) {
315
+ if (socket !== this.socket) return;
316
+ this.socket = null;
317
+ this.info = null;
318
+ this.authToken = void 0;
319
+ const error = new Error("Session Catalog connection closed");
320
+ this.connectReject?.(error);
321
+ this.connectResolve = null;
322
+ this.connectReject = null;
323
+ for (const pending of this.pending.values()) {
324
+ clearTimeout(pending.timer);
325
+ pending.reject(error);
326
+ }
327
+ this.pending.clear();
328
+ this.scheduleSubscriptionReconnect();
329
+ }
330
+ scheduleSubscriptionReconnect() {
331
+ if (this.explicitlyClosed || this.eventListeners.size === 0 || this.reconnectTimer) return;
332
+ this.reconnectTimer = setTimeout(() => {
333
+ this.reconnectTimer = void 0;
334
+ void this.call("subscribe", {}).catch(() => this.scheduleSubscriptionReconnect());
335
+ }, 250);
336
+ this.reconnectTimer.unref?.();
337
+ }
338
+ spawnDetached() {
339
+ const url = resolveSessionCatalogProjectServerUrl();
340
+ if (!url) throw new Error("Built Session Catalog project server is unavailable");
341
+ const child = spawn(
342
+ process.execPath,
343
+ [
344
+ fileURLToPath(url),
345
+ "--project-dir",
346
+ this.options.projectDir,
347
+ "--project-root",
348
+ this.options.projectRoot
349
+ ],
350
+ { detached: true, stdio: "ignore", windowsHide: true, env: process.env }
351
+ );
352
+ child.unref();
353
+ }
354
+ };
355
+
356
+ export {
357
+ resolveSessionCatalogDaemonAvailability,
358
+ resolveSessionCatalogProjectServerUrl,
359
+ SessionCatalogProjectClient
360
+ };
361
+ //# sourceMappingURL=chunk-F3JWNST7.js.map
@@ -0,0 +1,140 @@
1
+ // src/skills/frontmatter.ts
2
+ var SCALAR_KEYS = /* @__PURE__ */ new Set([
3
+ "name",
4
+ "description",
5
+ "trigger",
6
+ "version",
7
+ "license",
8
+ "compatibility"
9
+ ]);
10
+ function parseSkillFrontmatter(raw) {
11
+ const text = normalizeLineEndings(raw);
12
+ if (!text.startsWith("---")) return {};
13
+ const end = text.indexOf("\n---", 4);
14
+ if (end === -1) return {};
15
+ return parseFrontmatterBlock(text.slice(4, end));
16
+ }
17
+ function stripFrontmatter(raw) {
18
+ const text = normalizeLineEndings(raw);
19
+ if (!text.startsWith("---")) return text;
20
+ const end = text.indexOf("\n---", 4);
21
+ if (end === -1) return text;
22
+ let body = text.slice(end + 4);
23
+ if (body.startsWith("\n")) body = body.slice(1);
24
+ return body;
25
+ }
26
+ function normalizeLineEndings(s) {
27
+ return s.replace(/\r\n?/g, "\n");
28
+ }
29
+ function parseFrontmatterBlock(block) {
30
+ const out = {};
31
+ const lines = block.split("\n");
32
+ let i = 0;
33
+ while (i < lines.length) {
34
+ const line = lines[i] ?? "";
35
+ const m = /^([a-zA-Z][a-zA-Z0-9_-]*):\s*(.*)$/.exec(line);
36
+ if (!m) {
37
+ i++;
38
+ continue;
39
+ }
40
+ const key = m[1] ?? "";
41
+ const rest = (m[2] ?? "").trim();
42
+ if (key === "metadata") {
43
+ const map = {};
44
+ i++;
45
+ while (i < lines.length) {
46
+ const sub = lines[i] ?? "";
47
+ const sm = /^\s+([a-zA-Z0-9_.-]+):\s*(.*)$/.exec(sub);
48
+ if (!sm) break;
49
+ map[sm[1] ?? ""] = unquote((sm[2] ?? "").trim());
50
+ i++;
51
+ }
52
+ if (Object.keys(map).length > 0) out.metadata = map;
53
+ continue;
54
+ }
55
+ if (rest === "|" || rest === ">") {
56
+ const collected = [];
57
+ i++;
58
+ while (i < lines.length) {
59
+ const sub = lines[i] ?? "";
60
+ if (sub === "" || sub.startsWith(" ") || sub.startsWith(" ")) {
61
+ collected.push(sub.replace(/^\s+/, ""));
62
+ i++;
63
+ } else break;
64
+ }
65
+ out[normalizeKey(key)] = collected.join("\n").trim();
66
+ continue;
67
+ }
68
+ if (key === "allowed-tools" || key === "allowedTools" || key === "required-capabilities" || key === "requiredCapabilities" || key === "required-tools" || key === "requiredTools" || key === "optional-capabilities" || key === "optionalCapabilities") {
69
+ if (rest !== "") {
70
+ const values = rest.replace(/^\[/, "").replace(/\]$/, "").split(/[\s,]+/).map(unquote).filter(Boolean);
71
+ out[normalizeKey(key)] = values;
72
+ i++;
73
+ } else {
74
+ const values = [];
75
+ i++;
76
+ while (i < lines.length) {
77
+ const sub = lines[i] ?? "";
78
+ const bm = /^\s*-\s+(.*)$/.exec(sub);
79
+ if (bm) {
80
+ const val = unquote((bm[1] ?? "").trim());
81
+ if (val) values.push(val);
82
+ i++;
83
+ } else {
84
+ break;
85
+ }
86
+ }
87
+ out[normalizeKey(key)] = values;
88
+ }
89
+ continue;
90
+ }
91
+ if (SCALAR_KEYS.has(key)) {
92
+ out[key] = unquote(rest);
93
+ i++;
94
+ continue;
95
+ }
96
+ i++;
97
+ }
98
+ return out;
99
+ }
100
+ function normalizeKey(key) {
101
+ if (key === "allowed-tools") return "allowedTools";
102
+ if (key === "required-capabilities") return "requiredCapabilities";
103
+ if (key === "required-tools") return "requiredTools";
104
+ if (key === "optional-capabilities") return "optionalCapabilities";
105
+ return key;
106
+ }
107
+ function unquote(s) {
108
+ if (s.length >= 2 && (s.startsWith('"') && s.endsWith('"') || s.startsWith("'") && s.endsWith("'"))) {
109
+ return s.slice(1, -1);
110
+ }
111
+ return s;
112
+ }
113
+ function isValidSkillNameFormat(name) {
114
+ return name.length >= 1 && name.length <= 64 && /^[a-z0-9]+(-[a-z0-9]+)*$/.test(name);
115
+ }
116
+ function validateSkillName(name, parentDirName) {
117
+ const errors = [];
118
+ if (!name || name.trim().length === 0) {
119
+ errors.push("name is empty");
120
+ return errors;
121
+ }
122
+ if (name.length > 64) errors.push(`name is ${name.length} characters (max 64)`);
123
+ if (!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(name)) {
124
+ errors.push(
125
+ "name must be lowercase letters, digits, and single hyphens only (no leading/trailing/consecutive hyphens)"
126
+ );
127
+ }
128
+ if (parentDirName !== void 0 && name !== parentDirName) {
129
+ errors.push(`name "${name}" must match its parent directory "${parentDirName}"`);
130
+ }
131
+ return errors;
132
+ }
133
+
134
+ export {
135
+ parseSkillFrontmatter,
136
+ stripFrontmatter,
137
+ isValidSkillNameFormat,
138
+ validateSkillName
139
+ };
140
+ //# sourceMappingURL=chunk-FC2ZGRF3.js.map