@askexenow/exe-os 0.9.367 → 0.9.368

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 (344) hide show
  1. package/deploy/compose/.env.askexe-control-plane.example +3 -1
  2. package/deploy/compose/.env.customer.example +6 -2
  3. package/deploy/compose/.env.example +8 -2
  4. package/deploy/compose/docker-compose.yml +21 -2
  5. package/deploy/compose/generate-env.ts +21 -1
  6. package/dist/.dist-verified.json +3 -3
  7. package/dist/{active-agent-V3CUDNED.js → active-agent-6WNC756A.js} +3 -3
  8. package/dist/{active-agent-R6Q7UEUD.js → active-agent-RDTJGZHP.js} +3 -3
  9. package/dist/{agent-defs-generator-MLPRGY75.js → agent-defs-generator-M5AUL3WM.js} +2 -2
  10. package/dist/{agentic-ontology-5FMQWGDZ.js → agentic-ontology-ZJBRYETW.js} +1 -1
  11. package/dist/{backfill-metadata-YXUMCKRV.js → backfill-metadata-Q4X23XLR.js} +5 -5
  12. package/dist/{backup-verify-GYHKAX7K.js → backup-verify-UKLX6IEK.js} +1 -1
  13. package/dist/behavior-injection-C3HEKSJY.js +60 -0
  14. package/dist/{behaviors-O6HKTSOF.js → behaviors-UCMAREU3.js} +8 -6
  15. package/dist/bin/agentic-ontology-backfill.js +6 -6
  16. package/dist/bin/agentic-reflection-backfill.js +7 -7
  17. package/dist/bin/agentic-semantic-label.js +6 -6
  18. package/dist/bin/backfill-conversations.js +5 -5
  19. package/dist/bin/backfill-responses.js +5 -5
  20. package/dist/bin/backfill-vectors.js +6 -6
  21. package/dist/bin/bulk-sync-postgres.js +10 -10
  22. package/dist/bin/cc-doctor.js +4 -4
  23. package/dist/bin/cleanup-stale-review-tasks.js +14 -14
  24. package/dist/bin/cli.js +20 -20
  25. package/dist/bin/deferred-daemon-restart.js +83 -81
  26. package/dist/bin/exe-agent-config.js +2 -2
  27. package/dist/bin/exe-agent.js +11 -11
  28. package/dist/bin/exe-assign.js +6 -6
  29. package/dist/bin/exe-boot.js +30 -30
  30. package/dist/bin/exe-call.js +4 -4
  31. package/dist/bin/exe-cloud.js +11 -11
  32. package/dist/bin/exe-config-dump.js +2 -2
  33. package/dist/bin/exe-dispatch.js +15 -15
  34. package/dist/bin/exe-doctor.js +5 -5
  35. package/dist/bin/exe-export-behaviors.js +10 -8
  36. package/dist/bin/exe-forget.js +7 -7
  37. package/dist/bin/exe-gateway.js +7 -7
  38. package/dist/bin/exe-healthcheck.js +4 -4
  39. package/dist/bin/exe-heartbeat.js +17 -17
  40. package/dist/bin/exe-kill.js +18 -18
  41. package/dist/bin/exe-launch-agent.js +24 -23
  42. package/dist/bin/exe-mcp.js +3 -3
  43. package/dist/bin/exe-memory-reads.js +5 -5
  44. package/dist/bin/exe-new-employee.js +8 -8
  45. package/dist/bin/exe-os-mcp-proxy.js +3 -3
  46. package/dist/bin/exe-pending-messages.js +15 -15
  47. package/dist/bin/exe-pending-notifications.js +14 -14
  48. package/dist/bin/exe-pending-reviews.js +14 -14
  49. package/dist/bin/exe-rename.js +4 -4
  50. package/dist/bin/exe-review.js +17 -17
  51. package/dist/bin/exe-search.js +6 -6
  52. package/dist/bin/exe-session-cleanup.js +19 -18
  53. package/dist/bin/exe-settings.js +10 -10
  54. package/dist/bin/exe-start-codex.js +73 -19
  55. package/dist/bin/exe-start-opencode.js +11 -9
  56. package/dist/bin/exe-status.js +16 -16
  57. package/dist/bin/exe-support.js +3 -3
  58. package/dist/bin/exe-team.js +4 -4
  59. package/dist/bin/exe-verify-running-images.js +123 -4
  60. package/dist/bin/exe-watchdog.js +44 -3
  61. package/dist/bin/git-sweep.js +16 -15
  62. package/dist/bin/graph-backfill.js +7 -7
  63. package/dist/bin/graph-export.js +6 -6
  64. package/dist/bin/import-history.js +10 -10
  65. package/dist/bin/install.js +85 -83
  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 +4 -4
  70. package/dist/bin/postgres-agentic-semantic-backfill.js +4 -4
  71. package/dist/bin/reconcile-backlog.js +47 -6
  72. package/dist/bin/registry-proxy.js +1 -1
  73. package/dist/bin/scan-tasks.js +14 -14
  74. package/dist/bin/setup.js +1 -1
  75. package/dist/bin/shard-migrate.js +5 -5
  76. package/dist/bin/stack-update.js +6 -5
  77. package/dist/bin/verify-stack.js +6 -1
  78. package/dist/bin/vps-health-gate.js +1 -1
  79. package/dist/{boot-generation-EZ2Y74IG.js → boot-generation-7H7Y4KC2.js} +3 -3
  80. package/dist/{boot-review-sections-7CNQTAYR.js → boot-review-sections-4AGCECCP.js} +13 -13
  81. package/dist/build-manifest.json +808 -773
  82. package/dist/{capability-cards-ZTFMK4VJ.js → capability-cards-6KAC5D2Z.js} +2 -2
  83. package/dist/{capacity-monitor-B2XU4YHP.js → capacity-monitor-J2Y4SFLA.js} +15 -15
  84. package/dist/{catchup-brief-3BEOL7EV.js → catchup-brief-F2HKF2CU.js} +18 -18
  85. package/dist/{chunk-PR3AHVFW.js → chunk-2AS6FG6C.js} +3 -3
  86. package/dist/{chunk-WCDIDSLR.js → chunk-2UBMXN4D.js} +2 -2
  87. package/dist/{chunk-267QB6VB.js → chunk-2UGU3V63.js} +1 -1
  88. package/dist/{chunk-PQ6NRLKL.js → chunk-34BMZTWV.js} +1 -1
  89. package/dist/{chunk-XA4EU3CW.js → chunk-4DGIOK6T.js} +1 -1
  90. package/dist/{chunk-JJRZE2LD.js → chunk-4GVJIMMK.js} +12 -6
  91. package/dist/{chunk-2IZH6W73.js → chunk-4L732DE5.js} +3 -3
  92. package/dist/{chunk-ZSHLY5BS.js → chunk-4RRMZJLG.js} +1 -1
  93. package/dist/{chunk-MQ3N4KZY.js → chunk-5IVLOOJR.js} +1 -1
  94. package/dist/{chunk-PFR6EOUY.js → chunk-5YKNEL3W.js} +2 -2
  95. package/dist/{chunk-AE3PYLLS.js → chunk-6EXOW5ZA.js} +9 -9
  96. package/dist/{chunk-CTPG4KYZ.js → chunk-6P7DVFKA.js} +1 -1
  97. package/dist/{chunk-F3PIHVVY.js → chunk-6UZ3DEQI.js} +1 -1
  98. package/dist/{chunk-URHJDUWO.js → chunk-72JZQ7EV.js} +1 -1
  99. package/dist/{chunk-66BFQOWR.js → chunk-72QUZX6J.js} +4 -4
  100. package/dist/{chunk-JOKKIFRN.js → chunk-AAL6CDMQ.js} +7 -7
  101. package/dist/{chunk-FSIAGX55.js → chunk-AJGX4Z34.js} +1 -1
  102. package/dist/{chunk-OADOH45L.js → chunk-BEPO36MW.js} +3 -3
  103. package/dist/{chunk-UI3K73LD.js → chunk-BFL3UB77.js} +1 -1
  104. package/dist/{chunk-KDD26FUY.js → chunk-BFPQXPN3.js} +1 -1
  105. package/dist/{chunk-7W5LCREK.js → chunk-BJKC6ZJU.js} +40 -84
  106. package/dist/{chunk-OPS7KUFV.js → chunk-BLNSUBP3.js} +3 -3
  107. package/dist/{chunk-5CH6XKVC.js → chunk-BNDHQGOY.js} +1 -1
  108. package/dist/{chunk-Z5Z3MYUW.js → chunk-BPQWRR4H.js} +2 -2
  109. package/dist/{chunk-YA4PM3MV.js → chunk-BTGR55GX.js} +3 -3
  110. package/dist/{chunk-WYVBWDFY.js → chunk-C4IJ5IS5.js} +1 -1
  111. package/dist/{chunk-XVRQZCTS.js → chunk-C5FOA5GO.js} +14 -3
  112. package/dist/{chunk-XKFMNAJ7.js → chunk-CSBD7QLZ.js} +1 -1
  113. package/dist/{chunk-BY3V5CLX.js → chunk-CU2OUUSV.js} +25 -5
  114. package/dist/{chunk-Y4JVM3SI.js → chunk-CXHRNESJ.js} +1 -1
  115. package/dist/{chunk-SFKIZYKK.js → chunk-DRMGPZSC.js} +2 -2
  116. package/dist/{chunk-PFOJX6CR.js → chunk-DYPKSVB7.js} +5 -5
  117. package/dist/{chunk-PS4NA7PM.js → chunk-EDB3LXBQ.js} +268 -166
  118. package/dist/{chunk-TCR7NBHD.js → chunk-EDRXCUEP.js} +4 -4
  119. package/dist/{chunk-BQYQES2Z.js → chunk-ELY5WBZX.js} +10 -10
  120. package/dist/{chunk-ALYI3P5D.js → chunk-EZUSIF66.js} +1 -1
  121. package/dist/{chunk-CYNL3ZFD.js → chunk-FHYX64H3.js} +3 -3
  122. package/dist/{chunk-PWCZFIQH.js → chunk-FSALI4B7.js} +4 -4
  123. package/dist/{chunk-4DJDC4Y2.js → chunk-FWKTZURC.js} +4 -4
  124. package/dist/{chunk-53LCVVX5.js → chunk-FWVPGXHD.js} +5 -5
  125. package/dist/{chunk-O3F5P6Z5.js → chunk-GILYOIMP.js} +2 -2
  126. package/dist/{chunk-NPND34FS.js → chunk-GP3J3AOT.js} +4 -4
  127. package/dist/{chunk-6NJURKRG.js → chunk-H6J7N3BZ.js} +1 -1
  128. package/dist/{chunk-WSLFGJBA.js → chunk-HQSUXAB4.js} +1 -1
  129. package/dist/{chunk-XTEKGO44.js → chunk-HTLJHSN4.js} +1 -1
  130. package/dist/{chunk-AEVE654G.js → chunk-HXV3DGL7.js} +1 -1
  131. package/dist/{chunk-LW5WRSDD.js → chunk-IEE6X6R2.js} +1 -1
  132. package/dist/{chunk-V3ISR2QT.js → chunk-IKRIUEIF.js} +1 -1
  133. package/dist/{chunk-52CFP2AV.js → chunk-J44774XC.js} +1 -1
  134. package/dist/{chunk-TJSTWACD.js → chunk-J77ZIMH5.js} +5 -5
  135. package/dist/{chunk-Y7OK5PJE.js → chunk-JDPV7W2L.js} +1 -1
  136. package/dist/{chunk-7W6FDHHY.js → chunk-KGPWS4KE.js} +1 -1
  137. package/dist/{chunk-XAMLDTRA.js → chunk-KWQ7RHYD.js} +4 -4
  138. package/dist/{chunk-IIVFXD6P.js → chunk-KYVIV54Y.js} +1 -1
  139. package/dist/chunk-KZXMP6JG.js +319 -0
  140. package/dist/{chunk-ZZ3JQM5I.js → chunk-LJWCK2DR.js} +9 -9
  141. package/dist/{chunk-WBKIU6UJ.js → chunk-MCXYNYZI.js} +30 -2
  142. package/dist/{chunk-L2VZBPJJ.js → chunk-MWEIBVBS.js} +13 -1
  143. package/dist/{chunk-GUOMZ3JM.js → chunk-MXP27XTP.js} +2 -2
  144. package/dist/{chunk-EDZ5URGR.js → chunk-N3CGSO3S.js} +1 -1
  145. package/dist/{chunk-QWDZNQXA.js → chunk-NNXPIJRB.js} +1 -1
  146. package/dist/{chunk-OISZ2I4X.js → chunk-NWE3CFX7.js} +4 -4
  147. package/dist/{chunk-HSBKV5LB.js → chunk-OBESOWFJ.js} +3 -3
  148. package/dist/{chunk-XKZD5FGK.js → chunk-OL3QP3AU.js} +116 -1
  149. package/dist/{chunk-6MCUXRIP.js → chunk-P3PAD6AA.js} +1 -1
  150. package/dist/{chunk-N3JLNMPF.js → chunk-PGF5I7EV.js} +2 -2
  151. package/dist/{chunk-CX4MVEM3.js → chunk-PVWM2WMM.js} +1 -1
  152. package/dist/{chunk-JFOZHVNO.js → chunk-QCSAYYL6.js} +1 -1
  153. package/dist/{chunk-J6VQ7HYV.js → chunk-QE5KWKVU.js} +27 -6
  154. package/dist/{chunk-4WOOCTON.js → chunk-QKZEUCTS.js} +2 -2
  155. package/dist/{chunk-P5XER5QY.js → chunk-QT6CNCXO.js} +3 -3
  156. package/dist/{chunk-P76VYS6V.js → chunk-QZYYCPNL.js} +1 -1
  157. package/dist/{chunk-DTTISDTI.js → chunk-RDIZSXXD.js} +1 -1
  158. package/dist/{chunk-R4AROSYI.js → chunk-RFWOXKVL.js} +10 -179
  159. package/dist/chunk-S2YTU74T.js +76 -0
  160. package/dist/{chunk-K2OFS57E.js → chunk-TP7BFVQP.js} +2 -2
  161. package/dist/{chunk-LIZ3QQGK.js → chunk-TTJWPV4G.js} +1 -1
  162. package/dist/{chunk-XUGOVOID.js → chunk-UATT6BNO.js} +3 -3
  163. package/dist/{chunk-ALKYXAMB.js → chunk-UVM5ZXO2.js} +4 -4
  164. package/dist/{chunk-R3H3WW7H.js → chunk-V7E37GE3.js} +2 -2
  165. package/dist/{chunk-XSXZVKJ7.js → chunk-VD3CVNGB.js} +3 -3
  166. package/dist/{chunk-CKKLSY7B.js → chunk-VIW62NN5.js} +1 -1
  167. package/dist/{chunk-VY3QUSWS.js → chunk-VTOO5UB3.js} +9 -9
  168. package/dist/chunk-W5MCOZTW.js +304 -0
  169. package/dist/{chunk-TZFOWWPM.js → chunk-WJOJWRN5.js} +139 -33
  170. package/dist/{chunk-PS6VPW64.js → chunk-X4MRVNR3.js} +1 -1
  171. package/dist/{chunk-YYLVHUYZ.js → chunk-XBTQPQN7.js} +1 -1
  172. package/dist/{behavior-injection-7VGYY2KO.js → chunk-XOTDAKJL.js} +24 -38
  173. package/dist/{chunk-QX33D4CH.js → chunk-Y4AYNLXU.js} +25 -25
  174. package/dist/{chunk-BTMX2D4X.js → chunk-YGPJ7VSJ.js} +48 -10
  175. package/dist/{chunk-DXCTHNEF.js → chunk-ZR3VMM3X.js} +9 -9
  176. package/dist/{chunk-MLPPG2OG.js → chunk-ZWONQU5S.js} +1 -1
  177. package/dist/{cleanup-graph-garbage-XDIX3HLN.js → cleanup-graph-garbage-FBSQI33K.js} +8 -8
  178. package/dist/{cloud-sync-command-VPYE4FIH.js → cloud-sync-command-NHGVDTLM.js} +11 -3
  179. package/dist/{cloud-sync-db-init-NSDBTFGI.js → cloud-sync-db-init-I75VOTXC.js} +1 -1
  180. package/dist/{cloud-sync-shutdown-6OUYTG4T.js → cloud-sync-shutdown-JGOFGGET.js} +2 -2
  181. package/dist/{cloud-sync-state-5DFKLWNB.js → cloud-sync-state-QF3TMMJ4.js} +3 -1
  182. package/dist/{co-activation-EAAKGGZH.js → co-activation-AE5L2SJV.js} +2 -2
  183. package/dist/{co-occurrence-OFVF55RX.js → co-occurrence-O65D4SCN.js} +6 -6
  184. package/dist/{conversation-entity-extractor-ZR5GFKAI.js → conversation-entity-extractor-LFIDTD2O.js} +4 -4
  185. package/dist/{crdt-sync-FGH4SBFW.js → crdt-sync-NRWDBRSE.js} +1 -1
  186. package/dist/{crm-webhook-PJATR2DC.js → crm-webhook-XOQGX6DV.js} +2 -2
  187. package/dist/{cto-delegation-gate-PO4LSSQ4.js → cto-delegation-gate-ZGOAXQI2.js} +13 -13
  188. package/dist/{daemon-orchestration-IJFZFQUX.js → daemon-orchestration-ZMQWYYDT.js} +18 -18
  189. package/dist/dispatch-intent-journal-VV6HMZC4.js +17 -0
  190. package/dist/{doc-graph-extractor-CAYUAM5A.js → doc-graph-extractor-6C5JBKPP.js} +6 -6
  191. package/dist/{documents-W2G477QE.js → documents-FKSQGSO4.js} +6 -6
  192. package/dist/{dreaming-FVXSIIWV.js → dreaming-IB3H6NDZ.js} +17 -17
  193. package/dist/{employee-boot-brief-OYMSHFHA.js → employee-boot-brief-5YRTUEJH.js} +24 -21
  194. package/dist/{exe-drift-67RGJOBX.js → exe-drift-CUWUYX3O.js} +3 -3
  195. package/dist/{exe-export-SGYX6XZG.js → exe-export-XWENYJNM.js} +7 -7
  196. package/dist/{exe-import-UABVA5N3.js → exe-import-OWOMRF2S.js} +7 -7
  197. package/dist/{exe-key-XNYDCVFE.js → exe-key-P356FGK5.js} +83 -81
  198. package/dist/{exe-org-XJVSU5HN.js → exe-org-UKIVF3KE.js} +8 -8
  199. package/dist/{exe-snapshot-YXOGYZUX.js → exe-snapshot-AZI2WW5Y.js} +18 -18
  200. package/dist/{fast-db-init-GDFJY5UH.js → fast-db-init-FPAPF3GB.js} +1 -1
  201. package/dist/{founder-context-KUXSNXKS.js → founder-context-QTQ6V3B5.js} +2 -2
  202. package/dist/gateway/index.js +11 -11
  203. package/dist/{git-staleness-NN6RWNLW.js → git-staleness-6ACWLV5Q.js} +2 -2
  204. package/dist/{global-procedures-XDNA3TNA.js → global-procedures-RXIKBVLZ.js} +3 -3
  205. package/dist/{graph-auto-extract-KTOR45V4.js → graph-auto-extract-Q4A4QMOF.js} +6 -6
  206. package/dist/{graph-rag-L5NV5YWD.js → graph-rag-RLRQMY54.js} +4 -4
  207. package/dist/{hook-integrity-X3YAVGUW.js → hook-integrity-3X2JRLBM.js} +1 -1
  208. package/dist/{hook-prefetch-WE4MIXBM.js → hook-prefetch-DU44UZQP.js} +14 -14
  209. package/dist/hooks/bug-report-worker.js +18 -18
  210. package/dist/hooks/codex-stop-task-finalizer.js +19 -19
  211. package/dist/hooks/commit-complete.js +20 -18
  212. package/dist/hooks/error-recall.js +8 -8
  213. package/dist/hooks/exe-heartbeat-hook.js +4 -4
  214. package/dist/hooks/ingest-worker.js +2 -2
  215. package/dist/hooks/ingest.js +11 -11
  216. package/dist/hooks/instructions-loaded.js +5 -5
  217. package/dist/hooks/manifest.json +20 -20
  218. package/dist/hooks/notification.js +5 -5
  219. package/dist/hooks/post-compact.js +4 -4
  220. package/dist/hooks/post-tool-combined.js +11 -11
  221. package/dist/hooks/pre-compact.js +17 -17
  222. package/dist/hooks/pre-tool-use.js +44 -37
  223. package/dist/hooks/prompt-submit.js +35 -31
  224. package/dist/hooks/session-end.js +21 -21
  225. package/dist/hooks/session-start.js +16 -16
  226. package/dist/hooks/stop.js +20 -20
  227. package/dist/hooks/subagent-stop.js +18 -18
  228. package/dist/hooks/summary-worker.js +22 -22
  229. package/dist/index.js +25 -25
  230. package/dist/{installer-EAAYEEEF.js → installer-B7QYQE56.js} +7 -5
  231. package/dist/{installer-UDRMFY75.js → installer-EXR25DDG.js} +5 -5
  232. package/dist/{installer-EPQAOI6M.js → installer-TOPA7673.js} +5 -5
  233. package/dist/{intercom-queue-IBOAVT2I.js → intercom-queue-BZ4M3L4S.js} +13 -13
  234. package/dist/lib/cloud-sync.js +10 -10
  235. package/dist/lib/consolidation.js +8 -8
  236. package/dist/lib/database.js +2 -2
  237. package/dist/lib/db-backup.js +1 -1
  238. package/dist/lib/db-write-worker.js +3 -3
  239. package/dist/lib/db.js +2 -2
  240. package/dist/lib/delivery-truth.js +25 -0
  241. package/dist/lib/device-registry.js +1 -1
  242. package/dist/lib/employee-templates.js +4 -4
  243. package/dist/lib/employees.js +2 -2
  244. package/dist/lib/exe-daemon.js +181 -76
  245. package/dist/lib/hybrid-search.js +6 -6
  246. package/dist/lib/identity.js +2 -2
  247. package/dist/lib/license.js +2 -2
  248. package/dist/lib/messaging.js +14 -14
  249. package/dist/lib/registry-proxy.js +1 -1
  250. package/dist/lib/reminders.js +3 -3
  251. package/dist/lib/schedules.js +6 -6
  252. package/dist/lib/session-registry.js +4 -4
  253. package/dist/lib/skill-learning.js +7 -7
  254. package/dist/lib/store.js +5 -5
  255. package/dist/lib/task-router.js +3 -3
  256. package/dist/lib/tasks.js +15 -15
  257. package/dist/lib/tmux-routing.js +13 -13
  258. package/dist/lib/token-spend.js +3 -3
  259. package/dist/{license-gate-3TTWJABL.js → license-gate-YTIOLKVV.js} +3 -3
  260. package/dist/{license-sync-ZC6TPKVV.js → license-sync-5VE5OSTV.js} +2 -2
  261. package/dist/mcp/register-tools.js +82 -80
  262. package/dist/mcp/server.js +85 -83
  263. package/dist/mcp/tools/complete-reminder.js +4 -4
  264. package/dist/mcp/tools/create-reminder.js +4 -4
  265. package/dist/mcp/tools/create-task.js +25 -23
  266. package/dist/mcp/tools/deactivate-behavior.js +8 -8
  267. package/dist/mcp/tools/list-reminders.js +4 -4
  268. package/dist/mcp/tools/list-tasks.js +17 -17
  269. package/dist/mcp/tools/send-message.js +16 -16
  270. package/dist/mcp/tools/update-task.js +16 -16
  271. package/dist/{mcp-http-config-ROF5EPEF.js → mcp-http-config-XUNRIGQH.js} +3 -3
  272. package/dist/{mcp-session-identity-ERU6FEUB.js → mcp-session-identity-4UIG7KLK.js} +13 -13
  273. package/dist/{memory-cards-3QTXI2SG.js → memory-cards-R74YU4CO.js} +5 -5
  274. package/dist/{memory-graph-extractor-7GAILMYG.js → memory-graph-extractor-3B4QJUXI.js} +7 -7
  275. package/dist/{memory-poisoning-defense-TPXSRJTQ.js → memory-poisoning-defense-OAKFL5O2.js} +2 -2
  276. package/dist/{memory-pressure-watchdog-ZSOP6T2F.js → memory-pressure-watchdog-FFC2CHFJ.js} +14 -14
  277. package/dist/{memory-reflection-3AI4JBV2.js → memory-reflection-5IJ6RE2J.js} +2 -2
  278. package/dist/{notification-ledger-ZU7ZFJJX.js → notification-ledger-P5XBUYKO.js} +14 -14
  279. package/dist/{notifications-S4GU22GF.js → notifications-LLCCHRYV.js} +13 -13
  280. package/dist/{orchestration-events-HVG56HJ5.js → orchestration-events-VBGCIQSS.js} +3 -3
  281. package/dist/{orchestrator-UW3Q3WYG.js → orchestrator-EB3SCTAJ.js} +15 -15
  282. package/dist/{org-brief-session-G36TJBN4.js → org-brief-session-GDCDKBFF.js} +6 -6
  283. package/dist/{org-consent-policy-RMYVMM3X.js → org-consent-policy-HCD42NBN.js} +2 -2
  284. package/dist/{org-partner-runtime-KXMGEYFW.js → org-partner-runtime-TPVKFR6E.js} +6 -6
  285. package/dist/{org-row-visibility-UI5PGN76.js → org-row-visibility-ZZLOPZLH.js} +1 -1
  286. package/dist/{pipeline-router-IODWXDDI.js → pipeline-router-3JTL2KF6.js} +3 -3
  287. package/dist/{plan-limits-XMAQVEJZ.js → plan-limits-MTHRP4WY.js} +5 -5
  288. package/dist/{projection-worker-6LZUCI3B.js → projection-worker-FLASNERC.js} +2 -2
  289. package/dist/{prospective-memory-G5VK5GCD.js → prospective-memory-HI3WUY4U.js} +2 -2
  290. package/dist/{push-notifications-S2RYRXLF.js → push-notifications-DFSR6P7V.js} +14 -14
  291. package/dist/{reranker-EHQTAA3L.js → reranker-XHBKUDGG.js} +1 -1
  292. package/dist/{retrieval-health-WZ4ICGNF.js → retrieval-health-NYKSDS6M.js} +1 -1
  293. package/dist/{review-polling-MAWLRDSP.js → review-polling-UAV6DZIZ.js} +14 -14
  294. package/dist/runtime/index.js +21 -21
  295. package/dist/{session-events-BRUIZ5E4.js → session-events-YCYPLWPG.js} +14 -14
  296. package/dist/{session-kill-telemetry-PTZLHT33.js → session-kill-telemetry-UEJTHL65.js} +14 -14
  297. package/dist/{session-scope-G4RVJJGR.js → session-scope-LXDW7LJJ.js} +13 -13
  298. package/dist/{setup-wizard-WFEUB63Z.js → setup-wizard-OVJQYUUL.js} +1 -1
  299. package/dist/{skill-refinement-2OYPH7WD.js → skill-refinement-EWRJID73.js} +3 -3
  300. package/dist/{stack-promote-DLYYQXQI.js → stack-promote-4IJM36OG.js} +4 -4
  301. package/dist/{stack-release-OPWARLXI.js → stack-release-BAIRY65H.js} +4 -4
  302. package/dist/{stack-update-SJ43IEQE.js → stack-update-VDM5WXRS.js} +3 -3
  303. package/dist/stalled-dispatch-escalation-MHLYH2PT.js +80 -0
  304. package/dist/{steward-gate-V7PBGVFK.js → steward-gate-Y4N2XY3R.js} +3 -3
  305. package/dist/{subagent-brief-injection-BLCRI2AJ.js → subagent-brief-injection-7A6JEVTP.js} +21 -20
  306. package/dist/{support-inbox-6HOQYFD2.js → support-inbox-LT4WJECQ.js} +4 -3
  307. package/dist/{task-enforcement-EF6O2V26.js → task-enforcement-WOIZ5TLK.js} +14 -14
  308. package/dist/{task-request-inbox-OB2KIJWO.js → task-request-inbox-D65BPUKZ.js} +2 -2
  309. package/dist/{task-scope-74JBTKJN.js → task-scope-PQ67YRWP.js} +13 -13
  310. package/dist/{tasks-crud-ZU6RZDEZ.js → tasks-crud-TJNMUKKH.js} +13 -13
  311. package/dist/{tasks-notify-767DRYAA.js → tasks-notify-7UVC3VGI.js} +14 -14
  312. package/dist/{tasks-review-4F6PZZ3B.js → tasks-review-WDWYISZ2.js} +13 -13
  313. package/dist/{telemetry-upload-2JM6KIAB.js → telemetry-upload-6LBGRJUE.js} +7 -7
  314. package/dist/{token-budget-NH2RD4YX.js → token-budget-XO5XW6DL.js} +3 -3
  315. package/dist/{tool-telemetry-CHCBD4OQ.js → tool-telemetry-ZL6TTZWG.js} +1 -1
  316. package/dist/tui/App.js +21 -21
  317. package/dist/{tui-data-244GF3BI.js → tui-data-UK7ZPKN4.js} +13 -13
  318. package/dist/{update-support-P2LO3DAB.js → update-support-BGL5KAZO.js} +12 -12
  319. package/dist/{work-claims-4QOE7DT2.js → work-claims-XZL2DKQ3.js} +3 -3
  320. package/dist/{work-state-heartbeat-GX3VWWWK.js → work-state-heartbeat-267YQ75U.js} +1 -1
  321. package/dist/{worker-gate-62PZATOV.js → worker-gate-RUM6MLIR.js} +1 -1
  322. package/dist/{workflow-engine-7YIRU62F.js → workflow-engine-YQHGHKSJ.js} +2 -2
  323. package/dist/{worktree-3TUKIZWY.js → worktree-3FO6EQ4G.js} +4 -4
  324. package/dist/{worktree-sweep-MYQHUXDE.js → worktree-sweep-X7MUEEQS.js} +5 -5
  325. package/package.json +2 -1
  326. package/release-notes.json +29 -23
  327. /package/dist/{chunk-25EN7XXN.js → chunk-4AN2PWUK.js} +0 -0
  328. /package/dist/{chunk-WM7Y5ZV2.js → chunk-5U4UJGTW.js} +0 -0
  329. /package/dist/{chunk-62U63R3E.js → chunk-EYIX6JU7.js} +0 -0
  330. /package/dist/{chunk-JLYHJJHU.js → chunk-FDA45THL.js} +0 -0
  331. /package/dist/{chunk-JZBZI36P.js → chunk-GIO4VU4J.js} +0 -0
  332. /package/dist/{chunk-BTFDA3UJ.js → chunk-I76LRCNA.js} +0 -0
  333. /package/dist/{chunk-YNPOELAN.js → chunk-LBWEAQ6Z.js} +0 -0
  334. /package/dist/{chunk-65ZSFW3O.js → chunk-MQ5RUHNZ.js} +0 -0
  335. /package/dist/{chunk-XM7HJ5SS.js → chunk-PFCE4AXQ.js} +0 -0
  336. /package/dist/{chunk-FLP2BQOA.js → chunk-SXAERZL2.js} +0 -0
  337. /package/dist/{chunk-OUIEDJFO.js → chunk-TKTQRSSD.js} +0 -0
  338. /package/dist/{chunk-DAXFAXLN.js → chunk-U2AZUMBZ.js} +0 -0
  339. /package/dist/{chunk-GTOMDMJL.js → chunk-W6FVADZS.js} +0 -0
  340. /package/dist/{core-memory-EARETDZ6.js → core-memory-W5ZHHBRR.js} +0 -0
  341. /package/dist/{memory-isolation-XASOGA7G.js → memory-isolation-ZE7EDBO4.js} +0 -0
  342. /package/dist/{oauth-server-C3BXAKAW.js → oauth-server-3HG62YYJ.js} +0 -0
  343. /package/dist/{project-boot-LCFBQ6NB.js → project-boot-3OAWKYLO.js} +0 -0
  344. /package/dist/{wiki-acl-XQH4UBP2.js → wiki-acl-FQV4E6M4.js} +0 -0
