@askexenow/exe-os 0.9.322 → 0.9.324

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 (319) hide show
  1. package/deploy/compose/.env.customer.example +1 -1
  2. package/deploy/compose/.env.example +18 -1
  3. package/deploy/compose/PROTECTED_FILES.md +4 -1
  4. package/deploy/compose/add-routes.sh +22 -0
  5. package/deploy/compose/cloudflared/config.yml.example +6 -3
  6. package/deploy/compose/docker-compose.yml +36 -1
  7. package/deploy/compose/generate-env.ts +40 -2
  8. package/deploy/compose/sso-edge/default.conf.template +11 -0
  9. package/deploy/compose/sso-edge/sso-redirect.conf +90 -21
  10. package/deploy/stack-manifests/v0.9.json +110 -2
  11. package/dist/{active-agent-M5NJFEBM.js → active-agent-CVSB2EER.js} +3 -3
  12. package/dist/{active-agent-SHM4QSRJ.js → active-agent-IUVRZOSF.js} +3 -3
  13. package/dist/{agentic-ontology-HQKCU7LG.js → agentic-ontology-2QFPBIQP.js} +1 -1
  14. package/dist/backfill-gate-J7UXFNXU.js +19 -0
  15. package/dist/{backfill-metadata-CXWFCTBO.js → backfill-metadata-W3PRQPVV.js} +4 -4
  16. package/dist/{behaviors-J47D342W.js → behaviors-MQCADHAD.js} +5 -5
  17. package/dist/bin/agentic-ontology-backfill.js +5 -5
  18. package/dist/bin/agentic-reflection-backfill.js +6 -6
  19. package/dist/bin/agentic-semantic-label.js +5 -5
  20. package/dist/bin/backfill-conversations.js +11 -11
  21. package/dist/bin/backfill-responses.js +11 -11
  22. package/dist/bin/backfill-vectors.js +102 -22
  23. package/dist/bin/bulk-sync-postgres.js +14 -14
  24. package/dist/bin/cc-doctor.js +5 -5
  25. package/dist/bin/cleanup-stale-review-tasks.js +20 -13
  26. package/dist/bin/cli.js +28 -31
  27. package/dist/bin/customer-readiness.js +1 -0
  28. package/dist/bin/deferred-daemon-restart.js +80 -77
  29. package/dist/bin/exe-agent-config.js +3 -3
  30. package/dist/bin/exe-agent.js +5 -5
  31. package/dist/bin/exe-assign.js +10 -10
  32. package/dist/bin/exe-boot.js +32 -23
  33. package/dist/bin/exe-call.js +5 -5
  34. package/dist/bin/exe-cloud.js +120 -47
  35. package/dist/bin/exe-config-dump.js +3 -3
  36. package/dist/bin/exe-dispatch.js +48 -14
  37. package/dist/bin/exe-doctor.js +4 -4
  38. package/dist/bin/exe-export-behaviors.js +7 -7
  39. package/dist/bin/exe-forget.js +6 -6
  40. package/dist/bin/exe-gateway.js +8 -8
  41. package/dist/bin/exe-healthcheck.js +17 -8
  42. package/dist/bin/exe-heartbeat.js +20 -13
  43. package/dist/bin/exe-kill.js +23 -16
  44. package/dist/bin/exe-launch-agent.js +30 -27
  45. package/dist/bin/exe-new-employee.js +9 -9
  46. package/dist/bin/exe-pending-messages.js +21 -14
  47. package/dist/bin/exe-pending-notifications.js +20 -13
  48. package/dist/bin/exe-pending-reviews.js +20 -13
  49. package/dist/bin/exe-rename.js +5 -5
  50. package/dist/bin/exe-review.js +22 -15
  51. package/dist/bin/exe-search.js +8 -13
  52. package/dist/bin/exe-session-cleanup.js +39 -22
  53. package/dist/bin/exe-settings.js +15 -15
  54. package/dist/bin/exe-start-codex.js +51 -34
  55. package/dist/bin/exe-start-opencode.js +8 -8
  56. package/dist/bin/exe-status.js +21 -14
  57. package/dist/bin/exe-support.js +3 -3
  58. package/dist/bin/exe-team.js +3 -3
  59. package/dist/bin/exe-watchdog.js +278 -39
  60. package/dist/bin/git-sweep.js +21 -14
  61. package/dist/bin/graph-backfill.js +4 -4
  62. package/dist/bin/graph-export.js +5 -5
  63. package/dist/bin/import-history.js +7 -7
  64. package/dist/bin/install-launchd.js +2 -2
  65. package/dist/bin/install.js +121 -88
  66. package/dist/bin/intercom-check.js +4 -4
  67. package/dist/bin/mcp-sessions.js +2 -2
  68. package/dist/bin/orchestration-metrics.js +4 -4
  69. package/dist/bin/postgres-agentic-reflection-backfill.js +2 -2
  70. package/dist/bin/postgres-agentic-semantic-backfill.js +1 -1
  71. package/dist/bin/pre-publish.js +1 -1
  72. package/dist/bin/registry-proxy.js +1 -1
  73. package/dist/bin/scan-tasks.js +20 -13
  74. package/dist/bin/setup.js +1 -1
  75. package/dist/bin/shard-migrate.js +4 -4
  76. package/dist/bin/stack-update.js +4 -4
  77. package/dist/bin/vps-health-gate.js +1 -1
  78. package/dist/{capability-cards-H7H3MU74.js → capability-cards-STD3NMCR.js} +2 -2
  79. package/dist/{capacity-monitor-WAEHVBL7.js → capacity-monitor-6O3PWYNM.js} +21 -14
  80. package/dist/{catchup-brief-L42STIDR.js → catchup-brief-EDQ3VZCF.js} +23 -16
  81. package/dist/{chunk-HKSJSW2V.js → chunk-2E2NKFXK.js} +1 -1
  82. package/dist/{chunk-NYFPFOYM.js → chunk-2NY7LZT7.js} +1 -1
  83. package/dist/{chunk-DGFIXJ4S.js → chunk-2QD5M47V.js} +3 -3
  84. package/dist/{chunk-3M73L663.js → chunk-2YWUZPHE.js} +2 -2
  85. package/dist/{chunk-LB77CSLO.js → chunk-2ZW4AQ24.js} +3 -3
  86. package/dist/{chunk-E32KARET.js → chunk-376J36IW.js} +4 -4
  87. package/dist/{chunk-CWQAXO3O.js → chunk-5RACW3LX.js} +28 -3
  88. package/dist/{chunk-VSXGFHJY.js → chunk-5VT45EV6.js} +1 -1
  89. package/dist/{chunk-X62GD6QW.js → chunk-5YCOEPEX.js} +2 -2
  90. package/dist/{chunk-TKBWBHFV.js → chunk-6FWMLTF2.js} +1 -1
  91. package/dist/chunk-6IWLAQ7O.js +40 -0
  92. package/dist/{chunk-WFHYAKEU.js → chunk-6XAAJ5OV.js} +1 -1
  93. package/dist/{chunk-4Z47UMMM.js → chunk-7M6TXYRQ.js} +23 -23
  94. package/dist/{chunk-HWC5W34K.js → chunk-7PLMYXPG.js} +1 -1
  95. package/dist/{chunk-DDKDN4HV.js → chunk-A47MXY2I.js} +7 -0
  96. package/dist/{chunk-SQ5JWDJ2.js → chunk-AEFZEJKW.js} +1 -1
  97. package/dist/{chunk-657AQEPY.js → chunk-AVKZIG4A.js} +1 -1
  98. package/dist/{chunk-EPBB2OD3.js → chunk-BB5IKY7B.js} +2 -2
  99. package/dist/{chunk-3JW3ZXCP.js → chunk-BC7IIR3A.js} +65 -39
  100. package/dist/{chunk-WSYKLS2Y.js → chunk-BDJQWBWF.js} +3 -3
  101. package/dist/{chunk-VY7345RO.js → chunk-BMSAJ2IH.js} +1 -1
  102. package/dist/{chunk-OI63OVCR.js → chunk-C7B44DJI.js} +1 -1
  103. package/dist/{chunk-GA76RGSP.js → chunk-CS6MYGNB.js} +5 -5
  104. package/dist/{chunk-6N4LYEDI.js → chunk-CSPHV5DJ.js} +1 -1
  105. package/dist/{chunk-HGM6NZQH.js → chunk-DYUISOIT.js} +1 -1
  106. package/dist/{signal-paths-4GOIRLGH.js → chunk-EIKATSE4.js} +3 -4
  107. package/dist/{chunk-G5TP2D2U.js → chunk-EWDTTTZP.js} +3 -3
  108. package/dist/{chunk-TI6YX3L5.js → chunk-F2RK5YWB.js} +36 -27
  109. package/dist/{chunk-HV5CUDOE.js → chunk-F6TJIWN5.js} +1 -1
  110. package/dist/{chunk-WCCR5IFR.js → chunk-FPTBCPI3.js} +2 -2
  111. package/dist/{chunk-QVFJCFNM.js → chunk-FROUDYRT.js} +33 -2
  112. package/dist/{chunk-T6AUMO5X.js → chunk-GIFDGNIL.js} +1 -1
  113. package/dist/{chunk-OFR7KQ37.js → chunk-HAYDXMW6.js} +3 -3
  114. package/dist/{chunk-V2ESQU3S.js → chunk-HBKYKN3S.js} +3 -3
  115. package/dist/{chunk-LCZ55G5G.js → chunk-HZ5J2GFE.js} +136 -66
  116. package/dist/{chunk-EOPSIIEH.js → chunk-ID3V4BWS.js} +1 -1
  117. package/dist/{chunk-ABGDTMKC.js → chunk-JRD7ARQ6.js} +60 -2
  118. package/dist/{chunk-7FBPLVHM.js → chunk-KADUJ7PE.js} +3 -3
  119. package/dist/{chunk-KLG53B63.js → chunk-KJOQLNX2.js} +1 -1
  120. package/dist/{chunk-AZL3EUR3.js → chunk-KK67DSCO.js} +229 -29
  121. package/dist/{chunk-H2SD2EA7.js → chunk-KLDQFOFY.js} +23 -9
  122. package/dist/chunk-KPIN44GZ.js +67 -0
  123. package/dist/{chunk-PLBDXCYZ.js → chunk-KUJGADX6.js} +1491 -606
  124. package/dist/{chunk-GN3IWZDH.js → chunk-KWWHRJGG.js} +660 -539
  125. package/dist/{chunk-ERSFOJGC.js → chunk-LUOQCGBO.js} +20 -11
  126. package/dist/{chunk-CXXERHNC.js → chunk-LWAGAC3H.js} +1 -1
  127. package/dist/{chunk-7BZ6TOZN.js → chunk-MB2YT5VQ.js} +3 -3
  128. package/dist/{chunk-KXP3CUTL.js → chunk-MCEXBLLK.js} +3 -3
  129. package/dist/{chunk-A3KUGBDP.js → chunk-MIWPKWXQ.js} +1 -1
  130. package/dist/{chunk-7CUF27OT.js → chunk-MKIFYIXC.js} +1 -1
  131. package/dist/{chunk-ONKIWA3R.js → chunk-ML4S5SHZ.js} +3 -1
  132. package/dist/{chunk-BFHBHQFA.js → chunk-MWIX3YKA.js} +5 -5
  133. package/dist/{chunk-6UQRJCKK.js → chunk-NBDTQVWU.js} +2 -2
  134. package/dist/{chunk-KK4ZOYXJ.js → chunk-NGACCR2M.js} +80 -40
  135. package/dist/{chunk-CMDC5D7S.js → chunk-NLEW62VC.js} +6 -0
  136. package/dist/{chunk-QYLDCPNG.js → chunk-PGFYWVOB.js} +1 -1
  137. package/dist/{chunk-XEBN5CPD.js → chunk-PGUISLOT.js} +3 -3
  138. package/dist/{chunk-MYMA23KC.js → chunk-PJTEZLAM.js} +1 -1
  139. package/dist/{chunk-QNUHDEPI.js → chunk-POOMY3CS.js} +4 -4
  140. package/dist/{chunk-2GBGIXKH.js → chunk-PV7IG4V6.js} +1 -1
  141. package/dist/{chunk-SENJA7BZ.js → chunk-QDI77B3E.js} +54 -7
  142. package/dist/{chunk-XLNF3CIO.js → chunk-QGOMYIVT.js} +119 -24
  143. package/dist/{chunk-HIOO7DZ2.js → chunk-QQFZ32WS.js} +5 -5
  144. package/dist/{chunk-KL5WYWS3.js → chunk-SOXUF34Y.js} +2 -2
  145. package/dist/{chunk-6XM6PZXQ.js → chunk-SPO2RLOB.js} +1 -1
  146. package/dist/{chunk-ROMB2HH4.js → chunk-T3XHH5FE.js} +6 -6
  147. package/dist/{chunk-6SXJZHRJ.js → chunk-TA3A4UQL.js} +1 -1
  148. package/dist/{chunk-XP53WEXP.js → chunk-TGVKQ3QB.js} +3 -3
  149. package/dist/{chunk-XC7C3GQ2.js → chunk-TNS6U2K7.js} +30 -19
  150. package/dist/{chunk-JXEMAB4M.js → chunk-UAIMI7CK.js} +1 -1
  151. package/dist/{chunk-YIFZZYQD.js → chunk-UBYAKNRF.js} +2 -2
  152. package/dist/{chunk-6IBUQBMY.js → chunk-UXYQLOFW.js} +198 -39
  153. package/dist/{chunk-C4BIZXKB.js → chunk-UYOW7U24.js} +1 -1
  154. package/dist/{chunk-NFM6VHL7.js → chunk-V4VYIHSL.js} +1 -1
  155. package/dist/{chunk-QQOH3I4A.js → chunk-VDUHWQFA.js} +1 -1
  156. package/dist/{chunk-EVUXF2G4.js → chunk-W5GBB23I.js} +1 -1
  157. package/dist/{chunk-FANIBYUO.js → chunk-WF3J6GJZ.js} +2 -2
  158. package/dist/{chunk-NAHAOFTY.js → chunk-WGHTISNK.js} +3 -3
  159. package/dist/{chunk-F5FAD2YR.js → chunk-WGOAILWE.js} +2 -2
  160. package/dist/{chunk-LOE2N23P.js → chunk-WJICX53Z.js} +1 -1
  161. package/dist/{skill-refinement-YLIAY7V4.js → chunk-Y2KBHLEO.js} +3 -11
  162. package/dist/{chunk-PISGLNV7.js → chunk-Y34FDPOY.js} +5 -5
  163. package/dist/{chunk-ORC5AO7E.js → chunk-YBHOWK3L.js} +2 -2
  164. package/dist/{chunk-7SDS5VCL.js → chunk-ZDNJ3TSB.js} +7 -7
  165. package/dist/{chunk-CHSRSESS.js → chunk-ZRZ2Z6RZ.js} +1 -1
  166. package/dist/{cleanup-graph-garbage-MX5JDTJA.js → cleanup-graph-garbage-2YH52ADR.js} +4 -4
  167. package/dist/{co-activation-K44LGZ7A.js → co-activation-7F3J2GC7.js} +2 -2
  168. package/dist/{co-occurrence-N62HJTRP.js → co-occurrence-B36Q5GY3.js} +2 -2
  169. package/dist/{code-context-index-6YQ3DGCN.js → code-context-index-2PUBBQOE.js} +3 -3
  170. package/dist/{crdt-sync-BO76VVRX.js → crdt-sync-MXHPR6V6.js} +1 -1
  171. package/dist/{crm-bridge-BVTB6LZK.js → crm-bridge-CZLEW2LW.js} +1 -1
  172. package/dist/{crm-webhook-UZLTHXAS.js → crm-webhook-56MWGMRY.js} +2 -2
  173. package/dist/{cto-delegation-gate-NVMRONA2.js → cto-delegation-gate-26BD7NEE.js} +19 -12
  174. package/dist/{daemon-orchestration-JI3RD5EZ.js → daemon-orchestration-IBP6PWEG.js} +31 -16
  175. package/dist/{db-backup-ITRADB2J.js → db-backup-XLID57KW.js} +1 -1
  176. package/dist/{doc-graph-extractor-L7YESUSI.js → doc-graph-extractor-VBZ6XTTE.js} +2 -2
  177. package/dist/{documents-7BFXA6V3.js → documents-C5LYSJT3.js} +10 -10
  178. package/dist/{dreaming-NRTMPNPZ.js → dreaming-LMVDIC5C.js} +20 -13
  179. package/dist/{exe-drift-GLJIM7EI.js → exe-drift-T3K6WA47.js} +3 -3
  180. package/dist/{exe-export-THIAYHXK.js → exe-export-QCTASWXI.js} +7 -7
  181. package/dist/{exe-import-3Y4VOUYL.js → exe-import-WNP5A7VA.js} +7 -7
  182. package/dist/{exe-key-IPGY4RMU.js → exe-key-JM3JXE2E.js} +78 -75
  183. package/dist/{exe-snapshot-2ZEWCDYK.js → exe-snapshot-ODDJUEM5.js} +23 -16
  184. package/dist/{fast-db-init-TLYUWCDE.js → fast-db-init-O6A3TK3F.js} +1 -1
  185. package/dist/{founder-context-J362DNU4.js → founder-context-FYTF4IMD.js} +2 -2
  186. package/dist/gateway/index.js +9 -9
  187. package/dist/{git-staleness-BRDHTHNS.js → git-staleness-YA5J6VYJ.js} +2 -2
  188. package/dist/{global-procedures-FNUKY2LF.js → global-procedures-76NDWTYN.js} +4 -4
  189. package/dist/{graph-auto-extract-AJZUV3PO.js → graph-auto-extract-I7QL2TY5.js} +2 -2
  190. package/dist/hooks/bug-report-worker.js +22 -15
  191. package/dist/hooks/codex-stop-task-finalizer.js +22 -15
  192. package/dist/hooks/commit-complete.js +22 -15
  193. package/dist/hooks/error-recall.js +6 -6
  194. package/dist/hooks/exe-heartbeat-hook.js +3 -3
  195. package/dist/hooks/ingest-worker.js +6 -6
  196. package/dist/hooks/ingest.js +6 -6
  197. package/dist/hooks/instructions-loaded.js +4 -4
  198. package/dist/hooks/manifest.json +20 -20
  199. package/dist/hooks/notification.js +4 -4
  200. package/dist/hooks/post-compact.js +21 -14
  201. package/dist/hooks/post-tool-combined.js +8 -8
  202. package/dist/hooks/pre-compact.js +22 -21
  203. package/dist/hooks/pre-tool-use.js +29 -19
  204. package/dist/hooks/prompt-submit.js +89 -72
  205. package/dist/hooks/session-end.js +27 -26
  206. package/dist/hooks/session-start.js +13 -13
  207. package/dist/hooks/stop.js +28 -21
  208. package/dist/hooks/subagent-stop.js +24 -41
  209. package/dist/hooks/summary-worker.js +27 -25
  210. package/dist/index.js +30 -23
  211. package/dist/{installer-SC7CQBYY.js → installer-3EYHBKWB.js} +5 -5
  212. package/dist/{installer-UEF44TWQ.js → installer-3VZMDDMJ.js} +5 -5
  213. package/dist/{installer-2EKTDQZB.js → installer-GYABVCB7.js} +5 -5
  214. package/dist/intercom-queue-ZCNT4LYU.js +53 -0
  215. package/dist/lib/agent-config.js +7 -1
  216. package/dist/lib/cloud-sync.js +16 -14
  217. package/dist/lib/consolidation.js +5 -5
  218. package/dist/lib/database.js +10 -2
  219. package/dist/lib/db-daemon-client.js +3 -3
  220. package/dist/lib/db.js +10 -2
  221. package/dist/lib/device-registry.js +1 -1
  222. package/dist/lib/embed-worker.js +28 -0
  223. package/dist/lib/embedder.js +3 -3
  224. package/dist/lib/employee-templates.js +5 -5
  225. package/dist/lib/employees.js +2 -2
  226. package/dist/lib/exe-daemon-client.js +2 -2
  227. package/dist/lib/exe-daemon.js +393 -140
  228. package/dist/lib/hybrid-search.js +5 -5
  229. package/dist/lib/identity.js +2 -2
  230. package/dist/lib/license.js +2 -2
  231. package/dist/lib/messaging.js +20 -13
  232. package/dist/lib/registry-proxy.js +1 -1
  233. package/dist/lib/reminders.js +3 -3
  234. package/dist/lib/schedules.js +5 -5
  235. package/dist/lib/session-registry.js +6 -4
  236. package/dist/lib/skill-learning.js +6 -6
  237. package/dist/lib/store.js +4 -4
  238. package/dist/lib/task-router.js +3 -3
  239. package/dist/lib/tasks.js +21 -14
  240. package/dist/lib/tmux-routing.js +29 -12
  241. package/dist/lib/token-spend.js +3 -3
  242. package/dist/{license-gate-YUUSIPJ7.js → license-gate-73XGUIVP.js} +3 -3
  243. package/dist/{license-sync-LX73IEBH.js → license-sync-CG5YRUVH.js} +2 -2
  244. package/dist/mcp/register-tools.js +75 -72
  245. package/dist/mcp/server.js +96 -130
  246. package/dist/mcp/tools/complete-reminder.js +4 -4
  247. package/dist/mcp/tools/create-reminder.js +4 -4
  248. package/dist/mcp/tools/create-task.js +37 -18
  249. package/dist/mcp/tools/deactivate-behavior.js +7 -7
  250. package/dist/mcp/tools/list-reminders.js +4 -4
  251. package/dist/mcp/tools/list-tasks.js +23 -16
  252. package/dist/mcp/tools/send-message.js +22 -15
  253. package/dist/mcp/tools/update-task.js +22 -15
  254. package/dist/{mcp-http-config-MBG5AQNH.js → mcp-http-config-TT7PXZLX.js} +3 -3
  255. package/dist/{memory-cards-MGZ4P3AA.js → memory-cards-6NGUDUDN.js} +4 -4
  256. package/dist/{memory-graph-extractor-44P2ATID.js → memory-graph-extractor-FIMS3VQR.js} +3 -3
  257. package/dist/{memory-poisoning-defense-3CYFKNLA.js → memory-poisoning-defense-M3LOQ3XU.js} +2 -2
  258. package/dist/{memory-pressure-watchdog-6PFLEOUO.js → memory-pressure-watchdog-45GABDWH.js} +20 -13
  259. package/dist/{memory-queue-client-BZD6MXA5.js → memory-queue-client-BDYKFNB4.js} +3 -3
  260. package/dist/{memory-reflection-AYPJRPU7.js → memory-reflection-LANCFYK2.js} +7 -9
  261. package/dist/{notifications-BBQ23ORD.js → notifications-N5NKUYAU.js} +19 -12
  262. package/dist/{orchestration-events-O5P5NEKS.js → orchestration-events-KVNRNIPR.js} +3 -3
  263. package/dist/{orchestrator-SERM6FDY.js → orchestrator-VTF5BR26.js} +21 -14
  264. package/dist/{pipeline-router-T673WGL3.js → pipeline-router-KQAYWDPH.js} +3 -3
  265. package/dist/{plan-limits-QWBN2EKH.js → plan-limits-EUZI4X5W.js} +5 -5
  266. package/dist/{projection-worker-K6TILAZH.js → projection-worker-FG6G226D.js} +12 -2
  267. package/dist/{prospective-memory-XRNRMEDL.js → prospective-memory-FVDNUSIL.js} +2 -2
  268. package/dist/{reranker-3XC5UM4F.js → reranker-54Q3L32E.js} +1 -1
  269. package/dist/{retrieval-health-ULVVOIPL.js → retrieval-health-YJ7CXYVD.js} +1 -1
  270. package/dist/{review-polling-5YGDPJUX.js → review-polling-TKXYSXH6.js} +20 -13
  271. package/dist/runtime/index.js +23 -16
  272. package/dist/{session-events-D52HNUJK.js → session-events-WQHTP65R.js} +20 -13
  273. package/dist/{session-kill-telemetry-IBNCJSI7.js → session-kill-telemetry-2HSE7IGH.js} +20 -13
  274. package/dist/{session-scope-5FWZ4AYR.js → session-scope-RBKAC75W.js} +19 -12
  275. package/dist/{setup-wizard-KVTLSSRD.js → setup-wizard-AA6ZV57H.js} +1 -1
  276. package/dist/signal-paths-4G53QTII.js +11 -0
  277. package/dist/skill-refinement-QI35LMTZ.js +20 -0
  278. package/dist/{stack-update-OWWGTYRB.js → stack-update-BE6PX4AG.js} +9 -3
  279. package/dist/{steward-gate-3ZITRYVH.js → steward-gate-2XD5BXH6.js} +3 -3
  280. package/dist/{support-outbox-QPQQK7F7.js → support-outbox-MGUVVGHT.js} +96 -44
  281. package/dist/sweep-budget-WB2FKPYN.js +64 -0
  282. package/dist/{task-enforcement-L4YTDOOX.js → task-enforcement-DMOCBRLB.js} +191 -17
  283. package/dist/{task-scope-OIHLMQOQ.js → task-scope-ULBNFBFH.js} +25 -12
  284. package/dist/{tasks-crud-QUIIRWE3.js → tasks-crud-6SJOKES5.js} +25 -12
  285. package/dist/{tasks-notify-ANYLB5GU.js → tasks-notify-TESRABUM.js} +20 -13
  286. package/dist/{tasks-review-BWSCXFMB.js → tasks-review-INDAGLWJ.js} +27 -14
  287. package/dist/{telemetry-upload-XLDBCD7B.js → telemetry-upload-6XB3Q3IH.js} +7 -7
  288. package/dist/{token-budget-OQCLPV3A.js → token-budget-NOF27AZC.js} +3 -3
  289. package/dist/{tool-capability-index-3UWKZZED.js → tool-capability-index-EFBBPTBI.js} +1 -1
  290. package/dist/{tool-telemetry-AQTFWOWG.js → tool-telemetry-OEK6KQFF.js} +1 -1
  291. package/dist/tui/App.js +28 -21
  292. package/dist/{tui-data-3Y5L5LJB.js → tui-data-EG6LEZFF.js} +19 -12
  293. package/dist/{worker-gate-WJS2MFNA.js → worker-gate-YA35VMAN.js} +1 -1
  294. package/dist/{workflow-engine-EPPZ226V.js → workflow-engine-3AVKRE5I.js} +2 -2
  295. package/dist/{worktree-OYGDGJP7.js → worktree-72QYYL5L.js} +4 -4
  296. package/dist/{worktree-sweep-KV4H4766.js → worktree-sweep-GDISKGQ2.js} +5 -5
  297. package/package.json +1 -1
  298. package/release-notes.json +45 -45
  299. package/dist/chunk-4FVVJ7ME.js +0 -193
  300. package/dist/completion-nudge-dedup-DBZF24MM.js +0 -74
  301. package/dist/git-task-sweep-7GVUKDBW.js +0 -47
  302. package/dist/intercom-queue-6M5IRX3Y.js +0 -17
  303. /package/dist/{chunk-QTEHH4LG.js → chunk-24WPWCD6.js} +0 -0
  304. /package/dist/{chunk-IZY6V4FI.js → chunk-4O3N7I5Z.js} +0 -0
  305. /package/dist/{chunk-WXRVHXVP.js → chunk-7577GDDG.js} +0 -0
  306. /package/dist/{chunk-Q5YKWFVO.js → chunk-EWKZKO7F.js} +0 -0
  307. /package/dist/{chunk-DY3J6GQO.js → chunk-H43BPGIV.js} +0 -0
  308. /package/dist/{chunk-DQJ3WZRK.js → chunk-IHRXCNSC.js} +0 -0
  309. /package/dist/{chunk-RRQI5PSJ.js → chunk-NIB2N6L2.js} +0 -0
  310. /package/dist/{chunk-ZU6767WK.js → chunk-QMUSJESS.js} +0 -0
  311. /package/dist/{chunk-72LWCZTJ.js → chunk-RXS2LBKE.js} +0 -0
  312. /package/dist/{chunk-SJZT66LM.js → chunk-SNFYZFXY.js} +0 -0
  313. /package/dist/{chunk-SIJSFULW.js → chunk-TSYMWC53.js} +0 -0
  314. /package/dist/{core-memory-DARTILJG.js → core-memory-NKKP2XUB.js} +0 -0
  315. /package/dist/{entity-boost-VR5YOQCT.js → entity-boost-DRIUFTYB.js} +0 -0
  316. /package/dist/{message-queue-client-HVFR67QH.js → message-queue-client-4ERC7HLX.js} +0 -0
  317. /package/dist/{oauth-server-UQHCFVHT.js → oauth-server-PECJREY2.js} +0 -0
  318. /package/dist/{project-boot-22ZZL2GE.js → project-boot-SFKP2MFW.js} +0 -0
  319. /package/dist/{wiki-acl-EZMGL6KW.js → wiki-acl-QIBDNXSM.js} +0 -0
