@askexenow/exe-os 0.9.227 → 0.9.229
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-GJDG4CAW.js +24 -0
- package/dist/active-agent-WOP3ZHLN.js +25 -0
- package/dist/agent-context-ZPDQOAD2.js +9 -0
- package/dist/agent-heartbeat-AWTVGE4C.js +60 -0
- package/dist/agent-loop-7UM2ENGU.js +10 -0
- package/dist/agentic-ontology-ASORFII6.js +25 -0
- package/dist/asana-JN2UF47A.js +129 -0
- package/dist/assets/ghostty.conf +83 -0
- package/dist/assets/statusline-command.sh +44 -0
- package/dist/assets/tmux.conf +56 -0
- package/dist/assets/wezterm.lua +68 -0
- package/dist/backfill-metadata-JRWUECUS.js +596 -0
- package/dist/background-jobs-VTOMOTNA.js +25 -0
- package/dist/bash-XA65M6T6.js +8 -0
- package/dist/behaviors-36T3O2DC.js +24 -0
- package/dist/bin/age-ontology-load.js +85 -0
- package/dist/bin/agentic-ontology-backfill.js +84 -0
- package/dist/bin/agentic-reflection-backfill.js +45 -0
- package/dist/bin/agentic-semantic-label.js +193 -0
- package/dist/bin/backfill-conversations.js +399 -0
- package/dist/bin/backfill-responses.js +227 -0
- package/dist/bin/backfill-vectors.js +149 -0
- package/dist/bin/bulk-sync-postgres.js +92 -0
- package/dist/bin/cc-doctor.js +51 -0
- package/dist/bin/cleanup-stale-review-tasks.js +139 -0
- package/dist/bin/cli.js +1076 -0
- package/dist/bin/customer-readiness.js +389 -0
- package/dist/bin/deferred-daemon-restart.js +123 -0
- package/dist/bin/exe-agent-config.js +87 -0
- package/dist/bin/exe-agent.js +190 -0
- package/dist/bin/exe-assign.js +93 -0
- package/dist/bin/exe-boot.js +1114 -0
- package/dist/bin/exe-call.js +127 -0
- package/dist/bin/exe-cloud.js +484 -0
- package/dist/bin/exe-dispatch.js +72 -0
- package/dist/bin/exe-doctor.js +48 -0
- package/dist/bin/exe-export-behaviors.js +48 -0
- package/dist/bin/exe-forget.js +204 -0
- package/dist/bin/exe-gateway.js +1137 -0
- package/dist/bin/exe-healthcheck.js +14 -0
- package/dist/bin/exe-heartbeat.js +233 -0
- package/dist/bin/exe-kill.js +126 -0
- package/dist/bin/exe-launch-agent.js +678 -0
- package/dist/bin/exe-new-employee.js +160 -0
- package/dist/bin/exe-pending-messages.js +60 -0
- package/dist/bin/exe-pending-notifications.js +107 -0
- package/dist/bin/exe-pending-reviews.js +81 -0
- package/dist/bin/exe-rename.js +219 -0
- package/dist/bin/exe-repo-drift.js +95 -0
- package/dist/bin/exe-review.js +251 -0
- package/dist/bin/exe-search.js +65 -0
- package/dist/bin/exe-session-cleanup.js +331 -0
- package/dist/bin/exe-settings.js +364 -0
- package/dist/bin/exe-start-codex.js +404 -0
- package/dist/bin/exe-start-opencode.js +233 -0
- package/dist/bin/exe-start.sh +194 -0
- package/dist/bin/exe-status.js +34 -0
- package/dist/bin/exe-support.js +17 -0
- package/dist/bin/exe-team.js +83 -0
- package/dist/bin/generate-hook-manifest.js +30 -0
- package/dist/bin/git-sweep.js +74 -0
- package/dist/bin/graph-backfill.js +78 -0
- package/dist/bin/graph-export.js +66 -0
- package/dist/bin/graph-layer-benchmark.js +113 -0
- package/dist/bin/import-history.js +84 -0
- package/dist/bin/install-launchd.js +41 -0
- package/dist/bin/install.js +422 -0
- package/dist/bin/intercom-check.js +137 -0
- package/dist/bin/list-providers.js +128 -0
- package/dist/bin/mcp-sessions.js +194 -0
- package/dist/bin/orchestration-metrics.js +61 -0
- package/dist/bin/postgres-agentic-reflection-backfill.js +123 -0
- package/dist/bin/postgres-agentic-semantic-backfill.js +126 -0
- package/dist/bin/pre-build-guard.js +98 -0
- package/dist/bin/pre-publish.js +224 -0
- package/dist/bin/registry-proxy.js +44 -0
- package/dist/bin/scan-tasks.js +265 -0
- package/dist/bin/setup.js +19 -0
- package/dist/bin/shard-migrate.js +162 -0
- package/dist/bin/stack-update.js +372 -0
- package/dist/bin/update.js +354 -0
- package/dist/bin/verify-stack.js +389 -0
- package/dist/bin/vps-backup.js +170 -0
- package/dist/bin/vps-health-gate.js +232 -0
- package/dist/branding-I2TDZFUH.js +97 -0
- package/dist/browser-sanitizer-MRSSEJZE.js +229 -0
- package/dist/browser-session-store-RF45DSJR.js +232 -0
- package/dist/capacity-monitor-HZPAFQZH.js +48 -0
- package/dist/catchup-brief-CDG4KD5Y.js +150 -0
- package/dist/chunk-26PUEPOY.js +290 -0
- package/dist/chunk-2VZ6SY2R.js +142 -0
- package/dist/chunk-36DAY227.js +297 -0
- package/dist/chunk-3A5BZETG.js +463 -0
- package/dist/chunk-3DQ3IPPO.js +50 -0
- package/dist/chunk-3JP3FY33.js +258 -0
- package/dist/chunk-3MK3R5E6.js +85 -0
- package/dist/chunk-46SQTBQW.js +207 -0
- package/dist/chunk-4JERP7NT.js +132 -0
- package/dist/chunk-557C2IGL.js +0 -0
- package/dist/chunk-5BS5ELMC.js +85 -0
- package/dist/chunk-5NFBE376.js +391 -0
- package/dist/chunk-6A7P74QV.js +53 -0
- package/dist/chunk-6KFICEAT.js +20 -0
- package/dist/chunk-6MP5NOOR.js +151 -0
- package/dist/chunk-6Y4B3QF6.js +19 -0
- package/dist/chunk-7BPKHR4O.js +171 -0
- package/dist/chunk-7DNX45WB.js +244 -0
- package/dist/chunk-7EZCYO76.js +128 -0
- package/dist/chunk-7NNXBDOO.js +541 -0
- package/dist/chunk-ADJXHBEU.js +667 -0
- package/dist/chunk-AHMUF6RO.js +147 -0
- package/dist/chunk-AJWFPKQS.js +573 -0
- package/dist/chunk-AVE2B4DQ.js +140 -0
- package/dist/chunk-AZSCW64F.js +190 -0
- package/dist/chunk-BZAQ4UG7.js +614 -0
- package/dist/chunk-CHCA3ZM2.js +167 -0
- package/dist/chunk-CHT3THVG.js +240 -0
- package/dist/chunk-CLGB3FGL.js +48 -0
- package/dist/chunk-CQDSTBKT.js +1919 -0
- package/dist/chunk-CTFKTUYN.js +627 -0
- package/dist/chunk-CVYC6DUW.js +78 -0
- package/dist/chunk-CX6GL3ZJ.js +274 -0
- package/dist/chunk-D4IVTUNN.js +377 -0
- package/dist/chunk-DGOGCPYU.js +390 -0
- package/dist/chunk-DKRTWILB.js +81 -0
- package/dist/chunk-DLXTKVBO.js +183 -0
- package/dist/chunk-E6ORBQHP.js +225 -0
- package/dist/chunk-ECGTESAP.js +236 -0
- package/dist/chunk-ECQBG62Y.js +363 -0
- package/dist/chunk-ECSNSHZ7.js +431 -0
- package/dist/chunk-EEAKFEEA.js +221 -0
- package/dist/chunk-EGWPJQRQ.js +159 -0
- package/dist/chunk-EHKIJPVX.js +30 -0
- package/dist/chunk-EIT6J37V.js +119 -0
- package/dist/chunk-EQSQ4HBW.js +9 -0
- package/dist/chunk-ETSREHYC.js +55 -0
- package/dist/chunk-F2GUJW5O.js +1090 -0
- package/dist/chunk-F7LU65PQ.js +33 -0
- package/dist/chunk-FF62UWIJ.js +90 -0
- package/dist/chunk-FIPU4BDF.js +123 -0
- package/dist/chunk-FLSASUV3.js +177 -0
- package/dist/chunk-FWFFZGSC.js +94 -0
- package/dist/chunk-FXU7JOXK.js +6 -0
- package/dist/chunk-G4LLKD4Z.js +147 -0
- package/dist/chunk-GFCQJZTO.js +1051 -0
- package/dist/chunk-GGV3PFUW.js +41 -0
- package/dist/chunk-GJV3WDWM.js +14 -0
- package/dist/chunk-GKM7RYN3.js +1020 -0
- package/dist/chunk-GNHN5HRQ.js +40 -0
- package/dist/chunk-GP6G6EQI.js +632 -0
- package/dist/chunk-GUMRIUI5.js +63 -0
- package/dist/chunk-GVP5U4WL.js +113 -0
- package/dist/chunk-HF25XPZE.js +83 -0
- package/dist/chunk-HFJNYSTQ.js +1088 -0
- package/dist/chunk-HO5SBL4B.js +97 -0
- package/dist/chunk-HOKOOBDL.js +52 -0
- package/dist/chunk-HQMEOIUJ.js +69 -0
- package/dist/chunk-HTCBLSIB.js +813 -0
- package/dist/chunk-HYZV25LY.js +34 -0
- package/dist/chunk-I2CDSGQW.js +280 -0
- package/dist/chunk-I7AW4237.js +251 -0
- package/dist/chunk-IKTMX6N7.js +495 -0
- package/dist/chunk-IQT43SDJ.js +357 -0
- package/dist/chunk-IW53DAYO.js +210 -0
- package/dist/chunk-JBKA7F5V.js +2017 -0
- package/dist/chunk-JJNXFW7M.js +330 -0
- package/dist/chunk-JKGAJAM7.js +214 -0
- package/dist/chunk-JQ6TLNIV.js +133 -0
- package/dist/chunk-JSH5MAMM.js +284 -0
- package/dist/chunk-KCUYRZSX.js +72 -0
- package/dist/chunk-KH5Y6RR4.js +360 -0
- package/dist/chunk-L24HYX62.js +498 -0
- package/dist/chunk-L3TB7CC3.js +170 -0
- package/dist/chunk-LHOIY5LQ.js +58 -0
- package/dist/chunk-LWVZLTMD.js +412 -0
- package/dist/chunk-LYH5HE24.js +73 -0
- package/dist/chunk-M37HYGAG.js +346 -0
- package/dist/chunk-MJXEOKIW.js +54 -0
- package/dist/chunk-MKVFPQH2.js +1051 -0
- package/dist/chunk-MLXJ5EZG.js +90 -0
- package/dist/chunk-MP2AFCGL.js +53 -0
- package/dist/chunk-MSCB4ACU.js +356 -0
- package/dist/chunk-MVW62NIZ.js +20 -0
- package/dist/chunk-MZIGUUDQ.js +42 -0
- package/dist/chunk-N5RRQOAC.js +134 -0
- package/dist/chunk-NFB4N53K.js +159 -0
- package/dist/chunk-NGP6LSV2.js +25 -0
- package/dist/chunk-NGVOA6ZQ.js +84 -0
- package/dist/chunk-NRFVWJHP.js +575 -0
- package/dist/chunk-NUVDSQNY.js +1345 -0
- package/dist/chunk-O377P7GM.js +100 -0
- package/dist/chunk-OE6SYHTC.js +157 -0
- package/dist/chunk-OHPRXEUA.js +75 -0
- package/dist/chunk-OI6MVDSY.js +33 -0
- package/dist/chunk-ONKIWA3R.js +249 -0
- package/dist/chunk-OPU3NYOO.js +55 -0
- package/dist/chunk-ORCCI2VV.js +140 -0
- package/dist/chunk-OSMMWGJ2.js +204 -0
- package/dist/chunk-OYNKIAVW.js +181 -0
- package/dist/chunk-PRKVT4KN.js +90 -0
- package/dist/chunk-PW2YH2ZR.js +403 -0
- package/dist/chunk-PWMMIGVQ.js +332 -0
- package/dist/chunk-Q3V7K4ME.js +149 -0
- package/dist/chunk-Q5GUJUDW.js +348 -0
- package/dist/chunk-Q7RGLXQO.js +574 -0
- package/dist/chunk-Q7XA3SQ4.js +13097 -0
- package/dist/chunk-QGGH7LOU.js +93 -0
- package/dist/chunk-QHIGMP2M.js +237 -0
- package/dist/chunk-QI4IXJN7.js +132 -0
- package/dist/chunk-R2E4TV5V.js +56 -0
- package/dist/chunk-R4WMF32C.js +81 -0
- package/dist/chunk-R5U7XKVJ.js +16 -0
- package/dist/chunk-RJT7H2KR.js +349 -0
- package/dist/chunk-RMPAMMYW.js +70 -0
- package/dist/chunk-RTXGUKY3.js +731 -0
- package/dist/chunk-SH45SJQW.js +0 -0
- package/dist/chunk-SUNYJ6YE.js +204 -0
- package/dist/chunk-SVXDCELZ.js +163 -0
- package/dist/chunk-TMEE7AT7.js +72 -0
- package/dist/chunk-TNTFEWU5.js +361 -0
- package/dist/chunk-TOQZO2XX.js +76 -0
- package/dist/chunk-UBMGUX6T.js +3753 -0
- package/dist/chunk-UJOSFVWG.js +3511 -0
- package/dist/chunk-UPSZ2VKV.js +197 -0
- package/dist/chunk-UV4ZHXUP.js +38 -0
- package/dist/chunk-UWISNP4U.js +1073 -0
- package/dist/chunk-V3QAAU2U.js +129 -0
- package/dist/chunk-V4TZI6EO.js +60 -0
- package/dist/chunk-W6TC6A73.js +77 -0
- package/dist/chunk-WA67SFFZ.js +227 -0
- package/dist/chunk-WWPX2LLP.js +262 -0
- package/dist/chunk-WZ2RVKRO.js +121 -0
- package/dist/chunk-X2Z5GT3V.js +118 -0
- package/dist/chunk-X3AVWFWW.js +294 -0
- package/dist/chunk-XEKO37NM.js +43 -0
- package/dist/chunk-YADYM2DE.js +42 -0
- package/dist/chunk-YCTCKUZE.js +128 -0
- package/dist/chunk-YGAAZN3E.js +47 -0
- package/dist/chunk-YKIPAQZG.js +333 -0
- package/dist/chunk-YSU7JB7H.js +0 -0
- package/dist/chunk-YZFZDJWZ.js +107 -0
- package/dist/chunk-YZKJLGWL.js +169 -0
- package/dist/chunk-Z3TT2SVJ.js +135 -0
- package/dist/chunk-Z3ZCLTP7.js +382 -0
- package/dist/chunk-ZVSG2KKG.js +106 -0
- package/dist/co-activation-AJZTQHI3.js +71 -0
- package/dist/co-occurrence-FGEJIMMV.js +73 -0
- package/dist/code-context-index-KHUYATRB.js +29 -0
- package/dist/content-extractor-CUJOBFBU.js +9 -0
- package/dist/conversation-entity-extractor-TW4W57K4.js +114 -0
- package/dist/conversation-wiki-populator-GNFRTS7X.js +105 -0
- package/dist/core-memory-R7QBLN4C.js +110 -0
- package/dist/crdt-sync-K25AKQAD.js +33 -0
- package/dist/crm-bridge-NG5WJMGF.js +19 -0
- package/dist/crm-webhook-3ODT32F7.js +10 -0
- package/dist/cto-delegation-gate-4XDMTK6H.js +205 -0
- package/dist/daemon-auth-WFQMMNSD.js +13 -0
- package/dist/daemon-orchestration-5I7RLXCP.js +133 -0
- package/dist/daemon-protocol-4FUHT5NH.js +17 -0
- package/dist/db-backup-MSQKO6M5.js +25 -0
- package/dist/devtools-J4QYYO7U.js +8 -0
- package/dist/discord-7UHIZNJ3.js +7 -0
- package/dist/dispatch-ack-RMVFHO4I.js +13 -0
- package/dist/dreaming-UL7T5ZXA.js +12 -0
- package/dist/email-T6PQUUY6.js +137 -0
- package/dist/entity-boost-7MB2IYAE.js +332 -0
- package/dist/exe-drift-2KHRPBUK.js +67 -0
- package/dist/exe-export-UZN6EFOR.js +72 -0
- package/dist/exe-import-OSM3U36A.js +75 -0
- package/dist/exe-key-OG35WPBA.js +573 -0
- package/dist/exe-org-JRBBON5H.js +73 -0
- package/dist/exe-snapshot-7TQIN7XI.js +145 -0
- package/dist/factory-UQSRMKJW.js +67 -0
- package/dist/fast-db-init-4VXDSFUY.js +7 -0
- package/dist/file-edit-YORRFENG.js +8 -0
- package/dist/file-read-RMQFDE5L.js +8 -0
- package/dist/file-write-VO4MQW5Y.js +8 -0
- package/dist/founder-context-3N6BMG7B.js +96 -0
- package/dist/gateway/index.js +148 -0
- package/dist/gateway-client-V7NH35Q2.js +11 -0
- package/dist/git-staleness-JW57ZGEJ.js +109 -0
- package/dist/git-task-sweep-HYAPIM44.js +39 -0
- package/dist/glob-2LXRC3F5.js +7 -0
- package/dist/global-procedures-NY3W7L5Q.js +19 -0
- package/dist/graph-auto-extract-5GZ34NXS.js +161 -0
- package/dist/graph-query-YZ4RZEIL.js +26 -0
- package/dist/graph-rag-S5SBJW5J.js +29 -0
- package/dist/grep-OY7KCRLQ.js +7 -0
- package/dist/hook-integrity-OKSYTGVP.js +89 -0
- package/dist/hooks/bug-report-worker.js +179 -0
- package/dist/hooks/codex-stop-task-finalizer.js +258 -0
- package/dist/hooks/commit-complete.js +162 -0
- package/dist/hooks/error-recall.js +129 -0
- package/dist/hooks/exe-heartbeat-hook.js +78 -0
- package/dist/hooks/ingest-worker.js +51 -0
- package/dist/hooks/ingest.js +491 -0
- package/dist/hooks/instructions-loaded.js +119 -0
- package/dist/hooks/manifest.json +25 -0
- package/dist/hooks/notification.js +67 -0
- package/dist/hooks/post-compact.js +138 -0
- package/dist/hooks/post-tool-combined.js +152 -0
- package/dist/hooks/pre-compact.js +159 -0
- package/dist/hooks/pre-tool-use.js +512 -0
- package/dist/hooks/prompt-submit.js +699 -0
- package/dist/hooks/session-end.js +482 -0
- package/dist/hooks/session-start.js +362 -0
- package/dist/hooks/stop.js +332 -0
- package/dist/hooks/subagent-stop.js +85 -0
- package/dist/hooks/summary-worker.js +298 -0
- package/dist/hooks-RPTZV5KX.js +9 -0
- package/dist/imessage-CE5USLTI.js +7 -0
- package/dist/index.js +60 -0
- package/dist/installer-GMIVB2JS.js +341 -0
- package/dist/installer-OBYQ6O3C.js +295 -0
- package/dist/installer-UAMA6ZVH.js +37 -0
- package/dist/intercom-queue-USIXVVJQ.js +17 -0
- package/dist/key-backup-status-TVFMMWTT.js +39 -0
- package/dist/keyword-extractor-OGQRRVTB.js +11 -0
- package/dist/lib/agent-config.js +30 -0
- package/dist/lib/cloud-sync.js +103 -0
- package/dist/lib/cloudflare-dns.js +13 -0
- package/dist/lib/config.js +32 -0
- package/dist/lib/consolidation.js +38 -0
- package/dist/lib/crypto.js +13 -0
- package/dist/lib/database.js +31 -0
- package/dist/lib/db-daemon-client.js +141 -0
- package/dist/lib/db.js +31 -0
- package/dist/lib/device-registry.js +70 -0
- package/dist/lib/embed-worker.js +165 -0
- package/dist/lib/embedder.js +19 -0
- package/dist/lib/employee-templates.js +34 -0
- package/dist/lib/employees.js +63 -0
- package/dist/lib/error-detector.js +16 -0
- package/dist/lib/exe-daemon-client.js +25 -0
- package/dist/lib/exe-daemon.js +4454 -0
- package/dist/lib/file-grep.js +242 -0
- package/dist/lib/hybrid-search.js +28 -0
- package/dist/lib/identity-templates.js +650 -0
- package/dist/lib/identity.js +19 -0
- package/dist/lib/keychain.js +17 -0
- package/dist/lib/license.js +35 -0
- package/dist/lib/messaging.js +59 -0
- package/dist/lib/post-tool-memory.js +13 -0
- package/dist/lib/registry-proxy.js +15 -0
- package/dist/lib/reminders.js +16 -0
- package/dist/lib/runtime-table.js +9 -0
- package/dist/lib/schedules.js +24 -0
- package/dist/lib/session-registry.js +21 -0
- package/dist/lib/session-wrappers.js +7 -0
- package/dist/lib/skill-learning.js +29 -0
- package/dist/lib/status-brief.js +7 -0
- package/dist/lib/store.js +43 -0
- package/dist/lib/task-router.js +22 -0
- package/dist/lib/tasks.js +66 -0
- package/dist/lib/tmux-routing.js +70 -0
- package/dist/lib/tmux-status.js +29 -0
- package/dist/lib/tmux-transport.js +7 -0
- package/dist/lib/token-spend.js +12 -0
- package/dist/lib/transport.js +10 -0
- package/dist/lib/ws-auth.js +11 -0
- package/dist/lib/ws-client.js +190 -0
- package/dist/license-gate-7QVCYARF.js +14 -0
- package/dist/mcp/register-tools.js +102 -0
- package/dist/mcp/server.js +370 -0
- package/dist/mcp/tools/complete-reminder.js +13 -0
- package/dist/mcp/tools/create-reminder.js +13 -0
- package/dist/mcp/tools/create-task.js +34 -0
- package/dist/mcp/tools/deactivate-behavior.js +16 -0
- package/dist/mcp/tools/list-reminders.js +13 -0
- package/dist/mcp/tools/list-tasks.js +33 -0
- package/dist/mcp/tools/send-message.js +33 -0
- package/dist/mcp/tools/update-task.js +32 -0
- package/dist/mcp-diagnostics-5T5OZ52S.js +200 -0
- package/dist/mcp-disconnect-tracker-VINUVEZJ.js +79 -0
- package/dist/mcp-http-config-YPF4WGU5.js +26 -0
- package/dist/memory-cards-XHZEOX7Q.js +173 -0
- package/dist/memory-graph-extractor-J3K7B4GC.js +16 -0
- package/dist/memory-poisoning-defense-I76FGNHK.js +224 -0
- package/dist/memory-queue-WEVFXPZO.js +19 -0
- package/dist/memory-queue-client-5XBHYAQR.js +15 -0
- package/dist/memory-reflection-YJGI6IDI.js +237 -0
- package/dist/message-queue-client-FUKX43JD.js +92 -0
- package/dist/notifications-H4F77BYT.js +44 -0
- package/dist/oauth-server-CCZPDTZJ.js +437 -0
- package/dist/orchestration-events-LXVPJL6S.js +24 -0
- package/dist/orchestration-phase-HXRKMZXM.js +23 -0
- package/dist/orchestrator-HXUZ6LYM.js +32 -0
- package/dist/permission-presets-UPVLJWZD.js +25 -0
- package/dist/permissions-C4EMHPDD.js +14 -0
- package/dist/pg-ssl-GD3332YS.js +7 -0
- package/dist/pipeline-router-QRJQWMFF.js +12 -0
- package/dist/plan-limits-NFQVRHS5.js +25 -0
- package/dist/prediction-log-C2BD3AHR.js +120 -0
- package/dist/preferences-5ARPMYE7.js +10 -0
- package/dist/preflight-TZOGLBZU.js +287 -0
- package/dist/project-boot-JIGOSGCN.js +254 -0
- package/dist/project-name-4SKOH2UO.js +10 -0
- package/dist/projection-worker-JZQTL4NU.js +877 -0
- package/dist/push-notifications-3GNJ5SZS.js +15 -0
- package/dist/reranker-U6DEAT4S.js +19 -0
- package/dist/review-gate-I66GDXNR.js +120 -0
- package/dist/review-polling-W2S3XAAU.js +123 -0
- package/dist/runtime/index.js +129 -0
- package/dist/self-query-router-QMK5ZSZR.js +188 -0
- package/dist/session-events-MNWHGZY5.js +35 -0
- package/dist/session-kill-telemetry-JHSI7D3F.js +28 -0
- package/dist/session-scope-SMT225X3.js +85 -0
- package/dist/setup-wizard-RBUTEZB2.js +12 -0
- package/dist/shard-manager-ON2WWCRM.js +29 -0
- package/dist/signal-KF2LIO7Y.js +7 -0
- package/dist/signal-paths-5ZTWCBUX.js +19 -0
- package/dist/skill-refinement-LKJHUW2U.js +156 -0
- package/dist/slack-JRDUD5Z7.js +7 -0
- package/dist/stack-update-ZIMV4OEQ.js +50 -0
- package/dist/steward-gate-6IKH335D.js +12 -0
- package/dist/support-outbox-HIJVUDA2.js +206 -0
- package/dist/task-enforcement-UIEWTA6H.js +292 -0
- package/dist/task-scanner-5OQBNC2N.js +11 -0
- package/dist/task-scope-DNQURKOQ.js +34 -0
- package/dist/tasks-crud-CLAYZZ4O.js +76 -0
- package/dist/tasks-review-OHR2P4QE.js +46 -0
- package/dist/telegram-COCYUCT7.js +7 -0
- package/dist/telemetry-QKWQKAUC.js +9 -0
- package/dist/telemetry-upload-APVDPCEV.js +609 -0
- package/dist/token-budget-6IQNYKLR.js +83 -0
- package/dist/tool-capability-index-UUNF7VPA.js +10 -0
- package/dist/tool-gates-6A6LE4DZ.js +14 -0
- package/dist/tool-gates-RNWEH5IK.js +13 -0
- package/dist/tool-registry-KL24CAFR.js +11 -0
- package/dist/tool-telemetry-SJSIL5M5.js +17 -0
- package/dist/tui/App.js +10223 -0
- package/dist/tui-data-L6XG4Z52.js +161 -0
- package/dist/typed-messages-53Q7L3LB.js +17 -0
- package/dist/update-check-5IL5I3E2.js +11 -0
- package/dist/webhook-VXGIH7PN.js +96 -0
- package/dist/webhook-pipe-4WPFGGFD.js +114 -0
- package/dist/whatsapp-PSMKCDS7.js +9 -0
- package/dist/whatsapp-accounts-4OKWFRWL.js +15 -0
- package/dist/whatsapp-config-ZG5LX4O4.js +125 -0
- package/dist/wiki-acl-XCT6QQGP.js +111 -0
- package/dist/wiki-client-KE622HKY.js +157 -0
- package/dist/worker-gate-GFKXZ6V5.js +21 -0
- package/dist/workflow-engine-6HTKI2ZE.js +28 -0
- package/dist/working-memory-Z3EB3FW6.js +77 -0
- package/dist/worktree-BO7QQ32T.js +25 -0
- package/package.json +1 -1
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// src/runtime/hooks.ts
|
|
2
|
+
function createDefaultHooks() {
|
|
3
|
+
return {};
|
|
4
|
+
}
|
|
5
|
+
function composeHooks(...pipelines) {
|
|
6
|
+
return {
|
|
7
|
+
async onSessionStart(context) {
|
|
8
|
+
for (const p of pipelines) {
|
|
9
|
+
if (p.onSessionStart) await p.onSessionStart(context);
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
async onSessionEnd(context, summary) {
|
|
13
|
+
for (const p of pipelines) {
|
|
14
|
+
if (p.onSessionEnd) await p.onSessionEnd(context, summary);
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
async beforeToolUse(block, context) {
|
|
18
|
+
for (const p of pipelines) {
|
|
19
|
+
if (p.beforeToolUse) {
|
|
20
|
+
const result = await p.beforeToolUse(block, context);
|
|
21
|
+
if (result) return result;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
},
|
|
26
|
+
async afterToolUse(block, result, context) {
|
|
27
|
+
for (const p of pipelines) {
|
|
28
|
+
if (p.afterToolUse) await p.afterToolUse(block, result, context);
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
async onError(error, context) {
|
|
32
|
+
for (const p of pipelines) {
|
|
33
|
+
if (p.onError) await p.onError(error, context);
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
async onCompact(removedMessages, summaryLength) {
|
|
37
|
+
for (const p of pipelines) {
|
|
38
|
+
if (p.onCompact) await p.onCompact(removedMessages, summaryLength);
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
async onPostCompact(removedMessages, injectedSummary) {
|
|
42
|
+
for (const p of pipelines) {
|
|
43
|
+
if (p.onPostCompact) await p.onPostCompact(removedMessages, injectedSummary);
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
async onSubagentStop(reason) {
|
|
47
|
+
for (const p of pipelines) {
|
|
48
|
+
if (p.onSubagentStop) {
|
|
49
|
+
const result = await p.onSubagentStop(reason);
|
|
50
|
+
if (result.block) return result;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return { block: false };
|
|
54
|
+
},
|
|
55
|
+
async onNotification(message) {
|
|
56
|
+
for (const p of pipelines) {
|
|
57
|
+
if (p.onNotification) await p.onNotification(message);
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
async onPermissionRequest(toolName, reason) {
|
|
61
|
+
for (const p of pipelines) {
|
|
62
|
+
if (p.onPermissionRequest) {
|
|
63
|
+
const result = await p.onPermissionRequest(toolName, reason);
|
|
64
|
+
if (result.autoApprove) return result;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return { autoApprove: false };
|
|
68
|
+
},
|
|
69
|
+
async onTaskAssigned(event) {
|
|
70
|
+
for (const p of pipelines) {
|
|
71
|
+
if (p.onTaskAssigned) await p.onTaskAssigned(event);
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
async onReviewReceived(event) {
|
|
75
|
+
for (const p of pipelines) {
|
|
76
|
+
if (p.onReviewReceived) await p.onReviewReceived(event);
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
async onContextPressure(event) {
|
|
80
|
+
for (const p of pipelines) {
|
|
81
|
+
if (p.onContextPressure) await p.onContextPressure(event);
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
async onCrossAgentMessage(event) {
|
|
85
|
+
for (const p of pipelines) {
|
|
86
|
+
if (p.onCrossAgentMessage) await p.onCrossAgentMessage(event);
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
async onTokenBudgetExceeded(ctx, fallback) {
|
|
90
|
+
for (const p of pipelines) {
|
|
91
|
+
if (p.onTokenBudgetExceeded) await p.onTokenBudgetExceeded(ctx, fallback);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export {
|
|
98
|
+
createDefaultHooks,
|
|
99
|
+
composeHooks
|
|
100
|
+
};
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import {
|
|
2
|
+
clean,
|
|
3
|
+
stableId
|
|
4
|
+
} from "./chunk-WWPX2LLP.js";
|
|
5
|
+
|
|
6
|
+
// src/lib/reflection-checkpoints.ts
|
|
7
|
+
function parsePayload(payload) {
|
|
8
|
+
if (!payload) return {};
|
|
9
|
+
try {
|
|
10
|
+
return JSON.parse(payload);
|
|
11
|
+
} catch {
|
|
12
|
+
return {};
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function semanticArray(event, key) {
|
|
16
|
+
const payload = parsePayload(event.payload);
|
|
17
|
+
const semantic = payload.semantic;
|
|
18
|
+
const value = semantic?.[key];
|
|
19
|
+
return Array.isArray(value) ? value.map(String).filter(Boolean) : [];
|
|
20
|
+
}
|
|
21
|
+
function buildReflectionCheckpoint(events) {
|
|
22
|
+
if (!events.length) return null;
|
|
23
|
+
const sorted = [...events].sort((a, b) => a.occurred_at.localeCompare(b.occurred_at));
|
|
24
|
+
const first = sorted[0];
|
|
25
|
+
const last = sorted[sorted.length - 1];
|
|
26
|
+
const goals = /* @__PURE__ */ new Set();
|
|
27
|
+
const successes = [];
|
|
28
|
+
const failures = [];
|
|
29
|
+
const risks = [];
|
|
30
|
+
const nextActions = [];
|
|
31
|
+
const decisions = [];
|
|
32
|
+
for (const event of sorted) {
|
|
33
|
+
for (const goal of semanticArray(event, "goals")) goals.add(goal);
|
|
34
|
+
for (const item of semanticArray(event, "successSignals")) successes.push(item);
|
|
35
|
+
for (const item of semanticArray(event, "failureSignals")) failures.push(item);
|
|
36
|
+
for (const item of semanticArray(event, "nextActions")) nextActions.push(item);
|
|
37
|
+
for (const item of semanticArray(event, "decisions")) decisions.push(item);
|
|
38
|
+
if (event.impact === "negative" || event.outcome === "failure_signal" || event.event_type === "problem" || event.event_type === "error") {
|
|
39
|
+
failures.push(event.outcome || event.intention || event.event_type);
|
|
40
|
+
}
|
|
41
|
+
if (event.outcome === "risk_signal") risks.push(event.intention || event.outcome);
|
|
42
|
+
if (event.impact === "positive" || event.outcome === "success_signal" || event.event_type === "milestone") {
|
|
43
|
+
successes.push(event.outcome || event.intention || event.event_type);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const uniqueGoals = [...goals].slice(0, 6);
|
|
47
|
+
const uniqueSuccesses = [...new Set(successes.map((x) => clean(x, 180)).filter(Boolean))].slice(0, 6);
|
|
48
|
+
const uniqueFailures = [...new Set(failures.map((x) => clean(x, 180)).filter(Boolean))].slice(0, 6);
|
|
49
|
+
const uniqueRisks = [...new Set(risks.map((x) => clean(x, 180)).filter(Boolean))].slice(0, 6);
|
|
50
|
+
const uniqueNext = [...new Set(nextActions.map((x) => clean(x, 180)).filter(Boolean))].slice(0, 6);
|
|
51
|
+
const uniqueDecisions = [...new Set(decisions.map((x) => clean(x, 180)).filter(Boolean))].slice(0, 6);
|
|
52
|
+
const learnings = [
|
|
53
|
+
uniqueSuccesses.length ? `Working: ${uniqueSuccesses.slice(0, 3).join("; ")}` : "Working: no strong success signal yet",
|
|
54
|
+
uniqueFailures.length ? `Improve: ${uniqueFailures.slice(0, 3).join("; ")}` : "Improve: no strong failure signal in this window",
|
|
55
|
+
uniqueDecisions.length ? `Decision context: ${uniqueDecisions.slice(0, 2).join("; ")}` : "Decision context: no explicit decision signal"
|
|
56
|
+
];
|
|
57
|
+
const summary = clean([
|
|
58
|
+
`Window ${first.occurred_at} \u2192 ${last.occurred_at}`,
|
|
59
|
+
`${sorted.length} events`,
|
|
60
|
+
uniqueGoals.length ? `goals: ${uniqueGoals.join("; ")}` : "goals: inferred from event trajectory",
|
|
61
|
+
uniqueSuccesses.length ? `successes: ${uniqueSuccesses.slice(0, 2).join("; ")}` : "successes: none explicit",
|
|
62
|
+
uniqueFailures.length ? `failures: ${uniqueFailures.slice(0, 2).join("; ")}` : "failures: none explicit"
|
|
63
|
+
].join(". "), 1200);
|
|
64
|
+
return {
|
|
65
|
+
id: stableId("reflection", first.project_name ?? "", first.session_id ?? "", first.occurred_at, last.occurred_at, sorted.length),
|
|
66
|
+
projectName: first.project_name ?? null,
|
|
67
|
+
sessionId: first.session_id ?? null,
|
|
68
|
+
windowStartAt: first.occurred_at,
|
|
69
|
+
windowEndAt: last.occurred_at,
|
|
70
|
+
eventCount: sorted.length,
|
|
71
|
+
goalCount: uniqueGoals.length,
|
|
72
|
+
successCount: uniqueSuccesses.length,
|
|
73
|
+
failureCount: uniqueFailures.length,
|
|
74
|
+
riskCount: uniqueRisks.length,
|
|
75
|
+
summary,
|
|
76
|
+
learnings,
|
|
77
|
+
nextActions: uniqueNext.length ? uniqueNext : ["Continue from latest successful event and resolve highest-impact failure/risk first."],
|
|
78
|
+
evidenceEventIds: sorted.slice(-25).map((e) => e.id),
|
|
79
|
+
confidence: Math.min(0.95, 0.5 + Math.min(sorted.length, 100) / 250 + uniqueGoals.length * 0.03)
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
async function resolveClient(client) {
|
|
83
|
+
if (client) return client;
|
|
84
|
+
const { getClient } = await import("./lib/database.js");
|
|
85
|
+
return getClient();
|
|
86
|
+
}
|
|
87
|
+
async function insertReflectionCheckpoint(checkpoint, client) {
|
|
88
|
+
const db = await resolveClient(client);
|
|
89
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
90
|
+
await db.execute({
|
|
91
|
+
sql: `INSERT INTO agent_reflection_checkpoints
|
|
92
|
+
(id, project_name, session_id, window_start_at, window_end_at, event_count, goal_count,
|
|
93
|
+
success_count, failure_count, risk_count, summary, learnings, next_actions, evidence_event_ids,
|
|
94
|
+
confidence, created_at)
|
|
95
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
96
|
+
ON CONFLICT(id) DO UPDATE SET summary = excluded.summary, learnings = excluded.learnings,
|
|
97
|
+
next_actions = excluded.next_actions, confidence = excluded.confidence`,
|
|
98
|
+
args: [
|
|
99
|
+
checkpoint.id,
|
|
100
|
+
checkpoint.projectName,
|
|
101
|
+
checkpoint.sessionId,
|
|
102
|
+
checkpoint.windowStartAt,
|
|
103
|
+
checkpoint.windowEndAt,
|
|
104
|
+
checkpoint.eventCount,
|
|
105
|
+
checkpoint.goalCount,
|
|
106
|
+
checkpoint.successCount,
|
|
107
|
+
checkpoint.failureCount,
|
|
108
|
+
checkpoint.riskCount,
|
|
109
|
+
checkpoint.summary,
|
|
110
|
+
JSON.stringify(checkpoint.learnings),
|
|
111
|
+
JSON.stringify(checkpoint.nextActions),
|
|
112
|
+
JSON.stringify(checkpoint.evidenceEventIds),
|
|
113
|
+
checkpoint.confidence,
|
|
114
|
+
now
|
|
115
|
+
]
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
async function generateReflectionCheckpoints(opts = {}) {
|
|
119
|
+
const db = await resolveClient(opts.client);
|
|
120
|
+
const windowSize = opts.windowSize ?? 100;
|
|
121
|
+
const minEvents = opts.minEvents ?? 20;
|
|
122
|
+
const limit = opts.limit ?? 5e3;
|
|
123
|
+
const where = opts.projectName ? "WHERE project_name = ?" : "";
|
|
124
|
+
const args = opts.projectName ? [opts.projectName] : [];
|
|
125
|
+
const result = await db.execute({
|
|
126
|
+
sql: `SELECT id, event_type, occurred_at, actor_agent_id, project_name, session_id, intention, outcome, impact, evidence_memory_id, payload
|
|
127
|
+
FROM agent_events ${where}
|
|
128
|
+
ORDER BY project_name, session_id, occurred_at, sequence_index
|
|
129
|
+
LIMIT ?`,
|
|
130
|
+
args: [...args, limit]
|
|
131
|
+
});
|
|
132
|
+
const groups = /* @__PURE__ */ new Map();
|
|
133
|
+
for (const row of result.rows) {
|
|
134
|
+
const event = row;
|
|
135
|
+
const key = `${event.project_name ?? ""}::${event.session_id ?? ""}`;
|
|
136
|
+
const bucket = groups.get(key) ?? [];
|
|
137
|
+
bucket.push(event);
|
|
138
|
+
groups.set(key, bucket);
|
|
139
|
+
}
|
|
140
|
+
let inserted = 0;
|
|
141
|
+
for (const events of groups.values()) {
|
|
142
|
+
for (let i = 0; i < events.length; i += windowSize) {
|
|
143
|
+
const window = events.slice(i, i + windowSize);
|
|
144
|
+
if (window.length < minEvents) continue;
|
|
145
|
+
const checkpoint = buildReflectionCheckpoint(window);
|
|
146
|
+
if (!checkpoint) continue;
|
|
147
|
+
await insertReflectionCheckpoint(checkpoint, db);
|
|
148
|
+
inserted++;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return inserted;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export {
|
|
155
|
+
buildReflectionCheckpoint,
|
|
156
|
+
generateReflectionCheckpoints
|
|
157
|
+
};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import {
|
|
2
|
+
PLATFORM_PROCEDURES,
|
|
3
|
+
PLATFORM_PROCEDURE_TITLES
|
|
4
|
+
} from "./chunk-5NFBE376.js";
|
|
5
|
+
import {
|
|
6
|
+
getClient
|
|
7
|
+
} from "./chunk-UJOSFVWG.js";
|
|
8
|
+
|
|
9
|
+
// src/lib/global-procedures.ts
|
|
10
|
+
import { randomUUID } from "crypto";
|
|
11
|
+
var _customerCache = "";
|
|
12
|
+
var _cacheLoaded = false;
|
|
13
|
+
var _platformCache = PLATFORM_PROCEDURES.map((p) => `### ${p.title}
|
|
14
|
+
${p.content}`).join("\n\n");
|
|
15
|
+
async function loadGlobalProcedures() {
|
|
16
|
+
const client = getClient();
|
|
17
|
+
const result = await client.execute({
|
|
18
|
+
sql: "SELECT * FROM company_procedures WHERE active = 1 ORDER BY priority ASC, created_at ASC",
|
|
19
|
+
args: []
|
|
20
|
+
});
|
|
21
|
+
const allRows = result.rows;
|
|
22
|
+
const customerOnly = allRows.filter((p) => !PLATFORM_PROCEDURE_TITLES.has(p.title));
|
|
23
|
+
const values = customerOnly.filter((p) => p.kind === "value");
|
|
24
|
+
const procedures = customerOnly.filter((p) => p.kind !== "value");
|
|
25
|
+
const parts = [];
|
|
26
|
+
if (values.length > 0) {
|
|
27
|
+
parts.push("### Company Values\n" + values.map((v) => `- **${v.title}:** ${v.content}`).join("\n"));
|
|
28
|
+
}
|
|
29
|
+
if (procedures.length > 0) {
|
|
30
|
+
parts.push(procedures.map((p) => `### ${p.title}
|
|
31
|
+
${p.content}`).join("\n\n"));
|
|
32
|
+
}
|
|
33
|
+
_customerCache = parts.join("\n\n");
|
|
34
|
+
_cacheLoaded = true;
|
|
35
|
+
return customerOnly;
|
|
36
|
+
}
|
|
37
|
+
function getGlobalProceduresBlock() {
|
|
38
|
+
const sections = [];
|
|
39
|
+
if (_platformCache) sections.push(_platformCache);
|
|
40
|
+
if (_cacheLoaded && _customerCache) sections.push(_customerCache);
|
|
41
|
+
if (sections.length === 0) return "";
|
|
42
|
+
return `## Organization-Wide Procedures (MANDATORY \u2014 supersedes all other rules)
|
|
43
|
+
|
|
44
|
+
${sections.join("\n\n")}
|
|
45
|
+
`;
|
|
46
|
+
}
|
|
47
|
+
async function storeGlobalProcedure(input) {
|
|
48
|
+
const id = randomUUID();
|
|
49
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
50
|
+
const client = getClient();
|
|
51
|
+
await client.execute({
|
|
52
|
+
sql: `INSERT INTO company_procedures (id, title, content, priority, domain, kind, active, created_at, updated_at)
|
|
53
|
+
VALUES (?, ?, ?, ?, ?, ?, 1, ?, ?)`,
|
|
54
|
+
args: [id, input.title, input.content, input.priority ?? "p0", input.domain ?? null, input.kind ?? "procedure", now, now]
|
|
55
|
+
});
|
|
56
|
+
await loadGlobalProcedures();
|
|
57
|
+
return id;
|
|
58
|
+
}
|
|
59
|
+
async function deactivateGlobalProcedure(id) {
|
|
60
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
61
|
+
const client = getClient();
|
|
62
|
+
const result = await client.execute({
|
|
63
|
+
sql: "UPDATE company_procedures SET active = 0, updated_at = ? WHERE id = ?",
|
|
64
|
+
args: [now, id]
|
|
65
|
+
});
|
|
66
|
+
await loadGlobalProcedures();
|
|
67
|
+
return result.rowsAffected > 0;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export {
|
|
71
|
+
loadGlobalProcedures,
|
|
72
|
+
getGlobalProceduresBlock,
|
|
73
|
+
storeGlobalProcedure,
|
|
74
|
+
deactivateGlobalProcedure
|
|
75
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import {
|
|
2
|
+
completeReminder
|
|
3
|
+
} from "./chunk-R2E4TV5V.js";
|
|
4
|
+
|
|
5
|
+
// src/mcp/tools/complete-reminder.ts
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
function registerCompleteReminder(server) {
|
|
8
|
+
server.registerTool(
|
|
9
|
+
"complete_reminder",
|
|
10
|
+
{
|
|
11
|
+
title: "Complete Reminder",
|
|
12
|
+
description: "Mark a reminder as done. Accepts UUID or text substring.",
|
|
13
|
+
inputSchema: {
|
|
14
|
+
reminder_id: z.string().describe("Reminder UUID or text substring to match")
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
async ({ reminder_id }) => {
|
|
18
|
+
const reminder = await completeReminder(reminder_id);
|
|
19
|
+
if (!reminder) {
|
|
20
|
+
return {
|
|
21
|
+
content: [{ type: "text", text: `No active reminder matching "${reminder_id}".` }]
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
content: [{ type: "text", text: `Reminder completed: "${reminder.text}"` }]
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export {
|
|
32
|
+
registerCompleteReminder
|
|
33
|
+
};
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
// src/gateway/crm-bridge.ts
|
|
2
|
+
var config = null;
|
|
3
|
+
var disabledLogged = false;
|
|
4
|
+
function initCRMBridge() {
|
|
5
|
+
const apiToken = process.env.EXE_CRM_ADMIN_TOKEN || process.env.CRM_API_TOKEN;
|
|
6
|
+
if (!apiToken) {
|
|
7
|
+
if (!disabledLogged) {
|
|
8
|
+
console.log("[crm-bridge] Disabled \u2014 EXE_CRM_ADMIN_TOKEN not set");
|
|
9
|
+
disabledLogged = true;
|
|
10
|
+
}
|
|
11
|
+
config = null;
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
const graphqlUrl = process.env.CRM_GRAPHQL_URL || "http://localhost:3000";
|
|
15
|
+
config = { graphqlUrl, apiToken };
|
|
16
|
+
console.log(`[crm-bridge] Enabled \u2014 pushing to ${graphqlUrl}`);
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
function isCRMBridgeEnabled() {
|
|
20
|
+
return config !== null;
|
|
21
|
+
}
|
|
22
|
+
async function gqlRequest(query, variables) {
|
|
23
|
+
const res = await fetch(`${config.graphqlUrl}/api`, {
|
|
24
|
+
method: "POST",
|
|
25
|
+
headers: {
|
|
26
|
+
"Content-Type": "application/json",
|
|
27
|
+
Authorization: `Bearer ${config.apiToken}`
|
|
28
|
+
},
|
|
29
|
+
body: JSON.stringify({ query, variables }),
|
|
30
|
+
signal: AbortSignal.timeout(3e4)
|
|
31
|
+
});
|
|
32
|
+
if (!res.ok) {
|
|
33
|
+
throw new Error(`CRM GraphQL request failed: ${res.status} ${res.statusText}`);
|
|
34
|
+
}
|
|
35
|
+
return res.json();
|
|
36
|
+
}
|
|
37
|
+
async function findPersonByContact(platform, senderId) {
|
|
38
|
+
const isEmail = platform === "email";
|
|
39
|
+
const query = isEmail ? `query FindPerson($value: String!) {
|
|
40
|
+
people(filter: { emails: { primaryEmail: { eq: $value } } }, first: 1) {
|
|
41
|
+
edges { node { id } }
|
|
42
|
+
}
|
|
43
|
+
}` : `query FindPerson($value: String!) {
|
|
44
|
+
people(filter: { phones: { primaryPhoneNumber: { eq: $value } } }, first: 1) {
|
|
45
|
+
edges { node { id } }
|
|
46
|
+
}
|
|
47
|
+
}`;
|
|
48
|
+
const res = await gqlRequest(query, { value: senderId });
|
|
49
|
+
if (res.errors && res.errors.length > 0) {
|
|
50
|
+
console.error("[crm-bridge] findPerson error:", res.errors[0].message);
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
const edges = res.data?.people?.edges;
|
|
54
|
+
return edges && edges.length > 0 ? edges[0].node.id : null;
|
|
55
|
+
}
|
|
56
|
+
async function createPerson(platform, senderId, senderName) {
|
|
57
|
+
const firstName = senderName?.split(" ")[0] || "";
|
|
58
|
+
const lastName = senderName?.split(" ").slice(1).join(" ") || "";
|
|
59
|
+
const isEmail = platform === "email";
|
|
60
|
+
const input = {
|
|
61
|
+
name: { firstName, lastName }
|
|
62
|
+
};
|
|
63
|
+
if (isEmail) {
|
|
64
|
+
input.emails = { primaryEmail: senderId, additionalEmails: [] };
|
|
65
|
+
} else {
|
|
66
|
+
input.phones = {
|
|
67
|
+
primaryPhoneNumber: senderId,
|
|
68
|
+
primaryPhoneCountryCode: "",
|
|
69
|
+
primaryPhoneCallingCode: "",
|
|
70
|
+
additionalPhones: []
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
const query = `
|
|
74
|
+
mutation CreatePerson($input: PersonCreateInput!) {
|
|
75
|
+
createPerson(data: $input) {
|
|
76
|
+
id
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
`;
|
|
80
|
+
const res = await gqlRequest(query, {
|
|
81
|
+
input
|
|
82
|
+
});
|
|
83
|
+
if (res.errors && res.errors.length > 0) {
|
|
84
|
+
console.error("[crm-bridge] createPerson error:", res.errors[0].message);
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
return res.data?.createPerson?.id ?? null;
|
|
88
|
+
}
|
|
89
|
+
async function createTimelineActivity(personId, params) {
|
|
90
|
+
const channelLabel = params.platform.charAt(0).toUpperCase() + params.platform.slice(1);
|
|
91
|
+
const label = params.direction === "inbound" ? "message from" : "conversation with";
|
|
92
|
+
const input = {
|
|
93
|
+
name: `${channelLabel} ${label} ${params.senderName || params.senderId}`,
|
|
94
|
+
happensAt: params.timestamp,
|
|
95
|
+
properties: {
|
|
96
|
+
channel: params.platform,
|
|
97
|
+
senderId: params.senderId,
|
|
98
|
+
senderName: params.senderName || null,
|
|
99
|
+
messageText: params.messageText,
|
|
100
|
+
agentResponse: params.agentResponse || null,
|
|
101
|
+
agentName: params.agentName || null,
|
|
102
|
+
threadId: `${params.platform}:${params.senderId}`,
|
|
103
|
+
direction: params.direction,
|
|
104
|
+
accountId: params.accountId || null
|
|
105
|
+
},
|
|
106
|
+
targetPersonId: personId
|
|
107
|
+
};
|
|
108
|
+
const query = `
|
|
109
|
+
mutation CreateTimelineActivity($input: TimelineActivityCreateInput!) {
|
|
110
|
+
createTimelineActivity(data: $input) {
|
|
111
|
+
id
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
`;
|
|
115
|
+
const res = await gqlRequest(
|
|
116
|
+
query,
|
|
117
|
+
{ input }
|
|
118
|
+
);
|
|
119
|
+
if (res.errors && res.errors.length > 0) {
|
|
120
|
+
console.error(
|
|
121
|
+
"[crm-bridge] createTimelineActivity error:",
|
|
122
|
+
res.errors[0].message
|
|
123
|
+
);
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
async function pushConversationToCRM(params) {
|
|
129
|
+
if (!config) return;
|
|
130
|
+
try {
|
|
131
|
+
let personId = await findPersonByContact(params.platform, params.senderId);
|
|
132
|
+
if (!personId) {
|
|
133
|
+
personId = await createPerson(
|
|
134
|
+
params.platform,
|
|
135
|
+
params.senderId,
|
|
136
|
+
params.senderName
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
if (!personId) {
|
|
140
|
+
console.error("[crm-bridge] Failed to find or create person for", params.senderId);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
const ok = await createTimelineActivity(personId, {
|
|
144
|
+
...params,
|
|
145
|
+
direction: "conversation"
|
|
146
|
+
});
|
|
147
|
+
if (ok) {
|
|
148
|
+
console.log(
|
|
149
|
+
`[crm-bridge] Pushed ${params.platform}/${params.senderId} \u2192 person ${personId}`
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
} catch (err) {
|
|
153
|
+
console.error("[crm-bridge] Push failed:", err instanceof Error ? err.message : err);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
async function pushInboundMessageToCRM(params) {
|
|
157
|
+
if (!config) return;
|
|
158
|
+
try {
|
|
159
|
+
let personId = await findPersonByContact(params.platform, params.senderId);
|
|
160
|
+
if (!personId) {
|
|
161
|
+
personId = await createPerson(
|
|
162
|
+
params.platform,
|
|
163
|
+
params.senderId,
|
|
164
|
+
params.senderName
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
if (!personId) {
|
|
168
|
+
console.error("[crm-bridge] Failed to find or create person for", params.senderId);
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
const ok = await createTimelineActivity(personId, {
|
|
172
|
+
...params,
|
|
173
|
+
direction: "inbound"
|
|
174
|
+
});
|
|
175
|
+
if (ok) {
|
|
176
|
+
console.log(
|
|
177
|
+
`[crm-bridge] Inbound ${params.platform}/${params.senderId} \u2192 person ${personId}`
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
} catch (err) {
|
|
181
|
+
console.error("[crm-bridge] Inbound push failed:", err instanceof Error ? err.message : err);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
async function pushGatewayEventToCRM(params) {
|
|
185
|
+
if (!config) return;
|
|
186
|
+
try {
|
|
187
|
+
let personId = await findPersonByContact(params.platform, params.senderId);
|
|
188
|
+
if (!personId) {
|
|
189
|
+
personId = await createPerson(
|
|
190
|
+
params.platform,
|
|
191
|
+
params.senderId,
|
|
192
|
+
params.senderName
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
if (!personId) {
|
|
196
|
+
console.error("[crm-bridge] Failed to find or create person for", params.senderId);
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
const channelLabel = params.platform.charAt(0).toUpperCase() + params.platform.slice(1);
|
|
200
|
+
const categoryLabel = params.dataCategory.replace(/_/g, " ");
|
|
201
|
+
const input = {
|
|
202
|
+
name: `${channelLabel} ${categoryLabel} \u2014 ${params.senderName || params.senderId}`,
|
|
203
|
+
happensAt: params.timestamp,
|
|
204
|
+
properties: {
|
|
205
|
+
channel: params.platform,
|
|
206
|
+
dataCategory: params.dataCategory,
|
|
207
|
+
senderId: params.senderId,
|
|
208
|
+
senderName: params.senderName || null,
|
|
209
|
+
accountId: params.accountId || null,
|
|
210
|
+
direction: "inbound",
|
|
211
|
+
...params.eventData
|
|
212
|
+
},
|
|
213
|
+
targetPersonId: personId
|
|
214
|
+
};
|
|
215
|
+
const query = `
|
|
216
|
+
mutation CreateTimelineActivity($input: TimelineActivityCreateInput!) {
|
|
217
|
+
createTimelineActivity(data: $input) {
|
|
218
|
+
id
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
`;
|
|
222
|
+
const res = await gqlRequest(
|
|
223
|
+
query,
|
|
224
|
+
{ input }
|
|
225
|
+
);
|
|
226
|
+
if (res.errors && res.errors.length > 0) {
|
|
227
|
+
console.error(
|
|
228
|
+
"[crm-bridge] pushGatewayEvent error:",
|
|
229
|
+
res.errors[0].message
|
|
230
|
+
);
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
console.log(
|
|
234
|
+
`[crm-bridge] Event ${params.dataCategory} ${params.platform}/${params.senderId} \u2192 person ${personId}`
|
|
235
|
+
);
|
|
236
|
+
} catch (err) {
|
|
237
|
+
console.error("[crm-bridge] Event push failed:", err instanceof Error ? err.message : err);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
export {
|
|
242
|
+
initCRMBridge,
|
|
243
|
+
isCRMBridgeEnabled,
|
|
244
|
+
findPersonByContact,
|
|
245
|
+
createPerson,
|
|
246
|
+
pushConversationToCRM,
|
|
247
|
+
pushInboundMessageToCRM,
|
|
248
|
+
pushGatewayEventToCRM
|
|
249
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getAgentContext
|
|
3
|
+
} from "./chunk-GJV3WDWM.js";
|
|
4
|
+
|
|
5
|
+
// src/lib/project-name.ts
|
|
6
|
+
import { execSync } from "child_process";
|
|
7
|
+
import path from "path";
|
|
8
|
+
var _cached = null;
|
|
9
|
+
var _cachedCwd = null;
|
|
10
|
+
function getProjectName(cwd) {
|
|
11
|
+
if (!cwd) {
|
|
12
|
+
try {
|
|
13
|
+
const ctx = getAgentContext();
|
|
14
|
+
if (ctx?.projectName) return ctx.projectName;
|
|
15
|
+
} catch {
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const dir = cwd ?? process.cwd();
|
|
19
|
+
if (_cached && _cachedCwd === dir) return _cached;
|
|
20
|
+
try {
|
|
21
|
+
let repoRoot;
|
|
22
|
+
try {
|
|
23
|
+
const gitCommonDir = execSync("git rev-parse --path-format=absolute --git-common-dir", {
|
|
24
|
+
cwd: dir,
|
|
25
|
+
encoding: "utf8",
|
|
26
|
+
timeout: 2e3,
|
|
27
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
28
|
+
}).trim();
|
|
29
|
+
repoRoot = path.dirname(gitCommonDir);
|
|
30
|
+
} catch {
|
|
31
|
+
repoRoot = execSync("git rev-parse --show-toplevel", {
|
|
32
|
+
cwd: dir,
|
|
33
|
+
encoding: "utf8",
|
|
34
|
+
timeout: 2e3,
|
|
35
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
36
|
+
}).trim();
|
|
37
|
+
}
|
|
38
|
+
_cached = path.basename(repoRoot);
|
|
39
|
+
_cachedCwd = dir;
|
|
40
|
+
return _cached;
|
|
41
|
+
} catch {
|
|
42
|
+
_cached = path.basename(dir);
|
|
43
|
+
_cachedCwd = dir;
|
|
44
|
+
return _cached;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function _resetCache() {
|
|
48
|
+
_cached = null;
|
|
49
|
+
_cachedCwd = null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export {
|
|
53
|
+
getProjectName,
|
|
54
|
+
_resetCache
|
|
55
|
+
};
|