@@ -0,0 +1,319 @@
1
+ // src/lib/verification-evidence.ts
2
+ import { execFileSync } from "child_process";
3
+
4
+ // src/shared/verification-artifact.ts
5
+ var ok = { ok: true, code: "ok", message: "verified" };
6
+ function deny(code, message) {
7
+ return { ok: false, code, message };
8
+ }
9
+ var HEX_SHA = /^[0-9a-f]{7,64}$/i;
10
+ var MIN_OBSERVATION_CHARS = 40;
11
+ function isRecord(value) {
12
+ return typeof value === "object" && value !== null && !Array.isArray(value);
13
+ }
14
+ function str(value) {
15
+ return typeof value === "string" ? value.trim() : "";
16
+ }
17
+ function num(value) {
18
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
19
+ }
20
+ function isSubstantiveCommit(substance) {
21
+ if (!isRecord(substance)) return false;
22
+ const added = num(substance.added);
23
+ const deleted = num(substance.deleted);
24
+ const substantive = num(substance.substantive_added);
25
+ const sourceFiles = num(substance.source_files);
26
+ if (added === null || deleted === null || substantive === null || sourceFiles === null) return false;
27
+ if (added < 0 || deleted < 0 || substantive < 0 || sourceFiles < 0) return false;
28
+ if (substantive > added) return false;
29
+ if (sourceFiles < 1) return false;
30
+ if (substantive < 1 && deleted < 1) return false;
31
+ return true;
32
+ }
33
+ function assessVerificationArtifact(raw, context = {}) {
34
+ if (raw === void 0 || raw === null || raw === "") {
35
+ return deny("artifact_missing", "closing requires a verification artifact showing the defect is absent");
36
+ }
37
+ let artifact = raw;
38
+ if (typeof raw === "string") {
39
+ try {
40
+ artifact = JSON.parse(raw);
41
+ } catch {
42
+ return deny("artifact_malformed", "verification artifact must be valid JSON");
43
+ }
44
+ }
45
+ if (!isRecord(artifact)) {
46
+ return deny("artifact_malformed", "verification artifact must be an object");
47
+ }
48
+ const kind = str(artifact.kind);
49
+ if (kind !== "regression_test" && kind !== "manual") {
50
+ return deny("artifact_unknown_kind", "verification artifact kind must be regression_test or manual");
51
+ }
52
+ if (!isSubstantiveCommit(artifact.substance)) {
53
+ return deny(
54
+ "commit_not_substantive",
55
+ "the fix commit changes no executable production source (comment-only, whitespace-only, or test-only diffs are not fixes)"
56
+ );
57
+ }
58
+ if (kind === "regression_test") {
59
+ const testId = str(artifact.test_id);
60
+ const fixCommit = str(artifact.fix_commit);
61
+ const parentCommit = str(artifact.parent_commit);
62
+ if (!testId || !HEX_SHA.test(fixCommit) || !HEX_SHA.test(parentCommit)) {
63
+ return deny("artifact_malformed", "regression_test requires test_id, fix_commit and parent_commit");
64
+ }
65
+ if (fixCommit.toLowerCase() === parentCommit.toLowerCase()) {
66
+ return deny("parent_equals_fix", "parent_commit must be the commit BEFORE the fix");
67
+ }
68
+ if (str(artifact.parent_result) !== "fail") {
69
+ return deny(
70
+ "test_did_not_fail_at_parent",
71
+ "the named test must FAIL at the parent commit \u2014 a test that already passed does not detect the defect"
72
+ );
73
+ }
74
+ if (str(artifact.fix_result) !== "pass") {
75
+ return deny("test_did_not_pass_at_fix", "the named test must PASS at the fix commit");
76
+ }
77
+ return ok;
78
+ }
79
+ const verifier = str(artifact.verifier);
80
+ if (!verifier) {
81
+ return deny("manual_verifier_missing", "manual verification requires a named verifier");
82
+ }
83
+ const authors = (context.authorIdentities ?? []).map((a) => str(a).toLowerCase()).filter(Boolean);
84
+ if (authors.includes(verifier.toLowerCase())) {
85
+ return deny(
86
+ "manual_verifier_is_author",
87
+ "manual verification must be attested by someone other than the bug's author or assignee"
88
+ );
89
+ }
90
+ if (!str(artifact.method)) {
91
+ return deny("artifact_malformed", "manual verification requires a method");
92
+ }
93
+ if (str(artifact.observation).length < MIN_OBSERVATION_CHARS) {
94
+ return deny(
95
+ "manual_observation_too_thin",
96
+ "manual verification requires an observation describing the defect's absence"
97
+ );
98
+ }
99
+ if (!HEX_SHA.test(str(artifact.fix_commit))) {
100
+ return deny("artifact_malformed", "manual verification requires a fix_commit");
101
+ }
102
+ return ok;
103
+ }
104
+
105
+ // src/lib/verification-evidence.ts
106
+ var TEST_PATH = /(?:^|\/)(?:tests?|__tests__|__mocks__|e2e|fixtures)\//i;
107
+ var TEST_FILE = /\.(?:test|spec)\.[cm]?[jt]sx?$/i;
108
+ var NON_SOURCE_FILE = /\.(?:md|mdx|txt|rst|adoc|snap|lock)$/i;
109
+ var COMMENT_LINE = /^(?:\/\/|\/\*|\*\/|\*(?!\/)|#|--|<!--|-->)/;
110
+ function isTestPath(path) {
111
+ return TEST_PATH.test(path) || TEST_FILE.test(path);
112
+ }
113
+ function isNonSourcePath(path) {
114
+ return NON_SOURCE_FILE.test(path);
115
+ }
116
+ function isCommentOrBlank(line) {
117
+ const trimmed = line.trim();
118
+ if (!trimmed) return true;
119
+ return COMMENT_LINE.test(trimmed);
120
+ }
121
+ function measureUnifiedDiff(diff) {
122
+ let added = 0;
123
+ let deleted = 0;
124
+ let substantiveAdded = 0;
125
+ const sourceFiles = /* @__PURE__ */ new Set();
126
+ let currentPath = "";
127
+ let currentIsSource = false;
128
+ for (const line of diff.split(/\r?\n/)) {
129
+ if (line.startsWith("+++ ")) {
130
+ const path = line.slice(4).replace(/^b\//, "").trim();
131
+ currentPath = path === "/dev/null" ? "" : path;
132
+ currentIsSource = Boolean(currentPath) && !isTestPath(currentPath) && !isNonSourcePath(currentPath);
133
+ continue;
134
+ }
135
+ if (line.startsWith("--- ") || line.startsWith("diff ") || line.startsWith("index ") || line.startsWith("@@")) {
136
+ continue;
137
+ }
138
+ if (line.startsWith("+")) {
139
+ added += 1;
140
+ if (currentIsSource) {
141
+ const content = line.slice(1);
142
+ if (!isCommentOrBlank(content)) {
143
+ substantiveAdded += 1;
144
+ sourceFiles.add(currentPath);
145
+ }
146
+ }
147
+ } else if (line.startsWith("-")) {
148
+ deleted += 1;
149
+ if (currentIsSource) {
150
+ const content = line.slice(1);
151
+ if (!isCommentOrBlank(content)) sourceFiles.add(currentPath);
152
+ }
153
+ }
154
+ }
155
+ return {
156
+ added,
157
+ deleted,
158
+ substantive_added: substantiveAdded,
159
+ source_files: sourceFiles.size
160
+ };
161
+ }
162
+ function measureCommitSubstance(sha, cwd) {
163
+ if (!/^[0-9a-f]{7,64}$/i.test(sha)) return null;
164
+ try {
165
+ const diff = execFileSync(
166
+ "git",
167
+ ["show", "--format=", "--unified=0", "--no-color", sha],
168
+ { cwd, encoding: "utf8", timeout: 15e3, maxBuffer: 32 * 1024 * 1024 }
169
+ );
170
+ return measureUnifiedDiff(diff);
171
+ } catch {
172
+ return null;
173
+ }
174
+ }
175
+ function resolveParentCommit(sha, cwd) {
176
+ if (!/^[0-9a-f]{7,64}$/i.test(sha)) return null;
177
+ try {
178
+ const out = execFileSync("git", ["rev-parse", `${sha}^`], {
179
+ cwd,
180
+ encoding: "utf8",
181
+ timeout: 1e4
182
+ });
183
+ const parent = out.trim();
184
+ return /^[0-9a-f]{7,64}$/i.test(parent) ? parent : null;
185
+ } catch {
186
+ return null;
187
+ }
188
+ }
189
+ function fail(code, message) {
190
+ return { ok: false, code, message };
191
+ }
192
+ var PLACEHOLDER_VERIFIERS = /* @__PURE__ */ new Set([
193
+ "me",
194
+ "self",
195
+ "myself",
196
+ "i",
197
+ "agent",
198
+ "the agent",
199
+ "assistant",
200
+ "ai",
201
+ "bot",
202
+ "n/a",
203
+ "na",
204
+ "none",
205
+ "unknown",
206
+ "tbd",
207
+ "todo",
208
+ "system",
209
+ "automated",
210
+ "auto",
211
+ "claude",
212
+ "user",
213
+ "test",
214
+ "someone",
215
+ "team"
216
+ ]);
217
+ var LOW_CONTENT_OBSERVATION = /^(?:it(?:'s| is)? |the bug (?:is|was) |this (?:is|was) )?(?:fixed|resolved|working|done|good|ok|verified|closed)\b/i;
218
+ function resolveCommit(sha, cwd) {
219
+ if (!/^[0-9a-f]{7,64}$/i.test(sha)) return null;
220
+ try {
221
+ const out = execFileSync("git", ["rev-parse", "--verify", `${sha}^{commit}`], {
222
+ cwd,
223
+ encoding: "utf8",
224
+ timeout: 1e4
225
+ }).trim();
226
+ return /^[0-9a-f]{40}$/i.test(out) ? out : null;
227
+ } catch {
228
+ return null;
229
+ }
230
+ }
231
+ function buildVerificationArtifact(request, context = {}) {
232
+ const repo = request.repo_path;
233
+ if (!repo || !repo.trim()) {
234
+ return fail("repo_path_missing", "repo_path is required: the fix commit must be measured in the repository that contains it");
235
+ }
236
+ const fixCommit = resolveCommit(request.fix_commit ?? "", repo);
237
+ if (!fixCommit) {
238
+ return fail(
239
+ "fix_commit_unresolvable",
240
+ `fix_commit ${request.fix_commit} is not a commit in ${repo} \u2014 verification evidence cannot be measured, and will not be guessed`
241
+ );
242
+ }
243
+ const substance = measureCommitSubstance(fixCommit, repo);
244
+ if (!substance) {
245
+ return fail("commit_not_measurable", `git could not diff ${fixCommit} in ${repo}`);
246
+ }
247
+ let artifact;
248
+ if (request.kind === "regression_test") {
249
+ const parentCommit = resolveParentCommit(fixCommit, repo);
250
+ if (!parentCommit) {
251
+ return fail(
252
+ "parent_commit_unresolvable",
253
+ `could not resolve the first parent of ${fixCommit} \u2014 a regression_test artifact needs the tree WITHOUT the fix`
254
+ );
255
+ }
256
+ const testId = (request.test_id ?? "").trim();
257
+ if (!testId) return fail("artifact_malformed", "regression_test requires test_id (e.g. 'tests/foo.test.ts::rejects empty scope')");
258
+ const parentResult = (request.parent_result ?? "").trim();
259
+ const fixResult = (request.fix_result ?? "").trim();
260
+ if (parentResult !== "fail" && parentResult !== "pass" && parentResult !== "error") {
261
+ return fail("artifact_malformed", "parent_result must be the result you OBSERVED running the test at the parent commit: fail, pass or error");
262
+ }
263
+ if (fixResult !== "fail" && fixResult !== "pass" && fixResult !== "error") {
264
+ return fail("artifact_malformed", "fix_result must be the result you OBSERVED running the test at the fix commit: fail, pass or error");
265
+ }
266
+ const regression = {
267
+ kind: "regression_test",
268
+ test_id: testId,
269
+ fix_commit: fixCommit,
270
+ parent_commit: parentCommit,
271
+ parent_result: parentResult,
272
+ fix_result: fixResult,
273
+ substance
274
+ };
275
+ artifact = regression;
276
+ } else if (request.kind === "manual") {
277
+ const verifier = (request.verifier ?? "").trim();
278
+ if (!verifier) return fail("manual_verifier_missing", "manual verification requires a named verifier");
279
+ if (PLACEHOLDER_VERIFIERS.has(verifier.toLowerCase())) {
280
+ return fail(
281
+ "manual_verifier_placeholder",
282
+ `"${verifier}" is not an identity. Name the person or employee who reproduced the original defect and confirmed it is gone.`
283
+ );
284
+ }
285
+ const method = (request.method ?? "").trim();
286
+ if (!method) return fail("artifact_malformed", "manual verification requires a method someone else could repeat");
287
+ const observation = (request.observation ?? "").replace(/\s+/g, " ").trim();
288
+ if (LOW_CONTENT_OBSERVATION.test(observation)) {
289
+ return fail(
290
+ "manual_observation_too_thin",
291
+ "the observation must describe what you saw that shows the DEFECT IS ABSENT \u2014 not that the bug is 'fixed'"
292
+ );
293
+ }
294
+ if (observation.toLowerCase() === method.toLowerCase()) {
295
+ return fail("manual_observation_too_thin", "the observation must say what you saw, not repeat the method");
296
+ }
297
+ const manual = {
298
+ kind: "manual",
299
+ verifier,
300
+ method,
301
+ observation,
302
+ fix_commit: fixCommit,
303
+ substance
304
+ };
305
+ artifact = manual;
306
+ } else {
307
+ return fail("artifact_unknown_kind", "verification kind must be regression_test or manual");
308
+ }
309
+ const assessed = assessVerificationArtifact(artifact, context);
310
+ if (!assessed.ok) return fail(assessed.code, assessed.message);
311
+ return { ok: true, artifact, substance };
312
+ }
313
+
314
+ export {
315
+ isSubstantiveCommit,
316
+ assessVerificationArtifact,
317
+ measureCommitSubstance,
318
+ buildVerificationArtifact
319
+ };
@@ -2,7 +2,7 @@ import {
2
2
  dispatchTaskToEmployee,
3
3
  markTaskNotificationsRead,
4
4
  notifyTaskDone
5
- } from "./chunk-OISZ2I4X.js";
5
+ } from "./chunk-NWE3CFX7.js";
6
6
  import {
7
7
  clearCurrentTask,
8
8
  writeCurrentTask
@@ -16,7 +16,7 @@ import {
16
16
  strictSessionScopeFilter,
17
17
  updateTaskStatus,
18
18
  writeNotification
19
- } from "./chunk-QX33D4CH.js";
19
+ } from "./chunk-Y4AYNLXU.js";
20
20
  import {
21
21
  getAgentContext
22
22
  } from "./chunk-GJV3WDWM.js";
@@ -27,7 +27,7 @@ import {
27
27
  getClient,
28
28
  getCoordinatorName,
29
29
  isCoordinatorName
30
- } from "./chunk-HSBKV5LB.js";
30
+ } from "./chunk-OBESOWFJ.js";
31
31
 
32
32
  // src/lib/tasks-chain.ts
33
33
  import path from "path";
@@ -62,7 +62,7 @@ async function cascadeUnblock(taskId, baseDir, now) {
62
62
  }
63
63
  if (unblockedRows.rows.length > 0 && !process.env.VITEST) {
64
64
  try {
65
- const { dispatchTaskToEmployee: dispatchTaskToEmployee2 } = await import("./tasks-notify-767DRYAA.js");
65
+ const { dispatchTaskToEmployee: dispatchTaskToEmployee2 } = await import("./tasks-notify-7UVC3VGI.js");
66
66
  const dispatched = /* @__PURE__ */ new Set();
67
67
  for (const ur of unblockedRows.rows) {
68
68
  const assignee = String(ur.assigned_to);
@@ -87,7 +87,7 @@ async function cascadeUnblock(taskId, baseDir, now) {
87
87
  }
88
88
  } catch {
89
89
  try {
90
- const { queueIntercom } = await import("./intercom-queue-IBOAVT2I.js");
90
+ const { queueIntercom } = await import("./intercom-queue-BZ4M3L4S.js");
91
91
  const dispatched = /* @__PURE__ */ new Set();
92
92
  for (const ur of unblockedRows.rows) {
93
93
  const assignee = String(ur.assigned_to);
@@ -285,7 +285,7 @@ async function updateTask(input) {
285
285
  try {
286
286
  process.stderr.write(`[tasks] EVENT: tmux delivery failed for reviewer="${reviewer}". Queueing for daemon delivery.
287
287
  `);
288
- const { queueIntercom } = await import("./intercom-queue-IBOAVT2I.js");
288
+ const { queueIntercom } = await import("./intercom-queue-BZ4M3L4S.js");
289
289
  const { resolveExeSession } = await import("./lib/tmux-routing.js");
290
290
  const exeSession = row.session_scope ? String(row.session_scope) : resolveExeSession();
291
291
  if (exeSession) {
@@ -302,7 +302,7 @@ async function updateTask(input) {
302
302
  }
303
303
  }
304
304
  try {
305
- const { pushNotifyAsync } = await import("./push-notifications-S2RYRXLF.js");
305
+ const { pushNotifyAsync } = await import("./push-notifications-DFSR6P7V.js");
306
306
  pushNotifyAsync({
307
307
  event: "review_ready",
308
308
  title: `Review ready: ${taskTitle.slice(0, 50)}`,
@@ -314,7 +314,7 @@ async function updateTask(input) {
314
314
  }
315
315
  if (!isCoordinator && isCompletionReviewTransition) {
316
316
  try {
317
- const { pushNotifyAsync } = await import("./push-notifications-S2RYRXLF.js");
317
+ const { pushNotifyAsync } = await import("./push-notifications-DFSR6P7V.js");
318
318
  const event = input.status === "needs_review" ? "review_ready" : "task_complete";
319
319
  pushNotifyAsync({
320
320
  event,
@@ -329,7 +329,7 @@ async function updateTask(input) {
329
329
  await markTaskNotificationsRead(taskFile);
330
330
  if (isCompletionReviewTransition && !isCoordinator && row.reviewer) {
331
331
  try {
332
- const { writeNotification: writeNotification2 } = await import("./notifications-S4GU22GF.js");
332
+ const { writeNotification: writeNotification2 } = await import("./notifications-LLCCHRYV.js");
333
333
  const reviewer = String(row.reviewer);
334
334
  await writeNotification2({
335
335
  agentId: reviewer,
@@ -3,13 +3,13 @@ import {
3
3
  } from "./chunk-VMJ2UH4S.js";
4
4
  import {
5
5
  vectorToSqlLiteral
6
- } from "./chunk-BQYQES2Z.js";
6
+ } from "./chunk-ELY5WBZX.js";
7
7
  import {
8
8
  blobToVector
9
9
  } from "./chunk-OTVEIJUQ.js";
10
10
  import {
11
11
  getClient
12
- } from "./chunk-HSBKV5LB.js";
12
+ } from "./chunk-OBESOWFJ.js";
13
13
 
14
14
  // src/lib/behaviors.ts
15
15
  import crypto from "crypto";
@@ -118,6 +118,33 @@ async function storeBehavior(opts) {
118
118
  });
119
119
  return id;
120
120
  }
121
+ async function countActiveBehaviors(agentId, projectName) {
122
+ const client = getClient();
123
+ let currentDeviceId = null;
124
+ try {
125
+ const { loadDeviceId } = await import("./lib/license.js");
126
+ currentDeviceId = loadDeviceId() ?? null;
127
+ } catch {
128
+ }
129
+ const { offloadReadIfMain } = await import("./lib/database.js");
130
+ const result = await offloadReadIfMain(
131
+ client,
132
+ `SELECT count(*) AS total,
133
+ sum(CASE WHEN priority = 'p0' THEN 1 ELSE 0 END) AS p0
134
+ FROM behaviors
135
+ WHERE agent_id = ? AND active = 1
136
+ AND id IS NOT NULL AND trim(coalesce(content, '')) != ''
137
+ AND (project_name IS NULL OR project_name = ?)
138
+ AND (device_id IS NULL OR device_id = ?)`,
139
+ [agentId, projectName ?? "", currentDeviceId ?? ""],
140
+ true
141
+ );
142
+ const row = result.rows[0];
143
+ return {
144
+ total: Number(row?.total ?? 0),
145
+ p0: Number(row?.p0 ?? 0)
146
+ };
147
+ }
121
148
  async function listBehaviors(agentId, projectName, limit = 30) {
122
149
  const client = getClient();
123
150
  let currentDeviceId = null;
@@ -329,6 +356,7 @@ export {
329
356
  isReflexBehavior,
330
357
  storeReflexBehavior,
331
358
  storeBehavior,
359
+ countActiveBehaviors,
332
360
  listBehaviors,
333
361
  listBehaviorsByDomain,
334
362
  listBehaviorsSince,
@@ -25,7 +25,10 @@ function normalizeState(value) {
25
25
  paused: raw.paused === true,
26
26
  pausedAt: typeof raw.pausedAt === "string" ? raw.pausedAt : null,
27
27
  intervalMs,
28
- updatedAt
28
+ updatedAt,
29
+ // Optional and only present when actually set, so existing readers that
30
+ // compare whole state objects are unaffected by the new field.
31
+ ...typeof raw.pendingSliceAt === "string" && raw.pendingSliceAt !== "" ? { pendingSliceAt: raw.pendingSliceAt } : {}
29
32
  };
30
33
  }
31
34
  function readCloudSyncState(statePath = resolveCloudSyncStatePath()) {
@@ -85,6 +88,14 @@ function newestCloudSyncFailureFromHealthLog(healthLogPath) {
85
88
  }
86
89
  return null;
87
90
  }
91
+ function hasPendingCloudSyncSlice(state, nowMs, intervalMs) {
92
+ const pendingSliceAt = state?.pendingSliceAt;
93
+ if (typeof pendingSliceAt !== "string" || pendingSliceAt === "") return false;
94
+ const pendingMs = Date.parse(pendingSliceAt);
95
+ if (!Number.isFinite(pendingMs)) return false;
96
+ const ageMs = nowMs - pendingMs;
97
+ return ageMs >= 0 && ageMs < (intervalMs > 0 ? intervalMs : DEFAULT_INTERVAL_MS);
98
+ }
88
99
  function resolveCloudSyncStatus(options) {
89
100
  if (!options.cloudConfigured) return { status: "not-configured" };
90
101
  const nowMs = options.nowMs ?? Date.now();
@@ -142,5 +153,6 @@ export {
142
153
  resolveDaemonHealthLogPath,
143
154
  readCloudSyncState,
144
155
  writeCloudSyncState,
156
+ hasPendingCloudSyncSlice,
145
157
  resolveCloudSyncStatus
146
158
  };
@@ -3,11 +3,11 @@ import {
3
3
  } from "./chunk-75H4R62K.js";
4
4
  import {
5
5
  initStore
6
- } from "./chunk-BQYQES2Z.js";
6
+ } from "./chunk-ELY5WBZX.js";
7
7
  import {
8
8
  getClient,
9
9
  isInitialized
10
- } from "./chunk-HSBKV5LB.js";
10
+ } from "./chunk-OBESOWFJ.js";
11
11
 
12
12
  // src/lib/schedules.ts
13
13
  import crypto from "crypto";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  processCRMEvent
3
- } from "./chunk-YNPOELAN.js";
3
+ } from "./chunk-LBWEAQ6Z.js";
4
4
 
5
5
  // src/gateway/adapters/crm-webhook.ts
6
6
  function parseTwentyWebhook(payload) {
@@ -14,7 +14,7 @@ import {
14
14
  getEmployee,
15
15
  isCoordinatorRole,
16
16
  loadEmployeesSync
17
- } from "./chunk-HSBKV5LB.js";
17
+ } from "./chunk-OBESOWFJ.js";
18
18
  import {
19
19
  EXE_AI_DIR
20
20
  } from "./chunk-QMSEL5YS.js";
@@ -6,13 +6,13 @@ import {
6
6
  queryTaskRows,
7
7
  resolveExeSession,
8
8
  sendIntercom
9
- } from "./chunk-QX33D4CH.js";
9
+ } from "./chunk-Y4AYNLXU.js";
10
10
  import {
11
11
  getTransport
12
12
  } from "./chunk-UXLO7VHX.js";
13
13
  import {
14
14
  recordOrchestrationEventBestEffort
15
- } from "./chunk-UI3K73LD.js";
15
+ } from "./chunk-BFL3UB77.js";
16
16
  import {
17
17
  releaseDispatchClaim,
18
18
  tryAcquireDispatchClaim
@@ -27,7 +27,7 @@ import {
27
27
  isCoordinatorName,
28
28
  isMultiInstance,
29
29
  shouldAutoInstance
30
- } from "./chunk-HSBKV5LB.js";
30
+ } from "./chunk-OBESOWFJ.js";
31
31
 
32
32
  // src/lib/tasks-notify.ts
33
33
  var VERIFY_DELAY_MS = 1e4;
@@ -89,7 +89,7 @@ async function dispatchTaskToEmployee(input) {
89
89
  let crossProject = false;
90
90
  if (input.projectName) {
91
91
  try {
92
- const { assertSessionScope } = await import("./session-scope-G4RVJJGR.js");
92
+ const { assertSessionScope } = await import("./session-scope-LXDW7LJJ.js");
93
93
  const check = assertSessionScope("dispatch_task", input.projectName);
94
94
  if (check.reason === "cross_session_denied") {
95
95
  crossProject = true;
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-5YEUPUV4.js";
10
10
  import {
11
11
  listBackups
12
- } from "./chunk-Y7OK5PJE.js";
12
+ } from "./chunk-JDPV7W2L.js";
13
13
  import {
14
14
  isPostgresBackendEnabled
15
15
  } from "./chunk-YYB5PMTK.js";
@@ -1333,7 +1333,7 @@ async function migrateReflectionDedup(client) {
1333
1333
  "ALTER TABLE memory_reflections ADD COLUMN dedup_key TEXT",
1334
1334
  "migration add memory_reflections.dedup_key"
1335
1335
  );
1336
- const { reflectionDedupKey } = await import("./memory-reflection-3AI4JBV2.js");
1336
+ const { reflectionDedupKey } = await import("./memory-reflection-5IJ6RE2J.js");
1337
1337
  const keyForRow = (row) => {
1338
1338
  let sources = [];
1339
1339
  try {
@@ -2346,7 +2346,7 @@ async function sweepExpiredSoftDeletedMemories(client, options = {}) {
2346
2346
  const purgeArchived = archDays !== void 0;
2347
2347
  const BATCH_SIZE = 2e3;
2348
2348
  const MAX_BATCHES = 500;
2349
- const { cleanupCardsForMemories, cleanupGraphLinksForMemories } = await import("./graph-rag-L5NV5YWD.js");
2349
+ const { cleanupCardsForMemories, cleanupGraphLinksForMemories } = await import("./graph-rag-RLRQMY54.js");
2350
2350
  const softCutoff = `-${softDays} days`;
2351
2351
  const selectArgsBase = [softCutoff];
2352
2352
  let predicate = `status = 'deleted' AND COALESCE(deleted_at, timestamp) < datetime('now', ?)`;