@@ -3,11 +3,11 @@ import {
3
3
  SessionManager,
4
4
  checkGitSafety,
5
5
  targetsMainBranch
6
- } from "../chunk-PISGLNV7.js";
7
- import "../chunk-ERSFOJGC.js";
6
+ } from "../chunk-Y34FDPOY.js";
7
+ import "../chunk-LUOQCGBO.js";
8
8
  import {
9
9
  MultiAgentOrchestrator
10
- } from "../chunk-GA76RGSP.js";
10
+ } from "../chunk-CS6MYGNB.js";
11
11
  import {
12
12
  createQuietRenderer,
13
13
  createTerminalRenderer,
@@ -57,38 +57,45 @@ import {
57
57
  composeHooks,
58
58
  createDefaultHooks
59
59
  } from "../chunk-O377P7GM.js";
60
- import "../chunk-QQOH3I4A.js";
61
- import "../chunk-PLBDXCYZ.js";
62
- import "../chunk-HWC5W34K.js";
63
- import "../chunk-KLG53B63.js";
64
- import "../chunk-4FVVJ7ME.js";
60
+ import "../chunk-VDUHWQFA.js";
61
+ import "../chunk-KUJGADX6.js";
62
+ import "../chunk-7PLMYXPG.js";
63
+ import "../chunk-KJOQLNX2.js";
64
+ import "../chunk-Y2KBHLEO.js";
65
+ import "../chunk-EIKATSE4.js";
65
66
  import "../chunk-E23LNUWJ.js";
66
67
  import "../chunk-4JERP7NT.js";
67
- import "../chunk-ABGDTMKC.js";
68
+ import "../chunk-JRD7ARQ6.js";
68
69
  import "../chunk-SSTLTIF3.js";
69
70
  import "../chunk-RMOBQ6A5.js";
70
71
  import "../chunk-54QCG45Y.js";
71
- import "../chunk-HV5CUDOE.js";
72
- import "../chunk-QVFJCFNM.js";
72
+ import "../chunk-F6TJIWN5.js";
73
+ import "../chunk-FROUDYRT.js";
73
74
  import "../chunk-NGP6LSV2.js";
74
- import "../chunk-EPBB2OD3.js";
75
+ import "../chunk-BB5IKY7B.js";
75
76
  import "../chunk-CVYC6DUW.js";
77
+ import "../chunk-GIFDGNIL.js";
78
+ import "../chunk-HCJCW7X4.js";
76
79
  import "../chunk-OPU3NYOO.js";
80
+ import "../chunk-BC7IIR3A.js";
81
+ import "../chunk-AFNRE2RV.js";
82
+ import "../chunk-3NGZ4PL7.js";
83
+ import "../chunk-NLEW62VC.js";
77
84
  import "../chunk-HYZV25LY.js";
78
85
  import "../chunk-GJV3WDWM.js";
79
86
  import {
80
87
  StateBus,
81
88
  orgBus
82
89
  } from "../chunk-MP2AFCGL.js";
83
- import "../chunk-XLNF3CIO.js";
90
+ import "../chunk-QGOMYIVT.js";
84
91
  import "../chunk-2I23RPSI.js";
85
- import "../chunk-WXRVHXVP.js";
92
+ import "../chunk-7577GDDG.js";
86
93
  import "../chunk-PNQDP3OA.js";
87
94
  import "../chunk-H73TUI4Y.js";
88
95
  import "../chunk-7HLWBYH7.js";
89
96
  import "../chunk-FXU7JOXK.js";
90
- import "../chunk-VY7345RO.js";
91
- import "../chunk-DQJ3WZRK.js";
97
+ import "../chunk-BMSAJ2IH.js";
98
+ import "../chunk-IHRXCNSC.js";
92
99
  import "../chunk-7Y5UDEVM.js";
93
100
  import "../chunk-SHIICYJW.js";
94
101
  import "../chunk-MLKGABMK.js";
@@ -4,35 +4,42 @@ import {
4
4
  listRecentSessionEvents,
5
5
  recordSessionEvent,
6
6
  sweepExpiredSessionEvents
7
- } from "./chunk-JXEMAB4M.js";
8
- import "./chunk-PLBDXCYZ.js";
9
- import "./chunk-HWC5W34K.js";
10
- import "./chunk-KLG53B63.js";
11
- import "./chunk-4FVVJ7ME.js";
7
+ } from "./chunk-UAIMI7CK.js";
8
+ import "./chunk-KUJGADX6.js";
9
+ import "./chunk-7PLMYXPG.js";
10
+ import "./chunk-KJOQLNX2.js";
11
+ import "./chunk-Y2KBHLEO.js";
12
+ import "./chunk-EIKATSE4.js";
12
13
  import "./chunk-E23LNUWJ.js";
