@askexenow/exe-os 0.9.319 → 0.9.322

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 (294) hide show
  1. package/deploy/compose/docker-compose.yml +1 -1
  2. package/deploy/stack-manifests/v0.9.json +110 -2
  3. package/dist/{active-agent-EA2Q3KYR.js → active-agent-M5NJFEBM.js} +3 -3
  4. package/dist/{active-agent-XIPGXSQA.js → active-agent-SHM4QSRJ.js} +3 -3
  5. package/dist/{agentic-ontology-7ZUMZC2O.js → agentic-ontology-HQKCU7LG.js} +1 -1
  6. package/dist/{backfill-metadata-7RO5PSMN.js → backfill-metadata-CXWFCTBO.js} +4 -4
  7. package/dist/{behaviors-OEGZD5DH.js → behaviors-J47D342W.js} +5 -5
  8. package/dist/bin/agentic-ontology-backfill.js +5 -5
  9. package/dist/bin/agentic-reflection-backfill.js +6 -6
  10. package/dist/bin/agentic-semantic-label.js +5 -5
  11. package/dist/bin/backfill-conversations.js +6 -6
  12. package/dist/bin/backfill-responses.js +6 -6
  13. package/dist/bin/backfill-vectors.js +8 -8
  14. package/dist/bin/bulk-sync-postgres.js +12 -12
  15. package/dist/bin/cc-doctor.js +4 -4
  16. package/dist/bin/cleanup-stale-review-tasks.js +12 -12
  17. package/dist/bin/cli.js +56 -16
  18. package/dist/bin/deferred-daemon-restart.js +67 -67
  19. package/dist/bin/exe-agent-config.js +3 -3
  20. package/dist/bin/exe-agent.js +8 -8
  21. package/dist/bin/exe-assign.js +8 -8
  22. package/dist/bin/exe-boot.js +55 -30
  23. package/dist/bin/exe-call.js +4 -4
  24. package/dist/bin/exe-cloud.js +12 -12
  25. package/dist/bin/exe-config-dump.js +3 -3
  26. package/dist/bin/exe-dispatch.js +12 -12
  27. package/dist/bin/exe-doctor.js +4 -4
  28. package/dist/bin/exe-export-behaviors.js +7 -7
  29. package/dist/bin/exe-forget.js +6 -6
  30. package/dist/bin/exe-gateway.js +7 -7
  31. package/dist/bin/exe-healthcheck.js +4 -4
  32. package/dist/bin/exe-heartbeat.js +12 -12
  33. package/dist/bin/exe-kill.js +15 -15
  34. package/dist/bin/exe-launch-agent.js +33 -22
  35. package/dist/bin/exe-new-employee.js +8 -8
  36. package/dist/bin/exe-pending-messages.js +13 -13
  37. package/dist/bin/exe-pending-notifications.js +12 -12
  38. package/dist/bin/exe-pending-reviews.js +12 -12
  39. package/dist/bin/exe-rename.js +4 -4
  40. package/dist/bin/exe-review.js +14 -14
  41. package/dist/bin/exe-search.js +5 -5
  42. package/dist/bin/exe-session-cleanup.js +18 -18
  43. package/dist/bin/exe-settings.js +13 -13
  44. package/dist/bin/exe-start-codex.js +12 -12
  45. package/dist/bin/exe-start-opencode.js +8 -8
  46. package/dist/bin/exe-status.js +13 -13
  47. package/dist/bin/exe-support.js +3 -3
  48. package/dist/bin/exe-team.js +3 -3
  49. package/dist/bin/git-sweep.js +13 -13
  50. package/dist/bin/graph-backfill.js +4 -4
  51. package/dist/bin/graph-export.js +5 -5
  52. package/dist/bin/import-history.js +7 -7
  53. package/dist/bin/install-launchd.js +2 -2
  54. package/dist/bin/install.js +70 -70
  55. package/dist/bin/intercom-check.js +4 -4
  56. package/dist/bin/mcp-sessions.js +2 -2
  57. package/dist/bin/orchestration-metrics.js +4 -4
  58. package/dist/bin/postgres-agentic-reflection-backfill.js +2 -2
  59. package/dist/bin/postgres-agentic-semantic-backfill.js +1 -1
  60. package/dist/bin/registry-proxy.js +7 -1
  61. package/dist/bin/scan-tasks.js +12 -12
  62. package/dist/bin/setup.js +1 -1
  63. package/dist/bin/shard-migrate.js +4 -4
  64. package/dist/bin/stack-update.js +4 -4
  65. package/dist/bin/vps-health-gate.js +1 -1
  66. package/dist/{capability-cards-4BONYCI4.js → capability-cards-H7H3MU74.js} +2 -2
  67. package/dist/{capacity-monitor-SV2Q7CMC.js → capacity-monitor-WAEHVBL7.js} +13 -13
  68. package/dist/{catchup-brief-5ULTVKSE.js → catchup-brief-L42STIDR.js} +15 -15
  69. package/dist/{chunk-LQWCIW4K.js → chunk-2GBGIXKH.js} +1 -1
  70. package/dist/{chunk-C7QYH2YN.js → chunk-3JW3ZXCP.js} +1 -1
  71. package/dist/{chunk-KF6NBYV4.js → chunk-3M73L663.js} +2 -2
  72. package/dist/{chunk-MRB2BXIB.js → chunk-4Z47UMMM.js} +10 -10
  73. package/dist/{chunk-VTHR4DPE.js → chunk-5ZNY7IZI.js} +5 -1
  74. package/dist/{chunk-UQOCHKPX.js → chunk-657AQEPY.js} +1 -1
  75. package/dist/{chunk-B2FUBD6Z.js → chunk-6IBUQBMY.js} +9 -9
  76. package/dist/{chunk-Q774HAGE.js → chunk-6N4LYEDI.js} +1 -1
  77. package/dist/{chunk-EPZWVXKI.js → chunk-6SXJZHRJ.js} +1 -1
  78. package/dist/{chunk-XLQH263A.js → chunk-6UQRJCKK.js} +2 -2
  79. package/dist/{chunk-3ZOWUUKR.js → chunk-6XM6PZXQ.js} +1 -1
  80. package/dist/{chunk-DZJZAHTB.js → chunk-7BZ6TOZN.js} +2 -2
  81. package/dist/{chunk-E3WZA2WU.js → chunk-7CUF27OT.js} +1 -1
  82. package/dist/{chunk-V4UKBUUA.js → chunk-7FBPLVHM.js} +1 -1
  83. package/dist/{chunk-OXGNFT3L.js → chunk-7SDS5VCL.js} +5 -5
  84. package/dist/{chunk-FJUQ5L5R.js → chunk-A3KUGBDP.js} +92 -1
  85. package/dist/{chunk-TWPYSILC.js → chunk-ABGDTMKC.js} +1 -1
  86. package/dist/{chunk-VUZRAEF3.js → chunk-AZL3EUR3.js} +64 -18
  87. package/dist/{chunk-TRXBT24O.js → chunk-BFHBHQFA.js} +5 -5
  88. package/dist/{chunk-F3P34OHU.js → chunk-C4BIZXKB.js} +1 -1
  89. package/dist/{chunk-DFSR3UUL.js → chunk-CHSRSESS.js} +1 -1
  90. package/dist/{chunk-7XGDTKHX.js → chunk-CMDC5D7S.js} +2 -2
  91. package/dist/{chunk-CNFUVZLM.js → chunk-CXXERHNC.js} +1 -1
  92. package/dist/{chunk-N3ZLLKBN.js → chunk-DGFIXJ4S.js} +3 -3
  93. package/dist/{chunk-JNUYJRQX.js → chunk-E32KARET.js} +4 -4
  94. package/dist/{chunk-RJHOFX72.js → chunk-EOPSIIEH.js} +1 -1
  95. package/dist/{chunk-CQ2T4A2D.js → chunk-EPBB2OD3.js} +2 -2
  96. package/dist/{chunk-YTHZTDXH.js → chunk-ERSFOJGC.js} +1 -1
  97. package/dist/{chunk-MM7EYJJ3.js → chunk-EVUXF2G4.js} +1 -1
  98. package/dist/{chunk-V2GI2MJJ.js → chunk-F5FAD2YR.js} +2 -2
  99. package/dist/{chunk-7S3SRDPQ.js → chunk-FANIBYUO.js} +2 -2
  100. package/dist/{chunk-LJTXVAG4.js → chunk-G5TP2D2U.js} +3 -3
  101. package/dist/{chunk-36CFV3ZF.js → chunk-GA76RGSP.js} +3 -3
  102. package/dist/{chunk-B3SFW4LY.js → chunk-GN3IWZDH.js} +612 -536
  103. package/dist/{chunk-PHUKD7VK.js → chunk-H2SD2EA7.js} +9 -9
  104. package/dist/{chunk-LRWB35MD.js → chunk-HGM6NZQH.js} +1 -1
  105. package/dist/{chunk-WXQVFMNV.js → chunk-HIOO7DZ2.js} +5 -5
  106. package/dist/{chunk-7I4HQYPL.js → chunk-HKSJSW2V.js} +1 -1
  107. package/dist/{chunk-RVF6JBHW.js → chunk-HV5CUDOE.js} +1 -1
  108. package/dist/{chunk-5L62XXNH.js → chunk-HWC5W34K.js} +1 -1
  109. package/dist/{chunk-JJ2FFUFV.js → chunk-JXEMAB4M.js} +1 -1
  110. package/dist/{chunk-2OOCPANV.js → chunk-KK4ZOYXJ.js} +1 -1
  111. package/dist/{chunk-K6GZMAIA.js → chunk-KL5WYWS3.js} +2 -2
  112. package/dist/{chunk-RREJ2QQ4.js → chunk-KLG53B63.js} +1 -1
  113. package/dist/{chunk-IPD5ZSOK.js → chunk-KXP3CUTL.js} +2 -2
  114. package/dist/{chunk-AKD6IKYS.js → chunk-LB77CSLO.js} +3 -3
  115. package/dist/{chunk-T5O2EBHU.js → chunk-LCZ55G5G.js} +7 -7
  116. package/dist/{chunk-TDV3XEGQ.js → chunk-LOE2N23P.js} +1 -1
  117. package/dist/{chunk-JPTBLJLS.js → chunk-MYMA23KC.js} +1 -1
  118. package/dist/{chunk-PJH7JUWD.js → chunk-NAHAOFTY.js} +3 -3
  119. package/dist/{chunk-HFDFQ7CB.js → chunk-NFM6VHL7.js} +1 -1
  120. package/dist/{chunk-PM6XSS6R.js → chunk-NYFPFOYM.js} +1 -1
  121. package/dist/{chunk-DRA2FYUQ.js → chunk-OFR7KQ37.js} +3 -3
  122. package/dist/{chunk-OC222BAQ.js → chunk-OI63OVCR.js} +1 -1
  123. package/dist/{chunk-ZOCW4TGA.js → chunk-ORC5AO7E.js} +1 -1
  124. package/dist/{chunk-WUF5MYA5.js → chunk-PISGLNV7.js} +9 -9
  125. package/dist/{chunk-LWBOSHSS.js → chunk-PLBDXCYZ.js} +95 -29
  126. package/dist/{chunk-RAKFEXCN.js → chunk-QNUHDEPI.js} +4 -4
  127. package/dist/{chunk-C54QKE4O.js → chunk-QQOH3I4A.js} +1 -1
  128. package/dist/{chunk-Q26VSIXA.js → chunk-QVFJCFNM.js} +24 -0
  129. package/dist/{chunk-C2DFOF7O.js → chunk-QYLDCPNG.js} +1 -1
  130. package/dist/{chunk-C5SALMKH.js → chunk-ROMB2HH4.js} +5 -5
  131. package/dist/{chunk-GRB44WRN.js → chunk-SENJA7BZ.js} +1 -1
  132. package/dist/{chunk-NODTWD7N.js → chunk-SQ5JWDJ2.js} +1 -1
  133. package/dist/{chunk-KHM3TKOM.js → chunk-T6AUMO5X.js} +1 -1
  134. package/dist/{chunk-YJYE6MMJ.js → chunk-TI6YX3L5.js} +2 -2
  135. package/dist/{chunk-WL5K3R7W.js → chunk-TKBWBHFV.js} +1 -1
  136. package/dist/{chunk-7PUNIH6G.js → chunk-V2ESQU3S.js} +1 -1
  137. package/dist/{chunk-YZTOGIV7.js → chunk-VSXGFHJY.js} +1 -1
  138. package/dist/{chunk-QLVMJGUQ.js → chunk-VY7345RO.js} +46 -7
  139. package/dist/{chunk-YSSJOTVN.js → chunk-WCCR5IFR.js} +2 -2
  140. package/dist/{chunk-4XAYC77M.js → chunk-WFHYAKEU.js} +1 -1
  141. package/dist/{chunk-IDMIGP53.js → chunk-WSYKLS2Y.js} +3 -3
  142. package/dist/{chunk-DTP4HXM3.js → chunk-X62GD6QW.js} +1 -1
  143. package/dist/{chunk-GBUFDCLX.js → chunk-XC7C3GQ2.js} +2 -2
  144. package/dist/{chunk-WG4PRZGT.js → chunk-XEBN5CPD.js} +5 -5
  145. package/dist/{chunk-36SS3TE7.js → chunk-XLNF3CIO.js} +3 -3
  146. package/dist/{chunk-MNUFLCHT.js → chunk-XP53WEXP.js} +3 -3
  147. package/dist/{cleanup-graph-garbage-IXYSUIUH.js → cleanup-graph-garbage-MX5JDTJA.js} +4 -4
  148. package/dist/{co-activation-BQRXOZN2.js → co-activation-K44LGZ7A.js} +2 -2
  149. package/dist/{co-occurrence-QPLSUQ4O.js → co-occurrence-N62HJTRP.js} +2 -2
  150. package/dist/{code-context-index-NQFP6ED5.js → code-context-index-6YQ3DGCN.js} +3 -3
  151. package/dist/completion-nudge-dedup-DBZF24MM.js +74 -0
  152. package/dist/{crdt-sync-VLSJH6LL.js → crdt-sync-BO76VVRX.js} +1 -1
  153. package/dist/{crm-webhook-IZYJXHSK.js → crm-webhook-UZLTHXAS.js} +2 -2
  154. package/dist/{cto-delegation-gate-FU4HGNSN.js → cto-delegation-gate-NVMRONA2.js} +11 -11
  155. package/dist/{daemon-orchestration-IXSMZXGO.js → daemon-orchestration-JI3RD5EZ.js} +15 -15
  156. package/dist/{db-backup-7GJYDSXA.js → db-backup-ITRADB2J.js} +1 -1
  157. package/dist/{doc-graph-extractor-U7XGZQ7T.js → doc-graph-extractor-L7YESUSI.js} +2 -2
  158. package/dist/{documents-U47VG24Q.js → documents-7BFXA6V3.js} +8 -8
  159. package/dist/{dreaming-VBI4BI6R.js → dreaming-NRTMPNPZ.js} +12 -12
  160. package/dist/{exe-drift-BMSRHAT6.js → exe-drift-GLJIM7EI.js} +3 -3
  161. package/dist/{exe-export-CIRE2HZA.js → exe-export-THIAYHXK.js} +6 -6
  162. package/dist/{exe-import-X6U6VG7Q.js → exe-import-3Y4VOUYL.js} +6 -6
  163. package/dist/{exe-key-7VXVXX4Q.js → exe-key-IPGY4RMU.js} +67 -67
  164. package/dist/{exe-snapshot-P5BLEXQJ.js → exe-snapshot-2ZEWCDYK.js} +15 -15
  165. package/dist/{fast-db-init-SMBGFVXM.js → fast-db-init-TLYUWCDE.js} +1 -1
  166. package/dist/{founder-context-AMMO53S7.js → founder-context-J362DNU4.js} +2 -2
  167. package/dist/gateway/index.js +11 -11
  168. package/dist/{git-staleness-AJDPXQJF.js → git-staleness-BRDHTHNS.js} +2 -2
  169. package/dist/{git-task-sweep-EJ3HEH4Y.js → git-task-sweep-7GVUKDBW.js} +12 -12
  170. package/dist/{global-procedures-KV2SVX43.js → global-procedures-FNUKY2LF.js} +3 -3
  171. package/dist/{graph-auto-extract-HFXDXJC3.js → graph-auto-extract-AJZUV3PO.js} +2 -2
  172. package/dist/hooks/bug-report-worker.js +14 -14
  173. package/dist/hooks/codex-stop-task-finalizer.js +14 -14
  174. package/dist/hooks/commit-complete.js +14 -14
  175. package/dist/hooks/error-recall.js +6 -6
  176. package/dist/hooks/exe-heartbeat-hook.js +3 -3
  177. package/dist/hooks/ingest-worker.js +3 -3
  178. package/dist/hooks/ingest.js +6 -6
  179. package/dist/hooks/instructions-loaded.js +4 -4
  180. package/dist/hooks/manifest.json +20 -20
  181. package/dist/hooks/notification.js +4 -4
  182. package/dist/hooks/post-compact.js +13 -13
  183. package/dist/hooks/post-tool-combined.js +8 -8
  184. package/dist/hooks/pre-compact.js +17 -17
  185. package/dist/hooks/pre-tool-use.js +24 -22
  186. package/dist/hooks/prompt-submit.js +26 -26
  187. package/dist/hooks/session-end.js +22 -22
  188. package/dist/hooks/session-start.js +12 -12
  189. package/dist/hooks/stop.js +37 -41
  190. package/dist/hooks/subagent-stop.js +13 -13
  191. package/dist/hooks/summary-worker.js +20 -20
  192. package/dist/index.js +22 -22
  193. package/dist/{installer-XLP5MIRG.js → installer-2EKTDQZB.js} +5 -5
  194. package/dist/{installer-MWRZB3RT.js → installer-SC7CQBYY.js} +5 -5
  195. package/dist/{installer-2SY3BEHJ.js → installer-UEF44TWQ.js} +5 -5
  196. package/dist/lib/agent-config.js +7 -1
  197. package/dist/lib/cloud-sync.js +12 -12
  198. package/dist/lib/consolidation.js +5 -5
  199. package/dist/lib/database.js +2 -2
  200. package/dist/lib/db-daemon-client.js +3 -3
  201. package/dist/lib/db.js +2 -2
  202. package/dist/lib/device-registry.js +1 -1
  203. package/dist/lib/embedder.js +3 -3
  204. package/dist/lib/employee-templates.js +4 -4
  205. package/dist/lib/employees.js +2 -2
  206. package/dist/lib/exe-daemon-client.js +2 -2
  207. package/dist/lib/exe-daemon.js +51 -51
  208. package/dist/lib/hybrid-search.js +5 -5
  209. package/dist/lib/identity.js +2 -2
  210. package/dist/lib/license.js +8 -2
  211. package/dist/lib/messaging.js +12 -12
  212. package/dist/lib/registry-proxy.js +1 -1
  213. package/dist/lib/reminders.js +3 -3
  214. package/dist/lib/schedules.js +5 -5
  215. package/dist/lib/session-registry.js +4 -4
  216. package/dist/lib/skill-learning.js +6 -6
  217. package/dist/lib/status-brief.js +1 -1
  218. package/dist/lib/store.js +4 -4
  219. package/dist/lib/task-router.js +3 -3
  220. package/dist/lib/tasks.js +13 -13
  221. package/dist/lib/tmux-routing.js +11 -11
  222. package/dist/lib/token-spend.js +3 -3
  223. package/dist/{license-gate-PHJLO2G6.js → license-gate-YUUSIPJ7.js} +3 -3
  224. package/dist/license-sync-LX73IEBH.js +238 -0
  225. package/dist/mcp/register-tools.js +66 -66
  226. package/dist/mcp/server.js +70 -70
  227. package/dist/mcp/tools/complete-reminder.js +4 -4
  228. package/dist/mcp/tools/create-reminder.js +4 -4
  229. package/dist/mcp/tools/create-task.js +15 -15
  230. package/dist/mcp/tools/deactivate-behavior.js +7 -7
  231. package/dist/mcp/tools/list-reminders.js +4 -4
  232. package/dist/mcp/tools/list-tasks.js +15 -15
  233. package/dist/mcp/tools/send-message.js +14 -14
  234. package/dist/mcp/tools/update-task.js +14 -14
  235. package/dist/{mcp-http-config-6Q7SYJFY.js → mcp-http-config-MBG5AQNH.js} +3 -3
  236. package/dist/{memory-cards-IG3K6T7M.js → memory-cards-MGZ4P3AA.js} +4 -4
  237. package/dist/{memory-graph-extractor-WZ77ITZ3.js → memory-graph-extractor-44P2ATID.js} +3 -3
  238. package/dist/{memory-poisoning-defense-YQW6WVPL.js → memory-poisoning-defense-3CYFKNLA.js} +2 -2
  239. package/dist/{memory-pressure-watchdog-JPCLJAXH.js → memory-pressure-watchdog-6PFLEOUO.js} +12 -12
  240. package/dist/{memory-queue-client-W24ZZ6ZF.js → memory-queue-client-BZD6MXA5.js} +3 -3
  241. package/dist/{memory-reflection-UGK2I2T7.js → memory-reflection-AYPJRPU7.js} +2 -2
  242. package/dist/{notifications-3MO6HVJM.js → notifications-BBQ23ORD.js} +11 -11
  243. package/dist/{orchestration-events-SKESCF4F.js → orchestration-events-O5P5NEKS.js} +3 -3
  244. package/dist/{orchestrator-SM65YFE2.js → orchestrator-SERM6FDY.js} +13 -13
  245. package/dist/{pipeline-router-UGCC5XSO.js → pipeline-router-T673WGL3.js} +3 -3
  246. package/dist/{plan-limits-RUCNKVRH.js → plan-limits-QWBN2EKH.js} +5 -5
  247. package/dist/{projection-worker-FBFQ232A.js → projection-worker-K6TILAZH.js} +2 -2
  248. package/dist/{prospective-memory-X4UQTUC2.js → prospective-memory-XRNRMEDL.js} +2 -2
  249. package/dist/{reranker-FIRW3XMW.js → reranker-3XC5UM4F.js} +1 -1
  250. package/dist/{retrieval-health-NWYJEIZS.js → retrieval-health-ULVVOIPL.js} +1 -1
  251. package/dist/{review-polling-HUJMBGUY.js → review-polling-5YGDPJUX.js} +12 -12
  252. package/dist/runtime/index.js +19 -19
  253. package/dist/{session-events-UNCFJIK7.js → session-events-D52HNUJK.js} +12 -12
  254. package/dist/{session-kill-telemetry-VQ4JWWTI.js → session-kill-telemetry-IBNCJSI7.js} +12 -12
  255. package/dist/{session-scope-OLSNZJ24.js → session-scope-5FWZ4AYR.js} +11 -11
  256. package/dist/{setup-wizard-X72EV5E2.js → setup-wizard-KVTLSSRD.js} +1 -1
  257. package/dist/{skill-refinement-OJRBB3LD.js → skill-refinement-YLIAY7V4.js} +2 -2
  258. package/dist/{stack-update-PK2OYYR3.js → stack-update-OWWGTYRB.js} +3 -3
  259. package/dist/{steward-gate-5ZWUVNGD.js → steward-gate-3ZITRYVH.js} +3 -3
  260. package/dist/{task-enforcement-VFFLCP3N.js → task-enforcement-L4YTDOOX.js} +11 -11
  261. package/dist/{task-scope-75JK27V5.js → task-scope-OIHLMQOQ.js} +11 -11
  262. package/dist/{tasks-crud-ADVXVR7D.js → tasks-crud-QUIIRWE3.js} +11 -11
  263. package/dist/{tasks-notify-NAA6IHHW.js → tasks-notify-ANYLB5GU.js} +12 -12
  264. package/dist/{tasks-review-5A3JJR6R.js → tasks-review-BWSCXFMB.js} +11 -11
  265. package/dist/{telemetry-upload-HSXQYSVJ.js → telemetry-upload-XLDBCD7B.js} +7 -7
  266. package/dist/{token-budget-GD2VU7N4.js → token-budget-OQCLPV3A.js} +3 -3
  267. package/dist/{tool-capability-index-KA2HQ7A4.js → tool-capability-index-3UWKZZED.js} +1 -1
  268. package/dist/{tool-telemetry-UQY7GDGE.js → tool-telemetry-AQTFWOWG.js} +1 -1
  269. package/dist/tui/App.js +19 -19
  270. package/dist/{tui-data-VYSH7F2K.js → tui-data-3Y5L5LJB.js} +11 -11
  271. package/dist/{worker-gate-DRSX2SOW.js → worker-gate-WJS2MFNA.js} +1 -1
  272. package/dist/{workflow-engine-WFDIVYWP.js → workflow-engine-EPPZ226V.js} +2 -2
  273. package/dist/{worktree-LWVPNZ4L.js → worktree-OYGDGJP7.js} +4 -4
  274. package/dist/{worktree-sweep-3IZLGYYH.js → worktree-sweep-KV4H4766.js} +5 -5
  275. package/package.json +1 -1
  276. package/release-notes.json +47 -44
  277. /package/dist/{chunk-3YKA5BKT.js → chunk-72LWCZTJ.js} +0 -0
  278. /package/dist/{chunk-7NG77I33.js → chunk-DQJ3WZRK.js} +0 -0
  279. /package/dist/{chunk-HJSMIHEY.js → chunk-DY3J6GQO.js} +0 -0
  280. /package/dist/{chunk-XRJ3EFEF.js → chunk-IZY6V4FI.js} +0 -0
  281. /package/dist/{chunk-S6N7DLKL.js → chunk-Q5YKWFVO.js} +0 -0
  282. /package/dist/{chunk-4AHV3QBI.js → chunk-QTEHH4LG.js} +0 -0
  283. /package/dist/{chunk-UWVAG35C.js → chunk-RRQI5PSJ.js} +0 -0
  284. /package/dist/{chunk-NOPDNOGQ.js → chunk-SIJSFULW.js} +0 -0
  285. /package/dist/{chunk-SOIHGU5I.js → chunk-SJZT66LM.js} +0 -0
  286. /package/dist/{chunk-3EZQSPTG.js → chunk-WXRVHXVP.js} +0 -0
  287. /package/dist/{chunk-6DTSAEDS.js → chunk-YIFZZYQD.js} +0 -0
  288. /package/dist/{chunk-53ARJV2L.js → chunk-ZU6767WK.js} +0 -0
  289. /package/dist/{core-memory-5HNI2YLS.js → core-memory-DARTILJG.js} +0 -0
  290. /package/dist/{entity-boost-AQBUEMJK.js → entity-boost-VR5YOQCT.js} +0 -0
  291. /package/dist/{message-queue-client-JGOK7POW.js → message-queue-client-HVFR67QH.js} +0 -0
  292. /package/dist/{oauth-server-NZTPAFQ7.js → oauth-server-UQHCFVHT.js} +0 -0
  293. /package/dist/{project-boot-3UP6ETJY.js → project-boot-22ZZL2GE.js} +0 -0
  294. /package/dist/{wiki-acl-4W4CSCFO.js → wiki-acl-EZMGL6KW.js} +0 -0
