@askexenow/exe-os 0.9.280 → 0.9.281

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 (436) hide show
  1. package/deploy/compose/.env.customer.example +1 -1
  2. package/deploy/compose/.env.default +2 -1
  3. package/deploy/compose/.env.example +1 -1
  4. package/deploy/compose/docker-compose.yml +74 -13
  5. package/deploy/compose/erp-nginx/nginx.conf +52 -0
  6. package/deploy/compose/generate-env.ts +1 -1
  7. package/deploy/compose/init-db.sql +13 -2
  8. package/deploy/stack-manifests/v0.9.json +11 -31
  9. package/dist/active-agent-6ZBHGHXF.js +26 -0
  10. package/dist/active-agent-E23SCYER.js +27 -0
  11. package/dist/active-agent-KMZT44S4.js +26 -0
  12. package/dist/active-agent-LFFTVROM.js +27 -0
  13. package/dist/agentic-ontology-PCZB5HV5.js +25 -0
  14. package/dist/agentic-ontology-PGGJN2ES.js +25 -0
  15. package/dist/assets/tmux.conf +2 -0
  16. package/dist/backfill-metadata-KQ4FEVUR.js +599 -0
  17. package/dist/backfill-metadata-Y3YWCHKJ.js +599 -0
  18. package/dist/behaviors-H4DZECKL.js +39 -0
  19. package/dist/behaviors-WIUTIJF6.js +39 -0
  20. package/dist/bin/agentic-ontology-backfill.js +5 -5
  21. package/dist/bin/agentic-reflection-backfill.js +6 -6
  22. package/dist/bin/agentic-semantic-label.js +5 -5
  23. package/dist/bin/backfill-conversations.js +4 -4
  24. package/dist/bin/backfill-responses.js +4 -4
  25. package/dist/bin/backfill-vectors.js +5 -5
  26. package/dist/bin/bulk-sync-postgres.js +7 -7
  27. package/dist/bin/cc-doctor.js +4 -4
  28. package/dist/bin/cleanup-stale-review-tasks.js +10 -10
  29. package/dist/bin/cli.js +15 -15
  30. package/dist/bin/exe-agent-config.js +2 -2
  31. package/dist/bin/exe-agent.js +4 -4
  32. package/dist/bin/exe-assign.js +5 -5
  33. package/dist/bin/exe-boot.js +17 -17
  34. package/dist/bin/exe-call.js +4 -4
  35. package/dist/bin/exe-cloud.js +5 -5
  36. package/dist/bin/exe-dispatch.js +10 -10
  37. package/dist/bin/exe-doctor.js +1 -1
  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 +7 -7
  41. package/dist/bin/exe-healthcheck.js +4 -4
  42. package/dist/bin/exe-heartbeat.js +10 -10
  43. package/dist/bin/exe-kill.js +13 -13
  44. package/dist/bin/exe-launch-agent.js +17 -17
  45. package/dist/bin/exe-new-employee.js +7 -7
  46. package/dist/bin/exe-pending-messages.js +11 -11
  47. package/dist/bin/exe-pending-notifications.js +10 -10
  48. package/dist/bin/exe-pending-reviews.js +10 -10
  49. package/dist/bin/exe-rename.js +4 -4
  50. package/dist/bin/exe-review.js +12 -12
  51. package/dist/bin/exe-search.js +5 -5
  52. package/dist/bin/exe-session-cleanup.js +15 -15
  53. package/dist/bin/exe-settings.js +5 -5
  54. package/dist/bin/exe-start-codex.js +11 -11
  55. package/dist/bin/exe-start-opencode.js +8 -8
  56. package/dist/bin/exe-status.js +11 -11
  57. package/dist/bin/exe-support.js +2 -2
  58. package/dist/bin/exe-team.js +3 -3
  59. package/dist/bin/exe-watchdog.js +17 -2
  60. package/dist/bin/git-sweep.js +11 -11
  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.js +8 -7
  65. package/dist/bin/intercom-check.js +4 -4
  66. package/dist/bin/mcp-sessions.js +2 -2
  67. package/dist/bin/orchestration-metrics.js +4 -4
  68. package/dist/bin/postgres-agentic-reflection-backfill.js +2 -2
  69. package/dist/bin/postgres-agentic-semantic-backfill.js +1 -1
  70. package/dist/bin/scan-tasks.js +10 -10
  71. package/dist/bin/setup.js +1 -1
  72. package/dist/bin/shard-migrate.js +4 -4
  73. package/dist/bin/stack-update.js +3 -3
  74. package/dist/bin/vps-health-gate.js +1 -1
  75. package/dist/capability-cards-F22XWGLB.js +88 -0
  76. package/dist/capability-cards-KCKITXXZ.js +88 -0
  77. package/dist/capacity-monitor-CHXGKVEO.js +50 -0
  78. package/dist/capacity-monitor-L3M5KB6T.js +50 -0
  79. package/dist/catchup-brief-BVZANLRZ.js +154 -0
  80. package/dist/catchup-brief-LDUGMC7S.js +154 -0
  81. package/dist/catchup-brief-NZDLL7SA.js +154 -0
  82. package/dist/catchup-brief-OOIXVGBA.js +154 -0
  83. package/dist/catchup-brief-UPXHDYTB.js +154 -0
  84. package/dist/chunk-2BI3FQKL.js +1876 -0
  85. package/dist/chunk-2CJUQGHH.js +362 -0
  86. package/dist/chunk-2EVYBMBJ.js +128 -0
  87. package/dist/chunk-2NQOZOXG.js +2113 -0
  88. package/dist/chunk-2QK5E3LB.js +128 -0
  89. package/dist/chunk-2VTCG4ZU.js +1352 -0
  90. package/dist/chunk-2YGI36DV.js +1119 -0
  91. package/dist/chunk-32BQN2QN.js +185 -0
  92. package/dist/chunk-33JMO4UV.js +157 -0
  93. package/dist/chunk-3DZAYLXY.js +377 -0
  94. package/dist/chunk-3MGBE7GR.js +76 -0
  95. package/dist/chunk-3MTV4FJL.js +271 -0
  96. package/dist/chunk-3NN7VQ27.js +1352 -0
  97. package/dist/chunk-4533HNOG.js +70 -0
  98. package/dist/chunk-456UW3MT.js +731 -0
  99. package/dist/chunk-4AU56XV2.js +58 -0
  100. package/dist/chunk-4MRP6EBR.js +280 -0
  101. package/dist/chunk-4MRWW52U.js +14219 -0
  102. package/dist/chunk-4WWECNAY.js +50 -0
  103. package/dist/chunk-4ZJDDR6L.js +171 -0
  104. package/dist/chunk-522EOPM6.js +382 -0
  105. package/dist/chunk-52UDAVZE.js +3208 -0
  106. package/dist/chunk-5FAMUB4X.js +204 -0
  107. package/dist/chunk-5PGZJQUI.js +58 -0
  108. package/dist/chunk-67TZJXNZ.js +262 -0
  109. package/dist/chunk-6FEZ7GN2.js +123 -0
  110. package/dist/chunk-6MOGND7S.js +14219 -0
  111. package/dist/chunk-6TRSVY7L.js +181 -0
  112. package/dist/chunk-6WCS7ZNK.js +85 -0
  113. package/dist/chunk-6WRYDREW.js +539 -0
  114. package/dist/chunk-72UA2FB3.js +181 -0
  115. package/dist/chunk-77DMFEOL.js +30 -0
  116. package/dist/chunk-7COXVQ5W.js +214 -0
  117. package/dist/chunk-7HLWBYH7.js +60 -0
  118. package/dist/chunk-ALSTZCWT.js +204 -0
  119. package/dist/chunk-ARUTDXZX.js +280 -0
  120. package/dist/chunk-AU47B4QY.js +129 -0
  121. package/dist/chunk-AXOREWVL.js +836 -0
  122. package/dist/chunk-B5MNC54V.js +127 -0
  123. package/dist/chunk-B74VSMKX.js +1350 -0
  124. package/dist/chunk-BHWLH44J.js +362 -0
  125. package/dist/chunk-BUPZ3HD2.js +85 -0
  126. package/dist/chunk-BWVLMA53.js +2113 -0
  127. package/dist/chunk-C5WLBKMJ.js +50 -0
  128. package/dist/chunk-C62T6R2A.js +97 -0
  129. package/dist/chunk-CV5KBAIK.js +33 -0
  130. package/dist/chunk-DAYSDWXA.js +1068 -0
  131. package/dist/chunk-DI4URIUB.js +227 -0
  132. package/dist/chunk-DNTCYFJ6.js +76 -0
  133. package/dist/chunk-DPDRRS7T.js +103 -0
  134. package/dist/chunk-DT3EV6CW.js +103 -0
  135. package/dist/chunk-DX45HDWY.js +1076 -0
  136. package/dist/chunk-E72BD6MG.js +284 -0
  137. package/dist/chunk-EAPUSVKS.js +375 -0
  138. package/dist/chunk-EFUANRRT.js +85 -0
  139. package/dist/chunk-EG2SCT5R.js +1352 -0
  140. package/dist/chunk-EJD2JU77.js +58 -0
  141. package/dist/chunk-EMXYUAVP.js +81 -0
  142. package/dist/chunk-ENM2TAAM.js +14219 -0
  143. package/dist/chunk-EPDRTPVP.js +1876 -0
  144. package/dist/chunk-EW6XDHID.js +221 -0
  145. package/dist/chunk-EYEGSAWZ.js +1094 -0
  146. package/dist/chunk-F6L33PAQ.js +231 -0
  147. package/dist/chunk-FC2SCTVE.js +38 -0
  148. package/dist/chunk-FSRKIZGZ.js +630 -0
  149. package/dist/chunk-FTG7I5CB.js +81 -0
  150. package/dist/chunk-GVFRLWX7.js +30 -0
  151. package/dist/chunk-H3XMZOWW.js +1119 -0
  152. package/dist/chunk-HAKXE6LN.js +123 -0
  153. package/dist/chunk-HLP3ZDTW.js +448 -0
  154. package/dist/chunk-HOYWKQAA.js +510 -0
  155. package/dist/chunk-HWDD64IW.js +712 -0
  156. package/dist/chunk-HWMCULHY.js +127 -0
  157. package/dist/chunk-HZZHRZPK.js +210 -0
  158. package/dist/chunk-ICRWTYNW.js +103 -0
  159. package/dist/chunk-J5MWPC33.js +167 -0
  160. package/dist/chunk-JBXANNNB.js +70 -0
  161. package/dist/chunk-JPBMIYWF.js +1352 -0
  162. package/dist/chunk-JY6EXBFI.js +373 -0
  163. package/dist/chunk-JZLIBXI7.js +14219 -0
  164. package/dist/chunk-JZPTKXJ6.js +668 -0
  165. package/dist/chunk-KEYMA4ZP.js +510 -0
  166. package/dist/chunk-KHGNN6GL.js +2078 -0
  167. package/dist/chunk-KVLB2PD6.js +97 -0
  168. package/dist/chunk-L3YBRBKL.js +1076 -0
  169. package/dist/chunk-L7VZ32NA.js +89 -0
  170. package/dist/chunk-LEHLADW4.js +221 -0
  171. package/dist/chunk-LPD4HILQ.js +262 -0
  172. package/dist/chunk-LSJ3ADDI.js +51 -0
  173. package/dist/chunk-LUMS2MAS.js +58 -0
  174. package/dist/chunk-LV4SEC6C.js +394 -0
  175. package/dist/chunk-LXXBEI4A.js +284 -0
  176. package/dist/chunk-M4NPCAIH.js +456 -0
  177. package/dist/chunk-MFJ62LQ5.js +157 -0
  178. package/dist/chunk-MGEZNKOD.js +836 -0
  179. package/dist/chunk-MJ7X5IBW.js +227 -0
  180. package/dist/chunk-MLGRWCY4.js +54 -0
  181. package/dist/chunk-MQZX57IY.js +348 -0
  182. package/dist/chunk-MY7MFF6J.js +103 -0
  183. package/dist/chunk-MYA2X5OY.js +185 -0
  184. package/dist/chunk-MYEABW5Z.js +630 -0
  185. package/dist/chunk-MZ2TDCAL.js +402 -0
  186. package/dist/chunk-NF3FRB7Z.js +271 -0
  187. package/dist/chunk-NXYIFEPV.js +539 -0
  188. package/dist/chunk-O2GVE5B5.js +58 -0
  189. package/dist/chunk-O5GUCDR2.js +456 -0
  190. package/dist/chunk-OBZNRECA.js +128 -0
  191. package/dist/chunk-OMZ2RLJG.js +214 -0
  192. package/dist/chunk-ORDHJRWN.js +299 -0
  193. package/dist/chunk-OSPIJMCD.js +210 -0
  194. package/dist/chunk-OUGWEH4J.js +240 -0
  195. package/dist/chunk-OV5MJQGC.js +1876 -0
  196. package/dist/chunk-PC635OAG.js +4318 -0
  197. package/dist/chunk-PH46R4J6.js +348 -0
  198. package/dist/chunk-PJP2EP7P.js +394 -0
  199. package/dist/chunk-PODFWH3V.js +333 -0
  200. package/dist/chunk-PPWH3SHR.js +1068 -0
  201. package/dist/chunk-PWPJK7KB.js +4318 -0
  202. package/dist/chunk-PXONZVG4.js +377 -0
  203. package/dist/chunk-QAOGJRZD.js +369 -0
  204. package/dist/chunk-QC3LAEI7.js +197 -0
  205. package/dist/chunk-QDWQDUWI.js +668 -0
  206. package/dist/chunk-QKJFD6BH.js +1350 -0
  207. package/dist/chunk-QNYVJGFM.js +345 -0
  208. package/dist/chunk-QQF3XGQ5.js +14219 -0
  209. package/dist/chunk-QRPFQNI3.js +150 -0
  210. package/dist/chunk-QSSU5XWD.js +731 -0
  211. package/dist/chunk-QXZAGVAV.js +2078 -0
  212. package/dist/chunk-RA54MW64.js +244 -0
  213. package/dist/chunk-RF7PUWXI.js +197 -0
  214. package/dist/chunk-S3INDYSO.js +244 -0
  215. package/dist/chunk-SLQVTHH5.js +369 -0
  216. package/dist/chunk-SY2B74KL.js +345 -0
  217. package/dist/chunk-T6QPXXXW.js +712 -0
  218. package/dist/chunk-TO5M5YCT.js +41 -0
  219. package/dist/chunk-TQ4VXUAF.js +129 -0
  220. package/dist/chunk-UAB7RQC4.js +41 -0
  221. package/dist/chunk-UMEIBDYW.js +97 -0
  222. package/dist/chunk-UXW5TB7Y.js +240 -0
  223. package/dist/chunk-VB2N5WOX.js +150 -0
  224. package/dist/chunk-VLZEMRG3.js +167 -0
  225. package/dist/chunk-VM3V6VK7.js +230 -0
  226. package/dist/chunk-VMCGKBHB.js +1352 -0
  227. package/dist/chunk-VNIYZAR5.js +128 -0
  228. package/dist/chunk-VYV4KOD2.js +85 -0
  229. package/dist/chunk-W4SRJBAT.js +171 -0
  230. package/dist/chunk-W5W3LZ3Q.js +54 -0
  231. package/dist/chunk-WDNZEOM3.js +38 -0
  232. package/dist/chunk-WUKEXVOR.js +3208 -0
  233. package/dist/chunk-X3Z35Q6L.js +373 -0
  234. package/dist/chunk-X4VOU6BQ.js +382 -0
  235. package/dist/chunk-X6EEVSVG.js +290 -0
  236. package/dist/chunk-XFHGWGNB.js +1094 -0
  237. package/dist/chunk-XKOLRWYA.js +33 -0
  238. package/dist/chunk-XMMIL3UD.js +402 -0
  239. package/dist/chunk-XWILC6VA.js +290 -0
  240. package/dist/chunk-Y4OQCX4C.js +97 -0
  241. package/dist/chunk-Y67VYYOA.js +231 -0
  242. package/dist/chunk-YGQCQTQH.js +230 -0
  243. package/dist/chunk-YGWFBN5A.js +299 -0
  244. package/dist/chunk-YMKUXZIG.js +379 -0
  245. package/dist/chunk-YOMLMT7E.js +230 -0
  246. package/dist/chunk-YPESIZOB.js +14219 -0
  247. package/dist/chunk-Z2CGCIU2.js +89 -0
  248. package/dist/chunk-ZLAWNHQR.js +448 -0
  249. package/dist/chunk-ZME5UQSN.js +333 -0
  250. package/dist/co-activation-NUEQYXE5.js +73 -0
  251. package/dist/co-activation-ZG5HLBCZ.js +73 -0
  252. package/dist/co-occurrence-7S5KWQB2.js +94 -0
  253. package/dist/co-occurrence-X5SWDXT2.js +94 -0
  254. package/dist/core-memory-GOPBRGGZ.js +110 -0
  255. package/dist/core-memory-XLCU6L5M.js +110 -0
  256. package/dist/crdt-sync-EPKHPGRZ.js +33 -0
  257. package/dist/crdt-sync-UIQJ5U7T.js +33 -0
  258. package/dist/crm-webhook-MKN23JNU.js +10 -0
  259. package/dist/crm-webhook-SM63BPXO.js +10 -0
  260. package/dist/cto-delegation-gate-PQY5TOVZ.js +279 -0
  261. package/dist/cto-delegation-gate-V5VVUR3G.js +279 -0
  262. package/dist/daemon-orchestration-C7AAS67Q.js +138 -0
  263. package/dist/daemon-orchestration-OBCAJB2H.js +138 -0
  264. package/dist/db-backup-F7VP4QRH.js +33 -0
  265. package/dist/db-backup-KVYC57W7.js +33 -0
  266. package/dist/doc-graph-extractor-H2ETEINP.js +132 -0
  267. package/dist/doc-graph-extractor-PCUZEYCH.js +132 -0
  268. package/dist/dreaming-4OZXSLE3.js +33 -0
  269. package/dist/dreaming-Z2RYEYNT.js +33 -0
  270. package/dist/exe-drift-GEWNIK7A.js +69 -0
  271. package/dist/exe-drift-XCGH7AFO.js +69 -0
  272. package/dist/exe-export-7DKAU5IP.js +75 -0
  273. package/dist/exe-export-BCHH6OE6.js +75 -0
  274. package/dist/exe-import-PDRIZVYF.js +78 -0
  275. package/dist/exe-import-ZCKUDFKL.js +78 -0
  276. package/dist/exe-key-FUWLLI3U.js +580 -0
  277. package/dist/exe-key-RKKNVUMP.js +580 -0
  278. package/dist/exe-snapshot-G4I5FQMK.js +337 -0
  279. package/dist/exe-snapshot-GWU7QTZK.js +337 -0
  280. package/dist/fast-db-init-6QG6YQNT.js +7 -0
  281. package/dist/fast-db-init-X2QDQUA4.js +7 -0
  282. package/dist/founder-context-TOMNUBGJ.js +96 -0
  283. package/dist/founder-context-UU3V6MAS.js +96 -0
  284. package/dist/gateway/index.js +8 -8
  285. package/dist/git-staleness-FEPFMZKF.js +111 -0
  286. package/dist/git-staleness-HYVYLCW3.js +111 -0
  287. package/dist/git-task-sweep-IRV52JIM.js +41 -0
  288. package/dist/git-task-sweep-T6BSM3GS.js +41 -0
  289. package/dist/global-procedures-3AURRMKO.js +21 -0
  290. package/dist/global-procedures-JPCYBZYC.js +21 -0
  291. package/dist/graph-auto-extract-OC3AOSMW.js +182 -0
  292. package/dist/graph-auto-extract-PVDYEJBY.js +182 -0
  293. package/dist/hooks/bug-report-worker.js +12 -12
  294. package/dist/hooks/codex-stop-task-finalizer.js +12 -12
  295. package/dist/hooks/commit-complete.js +12 -12
  296. package/dist/hooks/error-recall.js +6 -6
  297. package/dist/hooks/exe-heartbeat-hook.js +3 -3
  298. package/dist/hooks/ingest.js +6 -6
  299. package/dist/hooks/instructions-loaded.js +4 -4
  300. package/dist/hooks/manifest.json +19 -19
  301. package/dist/hooks/notification.js +4 -4
  302. package/dist/hooks/post-compact.js +11 -11
  303. package/dist/hooks/post-tool-combined.js +5 -5
  304. package/dist/hooks/pre-compact.js +12 -12
  305. package/dist/hooks/pre-tool-use.js +15 -15
  306. package/dist/hooks/prompt-submit.js +22 -22
  307. package/dist/hooks/session-end.js +16 -16
  308. package/dist/hooks/session-start.js +10 -10
  309. package/dist/hooks/stop.js +15 -15
  310. package/dist/hooks/subagent-stop.js +11 -11
  311. package/dist/hooks/summary-worker.js +15 -15
  312. package/dist/index.js +18 -18
  313. package/dist/installer-72XXLBRP.js +39 -0
  314. package/dist/installer-HDXG2BZN.js +343 -0
  315. package/dist/installer-JALMKPCS.js +297 -0
  316. package/dist/installer-Q46SNNLU.js +39 -0
  317. package/dist/installer-W7PIPRCX.js +343 -0
  318. package/dist/installer-Z7WQEOS7.js +297 -0
  319. package/dist/lib/cloud-sync.js +5 -5
  320. package/dist/lib/consolidation.js +5 -5
  321. package/dist/lib/database.js +2 -2
  322. package/dist/lib/db.js +2 -2
  323. package/dist/lib/employee-templates.js +4 -4
  324. package/dist/lib/employees.js +2 -2
  325. package/dist/lib/exe-daemon.js +45 -41
  326. package/dist/lib/hybrid-search.js +5 -5
  327. package/dist/lib/identity.js +2 -2
  328. package/dist/lib/license.js +1 -1
  329. package/dist/lib/messaging.js +10 -10
  330. package/dist/lib/reminders.js +3 -3
  331. package/dist/lib/schedules.js +5 -5
  332. package/dist/lib/session-registry.js +4 -4
  333. package/dist/lib/skill-learning.js +6 -6
  334. package/dist/lib/store.js +4 -4
  335. package/dist/lib/task-router.js +3 -3
  336. package/dist/lib/tasks.js +11 -11
  337. package/dist/lib/tmux-routing.js +9 -9
  338. package/dist/lib/token-spend.js +3 -3
  339. package/dist/license-gate-7JZCHOAG.js +14 -0
  340. package/dist/license-gate-OP4SKL4P.js +14 -0
  341. package/dist/mcp/register-tools.js +58 -58
  342. package/dist/mcp/server.js +59 -59
  343. package/dist/mcp/tools/complete-reminder.js +4 -4
  344. package/dist/mcp/tools/create-reminder.js +4 -4
  345. package/dist/mcp/tools/create-task.js +13 -13
  346. package/dist/mcp/tools/deactivate-behavior.js +7 -7
  347. package/dist/mcp/tools/list-reminders.js +4 -4
  348. package/dist/mcp/tools/list-tasks.js +13 -13
  349. package/dist/mcp/tools/send-message.js +12 -12
  350. package/dist/mcp/tools/update-task.js +12 -12
  351. package/dist/mcp-health-VULNT722.js +17 -0
  352. package/dist/mcp-health-WDOB6XUB.js +19 -0
  353. package/dist/mcp-http-config-2OZ7N74D.js +28 -0
  354. package/dist/mcp-http-config-4VXA5K73.js +28 -0
  355. package/dist/memory-cards-2K6QRZU6.js +179 -0
  356. package/dist/memory-cards-KSJF5OH2.js +179 -0
  357. package/dist/memory-graph-extractor-IJD5HWYT.js +21 -0
  358. package/dist/memory-graph-extractor-O4GAXOK5.js +21 -0
  359. package/dist/memory-poisoning-defense-2JRPWT5V.js +223 -0
  360. package/dist/memory-poisoning-defense-DH4A25NU.js +223 -0
  361. package/dist/memory-reflection-ISY2BBDB.js +243 -0
  362. package/dist/memory-reflection-Z5AQRR6H.js +243 -0
  363. package/dist/notifications-2VSWK2UJ.js +46 -0
  364. package/dist/notifications-4S253VQM.js +46 -0
  365. package/dist/oauth-server-D7D4574D.js +437 -0
  366. package/dist/oauth-server-MACN54SJ.js +437 -0
  367. package/dist/orchestration-events-BGP5RYQI.js +26 -0
  368. package/dist/orchestration-events-MDXUEVRZ.js +26 -0
  369. package/dist/orchestrator-DHK7RSSH.js +34 -0
  370. package/dist/orchestrator-R75WHQVA.js +34 -0
  371. package/dist/pipeline-router-4WUKQQEC.js +14 -0
  372. package/dist/pipeline-router-GWB2XK2Q.js +14 -0
  373. package/dist/plan-limits-NNJRAESF.js +27 -0
  374. package/dist/plan-limits-YTQW4UR4.js +27 -0
  375. package/dist/project-boot-46GZJTEX.js +299 -0
  376. package/dist/project-boot-PPHBBGIF.js +299 -0
  377. package/dist/projection-worker-UPAWXI7P.js +1034 -0
  378. package/dist/projection-worker-ZIKDYBW5.js +1034 -0
  379. package/dist/reranker-5ZBP2RRN.js +19 -0
  380. package/dist/reranker-E2MQIMJL.js +19 -0
  381. package/dist/reranker-GLSDJT3V.js +19 -0
  382. package/dist/reranker-LBBXWNOD.js +19 -0
  383. package/dist/reranker-XZ2EF4OH.js +19 -0
  384. package/dist/retrieval-health-JYRKPSII.js +7 -0
  385. package/dist/retrieval-health-OUV25J6S.js +7 -0
  386. package/dist/retrieval-health-U73JUAZL.js +7 -0
  387. package/dist/retrieval-health-WSZ7TYFF.js +7 -0
  388. package/dist/review-polling-62JV55ZT.js +125 -0
  389. package/dist/review-polling-CJXLWFWK.js +125 -0
  390. package/dist/runtime/index.js +12 -12
  391. package/dist/session-events-2ADD54VI.js +37 -0
  392. package/dist/session-events-QIJVBSKS.js +37 -0
  393. package/dist/session-kill-telemetry-HS6HD2YE.js +30 -0
  394. package/dist/session-kill-telemetry-MRT5FVSM.js +30 -0
  395. package/dist/session-scope-7ICYPC33.js +87 -0
  396. package/dist/session-scope-KMXD6EE6.js +87 -0
  397. package/dist/setup-wizard-B6GIT7YC.js +12 -0
  398. package/dist/setup-wizard-JUIJ4UZO.js +12 -0
  399. package/dist/skill-refinement-HIOX4VMC.js +158 -0
  400. package/dist/skill-refinement-T7JXRYUW.js +158 -0
  401. package/dist/stack-update-5KE6BZKQ.js +74 -0
  402. package/dist/stack-update-OP2RHP7N.js +74 -0
  403. package/dist/stack-update-VGCWDJEE.js +74 -0
  404. package/dist/steward-gate-L22WE3SY.js +14 -0
  405. package/dist/steward-gate-YKD2LUWN.js +14 -0
  406. package/dist/task-enforcement-5AOKXTY4.js +439 -0
  407. package/dist/task-enforcement-VO3YEGIO.js +439 -0
  408. package/dist/task-scope-YV2WPKRD.js +36 -0
  409. package/dist/task-scope-ZSXDZBRE.js +36 -0
  410. package/dist/tasks-crud-C6KADACT.js +78 -0
  411. package/dist/tasks-crud-NV6JEWGL.js +78 -0
  412. package/dist/tasks-notify-E22HSN6O.js +39 -0
  413. package/dist/tasks-notify-RPSEQ4WV.js +39 -0
  414. package/dist/tasks-review-V4ZLXOAZ.js +48 -0
  415. package/dist/tasks-review-ZVRI73JE.js +48 -0
  416. package/dist/telemetry-upload-LXUH7SKI.js +740 -0
  417. package/dist/telemetry-upload-TCDAZTUQ.js +740 -0
  418. package/dist/token-budget-OFBEZJTA.js +85 -0
  419. package/dist/token-budget-WAN57V6S.js +85 -0
  420. package/dist/tool-telemetry-UA3N32PK.js +17 -0
  421. package/dist/tool-telemetry-XXZJ35RR.js +17 -0
  422. package/dist/tui/App.js +17 -17
  423. package/dist/tui-data-46QLCJUE.js +259 -0
  424. package/dist/tui-data-ZDB7BLP2.js +259 -0
  425. package/dist/wiki-acl-HHSIBPF3.js +111 -0
  426. package/dist/wiki-acl-O65GZ2ZF.js +111 -0
  427. package/dist/worker-gate-27I4GAEZ.js +21 -0
  428. package/dist/worker-gate-DXU4HEPY.js +21 -0
  429. package/dist/workflow-engine-63EOEJ5Q.js +28 -0
  430. package/dist/workflow-engine-C6F2RMPN.js +28 -0
  431. package/dist/worktree-SFKKOMFD.js +27 -0
  432. package/dist/worktree-SVCE3S7X.js +27 -0
  433. package/dist/worktree-sweep-S3JHJTVP.js +20 -0
  434. package/dist/worktree-sweep-U3TIQ7WL.js +20 -0
  435. package/package.json +1 -1
  436. package/release-notes.json +88 -26