13
14
  import "./chunk-4JERP7NT.js";
14
- import "./chunk-ABGDTMKC.js";
15
+ import "./chunk-JRD7ARQ6.js";
15
16
  import "./chunk-SSTLTIF3.js";
16
17
  import "./chunk-RMOBQ6A5.js";
17
18
  import "./chunk-54QCG45Y.js";
18
- import "./chunk-HV5CUDOE.js";
19
- import "./chunk-QVFJCFNM.js";
19
+ import "./chunk-F6TJIWN5.js";
20
+ import "./chunk-FROUDYRT.js";
20
21
  import "./chunk-NGP6LSV2.js";
21
- import "./chunk-EPBB2OD3.js";
22
+ import "./chunk-BB5IKY7B.js";
22
23
  import "./chunk-CVYC6DUW.js";
24
+ import "./chunk-GIFDGNIL.js";
25
+ import "./chunk-HCJCW7X4.js";
23
26
  import "./chunk-OPU3NYOO.js";
27
+ import "./chunk-BC7IIR3A.js";
28
+ import "./chunk-AFNRE2RV.js";
29
+ import "./chunk-3NGZ4PL7.js";
30
+ import "./chunk-NLEW62VC.js";
24
31
  import "./chunk-HYZV25LY.js";
25
32
  import "./chunk-GJV3WDWM.js";