@@ -1,29 +1,29 @@
1
1
  import {
2
2
  lightweightSearch
3
- } from "./chunk-MRB2BXIB.js";
3
+ } from "./chunk-4Z47UMMM.js";
4
4
  import "./chunk-AB4PAQYK.js";
5
- import "./chunk-PHUKD7VK.js";
5
+ import "./chunk-H2SD2EA7.js";
6
6
  import "./chunk-CHCA3ZM2.js";
7
7
  import "./chunk-OTVEIJUQ.js";
8
- import "./chunk-NOPDNOGQ.js";
8
+ import "./chunk-SIJSFULW.js";
9
9
  import "./chunk-Y25OJWOQ.js";
10
10
  import {
11
11
  sessionScopeFilter,
12
12
  strictSessionScopeFilter
13
- } from "./chunk-LWBOSHSS.js";
14
- import "./chunk-5L62XXNH.js";
15
- import "./chunk-RREJ2QQ4.js";
13
+ } from "./chunk-PLBDXCYZ.js";
14
+ import "./chunk-HWC5W34K.js";
15
+ import "./chunk-KLG53B63.js";
16
16
  import "./chunk-4FVVJ7ME.js";
17
17
  import "./chunk-E23LNUWJ.js";
18
18
  import "./chunk-4JERP7NT.js";
