@askexenow/exe-os 0.9.384 → 0.9.389
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.askexe-control-plane.example +6 -0
- package/deploy/compose/.env.customer.example +1 -1
- package/deploy/compose/.env.example +1 -1
- package/deploy/compose/docker-compose.yml +16 -0
- package/deploy/compose/generate-env.ts +1 -1
- package/deploy/compose/sso-edge/sso-redirect.conf +18 -3
- package/deploy/stack-manifests/v0.9.json +1160 -1
- package/dist/.dist-verified.json +3 -3
- package/dist/{active-agent-F5V4E4UL.js → active-agent-RZ24KSJN.js} +8 -6
- package/dist/{active-agent-YTBB4ZQM.js → active-agent-YWSWPIEA.js} +8 -6
- package/dist/{agent-defs-generator-7TFISIJQ.js → agent-defs-generator-GY3UBREJ.js} +8 -6
- package/dist/{agent-heartbeat-CQPGJIFF.js → agent-heartbeat-GUVUUQVM.js} +1 -1
- package/dist/{agent-loop-EZ7LDAGD.js → agent-loop-HPNCH3HK.js} +1 -1
- package/dist/{agentic-ontology-XVTUVV7W.js → agentic-ontology-RHYNXEKE.js} +1 -1
- package/dist/{artifact-backup-TF6YWQT2.js → artifact-backup-HGUFSIJH.js} +19 -6
- package/dist/{backfill-metadata-J6MXIDCW.js → backfill-metadata-XLFASEOD.js} +11 -9
- package/dist/{backup-verify-6DVBQMDP.js → backup-verify-TUQEICWA.js} +1 -1
- package/dist/{behavior-injection-XDA7ZCYN.js → behavior-injection-GXO7ERGN.js} +14 -12
- package/dist/{behavior-promotion-4VLQ7LXK.js → behavior-promotion-V63WIZ4N.js} +13 -11
- package/dist/{behaviors-SCCZP7RZ.js → behaviors-RMLDPLOF.js} +18 -11
- package/dist/bin/agentic-ontology-backfill.js +12 -10
- package/dist/bin/agentic-reflection-backfill.js +13 -11
- package/dist/bin/agentic-semantic-label.js +12 -10
- package/dist/bin/backfill-conversations.js +11 -9
- package/dist/bin/backfill-responses.js +11 -9
- package/dist/bin/backfill-vectors.js +13 -11
- package/dist/bin/bulk-sync-postgres.js +20 -18
- package/dist/bin/cc-doctor.js +15 -13
- package/dist/bin/cleanup-stale-review-tasks.js +44 -32
- package/dist/bin/cli.js +109 -30
- package/dist/bin/customer-readiness.js +55 -25
- package/dist/bin/deferred-daemon-restart.js +111 -108
- package/dist/bin/exe-actions.js +7 -1
- package/dist/bin/exe-agent-config.js +8 -6
- package/dist/bin/exe-agent.js +18 -16
- package/dist/bin/exe-assign.js +13 -11
- package/dist/bin/exe-boot.js +49 -47
- package/dist/bin/exe-call.js +9 -7
- package/dist/bin/exe-cicd.js +19 -8
- package/dist/bin/exe-cloud.js +59 -25
- package/dist/bin/exe-config-dump.js +8 -6
- package/dist/bin/exe-dispatch.js +23 -21
- package/dist/bin/exe-doctor.js +11 -8
- package/dist/bin/exe-export-behaviors.js +16 -14
- package/dist/bin/exe-forget.js +14 -12
- package/dist/bin/exe-gateway.js +12 -10
- package/dist/bin/exe-grant.js +6 -6
- package/dist/bin/exe-healthcheck.js +15 -13
- package/dist/bin/exe-heartbeat.js +28 -26
- package/dist/bin/exe-kill.js +28 -26
- package/dist/bin/exe-launch-agent.js +35 -33
- package/dist/bin/exe-mcp.js +9 -7
- package/dist/bin/exe-memory-reads.js +11 -9
- package/dist/bin/exe-new-employee.js +13 -11
- package/dist/bin/exe-os-mcp-proxy.js +9 -7
- package/dist/bin/exe-pending-messages.js +23 -21
- package/dist/bin/exe-pending-notifications.js +22 -20
- package/dist/bin/exe-pending-reviews.js +23 -21
- package/dist/bin/exe-preflight.js +1 -1
- package/dist/bin/exe-rename.js +9 -7
- package/dist/bin/exe-review.js +59 -55
- package/dist/bin/exe-search-quality.js +16 -3
- package/dist/bin/exe-search.js +13 -11
- package/dist/bin/exe-session-cleanup.js +29 -27
- package/dist/bin/exe-settings.js +22 -20
- package/dist/bin/exe-start-codex.js +23 -21
- package/dist/bin/exe-start-opencode.js +21 -19
- package/dist/bin/exe-status.js +24 -22
- package/dist/bin/exe-support.js +3 -3
- package/dist/bin/exe-team.js +8 -6
- package/dist/bin/exe-verify-running-images.js +644 -17
- package/dist/bin/git-sweep.js +24 -22
- package/dist/bin/graph-backfill.js +12 -10
- package/dist/bin/graph-export.js +12 -10
- package/dist/bin/hooks-cli.js +4 -4
- package/dist/bin/import-history.js +16 -14
- package/dist/bin/install.js +113 -110
- package/dist/bin/intercom-check.js +5 -5
- package/dist/bin/mcp-sessions.js +2 -2
- package/dist/bin/orchestration-metrics.js +8 -6
- package/dist/bin/postgres-agentic-reflection-backfill.js +2 -2
- package/dist/bin/postgres-agentic-semantic-backfill.js +1 -1
- package/dist/bin/pre-build-guard.js +55 -16
- package/dist/bin/pre-publish.js +1 -1
- package/dist/bin/prune-orphan-chunks.js +154 -28
- package/dist/bin/reconcile-backlog.js +5 -3
- package/dist/bin/registry-proxy.js +1 -1
- package/dist/bin/repair-document-chunks.js +11 -9
- package/dist/bin/scan-tasks.js +23 -21
- package/dist/bin/setup.js +3 -3
- package/dist/bin/shard-migrate.js +12 -10
- package/dist/bin/stack-update.js +622 -43
- package/dist/bin/verify-stack.js +2 -2
- package/dist/bin/vps-health-gate.js +1 -1
- package/dist/{boot-generation-Q7LGQ3AO.js → boot-generation-VCQXVYGT.js} +7 -5
- package/dist/{boot-review-sections-G5774FR5.js → boot-review-sections-3QO6Q7MP.js} +21 -19
- package/dist/{branch-hygiene-44WLSOZR.js → branch-hygiene-DDXXI6ZA.js} +59 -21
- package/dist/bug-landed-reconciler-TQVNOUCU.js +353 -0
- package/dist/build-manifest.json +1269 -1194
- package/dist/{capability-cards-I3RHCF4F.js → capability-cards-XPDLT6LU.js} +6 -4
- package/dist/{capacity-monitor-7I7GDONU.js → capacity-monitor-N3AW242L.js} +23 -21
- package/dist/{catchup-brief-3T5PARIR.js → catchup-brief-3PKX7FUP.js} +29 -27
- package/dist/{chunk-C5ISP5FO.js → chunk-2BKJAOO4.js} +11 -1
- package/dist/{chunk-JJTPPAZY.js → chunk-2CUQHG6H.js} +1609 -1356
- package/dist/{chunk-HU3VD4MQ.js → chunk-2Q2GGYBX.js} +1 -1
- package/dist/{chunk-CHIUS5QB.js → chunk-36LMIOVU.js} +9 -9
- package/dist/{chunk-46VSBDUW.js → chunk-3DCBDG4T.js} +2 -2
- package/dist/{chunk-W3KPQE7H.js → chunk-3GL3E4TD.js} +3 -3
- package/dist/{chunk-GL47M7NY.js → chunk-3UD3OF3X.js} +202 -117
- package/dist/{chunk-WNBZJSQT.js → chunk-3VW5ZP2F.js} +1 -1
- package/dist/{chunk-JDDM6C57.js → chunk-3X74IQBU.js} +1 -1
- package/dist/{chunk-NVFNADTX.js → chunk-3ZL4MDQ6.js} +18 -4
- package/dist/{chunk-R5E7WNAC.js → chunk-4ESNDGMB.js} +3 -3
- package/dist/{chunk-CYCIX7AW.js → chunk-4FLLIQRQ.js} +2 -2
- package/dist/{chunk-3RGTLZNO.js → chunk-4GAKF7KR.js} +99 -74
- package/dist/{chunk-RVO5O5SR.js → chunk-4S3A52AV.js} +38 -10
- package/dist/{chunk-7J2ZQ4XN.js → chunk-4VQ3QR6B.js} +29 -28
- package/dist/{chunk-MROSARM5.js → chunk-5BJBTFFQ.js} +7 -1
- package/dist/chunk-5LQZABW5.js +6 -0
- package/dist/chunk-5ONMHTNI.js +236 -0
- package/dist/{chunk-APL7HUE3.js → chunk-5QQJUO3F.js} +200 -31
- package/dist/{chunk-UOPCVFVR.js → chunk-5RK75SWH.js} +205 -278
- package/dist/{chunk-T5FEAQES.js → chunk-5TYJYGS5.js} +1 -1
- package/dist/{chunk-P3QQ52QK.js → chunk-5U6EOTZV.js} +3 -3
- package/dist/{chunk-ALRHGEAJ.js → chunk-637FL62O.js} +1 -1
- package/dist/{chunk-PUBA5B4M.js → chunk-6L4VIYLZ.js} +33 -19
- package/dist/{chunk-VF2KRROX.js → chunk-754P2UXM.js} +1 -1
- package/dist/{chunk-CM7N5MBY.js → chunk-7FZG7WP4.js} +5 -5
- package/dist/{chunk-NYLJQ2M2.js → chunk-7NEBFB3L.js} +4 -4
- package/dist/{chunk-E7C2WNR5.js → chunk-AEIOFFFX.js} +5 -5
- package/dist/{chunk-VOVFUKEB.js → chunk-AIB2EWO2.js} +5 -5
- package/dist/{chunk-EGOEB42T.js → chunk-AP2C4OGS.js} +3 -3
- package/dist/{chunk-MPZ2AVNS.js → chunk-ATNV3BVZ.js} +1 -1
- package/dist/{chunk-F4BBMIPG.js → chunk-B4XJQBQB.js} +2 -2
- package/dist/{chunk-BPVFZ6Q4.js → chunk-B5EGDNG6.js} +2 -2
- package/dist/{chunk-AGC2V7JS.js → chunk-B6CBN6EF.js} +1 -1
- package/dist/{chunk-KTKIFXIP.js → chunk-B7FDRN7G.js} +1 -1
- package/dist/{chunk-C5HUMAA7.js → chunk-B7WVYLAQ.js} +67 -15
- package/dist/chunk-BGVP5RMT.js +185 -0
- package/dist/{chunk-FVLNNNH6.js → chunk-BNI4LIU5.js} +35 -4
- package/dist/{chunk-P4XLIPB7.js → chunk-BU5JRLZT.js} +1 -1
- package/dist/{chunk-PHUHIVD5.js → chunk-C6U7XWOC.js} +34 -5
- package/dist/chunk-C7GHNJPW.js +8 -0
- package/dist/{chunk-4AR5XKCH.js → chunk-CL2MU3OX.js} +1 -1
- package/dist/{chunk-ZPP63JSQ.js → chunk-CL3AB7Z2.js} +1 -1
- package/dist/{chunk-FHIFTSPL.js → chunk-CP7XUSOF.js} +8 -3
- package/dist/{chunk-3OX34OC3.js → chunk-CUDNRHHT.js} +30 -10
- package/dist/chunk-CYUUNIEL.js +21 -0
- package/dist/{chunk-P2UY34XE.js → chunk-D4C57S2H.js} +5 -5
- package/dist/{chunk-XSUALA32.js → chunk-DDYFNBYV.js} +3 -3
- package/dist/{chunk-LSNBTGW4.js → chunk-DPYZW42H.js} +1 -1
- package/dist/{chunk-FMIYFHLE.js → chunk-E2PRXEZK.js} +9 -3
- package/dist/{chunk-L63V25HS.js → chunk-E54SPUYJ.js} +3 -3
- package/dist/{chunk-DMUOTCDN.js → chunk-E5CKRHIZ.js} +1 -1
- package/dist/{chunk-BV2IET6B.js → chunk-EVMOKRBC.js} +15 -2
- package/dist/{chunk-YLFCH3VA.js → chunk-FDWI3T6I.js} +133 -31
- package/dist/{chunk-PWC3C5ME.js → chunk-FNJTCJGY.js} +4 -4
- package/dist/{chunk-TNS63ATU.js → chunk-FWRPDSO3.js} +350 -50
- package/dist/{chunk-JA3Y5TV6.js → chunk-GDLB6BPM.js} +141 -74
- package/dist/{chunk-IGJMS7C5.js → chunk-GOVGG7HU.js} +2 -2
- package/dist/{chunk-MB47DRF5.js → chunk-GP7CTIUK.js} +2 -2
- package/dist/{chunk-L5EPGGDP.js → chunk-GWAN2BDB.js} +4 -4
- package/dist/{chunk-YRQ26MNP.js → chunk-H3YF7X4J.js} +12 -5
- package/dist/{chunk-VLBHZ6TF.js → chunk-H6PLIFUE.js} +2 -2
- package/dist/{chunk-GSLFH4AI.js → chunk-HRNM3N4Y.js} +6 -15
- package/dist/chunk-IG2ISRTF.js +48 -0
- package/dist/{chunk-MWEIBVBS.js → chunk-IJCWBYA5.js} +14 -1
- package/dist/{chunk-NKEFYE4R.js → chunk-IPTUKX3N.js} +1 -1
- package/dist/{chunk-RB3J2WYQ.js → chunk-IVE7H6KA.js} +1 -1
- package/dist/{chunk-HA63SH5W.js → chunk-IWY2OGQG.js} +1 -1
- package/dist/{chunk-BQEZPRUC.js → chunk-IZWMWJZT.js} +64 -46
- package/dist/{chunk-AHESD3KW.js → chunk-J4UVI652.js} +1 -1
- package/dist/{chunk-PLII76NJ.js → chunk-JBUCA4OX.js} +33 -6
- package/dist/{chunk-2PZTMSMG.js → chunk-JOF4HQDF.js} +5 -5
- package/dist/{chunk-OBBO6EJR.js → chunk-JQN3QGSF.js} +1 -1
- package/dist/{chunk-P4PIZOL2.js → chunk-JWYIH5DR.js} +3 -3
- package/dist/{chunk-3XY57PKT.js → chunk-KZLKE7I3.js} +210 -48
- package/dist/{chunk-DYVLEMKS.js → chunk-L3GXMYBK.js} +1 -1
- package/dist/{chunk-72V3S44T.js → chunk-LUA4SLJY.js} +46 -19
- package/dist/{chunk-ZT4LFTUJ.js → chunk-LW3JCBXP.js} +20 -3
- package/dist/{chunk-YLB365YX.js → chunk-M5XHN4OM.js} +3 -3
- package/dist/{chunk-VHHX4UCP.js → chunk-MDTWARSF.js} +22 -93
- package/dist/{chunk-JFJP6ATJ.js → chunk-MWKXQSF6.js} +3 -2
- package/dist/{chunk-VJEJ7JNB.js → chunk-N32DVIKY.js} +1 -1
- package/dist/{chunk-MUCNYSJP.js → chunk-NRLJOV7M.js} +32 -4
- package/dist/{chunk-PL4CFSQ7.js → chunk-NSXJOSH7.js} +1 -1
- package/dist/{chunk-NF5FOSLD.js → chunk-NVTG66CK.js} +1 -1
- package/dist/chunk-O45GBJEH.js +1500 -0
- package/dist/{chunk-4AAMFWJT.js → chunk-OHZSTZXN.js} +4 -2
- package/dist/chunk-OSIS7ZQW.js +344 -0
- package/dist/{chunk-E3ZM32LF.js → chunk-P22VFGFK.js} +14 -5
- package/dist/{chunk-KILR4FBR.js → chunk-PAFLR7WD.js} +3 -3
- package/dist/{chunk-R3CZWFFC.js → chunk-PEYQ6MWO.js} +15 -3
- package/dist/{chunk-RDWIKDMY.js → chunk-PZR54BEI.js} +8 -20
- package/dist/{chunk-2FKU4ZEO.js → chunk-QDBKMEYY.js} +9 -9
- package/dist/{chunk-7UHZBVP3.js → chunk-QDVLVLXP.js} +97 -31
- package/dist/{chunk-PRDDPQLC.js → chunk-QLXEQRHD.js} +5 -5
- package/dist/{chunk-MUAWCFW6.js → chunk-QNPDXV5V.js} +5 -2
- package/dist/{chunk-LR5O2XWZ.js → chunk-QUZYLDNJ.js} +5 -5
- package/dist/chunk-RBQUXHYK.js +48 -0
- package/dist/{chunk-3SUPEE6H.js → chunk-RDMBSHGG.js} +3 -3
- package/dist/{chunk-I5XIW2BP.js → chunk-RGUM474V.js} +7 -7
- package/dist/{chunk-OAFENIHN.js → chunk-RJ67XAJU.js} +76 -28
- package/dist/{chunk-LFUBEHFW.js → chunk-RT57D7C4.js} +39 -1
- package/dist/{chunk-MKM6D7JM.js → chunk-RWG7DLOG.js} +42 -5
- package/dist/{chunk-P3UX5EH4.js → chunk-RWKAHHIX.js} +3 -3
- package/dist/{chunk-XEBKIWI7.js → chunk-RYNT3HB7.js} +12 -12
- package/dist/{chunk-EUGEFBGV.js → chunk-S2V272KJ.js} +3 -3
- package/dist/{chunk-W6BZ4UGA.js → chunk-SGYEM2PD.js} +1 -1
- package/dist/{chunk-VROK4X2L.js → chunk-SJP57MQM.js} +1 -1
- package/dist/{chunk-5MVKTNZP.js → chunk-SL4JWAMQ.js} +54 -4
- package/dist/{chunk-MOANZQXF.js → chunk-SLMKLEU6.js} +1 -1
- package/dist/{chunk-RZN2LEAK.js → chunk-SQA7XCYI.js} +3 -3
- package/dist/{chunk-4YNA3CM6.js → chunk-SSFS4NCH.js} +262 -56
- package/dist/{chunk-6FIC57PH.js → chunk-T4P2G3PO.js} +1 -1
- package/dist/{chunk-5U2IJBFV.js → chunk-TA3B4N24.js} +1 -1
- package/dist/{chunk-ZOTTYCP5.js → chunk-TEWWBVQP.js} +40 -4
- package/dist/{chunk-SDYWZRPN.js → chunk-TLSFGXXE.js} +1 -1
- package/dist/{chunk-L3VUW5M4.js → chunk-TQS2YHLB.js} +1 -1
- package/dist/{chunk-KXYKSLW4.js → chunk-TU4M757W.js} +399 -116
- package/dist/{chunk-MC4IM2CC.js → chunk-TYD4F4XU.js} +6 -6
- package/dist/{chunk-TKS5GMYA.js → chunk-U44Y7RC7.js} +2 -0
- package/dist/{chunk-B7AMNZTC.js → chunk-UKBPEEEQ.js} +2 -2
- package/dist/{chunk-ZBPZDADW.js → chunk-UWVXQEQQ.js} +467 -78
- package/dist/{chunk-P2VVMGMI.js → chunk-V4WH3FV7.js} +35 -16
- package/dist/{worktree-ownership-guard-O6JQF2CL.js → chunk-V6F4I2XY.js} +13 -14
- package/dist/{chunk-JFTUAV4J.js → chunk-VBKUESIW.js} +1 -1
- package/dist/{chunk-AZSTIAVL.js → chunk-VBPYYJPC.js} +1 -1
- package/dist/{chunk-LKTN22L6.js → chunk-VIP4LKLO.js} +57 -24
- package/dist/{chunk-L5CGXEZC.js → chunk-WAAGVFFN.js} +63 -71
- package/dist/{chunk-D3LXVAIQ.js → chunk-WC7AE3PT.js} +244 -103
- package/dist/{chunk-EOTZSAQL.js → chunk-WUCUDHKR.js} +1 -1
- package/dist/{chunk-VF3BZOZK.js → chunk-X7HZHKY4.js} +50 -3
- package/dist/{chunk-LFBLQE2P.js → chunk-XCAKYVKI.js} +1 -1
- package/dist/{chunk-UXN4BICC.js → chunk-XMX5J52Z.js} +1 -1
- package/dist/{chunk-6YDY6ZTD.js → chunk-XTCXGWTV.js} +9 -4
- package/dist/{chunk-XUZK23V7.js → chunk-XW2FW6LS.js} +2 -2
- package/dist/{chunk-CH7BUBP3.js → chunk-XWVHUDEK.js} +5 -4
- package/dist/{chunk-S26CV7BE.js → chunk-YA5LK6KB.js} +45 -8
- package/dist/{chunk-ELCRJGCH.js → chunk-YMRQIENV.js} +2 -2
- package/dist/{chunk-QNZ4562V.js → chunk-Z3LXWCB7.js} +1 -1
- package/dist/{chunk-EYMFVITZ.js → chunk-Z7I6NQMA.js} +2 -2
- package/dist/{chunk-6BJCDWSM.js → chunk-ZB4FS2EG.js} +1 -1
- package/dist/{chunk-ZAEUEDTN.js → chunk-ZD6FZ3WL.js} +1 -1
- package/dist/{chunk-FEU6QEEL.js → chunk-ZM6EZAVY.js} +1 -0
- package/dist/{chunk-2KY7WZZF.js → chunk-ZPA4R2UI.js} +1 -1
- package/dist/chunk-ZPPPHVSU.js +285 -0
- package/dist/{chunk-ELEGH4DX.js → chunk-ZUGQPYUY.js} +51 -4
- package/dist/{chunk-UX2EO653.js → chunk-ZZWFZ46U.js} +66 -8
- package/dist/{cleanup-graph-garbage-VQAJ2RBT.js → cleanup-graph-garbage-HFUD5ZQT.js} +12 -10
- package/dist/{cloud-sync-command-J7NEFUY7.js → cloud-sync-command-3JHJJKPN.js} +25 -3
- package/dist/{cloud-sync-db-init-KWEMNMGA.js → cloud-sync-db-init-2LHIQOSF.js} +1 -1
- package/dist/{cloud-sync-shutdown-P63AUTUI.js → cloud-sync-shutdown-ZXAXA3Z7.js} +6 -4
- package/dist/{cloud-sync-state-QF3TMMJ4.js → cloud-sync-state-VSQFGPP6.js} +1 -1
- package/dist/{co-activation-7IHRPBZN.js → co-activation-NX4EH4AP.js} +6 -4
- package/dist/{co-occurrence-R5AG4OAU.js → co-occurrence-5LBYCW3U.js} +10 -8
- package/dist/{consent-passphrase-5ZBDJ5G7.js → consent-passphrase-65W3DJIJ.js} +2 -2
- package/dist/{content-extractor-ZLXC6GNR.js → content-extractor-OGXETBOX.js} +2 -2
- package/dist/{conversation-entity-extractor-7FRKLLBD.js → conversation-entity-extractor-FQCOAH4F.js} +5 -4
- package/dist/conversations-retention-XTBFJBUM.js +166 -0
- package/dist/{crdt-sync-IFRZOEIS.js → crdt-sync-7TDUBTLH.js} +4 -4
- package/dist/{crm-webhook-L2S63ASV.js → crm-webhook-776JTY55.js} +2 -2
- package/dist/{cto-delegation-gate-3WU7OHX7.js → cto-delegation-gate-ZNUWVYCN.js} +25 -23
- package/dist/{daemon-orchestration-3VQYKLOR.js → daemon-orchestration-76BOFDEP.js} +30 -24
- package/dist/{doc-graph-extractor-YIR5E7OF.js → doc-graph-extractor-F724KZJX.js} +10 -8
- package/dist/{documents-QEHPTYIY.js → documents-Q24V4GRD.js} +13 -11
- package/dist/{dreaming-LNFE7DTN.js → dreaming-IY6NQTSP.js} +27 -25
- package/dist/{employee-boot-brief-ZTXDYNWM.js → employee-boot-brief-CCTXO5DQ.js} +35 -29
- package/dist/{entity-boost-R5N6JWXD.js → entity-boost-XGOB7HDM.js} +1 -1
- package/dist/{exe-drift-WYSJVZFO.js → exe-drift-NEPXLNGP.js} +7 -5
- package/dist/{exe-export-GOLNAEAV.js → exe-export-ZHJQFKR2.js} +14 -12
- package/dist/{exe-import-U4BSI6OH.js → exe-import-7SVNI4FW.js} +14 -12
- package/dist/{exe-key-V42G3NGO.js → exe-key-QJKU56WZ.js} +119 -108
- package/dist/{exe-org-U4GLQ6OP.js → exe-org-SJXHLV6K.js} +76 -51
- package/dist/{exe-snapshot-U7ONBYNY.js → exe-snapshot-EFWPXTXE.js} +45 -36
- package/dist/{fast-db-init-W3NGKAEU.js → fast-db-init-BQZOQNT3.js} +1 -1
- package/dist/{founder-context-ZSIBRVDM.js → founder-context-KG2ZAOXY.js} +2 -2
- package/dist/{founder-monitor-envelope-L3IWZLFY.js → founder-monitor-envelope-NYB5LLU4.js} +4 -4
- package/dist/gateway/index.js +20 -18
- package/dist/{gateway-client-DJFCVIPT.js → gateway-client-ODMUXUL3.js} +1 -1
- package/dist/{git-staleness-OF24QXFZ.js → git-staleness-OPGEAJA7.js} +6 -4
- package/dist/{global-procedures-WSIOWO43.js → global-procedures-3KXY4LL6.js} +8 -6
- package/dist/{graph-auto-extract-IEVVN3L3.js → graph-auto-extract-I7H2F5NJ.js} +10 -8
- package/dist/{graph-query-JDZWAVCU.js → graph-query-E7JBSNY5.js} +1 -1
- package/dist/{graph-rag-BKAD2XQA.js → graph-rag-H24CMFP2.js} +5 -4
- package/dist/{hook-integrity-TPWDGX2M.js → hook-integrity-PGQ3OX4S.js} +1 -1
- package/dist/{hook-prefetch-FD6VGJJA.js → hook-prefetch-7AZJER6Z.js} +23 -21
- package/dist/hook-registration-liveness-NGQRFKAA.js +11 -0
- package/dist/hooks/bug-report-worker.js +26 -24
- package/dist/hooks/codex-stop-task-finalizer.js +28 -26
- package/dist/hooks/commit-complete.js +26 -24
- package/dist/hooks/error-recall.js +16 -14
- package/dist/hooks/exe-heartbeat-hook.js +9 -7
- package/dist/hooks/ingest-worker.js +12 -10
- package/dist/hooks/ingest.js +22 -17
- package/dist/hooks/instructions-loaded.js +11 -9
- package/dist/hooks/manifest.json +20 -20
- package/dist/hooks/notification.js +10 -8
- package/dist/hooks/post-compact.js +9 -7
- package/dist/hooks/post-tool-combined.js +14 -14
- package/dist/hooks/pre-compact.js +26 -24
- package/dist/hooks/pre-tool-use.js +2 -2
- package/dist/hooks/prompt-submit.js +47 -41
- package/dist/hooks/session-end.js +38 -42
- package/dist/hooks/session-start.js +26 -18
- package/dist/hooks/stop.js +29 -27
- package/dist/hooks/subagent-stop.js +29 -27
- package/dist/hooks/summary-worker.js +32 -30
- package/dist/index.js +37 -35
- package/dist/{installer-OTI5SA43.js → installer-2ZS3LHCU.js} +12 -9
- package/dist/{installer-NMOBSEZ2.js → installer-NH3A3HWC.js} +14 -9
- package/dist/{installer-SRJGE4GU.js → installer-UJ73PGRD.js} +21 -9
- package/dist/{intercom-queue-4FFXCBHO.js → intercom-queue-OE25GJF2.js} +21 -19
- package/dist/lib/agent-config.js +2 -2
- package/dist/lib/cloud-sync.js +24 -18
- package/dist/lib/consolidation.js +13 -11
- package/dist/lib/crypto.js +3 -3
- package/dist/lib/database.js +6 -4
- package/dist/lib/db-backup.js +1 -1
- package/dist/lib/db-write-worker-client.js +3 -1
- package/dist/lib/db-write-worker.js +65 -89
- package/dist/lib/db.js +6 -4
- package/dist/lib/delivery-truth.js +5 -1
- package/dist/lib/device-registry.js +1 -1
- package/dist/lib/embedder.js +2 -2
- package/dist/lib/employee-templates.js +9 -7
- package/dist/lib/employees.js +6 -4
- package/dist/lib/exe-daemon.js +425 -314
- package/dist/lib/file-grep.js +15 -21
- package/dist/lib/hybrid-search.js +19 -13
- package/dist/lib/identity-templates.js +1 -1
- package/dist/lib/identity.js +6 -4
- package/dist/lib/keychain.js +1 -1
- package/dist/lib/license.js +22 -6
- package/dist/lib/messaging.js +22 -20
- package/dist/lib/post-tool-memory.js +10 -8
- package/dist/lib/registry-proxy.js +1 -1
- package/dist/lib/reminders.js +7 -5
- package/dist/lib/runtime-table.js +1 -1
- package/dist/lib/schedules.js +12 -10
- package/dist/lib/session-registry.js +8 -6
- package/dist/lib/skill-learning.js +13 -11
- package/dist/lib/status-brief.js +2 -2
- package/dist/lib/store.js +17 -9
- package/dist/lib/task-router.js +7 -5
- package/dist/lib/tasks.js +23 -21
- package/dist/lib/tmux-routing.js +21 -19
- package/dist/lib/tmux-status.js +4 -1
- package/dist/lib/token-spend.js +7 -5
- package/dist/lib/ws-client.js +1 -1
- package/dist/{license-gate-R4JWTWM4.js → license-gate-XQ2KN5I5.js} +3 -3
- package/dist/{license-recheck-3MBJ4IJX.js → license-recheck-IIBKR2V5.js} +1 -1
- package/dist/{license-sync-BVSG3WMW.js → license-sync-76JVI2M5.js} +151 -8
- package/dist/{local-secret-inventory-JWNBHZZ4.js → local-secret-inventory-MJT7NJLY.js} +2 -2
- package/dist/{mailbox-inbox-MTAT4MXX.js → mailbox-inbox-BPZP4GIZ.js} +1 -1
- package/dist/maintenance-worker-54VZTFIK.js +371 -0
- package/dist/mcp/register-tools.js +110 -107
- package/dist/mcp/server.js +113 -110
- package/dist/mcp/tools/complete-reminder.js +8 -6
- package/dist/mcp/tools/create-reminder.js +8 -6
- package/dist/mcp/tools/create-task.js +26 -24
- package/dist/mcp/tools/deactivate-behavior.js +15 -13
- package/dist/mcp/tools/list-reminders.js +8 -6
- package/dist/mcp/tools/list-tasks.js +26 -24
- package/dist/mcp/tools/send-message.js +25 -23
- package/dist/mcp/tools/update-task.js +24 -22
- package/dist/{mcp-child-registry-TIZERM7O.js → mcp-child-registry-5VUG5ATZ.js} +1 -1
- package/dist/{mcp-http-config-VUMSFWFH.js → mcp-http-config-SKXESWHA.js} +9 -7
- package/dist/{mcp-session-identity-DZHWEJRV.js → mcp-session-identity-HYMLJXXA.js} +21 -19
- package/dist/{memory-cards-JVXTMSAT.js → memory-cards-PAZDUQ3B.js} +16 -32
- package/dist/{memory-graph-extractor-PPBJMYFJ.js → memory-graph-extractor-BC6QKBY6.js} +11 -9
- package/dist/{memory-poisoning-defense-K5Q74XQ4.js → memory-poisoning-defense-BRGIHF6J.js} +9 -7
- package/dist/{memory-pressure-watchdog-YMJH5CSA.js → memory-pressure-watchdog-HR6TPOMT.js} +22 -20
- package/dist/{memory-reflection-7BZWIHRE.js → memory-reflection-LO7VFBL3.js} +38 -59
- package/dist/memory-write-repository-J25USX63.js +16 -0
- package/dist/{monitor-grants-Q7X3MYQP.js → monitor-grants-YQTO6NWR.js} +3 -3
- package/dist/{monitor-identity-ZQB4IXEE.js → monitor-identity-POVTG76Y.js} +2 -2
- package/dist/{notification-ledger-XRAXL5OI.js → notification-ledger-KLD6GZTG.js} +22 -20
- package/dist/{notifications-JE3PX55X.js → notifications-3R6HNHDR.js} +21 -19
- package/dist/{orchestration-events-JCQ5F5IJ.js → orchestration-events-CHY3GOJD.js} +7 -5
- package/dist/{orchestrator-X65INDTR.js → orchestrator-GAL3HOAD.js} +23 -21
- package/dist/{org-brief-session-3PQ22UIX.js → org-brief-session-LQ2DBYVF.js} +17 -15
- package/dist/{org-consent-policy-VGELJ7K7.js → org-consent-policy-KFUP7QPG.js} +5 -5
- package/dist/{org-join-6TO5ZYUZ.js → org-join-MXZCIQWX.js} +8 -8
- package/dist/{org-key-admin-XHYVRRAZ.js → org-key-admin-4UK6QUT7.js} +9 -9
- package/dist/{org-key-pin-TTTYGTQL.js → org-key-pin-ZOX4OM3O.js} +3 -3
- package/dist/{org-membership-Y7T2BS57.js → org-membership-D5TPN45F.js} +4 -4
- package/dist/{org-partner-config-OP4NEUNF.js → org-partner-config-3FXSYPQA.js} +7 -7
- package/dist/{org-partner-runtime-YNVUNT2R.js → org-partner-runtime-TH3LMPII.js} +20 -16
- package/dist/{org-row-visibility-JBBXNYXD.js → org-row-visibility-Y5R33C5U.js} +1 -1
- package/dist/{pipeline-router-EIBB7QNG.js → pipeline-router-E2JZLDK6.js} +7 -5
- package/dist/{plan-limits-MEWXYLEN.js → plan-limits-NYI6R4IK.js} +9 -7
- package/dist/{platform-procedures-Z7ZGBJWN.js → platform-procedures-RTD5E3BD.js} +5 -3
- package/dist/{pre-tool-use-impl-C6KJY22W.js → pre-tool-use-impl-LT4FRXBP.js} +127 -83
- package/dist/{project-boot-VEYFCCSL.js → project-boot-LIMXQKAF.js} +25 -17
- package/dist/{project-name-UYORSNGE.js → project-name-V62GWALX.js} +7 -5
- package/dist/{projection-worker-WYFDWS57.js → projection-worker-KLE3IZQ2.js} +5 -2
- package/dist/{prospective-memory-E6XBQFJA.js → prospective-memory-HRN7JFT2.js} +6 -4
- package/dist/{push-notifications-M7YU63FY.js → push-notifications-XC6EQEXF.js} +22 -20
- package/dist/{reproject-worktree-memories-B5XMGJSD.js → reproject-worktree-memories-4CAVZSFE.js} +21 -19
- package/dist/{reranker-SRA4BR7N.js → reranker-2RU6IIX2.js} +1 -1
- package/dist/{retrieval-health-P2JPZUPV.js → retrieval-health-4Q5TOV2S.js} +1 -1
- package/dist/{review-polling-KQPN7IQE.js → review-polling-WOWIMBCL.js} +22 -20
- package/dist/runtime/index.js +30 -28
- package/dist/{session-events-6LDDKKY3.js → session-events-OPMS2C5F.js} +22 -20
- package/dist/{session-kill-telemetry-5DSRGWCL.js → session-kill-telemetry-3GWATSIX.js} +22 -20
- package/dist/{session-scope-XG5R3P3D.js → session-scope-TIRGR4MH.js} +21 -19
- package/dist/{setup-wizard-7QFLZIKT.js → setup-wizard-B2JBVGNH.js} +3 -3
- package/dist/{shard-manager-HHHHV2KZ.js → shard-manager-C7LYX6E4.js} +5 -1
- package/dist/{skill-refinement-I5RMAHSC.js → skill-refinement-FWQFYNBI.js} +7 -5
- package/dist/skill-retrieval-PPLFC5RY.js +166 -0
- package/dist/skill-usage-NDB67PU2.js +25 -0
- package/dist/{stack-generate-manifest-AKMZ3AUX.js → stack-generate-manifest-AXI55MEQ.js} +6 -6
- package/dist/{stack-promote-34CE2HHF.js → stack-promote-6N23OGZY.js} +6 -6
- package/dist/stack-release-2CXFYVWM.js +2770 -0
- package/dist/{stack-update-ZQQ5YYPJ.js → stack-update-U53FBVCQ.js} +13 -5
- package/dist/{steward-gate-AQJ6KT2C.js → steward-gate-TUA3QCN7.js} +7 -5
- package/dist/{subagent-brief-injection-3GU7YAWY.js → subagent-brief-injection-N52RWYFZ.js} +34 -32
- package/dist/{subagent-spawn-ledger-52I66CLW.js → subagent-spawn-ledger-OI23OT4I.js} +1 -1
- package/dist/support-bug-actions-XWCJI6S5.js +30 -0
- package/dist/support-inbox-MMVTCXRX.js +77 -0
- package/dist/{support-outbox-KNI3FR3G.js → support-outbox-2TG2UV6J.js} +2 -2
- package/dist/{task-enforcement-CAA6D2MH.js → task-enforcement-JDMBAAOY.js} +22 -20
- package/dist/{task-request-inbox-QBZVU66E.js → task-request-inbox-PKJCYKJV.js} +9 -5
- package/dist/{task-scope-NHXB4ZRN.js → task-scope-32HQEV6W.js} +27 -19
- package/dist/{tasks-crud-JHSWL5NM.js → tasks-crud-CYKUKS3F.js} +21 -19
- package/dist/{tasks-notify-7PBE4U7T.js → tasks-notify-YND5MKWJ.js} +22 -20
- package/dist/{tasks-review-PPPVEE62.js → tasks-review-CG2A5GM3.js} +23 -19
- package/dist/{telemetry-upload-YU2VRNHX.js → telemetry-upload-WLUMEFAB.js} +11 -9
- package/dist/{token-budget-QCMWKG3K.js → token-budget-3YHAY5LL.js} +7 -5
- package/dist/{tool-capability-index-7AWQAJRP.js → tool-capability-index-2ADOWH43.js} +2 -2
- package/dist/{tool-gates-5Q3RSQEG.js → tool-gates-7ENOOYMR.js} +5 -3
- package/dist/{tool-gates-QD26D2NE.js → tool-gates-EKJTLVGN.js} +1 -1
- package/dist/{tool-telemetry-LTOIC64I.js → tool-telemetry-VUP7S6HC.js} +1 -1
- package/dist/tui/App.js +59 -35
- package/dist/{tui-data-NDBXD6U7.js → tui-data-BOQTOW2G.js} +25 -23
- package/dist/{update-support-BMJM4NG7.js → update-support-WT3S3AQ4.js} +21 -21
- package/dist/{whatsapp-QQLDAHUX.js → whatsapp-OZGIF2EM.js} +2 -2
- package/dist/{wiki-acl-W6WDCVCP.js → wiki-acl-LTEQJVDA.js} +1 -1
- package/dist/{work-claims-6DM32MGO.js → work-claims-CMV2GWIW.js} +8 -6
- package/dist/{work-state-heartbeat-HG7D4AWJ.js → work-state-heartbeat-S45TXK4M.js} +1 -1
- package/dist/{worker-gate-FTMW7GBB.js → worker-gate-7Z6NMM3G.js} +1 -1
- package/dist/{workflow-engine-ZWC6CCXE.js → workflow-engine-ZSQDXZQ7.js} +2 -2
- package/dist/{worktree-EMQCPGFE.js → worktree-NMWDVT6N.js} +8 -6
- package/dist/worktree-ownership-guard-ZVIWJAOP.js +35 -0
- package/dist/{worktree-sweep-XVUJZBXV.js → worktree-sweep-Q62ZIT3U.js} +9 -7
- package/package.json +14 -8
- package/release-notes.json +7 -41
- package/src/commands/exe/afk.md +6 -0
- package/src/commands/exe/call.md +6 -0
- package/src/commands/exe/employee-heartbeat.md +6 -0
- package/src/commands/exe/intercom.md +6 -0
- package/src/commands/exe/kill.md +6 -0
- package/src/commands/exe/launch.md +6 -0
- package/src/commands/exe/logs.md +1 -1
- package/src/commands/exe/sessions.md +6 -0
- package/src/commands/exe/setup.md +7 -3
- package/src/commands/exe/status.md +6 -0
- package/src/commands/exe-reference.md +25 -36
- package/src/commands/exe.md +19 -28
- package/stack.release.json +11 -11
- package/dist/chunk-3B6FLNLV.js +0 -30
- package/dist/chunk-FXU7JOXK.js +0 -6
- package/dist/chunk-QFAFKEB5.js +0 -820
- package/dist/conversations-retention-C4BLKFEL.js +0 -54
- package/dist/stack-release-5PGWV5D4.js +0 -1607
- package/dist/support-inbox-NY5TB3FN.js +0 -51
- /package/dist/{chunk-U2D6PJ5T.js → chunk-65G7ZTGE.js} +0 -0
- /package/dist/{chunk-DN3ZR3UE.js → chunk-CP7Z35MJ.js} +0 -0
- /package/dist/{chunk-XDVOGDBC.js → chunk-KBBWALJV.js} +0 -0
- /package/dist/{chunk-JRIH6I7D.js → chunk-LZXYPTY4.js} +0 -0
- /package/dist/{chunk-GIRD7O5X.js → chunk-MCWEW2SG.js} +0 -0
- /package/dist/{chunk-TKAU7IJ2.js → chunk-MQHUJLCA.js} +0 -0
- /package/dist/{chunk-M4XY4JRK.js → chunk-O53LTOXK.js} +0 -0
- /package/dist/{chunk-DZN7SDY2.js → chunk-OSVTH3SG.js} +0 -0
- /package/dist/{chunk-AJK2PVQW.js → chunk-QXXEXGX3.js} +0 -0
- /package/dist/{chunk-AWWDKF22.js → chunk-SFWNTO2F.js} +0 -0
- /package/dist/{chunk-2Q2CD6CD.js → chunk-WC5HF2FN.js} +0 -0
- /package/dist/{core-memory-O6D5UC3T.js → core-memory-MMMW3TF3.js} +0 -0
- /package/dist/{memory-isolation-EBFFC6HF.js → memory-isolation-67ACKQ2M.js} +0 -0
- /package/dist/{oauth-server-ZKBUHDFI.js → oauth-server-OILIKR7D.js} +0 -0
package/dist/chunk-QFAFKEB5.js
DELETED
|
@@ -1,820 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
supportCommitSchema,
|
|
3
|
-
supportIdSchema,
|
|
4
|
-
supportProductSchema,
|
|
5
|
-
supportTaskIdSchema,
|
|
6
|
-
supportVersionSchema
|
|
7
|
-
} from "./chunk-3B6FLNLV.js";
|
|
8
|
-
import {
|
|
9
|
-
assessAttribution,
|
|
10
|
-
assessDisposition,
|
|
11
|
-
buildVerificationArtifact,
|
|
12
|
-
isPlaceholderIdentity,
|
|
13
|
-
isUnresolvedIdentity
|
|
14
|
-
} from "./chunk-4YNA3CM6.js";
|
|
15
|
-
import {
|
|
16
|
-
getActiveAgent
|
|
17
|
-
} from "./chunk-F4BBMIPG.js";
|
|
18
|
-
import {
|
|
19
|
-
SUPPORT_PRODUCTS,
|
|
20
|
-
sanitizeProductFilter,
|
|
21
|
-
sanitizeUpstreamId,
|
|
22
|
-
sanitizedUpstreamBody
|
|
23
|
-
} from "./chunk-ELEGH4DX.js";
|
|
24
|
-
import {
|
|
25
|
-
loadLicense,
|
|
26
|
-
readCachedLicenseToken
|
|
27
|
-
} from "./chunk-TNS63ATU.js";
|
|
28
|
-
|
|
29
|
-
// src/mcp/tools/support-inbox.ts
|
|
30
|
-
import { z as z2 } from "zod";
|
|
31
|
-
import { readFileSync } from "fs";
|
|
32
|
-
import { join } from "path";
|
|
33
|
-
import { homedir } from "os";
|
|
34
|
-
|
|
35
|
-
// src/lib/support-verification-input.ts
|
|
36
|
-
import { z } from "zod";
|
|
37
|
-
|
|
38
|
-
// src/lib/attribution-resolve.ts
|
|
39
|
-
import { execFileSync } from "child_process";
|
|
40
|
-
function resolveModelFromEnvironment() {
|
|
41
|
-
const candidates = [
|
|
42
|
-
process.env.EXE_ATTRIBUTION_MODEL,
|
|
43
|
-
process.env.ANTHROPIC_MODEL,
|
|
44
|
-
process.env.CLAUDE_MODEL,
|
|
45
|
-
process.env.EXE_MODEL
|
|
46
|
-
];
|
|
47
|
-
for (const candidate of candidates) {
|
|
48
|
-
const value = candidate?.trim();
|
|
49
|
-
if (value && !isPlaceholderIdentity(value)) return value;
|
|
50
|
-
}
|
|
51
|
-
return null;
|
|
52
|
-
}
|
|
53
|
-
function resolveRef(ref, cwd) {
|
|
54
|
-
try {
|
|
55
|
-
const out = execFileSync("git", ["rev-parse", "--verify", `${ref}^{commit}`], {
|
|
56
|
-
cwd,
|
|
57
|
-
encoding: "utf8",
|
|
58
|
-
timeout: 1e4
|
|
59
|
-
}).trim();
|
|
60
|
-
return /^[0-9a-f]{40}$/i.test(out) ? out : null;
|
|
61
|
-
} catch {
|
|
62
|
-
return null;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
var MODEL_HELP = "Set ANTHROPIC_MODEL (employee sessions get it automatically at launch) or pass attribution_model explicitly. It is NOT guessed: a wrong model on the record is worse than no record at all, because it points at the wrong suspect.";
|
|
66
|
-
function resolveAttribution(purpose, input = {}) {
|
|
67
|
-
const stated = input.agent?.trim() ?? "";
|
|
68
|
-
let observed = "";
|
|
69
|
-
try {
|
|
70
|
-
observed = getActiveAgent().agentId?.trim() ?? "";
|
|
71
|
-
} catch {
|
|
72
|
-
observed = "";
|
|
73
|
-
}
|
|
74
|
-
let agent;
|
|
75
|
-
if (purpose === "verdict") {
|
|
76
|
-
const observedIsReal = observed !== "" && !isUnresolvedIdentity(observed);
|
|
77
|
-
if (observedIsReal && stated && stated.toLowerCase() !== observed.toLowerCase()) {
|
|
78
|
-
return {
|
|
79
|
-
ok: false,
|
|
80
|
-
code: "attribution_agent_conflict",
|
|
81
|
-
message: `Refused locally [attribution_agent_conflict]: attribution_agent was given as "${stated}", but this session resolves to "${observed}". A verdict is signed by whoever actually made it \u2014 attribution_agent is a fallback for a session that cannot observe its own identity (the MCP daemon), not a way to record the call under another employee's name. Omit attribution_agent to sign as "${observed}", or make the call from that employee's session.`
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
agent = observedIsReal ? observed : stated;
|
|
85
|
-
} else {
|
|
86
|
-
agent = stated || observed;
|
|
87
|
-
}
|
|
88
|
-
if (purpose === "verdict" && isUnresolvedIdentity(agent)) {
|
|
89
|
-
agent = "";
|
|
90
|
-
}
|
|
91
|
-
if (!agent) {
|
|
92
|
-
const message = purpose === "verdict" ? "Refused locally [attribution_agent_missing]: could not resolve which agent is producing this verdict, and it will not be invented. The MCP tools run in the launchd daemon, which carries no active-agent marker, no tmux session and no AGENT_ID, so the session identity is not observable from there. Pass attribution_agent with your own employee name exactly as it appears in the roster \u2014 never a role like 'admin'." : `Refused locally [attribution_agent_missing]: could not resolve which agent is producing this ${purpose}, and it will not be invented. Restore the active-agent marker or set AGENT_ID to your real employee name.`;
|
|
93
|
-
return {
|
|
94
|
-
ok: false,
|
|
95
|
-
code: "attribution_agent_missing",
|
|
96
|
-
// Every refusal out of this function names its machine-stable code in the message,
|
|
97
|
-
// including the ones below that come back from `assessAttribution`. A caller only
|
|
98
|
-
// ever sees the message, so a code that appears in some refusals and not others is
|
|
99
|
-
// a code the caller cannot rely on.
|
|
100
|
-
message
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
const model = input.model?.trim() || resolveModelFromEnvironment();
|
|
104
|
-
if (!model) {
|
|
105
|
-
return {
|
|
106
|
-
ok: false,
|
|
107
|
-
code: "attribution_model_missing",
|
|
108
|
-
message: `Refused locally [attribution_model_missing]: could not resolve which model is producing this record. ${MODEL_HELP}`
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
const observedAt = input.observed_at?.trim() || (/* @__PURE__ */ new Date()).toISOString();
|
|
112
|
-
const attribution = {
|
|
113
|
-
agent,
|
|
114
|
-
model,
|
|
115
|
-
observed_at: observedAt
|
|
116
|
-
};
|
|
117
|
-
if (purpose === "verdict") {
|
|
118
|
-
const repo = input.repo_path?.trim() || process.cwd();
|
|
119
|
-
const requested = input.evidence_ref?.trim() || "HEAD";
|
|
120
|
-
const resolved = resolveRef(requested, repo);
|
|
121
|
-
if (!resolved) {
|
|
122
|
-
return {
|
|
123
|
-
ok: false,
|
|
124
|
-
code: "attribution_evidence_ref_invalid",
|
|
125
|
-
message: `Refused locally [attribution_evidence_ref_invalid]: evidence_ref "${requested}" does not resolve to a commit in ${repo}. A verdict is only meaningful against a ref someone else can check out \u2014 name the commit you actually read; if the repository is wrong, pass repo_path for the repository that contains the commit.`
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
attribution.evidence_ref = resolved;
|
|
129
|
-
}
|
|
130
|
-
if (input.second_opinion_model || input.second_opinion_verdict) {
|
|
131
|
-
attribution.second_opinion = {
|
|
132
|
-
model: input.second_opinion_model?.trim() ?? "",
|
|
133
|
-
verdict: input.second_opinion_verdict ?? "confirmed"
|
|
134
|
-
};
|
|
135
|
-
}
|
|
136
|
-
const assessed = assessAttribution(attribution, purpose);
|
|
137
|
-
if (!assessed.ok) {
|
|
138
|
-
return { ok: false, code: assessed.code, message: `Refused locally [${assessed.code}]: ${assessed.message}` };
|
|
139
|
-
}
|
|
140
|
-
return { ok: true, attribution };
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// src/lib/support-verification-input.ts
|
|
144
|
-
function isVerifiedStatus(status) {
|
|
145
|
-
return status === "fixed" || status === "closed";
|
|
146
|
-
}
|
|
147
|
-
var verificationArtifactInputSchema = {
|
|
148
|
-
verification_kind: z.enum(["regression_test", "manual", "ops_transcript"]).optional().describe(
|
|
149
|
-
"REQUIRED to set status=fixed or closed (unless closing with a non-'fixed' disposition). 'regression_test' when you actually RAN a test that fails at the parent commit and passes at the fix. 'manual' when a named person reproduced the original defect and confirmed it is gone. 'ops_transcript' when the defect was settled by running commands against a live system and there is no commit (CI state, a VPS config edit, an ops confirmation)."
|
|
150
|
-
),
|
|
151
|
-
defect_layer: z.enum(["production", "test_harness"]).optional().describe(
|
|
152
|
-
"Where the DEFECT lives. Omit for the normal case (production source). Declare 'test_harness' ONLY when the filed defect IS the test/harness \u2014 a flaky fixture, a leaked singleton, a test that spawns a hook wrong \u2014 so that a production diff would be the WRONG fix. This costs MORE evidence, not less: it additionally requires regression_test_id and reverted_result. It is NOT a way past a refused substance check; if your fix was supposed to change production code and did not, the honest answer is that it is not finished."
|
|
153
|
-
),
|
|
154
|
-
reverted_result: z.enum(["fail", "pass", "error"]).optional().describe(
|
|
155
|
-
"defect_layer=test_harness only: the result you OBSERVED re-running the named test with the fix reverted. Must be 'fail' \u2014 a test-only diff that does not go red when removed evidences nothing."
|
|
156
|
-
),
|
|
157
|
-
claim_type: z.enum(["point_in_time", "ongoing_state"]).optional().describe(
|
|
158
|
-
"ops_transcript only. 'point_in_time' for a fact true when observed (a config now routes correctly). 'ongoing_state' for a claim that a condition HOLDS (an agent is reporting, CI is green) \u2014 that requires at least two probes taken at two distinct times, because one sample cannot evidence a continuing condition."
|
|
159
|
-
),
|
|
160
|
-
ops_probes: z.string().optional().describe(
|
|
161
|
-
`ops_transcript only. JSON array of probes, each {"command","output","host","ran_at"}. VERBATIM: the command as typed, its real output, the host/system it ran against, and an ISO timestamp. Summaries are refused \u2014 'checked the VPS and it looks fine' is not a probe.`
|
|
162
|
-
),
|
|
163
|
-
fix_commit: supportCommitSchema.optional().describe("SHA of the merged commit containing the fix. Its diff is measured locally \u2014 a comment-only or test-only commit is refused."),
|
|
164
|
-
repo_path: z.string().optional().describe("Absolute path to the repository containing fix_commit. Required when the fix landed outside the current working repo (e.g. exe-gateway, exe-crm). Defaults to the current directory."),
|
|
165
|
-
regression_test_id: z.string().optional().describe("regression_test only: the test that detects the defect, e.g. 'tests/raw-event-backlog.test.ts::counts unprocessed events'."),
|
|
166
|
-
parent_result: z.enum(["fail", "pass", "error"]).optional().describe("regression_test only: the result you OBSERVED running that test at the parent commit. Must be 'fail' \u2014 a test that already passed does not detect the defect."),
|
|
167
|
-
fix_result: z.enum(["fail", "pass", "error"]).optional().describe("regression_test only: the result you OBSERVED running that test at the fix commit. Must be 'pass'."),
|
|
168
|
-
verifier: z.string().optional().describe("manual and ops_transcript: the identity of the person or employee who confirmed the defect is gone. Checked server-side against the bug's filer and assignee \u2014 it may not be either. Placeholders ('me', 'agent') are refused."),
|
|
169
|
-
disposition: z.enum(["fixed", "not_a_defect", "superseded", "wontfix"]).optional().describe(
|
|
170
|
-
"WHY the record is closing. Omit (or 'fixed') for the normal case: a defect was repaired, and a verification artifact is required. Use 'not_a_defect' when there was nothing to fix (a smoke-test record, a misfiled report), 'superseded' when another record covers it, 'wontfix' when it is a deliberate decline. Those three require NO fix_commit but DO require disposition_reason \u2014 and they are recorded as closed, not as fixed, because asserting a repair that never happened is its own kind of false record."
|
|
171
|
-
),
|
|
172
|
-
disposition_reason: z.string().optional().describe(
|
|
173
|
-
"REQUIRED for any disposition other than 'fixed': what makes this record a non-defect. Explain the call \u2014 a bare label or a hedge is refused."
|
|
174
|
-
),
|
|
175
|
-
superseded_by: z.string().optional().describe("REQUIRED for disposition='superseded': the id of the record that replaces this one, so the claim is checkable."),
|
|
176
|
-
superseded_coverage: z.string().optional().describe(
|
|
177
|
-
`REQUIRED for disposition='superseded': JSON array of {"id","evidence"} \u2014 one entry per declared symptom, each naming where the superseding record covers it. PARTIAL COVERAGE SUPERSEDES NOTHING: if the other record covers three of five symptoms, the honest outcome is to keep this record open with the two survivors as its remaining scope, not to close it. The refusal names the survivors.`
|
|
178
|
-
),
|
|
179
|
-
symptoms: z.string().optional().describe(
|
|
180
|
-
`JSON array of the distinct defects this record claims, as ids or {"id"} objects. Required to close as 'superseded' so coverage can be checked one by one.`
|
|
181
|
-
),
|
|
182
|
-
observed_at: z.string().optional().describe(
|
|
183
|
-
"ISO timestamp of when you actually READ the evidence. Defaults to now. Set it explicitly when the evidence was observed earlier than this call."
|
|
184
|
-
),
|
|
185
|
-
evidence_ref: z.string().optional().describe(
|
|
186
|
-
"The git ref you read the evidence at (defaults to HEAD of repo_path, resolved locally and refused if it does not exist). main moves several times a day, so a verdict against an unnamed ref cannot be reproduced."
|
|
187
|
-
),
|
|
188
|
-
attribution_agent: z.string().optional().describe(
|
|
189
|
-
"The employee identity producing this verdict \u2014 your own name as it appears in the roster. Normally OMITTED: it is resolved from the session's active-agent marker. Supply it when the call is made through the MCP daemon (which has no marker, no tmux and no AGENT_ID and would otherwise sign the record 'default') or from a harness. It is never guessed, and a role ('admin', 'agent', 'support') is refused \u2014 the whole point is that a verdict can be traced to someone."
|
|
190
|
-
),
|
|
191
|
-
attribution_model: z.string().optional().describe(
|
|
192
|
-
"The model producing this verdict, e.g. 'claude-opus-5'. Normally OMITTED: it is read from ANTHROPIC_MODEL, which employee launches set automatically. Supply it only when the session carries no such variable \u2014 a session launched outside the employee router, or a harness. It is still never guessed: omit it with no environment model and the close is refused, naming the variable."
|
|
193
|
-
),
|
|
194
|
-
second_opinion_model: z.string().optional().describe("Optional adversarial review: the OTHER model that checked this verdict. Must differ from the model producing it."),
|
|
195
|
-
second_opinion_verdict: z.enum(["confirmed", "refuted"]).optional().describe("Optional adversarial review: what the second model concluded. A 'refuted' verdict cannot be closed over."),
|
|
196
|
-
disposition_verifier: z.string().optional().describe(
|
|
197
|
-
"REQUIRED for disposition='not_a_defect' or 'superseded': a named identity, not the record's filer or assignee, who agrees that what was filed is not a defect. Same identity rule as a manual verification."
|
|
198
|
-
),
|
|
199
|
-
verification_method: z.string().optional().describe("manual only: how it was verified, in enough detail for someone else to repeat it."),
|
|
200
|
-
verification_observation: z.string().optional().describe("manual only: what was observed that shows the DEFECT IS ABSENT \u2014 not what the change did. 'It is fixed' is refused."),
|
|
201
|
-
delivery_proof: z.string().optional().describe('Optional JSON delivery declaration, e.g. {"channel":"npm","version":"0.9.364","tarball_shasum":"\u2026","fix_path_published":true}. Recorded, not required \u2014 delivery does not gate closing. A declaration that is present must still be true.')
|
|
202
|
-
};
|
|
203
|
-
function buildVerdictAttribution(input) {
|
|
204
|
-
return resolveAttribution("verdict", {
|
|
205
|
-
agent: input.attribution_agent,
|
|
206
|
-
model: input.attribution_model,
|
|
207
|
-
observed_at: input.observed_at,
|
|
208
|
-
evidence_ref: input.evidence_ref,
|
|
209
|
-
repo_path: input.repo_path,
|
|
210
|
-
second_opinion_model: input.second_opinion_model,
|
|
211
|
-
second_opinion_verdict: input.second_opinion_verdict
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
|
-
var NO_ARTIFACT_HELP = [
|
|
215
|
-
"Refused locally: setting status=fixed or closed requires evidence that the defect is ABSENT.",
|
|
216
|
-
"",
|
|
217
|
-
"Supply ONE of:",
|
|
218
|
-
" regression_test \u2014 verification_kind='regression_test', fix_commit, repo_path,",
|
|
219
|
-
" regression_test_id, parent_result (must be the result you observed at the parent),",
|
|
220
|
-
" fix_result. Use this when you actually ran the test at both commits.",
|
|
221
|
-
" manual \u2014 verification_kind='manual', fix_commit, repo_path, verifier (a real identity,",
|
|
222
|
-
" not the bug's filer or assignee), verification_method, verification_observation",
|
|
223
|
-
" describing what you saw that shows the defect is gone.",
|
|
224
|
-
" ops_transcript \u2014 verification_kind='ops_transcript', verifier, claim_type",
|
|
225
|
-
" ('point_in_time' for a fact true when observed, e.g. a config now routes",
|
|
226
|
-
" correctly; 'ongoing_state' for a claim that a condition HOLDS, e.g. an agent is",
|
|
227
|
-
" reporting or CI is green \u2014 that needs 2+ probes at distinct times, since one",
|
|
228
|
-
" sample cannot evidence a continuing condition), ops_probes (verbatim",
|
|
229
|
-
" {command, output, host, ran_at} entries). Use this when there is no commit to",
|
|
230
|
-
" measure \u2014 the defect was settled by running commands against a live system",
|
|
231
|
-
" (CI state, a VPS config edit, an ops confirmation).",
|
|
232
|
-
"",
|
|
233
|
-
"The fix commit's diff is measured from the repository; substance is never taken from the caller.",
|
|
234
|
-
"If you have not verified the defect is absent, do not close it \u2014 record what you found with notes instead."
|
|
235
|
-
].join("\n");
|
|
236
|
-
var REQUIRED_ARGUMENTS_BY_KIND = {
|
|
237
|
-
regression_test: ["fix_commit", "regression_test_id", "parent_result", "fix_result"],
|
|
238
|
-
manual: ["fix_commit", "verifier", "verification_method", "verification_observation"],
|
|
239
|
-
ops_transcript: ["verifier", "claim_type", "ops_probes", "verification_observation"]
|
|
240
|
-
};
|
|
241
|
-
function argumentArrived(value) {
|
|
242
|
-
if (value === void 0 || value === null) return false;
|
|
243
|
-
if (typeof value === "string") return value.trim().length > 0;
|
|
244
|
-
return true;
|
|
245
|
-
}
|
|
246
|
-
function assertVerificationArgumentsArrived(kind, input) {
|
|
247
|
-
const missing = REQUIRED_ARGUMENTS_BY_KIND[kind].filter((field) => !argumentArrived(input[field]));
|
|
248
|
-
if (missing.length === 0) return { ok: true };
|
|
249
|
-
return {
|
|
250
|
-
ok: false,
|
|
251
|
-
message: [
|
|
252
|
-
`Refused locally [verification_arguments_missing]: this close declared verification_kind='${kind}', but these required parameters did not arrive in the tool call:`,
|
|
253
|
-
...missing.map((field) => ` - ${String(field)}`),
|
|
254
|
-
"",
|
|
255
|
-
"They reached the tool as undefined or empty, so this is NOT a judgement on the evidence you wrote \u2014 that value was never seen here.",
|
|
256
|
-
"If you did pass them, the argument was dropped or truncated between your client and the tool. Resend the call with those parameters present; long evidence survives better as a separate add_comment followed by a close that references it.",
|
|
257
|
-
"",
|
|
258
|
-
"Nothing was written locally and nothing was sent upstream."
|
|
259
|
-
].join("\n")
|
|
260
|
-
};
|
|
261
|
-
}
|
|
262
|
-
var ATTRIBUTION_REQUIRED_HELP = [
|
|
263
|
-
"Refused locally [attribution_missing]: a close carries WHO made the call, with WHAT model, at WHICH commit \u2014 and it did not resolve here, so it will not be sent unattributed for the server to refuse with an opaque 422.",
|
|
264
|
-
"",
|
|
265
|
-
"Supply the parts that could not be resolved from this session:",
|
|
266
|
-
" attribution_agent \u2014 your real employee name (the MCP daemon has no session identity to read).",
|
|
267
|
-
" attribution_model \u2014 the model producing this verdict, e.g. 'claude-opus-5'.",
|
|
268
|
-
" evidence_ref / repo_path \u2014 the commit you actually read the evidence at, in the repo it lives in.",
|
|
269
|
-
"",
|
|
270
|
-
"None of these are guessed: a verdict signed with the wrong agent or model is a record pointing at the wrong suspect."
|
|
271
|
-
].join("\n");
|
|
272
|
-
function assertVerdictAttribution(status, resolved) {
|
|
273
|
-
if (!isVerifiedStatus(status) || !resolved.ok || resolved.attribution) return { ok: true };
|
|
274
|
-
return { ok: false, message: ATTRIBUTION_REQUIRED_HELP };
|
|
275
|
-
}
|
|
276
|
-
function resolveVerificationArtifact(status, input, context = {}) {
|
|
277
|
-
if (!isVerifiedStatus(status)) return { ok: true };
|
|
278
|
-
const disposition = input.disposition ?? "fixed";
|
|
279
|
-
if (disposition !== "fixed") {
|
|
280
|
-
const assessed = assessDisposition(disposition, {
|
|
281
|
-
status: typeof status === "string" ? status : "closed",
|
|
282
|
-
disposition,
|
|
283
|
-
disposition_reason: input.disposition_reason,
|
|
284
|
-
superseded_by: input.superseded_by,
|
|
285
|
-
disposition_verifier: input.disposition_verifier,
|
|
286
|
-
superseded_coverage: input.superseded_coverage,
|
|
287
|
-
symptoms: input.symptoms,
|
|
288
|
-
context
|
|
289
|
-
});
|
|
290
|
-
if (!assessed.ok) return { ok: false, message: `Refused locally [${assessed.code}]: ${assessed.message}` };
|
|
291
|
-
const dispositionAttribution = buildVerdictAttribution(input);
|
|
292
|
-
if (!dispositionAttribution.ok) return { ok: false, message: dispositionAttribution.message };
|
|
293
|
-
return { ok: true, attribution: dispositionAttribution.attribution };
|
|
294
|
-
}
|
|
295
|
-
if (!input.verification_kind && !input.fix_commit) {
|
|
296
|
-
return { ok: false, message: NO_ARTIFACT_HELP };
|
|
297
|
-
}
|
|
298
|
-
if (!input.verification_kind) {
|
|
299
|
-
return { ok: false, message: "verification_kind is required (regression_test, manual or ops_transcript) when setting status=fixed or closed." };
|
|
300
|
-
}
|
|
301
|
-
if (!input.fix_commit && input.verification_kind !== "ops_transcript") {
|
|
302
|
-
return { ok: false, message: "fix_commit is required when setting status=fixed or closed \u2014 the diff is measured, not described." };
|
|
303
|
-
}
|
|
304
|
-
const arrived = assertVerificationArgumentsArrived(input.verification_kind, input);
|
|
305
|
-
if (!arrived.ok) return { ok: false, message: arrived.message };
|
|
306
|
-
let probes;
|
|
307
|
-
if (input.verification_kind === "ops_transcript") {
|
|
308
|
-
const parsed = parseOpsProbes(input.ops_probes);
|
|
309
|
-
if (!parsed.ok) return { ok: false, message: parsed.message };
|
|
310
|
-
probes = parsed.probes;
|
|
311
|
-
}
|
|
312
|
-
const request = {
|
|
313
|
-
kind: input.verification_kind,
|
|
314
|
-
fix_commit: input.fix_commit ?? "",
|
|
315
|
-
repo_path: input.repo_path?.trim() || process.cwd(),
|
|
316
|
-
test_id: input.regression_test_id,
|
|
317
|
-
parent_result: input.parent_result,
|
|
318
|
-
fix_result: input.fix_result,
|
|
319
|
-
verifier: input.verifier,
|
|
320
|
-
method: input.verification_method,
|
|
321
|
-
observation: input.verification_observation,
|
|
322
|
-
defect_layer: input.defect_layer,
|
|
323
|
-
reverted_result: input.reverted_result,
|
|
324
|
-
claim_type: input.claim_type,
|
|
325
|
-
probes
|
|
326
|
-
};
|
|
327
|
-
const built = buildVerificationArtifact(request, context);
|
|
328
|
-
if (!built.ok) {
|
|
329
|
-
return { ok: false, message: `Refused locally [${built.code}]: ${built.message}` };
|
|
330
|
-
}
|
|
331
|
-
const attribution = buildVerdictAttribution(input);
|
|
332
|
-
if (!attribution.ok) return { ok: false, message: attribution.message };
|
|
333
|
-
return { ok: true, artifact: built.artifact, attribution: attribution.attribution };
|
|
334
|
-
}
|
|
335
|
-
function parseOpsProbes(raw) {
|
|
336
|
-
if (raw === void 0 || !raw.trim()) {
|
|
337
|
-
return {
|
|
338
|
-
ok: false,
|
|
339
|
-
message: "ops_probes is required for verification_kind='ops_transcript': a JSON array of {command, output, host, ran_at}, all verbatim."
|
|
340
|
-
};
|
|
341
|
-
}
|
|
342
|
-
let parsed;
|
|
343
|
-
try {
|
|
344
|
-
parsed = JSON.parse(raw);
|
|
345
|
-
} catch {
|
|
346
|
-
return { ok: false, message: "ops_probes must be valid JSON: an array of {command, output, host, ran_at}." };
|
|
347
|
-
}
|
|
348
|
-
if (!Array.isArray(parsed) || parsed.length === 0) {
|
|
349
|
-
return { ok: false, message: "ops_probes must be a non-empty JSON array of {command, output, host, ran_at}." };
|
|
350
|
-
}
|
|
351
|
-
return { ok: true, probes: parsed };
|
|
352
|
-
}
|
|
353
|
-
function parseDeliveryProof(raw) {
|
|
354
|
-
if (raw === void 0 || !raw.trim()) return { ok: true };
|
|
355
|
-
try {
|
|
356
|
-
return { ok: true, value: JSON.parse(raw) };
|
|
357
|
-
} catch {
|
|
358
|
-
return { ok: false, message: "delivery_proof must be valid JSON (or omitted \u2014 delivery does not gate closing)." };
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
// src/mcp/tools/support-inbox.ts
|
|
363
|
-
var DEFAULT_ENDPOINT = "https://api.askexe.com/admin/support/bug-reports";
|
|
364
|
-
var DEFAULT_OWNER_ENDPOINT = "https://api.askexe.com/v1/support/bug-reports";
|
|
365
|
-
var STATUS = z2.enum(["open", "triaged", "fixed", "closed", "wontfix"]);
|
|
366
|
-
var SupportHttpError = class extends Error {
|
|
367
|
-
constructor(status, message) {
|
|
368
|
-
super(message);
|
|
369
|
-
this.status = status;
|
|
370
|
-
this.name = "SupportHttpError";
|
|
371
|
-
}
|
|
372
|
-
status;
|
|
373
|
-
};
|
|
374
|
-
function adminToken() {
|
|
375
|
-
if (process.env.ASKEXE_SUPPORT_ADMIN_TOKEN) return process.env.ASKEXE_SUPPORT_ADMIN_TOKEN;
|
|
376
|
-
if (process.env.EXE_SUPPORT_ADMIN_TOKEN) return process.env.EXE_SUPPORT_ADMIN_TOKEN;
|
|
377
|
-
try {
|
|
378
|
-
const configPath = join(process.env.EXE_OS_DIR ?? join(homedir(), ".exe-os"), "config.json");
|
|
379
|
-
const config = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
380
|
-
return config.support?.adminToken || config.support?.admin_token;
|
|
381
|
-
} catch {
|
|
382
|
-
return void 0;
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
function endpoint() {
|
|
386
|
-
return (process.env.ASKEXE_SUPPORT_ADMIN_ENDPOINT || DEFAULT_ENDPOINT).replace(/\/+$/, "");
|
|
387
|
-
}
|
|
388
|
-
function ownerEndpoint() {
|
|
389
|
-
const routerUrl = process.env.API_ROUTER_URL?.replace(/\/+$/, "");
|
|
390
|
-
let configured;
|
|
391
|
-
try {
|
|
392
|
-
const configPath = join(process.env.EXE_OS_DIR ?? join(homedir(), ".exe-os"), "config.json");
|
|
393
|
-
const config = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
394
|
-
configured = config.support?.bugReportEndpoint;
|
|
395
|
-
} catch {
|
|
396
|
-
}
|
|
397
|
-
const base = configured || process.env.EXE_BUG_REPORT_ENDPOINT || (routerUrl ? `${routerUrl}/v1/support/bug-reports` : DEFAULT_OWNER_ENDPOINT);
|
|
398
|
-
return base.replace(/\/+$/, "");
|
|
399
|
-
}
|
|
400
|
-
function ownerAuthHeaders() {
|
|
401
|
-
let cloudApiKey;
|
|
402
|
-
try {
|
|
403
|
-
const configPath = join(process.env.EXE_OS_DIR ?? join(homedir(), ".exe-os"), "config.json");
|
|
404
|
-
const config = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
405
|
-
cloudApiKey = config.cloud?.apiKey;
|
|
406
|
-
} catch {
|
|
407
|
-
}
|
|
408
|
-
const licenseKey = loadLicense() || process.env.EXE_LICENSE_KEY || cloudApiKey;
|
|
409
|
-
const licenseToken = readCachedLicenseToken();
|
|
410
|
-
const headers = {};
|
|
411
|
-
if (licenseKey) {
|
|
412
|
-
headers["x-exe-license-key"] = licenseKey;
|
|
413
|
-
headers.authorization = `Bearer ${licenseKey}`;
|
|
414
|
-
}
|
|
415
|
-
if (licenseToken) headers["x-exe-license-token"] = licenseToken;
|
|
416
|
-
return headers;
|
|
417
|
-
}
|
|
418
|
-
function assertInternal() {
|
|
419
|
-
const token = adminToken();
|
|
420
|
-
if (!token) throw new Error("AskExe support admin token not configured");
|
|
421
|
-
return token;
|
|
422
|
-
}
|
|
423
|
-
async function requestJson(url, init) {
|
|
424
|
-
const token = assertInternal();
|
|
425
|
-
const res = await fetch(url, {
|
|
426
|
-
...init,
|
|
427
|
-
headers: {
|
|
428
|
-
"content-type": "application/json",
|
|
429
|
-
authorization: `Bearer ${token}`,
|
|
430
|
-
...init?.headers ?? {}
|
|
431
|
-
},
|
|
432
|
-
signal: AbortSignal.timeout(1e4)
|
|
433
|
-
});
|
|
434
|
-
const text = await res.text();
|
|
435
|
-
let data = text;
|
|
436
|
-
try {
|
|
437
|
-
data = text ? JSON.parse(text) : {};
|
|
438
|
-
} catch {
|
|
439
|
-
}
|
|
440
|
-
if (!res.ok) throw new Error(`HTTP ${res.status}: ${typeof data === "string" ? data : JSON.stringify(data)}`);
|
|
441
|
-
return data;
|
|
442
|
-
}
|
|
443
|
-
async function fetchJson(url, headers, init) {
|
|
444
|
-
const res = await fetch(url, {
|
|
445
|
-
...init,
|
|
446
|
-
headers: { "content-type": "application/json", ...headers, ...init?.headers ?? {} },
|
|
447
|
-
signal: AbortSignal.timeout(1e4)
|
|
448
|
-
});
|
|
449
|
-
const text = await res.text();
|
|
450
|
-
let data = text;
|
|
451
|
-
try {
|
|
452
|
-
data = text ? JSON.parse(text) : {};
|
|
453
|
-
} catch {
|
|
454
|
-
}
|
|
455
|
-
if (!res.ok) throw new SupportHttpError(res.status, `HTTP ${res.status}: ${typeof data === "string" ? data : JSON.stringify(data)}`);
|
|
456
|
-
return data;
|
|
457
|
-
}
|
|
458
|
-
async function commentRequestJson(bugId, init) {
|
|
459
|
-
const token = adminToken();
|
|
460
|
-
if (token) {
|
|
461
|
-
const safeId2 = encodeURIComponent(sanitizeUpstreamId(bugId));
|
|
462
|
-
const bugUrl2 = `${endpoint()}/${safeId2}/comments`;
|
|
463
|
-
try {
|
|
464
|
-
return await fetchJson(bugUrl2, { authorization: `Bearer ${token}` }, init);
|
|
465
|
-
} catch (err) {
|
|
466
|
-
if (!(err instanceof SupportHttpError) || err.status !== 404) throw err;
|
|
467
|
-
}
|
|
468
|
-
const featureUrl2 = `${featureEndpoint()}/${safeId2}/comments`;
|
|
469
|
-
return fetchJson(featureUrl2, { authorization: `Bearer ${token}` }, init);
|
|
470
|
-
}
|
|
471
|
-
const ownerHeaders = ownerAuthHeaders();
|
|
472
|
-
if (!ownerHeaders.authorization && !ownerHeaders["x-exe-license-token"]) {
|
|
473
|
-
throw new Error(
|
|
474
|
-
"Not authenticated for support comments. Set a license key (`exe-os setup`), or store a support-issued token with `exe-os login --token <jwt>`, or configure an AskExe admin token (ASKEXE_SUPPORT_ADMIN_TOKEN)."
|
|
475
|
-
);
|
|
476
|
-
}
|
|
477
|
-
const safeId = encodeURIComponent(sanitizeUpstreamId(bugId));
|
|
478
|
-
const bugUrl = `${ownerEndpoint()}/${safeId}/comments`;
|
|
479
|
-
try {
|
|
480
|
-
return await fetchJson(bugUrl, ownerHeaders, init);
|
|
481
|
-
} catch (err) {
|
|
482
|
-
if (!(err instanceof SupportHttpError) || err.status !== 404) throw err;
|
|
483
|
-
}
|
|
484
|
-
const featureUrl = `${featureOwnerEndpoint()}/${safeId}/comments`;
|
|
485
|
-
return fetchJson(featureUrl, ownerHeaders, init);
|
|
486
|
-
}
|
|
487
|
-
function withStatusNotice(data, notice) {
|
|
488
|
-
if (data && typeof data === "object" && !Array.isArray(data)) {
|
|
489
|
-
return { ...data, status_notice: notice };
|
|
490
|
-
}
|
|
491
|
-
return { status_notice: notice, response: data };
|
|
492
|
-
}
|
|
493
|
-
function registerListBugReports(server) {
|
|
494
|
-
server.registerTool(
|
|
495
|
-
"list_bug_reports",
|
|
496
|
-
{
|
|
497
|
-
title: "List Bug Reports",
|
|
498
|
-
description: "AskExe-internal only: list incoming customer bug reports from the support inbox.",
|
|
499
|
-
inputSchema: {
|
|
500
|
-
status: z2.enum(["all", "open", "triaged", "fixed", "closed", "wontfix"]).default("open"),
|
|
501
|
-
severity: z2.enum(["p0", "p1", "p2", "p3"]).optional(),
|
|
502
|
-
// Round 8: constrain to the known enum at the schema — a `product` filter is
|
|
503
|
-
// NOT free text, and it was sent raw as a query param.
|
|
504
|
-
product: z2.enum(SUPPORT_PRODUCTS).optional().describe("Filter by product"),
|
|
505
|
-
limit: z2.number().int().min(1).max(500).default(25),
|
|
506
|
-
offset: z2.number().int().min(0).default(0).describe("Number of results to skip for pagination. Use next_offset from a prior response.")
|
|
507
|
-
}
|
|
508
|
-
},
|
|
509
|
-
async ({ status, severity, product, limit, offset }) => {
|
|
510
|
-
const url = new URL(endpoint());
|
|
511
|
-
url.searchParams.set("status", status);
|
|
512
|
-
url.searchParams.set("limit", String(limit));
|
|
513
|
-
url.searchParams.set("offset", String(offset));
|
|
514
|
-
if (severity) url.searchParams.set("severity", severity);
|
|
515
|
-
const safeProduct = sanitizeProductFilter(product);
|
|
516
|
-
if (safeProduct) url.searchParams.set("product", safeProduct);
|
|
517
|
-
const data = await requestJson(url.toString());
|
|
518
|
-
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
519
|
-
}
|
|
520
|
-
);
|
|
521
|
-
}
|
|
522
|
-
function parseComments(row) {
|
|
523
|
-
if (!row || typeof row !== "object") return [];
|
|
524
|
-
const raw = row.progress_log;
|
|
525
|
-
if (typeof raw !== "string" || !raw.trim()) return [];
|
|
526
|
-
try {
|
|
527
|
-
const parsed = JSON.parse(raw);
|
|
528
|
-
return Array.isArray(parsed) ? parsed : [];
|
|
529
|
-
} catch {
|
|
530
|
-
return [];
|
|
531
|
-
}
|
|
532
|
-
}
|
|
533
|
-
function registerGetBugReport(server) {
|
|
534
|
-
server.registerTool(
|
|
535
|
-
"get_bug_report",
|
|
536
|
-
{
|
|
537
|
-
title: "Get Bug Report",
|
|
538
|
-
description: "AskExe-internal only: fetch one customer bug report with full markdown payload and comments thread.",
|
|
539
|
-
inputSchema: { id: supportIdSchema }
|
|
540
|
-
},
|
|
541
|
-
async ({ id }) => {
|
|
542
|
-
const data = await requestJson(`${endpoint()}/${encodeURIComponent(sanitizeUpstreamId(id))}`);
|
|
543
|
-
const comments = parseComments(data);
|
|
544
|
-
const enriched = data && typeof data === "object" ? { ...data, comments } : { id, comments };
|
|
545
|
-
return { content: [{ type: "text", text: JSON.stringify(enriched, null, 2) }] };
|
|
546
|
-
}
|
|
547
|
-
);
|
|
548
|
-
}
|
|
549
|
-
function registerAddBugReportComment(server) {
|
|
550
|
-
server.registerTool(
|
|
551
|
-
"add_bug_report_comment",
|
|
552
|
-
{
|
|
553
|
-
title: "Add Bug Report Comment",
|
|
554
|
-
description: "AskExe-internal only: append a comment to a bug report's thread (POST /comments). Non-destructive \u2014 does not touch triage_notes or status.",
|
|
555
|
-
inputSchema: {
|
|
556
|
-
id: supportIdSchema,
|
|
557
|
-
comment: z2.string().min(1).describe("Comment text to append to the bug report thread")
|
|
558
|
-
}
|
|
559
|
-
},
|
|
560
|
-
async ({ id, comment }) => {
|
|
561
|
-
const data = await commentRequestJson(id, {
|
|
562
|
-
method: "POST",
|
|
563
|
-
body: sanitizedUpstreamBody({ comment }, "support-inbox:add_comment")
|
|
564
|
-
});
|
|
565
|
-
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
566
|
-
}
|
|
567
|
-
);
|
|
568
|
-
}
|
|
569
|
-
function registerGetBugReportComments(server) {
|
|
570
|
-
server.registerTool(
|
|
571
|
-
"get_bug_report_comments",
|
|
572
|
-
{
|
|
573
|
-
title: "Get Bug Report Comments",
|
|
574
|
-
description: "AskExe-internal only: list the comments thread on a bug report (GET /comments).",
|
|
575
|
-
inputSchema: { id: supportIdSchema }
|
|
576
|
-
},
|
|
577
|
-
async ({ id }) => {
|
|
578
|
-
const data = await commentRequestJson(id);
|
|
579
|
-
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
580
|
-
}
|
|
581
|
-
);
|
|
582
|
-
}
|
|
583
|
-
function registerTriageBugReport(server) {
|
|
584
|
-
server.registerTool(
|
|
585
|
-
"triage_bug_report",
|
|
586
|
-
{
|
|
587
|
-
title: "Triage Bug Report",
|
|
588
|
-
description: "AskExe-internal only: update bug report status and link task/commit/release metadata. Setting status=fixed or closed requires a verification artifact (verification_kind + fix_commit + either the regression-test fields or the manual verifier fields); the fix commit's diff is measured locally.",
|
|
589
|
-
inputSchema: {
|
|
590
|
-
id: supportIdSchema,
|
|
591
|
-
status: STATUS.optional(),
|
|
592
|
-
triage_notes: z2.string().optional(),
|
|
593
|
-
add_note: z2.string().optional().describe("Append a timestamped progress note without changing status or replacing triage_notes"),
|
|
594
|
-
linked_task_id: supportTaskIdSchema.optional(),
|
|
595
|
-
linked_commit: supportCommitSchema.optional(),
|
|
596
|
-
fixed_version: supportVersionSchema.optional(),
|
|
597
|
-
product: supportProductSchema.optional().describe("Re-label this bug's product: exe-os, exe-create, exe-wiki, exe-gateway, exe-crm, exe-build, exe-chat, exe-auth, exe-monitor, exe-db, exe-erp"),
|
|
598
|
-
...verificationArtifactInputSchema
|
|
599
|
-
}
|
|
600
|
-
},
|
|
601
|
-
async ({ id, status, triage_notes, add_note, linked_task_id, linked_commit, fixed_version, product, ...verification }) => {
|
|
602
|
-
const bugUrl = `${endpoint()}/${encodeURIComponent(sanitizeUpstreamId(id))}`;
|
|
603
|
-
const attestsByIdentity = verification.verification_kind === "manual" || verification.verification_kind === "ops_transcript" || verification.disposition !== void 0 && verification.disposition !== "fixed";
|
|
604
|
-
let authorIdentities = [];
|
|
605
|
-
if (isVerifiedStatus(status) && attestsByIdentity) {
|
|
606
|
-
try {
|
|
607
|
-
const row = await requestJson(bugUrl);
|
|
608
|
-
authorIdentities = [row?.agent_id, row?.license_email];
|
|
609
|
-
} catch {
|
|
610
|
-
}
|
|
611
|
-
}
|
|
612
|
-
const resolved = resolveVerificationArtifact(status, verification, { authorIdentities });
|
|
613
|
-
if (!resolved.ok) {
|
|
614
|
-
return { isError: true, content: [{ type: "text", text: resolved.message }] };
|
|
615
|
-
}
|
|
616
|
-
const attribution = assertVerdictAttribution(status, resolved);
|
|
617
|
-
if (!attribution.ok) {
|
|
618
|
-
return { isError: true, content: [{ type: "text", text: attribution.message }] };
|
|
619
|
-
}
|
|
620
|
-
const delivery = parseDeliveryProof(verification.delivery_proof);
|
|
621
|
-
if (!delivery.ok) {
|
|
622
|
-
return { isError: true, content: [{ type: "text", text: delivery.message }] };
|
|
623
|
-
}
|
|
624
|
-
const data = await requestJson(bugUrl, {
|
|
625
|
-
method: "PATCH",
|
|
626
|
-
body: sanitizedUpstreamBody({
|
|
627
|
-
status,
|
|
628
|
-
triage_notes,
|
|
629
|
-
add_note,
|
|
630
|
-
linked_task_id,
|
|
631
|
-
linked_commit,
|
|
632
|
-
fixed_version,
|
|
633
|
-
product,
|
|
634
|
-
verification_artifact: resolved.artifact,
|
|
635
|
-
delivery_proof: delivery.value,
|
|
636
|
-
// The disposition travels with the close: the server gates on it, and stores
|
|
637
|
-
// it so the record reads as "closed because there was nothing to fix" rather
|
|
638
|
-
// than as an unexplained close.
|
|
639
|
-
disposition: verification.disposition,
|
|
640
|
-
disposition_reason: verification.disposition_reason,
|
|
641
|
-
superseded_by: verification.superseded_by,
|
|
642
|
-
disposition_verifier: verification.disposition_verifier,
|
|
643
|
-
superseded_coverage: verification.superseded_coverage,
|
|
644
|
-
symptoms: verification.symptoms,
|
|
645
|
-
attribution: resolved.attribution
|
|
646
|
-
}, "support-inbox:triage_bug")
|
|
647
|
-
});
|
|
648
|
-
const response = fixed_version && !status ? withStatusNotice(
|
|
649
|
-
data,
|
|
650
|
-
`fixed_version ${fixed_version} recorded. Status was not changed and the bug was NOT closed. To close it, pass status: "closed" explicitly.`
|
|
651
|
-
) : data;
|
|
652
|
-
return { content: [{ type: "text", text: JSON.stringify(response, null, 2) }] };
|
|
653
|
-
}
|
|
654
|
-
);
|
|
655
|
-
}
|
|
656
|
-
var FEATURE_STATUS = z2.enum(["open", "planned", "in_progress", "shipped", "closed", "wontdo"]);
|
|
657
|
-
function featureEndpoint() {
|
|
658
|
-
return endpoint().replace(/\/bug-reports\/?$/, "/feature-requests");
|
|
659
|
-
}
|
|
660
|
-
function featureOwnerEndpoint() {
|
|
661
|
-
return ownerEndpoint().replace(/\/bug-reports\/?$/, "/feature-requests");
|
|
662
|
-
}
|
|
663
|
-
function registerListFeatureRequests(server) {
|
|
664
|
-
server.registerTool(
|
|
665
|
-
"list_feature_requests",
|
|
666
|
-
{
|
|
667
|
-
title: "List Feature Requests",
|
|
668
|
-
description: "AskExe-internal only: list incoming customer feature requests from the support inbox.",
|
|
669
|
-
inputSchema: {
|
|
670
|
-
status: z2.enum(["all", "open", "planned", "in_progress", "shipped", "closed", "wontdo"]).default("open"),
|
|
671
|
-
priority: z2.enum(["p0", "p1", "p2", "p3"]).optional(),
|
|
672
|
-
product: z2.string().optional().describe("Filter by product: exe-os, exe-create, exe-wiki, exe-gateway, exe-crm, exe-build, exe-chat, exe-auth, exe-monitor, exe-db, exe-erp"),
|
|
673
|
-
limit: z2.number().int().min(1).max(500).default(25),
|
|
674
|
-
offset: z2.number().int().min(0).default(0).describe("Number of results to skip for pagination. Use next_offset from a prior response.")
|
|
675
|
-
}
|
|
676
|
-
},
|
|
677
|
-
async ({ status, priority, product, limit, offset }) => {
|
|
678
|
-
const url = new URL(featureEndpoint());
|
|
679
|
-
url.searchParams.set("status", status);
|
|
680
|
-
url.searchParams.set("limit", String(limit));
|
|
681
|
-
url.searchParams.set("offset", String(offset));
|
|
682
|
-
if (priority) url.searchParams.set("priority", priority);
|
|
683
|
-
const safeProduct = sanitizeProductFilter(product);
|
|
684
|
-
if (safeProduct) url.searchParams.set("product", safeProduct);
|
|
685
|
-
const data = await requestJson(url.toString());
|
|
686
|
-
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
687
|
-
}
|
|
688
|
-
);
|
|
689
|
-
}
|
|
690
|
-
function registerGetFeatureRequest(server) {
|
|
691
|
-
server.registerTool(
|
|
692
|
-
"get_feature_request",
|
|
693
|
-
{
|
|
694
|
-
title: "Get Feature Request",
|
|
695
|
-
description: "AskExe-internal only: fetch one customer feature request with full payload.",
|
|
696
|
-
inputSchema: { id: supportIdSchema }
|
|
697
|
-
},
|
|
698
|
-
async ({ id }) => {
|
|
699
|
-
const data = await requestJson(`${featureEndpoint()}/${encodeURIComponent(sanitizeUpstreamId(id))}`);
|
|
700
|
-
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
701
|
-
}
|
|
702
|
-
);
|
|
703
|
-
}
|
|
704
|
-
function registerTriageFeatureRequest(server) {
|
|
705
|
-
server.registerTool(
|
|
706
|
-
"triage_feature_request",
|
|
707
|
-
{
|
|
708
|
-
title: "Triage Feature Request",
|
|
709
|
-
description: "AskExe-internal only: update feature request status, response notes, and version metadata.",
|
|
710
|
-
inputSchema: {
|
|
711
|
-
id: supportIdSchema,
|
|
712
|
-
status: FEATURE_STATUS.optional(),
|
|
713
|
-
response_notes: z2.string().optional(),
|
|
714
|
-
add_note: z2.string().optional().describe("Append a timestamped progress note without changing status or replacing response_notes"),
|
|
715
|
-
target_version: supportVersionSchema.optional(),
|
|
716
|
-
shipped_version: supportVersionSchema.optional(),
|
|
717
|
-
// bug b8e990ed: allow admin re-label of a feature's product. Typed with the
|
|
718
|
-
// strict product schema (round 10 ingress validation), not a loose string.
|
|
719
|
-
product: supportProductSchema.optional().describe("Re-label this feature's product: exe-os, exe-create, exe-wiki, exe-gateway, exe-crm, exe-build, exe-chat, exe-auth, exe-monitor, exe-db, exe-erp")
|
|
720
|
-
}
|
|
721
|
-
},
|
|
722
|
-
async ({ id, status, response_notes, add_note, target_version, shipped_version, product }) => {
|
|
723
|
-
const data = await requestJson(`${featureEndpoint()}/${encodeURIComponent(sanitizeUpstreamId(id))}`, {
|
|
724
|
-
method: "PATCH",
|
|
725
|
-
body: sanitizedUpstreamBody({ status, response_notes, add_note, target_version, shipped_version, product }, "support-inbox:triage_feature")
|
|
726
|
-
});
|
|
727
|
-
const response = shipped_version && !status ? withStatusNotice(
|
|
728
|
-
data,
|
|
729
|
-
`shipped_version ${shipped_version} recorded. Status was not changed and the feature was NOT marked shipped or closed. To mark it shipped, pass status: "shipped" explicitly.`
|
|
730
|
-
) : data;
|
|
731
|
-
return { content: [{ type: "text", text: JSON.stringify(response, null, 2) }] };
|
|
732
|
-
}
|
|
733
|
-
);
|
|
734
|
-
}
|
|
735
|
-
var REVIEW_STATUS = z2.enum(["open", "in_review", "approved", "merged", "closed", "rejected"]);
|
|
736
|
-
function reviewEndpoint() {
|
|
737
|
-
return endpoint().replace(/\/bug-reports\/?$/, "/reviews");
|
|
738
|
-
}
|
|
739
|
-
function registerListReviews(server) {
|
|
740
|
-
server.registerTool(
|
|
741
|
-
"list_reviews",
|
|
742
|
-
{
|
|
743
|
-
title: "List Reviews",
|
|
744
|
-
description: "AskExe-internal only: list incoming review requests from the support inbox.",
|
|
745
|
-
inputSchema: {
|
|
746
|
-
status: z2.enum(["all", "open", "in_review", "approved", "merged", "closed", "rejected"]).default("open"),
|
|
747
|
-
priority: z2.enum(["p0", "p1", "p2", "p3"]).optional(),
|
|
748
|
-
limit: z2.number().int().min(1).max(500).default(25),
|
|
749
|
-
offset: z2.number().int().min(0).default(0).describe("Number of results to skip for pagination. Use next_offset from a prior response.")
|
|
750
|
-
}
|
|
751
|
-
},
|
|
752
|
-
async ({ status, priority, limit, offset }) => {
|
|
753
|
-
const url = new URL(reviewEndpoint());
|
|
754
|
-
url.searchParams.set("status", status);
|
|
755
|
-
url.searchParams.set("limit", String(limit));
|
|
756
|
-
url.searchParams.set("offset", String(offset));
|
|
757
|
-
if (priority) url.searchParams.set("priority", priority);
|
|
758
|
-
const data = await requestJson(url.toString());
|
|
759
|
-
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
760
|
-
}
|
|
761
|
-
);
|
|
762
|
-
}
|
|
763
|
-
function registerGetReview(server) {
|
|
764
|
-
server.registerTool(
|
|
765
|
-
"get_review",
|
|
766
|
-
{
|
|
767
|
-
title: "Get Review",
|
|
768
|
-
description: "AskExe-internal only: fetch one review with full payload.",
|
|
769
|
-
inputSchema: { id: supportIdSchema }
|
|
770
|
-
},
|
|
771
|
-
async ({ id }) => {
|
|
772
|
-
const data = await requestJson(`${reviewEndpoint()}/${encodeURIComponent(sanitizeUpstreamId(id))}`);
|
|
773
|
-
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
774
|
-
}
|
|
775
|
-
);
|
|
776
|
-
}
|
|
777
|
-
function registerTriageReview(server) {
|
|
778
|
-
server.registerTool(
|
|
779
|
-
"triage_review",
|
|
780
|
-
{
|
|
781
|
-
title: "Triage Review",
|
|
782
|
-
description: "AskExe-internal only: update review status, response notes, and resolution.",
|
|
783
|
-
inputSchema: {
|
|
784
|
-
id: supportIdSchema,
|
|
785
|
-
status: REVIEW_STATUS.optional(),
|
|
786
|
-
response_notes: z2.string().optional(),
|
|
787
|
-
add_note: z2.string().optional().describe("Append a timestamped progress note without changing status or replacing response_notes"),
|
|
788
|
-
resolution: z2.string().optional(),
|
|
789
|
-
pr_url: z2.string().optional()
|
|
790
|
-
}
|
|
791
|
-
},
|
|
792
|
-
async ({ id, status, response_notes, add_note, resolution, pr_url }) => {
|
|
793
|
-
const data = await requestJson(`${reviewEndpoint()}/${encodeURIComponent(sanitizeUpstreamId(id))}`, {
|
|
794
|
-
method: "PATCH",
|
|
795
|
-
body: sanitizedUpstreamBody({ status, response_notes, add_note, resolution, pr_url }, "support-inbox:triage_review")
|
|
796
|
-
});
|
|
797
|
-
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
798
|
-
}
|
|
799
|
-
);
|
|
800
|
-
}
|
|
801
|
-
|
|
802
|
-
export {
|
|
803
|
-
resolveAttribution,
|
|
804
|
-
isVerifiedStatus,
|
|
805
|
-
verificationArtifactInputSchema,
|
|
806
|
-
assertVerdictAttribution,
|
|
807
|
-
resolveVerificationArtifact,
|
|
808
|
-
parseDeliveryProof,
|
|
809
|
-
registerListBugReports,
|
|
810
|
-
registerGetBugReport,
|
|
811
|
-
registerAddBugReportComment,
|
|
812
|
-
registerGetBugReportComments,
|
|
813
|
-
registerTriageBugReport,
|
|
814
|
-
registerListFeatureRequests,
|
|
815
|
-
registerGetFeatureRequest,
|
|
816
|
-
registerTriageFeatureRequest,
|
|
817
|
-
registerListReviews,
|
|
818
|
-
registerGetReview,
|
|
819
|
-
registerTriageReview
|
|
820
|
-
};
|