@askexenow/exe-os 0.9.335 → 0.9.338
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.
- package/dist/{active-agent-AIK6FSYE.js → active-agent-EC6M7KTX.js} +3 -3
- package/dist/{active-agent-GXV65DNN.js → active-agent-WHIUCHLA.js} +3 -3
- package/dist/{agentic-ontology-V2BQY4DH.js → agentic-ontology-RNSXGXW4.js} +1 -1
- package/dist/{backfill-metadata-7JFKICS3.js → backfill-metadata-MFY6BHKE.js} +4 -4
- package/dist/{behaviors-QTG3MHDO.js → behaviors-HLZUJSMP.js} +5 -5
- package/dist/bin/agentic-ontology-backfill.js +5 -5
- package/dist/bin/agentic-reflection-backfill.js +6 -6
- package/dist/bin/agentic-semantic-label.js +5 -5
- package/dist/bin/backfill-conversations.js +4 -4
- package/dist/bin/backfill-responses.js +4 -4
- package/dist/bin/backfill-vectors.js +5 -5
- package/dist/bin/bulk-sync-postgres.js +12 -10
- package/dist/bin/cc-doctor.js +4 -4
- package/dist/bin/cleanup-stale-review-tasks.js +14 -14
- package/dist/bin/cli.js +19 -16
- package/dist/bin/deferred-daemon-restart.js +71 -69
- package/dist/bin/exe-agent-config.js +3 -3
- package/dist/bin/exe-agent.js +14 -14
- package/dist/bin/exe-assign.js +5 -5
- package/dist/bin/exe-boot.js +24 -24
- package/dist/bin/exe-call.js +4 -4
- package/dist/bin/exe-cloud.js +12 -10
- package/dist/bin/exe-config-dump.js +3 -3
- package/dist/bin/exe-dispatch.js +14 -14
- package/dist/bin/exe-doctor.js +4 -4
- package/dist/bin/exe-export-behaviors.js +7 -7
- package/dist/bin/exe-forget.js +6 -6
- package/dist/bin/exe-gateway.js +7 -7
- package/dist/bin/exe-grant.js +126 -0
- package/dist/bin/exe-healthcheck.js +4 -4
- package/dist/bin/exe-heartbeat.js +14 -14
- package/dist/bin/exe-kill.js +17 -17
- package/dist/bin/exe-launch-agent.js +22 -22
- package/dist/bin/exe-new-employee.js +8 -8
- package/dist/bin/exe-pending-messages.js +15 -15
- package/dist/bin/exe-pending-notifications.js +14 -14
- package/dist/bin/exe-pending-reviews.js +14 -14
- package/dist/bin/exe-rename.js +4 -4
- package/dist/bin/exe-review.js +16 -16
- package/dist/bin/exe-search.js +5 -5
- package/dist/bin/exe-session-cleanup.js +18 -18
- package/dist/bin/exe-settings.js +13 -11
- package/dist/bin/exe-start-codex.js +12 -12
- package/dist/bin/exe-start-opencode.js +8 -8
- package/dist/bin/exe-status.js +15 -15
- package/dist/bin/exe-support.js +3 -3
- package/dist/bin/exe-team.js +3 -3
- package/dist/bin/git-sweep.js +15 -15
- package/dist/bin/graph-backfill.js +6 -6
- package/dist/bin/graph-export.js +5 -5
- package/dist/bin/import-history.js +9 -9
- package/dist/bin/install.js +73 -71
- package/dist/bin/intercom-check.js +4 -4
- package/dist/bin/mcp-sessions.js +2 -2
- package/dist/bin/orchestration-metrics.js +4 -4
- package/dist/bin/postgres-agentic-reflection-backfill.js +4 -4
- package/dist/bin/postgres-agentic-semantic-backfill.js +1 -1
- package/dist/bin/registry-proxy.js +1 -1
- package/dist/bin/scan-tasks.js +14 -14
- package/dist/bin/setup.js +1 -1
- package/dist/bin/shard-migrate.js +4 -4
- package/dist/bin/stack-update.js +7 -7
- package/dist/bin/vps-health-gate.js +1 -1
- package/dist/{branch-hygiene-55TKIWAZ.js → branch-hygiene-R5NVTRAY.js} +17 -15
- package/dist/{capability-cards-QKTDMIWO.js → capability-cards-YOKVMMOL.js} +2 -2
- package/dist/{capacity-monitor-4U2Y7CSW.js → capacity-monitor-S54IOWRL.js} +15 -15
- package/dist/{catchup-brief-LFSFSDBA.js → catchup-brief-S35QLMG3.js} +17 -17
- package/dist/{chunk-UDX46CNG.js → chunk-2HZY3ECT.js} +5 -5
- package/dist/{chunk-VINX2BZI.js → chunk-2SG2UGCH.js} +4 -4
- package/dist/{chunk-RGHT5J2L.js → chunk-3OBWSCJN.js} +11 -11
- package/dist/{chunk-RKBVTCPY.js → chunk-4IYSBPX3.js} +1 -1
- package/dist/{chunk-ZA7NMOTA.js → chunk-52KNOQMK.js} +3 -3
- package/dist/{chunk-U6M5C3MB.js → chunk-542EWGY3.js} +7 -7
- package/dist/{chunk-HDZF7FQF.js → chunk-65SVQELL.js} +2 -2
- package/dist/{chunk-FZALT2G7.js → chunk-6HBURYON.js} +1 -1
- package/dist/{chunk-XWH7QGCU.js → chunk-6IRVGOUL.js} +1 -1
- package/dist/{chunk-2OZMCTYQ.js → chunk-6M36JFFD.js} +3 -3
- package/dist/{chunk-SRGBHZ3H.js → chunk-6MRWJMI5.js} +1 -1
- package/dist/{chunk-VI7I6K4G.js → chunk-7EA7LYW4.js} +2 -2
- package/dist/{chunk-FXS5YIK5.js → chunk-7WDXEKUL.js} +3 -3
- package/dist/{chunk-ORU5LDIT.js → chunk-AOO77BDE.js} +1 -1
- package/dist/{chunk-67547XFJ.js → chunk-AVKXCSBI.js} +1 -1
- package/dist/{chunk-75L2YCD4.js → chunk-B2GLEEGY.js} +1 -1
- package/dist/chunk-B75BOKEI.js +193 -0
- package/dist/{chunk-UWT664G5.js → chunk-B76TSEP3.js} +1 -1
- package/dist/{chunk-E5UHM2KN.js → chunk-BPC5LZ6Y.js} +1 -1
- package/dist/{chunk-JT3I3OWU.js → chunk-BU2QQWBQ.js} +1 -1
- package/dist/{chunk-6J5FWFAI.js → chunk-DADMPMYX.js} +1 -1
- package/dist/{chunk-54X2PQBA.js → chunk-DILD54TU.js} +46 -13
- package/dist/{chunk-EOYVD5U3.js → chunk-DZ6OQM67.js} +1 -1
- package/dist/{chunk-5QJFZYDD.js → chunk-EIF2LQHZ.js} +1 -1
- package/dist/{chunk-3CHTRPOU.js → chunk-FNZR3B7U.js} +1 -1
- package/dist/{chunk-AREY6CD2.js → chunk-FUIIVSW6.js} +1 -1
- package/dist/{chunk-VST5V263.js → chunk-GN45PBWI.js} +2 -2
- package/dist/{chunk-QFNRI3PS.js → chunk-H2L4PHGH.js} +2 -2
- package/dist/{chunk-J6REQ7CV.js → chunk-H37HHX3E.js} +9 -9
- package/dist/{chunk-BIM763ML.js → chunk-HEPR6QTL.js} +4 -4
- package/dist/{chunk-UUY3USYA.js → chunk-I3XKO3KQ.js} +1 -1
- package/dist/{chunk-JEDQHPPC.js → chunk-I7Z6KTGF.js} +5 -5
- package/dist/{chunk-QYTUXYAM.js → chunk-ISD7ZD45.js} +140 -140
- package/dist/chunk-JCBKARSK.js +113 -0
- package/dist/{chunk-ESIZMMWY.js → chunk-K5WFKEXQ.js} +67 -78
- package/dist/{chunk-ROHUOHJI.js → chunk-KCC5A7YL.js} +5 -5
- package/dist/{chunk-IJTCNN5I.js → chunk-KMBEL7VB.js} +1 -1
- package/dist/{chunk-VAZHL55P.js → chunk-KTY7I7UH.js} +1 -1
- package/dist/{chunk-6UJ4CX5L.js → chunk-LMZISHSJ.js} +13 -13
- package/dist/{chunk-VAEYG5V5.js → chunk-LTVCRHHD.js} +4 -4
- package/dist/{chunk-6L4LI4VQ.js → chunk-MQRFKSLI.js} +3 -3
- package/dist/{chunk-7QFR2QUD.js → chunk-MW2GJJ53.js} +2 -2
- package/dist/{chunk-XA753DUQ.js → chunk-N5I7RL3I.js} +1 -1
- package/dist/{chunk-YYKY45TM.js → chunk-OFX5B2S7.js} +1 -1
- package/dist/{chunk-H5C4PS64.js → chunk-OJTJYEMX.js} +3 -3
- package/dist/{chunk-5EP4TCZ2.js → chunk-PAEXYFMY.js} +1 -1
- package/dist/{chunk-X3VIRILN.js → chunk-PLRIJALF.js} +160 -34
- package/dist/{chunk-WI3T3GTH.js → chunk-Q7L6G6KV.js} +2 -2
- package/dist/{chunk-SDZ654BU.js → chunk-QBTWXDFK.js} +9 -9
- package/dist/{chunk-ZHKMRKH3.js → chunk-QFPTDSY2.js} +1 -1
- package/dist/{chunk-VXSORLMJ.js → chunk-QXSBB26A.js} +1 -1
- package/dist/{chunk-XMVEGUPC.js → chunk-QZLIZAS7.js} +2 -2
- package/dist/{chunk-QLZ3HCNN.js → chunk-R44Z32O2.js} +3 -3
- package/dist/{chunk-I33GPQUB.js → chunk-RDTZTLVQ.js} +20 -11
- package/dist/{chunk-45AA4HOH.js → chunk-RLRT2BVM.js} +1 -1
- package/dist/chunk-RNAYCUNM.js +271 -0
- package/dist/{chunk-FAVEOPZD.js → chunk-RRWDYOQS.js} +1 -1
- package/dist/{chunk-D2527Q5Y.js → chunk-T4KZ2Z2N.js} +3 -3
- package/dist/{chunk-JKSK4VFX.js → chunk-TLYAEISW.js} +2 -2
- package/dist/{chunk-3HMHSTHQ.js → chunk-UIV2WPBT.js} +1 -13
- package/dist/{chunk-X5EGTW2P.js → chunk-UPWE5NOG.js} +2 -2
- package/dist/{chunk-OEEQGXCG.js → chunk-UXBD22CD.js} +1 -1
- package/dist/{chunk-5ZG2JMZH.js → chunk-VJHUVFIW.js} +3 -3
- package/dist/{chunk-AQGBOSA4.js → chunk-WYLV4S6A.js} +3 -3
- package/dist/{chunk-QVM5KATG.js → chunk-X425OEYF.js} +4 -4
- package/dist/{chunk-U7N2GEBI.js → chunk-X7H3HMFH.js} +3 -3
- package/dist/{chunk-DTFFLCFM.js → chunk-XACL67CS.js} +1 -1
- package/dist/{chunk-ZWIYJV2F.js → chunk-XCTGRD4S.js} +175 -11
- package/dist/{chunk-QQCZLNUC.js → chunk-XJI7Z6LZ.js} +1 -1
- package/dist/{chunk-SPCO7SNH.js → chunk-XUKPALWT.js} +3 -3
- package/dist/{chunk-7ODTT6WK.js → chunk-XWHE4LZK.js} +1 -1
- package/dist/{chunk-LK5RBBMQ.js → chunk-YE7NH53A.js} +1 -1
- package/dist/{chunk-P3PGU2OC.js → chunk-ZIVEA3NB.js} +1 -1
- package/dist/{cleanup-graph-garbage-OP7NAXDZ.js → cleanup-graph-garbage-KUABW6LS.js} +6 -6
- package/dist/{co-activation-EVNRLGPH.js → co-activation-XMPHKGHR.js} +2 -2
- package/dist/{co-occurrence-FEU6RXQI.js → co-occurrence-SHKSJ6CV.js} +4 -4
- package/dist/{conversation-entity-extractor-FPAMTL3C.js → conversation-entity-extractor-D3EFTLT4.js} +2 -2
- package/dist/{crdt-sync-YI5LFAUY.js → crdt-sync-UJELKSNX.js} +1 -1
- package/dist/{crm-webhook-REDANIV7.js → crm-webhook-HHNBS7LY.js} +2 -2
- package/dist/{cto-delegation-gate-HN3J76UI.js → cto-delegation-gate-DXNF5HVW.js} +13 -13
- package/dist/{daemon-orchestration-KIAYDBWN.js → daemon-orchestration-7QB6QOXT.js} +29 -17
- package/dist/{db-backup-UBKQZVEI.js → db-backup-DLD4QZBO.js} +1 -1
- package/dist/{doc-graph-extractor-BPXVTZ4L.js → doc-graph-extractor-3TRLGD7M.js} +4 -4
- package/dist/{documents-J4MQBIYZ.js → documents-FHIBU7KJ.js} +5 -5
- package/dist/{dreaming-RCAAKENX.js → dreaming-OMFUEUCQ.js} +14 -14
- package/dist/{exe-drift-PVUYHYKG.js → exe-drift-KY2KHZEL.js} +3 -3
- package/dist/{exe-export-Z626JBSJ.js → exe-export-SP6G3QF6.js} +6 -6
- package/dist/{exe-import-47MHFJUB.js → exe-import-KJU7FBVQ.js} +6 -6
- package/dist/{exe-key-RLMYYUTW.js → exe-key-RWGMIHK7.js} +71 -69
- package/dist/{exe-snapshot-VHSZP5VK.js → exe-snapshot-ZNPGUKRZ.js} +17 -17
- package/dist/{fast-db-init-KIS7XQO5.js → fast-db-init-QQB6IVWV.js} +1 -1
- package/dist/{founder-context-NSXLHXJ4.js → founder-context-PQR3BUS7.js} +2 -2
- package/dist/gateway/index.js +11 -11
- package/dist/{git-staleness-7N4H6ZE3.js → git-staleness-UGB5J3K7.js} +2 -2
- package/dist/{global-procedures-3PJSNL4Q.js → global-procedures-R7KRREEK.js} +3 -3
- package/dist/{graph-auto-extract-S5TSHNFY.js → graph-auto-extract-LKIQ57PL.js} +4 -4
- package/dist/{graph-rag-WAK2BRJH.js → graph-rag-JZZAB7PC.js} +2 -2
- package/dist/hooks/bug-report-worker.js +16 -16
- package/dist/hooks/codex-stop-task-finalizer.js +16 -16
- package/dist/hooks/commit-complete.js +16 -16
- package/dist/hooks/error-recall.js +6 -6
- package/dist/hooks/exe-heartbeat-hook.js +3 -3
- package/dist/hooks/ingest.js +6 -6
- package/dist/hooks/instructions-loaded.js +4 -4
- package/dist/hooks/manifest.json +19 -19
- package/dist/hooks/notification.js +4 -4
- package/dist/hooks/post-compact.js +15 -15
- package/dist/hooks/post-tool-combined.js +7 -7
- package/dist/hooks/pre-compact.js +16 -16
- package/dist/hooks/pre-tool-use.js +19 -19
- package/dist/hooks/prompt-submit.js +30 -30
- package/dist/hooks/session-end.js +20 -20
- package/dist/hooks/session-start.js +12 -12
- package/dist/hooks/stop.js +19 -19
- package/dist/hooks/subagent-stop.js +15 -15
- package/dist/hooks/summary-worker.js +19 -19
- package/dist/index.js +25 -25
- package/dist/{installer-FQKJ6ULZ.js → installer-MNPXDLGG.js} +6 -6
- package/dist/{installer-TYK3XXK7.js → installer-MZWWBXM6.js} +9 -9
- package/dist/{installer-3X5QNMTD.js → installer-SB2N5NKH.js} +9 -9
- package/dist/{intercom-queue-XJ3RTJ2C.js → intercom-queue-VU2G6F5R.js} +15 -13
- package/dist/lib/agent-config.js +1 -1
- package/dist/lib/cloud-sync.js +12 -10
- package/dist/lib/consolidation.js +7 -7
- package/dist/lib/crypto.js +5 -1
- package/dist/lib/database.js +2 -2
- package/dist/lib/db.js +2 -2
- package/dist/lib/device-registry.js +1 -1
- package/dist/lib/employee-templates.js +4 -4
- package/dist/lib/employees.js +2 -2
- package/dist/lib/exe-daemon.js +330 -103
- package/dist/lib/hybrid-search.js +5 -5
- package/dist/lib/identity.js +2 -2
- package/dist/lib/license.js +2 -2
- package/dist/lib/messaging.js +14 -14
- package/dist/lib/registry-proxy.js +1 -1
- package/dist/lib/reminders.js +3 -3
- package/dist/lib/schedules.js +5 -5
- package/dist/lib/session-registry.js +4 -4
- package/dist/lib/skill-learning.js +6 -6
- package/dist/lib/store.js +4 -4
- package/dist/lib/task-router.js +3 -3
- package/dist/lib/tasks.js +15 -15
- package/dist/lib/tmux-routing.js +13 -13
- package/dist/lib/token-spend.js +3 -3
- package/dist/{license-gate-B4HB3ZDR.js → license-gate-BYDMFMFT.js} +3 -3
- package/dist/{license-sync-LSKU2X6F.js → license-sync-N3RNYVP2.js} +2 -2
- package/dist/mcp/register-tools.js +70 -68
- package/dist/mcp/server.js +73 -71
- package/dist/mcp/tools/complete-reminder.js +4 -4
- package/dist/mcp/tools/create-reminder.js +4 -4
- package/dist/mcp/tools/create-task.js +17 -17
- package/dist/mcp/tools/deactivate-behavior.js +7 -7
- package/dist/mcp/tools/list-reminders.js +4 -4
- package/dist/mcp/tools/list-tasks.js +17 -17
- package/dist/mcp/tools/send-message.js +16 -16
- package/dist/mcp/tools/update-task.js +16 -16
- package/dist/{mcp-http-config-D4EBSK3R.js → mcp-http-config-EMAVS2JI.js} +3 -3
- package/dist/{memory-cards-E5O4IPYV.js → memory-cards-TQRLZI4D.js} +4 -4
- package/dist/{memory-graph-extractor-3NQUGAA5.js → memory-graph-extractor-IWGNVAFU.js} +5 -5
- package/dist/{memory-poisoning-defense-DPCHNN7S.js → memory-poisoning-defense-T4ITBGSG.js} +2 -2
- package/dist/{memory-pressure-watchdog-4RVYB2JC.js → memory-pressure-watchdog-RRIAXPXQ.js} +14 -14
- package/dist/{memory-reflection-EGLE4DZ5.js → memory-reflection-6N4J2FL7.js} +2 -2
- package/dist/monitor-grants-RZOVSYVO.js +27 -0
- package/dist/monitor-identity-MOXISYNG.js +34 -0
- package/dist/{notifications-LDDVXMH7.js → notifications-KONB3C62.js} +13 -13
- package/dist/{orchestration-events-2QYYCFSI.js → orchestration-events-5SIJOE4H.js} +3 -3
- package/dist/{orchestrator-UFYOUXGZ.js → orchestrator-DUUX7FQV.js} +15 -15
- package/dist/{pipeline-router-PLYAEQN7.js → pipeline-router-O6HU7DKH.js} +3 -3
- package/dist/{plan-limits-ETP2IFM4.js → plan-limits-GRNBOBB3.js} +5 -5
- package/dist/{projection-worker-N4KVTVZE.js → projection-worker-ZVOFHTXT.js} +2 -2
- package/dist/{prospective-memory-JPTTRFYJ.js → prospective-memory-W6S67LZZ.js} +2 -2
- package/dist/{reranker-267LQRRT.js → reranker-6UQSZVV2.js} +1 -1
- package/dist/{retrieval-health-GFGXNPSN.js → retrieval-health-TWHKYCRK.js} +1 -1
- package/dist/{review-polling-4IFCCPGQ.js → review-polling-PCMD5BFN.js} +14 -14
- package/dist/runtime/index.js +21 -21
- package/dist/{session-events-CVNW7DBW.js → session-events-3LCVQEL7.js} +14 -14
- package/dist/{session-kill-telemetry-56HNNXLH.js → session-kill-telemetry-CZSPN5V6.js} +14 -14
- package/dist/{session-scope-RMKL6YLU.js → session-scope-CFHVSVAQ.js} +13 -13
- package/dist/{setup-wizard-L6JMCB33.js → setup-wizard-CJZMM43G.js} +1 -1
- package/dist/{skill-refinement-FA5DM3NA.js → skill-refinement-74T6VDFM.js} +3 -3
- package/dist/{stack-release-3AF7TQ5N.js → stack-release-XXMV7SPX.js} +40 -3
- package/dist/{stack-update-2TGPFH6E.js → stack-update-E2TKHHSQ.js} +3 -3
- package/dist/{steward-gate-L2FBY7U4.js → steward-gate-WT7WXQIE.js} +3 -3
- package/dist/{task-enforcement-XO6CYQVG.js → task-enforcement-VI7L43DC.js} +14 -14
- package/dist/{task-scope-7BWIG4G3.js → task-scope-CQEG5SSJ.js} +13 -13
- package/dist/{tasks-crud-IW3ZBFHL.js → tasks-crud-UGK5A25L.js} +13 -13
- package/dist/{tasks-notify-MOSUAR3U.js → tasks-notify-SMLDFBWM.js} +14 -14
- package/dist/{tasks-review-S2IYB6AA.js → tasks-review-JKBRACII.js} +13 -13
- package/dist/{telemetry-upload-IG4AGZFK.js → telemetry-upload-7LBYGPCB.js} +7 -7
- package/dist/{token-budget-EVNOJQ7H.js → token-budget-QBRJR4M5.js} +3 -3
- package/dist/{tool-telemetry-UPADF5DF.js → tool-telemetry-ULIDUK3P.js} +1 -1
- package/dist/tui/App.js +21 -21
- package/dist/{tui-data-KCMCI6Z5.js → tui-data-NPTGKT37.js} +13 -13
- package/dist/{worker-gate-YY7OZOJH.js → worker-gate-MXUQUG4M.js} +1 -1
- package/dist/{workflow-engine-TZW4ZQV3.js → workflow-engine-EWCOLD47.js} +2 -2
- package/dist/{worktree-WF7X43XI.js → worktree-GVF2I5FP.js} +4 -4
- package/dist/{worktree-sweep-QOAXY6CT.js → worktree-sweep-ZAG3V24E.js} +5 -5
- package/package.json +4 -3
- package/release-notes.json +29 -20
- package/dist/chunk-LO6L5ADL.js +0 -76
- package/dist/{chunk-XWIVAMVX.js → chunk-5Z5NATNS.js} +0 -0
- package/dist/{chunk-7UMCQQWS.js → chunk-A4DVMPYB.js} +3 -3
- /package/dist/{chunk-INT5PHNK.js → chunk-ATOU6CYR.js} +0 -0
- /package/dist/{chunk-O4522BYB.js → chunk-D3QASX2W.js} +0 -0
- /package/dist/{chunk-66RCRDIF.js → chunk-HHIBOU3P.js} +0 -0
- /package/dist/{chunk-TXUSQZLH.js → chunk-IYB2NIW3.js} +0 -0
- /package/dist/{chunk-S4Y5YXPX.js → chunk-KTPG4XKI.js} +0 -0
- /package/dist/{chunk-OHSJOKKW.js → chunk-NQBRGXYR.js} +0 -0
- /package/dist/{chunk-JMGYZLJX.js → chunk-QLFRCA6I.js} +0 -0
- /package/dist/{chunk-6A5DGGRT.js → chunk-TNJRWUCE.js} +0 -0
- /package/dist/{chunk-OMJH4DQ7.js → chunk-UFAXZ2PY.js} +0 -0
- /package/dist/{chunk-NF2OBCEI.js → chunk-UNVHIH7N.js} +0 -0
- /package/dist/{chunk-GFWND35H.js → chunk-Z7OZP3ET.js} +0 -0
- /package/dist/{core-memory-HCJMR32C.js → core-memory-VO5ZIBKH.js} +0 -0
- /package/dist/{oauth-server-YVREFZMD.js → oauth-server-ROQFOEMM.js} +0 -0
- /package/dist/{project-boot-OZA6KYFP.js → project-boot-SD7GM24K.js} +0 -0
- /package/dist/{wiki-acl-XWSASBWZ.js → wiki-acl-JA5UCQZ4.js} +0 -0
package/dist/lib/exe-daemon.js
CHANGED
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
findScopedDuplicate,
|
|
22
22
|
governMemoryRecord,
|
|
23
23
|
schedulePostWriteMemoryHygiene
|
|
24
|
-
} from "../chunk-
|
|
24
|
+
} from "../chunk-HHIBOU3P.js";
|
|
25
25
|
import "../chunk-Y25OJWOQ.js";
|
|
26
26
|
import {
|
|
27
27
|
attributeSignalSource,
|
|
@@ -80,7 +80,7 @@ import net from "net";
|
|
|
80
80
|
import v8 from "v8";
|
|
81
81
|
import { createServer as createHttpServer, request as httpRequest } from "http";
|
|
82
82
|
import { randomUUID } from "crypto";
|
|
83
|
-
import { writeFileSync as writeFileSync3, unlinkSync as unlinkSync2, mkdirSync as mkdirSync2, existsSync as
|
|
83
|
+
import { writeFileSync as writeFileSync3, unlinkSync as unlinkSync2, mkdirSync as mkdirSync2, existsSync as existsSync4, readFileSync as readFileSync4, chmodSync, readdirSync, renameSync, statSync } from "fs";
|
|
84
84
|
import { writeFile } from "fs/promises";
|
|
85
85
|
import { execSync as execSyncNode, execFile as execFileNode } from "child_process";
|
|
86
86
|
import { promisify } from "util";
|
|
@@ -467,26 +467,47 @@ function isHostCpuStarved(load1m, cpuCount, ratio) {
|
|
|
467
467
|
}
|
|
468
468
|
function decideDaemonSelfHeal(s) {
|
|
469
469
|
const alive = s.processAlive ?? true;
|
|
470
|
+
const resetSelfInflicted = { selfInflictedStreakAfter: 0, selfInflictedSuppressedMsAfter: 0 };
|
|
470
471
|
if (!alive) {
|
|
471
|
-
return { restart: true, reason: "process_dead", consecutiveSevereAfter: 0 };
|
|
472
|
+
return { restart: true, reason: "process_dead", consecutiveSevereAfter: 0, ...resetSelfInflicted };
|
|
472
473
|
}
|
|
473
474
|
if (typeof s.rssBytes === "number" && Number.isFinite(s.rssBytes) && typeof s.rssCapBytes === "number" && Number.isFinite(s.rssCapBytes) && s.rssCapBytes > 0 && s.rssBytes > s.rssCapBytes) {
|
|
474
|
-
return { restart: true, reason: "rss_over_cap", consecutiveSevereAfter: 0 };
|
|
475
|
+
return { restart: true, reason: "rss_over_cap", consecutiveSevereAfter: 0, ...resetSelfInflicted };
|
|
475
476
|
}
|
|
476
477
|
if (isHostCpuStarved(s.load1m, s.cpuCount, s.starvationRatio)) {
|
|
477
|
-
return { restart: false, reason: "starved_backoff", consecutiveSevereAfter: 0 };
|
|
478
|
+
return { restart: false, reason: "starved_backoff", consecutiveSevereAfter: 0, ...resetSelfInflicted };
|
|
479
|
+
}
|
|
480
|
+
if (s.catchUpActive) {
|
|
481
|
+
return { restart: false, reason: "catchup_backoff", consecutiveSevereAfter: 0, ...resetSelfInflicted };
|
|
482
|
+
}
|
|
483
|
+
const selfCpuRatio = Number.isFinite(s.selfCpuBusyRatio) ? s.selfCpuBusyRatio : 0.5;
|
|
484
|
+
if (s.lagMs > s.severeThresholdMs && typeof s.selfCpuBusyFraction === "number" && Number.isFinite(s.selfCpuBusyFraction) && s.selfCpuBusyFraction >= selfCpuRatio) {
|
|
485
|
+
const streakLimit = typeof s.selfInflictedLimit === "number" && s.selfInflictedLimit > 0 ? s.selfInflictedLimit : 5;
|
|
486
|
+
const suppressCapMs = typeof s.selfInflictedSuppressCapMs === "number" && s.selfInflictedSuppressCapMs > 0 ? s.selfInflictedSuppressCapMs : 15e4;
|
|
487
|
+
const streakNext = (s.selfInflictedStreak ?? 0) + 1;
|
|
488
|
+
const suppressedNext = (s.selfInflictedSuppressedMs ?? 0) + s.lagMs;
|
|
489
|
+
if (streakNext >= streakLimit || suppressedNext > suppressCapMs) {
|
|
490
|
+
return { restart: true, reason: "single_block", consecutiveSevereAfter: 0, ...resetSelfInflicted };
|
|
491
|
+
}
|
|
492
|
+
return {
|
|
493
|
+
restart: false,
|
|
494
|
+
reason: "self_inflicted_backoff",
|
|
495
|
+
consecutiveSevereAfter: 0,
|
|
496
|
+
selfInflictedStreakAfter: streakNext,
|
|
497
|
+
selfInflictedSuppressedMsAfter: suppressedNext
|
|
498
|
+
};
|
|
478
499
|
}
|
|
479
500
|
if (s.lagMs > s.singleBlockMs) {
|
|
480
|
-
return { restart: true, reason: "single_block", consecutiveSevereAfter: 0 };
|
|
501
|
+
return { restart: true, reason: "single_block", consecutiveSevereAfter: 0, ...resetSelfInflicted };
|
|
481
502
|
}
|
|
482
503
|
if (s.lagMs > s.severeThresholdMs) {
|
|
483
504
|
const next = s.consecutiveSevere + 1;
|
|
484
505
|
if (next >= s.consecutiveLimit) {
|
|
485
|
-
return { restart: true, reason: "consecutive_blocks", consecutiveSevereAfter: next };
|
|
506
|
+
return { restart: true, reason: "consecutive_blocks", consecutiveSevereAfter: next, ...resetSelfInflicted };
|
|
486
507
|
}
|
|
487
|
-
return { restart: false, reason: "counting", consecutiveSevereAfter: next };
|
|
508
|
+
return { restart: false, reason: "counting", consecutiveSevereAfter: next, ...resetSelfInflicted };
|
|
488
509
|
}
|
|
489
|
-
return { restart: false, reason: "not_critical", consecutiveSevereAfter: 0 };
|
|
510
|
+
return { restart: false, reason: "not_critical", consecutiveSevereAfter: 0, ...resetSelfInflicted };
|
|
490
511
|
}
|
|
491
512
|
function decideOrchestrationTickSkip(s) {
|
|
492
513
|
if (isHostCpuStarved(s.load1m, s.cpuCount, s.starvationRatio)) {
|
|
@@ -508,7 +529,61 @@ function decideBootBackoff(s) {
|
|
|
508
529
|
return { wait: true, delayMs, reason: "backoff" };
|
|
509
530
|
}
|
|
510
531
|
|
|
532
|
+
// src/lib/daemon-env.ts
|
|
533
|
+
import { readFileSync as readFileSync3, existsSync as existsSync3 } from "fs";
|
|
534
|
+
import { homedir } from "os";
|
|
535
|
+
import { join } from "path";
|
|
536
|
+
function daemonEnvPath() {
|
|
537
|
+
return join(homedir(), ".exe-os", "daemon.env");
|
|
538
|
+
}
|
|
539
|
+
function parseDaemonEnv(contents) {
|
|
540
|
+
const out = {};
|
|
541
|
+
for (const rawLine of contents.split(/\r?\n/)) {
|
|
542
|
+
const line = rawLine.trim();
|
|
543
|
+
if (line === "" || line.startsWith("#")) continue;
|
|
544
|
+
const eq = line.indexOf("=");
|
|
545
|
+
if (eq <= 0) continue;
|
|
546
|
+
const key = line.slice(0, eq).trim();
|
|
547
|
+
if (key === "") continue;
|
|
548
|
+
let value = line.slice(eq + 1).trim();
|
|
549
|
+
if (value.length >= 2) {
|
|
550
|
+
const first = value[0];
|
|
551
|
+
const last = value[value.length - 1];
|
|
552
|
+
if (first === '"' && last === '"' || first === "'" && last === "'") {
|
|
553
|
+
value = value.slice(1, -1);
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
out[key] = value;
|
|
557
|
+
}
|
|
558
|
+
return out;
|
|
559
|
+
}
|
|
560
|
+
function applyDaemonEnv(parsed, env = process.env) {
|
|
561
|
+
let applied = 0;
|
|
562
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
563
|
+
if (env[key] !== void 0) continue;
|
|
564
|
+
env[key] = value;
|
|
565
|
+
applied += 1;
|
|
566
|
+
}
|
|
567
|
+
return applied;
|
|
568
|
+
}
|
|
569
|
+
function loadDaemonEnv(path4 = daemonEnvPath()) {
|
|
570
|
+
let contents;
|
|
571
|
+
try {
|
|
572
|
+
if (!existsSync3(path4)) return 0;
|
|
573
|
+
contents = readFileSync3(path4, "utf8");
|
|
574
|
+
} catch {
|
|
575
|
+
return 0;
|
|
576
|
+
}
|
|
577
|
+
const applied = applyDaemonEnv(parseDaemonEnv(contents), process.env);
|
|
578
|
+
if (applied > 0) {
|
|
579
|
+
process.stderr.write(`[daemon] loaded ${applied} vars from daemon.env
|
|
580
|
+
`);
|
|
581
|
+
}
|
|
582
|
+
return applied;
|
|
583
|
+
}
|
|
584
|
+
|
|
511
585
|
// src/lib/exe-daemon.ts
|
|
586
|
+
loadDaemonEnv();
|
|
512
587
|
function stabilizeDaemonCwd() {
|
|
513
588
|
try {
|
|
514
589
|
process.cwd();
|
|
@@ -516,7 +591,7 @@ function stabilizeDaemonCwd() {
|
|
|
516
591
|
} catch (err) {
|
|
517
592
|
const moduleDir = path3.dirname(fileURLToPath(import.meta.url));
|
|
518
593
|
const packageRoot = path3.resolve(moduleDir, "../..");
|
|
519
|
-
const fallback =
|
|
594
|
+
const fallback = existsSync4(path3.join(packageRoot, "package.json")) ? packageRoot : os2.homedir();
|
|
520
595
|
try {
|
|
521
596
|
process.chdir(fallback);
|
|
522
597
|
process.stderr.write(
|
|
@@ -541,7 +616,7 @@ var REVIEW_POLL_INTERVAL_MS = 60 * 1e3;
|
|
|
541
616
|
var DAEMON_TOKEN_ENV = "EXE_DAEMON_TOKEN";
|
|
542
617
|
var PACKAGE_VERSION = (() => {
|
|
543
618
|
try {
|
|
544
|
-
const pkg = JSON.parse(
|
|
619
|
+
const pkg = JSON.parse(readFileSync4(new URL("../../package.json", import.meta.url), "utf8"));
|
|
545
620
|
return typeof pkg.version === "string" ? pkg.version : "unknown";
|
|
546
621
|
} catch {
|
|
547
622
|
return "unknown";
|
|
@@ -842,7 +917,41 @@ var _idleTimer = null;
|
|
|
842
917
|
var _requestsServed = 0;
|
|
843
918
|
var _droppedRequests = 0;
|
|
844
919
|
var _startedAt2 = Date.now();
|
|
920
|
+
var POST_RESTART_DESTRUCTIVE_GRACE_MS = Number(process.env.EXE_POST_RESTART_DESTRUCTIVE_GRACE_MS) || 10 * 60 * 1e3;
|
|
921
|
+
var SELF_HEAL_RESTART_COOLDOWN_MS = Number(process.env.EXE_SELF_HEAL_RESTART_COOLDOWN_MS) || 30 * 60 * 1e3;
|
|
922
|
+
var _lastSelfHealShutdownAtMs = 0;
|
|
923
|
+
var _postRestartGraceLogged = /* @__PURE__ */ new Set();
|
|
845
924
|
process.env.EXE_DAEMON_STARTED_AT_ISO ??= new Date(_startedAt2).toISOString();
|
|
925
|
+
var BOOT_CATCHUP_GRACE_MS = Number(process.env.EXE_BOOT_CATCHUP_GRACE_MS) || 3 * 60 * 1e3;
|
|
926
|
+
var _bootCatchUpUntilMs = _startedAt2 + BOOT_CATCHUP_GRACE_MS;
|
|
927
|
+
function inBootCatchUpGrace() {
|
|
928
|
+
return Date.now() < _bootCatchUpUntilMs;
|
|
929
|
+
}
|
|
930
|
+
function extendBootCatchUp(ms) {
|
|
931
|
+
_bootCatchUpUntilMs = Math.max(_bootCatchUpUntilMs, Date.now() + ms);
|
|
932
|
+
}
|
|
933
|
+
function postRestartGraceRemainingMs() {
|
|
934
|
+
return Math.max(0, POST_RESTART_DESTRUCTIVE_GRACE_MS - (Date.now() - _startedAt2));
|
|
935
|
+
}
|
|
936
|
+
function inPostRestartDestructiveGrace(owner) {
|
|
937
|
+
const remaining = postRestartGraceRemainingMs();
|
|
938
|
+
if (remaining <= 0) return false;
|
|
939
|
+
if (!_postRestartGraceLogged.has(owner)) {
|
|
940
|
+
_postRestartGraceLogged.add(owner);
|
|
941
|
+
process.stderr.write(`[exed] ${owner}: destructive action suppressed during post-restart grace (${Math.ceil(remaining / 1e3)}s remaining)
|
|
942
|
+
`);
|
|
943
|
+
logDaemonHealth({
|
|
944
|
+
event: "post_restart_destructive_grace",
|
|
945
|
+
pid: process.pid,
|
|
946
|
+
message: `${owner}: destructive action suppressed during post-restart grace`,
|
|
947
|
+
data: { owner, remainingMs: remaining }
|
|
948
|
+
});
|
|
949
|
+
}
|
|
950
|
+
return true;
|
|
951
|
+
}
|
|
952
|
+
function selfHealRestartOnCooldown() {
|
|
953
|
+
return _lastSelfHealShutdownAtMs > 0 && Date.now() - _lastSelfHealShutdownAtMs < SELF_HEAL_RESTART_COOLDOWN_MS;
|
|
954
|
+
}
|
|
846
955
|
var _bootPhase = "pre_init";
|
|
847
956
|
function setBootPhase(phase) {
|
|
848
957
|
_bootPhase = phase;
|
|
@@ -955,7 +1064,7 @@ function recordDaemonCrash() {
|
|
|
955
1064
|
const now = Date.now();
|
|
956
1065
|
let counter = { crashes: [] };
|
|
957
1066
|
try {
|
|
958
|
-
counter = JSON.parse(
|
|
1067
|
+
counter = JSON.parse(readFileSync4(CRASH_LOOP_COUNTER_PATH, "utf8"));
|
|
959
1068
|
} catch {
|
|
960
1069
|
}
|
|
961
1070
|
counter.crashes = counter.crashes.filter((t) => now - t < CRASH_LOOP_WINDOW_MS);
|
|
@@ -983,7 +1092,7 @@ function recordDaemonCrash() {
|
|
|
983
1092
|
}
|
|
984
1093
|
function isCrashLoopBreakerActive() {
|
|
985
1094
|
try {
|
|
986
|
-
if (!
|
|
1095
|
+
if (!existsSync4(CRASH_LOOP_BREAKER_PATH)) return false;
|
|
987
1096
|
const ageMs = Date.now() - statSync(CRASH_LOOP_BREAKER_PATH).mtimeMs;
|
|
988
1097
|
if (ageMs > CRASH_LOOP_BREAKER_TTL_MS) {
|
|
989
1098
|
unlinkSync2(CRASH_LOOP_BREAKER_PATH);
|
|
@@ -1024,7 +1133,7 @@ function currentEmbedConfigFingerprint() {
|
|
|
1024
1133
|
}
|
|
1025
1134
|
function clearStaleOomMarker() {
|
|
1026
1135
|
try {
|
|
1027
|
-
if (!
|
|
1136
|
+
if (!existsSync4(OOM_MARKER_PATH)) return false;
|
|
1028
1137
|
const ageMs = Date.now() - statSync(OOM_MARKER_PATH).mtimeMs;
|
|
1029
1138
|
if (ageMs < OOM_MARKER_TTL_MS) return false;
|
|
1030
1139
|
unlinkSync2(OOM_MARKER_PATH);
|
|
@@ -1062,8 +1171,8 @@ function checkLaunchdPlistHealth() {
|
|
|
1062
1171
|
try {
|
|
1063
1172
|
if (process.platform !== "darwin") return;
|
|
1064
1173
|
const plistPath = path3.join(os2.homedir(), "Library", "LaunchAgents", "com.askexe.exed.plist");
|
|
1065
|
-
if (!
|
|
1066
|
-
const plist =
|
|
1174
|
+
if (!existsSync4(plistPath)) return;
|
|
1175
|
+
const plist = readFileSync4(plistPath, "utf8");
|
|
1067
1176
|
const expectedHeap = computeDaemonHeapCapMb();
|
|
1068
1177
|
const heapMatch = plist.match(/--max-old-space-size=(\d+)/);
|
|
1069
1178
|
const heap = heapMatch?.[1] ? parseInt(heapMatch[1], 10) : null;
|
|
@@ -1134,7 +1243,7 @@ async function loadModel() {
|
|
|
1134
1243
|
} catch {
|
|
1135
1244
|
}
|
|
1136
1245
|
const modelPath = path3.join(MODELS_DIR, MODEL_FILE);
|
|
1137
|
-
if (!
|
|
1246
|
+
if (!existsSync4(modelPath)) {
|
|
1138
1247
|
process.stderr.write(`[exed] No model at ${modelPath} \u2014 running without embeddings (VPS mode).
|
|
1139
1248
|
`);
|
|
1140
1249
|
_embeddingsDisabledByDesign = true;
|
|
@@ -1145,19 +1254,19 @@ async function loadModel() {
|
|
|
1145
1254
|
process.stderr.write(`[exed] Embedding config changed \u2014 cleared stale embed-worker backoff (one prompt retry under new config).
|
|
1146
1255
|
`);
|
|
1147
1256
|
try {
|
|
1148
|
-
if (
|
|
1257
|
+
if (existsSync4(EMBED_TIMEOUT_MARKER_PATH)) unlinkSync2(EMBED_TIMEOUT_MARKER_PATH);
|
|
1149
1258
|
} catch {
|
|
1150
1259
|
}
|
|
1151
1260
|
_embedConsecutiveTimeouts = 0;
|
|
1152
1261
|
}
|
|
1153
1262
|
clearStaleOomMarker();
|
|
1154
|
-
if (
|
|
1263
|
+
if (existsSync4(OOM_MARKER_PATH)) {
|
|
1155
1264
|
process.stderr.write(`[exed] Skipping embeddings \u2014 OOM marker exists. Delete ${OOM_MARKER_PATH} to retry.
|
|
1156
1265
|
`);
|
|
1157
1266
|
_embeddingsDisabledByDesign = true;
|
|
1158
1267
|
return;
|
|
1159
1268
|
}
|
|
1160
|
-
if (
|
|
1269
|
+
if (existsSync4(EMBED_TIMEOUT_MARKER_PATH)) {
|
|
1161
1270
|
process.stderr.write(`[exed] Skipping embeddings \u2014 inference-timeout marker exists (local embeddings non-functional on this host). Set EXE_EMBEDDINGS=0 or delete ${EMBED_TIMEOUT_MARKER_PATH} to retry.
|
|
1162
1271
|
`);
|
|
1163
1272
|
_embeddingsDisabledByDesign = true;
|
|
@@ -1212,7 +1321,7 @@ async function loadModel() {
|
|
|
1212
1321
|
process.stderr.write("[exed] Spawning embed worker process...\n");
|
|
1213
1322
|
try {
|
|
1214
1323
|
const workerPath = path3.join(path3.dirname(new URL(import.meta.url).pathname), "embed-worker.js");
|
|
1215
|
-
if (!
|
|
1324
|
+
if (!existsSync4(workerPath)) {
|
|
1216
1325
|
process.stderr.write(`[exed] Embed worker not found at ${workerPath} \u2014 running without embeddings.
|
|
1217
1326
|
`);
|
|
1218
1327
|
return;
|
|
@@ -1319,7 +1428,7 @@ async function loadModel() {
|
|
|
1319
1428
|
void (async () => {
|
|
1320
1429
|
try {
|
|
1321
1430
|
if (_storeInitialized) {
|
|
1322
|
-
const { writeNotification } = await import("../notifications-
|
|
1431
|
+
const { writeNotification } = await import("../notifications-KONB3C62.js");
|
|
1323
1432
|
await writeNotification({
|
|
1324
1433
|
agentId: "exe",
|
|
1325
1434
|
agentRole: "system",
|
|
@@ -1435,7 +1544,7 @@ function disableEmbeddingsForInferenceTimeouts() {
|
|
|
1435
1544
|
void (async () => {
|
|
1436
1545
|
try {
|
|
1437
1546
|
if (_storeInitialized) {
|
|
1438
|
-
const { writeNotification } = await import("../notifications-
|
|
1547
|
+
const { writeNotification } = await import("../notifications-KONB3C62.js");
|
|
1439
1548
|
await writeNotification({
|
|
1440
1549
|
agentId: "exe",
|
|
1441
1550
|
agentRole: "system",
|
|
@@ -1646,7 +1755,7 @@ async function shutdown(exitCode = 0) {
|
|
|
1646
1755
|
}
|
|
1647
1756
|
}
|
|
1648
1757
|
try {
|
|
1649
|
-
const { createBackupAsync, enforceRetention, hasRecentBackup } = await import("../db-backup-
|
|
1758
|
+
const { createBackupAsync, enforceRetention, hasRecentBackup } = await import("../db-backup-DLD4QZBO.js");
|
|
1650
1759
|
const PRE_RESTART_DEDUP_MS = 2 * 60 * 1e3;
|
|
1651
1760
|
if (hasRecentBackup("pre-restart", PRE_RESTART_DEDUP_MS)) {
|
|
1652
1761
|
const deleted = enforceRetention("pre-restart");
|
|
@@ -1677,7 +1786,7 @@ async function shutdown(exitCode = 0) {
|
|
|
1677
1786
|
`);
|
|
1678
1787
|
}
|
|
1679
1788
|
try {
|
|
1680
|
-
const { stopProjectionWorker } = await import("../projection-worker-
|
|
1789
|
+
const { stopProjectionWorker } = await import("../projection-worker-ZVOFHTXT.js");
|
|
1681
1790
|
stopProjectionWorker();
|
|
1682
1791
|
} catch {
|
|
1683
1792
|
}
|
|
@@ -1743,7 +1852,7 @@ async function handleHealthCheck(socket, requestId) {
|
|
|
1743
1852
|
let pipelineStatus = "unknown";
|
|
1744
1853
|
if (dbConnected) {
|
|
1745
1854
|
try {
|
|
1746
|
-
await import("../pipeline-router-
|
|
1855
|
+
await import("../pipeline-router-O6HU7DKH.js");
|
|
1747
1856
|
pipelineStatus = "ok";
|
|
1748
1857
|
} catch {
|
|
1749
1858
|
pipelineStatus = "unavailable";
|
|
@@ -1931,12 +2040,12 @@ function persistIngestOutbox(req) {
|
|
|
1931
2040
|
}
|
|
1932
2041
|
async function drainIngestOutbox() {
|
|
1933
2042
|
try {
|
|
1934
|
-
if (!
|
|
2043
|
+
if (!existsSync4(INGEST_OUTBOX_DIR)) return;
|
|
1935
2044
|
const files = readdirSync(INGEST_OUTBOX_DIR).filter((f) => f.endsWith(".json")).sort().slice(0, 500);
|
|
1936
2045
|
for (const file of files) {
|
|
1937
2046
|
const fullPath = path3.join(INGEST_OUTBOX_DIR, file);
|
|
1938
2047
|
try {
|
|
1939
|
-
const req = JSON.parse(
|
|
2048
|
+
const req = JSON.parse(readFileSync4(fullPath, "utf8"));
|
|
1940
2049
|
await handleIngest(req, fullPath);
|
|
1941
2050
|
} catch (err) {
|
|
1942
2051
|
process.stderr.write(`[exed] Ingest outbox drain failed for ${file}: ${err instanceof Error ? err.message : String(err)}
|
|
@@ -2139,7 +2248,7 @@ async function _writeMemoryRecordInner(entry) {
|
|
|
2139
2248
|
const vRow = await client.execute({ sql: "SELECT version FROM memories WHERE id = ?", args: [id] });
|
|
2140
2249
|
const version = Number(vRow.rows[0]?.version) || 0;
|
|
2141
2250
|
try {
|
|
2142
|
-
const { insertOntologyForMemory } = await import("../agentic-ontology-
|
|
2251
|
+
const { insertOntologyForMemory } = await import("../agentic-ontology-RNSXGXW4.js");
|
|
2143
2252
|
await insertOntologyForMemory({
|
|
2144
2253
|
id,
|
|
2145
2254
|
agent_id: record.agent_id,
|
|
@@ -2343,7 +2452,7 @@ function startServer() {
|
|
|
2343
2452
|
const oldPath = path3.join(path3.dirname(SOCKET_PATH), oldFile);
|
|
2344
2453
|
try {
|
|
2345
2454
|
if (oldFile.endsWith(".pid")) {
|
|
2346
|
-
const pid = parseInt(
|
|
2455
|
+
const pid = parseInt(readFileSync4(oldPath, "utf8").trim(), 10);
|
|
2347
2456
|
if (pid > 0) try {
|
|
2348
2457
|
process.kill(pid, "SIGKILL");
|
|
2349
2458
|
} catch {
|
|
@@ -2875,7 +2984,7 @@ async function startMcpHttpServer() {
|
|
|
2875
2984
|
process.stderr.write("[exed] MCP HTTP: DB ready\n");
|
|
2876
2985
|
setBootPhase("db_ready");
|
|
2877
2986
|
_storeInitialized = true;
|
|
2878
|
-
const { initLicenseGate, getCachedLicenseGate } = await import("../license-gate-
|
|
2987
|
+
const { initLicenseGate, getCachedLicenseGate } = await import("../license-gate-BYDMFMFT.js");
|
|
2879
2988
|
const gateResult = await initLicenseGate();
|
|
2880
2989
|
if (!gateResult.hasKey) {
|
|
2881
2990
|
process.stderr.write(
|
|
@@ -2890,7 +2999,7 @@ async function startMcpHttpServer() {
|
|
|
2890
2999
|
let _cachedWrapTelemetry = null;
|
|
2891
3000
|
async function getWrapTelemetry() {
|
|
2892
3001
|
if (!_cachedWrapTelemetry) {
|
|
2893
|
-
const { wrapServerWithTelemetry } = await import("../tool-telemetry-
|
|
3002
|
+
const { wrapServerWithTelemetry } = await import("../tool-telemetry-ULIDUK3P.js");
|
|
2894
3003
|
_cachedWrapTelemetry = wrapServerWithTelemetry;
|
|
2895
3004
|
}
|
|
2896
3005
|
return _cachedWrapTelemetry;
|
|
@@ -2960,7 +3069,7 @@ async function startMcpHttpServer() {
|
|
|
2960
3069
|
if (!token || token === header) return false;
|
|
2961
3070
|
if (token === _daemonToken) return true;
|
|
2962
3071
|
try {
|
|
2963
|
-
const { verifyAccessToken } = await import("../oauth-server-
|
|
3072
|
+
const { verifyAccessToken } = await import("../oauth-server-ROQFOEMM.js");
|
|
2964
3073
|
const result = verifyAccessToken(token);
|
|
2965
3074
|
return result.valid;
|
|
2966
3075
|
} catch {
|
|
@@ -2971,8 +3080,8 @@ async function startMcpHttpServer() {
|
|
|
2971
3080
|
_mcpSessionDetailsRef = sessionDetails;
|
|
2972
3081
|
try {
|
|
2973
3082
|
const sessPath = path3.join(EXE_AI_DIR, "mcp-sessions-persist.json");
|
|
2974
|
-
if (
|
|
2975
|
-
const raw =
|
|
3083
|
+
if (existsSync4(sessPath)) {
|
|
3084
|
+
const raw = readFileSync4(sessPath, "utf-8");
|
|
2976
3085
|
const saved = JSON.parse(raw);
|
|
2977
3086
|
const MAX_AGE_MS = 5 * 60 * 1e3;
|
|
2978
3087
|
const now = Date.now();
|
|
@@ -3205,7 +3314,7 @@ async function startMcpHttpServer() {
|
|
|
3205
3314
|
return;
|
|
3206
3315
|
}
|
|
3207
3316
|
try {
|
|
3208
|
-
const { handleOAuthRoute } = await import("../oauth-server-
|
|
3317
|
+
const { handleOAuthRoute } = await import("../oauth-server-ROQFOEMM.js");
|
|
3209
3318
|
const handled = await handleOAuthRoute(req, res, url, MCP_HTTP_PORT);
|
|
3210
3319
|
if (handled) return;
|
|
3211
3320
|
} catch (err) {
|
|
@@ -3333,7 +3442,7 @@ async function startMcpHttpServer() {
|
|
|
3333
3442
|
contextPct: body.context_pct
|
|
3334
3443
|
});
|
|
3335
3444
|
if (body.context_pct !== void 0 && body.context_pct > 70) {
|
|
3336
|
-
void import("../orchestration-events-
|
|
3445
|
+
void import("../orchestration-events-5SIJOE4H.js").then(({ recordOrchestrationEventBestEffort: recordOE }) => {
|
|
3337
3446
|
recordOE({
|
|
3338
3447
|
eventType: "context.pressure",
|
|
3339
3448
|
source: "exe-daemon.heartbeat",
|
|
@@ -3946,13 +4055,13 @@ async function ensureStoreForPolling() {
|
|
|
3946
4055
|
}
|
|
3947
4056
|
}
|
|
3948
4057
|
async function startReviewPolling() {
|
|
3949
|
-
const polling = await import("../review-polling-
|
|
4058
|
+
const polling = await import("../review-polling-PCMD5BFN.js");
|
|
3950
4059
|
const state = {
|
|
3951
4060
|
lastIntercomSent: /* @__PURE__ */ new Map(),
|
|
3952
4061
|
lastNudgeSent: /* @__PURE__ */ new Map(),
|
|
3953
4062
|
intervalMs: REVIEW_POLL_INTERVAL_MS
|
|
3954
4063
|
};
|
|
3955
|
-
const { pollReviewNudge, createReviewNudgeRealDeps, loadNudgeState } = await import("../daemon-orchestration-
|
|
4064
|
+
const { pollReviewNudge, createReviewNudgeRealDeps, loadNudgeState } = await import("../daemon-orchestration-7QB6QOXT.js");
|
|
3956
4065
|
const nudgeState = loadNudgeState();
|
|
3957
4066
|
const tick = async () => traceDaemonTimer("review_polling", async () => {
|
|
3958
4067
|
fired("review_polling");
|
|
@@ -3994,9 +4103,10 @@ function startSessionTTL() {
|
|
|
3994
4103
|
const tick = async () => traceDaemonTimer("session_ttl", async () => {
|
|
3995
4104
|
fired("session_ttl");
|
|
3996
4105
|
if (!await ensureStoreForPolling()) return;
|
|
4106
|
+
if (inPostRestartDestructiveGrace("session_ttl")) return;
|
|
3997
4107
|
try {
|
|
3998
4108
|
const { getClient } = await import("./database.js");
|
|
3999
|
-
const { checkSessionTTL, createSessionTTLRealDeps } = await import("../daemon-orchestration-
|
|
4109
|
+
const { checkSessionTTL, createSessionTTLRealDeps } = await import("../daemon-orchestration-7QB6QOXT.js");
|
|
4000
4110
|
const deps = createSessionTTLRealDeps(getClient);
|
|
4001
4111
|
const killed = await checkSessionTTL(deps);
|
|
4002
4112
|
if (killed.length > 0) acted("session_ttl");
|
|
@@ -4016,9 +4126,10 @@ function startIdleKill() {
|
|
|
4016
4126
|
const tick = async () => traceDaemonTimer("idle_kill", async () => {
|
|
4017
4127
|
fired("idle_kill");
|
|
4018
4128
|
if (!await ensureStoreForPolling()) return;
|
|
4129
|
+
if (inPostRestartDestructiveGrace("idle_kill")) return;
|
|
4019
4130
|
try {
|
|
4020
4131
|
const signalDir = path3.join(os2.homedir(), ".exe-os", "task-signals");
|
|
4021
|
-
if (
|
|
4132
|
+
if (existsSync4(signalDir)) {
|
|
4022
4133
|
const files = (await import("fs")).readdirSync(signalDir).filter((f) => f.endsWith(".terminate"));
|
|
4023
4134
|
for (const file of files) {
|
|
4024
4135
|
const agentId = file.replace(".terminate", "");
|
|
@@ -4044,7 +4155,7 @@ function startIdleKill() {
|
|
|
4044
4155
|
const cfg = await getCachedConfig();
|
|
4045
4156
|
if (!cfg) return;
|
|
4046
4157
|
const { getClient } = await import("./database.js");
|
|
4047
|
-
const { pollIdleKill, createIdleKillRealDeps } = await import("../daemon-orchestration-
|
|
4158
|
+
const { pollIdleKill, createIdleKillRealDeps } = await import("../daemon-orchestration-7QB6QOXT.js");
|
|
4048
4159
|
const { sessions: liveSessions, paneCache, aliveSessions } = await getSharedOrchestrationCaches();
|
|
4049
4160
|
const realDeps = createIdleKillRealDeps(
|
|
4050
4161
|
getClient,
|
|
@@ -4117,7 +4228,7 @@ function startConsolidation() {
|
|
|
4117
4228
|
`);
|
|
4118
4229
|
}
|
|
4119
4230
|
try {
|
|
4120
|
-
const { createBackupAsync, enforceRetention } = await import("../db-backup-
|
|
4231
|
+
const { createBackupAsync, enforceRetention } = await import("../db-backup-DLD4QZBO.js");
|
|
4121
4232
|
const p = await createBackupAsync("pre-consolidation");
|
|
4122
4233
|
if (p) enforceRetention("pre-consolidation");
|
|
4123
4234
|
} catch (e) {
|
|
@@ -4350,7 +4461,7 @@ function startSkillRefinement() {
|
|
|
4350
4461
|
if (!shouldRunHeavyJob("skill_refinement")) return;
|
|
4351
4462
|
try {
|
|
4352
4463
|
if (!await ensureStoreForPolling()) return;
|
|
4353
|
-
const { runSkillRefinement } = await import("../skill-refinement-
|
|
4464
|
+
const { runSkillRefinement } = await import("../skill-refinement-74T6VDFM.js");
|
|
4354
4465
|
const result = await runSkillRefinement();
|
|
4355
4466
|
if (result.reviewed > 0) {
|
|
4356
4467
|
acted("skill_refinement");
|
|
@@ -4376,8 +4487,8 @@ function startStaleBranchSweep() {
|
|
|
4376
4487
|
const tick = async () => {
|
|
4377
4488
|
fired("stale_branch_sweep");
|
|
4378
4489
|
try {
|
|
4379
|
-
const { discoverRepoPaths } = await import("../worktree-sweep-
|
|
4380
|
-
const { scanUnmergedBranches } = await import("../branch-hygiene-
|
|
4490
|
+
const { discoverRepoPaths } = await import("../worktree-sweep-ZAG3V24E.js");
|
|
4491
|
+
const { scanUnmergedBranches } = await import("../branch-hygiene-R5NVTRAY.js");
|
|
4381
4492
|
const today = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
|
|
4382
4493
|
for (const k of _staleBranchAlertedToday) {
|
|
4383
4494
|
if (!k.endsWith(today)) _staleBranchAlertedToday.delete(k);
|
|
@@ -4389,9 +4500,10 @@ function startStaleBranchSweep() {
|
|
|
4389
4500
|
repos = [];
|
|
4390
4501
|
}
|
|
4391
4502
|
for (const repo of repos) {
|
|
4503
|
+
await yieldToEventLoop();
|
|
4392
4504
|
let scan;
|
|
4393
4505
|
try {
|
|
4394
|
-
scan = scanUnmergedBranches(repo, { staleHours: STALE_BRANCH_HOURS });
|
|
4506
|
+
scan = await scanUnmergedBranches(repo, { staleHours: STALE_BRANCH_HOURS });
|
|
4395
4507
|
} catch {
|
|
4396
4508
|
continue;
|
|
4397
4509
|
}
|
|
@@ -4403,7 +4515,7 @@ function startStaleBranchSweep() {
|
|
|
4403
4515
|
if (!_storeInitialized) continue;
|
|
4404
4516
|
const stale = scan.branches.filter((b) => b.ageHours >= STALE_BRANCH_HOURS).slice(0, 5).map((b) => `${b.name} (+${b.ahead} commits, ${(b.ageHours / 24).toFixed(1)}d)`).join("; ");
|
|
4405
4517
|
try {
|
|
4406
|
-
const { writeNotification } = await import("../notifications-
|
|
4518
|
+
const { writeNotification } = await import("../notifications-KONB3C62.js");
|
|
4407
4519
|
await writeNotification({
|
|
4408
4520
|
agentId: "exe",
|
|
4409
4521
|
agentRole: "system",
|
|
@@ -4442,7 +4554,7 @@ function startGraphExtraction() {
|
|
|
4442
4554
|
if (!await ensureStoreForPolling()) return;
|
|
4443
4555
|
const { getClient } = await import("./database.js");
|
|
4444
4556
|
const client = getClient();
|
|
4445
|
-
const { extractBatch } = await import("../graph-rag-
|
|
4557
|
+
const { extractBatch } = await import("../graph-rag-JZZAB7PC.js");
|
|
4446
4558
|
const result = await extractBatch(client, 50, config.selfQueryModel);
|
|
4447
4559
|
if (result.processed > 0) {
|
|
4448
4560
|
acted("graph_extraction");
|
|
@@ -4860,7 +4972,7 @@ function startReflectionSweep() {
|
|
|
4860
4972
|
);
|
|
4861
4973
|
let runReflection;
|
|
4862
4974
|
try {
|
|
4863
|
-
({ runReflection } = await import("../memory-reflection-
|
|
4975
|
+
({ runReflection } = await import("../memory-reflection-6N4J2FL7.js"));
|
|
4864
4976
|
} catch (importErr) {
|
|
4865
4977
|
_reflectionImportFailed = true;
|
|
4866
4978
|
process.stderr.write(`[exed] Reflection module unavailable (stale chunk hash?) \u2014 disabled until daemon restart: ${importErr instanceof Error ? importErr.message : String(importErr)}
|
|
@@ -4901,7 +5013,7 @@ function startReflectionSweep() {
|
|
|
4901
5013
|
if (memories > 100 && cards < memories * 0.1) {
|
|
4902
5014
|
process.stderr.write(`[exed] Memory cards sparse (${cards} cards / ${memories} memories) \u2014 running backfill...
|
|
4903
5015
|
`);
|
|
4904
|
-
const { insertMemoryCardsForBatch } = await import("../memory-cards-
|
|
5016
|
+
const { insertMemoryCardsForBatch } = await import("../memory-cards-TQRLZI4D.js");
|
|
4905
5017
|
const batchSize = 500;
|
|
4906
5018
|
let offset = 0;
|
|
4907
5019
|
let totalCards = 0;
|
|
@@ -4946,7 +5058,7 @@ function startDatabaseBackup() {
|
|
|
4946
5058
|
fired("db_backup");
|
|
4947
5059
|
if (!shouldRunHeavyJob("db_backup")) return;
|
|
4948
5060
|
try {
|
|
4949
|
-
const { createBackupAsync, enforceRetention, hasBackupToday } = await import("../db-backup-
|
|
5061
|
+
const { createBackupAsync, enforceRetention, hasBackupToday } = await import("../db-backup-DLD4QZBO.js");
|
|
4950
5062
|
if (hasBackupToday("daily")) return;
|
|
4951
5063
|
const backupPath = await createBackupAsync("daily");
|
|
4952
5064
|
if (backupPath) {
|
|
@@ -5001,7 +5113,8 @@ function startSoftDeletePurge() {
|
|
|
5001
5113
|
`);
|
|
5002
5114
|
}
|
|
5003
5115
|
};
|
|
5004
|
-
|
|
5116
|
+
extendBootCatchUp(2e4);
|
|
5117
|
+
setTimeout(() => void traceDaemonTimer("soft_delete_purge", tick), 4e3);
|
|
5005
5118
|
const timer = setInterval(() => void traceDaemonTimer("soft_delete_purge", tick), PURGE_INTERVAL_MS);
|
|
5006
5119
|
timer.unref();
|
|
5007
5120
|
process.stderr.write(`[exed] Soft-delete purge started (every 6h, soft-delete: 7d, archived: opt-in via config.archivePurge)
|
|
@@ -5015,7 +5128,7 @@ function startSessionEventsRetention() {
|
|
|
5015
5128
|
if (!await ensureStoreForPolling()) return;
|
|
5016
5129
|
try {
|
|
5017
5130
|
const { getClient } = await import("./database.js");
|
|
5018
|
-
const { sweepExpiredSessionEvents, DEFAULT_SESSION_EVENTS_RETENTION_DAYS } = await import("../session-events-
|
|
5131
|
+
const { sweepExpiredSessionEvents, DEFAULT_SESSION_EVENTS_RETENTION_DAYS } = await import("../session-events-3LCVQEL7.js");
|
|
5019
5132
|
const days = SESSION_EVENTS_RETENTION_DAYS ?? DEFAULT_SESSION_EVENTS_RETENTION_DAYS;
|
|
5020
5133
|
const count = await sweepExpiredSessionEvents(getClient(), days);
|
|
5021
5134
|
if (count > 0) {
|
|
@@ -5032,7 +5145,8 @@ function startSessionEventsRetention() {
|
|
|
5032
5145
|
);
|
|
5033
5146
|
}
|
|
5034
5147
|
};
|
|
5035
|
-
|
|
5148
|
+
extendBootCatchUp(2e4);
|
|
5149
|
+
setTimeout(() => void traceDaemonTimer("session_events_retention", tick), 8e3);
|
|
5036
5150
|
const timer = setInterval(() => void traceDaemonTimer("session_events_retention", tick), SESSION_EVENTS_RETENTION_INTERVAL_MS);
|
|
5037
5151
|
timer.unref();
|
|
5038
5152
|
process.stderr.write(
|
|
@@ -5045,10 +5159,9 @@ function startIntercomQueueDrain() {
|
|
|
5045
5159
|
const tick = async () => traceDaemonTimer("intercom_queue_drain", async () => {
|
|
5046
5160
|
fired("intercom_queue_drain");
|
|
5047
5161
|
try {
|
|
5048
|
-
const {
|
|
5162
|
+
const { drainQueueAsync, readQueue } = await import("../intercom-queue-VU2G6F5R.js");
|
|
5049
5163
|
const {
|
|
5050
|
-
|
|
5051
|
-
sendIntercom: centralSendIntercom,
|
|
5164
|
+
sendIntercomAsync: centralSendIntercomAsync,
|
|
5052
5165
|
decideQueuedNudgeDrain,
|
|
5053
5166
|
countScopedPendingReviews
|
|
5054
5167
|
} = await import("./tmux-routing.js");
|
|
@@ -5083,9 +5196,14 @@ function startIntercomQueueDrain() {
|
|
|
5083
5196
|
if (count !== null) pendingReviewCounts.set(target, count);
|
|
5084
5197
|
}
|
|
5085
5198
|
}
|
|
5086
|
-
const result =
|
|
5087
|
-
|
|
5088
|
-
(
|
|
5199
|
+
const result = await drainQueueAsync(
|
|
5200
|
+
// Bug ddbfc3f6: async busy check via the shared async pane cache —
|
|
5201
|
+
// no sync execFileSync("tmux") per queue item on the event loop.
|
|
5202
|
+
async (session) => {
|
|
5203
|
+
const state = classifyPaneState(await capturePaneAsync(session, 5));
|
|
5204
|
+
return state === "thinking" || state === "tool";
|
|
5205
|
+
},
|
|
5206
|
+
async (session, item) => {
|
|
5089
5207
|
try {
|
|
5090
5208
|
const agentRaw = session.split("-")[0] ?? session;
|
|
5091
5209
|
const agent = baseAgentName(agentRaw);
|
|
@@ -5099,7 +5217,7 @@ function startIntercomQueueDrain() {
|
|
|
5099
5217
|
`);
|
|
5100
5218
|
return true;
|
|
5101
5219
|
}
|
|
5102
|
-
const outcome =
|
|
5220
|
+
const outcome = await centralSendIntercomAsync(session, {
|
|
5103
5221
|
reason: item.intercomReason ?? "nudge"
|
|
5104
5222
|
});
|
|
5105
5223
|
return outcome === "delivered" || outcome === "debounced" || outcome === "skipped_exe";
|
|
@@ -5130,7 +5248,7 @@ function startOrphanReaper() {
|
|
|
5130
5248
|
const tick = async () => traceDaemonTimer("orphan_reaper", async () => {
|
|
5131
5249
|
fired("orphan_reaper");
|
|
5132
5250
|
try {
|
|
5133
|
-
const { reapOrphanedMcpProcesses, createOrphanReaperRealDepsAsync } = await import("../daemon-orchestration-
|
|
5251
|
+
const { reapOrphanedMcpProcesses, createOrphanReaperRealDepsAsync } = await import("../daemon-orchestration-7QB6QOXT.js");
|
|
5134
5252
|
const deps = await createOrphanReaperRealDepsAsync();
|
|
5135
5253
|
const reaped = await reapOrphanedMcpProcesses(deps);
|
|
5136
5254
|
if (reaped.length > 0) acted("orphan_reaper");
|
|
@@ -5155,7 +5273,7 @@ function startZombieAgentReaper() {
|
|
|
5155
5273
|
const tick = async () => traceDaemonTimer("zombie_agent_reaper", async () => {
|
|
5156
5274
|
fired("zombie_agent_reaper");
|
|
5157
5275
|
try {
|
|
5158
|
-
const { reapZombieAgentProcesses, createZombieAgentReaperRealDepsAsync } = await import("../daemon-orchestration-
|
|
5276
|
+
const { reapZombieAgentProcesses, createZombieAgentReaperRealDepsAsync } = await import("../daemon-orchestration-7QB6QOXT.js");
|
|
5159
5277
|
const deps = await createZombieAgentReaperRealDepsAsync();
|
|
5160
5278
|
const reaped = reapZombieAgentProcesses(deps);
|
|
5161
5279
|
if (reaped.length > 0) acted("zombie_agent_reaper");
|
|
@@ -5179,7 +5297,7 @@ async function startDaemonMemoryPressureWatchdog() {
|
|
|
5179
5297
|
try {
|
|
5180
5298
|
const cfg = await getCachedConfig();
|
|
5181
5299
|
if (!cfg) return;
|
|
5182
|
-
const { startMemoryPressureWatchdog: startWatchdog, MEMORY_PRESSURE_WATCHDOG_DEFAULTS } = await import("../memory-pressure-watchdog-
|
|
5300
|
+
const { startMemoryPressureWatchdog: startWatchdog, MEMORY_PRESSURE_WATCHDOG_DEFAULTS } = await import("../memory-pressure-watchdog-RRIAXPXQ.js");
|
|
5183
5301
|
const watchdogCfg = {
|
|
5184
5302
|
...MEMORY_PRESSURE_WATCHDOG_DEFAULTS,
|
|
5185
5303
|
...cfg.memoryPressureWatchdog ?? {}
|
|
@@ -5210,7 +5328,7 @@ function startWorktreeReaper() {
|
|
|
5210
5328
|
const tick = async () => traceDaemonTimer("worktree_reaper", async () => {
|
|
5211
5329
|
fired("worktree_reaper");
|
|
5212
5330
|
try {
|
|
5213
|
-
const { reapOrphanedWorktrees, createWorktreeReaperRealDeps } = await import("../daemon-orchestration-
|
|
5331
|
+
const { reapOrphanedWorktrees, createWorktreeReaperRealDeps } = await import("../daemon-orchestration-7QB6QOXT.js");
|
|
5214
5332
|
const deps = await createWorktreeReaperRealDeps();
|
|
5215
5333
|
const result = await reapOrphanedWorktrees(deps);
|
|
5216
5334
|
if (result.pruned.length > 0) {
|
|
@@ -5250,11 +5368,11 @@ function startWorktreeReaper() {
|
|
|
5250
5368
|
}
|
|
5251
5369
|
continue;
|
|
5252
5370
|
}
|
|
5253
|
-
const { cleanupAgentWorktree } = await import("../worktree-sweep-
|
|
5254
|
-
const { getMainRepoRoot } = await import("../worktree-
|
|
5371
|
+
const { cleanupAgentWorktree } = await import("../worktree-sweep-ZAG3V24E.js");
|
|
5372
|
+
const { getMainRepoRoot } = await import("../worktree-GVF2I5FP.js");
|
|
5255
5373
|
const repoRoot = getMainRepoRoot(signal.worktreePath);
|
|
5256
5374
|
if (repoRoot && signal.agentId) {
|
|
5257
|
-
const notes = cleanupAgentWorktree(repoRoot, signal.agentId);
|
|
5375
|
+
const notes = await cleanupAgentWorktree(repoRoot, signal.agentId);
|
|
5258
5376
|
if (notes) {
|
|
5259
5377
|
acted("worktree_reaper");
|
|
5260
5378
|
process.stderr.write(
|
|
@@ -5284,8 +5402,8 @@ function startAutoWake() {
|
|
|
5284
5402
|
if (!await ensureStoreForPolling()) return;
|
|
5285
5403
|
try {
|
|
5286
5404
|
const { getClient } = await import("./database.js");
|
|
5287
|
-
const { pollOrphanedTasks, createAutoWakeRealDeps } = await import("../daemon-orchestration-
|
|
5288
|
-
const deps = createAutoWakeRealDeps(getClient, process.cwd());
|
|
5405
|
+
const { pollOrphanedTasks, createAutoWakeRealDeps } = await import("../daemon-orchestration-7QB6QOXT.js");
|
|
5406
|
+
const deps = createAutoWakeRealDeps(getClient, process.cwd(), getTmuxSessionsAsync);
|
|
5289
5407
|
const woken = await pollOrphanedTasks(deps);
|
|
5290
5408
|
if (woken.length > 0) acted("auto_wake");
|
|
5291
5409
|
for (const agent of woken) {
|
|
@@ -5294,7 +5412,7 @@ function startAutoWake() {
|
|
|
5294
5412
|
}
|
|
5295
5413
|
try {
|
|
5296
5414
|
const signalBase = path3.join(os2.homedir(), ".exe-os", "task-signals");
|
|
5297
|
-
if (
|
|
5415
|
+
if (existsSync4(signalBase)) {
|
|
5298
5416
|
const { readdirSync: readdirSync2, statSync: statSyncFs } = await import("fs");
|
|
5299
5417
|
const { sendIntercomAsync } = await import("./tmux-routing.js");
|
|
5300
5418
|
const sessionCache = path3.join(os2.homedir(), ".exe-os", "session-cache");
|
|
@@ -5310,11 +5428,11 @@ function startAutoWake() {
|
|
|
5310
5428
|
if (cached && Date.now() - cached.ts < 3e4) return cached.runtime;
|
|
5311
5429
|
try {
|
|
5312
5430
|
const dispatchInfoPath = path3.join(sessionCache, `dispatch-info-${sessionName}.json`);
|
|
5313
|
-
if (!
|
|
5431
|
+
if (!existsSync4(dispatchInfoPath)) {
|
|
5314
5432
|
_runtimeCache.set(sessionName, { runtime: "claude", ts: Date.now() });
|
|
5315
5433
|
return "claude";
|
|
5316
5434
|
}
|
|
5317
|
-
const raw = JSON.parse(
|
|
5435
|
+
const raw = JSON.parse(readFileSync4(dispatchInfoPath, "utf8"));
|
|
5318
5436
|
const rt = raw.runtime ?? "claude";
|
|
5319
5437
|
_runtimeCache.set(sessionName, { runtime: rt, ts: Date.now() });
|
|
5320
5438
|
return rt;
|
|
@@ -5335,7 +5453,7 @@ function startAutoWake() {
|
|
|
5335
5453
|
if (age > 60 * 60 * 1e3) {
|
|
5336
5454
|
try {
|
|
5337
5455
|
unlinkSync2(signalPath);
|
|
5338
|
-
void import("../orchestration-events-
|
|
5456
|
+
void import("../orchestration-events-5SIJOE4H.js").then(({ recordOrchestrationEventBestEffort: recordOE }) => {
|
|
5339
5457
|
recordOE({ eventType: "signal.stale", source: "exe-daemon.autoWake", severity: "warn", payload: { file, ageMinutes: Math.round(age / 6e4) } });
|
|
5340
5458
|
}).catch(() => {
|
|
5341
5459
|
});
|
|
@@ -5395,7 +5513,7 @@ function startWalCheckpoint() {
|
|
|
5395
5513
|
try {
|
|
5396
5514
|
const { getClient, runWalCheckpoint } = await import("./database.js");
|
|
5397
5515
|
const client = getClient();
|
|
5398
|
-
const { findActiveDb } = await import("../db-backup-
|
|
5516
|
+
const { findActiveDb } = await import("../db-backup-DLD4QZBO.js");
|
|
5399
5517
|
const dbPath = findActiveDb();
|
|
5400
5518
|
const started = Date.now();
|
|
5401
5519
|
const result = await runWalCheckpoint(client, dbPath, true);
|
|
@@ -5465,9 +5583,15 @@ function startStuckTaskRelease() {
|
|
|
5465
5583
|
const tick = async () => traceDaemonTimer("stuck_task_release", async () => {
|
|
5466
5584
|
fired("stuck_task_release");
|
|
5467
5585
|
if (!await ensureStoreForPolling()) return;
|
|
5586
|
+
if (inPostRestartDestructiveGrace("stuck_task_release")) return;
|
|
5468
5587
|
try {
|
|
5469
5588
|
const { getClient } = await import("./database.js");
|
|
5470
|
-
const {
|
|
5589
|
+
const {
|
|
5590
|
+
releaseStuckTasks,
|
|
5591
|
+
createStuckTaskRealDeps,
|
|
5592
|
+
escalateStuckBlockedTasks,
|
|
5593
|
+
createStuckBlockedRealDeps
|
|
5594
|
+
} = await import("../daemon-orchestration-7QB6QOXT.js");
|
|
5471
5595
|
const deps = createStuckTaskRealDeps(getClient);
|
|
5472
5596
|
const released = await releaseStuckTasks(deps);
|
|
5473
5597
|
if (released.length > 0) {
|
|
@@ -5475,6 +5599,14 @@ function startStuckTaskRelease() {
|
|
|
5475
5599
|
process.stderr.write(`[exed] Stuck-release: ${released.length} task(s) moved to blocked
|
|
5476
5600
|
`);
|
|
5477
5601
|
}
|
|
5602
|
+
const blockedResult = await escalateStuckBlockedTasks(createStuckBlockedRealDeps(getClient));
|
|
5603
|
+
if (blockedResult.escalated.length > 0 || blockedResult.cancelled.length > 0) {
|
|
5604
|
+
acted("stuck_task_release");
|
|
5605
|
+
process.stderr.write(
|
|
5606
|
+
`[exed] Stuck-blocked: escalated ${blockedResult.escalated.length}, auto-cancelled ${blockedResult.cancelled.length}
|
|
5607
|
+
`
|
|
5608
|
+
);
|
|
5609
|
+
}
|
|
5478
5610
|
} catch (err) {
|
|
5479
5611
|
process.stderr.write(`[exed] Stuck-release error: ${err instanceof Error ? err.message : String(err)}
|
|
5480
5612
|
`);
|
|
@@ -5654,12 +5786,12 @@ function startTaskEnforcementScanner() {
|
|
|
5654
5786
|
const tick = async () => traceDaemonTimer("task_enforcement", async () => {
|
|
5655
5787
|
fired("task_enforcement");
|
|
5656
5788
|
try {
|
|
5657
|
-
const { runTaskEnforcementTick } = await import("../task-enforcement-
|
|
5789
|
+
const { runTaskEnforcementTick } = await import("../task-enforcement-VI7L43DC.js");
|
|
5658
5790
|
const { getTransport } = await import("./transport.js");
|
|
5659
5791
|
const { loadAgentConfig } = await import("./agent-config.js");
|
|
5660
5792
|
const { getClient } = await import("./database.js");
|
|
5661
5793
|
const { loadEmployeesSync } = await import("./employees.js");
|
|
5662
|
-
const { sessionScopeFilter } = await import("../task-scope-
|
|
5794
|
+
const { sessionScopeFilter } = await import("../task-scope-CQEG5SSJ.js");
|
|
5663
5795
|
const transport = getTransport();
|
|
5664
5796
|
const { sessions: allSessions, paneCache, aliveSessions } = await getSharedOrchestrationCaches();
|
|
5665
5797
|
await yieldToEventLoop();
|
|
@@ -5670,10 +5802,10 @@ function startTaskEnforcementScanner() {
|
|
|
5670
5802
|
sendKeysLiteral: transport.sendKeysLiteral?.bind(transport),
|
|
5671
5803
|
isAlive: (session) => aliveSessions.has(session)
|
|
5672
5804
|
};
|
|
5673
|
-
const { checkAutoWakeGates } = await import("../daemon-orchestration-
|
|
5805
|
+
const { checkAutoWakeGates } = await import("../daemon-orchestration-7QB6QOXT.js");
|
|
5674
5806
|
const { ensureEmployeeAsync, employeeSessionName } = await import("./tmux-routing.js");
|
|
5675
5807
|
const { shouldAutoInstance } = await import("./employees.js");
|
|
5676
|
-
const { recordOrchestrationEventBestEffort } = await import("../orchestration-events-
|
|
5808
|
+
const { recordOrchestrationEventBestEffort } = await import("../orchestration-events-5SIJOE4H.js");
|
|
5677
5809
|
const projectDir = process.cwd();
|
|
5678
5810
|
await runTaskEnforcementTick({
|
|
5679
5811
|
transport: enforcementTransport,
|
|
@@ -5913,13 +6045,13 @@ function startApiWatchdog() {
|
|
|
5913
6045
|
`);
|
|
5914
6046
|
try {
|
|
5915
6047
|
const { appendFileSync, mkdirSync: mkdirSync3, statSync: statSyncFs, renameSync: renameSyncFs } = await import("fs");
|
|
5916
|
-
const { join } = await import("path");
|
|
5917
|
-
const logDir =
|
|
6048
|
+
const { join: join2 } = await import("path");
|
|
6049
|
+
const logDir = join2(process.env.EXE_OS_DIR ?? join2(process.env.HOME ?? "", ".exe-os"), "logs");
|
|
5918
6050
|
try {
|
|
5919
6051
|
mkdirSync3(logDir, { recursive: true });
|
|
5920
6052
|
} catch {
|
|
5921
6053
|
}
|
|
5922
|
-
const watchdogLogPath =
|
|
6054
|
+
const watchdogLogPath = join2(logDir, "api-watchdog.jsonl");
|
|
5923
6055
|
try {
|
|
5924
6056
|
const wStat = statSyncFs(watchdogLogPath);
|
|
5925
6057
|
if (wStat.size > 5 * 1024 * 1024) renameSyncFs(watchdogLogPath, watchdogLogPath + ".1");
|
|
@@ -6152,14 +6284,40 @@ process.on("uncaughtException", (err) => {
|
|
|
6152
6284
|
}
|
|
6153
6285
|
setTimeout(() => process.exit(1), 3e3);
|
|
6154
6286
|
});
|
|
6287
|
+
function readProcEnviron(pid) {
|
|
6288
|
+
try {
|
|
6289
|
+
const raw = readFileSync4(`/proc/${pid}/environ`, "utf8");
|
|
6290
|
+
const env = {};
|
|
6291
|
+
for (const part of raw.split("\0")) {
|
|
6292
|
+
const idx = part.indexOf("=");
|
|
6293
|
+
if (idx > 0) env[part.slice(0, idx)] = part.slice(idx + 1);
|
|
6294
|
+
}
|
|
6295
|
+
return env;
|
|
6296
|
+
} catch {
|
|
6297
|
+
return null;
|
|
6298
|
+
}
|
|
6299
|
+
}
|
|
6300
|
+
function isSameDaemonInstance(pid) {
|
|
6301
|
+
if (pid === process.pid) return false;
|
|
6302
|
+
try {
|
|
6303
|
+
process.kill(pid, 0);
|
|
6304
|
+
} catch {
|
|
6305
|
+
return false;
|
|
6306
|
+
}
|
|
6307
|
+
const env = readProcEnviron(pid);
|
|
6308
|
+
if (!env) return false;
|
|
6309
|
+
const sameHome = env.HOME === process.env.HOME;
|
|
6310
|
+
const samePidPath = (env.EXE_DAEMON_PID ?? env.EXE_EMBED_PID ?? path3.join(env.HOME ?? "", ".exe-os", "exed.pid")) === PID_PATH;
|
|
6311
|
+
const sameSockPath = (env.EXE_DAEMON_SOCK ?? env.EXE_EMBED_SOCK ?? path3.join(env.HOME ?? "", ".exe-os", "exed.sock")) === SOCKET_PATH;
|
|
6312
|
+
return Boolean(sameHome && (samePidPath || sameSockPath));
|
|
6313
|
+
}
|
|
6155
6314
|
function killOrphanDaemons() {
|
|
6156
6315
|
try {
|
|
6157
|
-
const pids = execSyncNode("pgrep -f 'exe-daemon\\.js' 2>/dev/null || true", { encoding: "utf8", timeout: 3e3 }).trim().split("\n").filter(Boolean).map(Number).filter((n) => !isNaN(n) && n
|
|
6316
|
+
const pids = execSyncNode("pgrep -f 'exe-daemon\\.js' 2>/dev/null || true", { encoding: "utf8", timeout: 3e3 }).trim().split("\n").filter(Boolean).map(Number).filter((n) => !isNaN(n) && isSameDaemonInstance(n));
|
|
6158
6317
|
if (pids.length === 0) return;
|
|
6159
6318
|
for (const pid of pids) {
|
|
6160
6319
|
try {
|
|
6161
|
-
process.
|
|
6162
|
-
process.stderr.write(`[exed] Killing orphan daemon from different install (PID ${pid})
|
|
6320
|
+
process.stderr.write(`[exed] Killing orphan daemon from same instance (PID ${pid})
|
|
6163
6321
|
`);
|
|
6164
6322
|
process.kill(pid, "SIGTERM");
|
|
6165
6323
|
} catch {
|
|
@@ -6181,11 +6339,11 @@ function killOrphanDaemons() {
|
|
|
6181
6339
|
}
|
|
6182
6340
|
function checkExistingDaemon() {
|
|
6183
6341
|
try {
|
|
6184
|
-
if (!
|
|
6342
|
+
if (!existsSync4(PID_PATH)) {
|
|
6185
6343
|
killOrphanDaemons();
|
|
6186
6344
|
return false;
|
|
6187
6345
|
}
|
|
6188
|
-
const pid = parseInt(
|
|
6346
|
+
const pid = parseInt(readFileSync4(PID_PATH, "utf8").trim(), 10);
|
|
6189
6347
|
if (!pid || isNaN(pid)) {
|
|
6190
6348
|
killOrphanDaemons();
|
|
6191
6349
|
return false;
|
|
@@ -6330,7 +6488,7 @@ try {
|
|
|
6330
6488
|
}
|
|
6331
6489
|
await new Promise((r) => setTimeout(r, 500));
|
|
6332
6490
|
try {
|
|
6333
|
-
const claimedPid = parseInt(
|
|
6491
|
+
const claimedPid = parseInt(readFileSync4(PID_PATH, "utf8").trim(), 10);
|
|
6334
6492
|
if (claimedPid !== process.pid) {
|
|
6335
6493
|
process.stderr.write(
|
|
6336
6494
|
`[exed] Race detected \u2014 PID ${claimedPid} claimed the lock. Exiting cleanly.
|
|
@@ -6349,7 +6507,7 @@ process.env.EXE_IS_DAEMON = "1";
|
|
|
6349
6507
|
if (process.platform === "darwin") {
|
|
6350
6508
|
try {
|
|
6351
6509
|
const oldPlist = path3.join(os2.homedir(), "Library", "LaunchAgents", "com.askexe.exed-keepalive.plist");
|
|
6352
|
-
if (
|
|
6510
|
+
if (existsSync4(oldPlist)) {
|
|
6353
6511
|
try {
|
|
6354
6512
|
execSyncNode(`launchctl unload "${oldPlist}" 2>/dev/null`, { timeout: 5e3 });
|
|
6355
6513
|
} catch {
|
|
@@ -6363,7 +6521,7 @@ if (process.platform === "darwin") {
|
|
|
6363
6521
|
logBoot({ socketPath: SOCKET_PATH, pidPath: PID_PATH });
|
|
6364
6522
|
void (async () => {
|
|
6365
6523
|
try {
|
|
6366
|
-
const { cleanupCrashDebris } = await import("../db-backup-
|
|
6524
|
+
const { cleanupCrashDebris } = await import("../db-backup-DLD4QZBO.js");
|
|
6367
6525
|
const removed = cleanupCrashDebris();
|
|
6368
6526
|
if (removed > 0) {
|
|
6369
6527
|
process.stderr.write(`[exed] Startup cleanup: pruned ${removed} crash-debris file(s) (backups/quarantine).
|
|
@@ -6502,22 +6660,34 @@ async function runSmokeTests() {
|
|
|
6502
6660
|
function startEventLoopLagDetector() {
|
|
6503
6661
|
let lastTick = monotonicNowMs();
|
|
6504
6662
|
let clockProbe = captureClockProbe();
|
|
6663
|
+
let lastCpu = process.cpuUsage();
|
|
6664
|
+
const SELF_CPU_BUSY_RATIO = parseFloat(process.env.EXE_SELF_CPU_BUSY_RATIO ?? "") || 0.5;
|
|
6665
|
+
const SELF_INFLICTED_LIMIT = parseInt(process.env.EXE_SELF_INFLICTED_LIMIT ?? "") || 5;
|
|
6666
|
+
const SELF_INFLICTED_SUPPRESS_CAP_MS = parseFloat(process.env.EXE_SELF_INFLICTED_SUPPRESS_CAP_MS ?? "") || 15e4;
|
|
6505
6667
|
const LAG_WARN_MS = 3e3;
|
|
6506
6668
|
const LAG_CRITICAL_MS = 1e4;
|
|
6507
6669
|
const SELF_HEAL_SINGLE_MS = parseFloat(process.env.EXE_SELF_HEAL_SINGLE_MS ?? "") || 12e4;
|
|
6508
6670
|
const SELF_HEAL_CONSECUTIVE = parseInt(process.env.EXE_SELF_HEAL_CONSECUTIVE ?? "") || 3;
|
|
6509
6671
|
const SELF_HEAL_THRESHOLD_MS = parseFloat(process.env.EXE_SELF_HEAL_THRESHOLD_MS ?? "") || 3e4;
|
|
6510
6672
|
let consecutiveSevereBlocks = 0;
|
|
6673
|
+
let selfInflictedStreak = 0;
|
|
6674
|
+
let selfInflictedSuppressedMs = 0;
|
|
6511
6675
|
touchEventLoopHeartbeat();
|
|
6512
6676
|
const lagTimer = setInterval(() => {
|
|
6513
6677
|
touchEventLoopHeartbeat();
|
|
6514
|
-
const
|
|
6678
|
+
const wallElapsedMs = monotonicElapsedMs(lastTick);
|
|
6679
|
+
const lag = wallElapsedMs - 2e3;
|
|
6680
|
+
const cpuDelta = process.cpuUsage(lastCpu);
|
|
6681
|
+
lastCpu = process.cpuUsage();
|
|
6682
|
+
const selfCpuBusyFraction = wallElapsedMs > 0 ? (cpuDelta.user + cpuDelta.system) / 1e3 / wallElapsedMs : 0;
|
|
6515
6683
|
const clockJump = looksLikeClockJump(clockProbe);
|
|
6516
6684
|
lastTick = monotonicNowMs();
|
|
6517
6685
|
clockProbe = captureClockProbe();
|
|
6518
6686
|
setEventLoopLagMs(clockJump ? 0 : Math.max(0, lag));
|
|
6519
6687
|
if (clockJump) {
|
|
6520
6688
|
consecutiveSevereBlocks = 0;
|
|
6689
|
+
selfInflictedStreak = 0;
|
|
6690
|
+
selfInflictedSuppressedMs = 0;
|
|
6521
6691
|
try {
|
|
6522
6692
|
unlinkSync2(path3.join(os2.homedir(), ".exe-os", "session-cache", "event-loop-blocked.marker"));
|
|
6523
6693
|
} catch {
|
|
@@ -6529,7 +6699,7 @@ function startEventLoopLagDetector() {
|
|
|
6529
6699
|
const msg = `[exed] EVENT LOOP BLOCKED ${(lag / 1e3).toFixed(1)}s \u2014 MCP UNRESPONSIVE. Sessions will die.`;
|
|
6530
6700
|
process.stderr.write(msg + "\n");
|
|
6531
6701
|
logDaemonHealth({ event: "event_loop_blocked", pid: process.pid, message: msg, data: { lagMs: lag } });
|
|
6532
|
-
void import("../orchestration-events-
|
|
6702
|
+
void import("../orchestration-events-5SIJOE4H.js").then(({ recordOrchestrationEventBestEffort: recordOE }) => {
|
|
6533
6703
|
recordOE({ eventType: "daemon.event_loop_blocked", source: "exe-daemon.lagDetector", severity: "error", durationMs: lag });
|
|
6534
6704
|
}).catch(() => {
|
|
6535
6705
|
});
|
|
@@ -6553,6 +6723,7 @@ function startEventLoopLagDetector() {
|
|
|
6553
6723
|
const load1m = os2.loadavg()[0] ?? 0;
|
|
6554
6724
|
const cpuCount = os2.cpus().length || 1;
|
|
6555
6725
|
const starvationRatio = parseFloat(process.env.EXE_STARVATION_LOAD_RATIO ?? "1.5");
|
|
6726
|
+
const catchUpActive = inBootCatchUpGrace();
|
|
6556
6727
|
const decision = decideDaemonSelfHeal({
|
|
6557
6728
|
lagMs: lag,
|
|
6558
6729
|
load1m,
|
|
@@ -6562,9 +6733,21 @@ function startEventLoopLagDetector() {
|
|
|
6562
6733
|
severeThresholdMs: SELF_HEAL_THRESHOLD_MS,
|
|
6563
6734
|
consecutiveSevere: consecutiveSevereBlocks,
|
|
6564
6735
|
consecutiveLimit: SELF_HEAL_CONSECUTIVE,
|
|
6565
|
-
processAlive: true
|
|
6736
|
+
processAlive: true,
|
|
6737
|
+
// Bug ddbfc3f6: self-CPU + boot-grace signals so the watchdog can tell a
|
|
6738
|
+
// self-inflicted single-core block (let it drain) from a genuine wedge.
|
|
6739
|
+
selfCpuBusyFraction,
|
|
6740
|
+
selfCpuBusyRatio: SELF_CPU_BUSY_RATIO,
|
|
6741
|
+
catchUpActive,
|
|
6742
|
+
// FIX 1: thread the self-inflicted ceiling accumulators.
|
|
6743
|
+
selfInflictedStreak,
|
|
6744
|
+
selfInflictedSuppressedMs,
|
|
6745
|
+
selfInflictedLimit: SELF_INFLICTED_LIMIT,
|
|
6746
|
+
selfInflictedSuppressCapMs: SELF_INFLICTED_SUPPRESS_CAP_MS
|
|
6566
6747
|
});
|
|
6567
6748
|
consecutiveSevereBlocks = decision.consecutiveSevereAfter;
|
|
6749
|
+
selfInflictedStreak = decision.selfInflictedStreakAfter;
|
|
6750
|
+
selfInflictedSuppressedMs = decision.selfInflictedSuppressedMsAfter;
|
|
6568
6751
|
if (decision.reason === "starved_backoff") {
|
|
6569
6752
|
process.stderr.write(
|
|
6570
6753
|
`[exed] SELF-HEAL SUPPRESSED: load=${load1m.toFixed(2)} cpus=${cpuCount} \u2014 lag is CPU starvation, not internal hang. Skipping restart.
|
|
@@ -6578,8 +6761,41 @@ function startEventLoopLagDetector() {
|
|
|
6578
6761
|
});
|
|
6579
6762
|
return;
|
|
6580
6763
|
}
|
|
6764
|
+
if (decision.reason === "catchup_backoff") {
|
|
6765
|
+
process.stderr.write(
|
|
6766
|
+
`[exed] SELF-HEAL SUPPRESSED: boot/catch-up grace active (${Math.ceil((_bootCatchUpUntilMs - Date.now()) / 1e3)}s left) \u2014 lag=${(lag / 1e3).toFixed(1)}s during boot; skipping restart.
|
|
6767
|
+
`
|
|
6768
|
+
);
|
|
6769
|
+
logDaemonHealth({
|
|
6770
|
+
event: "self_heal_suppressed_starvation",
|
|
6771
|
+
pid: process.pid,
|
|
6772
|
+
message: `boot/catch-up grace \u2014 restart skipped (lag=${(lag / 1e3).toFixed(1)}s)`,
|
|
6773
|
+
data: { lagMs: lag, reason: "catchup_backoff", selfCpuBusyFraction }
|
|
6774
|
+
});
|
|
6775
|
+
return;
|
|
6776
|
+
}
|
|
6777
|
+
if (decision.reason === "self_inflicted_backoff") {
|
|
6778
|
+
process.stderr.write(
|
|
6779
|
+
`[exed] SELF-HEAL SUPPRESSED: self-inflicted block \u2014 daemon busy ${(selfCpuBusyFraction * 100).toFixed(0)}% of a ${(wallElapsedMs / 1e3).toFixed(1)}s window on its own work (load=${load1m.toFixed(2)}/${cpuCount}); letting it drain [streak ${selfInflictedStreak}/${SELF_INFLICTED_LIMIT}, suppressed ${(selfInflictedSuppressedMs / 1e3).toFixed(0)}s/${SELF_INFLICTED_SUPPRESS_CAP_MS / 1e3}s].
|
|
6780
|
+
`
|
|
6781
|
+
);
|
|
6782
|
+
logDaemonHealth({
|
|
6783
|
+
event: "self_heal_suppressed_starvation",
|
|
6784
|
+
pid: process.pid,
|
|
6785
|
+
message: `self-inflicted block \u2014 busy ${(selfCpuBusyFraction * 100).toFixed(0)}% of window \u2014 restart skipped (streak ${selfInflictedStreak}/${SELF_INFLICTED_LIMIT})`,
|
|
6786
|
+
data: { lagMs: lag, load1m, cpuCount, reason: "self_inflicted_backoff", selfCpuBusyFraction, selfInflictedStreak, selfInflictedSuppressedMs }
|
|
6787
|
+
});
|
|
6788
|
+
return;
|
|
6789
|
+
}
|
|
6581
6790
|
if (decision.restart && decision.reason === "single_block") {
|
|
6582
6791
|
const healMsg = `[exed] SELF-HEAL: Single block ${(lag / 1e3).toFixed(0)}s exceeds ${SELF_HEAL_SINGLE_MS / 1e3}s \u2014 WAL-safe restart.`;
|
|
6792
|
+
if (selfHealRestartOnCooldown()) {
|
|
6793
|
+
const suppressMsg = `${healMsg} Suppressed by restart cooldown (${Math.ceil((SELF_HEAL_RESTART_COOLDOWN_MS - (Date.now() - _lastSelfHealShutdownAtMs)) / 1e3)}s remaining).`;
|
|
6794
|
+
process.stderr.write(suppressMsg + "\n");
|
|
6795
|
+
logDaemonHealth({ event: "self_heal_suppressed_cooldown", pid: process.pid, message: suppressMsg, data: { lagMs: lag, reason: "single_block" } });
|
|
6796
|
+
return;
|
|
6797
|
+
}
|
|
6798
|
+
_lastSelfHealShutdownAtMs = Date.now();
|
|
6583
6799
|
process.stderr.write(healMsg + "\n");
|
|
6584
6800
|
logDaemonHealth({ event: "self_heal_restart", pid: process.pid, message: healMsg, data: { lagMs: lag, reason: "single_block" } });
|
|
6585
6801
|
void shutdown(75);
|
|
@@ -6587,6 +6803,13 @@ function startEventLoopLagDetector() {
|
|
|
6587
6803
|
}
|
|
6588
6804
|
if (decision.restart && decision.reason === "consecutive_blocks") {
|
|
6589
6805
|
const healMsg = `[exed] SELF-HEAL: ${consecutiveSevereBlocks} consecutive blocks >${SELF_HEAL_THRESHOLD_MS / 1e3}s \u2014 WAL-safe restart.`;
|
|
6806
|
+
if (selfHealRestartOnCooldown()) {
|
|
6807
|
+
const suppressMsg = `${healMsg} Suppressed by restart cooldown (${Math.ceil((SELF_HEAL_RESTART_COOLDOWN_MS - (Date.now() - _lastSelfHealShutdownAtMs)) / 1e3)}s remaining).`;
|
|
6808
|
+
process.stderr.write(suppressMsg + "\n");
|
|
6809
|
+
logDaemonHealth({ event: "self_heal_suppressed_cooldown", pid: process.pid, message: suppressMsg, data: { lagMs: lag, reason: "consecutive_blocks", count: consecutiveSevereBlocks } });
|
|
6810
|
+
return;
|
|
6811
|
+
}
|
|
6812
|
+
_lastSelfHealShutdownAtMs = Date.now();
|
|
6590
6813
|
process.stderr.write(healMsg + "\n");
|
|
6591
6814
|
logDaemonHealth({ event: "self_heal_restart", pid: process.pid, message: healMsg, data: { lagMs: lag, reason: "consecutive_blocks", count: consecutiveSevereBlocks } });
|
|
6592
6815
|
void shutdown(75);
|
|
@@ -6596,8 +6819,12 @@ function startEventLoopLagDetector() {
|
|
|
6596
6819
|
process.stderr.write(`[exed] Event loop lag: ${(lag / 1e3).toFixed(1)}s (warn threshold: ${LAG_WARN_MS / 1e3}s)
|
|
6597
6820
|
`);
|
|
6598
6821
|
consecutiveSevereBlocks = 0;
|
|
6822
|
+
selfInflictedStreak = 0;
|
|
6823
|
+
selfInflictedSuppressedMs = 0;
|
|
6599
6824
|
} else {
|
|
6600
6825
|
consecutiveSevereBlocks = 0;
|
|
6826
|
+
selfInflictedStreak = 0;
|
|
6827
|
+
selfInflictedSuppressedMs = 0;
|
|
6601
6828
|
writeDaemonReady({ pid: process.pid, port: _boundMcpPort });
|
|
6602
6829
|
}
|
|
6603
6830
|
}, 2e3);
|
|
@@ -6656,7 +6883,7 @@ function startTaskFileResync() {
|
|
|
6656
6883
|
});
|
|
6657
6884
|
if (Number(res.rowsAffected ?? 0) > 0) {
|
|
6658
6885
|
synced++;
|
|
6659
|
-
void import("../orchestration-events-
|
|
6886
|
+
void import("../orchestration-events-5SIJOE4H.js").then(({ recordOrchestrationEventBestEffort: recordOE }) => {
|
|
6660
6887
|
recordOE({
|
|
6661
6888
|
eventType: "task_file.resynced",
|
|
6662
6889
|
source: "exe-daemon.taskFileResync",
|
|
@@ -6693,7 +6920,7 @@ function startTaskGroupBarriers() {
|
|
|
6693
6920
|
fired("task_group_barriers");
|
|
6694
6921
|
if (!await ensureStoreForPolling()) return;
|
|
6695
6922
|
try {
|
|
6696
|
-
const { pollTaskGroupBarriers } = await import("../daemon-orchestration-
|
|
6923
|
+
const { pollTaskGroupBarriers } = await import("../daemon-orchestration-7QB6QOXT.js");
|
|
6697
6924
|
const firedCount = await pollTaskGroupBarriers();
|
|
6698
6925
|
if (firedCount > 0) {
|
|
6699
6926
|
acted("task_group_barriers");
|
|
@@ -6715,7 +6942,7 @@ function startCheckpointGc() {
|
|
|
6715
6942
|
fired("checkpoint_gc");
|
|
6716
6943
|
if (!await ensureStoreForPolling()) return;
|
|
6717
6944
|
try {
|
|
6718
|
-
const { gcStaleCheckpoints } = await import("../daemon-orchestration-
|
|
6945
|
+
const { gcStaleCheckpoints } = await import("../daemon-orchestration-7QB6QOXT.js");
|
|
6719
6946
|
const cleared = await gcStaleCheckpoints();
|
|
6720
6947
|
if (cleared > 0) {
|
|
6721
6948
|
acted("checkpoint_gc");
|
|
@@ -6755,14 +6982,14 @@ function startDispatchAckCleanup() {
|
|
|
6755
6982
|
function startProjectionWorkerDeferred() {
|
|
6756
6983
|
setTimeout(async () => {
|
|
6757
6984
|
try {
|
|
6758
|
-
const { startProjectionWorker } = await import("../projection-worker-
|
|
6985
|
+
const { startProjectionWorker } = await import("../projection-worker-ZVOFHTXT.js");
|
|
6759
6986
|
startProjectionWorker();
|
|
6760
6987
|
} catch {
|
|
6761
6988
|
}
|
|
6762
6989
|
}, 2e4);
|
|
6763
6990
|
}
|
|
6764
6991
|
async function startToolTelemetry() {
|
|
6765
|
-
const { startToolTelemetryFlush } = await import("../tool-telemetry-
|
|
6992
|
+
const { startToolTelemetryFlush } = await import("../tool-telemetry-ULIDUK3P.js");
|
|
6766
6993
|
startToolTelemetryFlush();
|
|
6767
6994
|
process.stderr.write("[exed] Tool telemetry started (flush every 5m)\n");
|
|
6768
6995
|
}
|
|
@@ -6927,7 +7154,7 @@ function startLocalFirstTimers() {
|
|
|
6927
7154
|
fired("orphan_task_cleanup");
|
|
6928
7155
|
try {
|
|
6929
7156
|
if (!await ensureStoreForPolling()) return;
|
|
6930
|
-
const { cleanOrphanedTaskFiles } = await import("../tasks-crud-
|
|
7157
|
+
const { cleanOrphanedTaskFiles } = await import("../tasks-crud-UGK5A25L.js");
|
|
6931
7158
|
const count = await cleanOrphanedTaskFiles();
|
|
6932
7159
|
if (count > 0) {
|
|
6933
7160
|
acted("orphan_task_cleanup");
|
|
@@ -6943,7 +7170,7 @@ function startLocalFirstTimers() {
|
|
|
6943
7170
|
fired("task_file_consistency");
|
|
6944
7171
|
try {
|
|
6945
7172
|
if (!await ensureStoreForPolling()) return;
|
|
6946
|
-
const { checkTaskFileConsistency } = await import("../tasks-crud-
|
|
7173
|
+
const { checkTaskFileConsistency } = await import("../tasks-crud-UGK5A25L.js");
|
|
6947
7174
|
const mismatches = await checkTaskFileConsistency();
|
|
6948
7175
|
if (mismatches > 0) {
|
|
6949
7176
|
acted("task_file_consistency");
|
|
@@ -6962,7 +7189,7 @@ function startLocalFirstTimers() {
|
|
|
6962
7189
|
const TELEMETRY_DAILY_MS = 24 * 60 * 60 * 1e3;
|
|
6963
7190
|
const telemetryDaily = async () => {
|
|
6964
7191
|
try {
|
|
6965
|
-
const { sendTelemetry, isTelemetryEnabled } = await import("../telemetry-upload-
|
|
7192
|
+
const { sendTelemetry, isTelemetryEnabled } = await import("../telemetry-upload-7LBYGPCB.js");
|
|
6966
7193
|
if (!isTelemetryEnabled()) return;
|
|
6967
7194
|
const { upstream } = await sendTelemetry(24);
|
|
6968
7195
|
if (upstream.startsWith("sent")) {
|