19
- import "./chunk-TWPYSILC.js";
19
+ import "./chunk-ABGDTMKC.js";
20
20
  import "./chunk-SSTLTIF3.js";
21
21
  import "./chunk-RMOBQ6A5.js";
22
22
  import "./chunk-54QCG45Y.js";
23
- import "./chunk-RVF6JBHW.js";
24
- import "./chunk-Q26VSIXA.js";
23
+ import "./chunk-HV5CUDOE.js";
24
+ import "./chunk-QVFJCFNM.js";
25
25
  import "./chunk-NGP6LSV2.js";
26
- import "./chunk-CQ2T4A2D.js";
26
+ import "./chunk-EPBB2OD3.js";
27
27
  import "./chunk-CVYC6DUW.js";
28
28
  import "./chunk-OPU3NYOO.js";
29
29
  import "./chunk-HYZV25LY.js";
@@ -31,16 +31,16 @@ import "./chunk-GJV3WDWM.js";
31
31
  import "./chunk-MP2AFCGL.js";
32
32
  import {
33
33
  getClient
34
- } from "./chunk-36SS3TE7.js";
34
+ } from "./chunk-XLNF3CIO.js";
35
35
  import "./chunk-2I23RPSI.js";
36
- import "./chunk-3EZQSPTG.js";
36
+ import "./chunk-WXRVHXVP.js";
37
37
  import "./chunk-PNQDP3OA.js";
