@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,217 @@
1
+ // src/wiring/proxy-rewrite.ts
2
+ var PROXY_PATH_PREFIX = "/proxy/";
3
+ var PROXY_EXCLUDED_PROVIDERS = /* @__PURE__ */ new Set(["openai-codex"]);
4
+ function isProxyEligible(providerId) {
5
+ if (!providerId) return false;
6
+ if (PROXY_EXCLUDED_PROVIDERS.has(providerId)) return false;
7
+ return true;
8
+ }
9
+ function rewriteBaseUrl(originalBaseUrl, proxyUrl) {
10
+ if (!originalBaseUrl) return void 0;
11
+ if (!proxyUrl) return originalBaseUrl;
12
+ if (!isProxyEligibleForRewrite(originalBaseUrl, proxyUrl)) return originalBaseUrl;
13
+ return composeRewrittenUrl(originalBaseUrl, proxyUrl);
14
+ }
15
+ function isProxyEligibleForRewrite(originalBaseUrl, proxyUrl) {
16
+ if (!originalBaseUrl.includes("://")) return false;
17
+ if (!proxyUrl.includes("://")) return false;
18
+ const normalizedProxy = proxyUrl.replace(/\/+$/, "");
19
+ if (originalBaseUrl.startsWith(`${normalizedProxy}${PROXY_PATH_PREFIX}`)) {
20
+ return false;
21
+ }
22
+ try {
23
+ const parsed = new URL(originalBaseUrl);
24
+ const isLoopback = parsed.hostname === "localhost" || parsed.hostname === "127.0.0.1" || // WHATWG URL serializes IPv6 hosts with brackets — `[::1]`, not `::1`.
25
+ parsed.hostname === "[::1]";
26
+ if (isLoopback && parsed.port !== "") return false;
27
+ } catch {
28
+ }
29
+ return true;
30
+ }
31
+ function composeRewrittenUrl(originalBaseUrl, proxyUrl) {
32
+ let parsedOriginal;
33
+ try {
34
+ parsedOriginal = new URL(originalBaseUrl);
35
+ } catch {
36
+ return originalBaseUrl;
37
+ }
38
+ const hostAndPath = `${parsedOriginal.host}${parsedOriginal.pathname}`;
39
+ const trailingQuery = parsedOriginal.search || "";
40
+ const trailingHash = parsedOriginal.hash || "";
41
+ const proxyRoot = proxyUrl.replace(/\/+$/, "");
42
+ return `${proxyRoot}${PROXY_PATH_PREFIX}${hostAndPath}${trailingQuery}${trailingHash}`;
43
+ }
44
+ var DEFAULT_PROXY_CONFIG = { enabled: false, url: "", active: false };
45
+ var currentConfig = { ...DEFAULT_PROXY_CONFIG };
46
+ var proxyTransitionLogger;
47
+ function setProxyTransitionLogger(logger) {
48
+ proxyTransitionLogger = logger;
49
+ }
50
+ function sanitizeUrlForLog(raw) {
51
+ if (!raw) return "";
52
+ try {
53
+ const parsed = new URL(raw);
54
+ return `${parsed.protocol}//${parsed.host}${parsed.pathname}`;
55
+ } catch {
56
+ const cut = raw.search(/[?#\x00-\x1f\x7f]/);
57
+ return cut >= 0 ? raw.slice(0, cut) : raw;
58
+ }
59
+ }
60
+ function logProxyTransition(next, reason) {
61
+ const log = proxyTransitionLogger;
62
+ if (!log) return;
63
+ const url = sanitizeUrlForLog(currentConfig.url) || "<unset>";
64
+ const line = next ? `WrongProxy active=true (${reason}) \u2014 base-URL rewrites ON, proxy=${url}` : `WrongProxy active=false (${reason}) \u2014 base-URL rewrites OFF, proxy=${url}`;
65
+ try {
66
+ if (next) log.info(line);
67
+ else log.warn(line);
68
+ } catch {
69
+ }
70
+ }
71
+ function getProxyConfig() {
72
+ return currentConfig;
73
+ }
74
+ var listeners = /* @__PURE__ */ new Set();
75
+ function subscribeToProxyConfig(listener) {
76
+ listeners.add(listener);
77
+ return () => {
78
+ listeners.delete(listener);
79
+ };
80
+ }
81
+ function applyProxyConfig(next) {
82
+ const previous = currentConfig;
83
+ currentConfig = {
84
+ enabled: next.enabled ?? previous.enabled,
85
+ url: next.url ?? previous.url,
86
+ active: next.active ?? previous.active
87
+ };
88
+ const materialChange = currentConfig.enabled !== previous.enabled || currentConfig.url !== previous.url || currentConfig.active !== previous.active;
89
+ if (materialChange) {
90
+ for (const listener of listeners) {
91
+ try {
92
+ listener(currentConfig, previous);
93
+ } catch {
94
+ }
95
+ }
96
+ }
97
+ return previous;
98
+ }
99
+ function shouldRewriteFor(providerId) {
100
+ const cfg = currentConfig;
101
+ if (!cfg.enabled || !cfg.active || !cfg.url) return false;
102
+ return isProxyEligible(providerId);
103
+ }
104
+ function deactivateProxyOnConnectionFailure(err) {
105
+ const cfg = currentConfig;
106
+ if (!cfg.enabled || !cfg.active) return false;
107
+ const msg = (err instanceof Error ? `${err.name} ${err.message} ${err.code ?? ""}` : String(err)).toLowerCase();
108
+ let isProxyFail = false;
109
+ if (cfg.url) {
110
+ try {
111
+ const parsed = new URL(cfg.url);
112
+ if (msg.includes(parsed.host.toLowerCase())) isProxyFail = true;
113
+ } catch {
114
+ }
115
+ }
116
+ if (!isProxyFail && (msg.includes("econnrefused") || msg.includes("ehostunreach") || msg.includes("enetunreach") || msg.includes("fetch failed") || msg.includes("failed to fetch") || msg.includes("connect error") || msg.includes("proxy error") || msg.includes("502") || msg.includes("503") || msg.includes("504"))) {
117
+ isProxyFail = true;
118
+ }
119
+ if (isProxyFail) {
120
+ applyProxyConfig({ active: false });
121
+ return true;
122
+ }
123
+ return false;
124
+ }
125
+ function __resetProxyConfigForTests() {
126
+ currentConfig = { ...DEFAULT_PROXY_CONFIG };
127
+ proxyTransitionLogger = void 0;
128
+ listeners.clear();
129
+ instantApplyChains.clear();
130
+ }
131
+ var PROXY_ROUTING_SETTLE_CAP_MS = 2e3;
132
+ var instantApplyChains = /* @__PURE__ */ new Set();
133
+ async function waitForProxyRoutingSettle(timeoutMs = PROXY_ROUTING_SETTLE_CAP_MS, signal) {
134
+ if (signal?.aborted) return;
135
+ const chains = [...instantApplyChains].map((get) => get());
136
+ if (chains.length === 0) return;
137
+ let timer;
138
+ let onAbort;
139
+ try {
140
+ await Promise.race([
141
+ Promise.allSettled(chains),
142
+ new Promise((resolve) => {
143
+ onAbort = () => resolve();
144
+ timer = setTimeout(resolve, Math.max(0, timeoutMs));
145
+ signal?.addEventListener("abort", onAbort, { once: true });
146
+ })
147
+ ]);
148
+ } finally {
149
+ if (timer !== void 0) clearTimeout(timer);
150
+ if (onAbort !== void 0) signal?.removeEventListener("abort", onAbort);
151
+ }
152
+ }
153
+ function effectiveBaseUrlFor(cfg, providerId, rawBaseUrl) {
154
+ if (!rawBaseUrl) return void 0;
155
+ const active = cfg.enabled && cfg.active && !!cfg.url && isProxyEligible(providerId);
156
+ return active ? rewriteBaseUrl(rawBaseUrl, cfg.url) : rawBaseUrl;
157
+ }
158
+ function effectiveBaseUrl(providerId, rawBaseUrl) {
159
+ return effectiveBaseUrlFor(currentConfig, providerId, rawBaseUrl);
160
+ }
161
+ function createProxyInstantApply(deps) {
162
+ const { getActiveProviderId, getRawBaseUrl, rebuildProvider, logger } = deps;
163
+ let lastProviderId = getActiveProviderId();
164
+ let lastEffectiveUrl = effectiveBaseUrl(lastProviderId, getRawBaseUrl(lastProviderId));
165
+ let disposed = false;
166
+ let rebuildChain = Promise.resolve();
167
+ const chainGetter = () => rebuildChain;
168
+ instantApplyChains.add(chainGetter);
169
+ const unsubscribe = subscribeToProxyConfig((next, previous) => {
170
+ if (disposed) return;
171
+ const providerId = getActiveProviderId();
172
+ const raw = getRawBaseUrl(providerId);
173
+ const nextUrl = effectiveBaseUrlFor(next, providerId, raw);
174
+ const baselineUrl = providerId === lastProviderId ? lastEffectiveUrl : effectiveBaseUrlFor(previous, providerId, raw);
175
+ lastProviderId = providerId;
176
+ lastEffectiveUrl = nextUrl;
177
+ if (nextUrl === baselineUrl) return;
178
+ rebuildChain = rebuildChain.then(() => rebuildProvider(providerId)).then(() => {
179
+ if (!disposed) {
180
+ logger.info(`WrongProxy routing changed \u2014 live provider rebuilt (${providerId})`);
181
+ }
182
+ }).catch((err) => {
183
+ if (!disposed) {
184
+ logger.warn(
185
+ `WrongProxy instant-apply: provider rebuild failed for ${providerId}: ${err instanceof Error ? err.message : String(err)}`
186
+ );
187
+ }
188
+ });
189
+ });
190
+ return {
191
+ dispose() {
192
+ if (disposed) return;
193
+ disposed = true;
194
+ instantApplyChains.delete(chainGetter);
195
+ unsubscribe();
196
+ }
197
+ };
198
+ }
199
+
200
+ export {
201
+ PROXY_EXCLUDED_PROVIDERS,
202
+ isProxyEligible,
203
+ rewriteBaseUrl,
204
+ setProxyTransitionLogger,
205
+ sanitizeUrlForLog,
206
+ logProxyTransition,
207
+ getProxyConfig,
208
+ subscribeToProxyConfig,
209
+ applyProxyConfig,
210
+ shouldRewriteFor,
211
+ deactivateProxyOnConnectionFailure,
212
+ __resetProxyConfigForTests,
213
+ PROXY_ROUTING_SETTLE_CAP_MS,
214
+ waitForProxyRoutingSettle,
215
+ createProxyInstantApply
216
+ };
217
+ //# sourceMappingURL=chunk-4SJNS7OB.js.map
@@ -0,0 +1,342 @@
1
+ // src/utils/term.ts
2
+ var hasStdout = () => typeof process !== "undefined" && !!process.stdout;
3
+ var hasStdin = () => typeof process !== "undefined" && !!process.stdin;
4
+ function isStdoutTTY() {
5
+ return hasStdout() && Boolean(process.stdout.isTTY);
6
+ }
7
+ function isStdinTTY() {
8
+ return hasStdin() && Boolean(process.stdin.isTTY);
9
+ }
10
+ function isInteractive() {
11
+ return isStdinTTY() && isStdoutTTY();
12
+ }
13
+ function getTermSize() {
14
+ if (!hasStdout()) return { rows: 24, cols: 80 };
15
+ return {
16
+ rows: process.stdout.rows ?? 24,
17
+ cols: process.stdout.columns ?? 80
18
+ };
19
+ }
20
+ function onResize(cb, stream = process.stdout) {
21
+ if (!stream || typeof stream.on !== "function") return () => {
22
+ };
23
+ const handler = () => {
24
+ cb({
25
+ rows: stream.rows ?? 24,
26
+ cols: stream.columns ?? 80
27
+ });
28
+ };
29
+ stream.on("resize", handler);
30
+ return () => {
31
+ stream.off("resize", handler);
32
+ };
33
+ }
34
+ function setRawMode(input, mode) {
35
+ if (input?.isTTY !== true) return false;
36
+ if (typeof input.setRawMode !== "function") return false;
37
+ input.setRawMode(mode);
38
+ return true;
39
+ }
40
+ var activeOutputGuard = null;
41
+ function setOutputLineGuard(guard) {
42
+ activeOutputGuard = guard;
43
+ }
44
+ function writeTo(s, stream) {
45
+ if (!stream || typeof stream.write !== "function") return false;
46
+ const guard = activeOutputGuard;
47
+ if (!guard) {
48
+ stream.write(s);
49
+ return true;
50
+ }
51
+ guard.suspend();
52
+ stream.write(s);
53
+ guard.resume();
54
+ return true;
55
+ }
56
+ function writeOut(s, stream = process.stdout) {
57
+ return writeTo(s, stream);
58
+ }
59
+ function writeErr(s, stream = process.stderr) {
60
+ return writeTo(s, stream);
61
+ }
62
+ function parseColorDepth(env) {
63
+ if (env.FORCE_COLOR === "0") return 0;
64
+ if (env.FORCE_COLOR !== void 0) return 3;
65
+ if (typeof env.NO_COLOR === "string" && env.NO_COLOR !== "") return 0;
66
+ const colorterm = (env.COLORTERM ?? "").toLowerCase();
67
+ if (colorterm === "truecolor" || colorterm === "24bit") return 3;
68
+ const term = (env.TERM ?? "").toLowerCase();
69
+ if (term.includes("truecolor") || term.includes("24bit")) return 3;
70
+ if (term.includes("256color")) return 2;
71
+ if (term === "dumb") return 0;
72
+ return 1;
73
+ }
74
+ function parseMouseProtocol(term) {
75
+ const t = term.toLowerCase();
76
+ if (t.startsWith("xterm") || t.startsWith("tmux") || t.startsWith("screen") || t.includes("rxvt-unicode") || t.includes("urxvt") || t.includes("konsole") || t.includes("gnome") || t.includes("foot") || t.includes("alacritty") || t.includes("wezterm") || t.includes("kitty") || t.includes("vscode") || t.includes("Apple_Terminal")) {
77
+ return "sgr";
78
+ }
79
+ if (t.startsWith("rxvt") || t.startsWith("linux") || t.includes("Eterm")) {
80
+ return "urxvt";
81
+ }
82
+ if (t === "vt100" || t === "dumb") return "none";
83
+ return "sgr";
84
+ }
85
+ function detectTerminal(opts = {}) {
86
+ const stdin = opts.stdin ?? process.stdin;
87
+ const stdout = opts.stdout ?? process.stdout;
88
+ const env = opts.env ?? process.env;
89
+ const isRealTTY = (stdin?.isTTY ?? false) && (stdout?.isTTY ?? false);
90
+ const stdoutWritable = isRealTTY && typeof stdout?.write === "function";
91
+ const term = env.TERM ?? "";
92
+ const isTmux = term.toLowerCase().startsWith("tmux");
93
+ const isWindowsConhost = isRealTTY && process.platform === "win32" && typeof stdout.getColorDepth !== "function";
94
+ return {
95
+ isRealTTY,
96
+ colorDepth: isRealTTY ? parseColorDepth(env) : 0,
97
+ stdoutWritable,
98
+ mouseProtocol: parseMouseProtocol(term),
99
+ canSetTitle: isRealTTY && term !== "dumb",
100
+ isTmux,
101
+ isWindowsConhost
102
+ };
103
+ }
104
+ var TerminalLifecycle = class {
105
+ _active = false;
106
+ /**
107
+ * The stdin stream we took raw mode on. Set by `acquire()`; undefined before
108
+ * first call. Used by `release()` and by the ConPTY race-closer in
109
+ * `acquire()`.
110
+ */
111
+ _stdin;
112
+ /**
113
+ * The `isRaw` snapshot captured before the first `acquire()` call, so
114
+ * `release()` restores to the pre-TUI state rather than blindly disabling
115
+ * raw mode. Null when `acquire()` has never been called.
116
+ */
117
+ _wasRaw = null;
118
+ /**
119
+ * Whether stdin was paused before the TUI took ownership. Readline closes
120
+ * its interface by pausing the shared process stream, so raw mode alone is
121
+ * not enough to make Ink receive bytes during the boot-prompt -> TUI handoff.
122
+ */
123
+ _wasPaused = null;
124
+ /**
125
+ * Request the process to exit. Set the flag, trigger any registered
126
+ * `onRequestExit` callback (typically Ink's `unmount()`), and arm a
127
+ * deadline timer. When the timer fires the process is hard-exited.
128
+ *
129
+ * Safe to call multiple times: subsequent calls no-op after the first.
130
+ */
131
+ requestExit;
132
+ /**
133
+ * Callback invoked when `requestExit` is called. Registered by the Ink
134
+ * mount point so unmount() runs before the deadline timer fires.
135
+ */
136
+ onRequestExit = null;
137
+ constructor() {
138
+ let exitCode = 0;
139
+ let requested = false;
140
+ this.requestExit = (code = 0) => {
141
+ exitCode = code;
142
+ if (requested) return;
143
+ requested = true;
144
+ try {
145
+ this.onRequestExit?.();
146
+ } catch {
147
+ }
148
+ setTimeout(() => process.exit(exitCode), 5e3).unref();
149
+ };
150
+ }
151
+ /** True while raw mode is held. */
152
+ get active() {
153
+ return this._active;
154
+ }
155
+ /**
156
+ * Acquire raw mode on `stdin`. Idempotent — calling twice is safe; only the
157
+ * first call has any effect.
158
+ *
159
+ * On Windows ConPTY, calls `setRawMode` twice: once immediately, then again
160
+ * after the next event-loop tick. This closes the ConPTY race where
161
+ * `readline`'s cleanup (registered before this class is constructed) can
162
+ * restore the original cooked mode after we set raw mode but before Ink's
163
+ * render loop takes over the stdin fd. The double-call ensures the last
164
+ * writer wins.
165
+ *
166
+ * @param stdin - The stdin stream (defaults to `process.stdin`).
167
+ * @returns `true` if raw mode was acquired; `false` if stdin is not a TTY
168
+ * or already shut down.
169
+ */
170
+ acquire(stdin = process.stdin) {
171
+ if (this._active) return false;
172
+ if (stdin?.isTTY !== true) return false;
173
+ if (typeof stdin.setRawMode !== "function") return false;
174
+ this._wasRaw = stdin.isRaw ?? false;
175
+ this._wasPaused = stdin.isPaused();
176
+ this._stdin = stdin;
177
+ stdin.setRawMode(true);
178
+ stdin.resume();
179
+ this._active = true;
180
+ if (process.platform === "win32") {
181
+ setImmediate(() => {
182
+ if (this._active && this._stdin?.isTTY) {
183
+ this._stdin.setRawMode?.(true);
184
+ }
185
+ });
186
+ }
187
+ return true;
188
+ }
189
+ /**
190
+ * Release raw mode and restore the terminal to the state it was in before
191
+ * `acquire()` was called. Idempotent — subsequent calls are no-ops.
192
+ *
193
+ * Call this on: SIGINT, SIGTERM, SIGHUP, SIGBREAK, and `process.exit`.
194
+ *
195
+ * ⚠ **Windows caveat**: `setRawMode(false)` on ConPTY restores the original
196
+ * console mode captured when the process started — not the mode captured by
197
+ * `acquire()`. On ConPTY, the original mode was already raw (ConPTY starts
198
+ * raw), so this call is typically a no-op on Windows Terminal. On conhost.exe
199
+ * it may restore cooked mode, which is correct for that backend.
200
+ */
201
+ release() {
202
+ if (!this._active) return;
203
+ this._active = false;
204
+ const stdin = this._stdin;
205
+ if (stdin?.isTTY === true) {
206
+ stdin.setRawMode?.(this._wasRaw ?? false);
207
+ if (this._wasPaused) stdin.pause();
208
+ }
209
+ this._stdin = void 0;
210
+ this._wasRaw = null;
211
+ this._wasPaused = null;
212
+ }
213
+ /**
214
+ * Synchronously reset all terminal state written by the TUI layer:
215
+ * raw mode, SGR attributes, cursor visibility, and mouse tracking.
216
+ *
217
+ * Intended for the final `process.on('exit')` handler where async is
218
+ * impossible. Uses `\x1b[0m` (SGR reset), `\x1b[?25h` (cursor show),
219
+ * and `\x1b[?9l` (mouse off) — all safe to emit even if the terminal does
220
+ * not understand them (unknown CSI sequences are silently ignored).
221
+ *
222
+ * Safe to call multiple times from multiple exit paths because each write
223
+ * is a constant-time synchronous stream write.
224
+ *
225
+ * @param stdout - Stream to reset (defaults to `process.stdout`).
226
+ */
227
+ reset(stdout = process.stdout) {
228
+ if (typeof stdout?.write !== "function") return;
229
+ stdout.write("\x1B[0m");
230
+ stdout.write("\x1B[?25h");
231
+ stdout.write("\x1B[?1003l\x1B[?1002l\x1B[?1000l");
232
+ }
233
+ };
234
+ var ESCAPE_TERMINATOR = Object.freeze({
235
+ BEL: "\x07",
236
+ // OSC 0 / OSC 2 (title)
237
+ ST: "\x1B\\"
238
+ // DCS / strict OSC
239
+ });
240
+ function safeEmit(sequence, stdout = process.stdout) {
241
+ const raw = typeof sequence === "string" ? sequence : sequence.raw;
242
+ const term = typeof sequence === "string" ? void 0 : sequence.terminator;
243
+ if (!raw) {
244
+ return { ok: false, reason: "empty" };
245
+ }
246
+ if (stdout?.isTTY !== true) {
247
+ return { ok: false, reason: "not_a_tty" };
248
+ }
249
+ if (raw.startsWith("\x1B]") || raw.startsWith("\x1BP")) {
250
+ if (!term) {
251
+ void term;
252
+ const safe = `${raw}\x07`;
253
+ try {
254
+ stdout.write(safe);
255
+ } catch {
256
+ return { ok: false, reason: "unwritable" };
257
+ }
258
+ return { ok: true, reason: "empty" };
259
+ }
260
+ try {
261
+ stdout.write(`${raw}${term}`);
262
+ } catch {
263
+ return { ok: false, reason: "unwritable" };
264
+ }
265
+ return { ok: true, reason: "empty" };
266
+ }
267
+ try {
268
+ stdout.write(raw);
269
+ } catch {
270
+ return { ok: false, reason: "unwritable" };
271
+ }
272
+ return { ok: true, reason: "empty" };
273
+ }
274
+ function buildTitleSequence(title, terminator = ESCAPE_TERMINATOR.BEL) {
275
+ return {
276
+ raw: `\x1B]0;${title.replace(/\x07/g, "")}`,
277
+ terminator
278
+ };
279
+ }
280
+ function buildSgrSequence(...codes) {
281
+ return { raw: `\x1B[${codes.join(";")}m` };
282
+ }
283
+ function setTitle(title, stdout = process.stdout) {
284
+ return safeEmit(buildTitleSequence(title), stdout).ok;
285
+ }
286
+
287
+ // src/utils/color.ts
288
+ var isColorTty = () => {
289
+ if (envFlag(process.env.NO_COLOR)) return false;
290
+ if (envFlag(process.env.FORCE_COLOR)) return true;
291
+ return isStdoutTTY();
292
+ };
293
+ function envFlag(value) {
294
+ if (value === void 0) return false;
295
+ if (value.trim() === "") return false;
296
+ return !/^(0|false|no|off)$/i.test(value.trim());
297
+ }
298
+ var COLOR = isColorTty();
299
+ var wrap = (open, close) => (s) => COLOR ? `\x1B[${open}m${s}\x1B[${close}m` : s;
300
+ var color = {
301
+ reset: wrap("0", "0"),
302
+ bold: wrap("1", "22"),
303
+ dim: wrap("2", "22"),
304
+ italic: wrap("3", "23"),
305
+ underline: wrap("4", "24"),
306
+ red: wrap("31", "39"),
307
+ green: wrap("32", "39"),
308
+ yellow: wrap("33", "39"),
309
+ blue: wrap("34", "39"),
310
+ magenta: wrap("35", "39"),
311
+ cyan: wrap("36", "39"),
312
+ gray: wrap("90", "39"),
313
+ amber: wrap("38;5;214", "39"),
314
+ pink: wrap("38;5;205", "39"),
315
+ bgRed: wrap("41", "49"),
316
+ bgGreen: wrap("42", "49")
317
+ };
318
+ function stripAnsi(s) {
319
+ return s.replace(/\x1b\[[0-9;]*[A-Za-z]/g, "");
320
+ }
321
+
322
+ export {
323
+ isStdoutTTY,
324
+ isStdinTTY,
325
+ isInteractive,
326
+ getTermSize,
327
+ onResize,
328
+ setRawMode,
329
+ setOutputLineGuard,
330
+ writeOut,
331
+ writeErr,
332
+ detectTerminal,
333
+ TerminalLifecycle,
334
+ ESCAPE_TERMINATOR,
335
+ safeEmit,
336
+ buildTitleSequence,
337
+ buildSgrSequence,
338
+ setTitle,
339
+ color,
340
+ stripAnsi
341
+ };
342
+ //# sourceMappingURL=chunk-4VWO3ZXL.js.map
@@ -0,0 +1,26 @@
1
+ // src/types/memory.ts
2
+ var MEMORY_TYPE_LABELS = {
3
+ fact: "Fact",
4
+ decision: "Decision",
5
+ convention: "Convention",
6
+ preference: "Preference",
7
+ reference: "Reference",
8
+ anti_pattern: "Anti-pattern"
9
+ };
10
+ function defineMemoryCapability(id) {
11
+ return Object.freeze({
12
+ id,
13
+ /** Identity function that makes the brand a real runtime value so
14
+ * `defineMemoryCapability<A>('x')` and `defineMemoryCapability<B>('x')`
15
+ * produce structurally distinct objects. Capability lookup is still
16
+ * keyed by `id` only — the brand prevents accidental cross-type casts
17
+ * at the type level. */
18
+ __memoryCapabilityType: (v) => v
19
+ });
20
+ }
21
+
22
+ export {
23
+ MEMORY_TYPE_LABELS,
24
+ defineMemoryCapability
25
+ };
26
+ //# sourceMappingURL=chunk-57GEWK5X.js.map
@@ -0,0 +1,46 @@
1
+ import {
2
+ ERROR_CODES,
3
+ FsError
4
+ } from "./chunk-25LSLC3G.js";
5
+
6
+ // src/utils/session-scoped-path.ts
7
+ import * as path from "node:path";
8
+ function sessionScopedPath(dir, sessionId, suffix) {
9
+ if (!sessionId || sessionId.includes("..") || sessionId.includes("\\")) {
10
+ throw invalid(sessionId);
11
+ }
12
+ const resolved = path.resolve(dir, `${sessionId}${suffix}`);
13
+ const rel = path.relative(path.resolve(dir), resolved);
14
+ if (rel.startsWith("..") || path.isAbsolute(rel)) {
15
+ throw invalid(sessionId);
16
+ }
17
+ return resolved;
18
+ }
19
+ var SESSION_SIDECAR_JSONL_SUFFIXES = [
20
+ ".replay.jsonl",
21
+ ".audit.jsonl",
22
+ ".annotations.jsonl"
23
+ ];
24
+ var RESERVED_SESSION_JSONL_NAMES = /* @__PURE__ */ new Set([
25
+ "_index.jsonl",
26
+ "_mailbox.jsonl"
27
+ ]);
28
+ function isSessionTranscriptFileName(name) {
29
+ if (!name.endsWith(".jsonl")) return false;
30
+ if (RESERVED_SESSION_JSONL_NAMES.has(name)) return false;
31
+ return !SESSION_SIDECAR_JSONL_SUFFIXES.some((suffix) => name.endsWith(suffix));
32
+ }
33
+ function invalid(sessionId) {
34
+ return new FsError({
35
+ message: `Invalid sessionId: ${sessionId}`,
36
+ code: ERROR_CODES.FS_DELETE_FAILED,
37
+ path: sessionId,
38
+ context: { reason: "path_traversal" }
39
+ });
40
+ }
41
+
42
+ export {
43
+ sessionScopedPath,
44
+ isSessionTranscriptFileName
45
+ };
46
+ //# sourceMappingURL=chunk-5BMIE7QG.js.map
@@ -0,0 +1,50 @@
1
+ // src/utils/instruction-file.ts
2
+ import { readFileSync, statSync } from "node:fs";
3
+ import * as path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ var textCache = /* @__PURE__ */ new Map();
6
+ var rootCandidates;
7
+ function readBundledInstructionText(relativePath) {
8
+ const cached = textCache.get(relativePath);
9
+ if (cached !== void 0) return cached;
10
+ let resolved = "";
11
+ for (const root of instructionRootCandidates()) {
12
+ try {
13
+ resolved = readFileSync(path.join(root, relativePath), "utf8").trimEnd();
14
+ break;
15
+ } catch {
16
+ }
17
+ }
18
+ textCache.set(relativePath, resolved);
19
+ return resolved;
20
+ }
21
+ function renderInstructionTemplate(template, values) {
22
+ return template.replace(
23
+ /\{\{\s*([a-zA-Z0-9_.-]+)\s*\}\}/g,
24
+ (match, key) => Object.hasOwn(values, key) ? values[key] ?? "" : match
25
+ );
26
+ }
27
+ function instructionRootCandidates() {
28
+ if (rootCandidates !== void 0) return rootCandidates;
29
+ const here = path.dirname(fileURLToPath(import.meta.url));
30
+ const candidates = [
31
+ path.resolve(here, "../../instructions"),
32
+ path.resolve(here, "../instructions"),
33
+ path.resolve(here, "instructions")
34
+ ];
35
+ rootCandidates = candidates.sort((a, b) => Number(!isDirectory(a)) - Number(!isDirectory(b)));
36
+ return rootCandidates;
37
+ }
38
+ function isDirectory(candidate) {
39
+ try {
40
+ return statSync(candidate).isDirectory();
41
+ } catch {
42
+ return false;
43
+ }
44
+ }
45
+
46
+ export {
47
+ readBundledInstructionText,
48
+ renderInstructionTemplate
49
+ };
50
+ //# sourceMappingURL=chunk-5S437PRC.js.map