26
33
  import "./chunk-MP2AFCGL.js";
27
- import "./chunk-XLNF3CIO.js";
34
+ import "./chunk-QGOMYIVT.js";
28
35
  import "./chunk-2I23RPSI.js";
29
- import "./chunk-WXRVHXVP.js";
36
+ import "./chunk-7577GDDG.js";
30
37
  import "./chunk-PNQDP3OA.js";
31
38
  import "./chunk-H73TUI4Y.js";
32
39
  import "./chunk-7HLWBYH7.js";
33
40
  import "./chunk-FXU7JOXK.js";
34
- import "./chunk-VY7345RO.js";
35
- import "./chunk-DQJ3WZRK.js";
41
+ import "./chunk-BMSAJ2IH.js";
42
+ import "./chunk-IHRXCNSC.js";
36
43
  import "./chunk-7Y5UDEVM.js";
37
44
  import "./chunk-SHIICYJW.js";
38
45
  import "./chunk-MLKGABMK.js";
@@ -13,35 +13,42 @@ import {
13
13
  parseStreakState,
14
14
  recordSessionKill,
15
15
  sumTokensSavedSince
16
- } from "./chunk-G5TP2D2U.js";
17
- import "./chunk-PLBDXCYZ.js";
18
- import "./chunk-HWC5W34K.js";
19
- import "./chunk-KLG53B63.js";
20
- import "./chunk-4FVVJ7ME.js";
16
+ } from "./chunk-EWDTTTZP.js";
17
+ import "./chunk-KUJGADX6.js";
18
+ import "./chunk-7PLMYXPG.js";
19
+ import "./chunk-KJOQLNX2.js";
20
+ import "./chunk-Y2KBHLEO.js";
21
+ import "./chunk-EIKATSE4.js";
21
22
  import "./chunk-E23LNUWJ.js";