38
38
  import "./chunk-H73TUI4Y.js";
39
39
  import "./chunk-7HLWBYH7.js";
40
40
  import "./chunk-FXU7JOXK.js";
41
41
  import "./chunk-Z42MXYWW.js";
42
- import "./chunk-QLVMJGUQ.js";
43
- import "./chunk-7NG77I33.js";
42
+ import "./chunk-VY7345RO.js";
43
+ import "./chunk-DQJ3WZRK.js";
44
44
  import "./chunk-7Y5UDEVM.js";
45
45
  import "./chunk-SHIICYJW.js";
46
46
  import "./chunk-MLKGABMK.js";
@@ -149,7 +149,7 @@ ${msgLines}`);
149
149
  } catch {
150
150
  }
151
151
  try {
152
- const { getPendingProspective, markSurfaced } = await import("./prospective-memory-X4UQTUC2.js");
152
+ const { getPendingProspective, markSurfaced } = await import("./prospective-memory-XRNRMEDL.js");
153
153
  const due = await getPendingProspective(agentId, { projectName, limit: 5 });
154
154
  if (due.length > 0) {
155
155
  const now = Date.now();
@@ -6,7 +6,7 @@ import {
6
6
  connectEmbedDaemon,
7
7
  isClientConnected,
8
8
  sendDaemonRequest
9
- } from "./chunk-C7QYH2YN.js";
9
+ } from "./chunk-3JW3ZXCP.js";
10
10
 
11
11
  // src/lib/db-daemon-client.ts
12
12
  function normalizeStatement(stmt) {
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-3NGZ4PL7.js";
8
8
  import {
9
9
  computeDaemonHeapCapMb
10
- } from "./chunk-7XGDTKHX.js";
10
+ } from "./chunk-CMDC5D7S.js";
11
11
  import {
12
12
  EXE_AI_DIR
13
13
  } from "./chunk-7Y5UDEVM.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  sessionScopeFilter
3
- } from "./chunk-LWBOSHSS.js";
3
+ } from "./chunk-PLBDXCYZ.js";
4
4
 
5
5
  // src/lib/git-task-sweep.ts
6
6
  import { execSync } from "child_process";
@@ -238,7 +238,7 @@ async function sweepTasks(projectName, options = {}) {
238
238
  }
239
239
  if (!dryRun) {
240
240
  try {
241
- const { updateTaskStatus } = await import("./tasks-crud-ADVXVR7D.js");
241
+ const { updateTaskStatus } = await import("./tasks-crud-QUIIRWE3.js");
242
242
  await updateTaskStatus({
243
243
  taskId: task.id,
244
244
  status: "needs_review",
@@ -8,13 +8,13 @@ import {
8
8
  buildStatusFilter,
9
9
  buildWikiScopeFilter,
10
10
  searchMemories
11
- } from "./chunk-PHUKD7VK.js";
11
+ } from "./chunk-H2SD2EA7.js";
12
12
  import {
13
13
  blobToVector
14
14
  } from "./chunk-OTVEIJUQ.js";
15
15
  import {
16
16
  getClient
17
- } from "./chunk-36SS3TE7.js";
17
+ } from "./chunk-XLNF3CIO.js";
18
18
 
19
19
  // src/lib/hybrid-search.ts
20
20
  var RRF_K = 60;
@@ -361,7 +361,7 @@ async function hybridSearch(queryText, agentId, options) {
361
361
  let rerankerAvailable = false;
362
362
  if (process.env.EXE_IS_DAEMON === "1") {
363
363
  try {
364
- const { isRerankerAvailable } = await import("./reranker-FIRW3XMW.js");
364
+ const { isRerankerAvailable } = await import("./reranker-3XC5UM4F.js");
365
365
  rerankerAvailable = isRerankerAvailable();
366
366
  } catch {
367
367
  }
@@ -427,7 +427,7 @@ async function hybridSearch(queryText, agentId, options) {
427
427
  ]).catch(() => []),
428
428
  includeStructuredCards ? (async () => {
429
429
  try {
430
- const { searchMemoryCards } = await import("./memory-cards-IG3K6T7M.js");
430
+ const { searchMemoryCards } = await import("./memory-cards-MGZ4P3AA.js");
431
431
  return await searchMemoryCards(effectiveQuery, agentId, fetchOptions);
432
432
  } catch {
433
433
  return [];
@@ -436,7 +436,7 @@ async function hybridSearch(queryText, agentId, options) {
436
436
  // Reflection insights: patterns, contradictions, summaries across sessions
437
437
  includeStructuredCards ? (async () => {
438
438
  try {
439
- const { searchReflections } = await import("./memory-reflection-UGK2I2T7.js");
439
+ const { searchReflections } = await import("./memory-reflection-AYPJRPU7.js");
440
440
  const insights = await searchReflections(effectiveQuery, agentId, 5, {
441
441
  includeArchived: options?.includeArchived
442
442
  });
@@ -537,7 +537,7 @@ async function hybridSearch(queryText, agentId, options) {
537
537
  let entityBoostRan = false;
538
538
  if (merged.length > 0) {
539
539
  try {
540
- const { applyEntityBoost } = await import("./entity-boost-AQBUEMJK.js");
540
+ const { applyEntityBoost } = await import("./entity-boost-VR5YOQCT.js");
541
541
  const boosted = await applyEntityBoost(merged, effectiveQuery, getClient());
542
542
  merged = boosted.results;
543
543
  graphContextMap = boosted.graphContext;
@@ -561,7 +561,7 @@ async function hybridSearch(queryText, agentId, options) {
561
561
  try {
562
562
  let rerankedRecords;
563
563
  if (graphContextMap.size > 0) {
564
- const { rerankWithContext } = await import("./reranker-FIRW3XMW.js");
564
+ const { rerankWithContext } = await import("./reranker-3XC5UM4F.js");
565
565
  const candidates = merged.map((m) => ({
566
566
  text: m.raw_text,
567
567
  context: graphContextMap.get(m.id)
@@ -569,7 +569,7 @@ async function hybridSearch(queryText, agentId, options) {
569
569
  const scored = await rerankWithContext(effectiveQuery, candidates, rerankReturnLimit);
570
570
  rerankedRecords = scored.map((s) => merged[s.index]);
571
571
  } else {
572
- const { rerank } = await import("./reranker-FIRW3XMW.js");
572
+ const { rerank } = await import("./reranker-3XC5UM4F.js");
573
573
  rerankedRecords = await rerank(effectiveQuery, merged, rerankReturnLimit);
574
574
  }
575
575
  if (rerankedRecords.length > 0) {
@@ -931,7 +931,7 @@ async function lightweightSearch(queryText, agentId, options) {
931
931
  }
932
932
  if (results.length >= 2) {
933
933
  try {
934
- const { recordCoActivations } = await import("./co-activation-BQRXOZN2.js");
934
+ const { recordCoActivations } = await import("./co-activation-K44LGZ7A.js");
935
935
  const ids = results.slice(0, 10).map((r) => r.id);
936
936
  void recordCoActivations(ids);
937
937
  } catch {
@@ -939,7 +939,7 @@ async function lightweightSearch(queryText, agentId, options) {
939
939
  }
940
940
  if (options?.includeStructuredCards !== true) return results;
941
941
  try {
942
- const { searchMemoryCards } = await import("./memory-cards-IG3K6T7M.js");
942
+ const { searchMemoryCards } = await import("./memory-cards-MGZ4P3AA.js");
943
943
  const cardResults = await searchMemoryCards(queryText, agentId, options);
944
944
  if (cardResults.length > 0) {
945
945
  return rrfMergeMulti([results, cardResults], limit, RRF_K, [1, 0.85]);
@@ -417,8 +417,12 @@ function buildTeam(employees, data) {
417
417
  }
418
418
  if (data.plan) {
419
419
  const planLabel = data.plan === "pro" ? "Solopreneur" : data.plan.charAt(0).toUpperCase() + data.plan.slice(1);
420
- const limit = data.employeeLimit ?? "?";
420
+ const limit = data.employeeLimit === -1 ? "\u221E" : data.employeeLimit ?? "?";
421
421
  lines.push(` Plan: ${planLabel} | ${employees.length}/${limit} employees | https://askexe.com`);