@@ -0,0 +1,456 @@
1
+ import {
2
+ getGitRoot,
3
+ isWorktreeDirty
4
+ } from "./chunk-4MRP6EBR.js";
5
+
6
+ // src/lib/worktree-sweep.ts
7
+ import { execFileSync } from "child_process";
8
+ import { existsSync, readdirSync, readFileSync, statSync } from "fs";
9
+ import path from "path";
10
+ var GIT_TIMEOUT_MS = 1e4;
11
+ var DIRTY_ORPHAN_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1e3;
12
+ function isWorktreeUnpushed(wtPath, branch) {
13
+ if (!branch) return false;
14
+ try {
15
+ const remote = execFileSync("git", ["-C", wtPath, "rev-parse", "--abbrev-ref", `${branch}@{upstream}`], { encoding: "utf-8", timeout: GIT_TIMEOUT_MS, stdio: ["pipe", "pipe", "ignore"] }).trim();
16
+ if (!remote) return true;
17
+ const ahead = execFileSync("git", ["-C", wtPath, "rev-list", `${remote}..${branch}`, "--count"], { encoding: "utf-8", timeout: GIT_TIMEOUT_MS, stdio: ["pipe", "pipe", "ignore"] }).trim();
18
+ return parseInt(ahead, 10) > 0;
19
+ } catch {
20
+ try {
21
+ let ahead = "";
22
+ try {
23
+ ahead = execFileSync("git", ["-C", wtPath, "rev-list", `main..${branch}`, "--count"], { encoding: "utf-8", timeout: GIT_TIMEOUT_MS, stdio: ["pipe", "pipe", "ignore"] }).trim();
24
+ } catch {
25
+ ahead = execFileSync("git", ["-C", wtPath, "rev-list", `master..${branch}`, "--count"], { encoding: "utf-8", timeout: GIT_TIMEOUT_MS, stdio: ["pipe", "pipe", "ignore"] }).trim();
26
+ }
27
+ return parseInt(ahead, 10) > 0;
28
+ } catch {
29
+ return true;
30
+ }
31
+ }
32
+ }
33
+ var REPO_ALIASES = {
34
+ "exe-crm": ["openclaw", "exe-crm"],
35
+ "exe-wiki": ["ink", "exe-wiki"]
36
+ };
37
+ function discoverRepoPaths() {
38
+ const roots = [];
39
+ let exeOsRoot = null;
40
+ let dir = path.dirname(new URL(import.meta.url).pathname);
41
+ for (let i = 0; i < 5; i++) {
42
+ const pkgPath = path.join(dir, "package.json");
43
+ if (existsSync(pkgPath)) {
44
+ try {
45
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
46
+ if (pkg.name === "@askexenow/exe-os") {
47
+ exeOsRoot = dir;
48
+ break;
49
+ }
50
+ } catch {
51
+ }
52
+ }
53
+ dir = path.dirname(dir);
54
+ }
55
+ if (!exeOsRoot) {
56
+ exeOsRoot = process.cwd();
57
+ }
58
+ roots.push(exeOsRoot);
59
+ const parentDir = path.dirname(exeOsRoot);
60
+ try {
61
+ const siblings = readdirSync(parentDir);
62
+ for (const sibling of siblings) {
63
+ if (sibling.startsWith(".")) continue;
64
+ const siblingPath = path.join(parentDir, sibling);
65
+ if (siblingPath === exeOsRoot) continue;
66
+ const root = getGitRoot(siblingPath);
67
+ if (root && !roots.includes(root)) {
68
+ roots.push(root);
69
+ }
70
+ }
71
+ } catch {
72
+ }
73
+ for (const aliases of Object.values(REPO_ALIASES)) {
74
+ for (const alias of aliases) {
75
+ const aliasPath = path.join(parentDir, alias);
76
+ if (existsSync(aliasPath)) {
77
+ const root = getGitRoot(aliasPath);
78
+ if (root && !roots.includes(root)) {
79
+ roots.push(root);
80
+ }
81
+ }
82
+ }
83
+ }
84
+ return roots;
85
+ }
86
+ function listWorktrees(repoRoot) {
87
+ try {
88
+ const output = execFileSync("git", ["worktree", "list", "--porcelain"], {
89
+ cwd: repoRoot,
90
+ encoding: "utf8",
91
+ timeout: GIT_TIMEOUT_MS,
92
+ stdio: ["pipe", "pipe", "pipe"]
93
+ });
94
+ const worktrees = [];
95
+ let currentPath = "";
96
+ for (const line of output.split("\n")) {
97
+ if (line.startsWith("worktree ")) {
98
+ currentPath = line.slice("worktree ".length);
99
+ } else if (line.startsWith("branch ") && currentPath) {
100
+ const branch = line.slice("branch refs/heads/".length);
101
+ worktrees.push({ path: currentPath, branch });
102
+ currentPath = "";
103
+ }
104
+ }
105
+ return worktrees;
106
+ } catch {
107
+ return [];
108
+ }
109
+ }
110
+ function detectMainBranch(repoRoot) {
111
+ for (const candidate of ["main", "master"]) {
112
+ try {
113
+ execFileSync("git", ["rev-parse", "--verify", `refs/heads/${candidate}`], {
114
+ cwd: repoRoot,
115
+ encoding: "utf8",
116
+ timeout: GIT_TIMEOUT_MS,
117
+ stdio: ["pipe", "pipe", "pipe"]
118
+ });
119
+ return candidate;
120
+ } catch {
121
+ }
122
+ }
123
+ return null;
124
+ }
125
+ function isBranchMerged(repoRoot, branch, into) {
126
+ try {
127
+ const merged = execFileSync("git", ["branch", "--merged", into], {
128
+ cwd: repoRoot,
129
+ encoding: "utf8",
130
+ timeout: GIT_TIMEOUT_MS,
131
+ stdio: ["pipe", "pipe", "pipe"]
132
+ });
133
+ return merged.split("\n").map((l) => l.replace(/^[*+]?\s+/, "").trim()).includes(branch);
134
+ } catch {
135
+ return false;
136
+ }
137
+ }
138
+ function hasLiveTmuxSession(agentName) {
139
+ try {
140
+ const sessions = execFileSync("tmux", ["list-sessions", "-F", "#S"], {
141
+ encoding: "utf8",
142
+ timeout: 5e3,
143
+ stdio: ["pipe", "pipe", "ignore"]
144
+ }).trim();
145
+ if (!sessions) return false;
146
+ for (const session of sessions.split("\n")) {
147
+ const agentPart = session.split("-")[0];
148
+ if (!agentPart) continue;
149
+ const baseName = agentPart.replace(/\d+$/, "");
150
+ if (baseName === agentName || agentPart === agentName) return true;
151
+ }
152
+ return false;
153
+ } catch {
154
+ return false;
155
+ }
156
+ }
157
+ function removeWorktree(repoRoot, wtPath) {
158
+ try {
159
+ execFileSync("git", ["worktree", "remove", wtPath, "--force"], {
160
+ cwd: repoRoot,
161
+ encoding: "utf8",
162
+ timeout: GIT_TIMEOUT_MS,
163
+ stdio: ["pipe", "pipe", "pipe"]
164
+ });
165
+ return true;
166
+ } catch {
167
+ return false;
168
+ }
169
+ }
170
+ function deleteBranch(repoRoot, branch) {
171
+ try {
172
+ execFileSync("git", ["branch", "-D", branch], {
173
+ cwd: repoRoot,
174
+ encoding: "utf8",
175
+ timeout: GIT_TIMEOUT_MS,
176
+ stdio: ["pipe", "pipe", "pipe"]
177
+ });
178
+ return true;
179
+ } catch {
180
+ return false;
181
+ }
182
+ }
183
+ function deleteRemoteBranch(repoRoot, branch) {
184
+ try {
185
+ execFileSync("git", ["push", "origin", "--delete", branch], {
186
+ cwd: repoRoot,
187
+ encoding: "utf8",
188
+ timeout: 15e3,
189
+ stdio: ["pipe", "pipe", "pipe"]
190
+ });
191
+ return true;
192
+ } catch {
193
+ return false;
194
+ }
195
+ }
196
+ function pruneWorktreeRegistry(repoRoot) {
197
+ try {
198
+ execFileSync("git", ["worktree", "prune"], {
199
+ cwd: repoRoot,
200
+ encoding: "utf8",
201
+ timeout: GIT_TIMEOUT_MS,
202
+ stdio: ["pipe", "pipe", "pipe"]
203
+ });
204
+ } catch {
205
+ }
206
+ }
207
+ function clearStashes(repoRoot) {
208
+ try {
209
+ const stashList = execFileSync("git", ["stash", "list"], {
210
+ cwd: repoRoot,
211
+ encoding: "utf8",
212
+ timeout: GIT_TIMEOUT_MS,
213
+ stdio: ["pipe", "pipe", "pipe"]
214
+ }).trim();
215
+ if (!stashList) return 0;
216
+ const count = stashList.split("\n").length;
217
+ execFileSync("git", ["stash", "clear"], {
218
+ cwd: repoRoot,
219
+ encoding: "utf8",
220
+ timeout: GIT_TIMEOUT_MS,
221
+ stdio: ["pipe", "pipe", "pipe"]
222
+ });
223
+ return count;
224
+ } catch {
225
+ return 0;
226
+ }
227
+ }
228
+ function parseAgentName(wtPath) {
229
+ const dirName = path.basename(wtPath);
230
+ if (!dirName) return null;
231
+ return dirName.replace(/\d+$/, "") || dirName;
232
+ }
233
+ function getDirMtimeMs(dirPath) {
234
+ try {
235
+ return statSync(dirPath).mtimeMs;
236
+ } catch {
237
+ return null;
238
+ }
239
+ }
240
+ function archiveDirtyWorktree(wtPath, agentName) {
241
+ const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-").slice(0, 19);
242
+ const quarantineBranch = `quarantine/${agentName}-${timestamp}`;
243
+ try {
244
+ execFileSync("git", ["-C", wtPath, "checkout", "-b", quarantineBranch], {
245
+ encoding: "utf8",
246
+ timeout: GIT_TIMEOUT_MS,
247
+ stdio: ["pipe", "pipe", "pipe"]
248
+ });
249
+ execFileSync("git", ["-C", wtPath, "add", "-A"], {
250
+ encoding: "utf8",
251
+ timeout: GIT_TIMEOUT_MS,
252
+ stdio: ["pipe", "pipe", "pipe"]
253
+ });
254
+ execFileSync("git", [
255
+ "-C",
256
+ wtPath,
257
+ "commit",
258
+ "-m",
259
+ `[quarantine] Auto-archived dirty orphan worktree
260
+
261
+ Agent: ${agentName}
262
+ Original worktree: ${wtPath}
263
+ Archived by worktree-sweep after ${DIRTY_ORPHAN_MAX_AGE_MS / 864e5}-day dirty orphan threshold.`
264
+ ], {
265
+ encoding: "utf8",
266
+ timeout: GIT_TIMEOUT_MS,
267
+ stdio: ["pipe", "pipe", "pipe"],
268
+ env: {
269
+ ...process.env,
270
+ GIT_AUTHOR_NAME: "exe-os daemon",
271
+ GIT_AUTHOR_EMAIL: "daemon@exe-os.local",
272
+ GIT_COMMITTER_NAME: "exe-os daemon",
273
+ GIT_COMMITTER_EMAIL: "daemon@exe-os.local"
274
+ }
275
+ });
276
+ process.stderr.write(`[worktree-sweep] Archived dirty changes to branch ${quarantineBranch}
277
+ `);
278
+ return true;
279
+ } catch {
280
+ return false;
281
+ }
282
+ }
283
+ async function sweepWorktrees(options = {}) {
284
+ const dryRun = options.dryRun ?? false;
285
+ const repoPaths = options.repoPaths ?? discoverRepoPaths();
286
+ const result = {
287
+ reposScanned: 0,
288
+ removed: [],
289
+ branchesDeleted: [],
290
+ stashesCleared: 0,
291
+ skipped: [],
292
+ errors: []
293
+ };
294
+ for (const repoPath of repoPaths) {
295
+ const repoRoot = getGitRoot(repoPath);
296
+ if (!repoRoot) continue;
297
+ result.reposScanned++;
298
+ const repoName = path.basename(repoRoot);
299
+ const mainBranch = detectMainBranch(repoRoot);
300
+ if (!dryRun) {
301
+ pruneWorktreeRegistry(repoRoot);
302
+ }
303
+ const worktrees = listWorktrees(repoRoot);
304
+ for (const wt of worktrees) {
305
+ if (!wt.path.includes("/.worktrees/")) continue;
306
+ const agentName = parseAgentName(wt.path);
307
+ const wtName = path.basename(wt.path);
308
+ if (agentName && hasLiveTmuxSession(agentName)) {
309
+ result.skipped.push({
310
+ repo: repoName,
311
+ worktree: wtName,
312
+ branch: wt.branch,
313
+ reason: "live tmux session"
314
+ });
315
+ continue;
316
+ }
317
+ if (existsSync(wt.path) && isWorktreeDirty(wt.path)) {
318
+ const mtimeMs = getDirMtimeMs(wt.path);
319
+ const ageMs = mtimeMs !== null ? Date.now() - mtimeMs : 0;
320
+ if (ageMs >= DIRTY_ORPHAN_MAX_AGE_MS && agentName && !dryRun) {
321
+ const ageD = Math.round(ageMs / 864e5);
322
+ process.stderr.write(
323
+ `[worktree-sweep] Dirty orphan aged out (${ageD}d), archiving: ${repoName}/.worktrees/${wtName}
324
+ `
325
+ );
326
+ const archived = archiveDirtyWorktree(wt.path, agentName);
327
+ if (archived) {
328
+ } else {
329
+ result.skipped.push({
330
+ repo: repoName,
331
+ worktree: wtName,
332
+ branch: wt.branch,
333
+ reason: `uncommitted changes (archive failed after ${ageD}d)`
334
+ });
335
+ continue;
336
+ }
337
+ } else if (ageMs >= DIRTY_ORPHAN_MAX_AGE_MS && dryRun) {
338
+ const ageD = Math.round(ageMs / 864e5);
339
+ result.removed.push({ repo: repoName, worktree: wtName, branch: wt.branch });
340
+ process.stderr.write(
341
+ `[worktree-sweep] [DRY-RUN] Would archive+remove dirty orphan (${ageD}d): ${repoName}/.worktrees/${wtName}
342
+ `
343
+ );
344
+ continue;
345
+ } else {
346
+ result.skipped.push({
347
+ repo: repoName,
348
+ worktree: wtName,
349
+ branch: wt.branch,
350
+ reason: "uncommitted changes"
351
+ });
352
+ continue;
353
+ }
354
+ }
355
+ if (existsSync(wt.path) && isWorktreeUnpushed(wt.path, wt.branch)) {
356
+ result.skipped.push({
357
+ repo: repoName,
358
+ worktree: wtName,
359
+ branch: wt.branch,
360
+ reason: "unpushed commits \u2014 push first or use --force"
361
+ });
362
+ continue;
363
+ }
364
+ const isMerged = mainBranch ? isBranchMerged(repoRoot, wt.branch, mainBranch) : false;
365
+ if (dryRun) {
366
+ result.removed.push({ repo: repoName, worktree: wtName, branch: wt.branch });
367
+ if (isMerged || !mainBranch) {
368
+ result.branchesDeleted.push({ repo: repoName, branch: wt.branch, remote: true });
369
+ } else {
370
+ result.branchesDeleted.push({ repo: repoName, branch: wt.branch, remote: false });
371
+ }
372
+ continue;
373
+ }
374
+ const removed = removeWorktree(repoRoot, wt.path);
375
+ if (!removed) {
376
+ result.errors.push(`${repoName}: failed to remove worktree ${wtName}`);
377
+ continue;
378
+ }
379
+ result.removed.push({ repo: repoName, worktree: wtName, branch: wt.branch });
380
+ process.stderr.write(`[worktree-sweep] Removed ${repoName}/.worktrees/${wtName} (branch: ${wt.branch})
381
+ `);
382
+ const localDeleted = deleteBranch(repoRoot, wt.branch);
383
+ let remoteDeleted = false;
384
+ if (localDeleted) {
385
+ remoteDeleted = deleteRemoteBranch(repoRoot, wt.branch);
386
+ }
387
+ if (localDeleted) {
388
+ result.branchesDeleted.push({ repo: repoName, branch: wt.branch, remote: remoteDeleted });
389
+ }
390
+ }
391
+ if (!dryRun) {
392
+ const cleared = clearStashes(repoRoot);
393
+ if (cleared > 0) {
394
+ result.stashesCleared += cleared;
395
+ process.stderr.write(`[worktree-sweep] Cleared ${cleared} stash(es) in ${repoName}
396
+ `);
397
+ }
398
+ }
399
+ if (!dryRun) {
400
+ pruneWorktreeRegistry(repoRoot);
401
+ }
402
+ }
403
+ return result;
404
+ }
405
+ function cleanupAgentWorktree(repoRoot, agentName) {
406
+ const worktreesDir = path.join(repoRoot, ".worktrees");
407
+ if (!existsSync(worktreesDir)) return "";
408
+ const notes = [];
409
+ try {
410
+ const entries = readdirSync(worktreesDir);
411
+ for (const entry of entries) {
412
+ const baseName = entry.replace(/\d+$/, "") || entry;
413
+ const agentBase = agentName.replace(/\d+$/, "") || agentName;
414
+ if (baseName !== agentBase) continue;
415
+ const wtPath = path.join(worktreesDir, entry);
416
+ const branch = getWorktreeBranch(repoRoot, wtPath);
417
+ if (isWorktreeDirty(wtPath)) {
418
+ notes.push(`Worktree .worktrees/${entry} has uncommitted changes \u2014 preserved`);
419
+ continue;
420
+ }
421
+ if (isWorktreeUnpushed(wtPath, branch)) {
422
+ notes.push(`Worktree .worktrees/${entry} has unpushed commits \u2014 preserved`);
423
+ continue;
424
+ }
425
+ if (removeWorktree(repoRoot, wtPath)) {
426
+ notes.push(`Removed worktree .worktrees/${entry}`);
427
+ if (branch && deleteBranch(repoRoot, branch)) {
428
+ notes.push(`Deleted branch ${branch}`);
429
+ if (deleteRemoteBranch(repoRoot, branch)) {
430
+ notes.push(`Deleted remote branch ${branch}`);
431
+ }
432
+ }
433
+ }
434
+ }
435
+ } catch {
436
+ }
437
+ pruneWorktreeRegistry(repoRoot);
438
+ return notes.join("\n");
439
+ }
440
+ function getWorktreeBranch(repoRoot, wtPath) {
441
+ try {
442
+ const worktrees = listWorktrees(repoRoot);
443
+ for (const wt of worktrees) {
444
+ if (wt.path === wtPath) return wt.branch;
445
+ }
446
+ return null;
447
+ } catch {
448
+ return null;
449
+ }
450
+ }
451
+
452
+ export {
453
+ discoverRepoPaths,
454
+ sweepWorktrees,
455
+ cleanupAgentWorktree
456
+ };
@@ -0,0 +1,157 @@
1
+ import {
2
+ clean,
3
+ stableId
4
+ } from "./chunk-LPD4HILQ.js";
5
+
6
+ // src/lib/reflection-checkpoints.ts
7
+ function parsePayload(payload) {
8
+ if (!payload) return {};
9
+ try {
10
+ return JSON.parse(payload);
11
+ } catch {
12
+ return {};
13
+ }
14
+ }
15
+ function semanticArray(event, key) {
16
+ const payload = parsePayload(event.payload);
17
+ const semantic = payload.semantic;
18
+ const value = semantic?.[key];
19
+ return Array.isArray(value) ? value.map(String).filter(Boolean) : [];
20
+ }
21
+ function buildReflectionCheckpoint(events) {
22
+ if (!events.length) return null;
23
+ const sorted = [...events].sort((a, b) => a.occurred_at.localeCompare(b.occurred_at));
24
+ const first = sorted[0];
25
+ const last = sorted[sorted.length - 1];
26
+ const goals = /* @__PURE__ */ new Set();
27
+ const successes = [];
28
+ const failures = [];
29
+ const risks = [];
30
+ const nextActions = [];
31
+ const decisions = [];
32
+ for (const event of sorted) {
33
+ for (const goal of semanticArray(event, "goals")) goals.add(goal);
34
+ for (const item of semanticArray(event, "successSignals")) successes.push(item);
35
+ for (const item of semanticArray(event, "failureSignals")) failures.push(item);
36
+ for (const item of semanticArray(event, "nextActions")) nextActions.push(item);
37
+ for (const item of semanticArray(event, "decisions")) decisions.push(item);
38
+ if (event.impact === "negative" || event.outcome === "failure_signal" || event.event_type === "problem" || event.event_type === "error") {
39
+ failures.push(event.outcome || event.intention || event.event_type);
40
+ }
41
+ if (event.outcome === "risk_signal") risks.push(event.intention || event.outcome);
42
+ if (event.impact === "positive" || event.outcome === "success_signal" || event.event_type === "milestone") {
43
+ successes.push(event.outcome || event.intention || event.event_type);
44
+ }
45
+ }
46
+ const uniqueGoals = [...goals].slice(0, 6);
47
+ const uniqueSuccesses = [...new Set(successes.map((x) => clean(x, 180)).filter(Boolean))].slice(0, 6);
48
+ const uniqueFailures = [...new Set(failures.map((x) => clean(x, 180)).filter(Boolean))].slice(0, 6);
49
+ const uniqueRisks = [...new Set(risks.map((x) => clean(x, 180)).filter(Boolean))].slice(0, 6);
50
+ const uniqueNext = [...new Set(nextActions.map((x) => clean(x, 180)).filter(Boolean))].slice(0, 6);
51
+ const uniqueDecisions = [...new Set(decisions.map((x) => clean(x, 180)).filter(Boolean))].slice(0, 6);
52
+ const learnings = [
53
+ uniqueSuccesses.length ? `Working: ${uniqueSuccesses.slice(0, 3).join("; ")}` : "Working: no strong success signal yet",
54
+ uniqueFailures.length ? `Improve: ${uniqueFailures.slice(0, 3).join("; ")}` : "Improve: no strong failure signal in this window",
55
+ uniqueDecisions.length ? `Decision context: ${uniqueDecisions.slice(0, 2).join("; ")}` : "Decision context: no explicit decision signal"
56
+ ];
57
+ const summary = clean([
58
+ `Window ${first.occurred_at} \u2192 ${last.occurred_at}`,
59
+ `${sorted.length} events`,
60
+ uniqueGoals.length ? `goals: ${uniqueGoals.join("; ")}` : "goals: inferred from event trajectory",
61
+ uniqueSuccesses.length ? `successes: ${uniqueSuccesses.slice(0, 2).join("; ")}` : "successes: none explicit",
62
+ uniqueFailures.length ? `failures: ${uniqueFailures.slice(0, 2).join("; ")}` : "failures: none explicit"
63
+ ].join(". "), 1200);
64
+ return {
65
+ id: stableId("reflection", first.project_name ?? "", first.session_id ?? "", first.occurred_at, last.occurred_at, sorted.length),
66
+ projectName: first.project_name ?? null,
67
+ sessionId: first.session_id ?? null,
68
+ windowStartAt: first.occurred_at,
69
+ windowEndAt: last.occurred_at,
70
+ eventCount: sorted.length,
71
+ goalCount: uniqueGoals.length,
72
+ successCount: uniqueSuccesses.length,
73
+ failureCount: uniqueFailures.length,
74
+ riskCount: uniqueRisks.length,
75
+ summary,
76
+ learnings,
77
+ nextActions: uniqueNext.length ? uniqueNext : ["Continue from latest successful event and resolve highest-impact failure/risk first."],
78
+ evidenceEventIds: sorted.slice(-25).map((e) => e.id),
79
+ confidence: Math.min(0.95, 0.5 + Math.min(sorted.length, 100) / 250 + uniqueGoals.length * 0.03)
80
+ };
81
+ }
82
+ async function resolveClient(client) {
83
+ if (client) return client;
84
+ const { getClient } = await import("./lib/database.js");
85
+ return getClient();
86
+ }
87
+ async function insertReflectionCheckpoint(checkpoint, client) {
88
+ const db = await resolveClient(client);
89
+ const now = (/* @__PURE__ */ new Date()).toISOString();
90
+ await db.execute({
91
+ sql: `INSERT INTO agent_reflection_checkpoints
92
+ (id, project_name, session_id, window_start_at, window_end_at, event_count, goal_count,
93
+ success_count, failure_count, risk_count, summary, learnings, next_actions, evidence_event_ids,
94
+ confidence, created_at)
95
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
96
+ ON CONFLICT(id) DO UPDATE SET summary = excluded.summary, learnings = excluded.learnings,
97
+ next_actions = excluded.next_actions, confidence = excluded.confidence`,
98
+ args: [
99
+ checkpoint.id,
100
+ checkpoint.projectName,
101
+ checkpoint.sessionId,
102
+ checkpoint.windowStartAt,
103
+ checkpoint.windowEndAt,
104
+ checkpoint.eventCount,
105
+ checkpoint.goalCount,
106
+ checkpoint.successCount,
107
+ checkpoint.failureCount,
108
+ checkpoint.riskCount,
109
+ checkpoint.summary,
110
+ JSON.stringify(checkpoint.learnings),
111
+ JSON.stringify(checkpoint.nextActions),
112
+ JSON.stringify(checkpoint.evidenceEventIds),
113
+ checkpoint.confidence,
114
+ now
115
+ ]
116
+ });
117
+ }
118
+ async function generateReflectionCheckpoints(opts = {}) {
119
+ const db = await resolveClient(opts.client);
120
+ const windowSize = opts.windowSize ?? 100;
121
+ const minEvents = opts.minEvents ?? 20;
122
+ const limit = opts.limit ?? 5e3;
123
+ const where = opts.projectName ? "WHERE project_name = ?" : "";
124
+ const args = opts.projectName ? [opts.projectName] : [];
125
+ const result = await db.execute({
126
+ sql: `SELECT id, event_type, occurred_at, actor_agent_id, project_name, session_id, intention, outcome, impact, evidence_memory_id, payload
127
+ FROM agent_events ${where}
128
+ ORDER BY project_name, session_id, occurred_at, sequence_index
129
+ LIMIT ?`,
130
+ args: [...args, limit]
131
+ });
132
+ const groups = /* @__PURE__ */ new Map();
133
+ for (const row of result.rows) {
134
+ const event = row;
135
+ const key = `${event.project_name ?? ""}::${event.session_id ?? ""}`;
136
+ const bucket = groups.get(key) ?? [];
137
+ bucket.push(event);
138
+ groups.set(key, bucket);
139
+ }
140
+ let inserted = 0;
141
+ for (const events of groups.values()) {
142
+ for (let i = 0; i < events.length; i += windowSize) {
143
+ const window = events.slice(i, i + windowSize);
144
+ if (window.length < minEvents) continue;
145
+ const checkpoint = buildReflectionCheckpoint(window);
146
+ if (!checkpoint) continue;
147
+ await insertReflectionCheckpoint(checkpoint, db);
148
+ inserted++;
149
+ }
150
+ }
151
+ return inserted;
152
+ }
153
+
154
+ export {
155
+ buildReflectionCheckpoint,
156
+ generateReflectionCheckpoints
157
+ };