22
23
  import "./chunk-4JERP7NT.js";
23
- import "./chunk-ABGDTMKC.js";
24
+ import "./chunk-JRD7ARQ6.js";
24
25
  import "./chunk-SSTLTIF3.js";
25
26
  import "./chunk-RMOBQ6A5.js";
26
27
  import "./chunk-54QCG45Y.js";
27
- import "./chunk-HV5CUDOE.js";
28
- import "./chunk-QVFJCFNM.js";
28
+ import "./chunk-F6TJIWN5.js";
29
+ import "./chunk-FROUDYRT.js";
29
30
  import "./chunk-NGP6LSV2.js";
30
- import "./chunk-EPBB2OD3.js";
31
+ import "./chunk-BB5IKY7B.js";
31
32
  import "./chunk-CVYC6DUW.js";
33
+ import "./chunk-GIFDGNIL.js";
34
+ import "./chunk-HCJCW7X4.js";
32
35
  import "./chunk-OPU3NYOO.js";
36
+ import "./chunk-BC7IIR3A.js";
37
+ import "./chunk-AFNRE2RV.js";
38
+ import "./chunk-3NGZ4PL7.js";
39
+ import "./chunk-NLEW62VC.js";
33
40
  import "./chunk-HYZV25LY.js";
34
41
  import "./chunk-GJV3WDWM.js";
35
42
  import "./chunk-MP2AFCGL.js";
36
- import "./chunk-XLNF3CIO.js";
43
+ import "./chunk-QGOMYIVT.js";
37
44
  import "./chunk-2I23RPSI.js";
38
- import "./chunk-WXRVHXVP.js";
45
+ import "./chunk-7577GDDG.js";
39
46
  import "./chunk-PNQDP3OA.js";