422
+ if (data.planChangeNotice) {
423
+ lines.push(` \u{1F389} ${data.planChangeNotice}`);
424
+ }
425
+ lines.push(` Upgraded your plan? Run: exe-os license refresh`);
422
426
  }
423
427
  return lines;
424
428
  }
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  clean,
3
3
  stableId
4
- } from "./chunk-HJSMIHEY.js";
4
+ } from "./chunk-DY3J6GQO.js";
5
5
 
6
6
  // src/lib/reflection-checkpoints.ts
7
7
  function parsePayload(payload) {
@@ -4,32 +4,32 @@ import {
4
4
  } from "./chunk-HMP5VT6A.js";
5
5
  import {
6
6
  createTask
7
- } from "./chunk-OXGNFT3L.js";
7
+ } from "./chunk-7SDS5VCL.js";
8
8
  import {
9
9
  getActiveAgent
10
- } from "./chunk-RJHOFX72.js";
10
+ } from "./chunk-EOPSIIEH.js";
11
11
  import {
12
12
  ensureEmployee,
13
13
  isValidSessionScope,
14
14
  logTaskDispatch,
15
15
  resolveExeSession
16
- } from "./chunk-LWBOSHSS.js";
16
+ } from "./chunk-PLBDXCYZ.js";
17
17
  import {
18
18
  recordOrchestrationEventBestEffort
19
- } from "./chunk-RVF6JBHW.js";
19
+ } from "./chunk-HV5CUDOE.js";
20
20
  import {
21
21
  getAgentRuntime,
22
22
  validateRuntimeModel
23
- } from "./chunk-Q26VSIXA.js";
23
+ } from "./chunk-QVFJCFNM.js";
24
24
  import {
25
25
  getLicenseSync
26
- } from "./chunk-CQ2T4A2D.js";
26
+ } from "./chunk-EPBB2OD3.js";
27
27
  import {
28
28
  getAgentContext
29
29
  } from "./chunk-GJV3WDWM.js";
