@askexenow/exe-os 0.9.322 → 0.9.324
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/deploy/compose/.env.customer.example +1 -1
- package/deploy/compose/.env.example +18 -1
- package/deploy/compose/PROTECTED_FILES.md +4 -1
- package/deploy/compose/add-routes.sh +22 -0
- package/deploy/compose/cloudflared/config.yml.example +6 -3
- package/deploy/compose/docker-compose.yml +36 -1
- package/deploy/compose/generate-env.ts +40 -2
- package/deploy/compose/sso-edge/default.conf.template +11 -0
- package/deploy/compose/sso-edge/sso-redirect.conf +90 -21
- package/deploy/stack-manifests/v0.9.json +110 -2
- package/dist/{active-agent-M5NJFEBM.js → active-agent-CVSB2EER.js} +3 -3
- package/dist/{active-agent-SHM4QSRJ.js → active-agent-IUVRZOSF.js} +3 -3
- package/dist/{agentic-ontology-HQKCU7LG.js → agentic-ontology-2QFPBIQP.js} +1 -1
- package/dist/backfill-gate-J7UXFNXU.js +19 -0
- package/dist/{backfill-metadata-CXWFCTBO.js → backfill-metadata-W3PRQPVV.js} +4 -4
- package/dist/{behaviors-J47D342W.js → behaviors-MQCADHAD.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 +11 -11
- package/dist/bin/backfill-responses.js +11 -11
- package/dist/bin/backfill-vectors.js +102 -22
- package/dist/bin/bulk-sync-postgres.js +14 -14
- package/dist/bin/cc-doctor.js +5 -5
- package/dist/bin/cleanup-stale-review-tasks.js +20 -13
- package/dist/bin/cli.js +28 -31
- package/dist/bin/customer-readiness.js +1 -0
- package/dist/bin/deferred-daemon-restart.js +80 -77
- package/dist/bin/exe-agent-config.js +3 -3
- package/dist/bin/exe-agent.js +5 -5
- package/dist/bin/exe-assign.js +10 -10
- package/dist/bin/exe-boot.js +32 -23
- package/dist/bin/exe-call.js +5 -5
- package/dist/bin/exe-cloud.js +120 -47
- package/dist/bin/exe-config-dump.js +3 -3
- package/dist/bin/exe-dispatch.js +48 -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 +8 -8
- package/dist/bin/exe-healthcheck.js +17 -8
- package/dist/bin/exe-heartbeat.js +20 -13
- package/dist/bin/exe-kill.js +23 -16
- package/dist/bin/exe-launch-agent.js +30 -27
- package/dist/bin/exe-new-employee.js +9 -9
- package/dist/bin/exe-pending-messages.js +21 -14
- package/dist/bin/exe-pending-notifications.js +20 -13
- package/dist/bin/exe-pending-reviews.js +20 -13
- package/dist/bin/exe-rename.js +5 -5
- package/dist/bin/exe-review.js +22 -15
- package/dist/bin/exe-search.js +8 -13
- package/dist/bin/exe-session-cleanup.js +39 -22
- package/dist/bin/exe-settings.js +15 -15
- package/dist/bin/exe-start-codex.js +51 -34
- package/dist/bin/exe-start-opencode.js +8 -8
- package/dist/bin/exe-status.js +21 -14
- package/dist/bin/exe-support.js +3 -3
- package/dist/bin/exe-team.js +3 -3
- package/dist/bin/exe-watchdog.js +278 -39
- package/dist/bin/git-sweep.js +21 -14
- package/dist/bin/graph-backfill.js +4 -4
- package/dist/bin/graph-export.js +5 -5
- package/dist/bin/import-history.js +7 -7
- package/dist/bin/install-launchd.js +2 -2
- package/dist/bin/install.js +121 -88
- 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 +2 -2
- package/dist/bin/postgres-agentic-semantic-backfill.js +1 -1
- package/dist/bin/pre-publish.js +1 -1
- package/dist/bin/registry-proxy.js +1 -1
- package/dist/bin/scan-tasks.js +20 -13
- package/dist/bin/setup.js +1 -1
- package/dist/bin/shard-migrate.js +4 -4
- package/dist/bin/stack-update.js +4 -4
- package/dist/bin/vps-health-gate.js +1 -1
- package/dist/{capability-cards-H7H3MU74.js → capability-cards-STD3NMCR.js} +2 -2
- package/dist/{capacity-monitor-WAEHVBL7.js → capacity-monitor-6O3PWYNM.js} +21 -14
- package/dist/{catchup-brief-L42STIDR.js → catchup-brief-EDQ3VZCF.js} +23 -16
- package/dist/{chunk-HKSJSW2V.js → chunk-2E2NKFXK.js} +1 -1
- package/dist/{chunk-NYFPFOYM.js → chunk-2NY7LZT7.js} +1 -1
- package/dist/{chunk-DGFIXJ4S.js → chunk-2QD5M47V.js} +3 -3
- package/dist/{chunk-3M73L663.js → chunk-2YWUZPHE.js} +2 -2
- package/dist/{chunk-LB77CSLO.js → chunk-2ZW4AQ24.js} +3 -3
- package/dist/{chunk-E32KARET.js → chunk-376J36IW.js} +4 -4
- package/dist/{chunk-CWQAXO3O.js → chunk-5RACW3LX.js} +28 -3
- package/dist/{chunk-VSXGFHJY.js → chunk-5VT45EV6.js} +1 -1
- package/dist/{chunk-X62GD6QW.js → chunk-5YCOEPEX.js} +2 -2
- package/dist/{chunk-TKBWBHFV.js → chunk-6FWMLTF2.js} +1 -1
- package/dist/chunk-6IWLAQ7O.js +40 -0
- package/dist/{chunk-WFHYAKEU.js → chunk-6XAAJ5OV.js} +1 -1
- package/dist/{chunk-4Z47UMMM.js → chunk-7M6TXYRQ.js} +23 -23
- package/dist/{chunk-HWC5W34K.js → chunk-7PLMYXPG.js} +1 -1
- package/dist/{chunk-DDKDN4HV.js → chunk-A47MXY2I.js} +7 -0
- package/dist/{chunk-SQ5JWDJ2.js → chunk-AEFZEJKW.js} +1 -1
- package/dist/{chunk-657AQEPY.js → chunk-AVKZIG4A.js} +1 -1
- package/dist/{chunk-EPBB2OD3.js → chunk-BB5IKY7B.js} +2 -2
- package/dist/{chunk-3JW3ZXCP.js → chunk-BC7IIR3A.js} +65 -39
- package/dist/{chunk-WSYKLS2Y.js → chunk-BDJQWBWF.js} +3 -3
- package/dist/{chunk-VY7345RO.js → chunk-BMSAJ2IH.js} +1 -1
- package/dist/{chunk-OI63OVCR.js → chunk-C7B44DJI.js} +1 -1
- package/dist/{chunk-GA76RGSP.js → chunk-CS6MYGNB.js} +5 -5
- package/dist/{chunk-6N4LYEDI.js → chunk-CSPHV5DJ.js} +1 -1
- package/dist/{chunk-HGM6NZQH.js → chunk-DYUISOIT.js} +1 -1
- package/dist/{signal-paths-4GOIRLGH.js → chunk-EIKATSE4.js} +3 -4
- package/dist/{chunk-G5TP2D2U.js → chunk-EWDTTTZP.js} +3 -3
- package/dist/{chunk-TI6YX3L5.js → chunk-F2RK5YWB.js} +36 -27
- package/dist/{chunk-HV5CUDOE.js → chunk-F6TJIWN5.js} +1 -1
- package/dist/{chunk-WCCR5IFR.js → chunk-FPTBCPI3.js} +2 -2
- package/dist/{chunk-QVFJCFNM.js → chunk-FROUDYRT.js} +33 -2
- package/dist/{chunk-T6AUMO5X.js → chunk-GIFDGNIL.js} +1 -1
- package/dist/{chunk-OFR7KQ37.js → chunk-HAYDXMW6.js} +3 -3
- package/dist/{chunk-V2ESQU3S.js → chunk-HBKYKN3S.js} +3 -3
- package/dist/{chunk-LCZ55G5G.js → chunk-HZ5J2GFE.js} +136 -66
- package/dist/{chunk-EOPSIIEH.js → chunk-ID3V4BWS.js} +1 -1
- package/dist/{chunk-ABGDTMKC.js → chunk-JRD7ARQ6.js} +60 -2
- package/dist/{chunk-7FBPLVHM.js → chunk-KADUJ7PE.js} +3 -3
- package/dist/{chunk-KLG53B63.js → chunk-KJOQLNX2.js} +1 -1
- package/dist/{chunk-AZL3EUR3.js → chunk-KK67DSCO.js} +229 -29
- package/dist/{chunk-H2SD2EA7.js → chunk-KLDQFOFY.js} +23 -9
- package/dist/chunk-KPIN44GZ.js +67 -0
- package/dist/{chunk-PLBDXCYZ.js → chunk-KUJGADX6.js} +1491 -606
- package/dist/{chunk-GN3IWZDH.js → chunk-KWWHRJGG.js} +660 -539
- package/dist/{chunk-ERSFOJGC.js → chunk-LUOQCGBO.js} +20 -11
- package/dist/{chunk-CXXERHNC.js → chunk-LWAGAC3H.js} +1 -1
- package/dist/{chunk-7BZ6TOZN.js → chunk-MB2YT5VQ.js} +3 -3
- package/dist/{chunk-KXP3CUTL.js → chunk-MCEXBLLK.js} +3 -3
- package/dist/{chunk-A3KUGBDP.js → chunk-MIWPKWXQ.js} +1 -1
- package/dist/{chunk-7CUF27OT.js → chunk-MKIFYIXC.js} +1 -1
- package/dist/{chunk-ONKIWA3R.js → chunk-ML4S5SHZ.js} +3 -1
- package/dist/{chunk-BFHBHQFA.js → chunk-MWIX3YKA.js} +5 -5
- package/dist/{chunk-6UQRJCKK.js → chunk-NBDTQVWU.js} +2 -2
- package/dist/{chunk-KK4ZOYXJ.js → chunk-NGACCR2M.js} +80 -40
- package/dist/{chunk-CMDC5D7S.js → chunk-NLEW62VC.js} +6 -0
- package/dist/{chunk-QYLDCPNG.js → chunk-PGFYWVOB.js} +1 -1
- package/dist/{chunk-XEBN5CPD.js → chunk-PGUISLOT.js} +3 -3
- package/dist/{chunk-MYMA23KC.js → chunk-PJTEZLAM.js} +1 -1
- package/dist/{chunk-QNUHDEPI.js → chunk-POOMY3CS.js} +4 -4
- package/dist/{chunk-2GBGIXKH.js → chunk-PV7IG4V6.js} +1 -1
- package/dist/{chunk-SENJA7BZ.js → chunk-QDI77B3E.js} +54 -7
- package/dist/{chunk-XLNF3CIO.js → chunk-QGOMYIVT.js} +119 -24
- package/dist/{chunk-HIOO7DZ2.js → chunk-QQFZ32WS.js} +5 -5
- package/dist/{chunk-KL5WYWS3.js → chunk-SOXUF34Y.js} +2 -2
- package/dist/{chunk-6XM6PZXQ.js → chunk-SPO2RLOB.js} +1 -1
- package/dist/{chunk-ROMB2HH4.js → chunk-T3XHH5FE.js} +6 -6
- package/dist/{chunk-6SXJZHRJ.js → chunk-TA3A4UQL.js} +1 -1
- package/dist/{chunk-XP53WEXP.js → chunk-TGVKQ3QB.js} +3 -3
- package/dist/{chunk-XC7C3GQ2.js → chunk-TNS6U2K7.js} +30 -19
- package/dist/{chunk-JXEMAB4M.js → chunk-UAIMI7CK.js} +1 -1
- package/dist/{chunk-YIFZZYQD.js → chunk-UBYAKNRF.js} +2 -2
- package/dist/{chunk-6IBUQBMY.js → chunk-UXYQLOFW.js} +198 -39
- package/dist/{chunk-C4BIZXKB.js → chunk-UYOW7U24.js} +1 -1
- package/dist/{chunk-NFM6VHL7.js → chunk-V4VYIHSL.js} +1 -1
- package/dist/{chunk-QQOH3I4A.js → chunk-VDUHWQFA.js} +1 -1
- package/dist/{chunk-EVUXF2G4.js → chunk-W5GBB23I.js} +1 -1
- package/dist/{chunk-FANIBYUO.js → chunk-WF3J6GJZ.js} +2 -2
- package/dist/{chunk-NAHAOFTY.js → chunk-WGHTISNK.js} +3 -3
- package/dist/{chunk-F5FAD2YR.js → chunk-WGOAILWE.js} +2 -2
- package/dist/{chunk-LOE2N23P.js → chunk-WJICX53Z.js} +1 -1
- package/dist/{skill-refinement-YLIAY7V4.js → chunk-Y2KBHLEO.js} +3 -11
- package/dist/{chunk-PISGLNV7.js → chunk-Y34FDPOY.js} +5 -5
- package/dist/{chunk-ORC5AO7E.js → chunk-YBHOWK3L.js} +2 -2
- package/dist/{chunk-7SDS5VCL.js → chunk-ZDNJ3TSB.js} +7 -7
- package/dist/{chunk-CHSRSESS.js → chunk-ZRZ2Z6RZ.js} +1 -1
- package/dist/{cleanup-graph-garbage-MX5JDTJA.js → cleanup-graph-garbage-2YH52ADR.js} +4 -4
- package/dist/{co-activation-K44LGZ7A.js → co-activation-7F3J2GC7.js} +2 -2
- package/dist/{co-occurrence-N62HJTRP.js → co-occurrence-B36Q5GY3.js} +2 -2
- package/dist/{code-context-index-6YQ3DGCN.js → code-context-index-2PUBBQOE.js} +3 -3
- package/dist/{crdt-sync-BO76VVRX.js → crdt-sync-MXHPR6V6.js} +1 -1
- package/dist/{crm-bridge-BVTB6LZK.js → crm-bridge-CZLEW2LW.js} +1 -1
- package/dist/{crm-webhook-UZLTHXAS.js → crm-webhook-56MWGMRY.js} +2 -2
- package/dist/{cto-delegation-gate-NVMRONA2.js → cto-delegation-gate-26BD7NEE.js} +19 -12
- package/dist/{daemon-orchestration-JI3RD5EZ.js → daemon-orchestration-IBP6PWEG.js} +31 -16
- package/dist/{db-backup-ITRADB2J.js → db-backup-XLID57KW.js} +1 -1
- package/dist/{doc-graph-extractor-L7YESUSI.js → doc-graph-extractor-VBZ6XTTE.js} +2 -2
- package/dist/{documents-7BFXA6V3.js → documents-C5LYSJT3.js} +10 -10
- package/dist/{dreaming-NRTMPNPZ.js → dreaming-LMVDIC5C.js} +20 -13
- package/dist/{exe-drift-GLJIM7EI.js → exe-drift-T3K6WA47.js} +3 -3
- package/dist/{exe-export-THIAYHXK.js → exe-export-QCTASWXI.js} +7 -7
- package/dist/{exe-import-3Y4VOUYL.js → exe-import-WNP5A7VA.js} +7 -7
- package/dist/{exe-key-IPGY4RMU.js → exe-key-JM3JXE2E.js} +78 -75
- package/dist/{exe-snapshot-2ZEWCDYK.js → exe-snapshot-ODDJUEM5.js} +23 -16
- package/dist/{fast-db-init-TLYUWCDE.js → fast-db-init-O6A3TK3F.js} +1 -1
- package/dist/{founder-context-J362DNU4.js → founder-context-FYTF4IMD.js} +2 -2
- package/dist/gateway/index.js +9 -9
- package/dist/{git-staleness-BRDHTHNS.js → git-staleness-YA5J6VYJ.js} +2 -2
- package/dist/{global-procedures-FNUKY2LF.js → global-procedures-76NDWTYN.js} +4 -4
- package/dist/{graph-auto-extract-AJZUV3PO.js → graph-auto-extract-I7QL2TY5.js} +2 -2
- package/dist/hooks/bug-report-worker.js +22 -15
- package/dist/hooks/codex-stop-task-finalizer.js +22 -15
- package/dist/hooks/commit-complete.js +22 -15
- package/dist/hooks/error-recall.js +6 -6
- package/dist/hooks/exe-heartbeat-hook.js +3 -3
- package/dist/hooks/ingest-worker.js +6 -6
- package/dist/hooks/ingest.js +6 -6
- package/dist/hooks/instructions-loaded.js +4 -4
- package/dist/hooks/manifest.json +20 -20
- package/dist/hooks/notification.js +4 -4
- package/dist/hooks/post-compact.js +21 -14
- package/dist/hooks/post-tool-combined.js +8 -8
- package/dist/hooks/pre-compact.js +22 -21
- package/dist/hooks/pre-tool-use.js +29 -19
- package/dist/hooks/prompt-submit.js +89 -72
- package/dist/hooks/session-end.js +27 -26
- package/dist/hooks/session-start.js +13 -13
- package/dist/hooks/stop.js +28 -21
- package/dist/hooks/subagent-stop.js +24 -41
- package/dist/hooks/summary-worker.js +27 -25
- package/dist/index.js +30 -23
- package/dist/{installer-SC7CQBYY.js → installer-3EYHBKWB.js} +5 -5
- package/dist/{installer-UEF44TWQ.js → installer-3VZMDDMJ.js} +5 -5
- package/dist/{installer-2EKTDQZB.js → installer-GYABVCB7.js} +5 -5
- package/dist/intercom-queue-ZCNT4LYU.js +53 -0
- package/dist/lib/agent-config.js +7 -1
- package/dist/lib/cloud-sync.js +16 -14
- package/dist/lib/consolidation.js +5 -5
- package/dist/lib/database.js +10 -2
- package/dist/lib/db-daemon-client.js +3 -3
- package/dist/lib/db.js +10 -2
- package/dist/lib/device-registry.js +1 -1
- package/dist/lib/embed-worker.js +28 -0
- package/dist/lib/embedder.js +3 -3
- package/dist/lib/employee-templates.js +5 -5
- package/dist/lib/employees.js +2 -2
- package/dist/lib/exe-daemon-client.js +2 -2
- package/dist/lib/exe-daemon.js +393 -140
- 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 +20 -13
- 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 +6 -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 +21 -14
- package/dist/lib/tmux-routing.js +29 -12
- package/dist/lib/token-spend.js +3 -3
- package/dist/{license-gate-YUUSIPJ7.js → license-gate-73XGUIVP.js} +3 -3
- package/dist/{license-sync-LX73IEBH.js → license-sync-CG5YRUVH.js} +2 -2
- package/dist/mcp/register-tools.js +75 -72
- package/dist/mcp/server.js +96 -130
- 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 +37 -18
- 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 +23 -16
- package/dist/mcp/tools/send-message.js +22 -15
- package/dist/mcp/tools/update-task.js +22 -15
- package/dist/{mcp-http-config-MBG5AQNH.js → mcp-http-config-TT7PXZLX.js} +3 -3
- package/dist/{memory-cards-MGZ4P3AA.js → memory-cards-6NGUDUDN.js} +4 -4
- package/dist/{memory-graph-extractor-44P2ATID.js → memory-graph-extractor-FIMS3VQR.js} +3 -3
- package/dist/{memory-poisoning-defense-3CYFKNLA.js → memory-poisoning-defense-M3LOQ3XU.js} +2 -2
- package/dist/{memory-pressure-watchdog-6PFLEOUO.js → memory-pressure-watchdog-45GABDWH.js} +20 -13
- package/dist/{memory-queue-client-BZD6MXA5.js → memory-queue-client-BDYKFNB4.js} +3 -3
- package/dist/{memory-reflection-AYPJRPU7.js → memory-reflection-LANCFYK2.js} +7 -9
- package/dist/{notifications-BBQ23ORD.js → notifications-N5NKUYAU.js} +19 -12
- package/dist/{orchestration-events-O5P5NEKS.js → orchestration-events-KVNRNIPR.js} +3 -3
- package/dist/{orchestrator-SERM6FDY.js → orchestrator-VTF5BR26.js} +21 -14
- package/dist/{pipeline-router-T673WGL3.js → pipeline-router-KQAYWDPH.js} +3 -3
- package/dist/{plan-limits-QWBN2EKH.js → plan-limits-EUZI4X5W.js} +5 -5
- package/dist/{projection-worker-K6TILAZH.js → projection-worker-FG6G226D.js} +12 -2
- package/dist/{prospective-memory-XRNRMEDL.js → prospective-memory-FVDNUSIL.js} +2 -2
- package/dist/{reranker-3XC5UM4F.js → reranker-54Q3L32E.js} +1 -1
- package/dist/{retrieval-health-ULVVOIPL.js → retrieval-health-YJ7CXYVD.js} +1 -1
- package/dist/{review-polling-5YGDPJUX.js → review-polling-TKXYSXH6.js} +20 -13
- package/dist/runtime/index.js +23 -16
- package/dist/{session-events-D52HNUJK.js → session-events-WQHTP65R.js} +20 -13
- package/dist/{session-kill-telemetry-IBNCJSI7.js → session-kill-telemetry-2HSE7IGH.js} +20 -13
- package/dist/{session-scope-5FWZ4AYR.js → session-scope-RBKAC75W.js} +19 -12
- package/dist/{setup-wizard-KVTLSSRD.js → setup-wizard-AA6ZV57H.js} +1 -1
- package/dist/signal-paths-4G53QTII.js +11 -0
- package/dist/skill-refinement-QI35LMTZ.js +20 -0
- package/dist/{stack-update-OWWGTYRB.js → stack-update-BE6PX4AG.js} +9 -3
- package/dist/{steward-gate-3ZITRYVH.js → steward-gate-2XD5BXH6.js} +3 -3
- package/dist/{support-outbox-QPQQK7F7.js → support-outbox-MGUVVGHT.js} +96 -44
- package/dist/sweep-budget-WB2FKPYN.js +64 -0
- package/dist/{task-enforcement-L4YTDOOX.js → task-enforcement-DMOCBRLB.js} +191 -17
- package/dist/{task-scope-OIHLMQOQ.js → task-scope-ULBNFBFH.js} +25 -12
- package/dist/{tasks-crud-QUIIRWE3.js → tasks-crud-6SJOKES5.js} +25 -12
- package/dist/{tasks-notify-ANYLB5GU.js → tasks-notify-TESRABUM.js} +20 -13
- package/dist/{tasks-review-BWSCXFMB.js → tasks-review-INDAGLWJ.js} +27 -14
- package/dist/{telemetry-upload-XLDBCD7B.js → telemetry-upload-6XB3Q3IH.js} +7 -7
- package/dist/{token-budget-OQCLPV3A.js → token-budget-NOF27AZC.js} +3 -3
- package/dist/{tool-capability-index-3UWKZZED.js → tool-capability-index-EFBBPTBI.js} +1 -1
- package/dist/{tool-telemetry-AQTFWOWG.js → tool-telemetry-OEK6KQFF.js} +1 -1
- package/dist/tui/App.js +28 -21
- package/dist/{tui-data-3Y5L5LJB.js → tui-data-EG6LEZFF.js} +19 -12
- package/dist/{worker-gate-WJS2MFNA.js → worker-gate-YA35VMAN.js} +1 -1
- package/dist/{workflow-engine-EPPZ226V.js → workflow-engine-3AVKRE5I.js} +2 -2
- package/dist/{worktree-OYGDGJP7.js → worktree-72QYYL5L.js} +4 -4
- package/dist/{worktree-sweep-KV4H4766.js → worktree-sweep-GDISKGQ2.js} +5 -5
- package/package.json +1 -1
- package/release-notes.json +45 -45
- package/dist/chunk-4FVVJ7ME.js +0 -193
- package/dist/completion-nudge-dedup-DBZF24MM.js +0 -74
- package/dist/git-task-sweep-7GVUKDBW.js +0 -47
- package/dist/intercom-queue-6M5IRX3Y.js +0 -17
- /package/dist/{chunk-QTEHH4LG.js → chunk-24WPWCD6.js} +0 -0
- /package/dist/{chunk-IZY6V4FI.js → chunk-4O3N7I5Z.js} +0 -0
- /package/dist/{chunk-WXRVHXVP.js → chunk-7577GDDG.js} +0 -0
- /package/dist/{chunk-Q5YKWFVO.js → chunk-EWKZKO7F.js} +0 -0
- /package/dist/{chunk-DY3J6GQO.js → chunk-H43BPGIV.js} +0 -0
- /package/dist/{chunk-DQJ3WZRK.js → chunk-IHRXCNSC.js} +0 -0
- /package/dist/{chunk-RRQI5PSJ.js → chunk-NIB2N6L2.js} +0 -0
- /package/dist/{chunk-ZU6767WK.js → chunk-QMUSJESS.js} +0 -0
- /package/dist/{chunk-72LWCZTJ.js → chunk-RXS2LBKE.js} +0 -0
- /package/dist/{chunk-SJZT66LM.js → chunk-SNFYZFXY.js} +0 -0
- /package/dist/{chunk-SIJSFULW.js → chunk-TSYMWC53.js} +0 -0
- /package/dist/{core-memory-DARTILJG.js → core-memory-NKKP2XUB.js} +0 -0
- /package/dist/{entity-boost-VR5YOQCT.js → entity-boost-DRIUFTYB.js} +0 -0
- /package/dist/{message-queue-client-HVFR67QH.js → message-queue-client-4ERC7HLX.js} +0 -0
- /package/dist/{oauth-server-UQHCFVHT.js → oauth-server-PECJREY2.js} +0 -0
- /package/dist/{project-boot-22ZZL2GE.js → project-boot-SFKP2MFW.js} +0 -0
- /package/dist/{wiki-acl-EZMGL6KW.js → wiki-acl-QIBDNXSM.js} +0 -0
package/dist/bin/exe-watchdog.js
CHANGED
|
@@ -2,14 +2,18 @@
|
|
|
2
2
|
import {
|
|
3
3
|
checkCpuStealSync
|
|
4
4
|
} from "../chunk-SSC7EKY2.js";
|
|
5
|
+
import {
|
|
6
|
+
isMainModule
|
|
7
|
+
} from "../chunk-6Y4B3QF6.js";
|
|
5
8
|
import "../chunk-MLKGABMK.js";
|
|
6
9
|
|
|
7
10
|
// src/bin/exe-watchdog.ts
|
|
8
|
-
import { readFileSync, writeFileSync, unlinkSync, existsSync, appendFileSync, mkdirSync, statSync } from "fs";
|
|
11
|
+
import { readFileSync, writeFileSync, unlinkSync, existsSync, appendFileSync, mkdirSync, statSync, realpathSync } from "fs";
|
|
9
12
|
import { randomUUID } from "crypto";
|
|
10
|
-
import {
|
|
13
|
+
import { spawn } from "child_process";
|
|
11
14
|
import { get } from "http";
|
|
12
15
|
import { join } from "path";
|
|
16
|
+
import { fileURLToPath } from "url";
|
|
13
17
|
import { homedir, userInfo, loadavg, cpus, platform } from "os";
|
|
14
18
|
var EXE_DIR = process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? join(homedir(), ".exe-os");
|
|
15
19
|
var PID_PATH = join(EXE_DIR, "exed.pid");
|
|
@@ -23,13 +27,23 @@ var DEFAULT_HEALTH_PORT = 48739;
|
|
|
23
27
|
var PING_INTERVAL_MS = 1e4;
|
|
24
28
|
var PING_TIMEOUT_MS = 5e3;
|
|
25
29
|
var MAX_FAILURES = 3;
|
|
26
|
-
var SIGTERM_GRACE_MS =
|
|
30
|
+
var SIGTERM_GRACE_MS = 6e4;
|
|
27
31
|
var KICKSTART_SUPPRESS_TICKS = 3;
|
|
28
32
|
var MIN_DAEMON_AGE_S = 60;
|
|
33
|
+
var MIN_DAEMON_AGE_LOADED_S = 180;
|
|
29
34
|
var STEAL_SUPPRESS_PERCENT = 20;
|
|
30
35
|
var LOAD_PER_CORE_SUPPRESS = 2;
|
|
31
|
-
var
|
|
36
|
+
var LOAD_PER_CORE_ELEVATED = 1.5;
|
|
37
|
+
var HEARTBEAT_FRESH_MS = 15e3;
|
|
38
|
+
var STALE_BUILD_CHECK_INTERVAL_MS = 6e4;
|
|
39
|
+
function emptyFailureState() {
|
|
40
|
+
return { count: 0, firstFailureAtMs: null, lastFailureAtMs: null };
|
|
41
|
+
}
|
|
42
|
+
var failureState = emptyFailureState();
|
|
32
43
|
var suppressTicks = 0;
|
|
44
|
+
var tickInFlight = false;
|
|
45
|
+
var lastSelfStatMs = null;
|
|
46
|
+
var PROCESS_STARTED_AT_MS = Date.now() - process.uptime() * 1e3;
|
|
33
47
|
function log(msg) {
|
|
34
48
|
const line = `${(/* @__PURE__ */ new Date()).toISOString()} ${msg}
|
|
35
49
|
`;
|
|
@@ -39,6 +53,9 @@ function log(msg) {
|
|
|
39
53
|
} catch {
|
|
40
54
|
}
|
|
41
55
|
}
|
|
56
|
+
function sleep(ms) {
|
|
57
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
58
|
+
}
|
|
42
59
|
function sanitizePort(raw) {
|
|
43
60
|
const n = typeof raw === "number" ? raw : parseInt(String(raw ?? "").trim(), 10);
|
|
44
61
|
if (!Number.isInteger(n) || n <= 0 || n > 65535) return null;
|
|
@@ -94,14 +111,99 @@ function pingHealth() {
|
|
|
94
111
|
}
|
|
95
112
|
});
|
|
96
113
|
}
|
|
97
|
-
function
|
|
114
|
+
function resolveSelfPath() {
|
|
115
|
+
try {
|
|
116
|
+
if (process.argv[1]) return realpathSync(process.argv[1]);
|
|
117
|
+
} catch {
|
|
118
|
+
}
|
|
119
|
+
try {
|
|
120
|
+
return realpathSync(fileURLToPath(import.meta.url));
|
|
121
|
+
} catch {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
function checkStaleBuild(opts) {
|
|
126
|
+
const interval = opts.checkIntervalMs ?? STALE_BUILD_CHECK_INTERVAL_MS;
|
|
127
|
+
if (opts.selfPath === null) return { exit: false, checkedMs: opts.lastCheckedMs };
|
|
128
|
+
if (opts.lastCheckedMs !== null && opts.nowMs - opts.lastCheckedMs < interval) {
|
|
129
|
+
return { exit: false, checkedMs: opts.lastCheckedMs };
|
|
130
|
+
}
|
|
131
|
+
try {
|
|
132
|
+
const statFn = opts.statFn ?? statSync;
|
|
133
|
+
const { mtimeMs } = statFn(opts.selfPath);
|
|
134
|
+
return { exit: mtimeMs > opts.processStartMs, checkedMs: opts.nowMs, mtimeMs };
|
|
135
|
+
} catch {
|
|
136
|
+
return { exit: false, checkedMs: opts.nowMs };
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
function heartbeatAgeMs(nowMs, readyPath = DAEMON_READY_PATH, statFn = statSync) {
|
|
140
|
+
try {
|
|
141
|
+
return nowMs - statFn(readyPath).mtimeMs;
|
|
142
|
+
} catch {
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
function isHeartbeatFresh(ageMs, freshMs = HEARTBEAT_FRESH_MS) {
|
|
147
|
+
return ageMs !== null && ageMs > -2e3 && ageMs < freshMs;
|
|
148
|
+
}
|
|
149
|
+
function loadPerCore() {
|
|
150
|
+
try {
|
|
151
|
+
if (platform() === "win32") return 0;
|
|
152
|
+
const cores = Math.max(1, cpus().length);
|
|
153
|
+
const oneMin = loadavg()[0] ?? 0;
|
|
154
|
+
return Number.isFinite(oneMin) && oneMin > 0 ? oneMin / cores : 0;
|
|
155
|
+
} catch {
|
|
156
|
+
return 0;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
function effectiveSigtermGraceMs(perCore) {
|
|
160
|
+
return perCore >= LOAD_PER_CORE_ELEVATED ? SIGTERM_GRACE_MS * 2 : SIGTERM_GRACE_MS;
|
|
161
|
+
}
|
|
162
|
+
function effectiveMinDaemonAgeS(perCore) {
|
|
163
|
+
return perCore >= LOAD_PER_CORE_ELEVATED ? MIN_DAEMON_AGE_LOADED_S : MIN_DAEMON_AGE_S;
|
|
164
|
+
}
|
|
165
|
+
function bootGraceActive(opts) {
|
|
166
|
+
if (opts.ageSec === null) return false;
|
|
167
|
+
if (opts.readySignaledThisBoot) return false;
|
|
168
|
+
return opts.ageSec < effectiveMinDaemonAgeS(opts.perCore);
|
|
169
|
+
}
|
|
170
|
+
function readySignaledByPid(daemonPid) {
|
|
171
|
+
if (daemonPid === null) return false;
|
|
172
|
+
try {
|
|
173
|
+
const ready = JSON.parse(readFileSync(DAEMON_READY_PATH, "utf8"));
|
|
174
|
+
return typeof ready.pid === "number" && ready.pid === daemonPid;
|
|
175
|
+
} catch {
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
function recordPingFailure(state, nowMs, pingIntervalMs = PING_INTERVAL_MS) {
|
|
180
|
+
if (state.lastFailureAtMs !== null && nowMs - state.lastFailureAtMs > 3 * pingIntervalMs) {
|
|
181
|
+
return { next: { count: 1, firstFailureAtMs: nowMs, lastFailureAtMs: nowMs }, staleGapReset: true };
|
|
182
|
+
}
|
|
183
|
+
return {
|
|
184
|
+
next: {
|
|
185
|
+
count: state.count + 1,
|
|
186
|
+
firstFailureAtMs: state.firstFailureAtMs ?? nowMs,
|
|
187
|
+
lastFailureAtMs: nowMs
|
|
188
|
+
},
|
|
189
|
+
staleGapReset: false
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
function hasSustainedFailures(state, nowMs, maxFailures = MAX_FAILURES, pingIntervalMs = PING_INTERVAL_MS) {
|
|
193
|
+
if (state.count < maxFailures || state.firstFailureAtMs === null) return false;
|
|
194
|
+
return nowMs - state.firstFailureAtMs >= (maxFailures - 1) * pingIntervalMs;
|
|
195
|
+
}
|
|
196
|
+
function daemonAgeSec(pidPath = PID_PATH, nowMs = Date.now()) {
|
|
98
197
|
try {
|
|
99
|
-
const stat = statSync(
|
|
100
|
-
return
|
|
198
|
+
const stat = statSync(pidPath);
|
|
199
|
+
return Math.max(0, (nowMs - stat.mtimeMs) / 1e3);
|
|
101
200
|
} catch {
|
|
102
|
-
return
|
|
201
|
+
return null;
|
|
103
202
|
}
|
|
104
203
|
}
|
|
204
|
+
function describeDaemonAge(ageSec) {
|
|
205
|
+
return ageSec === null ? "unknown (PID file missing)" : `${Math.round(ageSec)}s`;
|
|
206
|
+
}
|
|
105
207
|
function readPid() {
|
|
106
208
|
try {
|
|
107
209
|
if (!existsSync(PID_PATH)) return null;
|
|
@@ -113,26 +215,63 @@ function readPid() {
|
|
|
113
215
|
return null;
|
|
114
216
|
}
|
|
115
217
|
}
|
|
116
|
-
|
|
218
|
+
var bootDeferStreak = 0;
|
|
219
|
+
var MAX_BOOT_DEFERRALS = 10;
|
|
220
|
+
async function detectBootingDaemon() {
|
|
221
|
+
const port = resolveHealthPort();
|
|
222
|
+
const portAlive = await new Promise((resolve) => {
|
|
223
|
+
try {
|
|
224
|
+
const req = get({ host: "127.0.0.1", port, path: "/health", timeout: 2e3 }, (res) => {
|
|
225
|
+
res.resume();
|
|
226
|
+
resolve(true);
|
|
227
|
+
});
|
|
228
|
+
req.on("timeout", () => {
|
|
229
|
+
req.destroy();
|
|
230
|
+
resolve(false);
|
|
231
|
+
});
|
|
232
|
+
req.on("error", () => resolve(false));
|
|
233
|
+
} catch {
|
|
234
|
+
resolve(false);
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
if (portAlive) return `health port ${port} is answering`;
|
|
238
|
+
return await new Promise((resolve) => {
|
|
239
|
+
let out = "";
|
|
240
|
+
try {
|
|
241
|
+
const child = spawn("pgrep", ["-f", "exe-os-node"], { timeout: 3e3, killSignal: "SIGKILL" });
|
|
242
|
+
child.stdout?.on("data", (d) => {
|
|
243
|
+
out += String(d);
|
|
244
|
+
});
|
|
245
|
+
child.on("error", () => resolve(null));
|
|
246
|
+
child.on("exit", () => {
|
|
247
|
+
const pids = out.trim().split("\n").filter((p) => p && Number(p) !== process.pid);
|
|
248
|
+
resolve(pids.length > 0 ? `exe-os-node process(es) ${pids.join(",")} alive` : null);
|
|
249
|
+
});
|
|
250
|
+
} catch {
|
|
251
|
+
resolve(null);
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
async function killDaemon(pid, graceMs) {
|
|
117
256
|
try {
|
|
118
257
|
process.kill(pid, "SIGTERM");
|
|
119
258
|
} catch {
|
|
120
259
|
return;
|
|
121
260
|
}
|
|
122
|
-
const deadline = Date.now() +
|
|
261
|
+
const deadline = Date.now() + graceMs;
|
|
123
262
|
while (Date.now() < deadline) {
|
|
124
263
|
try {
|
|
125
264
|
process.kill(pid, 0);
|
|
126
265
|
} catch {
|
|
127
266
|
return;
|
|
128
267
|
}
|
|
129
|
-
|
|
268
|
+
await sleep(500);
|
|
130
269
|
}
|
|
131
270
|
try {
|
|
132
271
|
process.kill(pid, "SIGKILL");
|
|
133
272
|
} catch {
|
|
134
273
|
}
|
|
135
|
-
log(`[watchdog] SIGKILL sent to ${pid} after SIGTERM grace expired`);
|
|
274
|
+
log(`[watchdog] SIGKILL sent to ${pid} after SIGTERM grace (${Math.round(graceMs / 1e3)}s) expired`);
|
|
136
275
|
}
|
|
137
276
|
function cleanupStaleFiles() {
|
|
138
277
|
try {
|
|
@@ -153,18 +292,43 @@ function writeRestartIntentMarker(reason) {
|
|
|
153
292
|
log(`[watchdog] WARNING: could not write restart-intent marker: ${err instanceof Error ? err.message : String(err)}`);
|
|
154
293
|
}
|
|
155
294
|
}
|
|
156
|
-
function
|
|
295
|
+
function runSupervisorCommand(cmd, args, timeoutMs) {
|
|
296
|
+
return new Promise((resolve) => {
|
|
297
|
+
let settled = false;
|
|
298
|
+
const settle = (r) => {
|
|
299
|
+
if (settled) return;
|
|
300
|
+
settled = true;
|
|
301
|
+
clearTimeout(fallback);
|
|
302
|
+
resolve(r);
|
|
303
|
+
};
|
|
304
|
+
const fallback = setTimeout(() => settle({ ok: false, detail: `no exit after ${timeoutMs + 5e3}ms \u2014 abandoned` }), timeoutMs + 5e3);
|
|
305
|
+
fallback.unref();
|
|
306
|
+
try {
|
|
307
|
+
const child = spawn(cmd, args, { stdio: "ignore", timeout: timeoutMs, killSignal: "SIGKILL" });
|
|
308
|
+
child.on("error", (err) => settle({ ok: false, detail: err.message }));
|
|
309
|
+
child.on("exit", (code, signal) => {
|
|
310
|
+
if (signal) settle({ ok: false, detail: `killed by ${signal} after ${timeoutMs}ms timeout` });
|
|
311
|
+
else settle({ ok: code === 0, detail: `exit ${code}` });
|
|
312
|
+
});
|
|
313
|
+
} catch (err) {
|
|
314
|
+
settle({ ok: false, detail: err instanceof Error ? err.message : String(err) });
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
async function kickstartDaemon() {
|
|
157
319
|
try {
|
|
158
320
|
if (process.platform === "darwin") {
|
|
159
321
|
const uid = userInfo().uid;
|
|
160
322
|
const target = `gui/${uid}/com.askexe.exed`;
|
|
161
323
|
log(`[watchdog] Issuing: launchctl kickstart -k ${target}`);
|
|
162
|
-
|
|
163
|
-
log("[watchdog] launchctl kickstart succeeded");
|
|
324
|
+
const res = await runSupervisorCommand("launchctl", ["kickstart", "-k", target], 1e4);
|
|
325
|
+
if (res.ok) log("[watchdog] launchctl kickstart succeeded");
|
|
326
|
+
else log(`[watchdog] kickstart command failed (non-fatal, launchd passive relaunch may still trigger): ${res.detail}`);
|
|
164
327
|
} else if (process.platform === "linux") {
|
|
165
328
|
log("[watchdog] Issuing: systemctl --user start exe-os");
|
|
166
|
-
|
|
167
|
-
log("[watchdog] systemctl --user start exe-os succeeded");
|
|
329
|
+
const res = await runSupervisorCommand("systemctl", ["--user", "start", "exe-os"], 1e4);
|
|
330
|
+
if (res.ok) log("[watchdog] systemctl --user start exe-os succeeded");
|
|
331
|
+
else log(`[watchdog] kickstart command failed (non-fatal, systemd passive restart may still trigger): ${res.detail}`);
|
|
168
332
|
} else {
|
|
169
333
|
log(`[watchdog] Unknown platform ${process.platform} \u2014 no kickstart issued`);
|
|
170
334
|
}
|
|
@@ -194,58 +358,133 @@ function detectStarvation() {
|
|
|
194
358
|
return { starved: false, reason: "" };
|
|
195
359
|
}
|
|
196
360
|
async function tick() {
|
|
361
|
+
const staleCheck = checkStaleBuild({
|
|
362
|
+
selfPath: resolveSelfPath(),
|
|
363
|
+
processStartMs: PROCESS_STARTED_AT_MS,
|
|
364
|
+
nowMs: Date.now(),
|
|
365
|
+
lastCheckedMs: lastSelfStatMs
|
|
366
|
+
});
|
|
367
|
+
lastSelfStatMs = staleCheck.checkedMs;
|
|
368
|
+
if (staleCheck.exit) {
|
|
369
|
+
log("[watchdog] newer build detected \u2014 exiting for launchd relaunch");
|
|
370
|
+
process.exit(0);
|
|
371
|
+
}
|
|
197
372
|
if (suppressTicks > 0) {
|
|
198
373
|
suppressTicks--;
|
|
199
374
|
const healthy2 = await pingHealth();
|
|
200
375
|
if (healthy2) {
|
|
201
376
|
log("[watchdog] Daemon healthy after kickstart");
|
|
202
|
-
|
|
377
|
+
failureState = emptyFailureState();
|
|
203
378
|
suppressTicks = 0;
|
|
204
379
|
}
|
|
205
380
|
return;
|
|
206
381
|
}
|
|
207
382
|
const healthy = await pingHealth();
|
|
208
383
|
if (healthy) {
|
|
209
|
-
if (
|
|
210
|
-
log(`[watchdog] Daemon recovered after ${
|
|
384
|
+
if (failureState.count > 0) {
|
|
385
|
+
log(`[watchdog] Daemon recovered after ${failureState.count} failed ping(s)`);
|
|
211
386
|
}
|
|
212
|
-
|
|
387
|
+
failureState = emptyFailureState();
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
const now = Date.now();
|
|
391
|
+
const recorded = recordPingFailure(failureState, now);
|
|
392
|
+
failureState = recorded.next;
|
|
393
|
+
if (recorded.staleGapReset) {
|
|
394
|
+
log(`[watchdog] Ping failed after a stale gap (> ${3 * PING_INTERVAL_MS / 1e3}s since previous failure) \u2014 counter reset (1/${MAX_FAILURES})`);
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
397
|
+
if (failureState.count < MAX_FAILURES) {
|
|
398
|
+
log(`[watchdog] Ping failed (${failureState.count}/${MAX_FAILURES})`);
|
|
213
399
|
return;
|
|
214
400
|
}
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
log(`[watchdog]
|
|
401
|
+
if (!hasSustainedFailures(failureState, now)) {
|
|
402
|
+
const spanMs = failureState.firstFailureAtMs === null ? 0 : now - failureState.firstFailureAtMs;
|
|
403
|
+
log(`[watchdog] ${failureState.count} ping failures span only ${(spanMs / 1e3).toFixed(1)}s (starved timers fired back-to-back?) \u2014 waiting for wall-clock confirmation`);
|
|
218
404
|
return;
|
|
219
405
|
}
|
|
406
|
+
const perCore = loadPerCore();
|
|
407
|
+
const pid = readPid();
|
|
220
408
|
const age = daemonAgeSec();
|
|
221
|
-
if (age
|
|
222
|
-
log(
|
|
223
|
-
|
|
409
|
+
if (age === null) {
|
|
410
|
+
log("[watchdog] Daemon PID file missing \u2014 cannot determine daemon age (daemon likely dead); proceeding to self-heal checks");
|
|
411
|
+
} else if (bootGraceActive({ ageSec: age, perCore, readySignaledThisBoot: readySignaledByPid(pid) })) {
|
|
412
|
+
log(`[watchdog] Daemon is only ${Math.round(age)}s old (min ${effectiveMinDaemonAgeS(perCore)}s at load ${perCore.toFixed(2)}/core, not yet ready) \u2014 suppressing kill, resetting counter`);
|
|
413
|
+
failureState = emptyFailureState();
|
|
224
414
|
return;
|
|
225
415
|
}
|
|
226
416
|
const starvation = detectStarvation();
|
|
227
417
|
if (starvation.starved) {
|
|
228
418
|
log(`[watchdog] Daemon unresponsive but host is CPU-starved (${starvation.reason}) \u2014 suppressing self-heal (restart won't fix starvation), resetting counter`);
|
|
229
|
-
|
|
419
|
+
failureState = emptyFailureState();
|
|
420
|
+
return;
|
|
421
|
+
}
|
|
422
|
+
const hbAge = heartbeatAgeMs(now);
|
|
423
|
+
if (isHeartbeatFresh(hbAge)) {
|
|
424
|
+
log(`[watchdog] Daemon unresponsive to HTTP ping but daemon.ready heartbeat is fresh (${((hbAge ?? 0) / 1e3).toFixed(1)}s old < ${HEARTBEAT_FRESH_MS / 1e3}s) \u2014 daemon is alive-but-slow; suppressing kill, resetting counter`);
|
|
425
|
+
failureState = emptyFailureState();
|
|
230
426
|
return;
|
|
231
427
|
}
|
|
232
|
-
|
|
428
|
+
const unresponsiveForS = failureState.firstFailureAtMs === null ? 0 : (now - failureState.firstFailureAtMs + PING_INTERVAL_MS) / 1e3;
|
|
429
|
+
if (pid === null) {
|
|
430
|
+
const booting = await detectBootingDaemon();
|
|
431
|
+
if (booting && bootDeferStreak < MAX_BOOT_DEFERRALS) {
|
|
432
|
+
bootDeferStreak++;
|
|
433
|
+
log(`[watchdog] No PID file but a daemon appears to be BOOTING (${booting}) \u2014 deferring self-heal ${bootDeferStreak}/${MAX_BOOT_DEFERRALS} (kickstart -k would kill it mid-init)`);
|
|
434
|
+
failureState = emptyFailureState();
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
437
|
+
if (booting) {
|
|
438
|
+
log(`[watchdog] Boot-deferral limit reached (${MAX_BOOT_DEFERRALS}) with daemon still not ready (${booting}) \u2014 proceeding with self-heal`);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
bootDeferStreak = 0;
|
|
442
|
+
log(`[watchdog] Daemon unresponsive for ~${Math.round(unresponsiveForS)}s (age ${describeDaemonAge(age)}) \u2014 initiating self-heal`);
|
|
233
443
|
writeRestartIntentMarker("watchdog-self-heal");
|
|
234
|
-
const pid = readPid();
|
|
235
444
|
if (pid !== null) {
|
|
236
|
-
|
|
237
|
-
|
|
445
|
+
const graceMs = effectiveSigtermGraceMs(perCore);
|
|
446
|
+
log(`[watchdog] Killing daemon PID ${pid} (SIGTERM grace ${Math.round(graceMs / 1e3)}s, load ${perCore.toFixed(2)}/core)`);
|
|
447
|
+
await killDaemon(pid, graceMs);
|
|
238
448
|
} else {
|
|
239
449
|
log("[watchdog] No live daemon PID found \u2014 daemon already dead");
|
|
240
450
|
}
|
|
241
451
|
cleanupStaleFiles();
|
|
242
452
|
log("[watchdog] Stale PID/socket removed");
|
|
243
|
-
kickstartDaemon();
|
|
244
|
-
|
|
453
|
+
await kickstartDaemon();
|
|
454
|
+
failureState = emptyFailureState();
|
|
245
455
|
suppressTicks = KICKSTART_SUPPRESS_TICKS;
|
|
246
456
|
}
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
457
|
+
if (isMainModule(import.meta.url) && (process.argv[1] ?? "").includes("exe-watchdog")) {
|
|
458
|
+
log("[watchdog] Started");
|
|
459
|
+
setInterval(() => {
|
|
460
|
+
if (tickInFlight) return;
|
|
461
|
+
tickInFlight = true;
|
|
462
|
+
tick().catch(() => {
|
|
463
|
+
}).finally(() => {
|
|
464
|
+
tickInFlight = false;
|
|
465
|
+
});
|
|
466
|
+
}, PING_INTERVAL_MS);
|
|
467
|
+
}
|
|
468
|
+
export {
|
|
469
|
+
HEARTBEAT_FRESH_MS,
|
|
470
|
+
LOAD_PER_CORE_ELEVATED,
|
|
471
|
+
MAX_FAILURES,
|
|
472
|
+
MIN_DAEMON_AGE_LOADED_S,
|
|
473
|
+
MIN_DAEMON_AGE_S,
|
|
474
|
+
PING_INTERVAL_MS,
|
|
475
|
+
SIGTERM_GRACE_MS,
|
|
476
|
+
STALE_BUILD_CHECK_INTERVAL_MS,
|
|
477
|
+
bootGraceActive,
|
|
478
|
+
checkStaleBuild,
|
|
479
|
+
daemonAgeSec,
|
|
480
|
+
describeDaemonAge,
|
|
481
|
+
effectiveMinDaemonAgeS,
|
|
482
|
+
effectiveSigtermGraceMs,
|
|
483
|
+
emptyFailureState,
|
|
484
|
+
hasSustainedFailures,
|
|
485
|
+
heartbeatAgeMs,
|
|
486
|
+
isHeartbeatFresh,
|
|
487
|
+
loadPerCore,
|
|
488
|
+
recordPingFailure,
|
|
489
|
+
resolveSelfPath
|
|
490
|
+
};
|
package/dist/bin/git-sweep.js
CHANGED
|
@@ -1,38 +1,45 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
sweepWorktrees
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-UYOW7U24.js";
|
|
5
5
|
import {
|
|
6
6
|
sweepTasks
|
|
7
|
-
} from "../chunk-
|
|
8
|
-
import "../chunk-
|
|
9
|
-
import "../chunk-
|
|
10
|
-
import "../chunk-
|
|
11
|
-
import "../chunk-
|
|
7
|
+
} from "../chunk-2YWUZPHE.js";
|
|
8
|
+
import "../chunk-KUJGADX6.js";
|
|
9
|
+
import "../chunk-7PLMYXPG.js";
|
|
10
|
+
import "../chunk-KJOQLNX2.js";
|
|
11
|
+
import "../chunk-Y2KBHLEO.js";
|
|
12
|
+
import "../chunk-EIKATSE4.js";
|
|
12
13
|
import "../chunk-E23LNUWJ.js";
|
|
13
14
|
import "../chunk-4JERP7NT.js";
|
|
14
|
-
import "../chunk-
|
|
15
|
+
import "../chunk-JRD7ARQ6.js";
|
|
15
16
|
import "../chunk-SSTLTIF3.js";
|
|
16
17
|
import "../chunk-RMOBQ6A5.js";
|
|
17
18
|
import "../chunk-54QCG45Y.js";
|
|
18
|
-
import "../chunk-
|
|
19
|
-
import "../chunk-
|
|
19
|
+
import "../chunk-F6TJIWN5.js";
|
|
20
|
+
import "../chunk-FROUDYRT.js";
|
|
20
21
|
import "../chunk-NGP6LSV2.js";
|
|
21
|
-
import "../chunk-
|
|
22
|
+
import "../chunk-BB5IKY7B.js";
|
|
22
23
|
import "../chunk-CVYC6DUW.js";
|
|
24
|
+
import "../chunk-GIFDGNIL.js";
|
|
25
|
+
import "../chunk-HCJCW7X4.js";
|
|
23
26
|
import "../chunk-OPU3NYOO.js";
|
|
27
|
+
import "../chunk-BC7IIR3A.js";
|
|
28
|
+
import "../chunk-AFNRE2RV.js";
|
|
29
|
+
import "../chunk-3NGZ4PL7.js";
|
|
30
|
+
import "../chunk-NLEW62VC.js";
|
|
24
31
|
import "../chunk-HYZV25LY.js";
|
|
25
32
|
import "../chunk-GJV3WDWM.js";
|
|
26
33
|
import "../chunk-MP2AFCGL.js";
|
|
27
|
-
import "../chunk-
|
|
34
|
+
import "../chunk-QGOMYIVT.js";
|
|
28
35
|
import "../chunk-2I23RPSI.js";
|
|
29
|
-
import "../chunk-
|
|
36
|
+
import "../chunk-7577GDDG.js";
|
|
30
37
|
import "../chunk-PNQDP3OA.js";
|
|
31
38
|
import "../chunk-H73TUI4Y.js";
|
|
32
39
|
import "../chunk-7HLWBYH7.js";
|
|
33
40
|
import "../chunk-FXU7JOXK.js";
|
|
34
|
-
import "../chunk-
|
|
35
|
-
import "../chunk-
|
|
41
|
+
import "../chunk-BMSAJ2IH.js";
|
|
42
|
+
import "../chunk-IHRXCNSC.js";
|
|
36
43
|
import "../chunk-7Y5UDEVM.js";
|
|
37
44
|
import "../chunk-SHIICYJW.js";
|
|
38
45
|
import "../chunk-MLKGABMK.js";
|
|
@@ -11,17 +11,17 @@ import "../chunk-GUMRIUI5.js";
|
|
|
11
11
|
import {
|
|
12
12
|
disposeStore,
|
|
13
13
|
initStore
|
|
14
|
-
} from "../chunk-
|
|
14
|
+
} from "../chunk-KLDQFOFY.js";
|
|
15
15
|
import "../chunk-CHCA3ZM2.js";
|
|
16
16
|
import "../chunk-OTVEIJUQ.js";
|
|
17
|
-
import "../chunk-
|
|
17
|
+
import "../chunk-TSYMWC53.js";
|
|
18
18
|
import "../chunk-Y25OJWOQ.js";
|
|
19
19
|
import "../chunk-MP2AFCGL.js";
|
|
20
20
|
import {
|
|
21
21
|
getClient
|
|
22
|
-
} from "../chunk-
|
|
22
|
+
} from "../chunk-QGOMYIVT.js";
|
|
23
23
|
import "../chunk-2I23RPSI.js";
|
|
24
|
-
import "../chunk-
|
|
24
|
+
import "../chunk-7577GDDG.js";
|
|
25
25
|
import "../chunk-PNQDP3OA.js";
|
|
26
26
|
import "../chunk-H73TUI4Y.js";
|
|
27
27
|
import "../chunk-7HLWBYH7.js";
|
package/dist/bin/graph-export.js
CHANGED
|
@@ -5,20 +5,20 @@ import {
|
|
|
5
5
|
} from "../chunk-3OEVDGIY.js";
|
|
6
6
|
import {
|
|
7
7
|
fastDbInit
|
|
8
|
-
} from "../chunk-
|
|
8
|
+
} from "../chunk-QMUSJESS.js";
|
|
9
9
|
import {
|
|
10
10
|
disposeStore
|
|
11
|
-
} from "../chunk-
|
|
11
|
+
} from "../chunk-KLDQFOFY.js";
|
|
12
12
|
import "../chunk-CHCA3ZM2.js";
|
|
13
13
|
import "../chunk-OTVEIJUQ.js";
|
|
14
|
-
import "../chunk-
|
|
14
|
+
import "../chunk-TSYMWC53.js";
|
|
15
15
|
import "../chunk-Y25OJWOQ.js";
|
|
16
16
|
import "../chunk-MP2AFCGL.js";
|
|
17
17
|
import {
|
|
18
18
|
getClient
|
|
19
|
-
} from "../chunk-
|
|
19
|
+
} from "../chunk-QGOMYIVT.js";
|
|
20
20
|
import "../chunk-2I23RPSI.js";
|
|
21
|
-
import "../chunk-
|
|
21
|
+
import "../chunk-7577GDDG.js";
|
|
22
22
|
import "../chunk-PNQDP3OA.js";
|
|
23
23
|
import "../chunk-H73TUI4Y.js";
|
|
24
24
|
import "../chunk-7HLWBYH7.js";
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
registerImportConversations
|
|
4
|
-
} from "../chunk-
|
|
5
|
-
import "../chunk-
|
|
4
|
+
} from "../chunk-2ZW4AQ24.js";
|
|
5
|
+
import "../chunk-WGOAILWE.js";
|
|
6
6
|
import "../chunk-7UMCQQWS.js";
|
|
7
7
|
import "../chunk-Z6BZQHP5.js";
|
|
8
8
|
import "../chunk-GUMRIUI5.js";
|
|
9
|
-
import "../chunk-
|
|
9
|
+
import "../chunk-KLDQFOFY.js";
|
|
10
10
|
import "../chunk-CHCA3ZM2.js";
|
|
11
11
|
import "../chunk-OTVEIJUQ.js";
|
|
12
|
-
import "../chunk-
|
|
13
|
-
import "../chunk-
|
|
12
|
+
import "../chunk-TSYMWC53.js";
|
|
13
|
+
import "../chunk-ID3V4BWS.js";
|
|
14
14
|
import "../chunk-Y25OJWOQ.js";
|
|
15
15
|
import "../chunk-CVYC6DUW.js";
|
|
16
16
|
import "../chunk-GJV3WDWM.js";
|
|
17
17
|
import "../chunk-MP2AFCGL.js";
|
|
18
|
-
import "../chunk-
|
|
18
|
+
import "../chunk-QGOMYIVT.js";
|
|
19
19
|
import "../chunk-2I23RPSI.js";
|
|
20
|
-
import "../chunk-
|
|
20
|
+
import "../chunk-7577GDDG.js";
|
|
21
21
|
import "../chunk-PNQDP3OA.js";
|
|
22
22
|
import "../chunk-H73TUI4Y.js";
|
|
23
23
|
import "../chunk-7HLWBYH7.js";
|
|
@@ -9,9 +9,9 @@ import {
|
|
|
9
9
|
resolveAnthropicKeyEnvBlock,
|
|
10
10
|
resolveAnthropicKeySystemdLine,
|
|
11
11
|
resolveAnthropicKeyValue
|
|
12
|
-
} from "../chunk-
|
|
13
|
-
import "../chunk-CMDC5D7S.js";
|
|
12
|
+
} from "../chunk-KADUJ7PE.js";
|
|
14
13
|
import "../chunk-KWOAM7TA.js";
|
|
14
|
+
import "../chunk-NLEW62VC.js";
|
|
15
15
|
import "../chunk-6Y4B3QF6.js";
|
|
16
16
|
import "../chunk-MLKGABMK.js";
|
|
17
17
|
export {
|