40
47
  import "./chunk-H73TUI4Y.js";
41
48
  import "./chunk-7HLWBYH7.js";
42
49
  import "./chunk-FXU7JOXK.js";
43
- import "./chunk-VY7345RO.js";
44
- import "./chunk-DQJ3WZRK.js";
50
+ import "./chunk-BMSAJ2IH.js";
51
+ import "./chunk-IHRXCNSC.js";
45
52
  import "./chunk-7Y5UDEVM.js";
46
53
  import "./chunk-SHIICYJW.js";
47
54
  import "./chunk-MLKGABMK.js";
@@ -1,39 +1,46 @@
1
1
  import {
2
2
  resolveExeSession
3
- } from "./chunk-PLBDXCYZ.js";
4
- import "./chunk-HWC5W34K.js";
5
- import "./chunk-KLG53B63.js";
6
- import "./chunk-4FVVJ7ME.js";
3
+ } from "./chunk-KUJGADX6.js";
4
+ import "./chunk-7PLMYXPG.js";
5
+ import "./chunk-KJOQLNX2.js";
6
+ import "./chunk-Y2KBHLEO.js";
7
+ import "./chunk-EIKATSE4.js";
7
8
  import "./chunk-E23LNUWJ.js";
8
9
  import "./chunk-4JERP7NT.js";
9
10
  import {
10
11
  listSessions
11
- } from "./chunk-ABGDTMKC.js";
12
+ } from "./chunk-JRD7ARQ6.js";
12
13
  import "./chunk-SSTLTIF3.js";
13
14
  import "./chunk-RMOBQ6A5.js";
14
15
  import "./chunk-54QCG45Y.js";
15
- import "./chunk-HV5CUDOE.js";
16
- import "./chunk-QVFJCFNM.js";
16
+ import "./chunk-F6TJIWN5.js";
17
+ import "./chunk-FROUDYRT.js";
17
18
  import "./chunk-NGP6LSV2.js";
18
- import "./chunk-EPBB2OD3.js";
19
+ import "./chunk-BB5IKY7B.js";
19
20
  import "./chunk-CVYC6DUW.js";
21
+ import "./chunk-GIFDGNIL.js";
22
+ import "./chunk-HCJCW7X4.js";
20
23
  import {
21
24
  getProjectName
22
25
  } from "./chunk-OPU3NYOO.js";
26
+ import "./chunk-BC7IIR3A.js";
27
+ import "./chunk-AFNRE2RV.js";
28
+ import "./chunk-3NGZ4PL7.js";
29
+ import "./chunk-NLEW62VC.js";
23
30
  import "./chunk-HYZV25LY.js";
24
31
  import "./chunk-GJV3WDWM.js";
25
32
  import "./chunk-MP2AFCGL.js";
26
33
  import {
27
34
  isCoordinatorName
28
- } from "./chunk-XLNF3CIO.js";
35
+ } from "./chunk-QGOMYIVT.js";
29
36
  import "./chunk-2I23RPSI.js";
30
- import "./chunk-WXRVHXVP.js";
37
+ import "./chunk-7577GDDG.js";
31
38
  import "./chunk-PNQDP3OA.js";
32
39
  import "./chunk-H73TUI4Y.js";
33
40
  import "./chunk-7HLWBYH7.js";
34
41
  import "./chunk-FXU7JOXK.js";
35
- import "./chunk-VY7345RO.js";
36
- import "./chunk-DQJ3WZRK.js";
42
+ import "./chunk-BMSAJ2IH.js";
43
+ import "./chunk-IHRXCNSC.js";
37
44
  import "./chunk-7Y5UDEVM.js";
38
45
  import "./chunk-SHIICYJW.js";
39
46
  import "./chunk-MLKGABMK.js";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  runSetupWizard,
3
3
  validateModel
4
- } from "./chunk-YIFZZYQD.js";
4
+ } from "./chunk-UBYAKNRF.js";
5
5
  import "./chunk-TPHCZDE3.js";
6
6
  import "./chunk-Z42MXYWW.js";
7
7
  import "./chunk-7Y5UDEVM.js";
@@ -0,0 +1,11 @@
1
+ import {
2
+ reviewSignalPath,
3
+ taskSignalDir,
4
+ taskSignalPath
5
+ } from "./chunk-EIKATSE4.js";
6
+ import "./chunk-MLKGABMK.js";
7
+ export {
8
+ reviewSignalPath,
9
+ taskSignalDir,
10
+ taskSignalPath
11
+ };
@@ -0,0 +1,20 @@
1
+ import {
2
+ incrementSkillSuccess,
3
+ incrementSkillUsage,
4
+ runSkillRefinement
5
+ } from "./chunk-Y2KBHLEO.js";
6
+ import "./chunk-QGOMYIVT.js";
7
+ import "./chunk-2I23RPSI.js";
8
+ import "./chunk-7577GDDG.js";
9
+ import "./chunk-PNQDP3OA.js";
10
+ import "./chunk-H73TUI4Y.js";
11
+ import "./chunk-7HLWBYH7.js";
12
+ import "./chunk-FXU7JOXK.js";
13
+ import "./chunk-7Y5UDEVM.js";
14
+ import "./chunk-SHIICYJW.js";
15
+ import "./chunk-MLKGABMK.js";
16
+ export {
17
+ incrementSkillSuccess,
18
+ incrementSkillUsage,
19
+ runSkillRefinement
20
+ };
@@ -22,9 +22,11 @@ import {
22
22
  findLatestBackupEnvFile,
23
23
  hardenHost,
24
24
  httpStatus,
25
+ imagePullRef,
25
26
  isCloudflaredTunnelMisconfigured,
26
27
  isExecFormMigration,
27
28
  isStrictDigestEnabled,
29
+ isThirdPartyImage,
28
30
  isUsableTunnelToken,
29
31
  listAvailableVersions,
30
32
  loadServiceSelection,
@@ -50,14 +52,15 @@ import {
50
52
  runStackUpdate,
51
53
  saveServiceSelection,
52
54
  serviceSelectionPath,
55
+ stripImageDigest,
53
56
  verifyComposeServicesRunning,
54
57
  verifyManifestImagesAvailable,
55
58
  verifyReleaseHealth,
56
59
  verifyStackManifestSignature,
57
60
  waitForHttpOk
58
- } from "./chunk-KK4ZOYXJ.js";
59
- import "./chunk-VY7345RO.js";
60
- import "./chunk-DQJ3WZRK.js";
61
+ } from "./chunk-NGACCR2M.js";
62
+ import "./chunk-BMSAJ2IH.js";
63
+ import "./chunk-IHRXCNSC.js";
61
64
  import "./chunk-7Y5UDEVM.js";
62
65
  import "./chunk-SHIICYJW.js";
63
66
  import "./chunk-MLKGABMK.js";
@@ -85,9 +88,11 @@ export {
85
88
  findLatestBackupEnvFile,
86
89
  hardenHost,
87
90
  httpStatus,
91
+ imagePullRef,
88
92
  isCloudflaredTunnelMisconfigured,
89
93
  isExecFormMigration,
90
94
  isStrictDigestEnabled,
95
+ isThirdPartyImage,
91
96
  isUsableTunnelToken,
92
97
  listAvailableVersions,
93
98
  loadServiceSelection,
@@ -113,6 +118,7 @@ export {
113
118
  runStackUpdate,
114
119
  saveServiceSelection,
115
120
  serviceSelectionPath,
121
+ stripImageDigest,
116
122
  verifyComposeServicesRunning,
117
123
  verifyManifestImagesAvailable,
118
124
  verifyReleaseHealth,
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  StewardGate
3
- } from "./chunk-7CUF27OT.js";
4
- import "./chunk-XLNF3CIO.js";
3
+ } from "./chunk-MKIFYIXC.js";
4
+ import "./chunk-QGOMYIVT.js";
5
5
  import "./chunk-2I23RPSI.js";