30
30
  import {
31
31
  isCoordinatorName
32
- } from "./chunk-36SS3TE7.js";
32
+ } from "./chunk-XLNF3CIO.js";
33
33
 
34
34
  // src/mcp/tools/create-task.ts
35
35
  import { z } from "zod";
@@ -345,7 +345,7 @@ function registerCreateTask(server) {
345
345
  session_scope: sessionScope,
346
346
  created_at: (/* @__PURE__ */ new Date()).toISOString()
347
347
  }), "utf-8");
348
- const { recordOrchestrationEventBestEffort: recordOE } = await import("./orchestration-events-SKESCF4F.js");
348
+ const { recordOrchestrationEventBestEffort: recordOE } = await import("./orchestration-events-O5P5NEKS.js");
349
349
  recordOE({
350
350
  eventType: "signal.created",
351
351
  source: "create-task.mcp",
@@ -377,7 +377,7 @@ function registerCreateTask(server) {
377
377
  let projectConflictOpts = {};
378
378
  try {
379
379
  const { getClient } = await import("./lib/database.js");
380
- const { sessionScopeFilter } = await import("./task-scope-75JK27V5.js");
380
+ const { sessionScopeFilter } = await import("./task-scope-OIHLMQOQ.js");
381
381
  const client = getClient();
382
382
  const scope = sessionScopeFilter(task.sessionScope || callerRoot || exeSession || null);
383
383
  const existing = await client.execute({
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  getIdentity,
3
3
  loadEmployeesSync
4
- } from "./chunk-36SS3TE7.js";
4
+ } from "./chunk-XLNF3CIO.js";
5
5
 
6
6
  // src/lib/drift-probes.ts
7
7
  var DRIFT_THRESHOLD = 80;
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  listReminders
3
- } from "./chunk-MM7EYJJ3.js";
3
+ } from "./chunk-EVUXF2G4.js";
4
4
 
5
5
  // src/mcp/tools/list-reminders.ts
6
6
  import { z } from "zod";
@@ -3,11 +3,11 @@ import {
3
3
  } from "./chunk-75H4R62K.js";
4
4
  import {
5
5
  initStore
6
- } from "./chunk-PHUKD7VK.js";
6
+ } from "./chunk-H2SD2EA7.js";
7
7
  import {
8
8
  getClient,
9
9
  isInitialized
10
- } from "./chunk-36SS3TE7.js";
10
+ } from "./chunk-XLNF3CIO.js";
11
11
 