6
- import "./chunk-WXRVHXVP.js";
6
+ import "./chunk-7577GDDG.js";
7
7
  import "./chunk-PNQDP3OA.js";
8
8
  import "./chunk-H73TUI4Y.js";
9
9
  import "./chunk-7HLWBYH7.js";
@@ -6,6 +6,7 @@ import "./chunk-MLKGABMK.js";
6
6
 
7
7
  // src/lib/support-outbox.ts
8
8
  import { mkdirSync, readdirSync, readFileSync, writeFileSync, existsSync } from "fs";
9
+ import { createHash } from "crypto";
9
10
  import path from "path";
10
11
  import os from "os";
11
12
  var EXE_DIR = process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? path.join(os.homedir(), ".exe-os");
@@ -13,6 +14,7 @@ var BUG_DIR = path.join(EXE_DIR, "bug-reports");
13
14
  var FEATURE_DIR = path.join(EXE_DIR, "feature-requests");
14
15
  var STATUS_UPDATE_DIR = path.join(EXE_DIR, "support-status-updates");
15
16
  var SKIPPED_MARKER = "upstream_skipped: ttl_expired";
17
+ var DUPLICATE_MARKER = "upstream_skipped: duplicate_content";
16
18
  var TTL_MS = 7 * 24 * 60 * 60 * 1e3;
17
19
  var BUG_ENDPOINT = "https://api.askexe.com/v1/support/bug-reports";
18
20
  var FEATURE_ENDPOINT = "https://api.askexe.com/v1/support/feature-requests";
@@ -189,6 +191,82 @@ function linesFromSection(value) {
189
191
  const lines = value.split(/\r?\n/).map((line) => line.replace(/^[-*]\s+/, "").replace(/^\d+\.\s+/, "").trim()).filter(Boolean);
190
192
  return lines.length ? lines : void 0;
191
193
  }