12
12
  // src/lib/schedules.ts
13
13
  import crypto from "crypto";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  checkLicense,
3
3
  loadLicense
4
- } from "./chunk-QLVMJGUQ.js";
4
+ } from "./chunk-VY7345RO.js";
5
5
 
6
6
  // src/lib/license-gate.ts
7
7
  var _cachedLicense = null;
@@ -2,10 +2,10 @@ import {
2
2
  listWorkflowDefinitions,
3
3
  runWorkflow,
4
4
  startWorkflow
5
- } from "./chunk-LRWB35MD.js";
5
+ } from "./chunk-HGM6NZQH.js";
6
6
  import {
7
7
  ingest
8
- } from "./chunk-DTP4HXM3.js";
8
+ } from "./chunk-X62GD6QW.js";
9
9
  import {
10
10
  initCRMBridge
11
11
  } from "./chunk-ONKIWA3R.js";
@@ -2,7 +2,7 @@ import {
2
2
  getClient,
3
3
  isCoordinatorName,
4
4
  loadEmployeesSync
5
- } from "./chunk-36SS3TE7.js";
5
+ } from "./chunk-XLNF3CIO.js";
6
6
 
7
7
  // src/lib/steward-gate.ts
8
8
  import crypto from "crypto";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  computeDaemonHeapCapMb
3
- } from "./chunk-7XGDTKHX.js";
3
+ } from "./chunk-CMDC5D7S.js";
4
4
  import {
5
5
  resolveEmbeddingsEnabled
6
6
  } from "./chunk-KWOAM7TA.js";
@@ -2,7 +2,7 @@ import {
2
2
  dispatchTaskToEmployee,
3
3
  markTaskNotificationsRead,
4
4
  notifyTaskDone
5
- } from "./chunk-TRXBT24O.js";
5
+ } from "./chunk-BFHBHQFA.js";
6
6
  import {
7
7
  cleanupReviewFile,
8
8
  createTaskCore,
@@ -11,7 +11,7 @@ import {
11
11
  sessionScopeFilter,
12
12
  updateTaskStatus,
13
13
  writeNotification
14
- } from "./chunk-LWBOSHSS.js";
14
+ } from "./chunk-PLBDXCYZ.js";
15
15
  import {
16
16
  orgBus
17
17
  } from "./chunk-MP2AFCGL.js";
@@ -19,7 +19,7 @@ import {
19
19
  getClient,
20
20
  getCoordinatorName,
21
21
  isCoordinatorName
22
- } from "./chunk-36SS3TE7.js";
22
+ } from "./chunk-XLNF3CIO.js";
23
23
  import {
24
24
  EXE_AI_DIR
25
25
  } from "./chunk-7Y5UDEVM.js";
@@ -61,7 +61,7 @@ async function cascadeUnblock(taskId, baseDir, now) {
61
61
  }
62
62
  if (unblockedRows.rows.length > 0 && !process.env.VITEST) {
63
63
  try {
64
- const { dispatchTaskToEmployee: dispatchTaskToEmployee2 } = await import("./tasks-notify-NAA6IHHW.js");
64
+ const { dispatchTaskToEmployee: dispatchTaskToEmployee2 } = await import("./tasks-notify-ANYLB5GU.js");
65
65
  const dispatched = /* @__PURE__ */ new Set();
66
66
  for (const ur of unblockedRows.rows) {
67
67
  const assignee = String(ur.assigned_to);
@@ -333,7 +333,7 @@ async function updateTask(input) {
333
333
  await markTaskNotificationsRead(taskFile);
334
334
  if (isCompletionReviewTransition && !isCoordinator && row.reviewer) {
335
335
  try {
336
- const { writeNotification: writeNotification2 } = await import("./notifications-3MO6HVJM.js");
336
+ const { writeNotification: writeNotification2 } = await import("./notifications-BBQ23ORD.js");
337
337
  const reviewer = String(row.reviewer);
338
338
  await writeNotification2({
339
339
  agentId: reviewer,
@@ -15,7 +15,8 @@ function registryProxyOptionsFromEnv(env = process.env) {
15
15
  upstreamToken,
16
16
  pullTokens,
17
17
  allowedNamespace: env.EXE_REGISTRY_PROXY_ALLOWED_NAMESPACE || "askexe",
18
- licenseValidatorUrl: env.EXE_REGISTRY_PROXY_LICENSE_VALIDATOR_URL || "https://api.askexe.com/v1/license/validate"
18
+ licenseValidatorUrl: env.EXE_REGISTRY_PROXY_LICENSE_VALIDATOR_URL || "https://api.askexe.com/v1/license/validate",
19
+ databaseUrl: env.EXE_REGISTRY_PROXY_DATABASE_URL || env.DATABASE_URL || void 0
19
20
  };
20
21
  }
21
22
  function assertRegistryProxyConfig(options) {
@@ -58,6 +59,12 @@ function parseBasicAuth(header) {
58
59
  return null;
59
60
  }
60
61
  }
62
+ function parseBearerToken(header) {
63
+ if (!header) return null;
64
+ const match = /^Bearer\s+(.+)$/i.exec(header.trim());
65
+ const token = match?.[1]?.trim();
66
+ return token ? token : null;
67
+ }
61
68
  function unauthorized(res) {
62
69
  res.writeHead(401, {
63
70
  "www-authenticate": 'Basic realm="AskExe Registry Proxy"',
@@ -119,6 +126,78 @@ function createRegistryProxyServer(options) {
119
126
  const upstream = new URL(options.upstream ?? "https://ghcr.io");
120
127
  const namespace = options.allowedNamespace ?? "askexe";
121
128
  const upstreamAuth = Buffer.from(`${options.upstreamUsername ?? "askexe"}:${options.upstreamToken}`).toString("base64");
129
+ let manifestPool = null;
130
+ let manifestPoolInit = null;
131
+ async function getManifestPool() {
132
+ if (!options.databaseUrl) return null;
133
+ if (manifestPool) return manifestPool;
134
+ if (!manifestPoolInit) {
135
+ manifestPoolInit = (async () => {
136
+ const { Pool } = await import("pg");
137
+ const { pgSslConfig } = await import("./pg-ssl-7JXQFL4I.js");
138
+ const pool = new Pool({ connectionString: options.databaseUrl, max: 2, ...pgSslConfig() });
139
+ manifestPool = pool;
140
+ return pool;
141
+ })().catch((err) => {
142
+ console.error("[registry-proxy] manifest DB pool init failed:", err instanceof Error ? err.message : String(err));
143
+ manifestPoolInit = null;
144
+ return null;
145
+ });
146
+ }
147
+ return manifestPoolInit;
148
+ }
149
+ async function isLicenseKeyValidLocally(pool, token) {
150
+ try {
151
+ const r = await pool.query(
152
+ "SELECT 1 FROM billing.licenses WHERE key = $1 AND status = 'active' AND (expires_at IS NULL OR expires_at > now()) LIMIT 1",
153
+ [token]
154
+ );
155
+ return r.rows.length > 0;
156
+ } catch (err) {
157
+ console.error("[registry-proxy] local license validation failed:", err instanceof Error ? err.message : String(err));
158
+ return false;
159
+ }
160
+ }
161
+ async function isManifestAuthorized(token) {
162
+ if (timingSafeIncludes(options.pullTokens, token)) return true;
163
+ if (!isLicenseKeyFormat(token)) return false;
164
+ const pool = await getManifestPool();
165
+ if (pool && await isLicenseKeyValidLocally(pool, token)) return true;
166
+ if (options.licenseValidatorUrl) return validateLicenseKey(token, options.licenseValidatorUrl);
167
+ return false;
168
+ }
169
+ async function handleStackManifest(req, res) {
170
+ const token = parseBearerToken(req.headers.authorization);
171
+ if (!token || !await isManifestAuthorized(token)) {
172
+ unauthorized(res);
173
+ return;
174
+ }
175
+ const pool = await getManifestPool();
176
+ if (!pool) {
177
+ res.writeHead(503, { "content-type": "application/json" });
178
+ res.end(JSON.stringify({ error: "stack manifest source unavailable" }));
179
+ return;
180
+ }
181
+ try {
182
+ const result = await pool.query(
183
+ "SELECT manifest FROM billing.stack_releases WHERE status = $1 ORDER BY string_to_array(version, '.')::int[] DESC LIMIT 1",
184
+ ["released"]
185
+ );
186
+ if (result.rows.length === 0) {
187
+ res.writeHead(503, { "content-type": "application/json" });
188
+ res.end(JSON.stringify({ error: "no released stack manifest available" }));
189
+ return;
190
+ }
191
+ const manifest = result.rows[0].manifest;
192
+ const body = typeof manifest === "string" ? manifest : JSON.stringify(manifest);
193
+ res.writeHead(200, { "content-type": "application/json", "cache-control": "max-age=60" });
194
+ res.end(body);
195
+ } catch (err) {
196
+ console.error("[registry-proxy] stack manifest query failed:", err instanceof Error ? err.message : String(err));
197
+ res.writeHead(503, { "content-type": "application/json" });
198
+ res.end(JSON.stringify({ error: "stack manifest query failed" }));
199
+ }
200
+ }
122
201
  return createServer(async (req, res) => {
123
202
  const requestUrl = new URL(req.url ?? "/", `http://${req.headers.host ?? "localhost"}`);
124
203
  if (requestUrl.pathname === "/health") {
@@ -126,6 +205,10 @@ function createRegistryProxyServer(options) {
126
205
  res.end(JSON.stringify({ ok: true, service: "exe-registry-proxy", upstream: upstream.origin, namespace }));
127
206
  return;
128
207
  }
208
+ if (requestUrl.pathname === "/v1/stack-manifest.json") {
209
+ await handleStackManifest(req, res);
210
+ return;
211
+ }
129
212
  if (!isAllowedPath(requestUrl.pathname, namespace)) {
130
213
  res.writeHead(404, { "content-type": "application/json" });
131
214
  res.end(JSON.stringify({ error: "registry path not allowed" }));
@@ -180,6 +263,14 @@ async function runRegistryProxy(options = registryProxyOptionsFromEnv()) {
180
263
  await new Promise((resolve) => server.listen(options.port, options.host, resolve));
181
264
  console.log(`exe-registry-proxy listening on ${options.host ?? "0.0.0.0"}:${options.port}`);
182
265
  console.log(`proxying /v2/${options.allowedNamespace ?? "askexe"}/* -> ${options.upstream ?? "https://ghcr.io"}`);
266
+ const { licenseSyncConfigFromEnv, startLicenseSyncScheduler } = await import("./license-sync-LX73IEBH.js");
267
+ const syncConfig = licenseSyncConfigFromEnv();
268
+ if (syncConfig) {
269
+ startLicenseSyncScheduler(syncConfig);
270
+ console.log(
271
+ `[license-sync] scheduler started (interval=${syncConfig.intervalMs ?? 36e5}ms, D1\u2192billing.licenses, one-way)`
272
+ );
273
+ }
183
274
  }
184
275
 
185
276
  export {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  recordOrchestrationEventBestEffort
3
- } from "./chunk-RVF6JBHW.js";
3
+ } from "./chunk-HV5CUDOE.js";
4
4
  import {
5
5
  atomicWriteJsonSync
6
6
  } from "./chunk-SHIICYJW.js";