194
+ function stableStringify(value) {
195
+ if (Array.isArray(value)) return `[${value.map(stableStringify).join(",")}]`;
196
+ if (value && typeof value === "object") {
197
+ const obj = value;
198
+ return `{${Object.keys(obj).sort().map((key) => `${JSON.stringify(key)}:${stableStringify(obj[key])}`).join(",")}}`;
199
+ }
200
+ return JSON.stringify(value);
201
+ }
202
+ function contentHash(value) {
203
+ return createHash("sha256").update(stableStringify(value)).digest("hex");
204
+ }
205
+ function payloadDedupeHash(kind, payload) {
206
+ const { id: _id, markdown: _markdown, report_path: _reportPath, source: _source, ...stable } = payload;
207
+ return contentHash({ kind, ...stable });
208
+ }
209
+ function collectSentContentHashes(dir, files, kind) {
210
+ const hashes = /* @__PURE__ */ new Set();
211
+ for (const file of files) {
212
+ try {
213
+ const content = readFileSync(path.join(dir, file), "utf-8");
214
+ if (!content.includes(SUPPORT_REPORT_SENT_MARKER) && !content.includes(DUPLICATE_MARKER)) continue;
215
+ const payload = buildSupportPayload(kind, file, path.join(dir, file), content);
216
+ hashes.add(payloadDedupeHash(kind, payload));
217
+ } catch {
218
+ }
219
+ }
220
+ return hashes;
221
+ }
222
+ function stripOutboxMarkers(content) {
223
+ return content.split(/\r?\n/).filter((line) => !line.includes(SUPPORT_REPORT_SENT_MARKER) && !line.startsWith("upstream_sent_at:") && !line.startsWith(SKIPPED_MARKER) && !line.startsWith(DUPLICATE_MARKER)).join("\n");
224
+ }
225
+ function buildSupportPayload(kind, file, filePath, content) {
226
+ const cleanContent = stripOutboxMarkers(content);
227
+ const id = extractField(cleanContent, "id") ?? file.replace(".md", "");
228
+ if (kind === "bug") {
229
+ const titleMatch2 = cleanContent.match(/^#\s*(.+)$/m);
230
+ const severityMatch = cleanContent.match(/^severity:\s*(.+)$/m);
231
+ return {
232
+ id,
233
+ title: titleMatch2?.[1]?.trim() ?? file,
234
+ classification: normalizeClassification(extractField(cleanContent, "classification")),
235
+ severity: normalizeSeverity(severityMatch?.[1]?.trim()),
236
+ summary: extractSection(cleanContent, "Summary") ?? extractSection(cleanContent, "Description") ?? firstMeaningfulParagraph(cleanContent),
237
+ customer_impact: extractSection(cleanContent, "Customer impact"),
238
+ reproduction_steps: linesFromSection(extractSection(cleanContent, "Reproduction steps")),
239
+ expected: extractSection(cleanContent, "Expected behavior") ?? extractField(cleanContent, "expected"),
240
+ actual: extractSection(cleanContent, "Actual behavior") ?? extractField(cleanContent, "actual"),
241
+ workaround: extractSection(cleanContent, "Workaround"),
242
+ markdown: content,
243
+ source: "outbox-flusher",
244
+ package_version: extractField(cleanContent, "package_version") ?? process.env.npm_package_version ?? "unknown",
245
+ project_name: extractField(cleanContent, "project_name") ?? extractField(cleanContent, "project"),
246
+ agent_id: extractField(cleanContent, "filed_by"),
247
+ agent_role: "outbox-flusher",
248
+ report_path: filePath
249
+ };
250
+ }
251
+ const titleMatch = cleanContent.match(/^#\s*Feature Request\s*[—–-]\s*(.+)$/m);
252
+ return {
253
+ id,
254
+ title: titleMatch?.[1]?.trim() ?? extractField(cleanContent, "title") ?? file,
255
+ category: normalizeFeatureCategory(extractField(cleanContent, "category")),
256
+ priority: normalizeSeverity(extractField(cleanContent, "priority")),
257
+ product: extractField(cleanContent, "product") ?? "exe-os",
258
+ description: extractSection(cleanContent, "Description") ?? firstMeaningfulParagraph(cleanContent),
259
+ use_case: extractSection(cleanContent, "Use Case"),
260
+ current_workaround: extractSection(cleanContent, "Current Workaround"),
261
+ proposed_solution: extractSection(cleanContent, "Proposed Solution"),
262
+ business_impact: extractSection(cleanContent, "Business Impact"),
263
+ source: "outbox-flusher",
264
+ package_version: extractField(cleanContent, "package_version") ?? process.env.npm_package_version ?? "unknown",
265
+ project_name: extractField(cleanContent, "project_name") ?? extractField(cleanContent, "project"),
266
+ agent_id: extractField(cleanContent, "filed_by"),
267
+ agent_role: "outbox-flusher"
268
+ };
269
+ }
192
270
  function shouldBackoff() {
193
271
  if (consecutiveFailures === 0) return false;
194
272
  const backoffMs = Math.min(Math.pow(2, consecutiveFailures), MAX_BACKOFF_S) * 1e3;
@@ -224,6 +302,7 @@ async function flushDir(dir, endpoint, kind, licenseKey, licenseToken, adminToke
224
302
  return { sent, errors, skipped };
225
303
  }
226
304
  if (files.length === 0) return { sent, errors, skipped };
305
+ const sentContentHashes = collectSentContentHashes(dir, files, kind);
227
306
  for (const file of files) {
228
307
  if (sent >= maxPerFlush) break;
229
308
  if (shouldBackoff()) break;
@@ -239,7 +318,7 @@ async function flushDir(dir, endpoint, kind, licenseKey, licenseToken, adminToke
239
318
  skipped++;
240
319
  continue;
241
320
  }
242
- if (content.includes(SKIPPED_MARKER)) {
321
+ if (content.includes(SKIPPED_MARKER) || content.includes(DUPLICATE_MARKER)) {
243
322
  skipped++;
244
323
  continue;
245
324
  }
@@ -258,54 +337,26 @@ ${SKIPPED_MARKER}
258
337
  skipped++;
259
338
  continue;
260
339
  }
261
- let payload;
262
- if (kind === "bug") {
263
- const titleMatch = content.match(/^#\s*(.+)$/m);
264
- const severityMatch = content.match(/^severity:\s*(.+)$/m);
265
- payload = {
266
- id,
267
- title: titleMatch?.[1]?.trim() ?? file,
268
- classification: normalizeClassification(extractField(content, "classification")),
269
- severity: normalizeSeverity(severityMatch?.[1]?.trim()),
270
- summary: extractSection(content, "Summary") ?? extractSection(content, "Description") ?? firstMeaningfulParagraph(content),
271
- customer_impact: extractSection(content, "Customer impact"),
272
- reproduction_steps: linesFromSection(extractSection(content, "Reproduction steps")),
273
- expected: extractSection(content, "Expected behavior") ?? extractField(content, "expected"),
274
- actual: extractSection(content, "Actual behavior") ?? extractField(content, "actual"),
275
- workaround: extractSection(content, "Workaround"),
276
- markdown: content,
277
- source: "outbox-flusher",
278
- package_version: extractField(content, "package_version") ?? process.env.npm_package_version ?? "unknown",
279
- project_name: extractField(content, "project_name") ?? extractField(content, "project"),
280
- agent_id: extractField(content, "filed_by"),
281
- agent_role: "outbox-flusher",
282
- report_path: filePath
283
- };
284
- } else {
285
- const titleMatch = content.match(/^#\s*Feature Request\s*[—–-]\s*(.+)$/m);
286
- payload = {
287
- id,
288
- title: titleMatch?.[1]?.trim() ?? extractField(content, "title") ?? file,
289
- category: normalizeFeatureCategory(extractField(content, "category")),
290
- priority: normalizeSeverity(extractField(content, "priority")),
291
- product: extractField(content, "product") ?? "exe-os",
292
- description: extractSection(content, "Description") ?? firstMeaningfulParagraph(content),
293
- use_case: extractSection(content, "Use Case"),
294
- current_workaround: extractSection(content, "Current Workaround"),
295
- proposed_solution: extractSection(content, "Proposed Solution"),
296
- business_impact: extractSection(content, "Business Impact"),
297
- source: "outbox-flusher",
298
- package_version: extractField(content, "package_version") ?? process.env.npm_package_version ?? "unknown",
299
- project_name: extractField(content, "project_name") ?? extractField(content, "project"),
300
- agent_id: extractField(content, "filed_by"),
301
- agent_role: "outbox-flusher"
302
- };
340
+ const payload = buildSupportPayload(kind, file, filePath, content);
341
+ const dedupeHash = payloadDedupeHash(kind, payload);
342
+ payload.idempotency_key = dedupeHash;
343
+ if (sentContentHashes.has(dedupeHash)) {
344
+ try {
345
+ writeFileSync(filePath, `${content}
346
+ ${DUPLICATE_MARKER}: ${dedupeHash}
347
+ `, "utf-8");
348
+ } catch {
349
+ }
350
+ skipped++;
351
+ continue;
303
352
  }
304
353
  try {
305
354
  const resp = await fetch(endpoint, {
306
355
  method: "POST",
307
356
  headers: {
308
357
  "content-type": "application/json",
358
+ "x-idempotency-key": dedupeHash,
359
+ "idempotency-key": dedupeHash,
309
360
  // GoTrue JWT is preferred auth; license key/token are legacy fallback
310
361
  ...gotrueAuth && !adminToken ? gotrueAuth : {},
311
362
  ...!gotrueAuth && licenseKey ? { "x-exe-license-key": licenseKey } : {},
@@ -318,6 +369,7 @@ ${SKIPPED_MARKER}
318
369
  if (resp.ok || resp.status === 409) {
319
370
  markSupportReportSentSync(filePath);
320
371
  sentIds.add(id);
372
+ sentContentHashes.add(dedupeHash);
321
373
  onNetworkSuccess();
322
374
  sent++;
323
375
  } else {
@@ -502,7 +554,7 @@ function scanDir(dir) {
502
554
  for (const file of files) {
503
555
  try {
504
556
  const content = readFileSync(path.join(dir, file), "utf-8");
505
- if (!content.includes(SUPPORT_REPORT_SENT_MARKER) && !content.includes(SKIPPED_MARKER)) {
557
+ if (!content.includes(SUPPORT_REPORT_SENT_MARKER) && !content.includes(SKIPPED_MARKER) && !content.includes(DUPLICATE_MARKER)) {
506
558
  unsent++;
507
559
  const createdAt = extractField(content, "created_at");
508
560
  if (createdAt && (!oldest || createdAt < oldest)) {
@@ -0,0 +1,64 @@
1
+ import "./chunk-MLKGABMK.js";
2
+
3
+ // src/lib/sweep-budget.ts
4
+ var DEFAULT_SWEEP_BUDGET_MS = 5e3;
5
+ var DEFAULT_SWEEP_RESCHEDULE_DELAY_MS = 15e3;
6
+ function sweepTickBudgetMs() {
7
+ const raw = Number(process.env.EXE_SWEEP_TICK_BUDGET_MS);
8
+ return Number.isFinite(raw) && raw > 0 ? raw : DEFAULT_SWEEP_BUDGET_MS;
9
+ }
10
+ var defaultYield = () => new Promise((resolve) => setImmediate(resolve));
11
+ var defaultSleep = (ms) => new Promise((resolve) => {
12
+ const t = setTimeout(resolve, ms);
13
+ t.unref?.();
14
+ });
15
+ async function runBudgetedSweep(items, processItem, options = {}) {
16
+ const budgetMs = options.budgetMs ?? sweepTickBudgetMs();
17
+ const rescheduleDelayMs = options.rescheduleDelayMs ?? DEFAULT_SWEEP_RESCHEDULE_DELAY_MS;
18
+ const label = options.label ?? "sweep";
19
+ const onYield = options.onYield ?? defaultYield;
20
+ const sleep = options.sleep ?? defaultSleep;
21
+ const now = options.now ?? Date.now;
22
+ const log = options.log ?? ((line) => process.stderr.write(line));
23
+ const result = { processed: 0, failed: 0, reschedules: 0, stopped: false };
24
+ let i = 0;
25
+ while (i < items.length) {
26
+ const tickStart = now();
27
+ while (i < items.length) {
28
+ const item = items[i];
29
+ const index = i;
30
+ i++;
31
+ try {
32
+ const cont = await processItem(item, index);
33
+ result.processed++;
34
+ if (cont === false) {
35
+ result.stopped = true;
36
+ return result;
37
+ }
38
+ } catch (err) {
39
+ result.failed++;
40
+ log(`[exed] ${label}: item ${index} failed: ${err instanceof Error ? err.message : String(err)}
41
+ `);
42
+ }
43
+ if (i >= items.length) break;
44
+ await onYield();
45
+ if (now() - tickStart >= budgetMs) break;
46
+ }
47
+ if (i < items.length) {
48
+ result.reschedules++;
49
+ options.onBudgetExceeded?.(i);
50
+ log(
51
+ `[exed] ${label}: tick budget ${budgetMs}ms exceeded at ${i}/${items.length} \u2014 pausing ${rescheduleDelayMs}ms then resuming from cursor (event-loop guard)
52
+ `
53
+ );
54
+ await sleep(rescheduleDelayMs);
55
+ }
56
+ }
57
+ return result;
58
+ }
59
+ export {
60
+ DEFAULT_SWEEP_BUDGET_MS,
61
+ DEFAULT_SWEEP_RESCHEDULE_DELAY_MS,
62
+ runBudgetedSweep,
63
+ sweepTickBudgetMs
64
+ };