@askexenow/exe-os 0.9.292 → 0.9.293
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/generate-env.ts +27 -1
- package/dist/active-agent-OEJKODGY.js +27 -0
- package/dist/active-agent-PFZAEMJA.js +28 -0
- package/dist/active-agent-USK4RVP5.js +28 -0
- package/dist/active-agent-XEZTZEV7.js +27 -0
- package/dist/agentic-ontology-46PBPTLE.js +25 -0
- package/dist/agentic-ontology-WTXI6RLB.js +25 -0
- package/dist/assets/com.askexe.exed.plist +70 -0
- package/dist/backfill-metadata-IYP2QGGD.js +600 -0
- package/dist/backfill-metadata-S523IKKJ.js +600 -0
- package/dist/behaviors-GPCWN3RL.js +46 -0
- package/dist/behaviors-UYEYYVIH.js +46 -0
- package/dist/bin/agentic-ontology-backfill.js +5 -5
- package/dist/bin/agentic-reflection-backfill.js +6 -6
- package/dist/bin/agentic-semantic-label.js +5 -5
- package/dist/bin/backfill-conversations.js +6 -6
- package/dist/bin/backfill-responses.js +6 -6
- package/dist/bin/backfill-vectors.js +8 -8
- package/dist/bin/bulk-sync-postgres.js +7 -6
- package/dist/bin/cc-doctor.js +4 -4
- package/dist/bin/cleanup-stale-review-tasks.js +11 -11
- package/dist/bin/cli.js +16 -16
- package/dist/bin/deferred-daemon-restart.js +1 -1
- package/dist/bin/exe-agent-config.js +2 -2
- package/dist/bin/exe-agent.js +4 -4
- package/dist/bin/exe-assign.js +8 -8
- package/dist/bin/exe-boot.js +38 -18
- package/dist/bin/exe-call.js +4 -4
- package/dist/bin/exe-cloud.js +11 -4
- package/dist/bin/exe-dispatch.js +11 -11
- package/dist/bin/exe-doctor.js +2 -2
- package/dist/bin/exe-export-behaviors.js +7 -7
- package/dist/bin/exe-forget.js +6 -6
- package/dist/bin/exe-gateway.js +7 -7
- package/dist/bin/exe-healthcheck.js +4 -4
- package/dist/bin/exe-heartbeat.js +11 -11
- package/dist/bin/exe-kill.js +14 -14
- package/dist/bin/exe-launch-agent.js +36 -18
- package/dist/bin/exe-new-employee.js +6 -6
- package/dist/bin/exe-pending-messages.js +12 -12
- package/dist/bin/exe-pending-notifications.js +11 -11
- package/dist/bin/exe-pending-reviews.js +11 -11
- package/dist/bin/exe-rename.js +4 -4
- package/dist/bin/exe-review.js +13 -13
- package/dist/bin/exe-search.js +5 -5
- package/dist/bin/exe-session-cleanup.js +16 -16
- package/dist/bin/exe-settings.js +12 -4
- package/dist/bin/exe-start-codex.js +11 -11
- package/dist/bin/exe-start-opencode.js +8 -8
- package/dist/bin/exe-status.js +12 -12
- package/dist/bin/exe-team.js +3 -3
- package/dist/bin/git-sweep.js +12 -12
- package/dist/bin/graph-backfill.js +4 -4
- package/dist/bin/graph-export.js +5 -5
- package/dist/bin/import-history.js +7 -7
- package/dist/bin/install-launchd.js +46 -10
- package/dist/bin/install.js +8 -8
- package/dist/bin/intercom-check.js +4 -4
- package/dist/bin/mcp-sessions.js +2 -2
- package/dist/bin/orchestration-metrics.js +4 -4
- package/dist/bin/postgres-agentic-reflection-backfill.js +2 -2
- package/dist/bin/postgres-agentic-semantic-backfill.js +1 -1
- package/dist/bin/scan-tasks.js +11 -11
- package/dist/bin/setup.js +1 -1
- package/dist/bin/shard-migrate.js +4 -4
- package/dist/capability-cards-7XF2UW3Z.js +89 -0
- package/dist/capability-cards-DME6OMOK.js +89 -0
- package/dist/capacity-monitor-7SKMXRIK.js +51 -0
- package/dist/capacity-monitor-MNEA6FMY.js +51 -0
- package/dist/catchup-brief-46O3RLWO.js +175 -0
- package/dist/catchup-brief-EPEKZKRA.js +175 -0
- package/dist/chunk-2EMOVUJR.js +128 -0
- package/dist/chunk-2JE7LJCZ.js +240 -0
- package/dist/chunk-2LHQ5MGP.js +377 -0
- package/dist/chunk-2ZXMXFGH.js +4380 -0
- package/dist/chunk-3KIMGEFL.js +54 -0
- package/dist/chunk-3PY5PK75.js +14533 -0
- package/dist/chunk-3SDAK22H.js +538 -0
- package/dist/chunk-4CEGPB6F.js +240 -0
- package/dist/chunk-4HDMB2M5.js +574 -0
- package/dist/chunk-4KCLWBF6.js +197 -0
- package/dist/chunk-4WZ55DSC.js +381 -0
- package/dist/chunk-5QX4LHOF.js +668 -0
- package/dist/chunk-5RSGWGYP.js +1119 -0
- package/dist/chunk-5SWY4J5G.js +284 -0
- package/dist/chunk-5ZHIAIDE.js +424 -0
- package/dist/chunk-5ZKD5ZVT.js +33 -0
- package/dist/chunk-67X246EI.js +424 -0
- package/dist/chunk-6A56VNVX.js +448 -0
- package/dist/chunk-6EEBG6WU.js +345 -0
- package/dist/chunk-6EI5U2KJ.js +171 -0
- package/dist/chunk-6G4JWZPF.js +128 -0
- package/dist/chunk-6GTLJHAG.js +150 -0
- package/dist/chunk-6LDZPC2H.js +1079 -0
- package/dist/chunk-6PNCZTKV.js +1119 -0
- package/dist/chunk-6QPDD4BI.js +123 -0
- package/dist/chunk-6ZMLJ6ZQ.js +2129 -0
- package/dist/chunk-72O5EJ52.js +204 -0
- package/dist/chunk-737NSJT4.js +553 -0
- package/dist/chunk-7P5TUGTL.js +456 -0
- package/dist/chunk-7XDF7BZQ.js +192 -0
- package/dist/chunk-ALYNEMIH.js +150 -0
- package/dist/chunk-B4PYJHIV.js +402 -0
- package/dist/chunk-B5ZCGIYB.js +630 -0
- package/dist/chunk-BE3T47CS.js +97 -0
- package/dist/chunk-BNJ3YCPD.js +192 -0
- package/dist/chunk-BUBYDG7Q.js +1079 -0
- package/dist/chunk-CSCRGRZT.js +345 -0
- package/dist/chunk-CY4S3HMG.js +30 -0
- package/dist/chunk-D2WYUJHM.js +50 -0
- package/dist/chunk-D3X64YSB.js +377 -0
- package/dist/chunk-D6TPR4BN.js +204 -0
- package/dist/chunk-DDI57ILJ.js +38 -0
- package/dist/chunk-DQBHY3Q4.js +210 -0
- package/dist/chunk-DVFHAY2J.js +630 -0
- package/dist/chunk-DWCR5GGG.js +128 -0
- package/dist/chunk-DZJPVLVR.js +2078 -0
- package/dist/chunk-E45SQG7C.js +280 -0
- package/dist/chunk-EJ7CWALW.js +244 -0
- package/dist/chunk-EM5WXY6H.js +836 -0
- package/dist/chunk-EOVVOUXC.js +381 -0
- package/dist/chunk-EVV55PHP.js +331 -0
- package/dist/chunk-F4FMIWEL.js +214 -0
- package/dist/chunk-F5GLICUP.js +85 -0
- package/dist/chunk-F5WN7EQ2.js +333 -0
- package/dist/chunk-FVXYTNSI.js +123 -0
- package/dist/chunk-FXD5LXRD.js +8 -0
- package/dist/chunk-G53LIPLG.js +76 -0
- package/dist/chunk-GEJAUWIZ.js +1350 -0
- package/dist/chunk-GJDYAXUL.js +227 -0
- package/dist/chunk-GJS7CJRC.js +129 -0
- package/dist/chunk-GTVP4QTZ.js +362 -0
- package/dist/chunk-HG7Z7JHX.js +85 -0
- package/dist/chunk-HH3MBGMJ.js +70 -0
- package/dist/chunk-HJBKBEC4.js +58 -0
- package/dist/chunk-HKSTWZ22.js +456 -0
- package/dist/chunk-HMP5VT6A.js +118 -0
- package/dist/chunk-HN2PWLQI.js +167 -0
- package/dist/chunk-HN3HGFBL.js +20 -0
- package/dist/chunk-HREBA7BJ.js +290 -0
- package/dist/chunk-HV7F5CXJ.js +553 -0
- package/dist/chunk-HWXIMSB7.js +30 -0
- package/dist/chunk-HWY5ROLO.js +129 -0
- package/dist/chunk-IDJCLLJF.js +3298 -0
- package/dist/chunk-IPMGAQGC.js +290 -0
- package/dist/chunk-IRT55NLF.js +382 -0
- package/dist/chunk-IXZ7OTB3.js +159 -0
- package/dist/chunk-J7JVMFKR.js +262 -0
- package/dist/chunk-JABYHL7R.js +171 -0
- package/dist/chunk-JE2ICRS5.js +197 -0
- package/dist/chunk-JLH273CW.js +70 -0
- package/dist/chunk-JPTT22PI.js +54 -0
- package/dist/chunk-JVT6ONVZ.js +731 -0
- package/dist/chunk-KJEG2OQN.js +1350 -0
- package/dist/chunk-LSASGUNP.js +85 -0
- package/dist/chunk-LSTM35QE.js +1186 -0
- package/dist/chunk-LZEWGBU2.js +97 -0
- package/dist/chunk-M2IOPGVR.js +731 -0
- package/dist/chunk-MBININJN.js +2078 -0
- package/dist/chunk-MJ2MCLZH.js +402 -0
- package/dist/chunk-MX63V4YD.js +38 -0
- package/dist/chunk-N7TWCWY5.js +128 -0
- package/dist/chunk-NAKIQODV.js +331 -0
- package/dist/chunk-NMJSZ5FC.js +185 -0
- package/dist/chunk-NXCJWGAF.js +836 -0
- package/dist/chunk-OLJTE7LW.js +157 -0
- package/dist/chunk-OPDX7KTW.js +167 -0
- package/dist/chunk-OXM62MI7.js +221 -0
- package/dist/chunk-PC53GP5N.js +55 -0
- package/dist/chunk-PMMQFOER.js +81 -0
- package/dist/chunk-PVVG22J4.js +735 -0
- package/dist/chunk-Q326CKO3.js +377 -0
- package/dist/chunk-QAK47LG3.js +81 -0
- package/dist/chunk-QAWSQ5LG.js +157 -0
- package/dist/chunk-QLPHEY7D.js +668 -0
- package/dist/chunk-QV4CHWME.js +97 -0
- package/dist/chunk-QY46R3SB.js +348 -0
- package/dist/chunk-RAERYWCL.js +299 -0
- package/dist/chunk-RT5NXMH2.js +284 -0
- package/dist/chunk-RUUIZJSU.js +127 -0
- package/dist/chunk-S3PNZLTN.js +50 -0
- package/dist/chunk-S6WSWJBL.js +362 -0
- package/dist/chunk-STOZKLK6.js +1352 -0
- package/dist/chunk-SZCJI4TR.js +735 -0
- package/dist/chunk-T3FMPQOR.js +85 -0
- package/dist/chunk-T6EKR34W.js +58 -0
- package/dist/chunk-TKIOFYNW.js +1186 -0
- package/dist/chunk-TM2GZWIT.js +3313 -0
- package/dist/chunk-TWFTSIAI.js +4380 -0
- package/dist/chunk-U7BFATN7.js +538 -0
- package/dist/chunk-UAQZT24C.js +181 -0
- package/dist/chunk-UFHBNXGV.js +333 -0
- package/dist/chunk-UVN3LWCL.js +214 -0
- package/dist/chunk-UVRS32RJ.js +97 -0
- package/dist/chunk-V6R43RSE.js +227 -0
- package/dist/chunk-VHMVQUCR.js +448 -0
- package/dist/chunk-VK7NRMIW.js +2133 -0
- package/dist/chunk-VRFO3H3R.js +76 -0
- package/dist/chunk-VRZS4KWF.js +122 -0
- package/dist/chunk-WOXY76VV.js +33 -0
- package/dist/chunk-X6VOKECC.js +348 -0
- package/dist/chunk-XADXYWPE.js +280 -0
- package/dist/chunk-XCP56OMR.js +1352 -0
- package/dist/chunk-XDH5XB72.js +262 -0
- package/dist/chunk-XFPSFPVD.js +1094 -0
- package/dist/chunk-XOT6CVJA.js +244 -0
- package/dist/chunk-XWRIBBYP.js +210 -0
- package/dist/chunk-XWVCURC2.js +181 -0
- package/dist/chunk-YA6SJFNN.js +221 -0
- package/dist/chunk-YDMUHYCP.js +127 -0
- package/dist/chunk-YKQQ4UTG.js +382 -0
- package/dist/chunk-YNORJIBH.js +208 -0
- package/dist/chunk-YQ2R4BLZ.js +14533 -0
- package/dist/chunk-YUIT7Z7I.js +299 -0
- package/dist/chunk-ZD6EJ7LY.js +604 -0
- package/dist/chunk-ZHHBVPOX.js +1094 -0
- package/dist/chunk-ZNY54QWW.js +377 -0
- package/dist/chunk-ZVABYVSP.js +122 -0
- package/dist/chunk-ZVDYPSJH.js +94 -0
- package/dist/chunk-ZXNQ7GRU.js +185 -0
- package/dist/co-activation-ACVH2TL4.js +74 -0
- package/dist/co-activation-EJ63SDWZ.js +74 -0
- package/dist/co-occurrence-VKJWYROE.js +95 -0
- package/dist/co-occurrence-X2M3ASN4.js +95 -0
- package/dist/code-context-index-5EFZGRML.js +30 -0
- package/dist/core-memory-G3AEM4FY.js +110 -0
- package/dist/core-memory-GOI4WKP5.js +110 -0
- package/dist/crdt-sync-QXBHJ5GL.js +33 -0
- package/dist/crdt-sync-WX6YMYZS.js +33 -0
- package/dist/crm-webhook-EEL2F5TM.js +10 -0
- package/dist/crm-webhook-OYNQH4RZ.js +10 -0
- package/dist/cto-delegation-gate-RP4XBAZZ.js +280 -0
- package/dist/cto-delegation-gate-XOD3NAJS.js +280 -0
- package/dist/daemon-orchestration-33R5DNF2.js +139 -0
- package/dist/daemon-orchestration-EEPWOFMX.js +139 -0
- package/dist/db-backup-T4OALIZH.js +41 -0
- package/dist/db-backup-U5TNET7Z.js +41 -0
- package/dist/dispatch-ack-4S44HBWB.js +15 -0
- package/dist/doc-graph-extractor-O5EADZ3H.js +133 -0
- package/dist/doc-graph-extractor-SFMDR2SB.js +133 -0
- package/dist/dreaming-IXYC3FUN.js +34 -0
- package/dist/dreaming-ODYGZEIV.js +34 -0
- package/dist/entity-boost-XBGZKDJZ.js +375 -0
- package/dist/exe-drift-BKAGZUO2.js +70 -0
- package/dist/exe-drift-N7QYRQX7.js +70 -0
- package/dist/exe-export-AQZ3ZPSJ.js +77 -0
- package/dist/exe-export-QQGWWVZC.js +77 -0
- package/dist/exe-import-EVEGB2O4.js +80 -0
- package/dist/exe-import-RPL3RSZ2.js +80 -0
- package/dist/exe-key-5FYKRZOH.js +673 -0
- package/dist/exe-key-Y256JM3G.js +673 -0
- package/dist/exe-snapshot-AUJQ53Z7.js +338 -0
- package/dist/exe-snapshot-CSJDVWXM.js +338 -0
- package/dist/fast-db-init-57YCVJQP.js +7 -0
- package/dist/fast-db-init-VU4FDPGX.js +7 -0
- package/dist/gateway/index.js +8 -8
- package/dist/git-staleness-CR46BFAY.js +112 -0
- package/dist/git-staleness-H4NWNDJ5.js +112 -0
- package/dist/git-task-sweep-F7ASO7CZ.js +42 -0
- package/dist/git-task-sweep-XSPCOBUY.js +42 -0
- package/dist/global-procedures-7FDCJNWI.js +22 -0
- package/dist/global-procedures-GX7V5L76.js +22 -0
- package/dist/graph-auto-extract-JI3VW5KY.js +183 -0
- package/dist/graph-auto-extract-KFNHAHBK.js +183 -0
- package/dist/hooks/bug-report-worker.js +13 -13
- package/dist/hooks/codex-stop-task-finalizer.js +13 -13
- package/dist/hooks/commit-complete.js +13 -13
- package/dist/hooks/error-recall.js +6 -6
- package/dist/hooks/exe-heartbeat-hook.js +3 -3
- package/dist/hooks/ingest-worker.js +3 -3
- package/dist/hooks/ingest.js +6 -6
- package/dist/hooks/instructions-loaded.js +4 -4
- package/dist/hooks/manifest.json +20 -20
- package/dist/hooks/notification.js +4 -4
- package/dist/hooks/post-compact.js +12 -12
- package/dist/hooks/post-tool-combined.js +6 -6
- package/dist/hooks/pre-compact.js +16 -16
- package/dist/hooks/pre-tool-use.js +17 -17
- package/dist/hooks/prompt-submit.js +25 -25
- package/dist/hooks/session-end.js +23 -21
- package/dist/hooks/session-start.js +12 -12
- package/dist/hooks/stop.js +19 -19
- package/dist/hooks/subagent-stop.js +43 -13
- package/dist/hooks/summary-worker.js +19 -19
- package/dist/index.js +19 -19
- package/dist/installer-6PMCIZQZ.js +298 -0
- package/dist/installer-7ET5M2DD.js +344 -0
- package/dist/installer-K7BYY3XC.js +344 -0
- package/dist/installer-U6W7TQZU.js +40 -0
- package/dist/installer-UL4HFVPT.js +298 -0
- package/dist/installer-XMQRESAT.js +40 -0
- package/dist/lib/cloud-sync.js +12 -4
- package/dist/lib/consolidation.js +5 -5
- package/dist/lib/database.js +2 -2
- package/dist/lib/db-daemon-client.js +2 -2
- package/dist/lib/db.js +2 -2
- package/dist/lib/embedder.js +3 -3
- package/dist/lib/employee-templates.js +4 -4
- package/dist/lib/employees.js +2 -2
- package/dist/lib/exe-daemon-client.js +2 -2
- package/dist/lib/exe-daemon.js +50 -39
- package/dist/lib/hybrid-search.js +5 -5
- package/dist/lib/identity.js +2 -2
- package/dist/lib/messaging.js +11 -11
- package/dist/lib/reminders.js +3 -3
- package/dist/lib/schedules.js +5 -5
- package/dist/lib/session-registry.js +4 -4
- package/dist/lib/skill-learning.js +6 -6
- package/dist/lib/store.js +4 -4
- package/dist/lib/task-router.js +3 -3
- package/dist/lib/tasks.js +12 -12
- package/dist/lib/tmux-routing.js +10 -10
- package/dist/lib/tmux-transport.js +2 -1
- package/dist/lib/token-spend.js +3 -3
- package/dist/lib/transport.js +3 -2
- package/dist/mcp/register-tools.js +62 -62
- package/dist/mcp/server.js +63 -63
- package/dist/mcp/tools/complete-reminder.js +4 -4
- package/dist/mcp/tools/create-reminder.js +4 -4
- package/dist/mcp/tools/create-task.js +15 -15
- package/dist/mcp/tools/deactivate-behavior.js +7 -7
- package/dist/mcp/tools/list-reminders.js +4 -4
- package/dist/mcp/tools/list-tasks.js +14 -14
- package/dist/mcp/tools/send-message.js +13 -13
- package/dist/mcp/tools/update-task.js +13 -13
- package/dist/mcp-http-config-JZPO4B6K.js +29 -0
- package/dist/mcp-http-config-L6TEBZOW.js +29 -0
- package/dist/memory-cards-EIA3YLFA.js +180 -0
- package/dist/memory-cards-MDZGVJWJ.js +180 -0
- package/dist/memory-graph-extractor-BMZBK2LX.js +22 -0
- package/dist/memory-graph-extractor-U2Q7MTBZ.js +22 -0
- package/dist/memory-poisoning-defense-ORWGA4KK.js +224 -0
- package/dist/memory-poisoning-defense-ZY5P2OOG.js +224 -0
- package/dist/memory-queue-client-A2PMQVEU.js +16 -0
- package/dist/memory-reflection-35NUYL3Z.js +244 -0
- package/dist/memory-reflection-NHOC2FGF.js +244 -0
- package/dist/message-queue-client-L5VZ44IN.js +92 -0
- package/dist/notifications-7GGXNR42.js +47 -0
- package/dist/notifications-B2YCZD3T.js +47 -0
- package/dist/orchestration-events-7EQJF377.js +27 -0
- package/dist/orchestration-events-VJTAOA2R.js +27 -0
- package/dist/orchestrator-IAU2Y3K3.js +35 -0
- package/dist/orchestrator-YOM5D5EJ.js +35 -0
- package/dist/pipeline-router-ITQDOV2B.js +15 -0
- package/dist/pipeline-router-VYFAS3ZX.js +15 -0
- package/dist/plan-limits-OJQINDD3.js +28 -0
- package/dist/plan-limits-UWVCNA67.js +28 -0
- package/dist/project-boot-GSLIQJVS.js +299 -0
- package/dist/project-boot-NRU7RRED.js +299 -0
- package/dist/projection-worker-SKLKJJFA.js +1084 -0
- package/dist/projection-worker-XVOLBYQC.js +1084 -0
- package/dist/prospective-memory-JOKZL7QJ.js +232 -0
- package/dist/prospective-memory-WQSB2IPD.js +232 -0
- package/dist/reranker-5HJXM4K5.js +19 -0
- package/dist/reranker-Q7KD2VDL.js +19 -0
- package/dist/retrieval-health-BAKZOWX7.js +11 -0
- package/dist/retrieval-health-LXDMWIAZ.js +11 -0
- package/dist/review-polling-GBRSJ7X5.js +126 -0
- package/dist/review-polling-YDS35QTO.js +126 -0
- package/dist/runtime/index.js +13 -13
- package/dist/session-events-EJID2CZE.js +38 -0
- package/dist/session-events-UPXPYEA3.js +38 -0
- package/dist/session-kill-telemetry-7FP74BIM.js +31 -0
- package/dist/session-kill-telemetry-XLMNOBBQ.js +31 -0
- package/dist/session-scope-QCN23H6B.js +88 -0
- package/dist/session-scope-ZR2W2EDF.js +88 -0
- package/dist/setup-wizard-7H4CE5UL.js +12 -0
- package/dist/setup-wizard-MR3XA4BC.js +12 -0
- package/dist/skill-refinement-6UK4P4UQ.js +159 -0
- package/dist/skill-refinement-RYBLDKDP.js +159 -0
- package/dist/steward-gate-PSF4JQUC.js +15 -0
- package/dist/steward-gate-U2HQZ4LX.js +15 -0
- package/dist/task-enforcement-NL6WPS3T.js +506 -0
- package/dist/task-enforcement-RYWTWHQJ.js +506 -0
- package/dist/task-scope-43TBGXSP.js +37 -0
- package/dist/task-scope-BR4ZJLQT.js +37 -0
- package/dist/tasks-crud-AQLUDVES.js +79 -0
- package/dist/tasks-crud-LWTHIDHF.js +79 -0
- package/dist/tasks-notify-PZQMVQHI.js +40 -0
- package/dist/tasks-notify-U4QZ2FGV.js +40 -0
- package/dist/tasks-review-E3LQRBNB.js +49 -0
- package/dist/tasks-review-NIGU6K3L.js +49 -0
- package/dist/telemetry-upload-PQLC5A4D.js +741 -0
- package/dist/telemetry-upload-QOYSUDDH.js +741 -0
- package/dist/token-budget-OJGWYISJ.js +86 -0
- package/dist/token-budget-VMQLMHSU.js +86 -0
- package/dist/tool-capability-index-4M3BFQTU.js +10 -0
- package/dist/tool-telemetry-4YD2E6UU.js +17 -0
- package/dist/tool-telemetry-662N3S5Q.js +17 -0
- package/dist/tui/App.js +18 -18
- package/dist/tui-data-IIGF5XRY.js +260 -0
- package/dist/tui-data-W4INCXEA.js +260 -0
- package/dist/wiki-acl-KXXMRMIM.js +111 -0
- package/dist/wiki-acl-XSRBJSBD.js +111 -0
- package/dist/worker-gate-7GMM23JY.js +21 -0
- package/dist/worker-gate-F6LY67TM.js +21 -0
- package/dist/workflow-engine-G4JTWI5N.js +28 -0
- package/dist/workflow-engine-UHOVTA5Q.js +28 -0
- package/dist/worktree-OJMZ4RG4.js +28 -0
- package/dist/worktree-ZLF4MX6T.js +28 -0
- package/dist/worktree-sweep-5Z6V7MNJ.js +21 -0
- package/dist/worktree-sweep-M64OW2MU.js +21 -0
- package/package.json +2 -2
- package/release-notes.json +14 -14
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import {
|
|
2
|
+
lightweightSearch
|
|
3
|
+
} from "./chunk-STOZKLK6.js";
|
|
4
|
+
import "./chunk-AB4PAQYK.js";
|
|
5
|
+
import "./chunk-NXCJWGAF.js";
|
|
6
|
+
import "./chunk-CHCA3ZM2.js";
|
|
7
|
+
import "./chunk-OTVEIJUQ.js";
|
|
8
|
+
import "./chunk-XWRIBBYP.js";
|
|
9
|
+
import "./chunk-Y25OJWOQ.js";
|
|
10
|
+
import {
|
|
11
|
+
sessionScopeFilter,
|
|
12
|
+
strictSessionScopeFilter
|
|
13
|
+
} from "./chunk-TWFTSIAI.js";
|
|
14
|
+
import "./chunk-XADXYWPE.js";
|
|
15
|
+
import "./chunk-4JERP7NT.js";
|
|
16
|
+
import "./chunk-4FVVJ7ME.js";
|
|
17
|
+
import "./chunk-YUIT7Z7I.js";
|
|
18
|
+
import "./chunk-HN3HGFBL.js";
|
|
19
|
+
import "./chunk-YNORJIBH.js";
|
|
20
|
+
import "./chunk-SSTLTIF3.js";
|
|
21
|
+
import "./chunk-B5ZCGIYB.js";
|
|
22
|
+
import "./chunk-QRTJNSKU.js";
|
|
23
|
+
import "./chunk-NGP6LSV2.js";
|
|
24
|
+
import "./chunk-HWY5ROLO.js";
|
|
25
|
+
import "./chunk-CVYC6DUW.js";
|
|
26
|
+
import "./chunk-OPU3NYOO.js";
|
|
27
|
+
import "./chunk-GJV3WDWM.js";
|
|
28
|
+
import "./chunk-MP2AFCGL.js";
|
|
29
|
+
import "./chunk-JLH273CW.js";
|
|
30
|
+
import "./chunk-HYZV25LY.js";
|
|
31
|
+
import {
|
|
32
|
+
getClient
|
|
33
|
+
} from "./chunk-IDJCLLJF.js";
|
|
34
|
+
import "./chunk-2I23RPSI.js";
|
|
35
|
+
import "./chunk-Q326CKO3.js";
|
|
36
|
+
import "./chunk-PNQDP3OA.js";
|
|
37
|
+
import "./chunk-7HLWBYH7.js";
|
|
38
|
+
import "./chunk-FXU7JOXK.js";
|
|
39
|
+
import "./chunk-Z42MXYWW.js";
|
|
40
|
+
import "./chunk-YTKVJJSU.js";
|
|
41
|
+
import "./chunk-R36FAN53.js";
|
|
42
|
+
import "./chunk-LYH5HE24.js";
|
|
43
|
+
import "./chunk-MLKGABMK.js";
|
|
44
|
+
|
|
45
|
+
// src/lib/catchup-brief.ts
|
|
46
|
+
import { execSync } from "child_process";
|
|
47
|
+
var HEADER = "## Catchup Brief\nHere's what happened while you were offline:";
|
|
48
|
+
var DEFAULT_LOOKBACK_MS = 60 * 60 * 1e3;
|
|
49
|
+
var MAX_BRIEF_CHARS = 2e3;
|
|
50
|
+
var MAX_CHECKPOINT_CHARS = 500;
|
|
51
|
+
var MAX_MESSAGE_CHARS = 100;
|
|
52
|
+
function clipText(text, maxChars) {
|
|
53
|
+
if (text.length <= maxChars) return text;
|
|
54
|
+
if (maxChars <= 1) return "\u2026";
|
|
55
|
+
return `${text.slice(0, maxChars - 1).trimEnd()}\u2026`;
|
|
56
|
+
}
|
|
57
|
+
function clampSections(header, sections, maxChars) {
|
|
58
|
+
const bounded = [];
|
|
59
|
+
let remaining = Math.max(0, maxChars - header.length);
|
|
60
|
+
for (const section of sections) {
|
|
61
|
+
const separatorChars = 2;
|
|
62
|
+
if (remaining <= separatorChars) break;
|
|
63
|
+
remaining -= separatorChars;
|
|
64
|
+
if (section.length <= remaining) {
|
|
65
|
+
bounded.push(section);
|
|
66
|
+
remaining -= section.length;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
const clipped = clipText(section, remaining);
|
|
70
|
+
if (clipped.trim().length > 0) bounded.push(clipped);
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
return bounded;
|
|
74
|
+
}
|
|
75
|
+
async function buildCatchupBrief(agentId, projectName, cwd, sessionScope) {
|
|
76
|
+
const sections = [];
|
|
77
|
+
let lastTimestamp = new Date(Date.now() - DEFAULT_LOOKBACK_MS).toISOString();
|
|
78
|
+
try {
|
|
79
|
+
const checkpointMemories = await lightweightSearch(
|
|
80
|
+
"CONTEXT CHECKPOINT",
|
|
81
|
+
agentId,
|
|
82
|
+
{ projectName, limit: 1 }
|
|
83
|
+
);
|
|
84
|
+
const checkpoint = checkpointMemories[0];
|
|
85
|
+
if (checkpoint?.timestamp) {
|
|
86
|
+
lastTimestamp = checkpoint.timestamp;
|
|
87
|
+
}
|
|
88
|
+
if (checkpoint?.raw_text) {
|
|
89
|
+
sections.push(
|
|
90
|
+
`### Last Checkpoint
|
|
91
|
+
${clipText(checkpoint.raw_text, MAX_CHECKPOINT_CHARS)}`
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
} catch {
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
const gitLog = execSync(
|
|
98
|
+
`git log --oneline --since=${JSON.stringify(lastTimestamp)} --format="%h %an: %s" | head -10`,
|
|
99
|
+
{ cwd, timeout: 3e3, encoding: "utf-8" }
|
|
100
|
+
).trim();
|
|
101
|
+
if (gitLog) {
|
|
102
|
+
sections.push(`### Git Activity Since You Left
|
|
103
|
+
\`\`\`
|
|
104
|
+
${gitLog}
|
|
105
|
+
\`\`\``);
|
|
106
|
+
}
|
|
107
|
+
} catch {
|
|
108
|
+
}
|
|
109
|
+
try {
|
|
110
|
+
const client = getClient();
|
|
111
|
+
const taskScope = sessionScopeFilter(sessionScope);
|
|
112
|
+
const taskChanges = await client.execute({
|
|
113
|
+
sql: `SELECT title, status, priority FROM tasks
|
|
114
|
+
WHERE assigned_to = ? AND project_name = ?
|
|
115
|
+
AND updated_at > ? AND status IN ('open', 'in_progress')${taskScope.sql}
|
|
116
|
+
ORDER BY priority ASC, updated_at DESC LIMIT 5`,
|
|
117
|
+
args: [agentId, projectName, lastTimestamp, ...taskScope.args]
|
|
118
|
+
});
|
|
119
|
+
if (taskChanges.rows.length > 0) {
|
|
120
|
+
const taskLines = taskChanges.rows.map((row) => {
|
|
121
|
+
const record = row;
|
|
122
|
+
return `- [${String(record.priority).toUpperCase()}] ${String(record.title)} (${String(record.status)})`;
|
|
123
|
+
}).join("\n");
|
|
124
|
+
sections.push(`### Your Task Queue
|
|
125
|
+
${taskLines}`);
|
|
126
|
+
}
|
|
127
|
+
} catch {
|
|
128
|
+
}
|
|
129
|
+
try {
|
|
130
|
+
const client = getClient();
|
|
131
|
+
const messageScope = strictSessionScopeFilter(sessionScope);
|
|
132
|
+
const messages = await client.execute({
|
|
133
|
+
sql: `SELECT from_agent, content, created_at FROM messages
|
|
134
|
+
WHERE target_agent = ? AND status = 'pending'${messageScope.sql}
|
|
135
|
+
ORDER BY created_at DESC LIMIT 3`,
|
|
136
|
+
args: [agentId, ...messageScope.args]
|
|
137
|
+
});
|
|
138
|
+
if (messages.rows.length > 0) {
|
|
139
|
+
const msgLines = messages.rows.map((row) => {
|
|
140
|
+
const record = row;
|
|
141
|
+
return `- From ${String(record.from_agent)}: ${clipText(String(record.content ?? ""), MAX_MESSAGE_CHARS)}`;
|
|
142
|
+
}).join("\n");
|
|
143
|
+
sections.push(`### Unread Messages
|
|
144
|
+
${msgLines}`);
|
|
145
|
+
}
|
|
146
|
+
} catch {
|
|
147
|
+
}
|
|
148
|
+
try {
|
|
149
|
+
const { getPendingProspective, markSurfaced } = await import("./prospective-memory-WQSB2IPD.js");
|
|
150
|
+
const due = await getPendingProspective(agentId, { projectName, limit: 5 });
|
|
151
|
+
if (due.length > 0) {
|
|
152
|
+
const now = Date.now();
|
|
153
|
+
const lines = due.map((item) => {
|
|
154
|
+
const overdue = item.dueDate != null && new Date(item.dueDate).getTime() < now;
|
|
155
|
+
const when = item.dueDate ? `due ${item.dueDate}${overdue ? " \u2014 OVERDUE" : ""}` : "someday";
|
|
156
|
+
const recur = item.recurrence !== "once" ? `, ${item.recurrence}` : "";
|
|
157
|
+
return `- [P${item.priority}] ${clipText(item.content, MAX_CHECKPOINT_CHARS)} (${when}${recur})`;
|
|
158
|
+
});
|
|
159
|
+
sections.push(`### Reminders Due (Prospective Memory)
|
|
160
|
+
${lines.join("\n")}`);
|
|
161
|
+
try {
|
|
162
|
+
await markSurfaced(due.map((d) => d.id));
|
|
163
|
+
} catch {
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
} catch {
|
|
167
|
+
}
|
|
168
|
+
return {
|
|
169
|
+
header: HEADER,
|
|
170
|
+
sections: clampSections(HEADER, sections, MAX_BRIEF_CHARS)
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
export {
|
|
174
|
+
buildCatchupBrief
|
|
175
|
+
};
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getCurrentSessionScope,
|
|
3
|
+
strictSessionScopeFilter
|
|
4
|
+
} from "./chunk-2ZXMXFGH.js";
|
|
5
|
+
import {
|
|
6
|
+
getProjectName
|
|
7
|
+
} from "./chunk-OPU3NYOO.js";
|
|
8
|
+
|
|
9
|
+
// src/lib/session-events.ts
|
|
10
|
+
import { randomUUID } from "crypto";
|
|
11
|
+
async function ensureSessionEventsTable(client) {
|
|
12
|
+
await client.execute(`
|
|
13
|
+
CREATE TABLE IF NOT EXISTS session_events (
|
|
14
|
+
id TEXT PRIMARY KEY,
|
|
15
|
+
agent_id TEXT NOT NULL,
|
|
16
|
+
agent_role TEXT NOT NULL,
|
|
17
|
+
session_id TEXT NOT NULL,
|
|
18
|
+
session_scope TEXT,
|
|
19
|
+
project_name TEXT NOT NULL,
|
|
20
|
+
event_index INTEGER NOT NULL,
|
|
21
|
+
event_type TEXT NOT NULL,
|
|
22
|
+
tool_name TEXT,
|
|
23
|
+
tool_use_id TEXT,
|
|
24
|
+
content TEXT NOT NULL,
|
|
25
|
+
payload_json TEXT,
|
|
26
|
+
has_error INTEGER NOT NULL DEFAULT 0,
|
|
27
|
+
created_at TEXT NOT NULL
|
|
28
|
+
)
|
|
29
|
+
`);
|
|
30
|
+
await client.execute(`
|
|
31
|
+
CREATE INDEX IF NOT EXISTS idx_session_events_agent_time
|
|
32
|
+
ON session_events(agent_id, created_at DESC)
|
|
33
|
+
`);
|
|
34
|
+
await client.execute(`
|
|
35
|
+
CREATE INDEX IF NOT EXISTS idx_session_events_session_index
|
|
36
|
+
ON session_events(session_id, event_index)
|
|
37
|
+
`);
|
|
38
|
+
await client.execute(`
|
|
39
|
+
CREATE INDEX IF NOT EXISTS idx_session_events_scope_agent_time
|
|
40
|
+
ON session_events(session_scope, agent_id, created_at DESC)
|
|
41
|
+
`);
|
|
42
|
+
}
|
|
43
|
+
async function recordSessionEvent(client, input) {
|
|
44
|
+
if (!input.content || input.content.trim().length === 0) return;
|
|
45
|
+
await ensureSessionEventsTable(client);
|
|
46
|
+
const maxResult = await client.execute({
|
|
47
|
+
sql: "SELECT COALESCE(MAX(event_index), 0) AS max_index FROM session_events WHERE session_id = ?",
|
|
48
|
+
args: [input.sessionId]
|
|
49
|
+
});
|
|
50
|
+
const currentMax = Number(maxResult.rows[0]?.max_index ?? 0);
|
|
51
|
+
const eventIndex = Number.isFinite(currentMax) ? currentMax + 1 : 1;
|
|
52
|
+
await client.execute({
|
|
53
|
+
sql: `INSERT INTO session_events (
|
|
54
|
+
id, agent_id, agent_role, session_id, session_scope, project_name,
|
|
55
|
+
event_index, event_type, tool_name, tool_use_id, content,
|
|
56
|
+
payload_json, has_error, created_at
|
|
57
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
58
|
+
args: [
|
|
59
|
+
randomUUID(),
|
|
60
|
+
input.agentId,
|
|
61
|
+
input.agentRole,
|
|
62
|
+
input.sessionId,
|
|
63
|
+
input.sessionScope ?? getCurrentSessionScope(),
|
|
64
|
+
input.projectName ?? getProjectName(input.cwd),
|
|
65
|
+
eventIndex,
|
|
66
|
+
input.eventType,
|
|
67
|
+
input.toolName ?? null,
|
|
68
|
+
input.toolUseId ?? null,
|
|
69
|
+
input.content,
|
|
70
|
+
input.payloadJson ?? null,
|
|
71
|
+
input.hasError ? 1 : 0,
|
|
72
|
+
input.timestamp ?? (/* @__PURE__ */ new Date()).toISOString()
|
|
73
|
+
]
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
async function listRecentSessionEvents(client, options) {
|
|
77
|
+
await ensureSessionEventsTable(client);
|
|
78
|
+
const conditions = ["agent_id = ?"];
|
|
79
|
+
const args = [options.agentId];
|
|
80
|
+
if (options.sessionId) {
|
|
81
|
+
conditions.push("session_id = ?");
|
|
82
|
+
args.push(options.sessionId);
|
|
83
|
+
}
|
|
84
|
+
if (options.eventType) {
|
|
85
|
+
conditions.push("event_type = ?");
|
|
86
|
+
args.push(options.eventType);
|
|
87
|
+
}
|
|
88
|
+
if (options.projectName && options.projectName !== "all") {
|
|
89
|
+
conditions.push("project_name = ?");
|
|
90
|
+
args.push(options.projectName);
|
|
91
|
+
}
|
|
92
|
+
const scope = strictSessionScopeFilter(options.sessionScope);
|
|
93
|
+
const where = `WHERE ${conditions.join(" AND ")}${scope.sql}`;
|
|
94
|
+
args.push(...scope.args);
|
|
95
|
+
args.push(Math.min(Math.max(options.limit ?? 20, 1), 100));
|
|
96
|
+
const result = await client.execute({
|
|
97
|
+
sql: `SELECT id, agent_id, agent_role, session_id, session_scope,
|
|
98
|
+
project_name, event_index, event_type, tool_name, tool_use_id,
|
|
99
|
+
content, payload_json, has_error, created_at
|
|
100
|
+
FROM session_events
|
|
101
|
+
${where}
|
|
102
|
+
ORDER BY created_at DESC, event_index DESC
|
|
103
|
+
LIMIT ?`,
|
|
104
|
+
args
|
|
105
|
+
});
|
|
106
|
+
return result.rows.map((row) => ({
|
|
107
|
+
id: String(row.id),
|
|
108
|
+
agentId: String(row.agent_id),
|
|
109
|
+
agentRole: String(row.agent_role),
|
|
110
|
+
sessionId: String(row.session_id),
|
|
111
|
+
sessionScope: row.session_scope == null ? null : String(row.session_scope),
|
|
112
|
+
projectName: String(row.project_name),
|
|
113
|
+
eventIndex: Number(row.event_index),
|
|
114
|
+
eventType: String(row.event_type),
|
|
115
|
+
toolName: row.tool_name == null ? null : String(row.tool_name),
|
|
116
|
+
toolUseId: row.tool_use_id == null ? null : String(row.tool_use_id),
|
|
117
|
+
content: String(row.content),
|
|
118
|
+
payloadJson: row.payload_json == null ? null : String(row.payload_json),
|
|
119
|
+
hasError: Number(row.has_error) === 1,
|
|
120
|
+
createdAt: String(row.created_at)
|
|
121
|
+
}));
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export {
|
|
125
|
+
ensureSessionEventsTable,
|
|
126
|
+
recordSessionEvent,
|
|
127
|
+
listRecentSessionEvents
|
|
128
|
+
};
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getClient,
|
|
3
|
+
isCoordinatorName,
|
|
4
|
+
loadEmployeesSync
|
|
5
|
+
} from "./chunk-TM2GZWIT.js";
|
|
6
|
+
|
|
7
|
+
// src/lib/steward-gate.ts
|
|
8
|
+
import crypto from "crypto";
|
|
9
|
+
var ROLE_PERMISSIONS = {
|
|
10
|
+
coordinator: /* @__PURE__ */ new Set([
|
|
11
|
+
"close_task",
|
|
12
|
+
"cancel_task",
|
|
13
|
+
"merge_entities",
|
|
14
|
+
"purge_document",
|
|
15
|
+
"deactivate_behavior",
|
|
16
|
+
"override"
|
|
17
|
+
]),
|
|
18
|
+
manager: /* @__PURE__ */ new Set([
|
|
19
|
+
"close_task",
|
|
20
|
+
// their team only — enforced contextually
|
|
21
|
+
"deactivate_behavior"
|
|
22
|
+
// their team's behaviors
|
|
23
|
+
]),
|
|
24
|
+
specialist: /* @__PURE__ */ new Set([
|
|
25
|
+
"deactivate_behavior_own",
|
|
26
|
+
// own behaviors only
|
|
27
|
+
"delete_own_memory"
|
|
28
|
+
])
|
|
29
|
+
};
|
|
30
|
+
var UNIVERSAL_OPS = /* @__PURE__ */ new Set([
|
|
31
|
+
"update_own_task",
|
|
32
|
+
"store_memory",
|
|
33
|
+
"store_behavior"
|
|
34
|
+
]);
|
|
35
|
+
var MANAGER_ROLES = /* @__PURE__ */ new Set(["CTO", "CMO"]);
|
|
36
|
+
var StewardGate = class {
|
|
37
|
+
/**
|
|
38
|
+
* Check whether an agent has authority for a destructive operation.
|
|
39
|
+
*/
|
|
40
|
+
async checkAuthority(agent, operation, target) {
|
|
41
|
+
const role = await this.resolveRole(agent);
|
|
42
|
+
if (UNIVERSAL_OPS.has(operation)) {
|
|
43
|
+
const decision2 = {
|
|
44
|
+
allowed: true,
|
|
45
|
+
reason: `Operation "${operation}" is universally permitted.`,
|
|
46
|
+
confidence: 1,
|
|
47
|
+
requires_override: false
|
|
48
|
+
};
|
|
49
|
+
await this.logDecision(agent, operation, target, decision2);
|
|
50
|
+
return decision2;
|
|
51
|
+
}
|
|
52
|
+
const permissions = ROLE_PERMISSIONS[role];
|
|
53
|
+
let allowed = permissions.has(operation);
|
|
54
|
+
let reason;
|
|
55
|
+
if (!allowed && role === "specialist" && operation === "deactivate_behavior") {
|
|
56
|
+
const isOwn = await this.isOwnBehavior(agent, target);
|
|
57
|
+
if (isOwn) {
|
|
58
|
+
allowed = true;
|
|
59
|
+
reason = `Specialist "${agent}" can deactivate their own behavior.`;
|
|
60
|
+
} else {
|
|
61
|
+
reason = `Specialist "${agent}" cannot deactivate behaviors belonging to other agents.`;
|
|
62
|
+
}
|
|
63
|
+
} else if (allowed) {
|
|
64
|
+
reason = `Role "${role}" has authority for "${operation}".`;
|
|
65
|
+
} else {
|
|
66
|
+
reason = `Role "${role}" does not have authority for "${operation}". Requires coordinator override.`;
|
|
67
|
+
}
|
|
68
|
+
let requiresOverride = !allowed;
|
|
69
|
+
let confidence = allowed ? 0.95 : 0.9;
|
|
70
|
+
try {
|
|
71
|
+
const dreamingPath = "./dreaming.js";
|
|
72
|
+
const dreaming = await import(
|
|
73
|
+
/* @vite-ignore */
|
|
74
|
+
dreamingPath
|
|
75
|
+
);
|
|
76
|
+
if (typeof dreaming.calculateDrift === "function") {
|
|
77
|
+
const driftScore = await dreaming.calculateDrift(agent);
|
|
78
|
+
if (typeof driftScore === "number" && driftScore > 0.8) {
|
|
79
|
+
requiresOverride = true;
|
|
80
|
+
confidence = Math.max(0.5, confidence - 0.3);
|
|
81
|
+
reason += ` (\u26A0\uFE0F High drift score: ${driftScore.toFixed(2)} \u2014 requires override.)`;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
} catch {
|
|
85
|
+
}
|
|
86
|
+
const decision = {
|
|
87
|
+
allowed: allowed && !requiresOverride,
|
|
88
|
+
reason,
|
|
89
|
+
confidence,
|
|
90
|
+
requires_override: requiresOverride
|
|
91
|
+
};
|
|
92
|
+
await this.logDecision(agent, operation, target, decision);
|
|
93
|
+
return decision;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Record an explicit coordinator override that bypasses the gate.
|
|
97
|
+
*/
|
|
98
|
+
async override(agent, operation, target, reason) {
|
|
99
|
+
const role = await this.resolveRole(agent);
|
|
100
|
+
if (role !== "coordinator") {
|
|
101
|
+
const decision2 = {
|
|
102
|
+
allowed: false,
|
|
103
|
+
reason: `Only coordinators can issue overrides. "${agent}" is a ${role}.`,
|
|
104
|
+
confidence: 1,
|
|
105
|
+
requires_override: false
|
|
106
|
+
};
|
|
107
|
+
await this.logDecision(agent, `override:${operation}`, target, decision2);
|
|
108
|
+
return decision2;
|
|
109
|
+
}
|
|
110
|
+
const decision = {
|
|
111
|
+
allowed: true,
|
|
112
|
+
reason: `Coordinator override: ${reason}`,
|
|
113
|
+
confidence: 1,
|
|
114
|
+
requires_override: false
|
|
115
|
+
};
|
|
116
|
+
await this.logDecision(agent, `override:${operation}`, target, decision);
|
|
117
|
+
return decision;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Query the audit trail.
|
|
121
|
+
*/
|
|
122
|
+
async getAuditLog(opts) {
|
|
123
|
+
await this.ensureAuditTable();
|
|
124
|
+
const client = getClient();
|
|
125
|
+
const conditions = [];
|
|
126
|
+
const args = [];
|
|
127
|
+
if (opts?.agent) {
|
|
128
|
+
conditions.push("agent = ?");
|
|
129
|
+
args.push(opts.agent);
|
|
130
|
+
}
|
|
131
|
+
if (opts?.operation) {
|
|
132
|
+
conditions.push("operation = ?");
|
|
133
|
+
args.push(opts.operation);
|
|
134
|
+
}
|
|
135
|
+
const where = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
|
|
136
|
+
const limit = opts?.limit ?? 50;
|
|
137
|
+
const result = await client.execute({
|
|
138
|
+
sql: `SELECT * FROM steward_audit ${where} ORDER BY created_at DESC LIMIT ?`,
|
|
139
|
+
args: [...args, limit]
|
|
140
|
+
});
|
|
141
|
+
return result.rows.map((row) => ({
|
|
142
|
+
id: String(row.id),
|
|
143
|
+
agent: String(row.agent),
|
|
144
|
+
operation: String(row.operation),
|
|
145
|
+
target: String(row.target),
|
|
146
|
+
decision: {
|
|
147
|
+
allowed: Number(row.allowed) === 1,
|
|
148
|
+
reason: String(row.reason),
|
|
149
|
+
confidence: Number(row.confidence),
|
|
150
|
+
requires_override: Number(row.requires_override) === 1
|
|
151
|
+
},
|
|
152
|
+
timestamp: String(row.created_at)
|
|
153
|
+
}));
|
|
154
|
+
}
|
|
155
|
+
// -------------------------------------------------------------------------
|
|
156
|
+
// Internal methods
|
|
157
|
+
// -------------------------------------------------------------------------
|
|
158
|
+
/**
|
|
159
|
+
* Resolve an agent name to a role category.
|
|
160
|
+
*/
|
|
161
|
+
async resolveRole(agent) {
|
|
162
|
+
if (isCoordinatorName(agent)) return "coordinator";
|
|
163
|
+
try {
|
|
164
|
+
const employees = loadEmployeesSync();
|
|
165
|
+
const employee = employees.find((e) => e.name === agent);
|
|
166
|
+
if (employee && MANAGER_ROLES.has(employee.role)) return "manager";
|
|
167
|
+
} catch {
|
|
168
|
+
}
|
|
169
|
+
return "specialist";
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Check if a behavior belongs to the given agent.
|
|
173
|
+
*/
|
|
174
|
+
async isOwnBehavior(agent, behaviorId) {
|
|
175
|
+
try {
|
|
176
|
+
const client = getClient();
|
|
177
|
+
const result = await client.execute({
|
|
178
|
+
sql: "SELECT agent_id FROM behaviors WHERE id = ? LIMIT 1",
|
|
179
|
+
args: [behaviorId]
|
|
180
|
+
});
|
|
181
|
+
if (result.rows.length === 0) return false;
|
|
182
|
+
return String(result.rows[0].agent_id) === agent;
|
|
183
|
+
} catch {
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Ensure the steward_audit table exists.
|
|
189
|
+
*/
|
|
190
|
+
async ensureAuditTable() {
|
|
191
|
+
const client = getClient();
|
|
192
|
+
await client.execute({
|
|
193
|
+
sql: `CREATE TABLE IF NOT EXISTS steward_audit (
|
|
194
|
+
id TEXT PRIMARY KEY,
|
|
195
|
+
agent TEXT NOT NULL,
|
|
196
|
+
operation TEXT NOT NULL,
|
|
197
|
+
target TEXT NOT NULL,
|
|
198
|
+
allowed INTEGER NOT NULL,
|
|
199
|
+
reason TEXT NOT NULL,
|
|
200
|
+
confidence REAL NOT NULL,
|
|
201
|
+
requires_override INTEGER NOT NULL DEFAULT 0,
|
|
202
|
+
created_at TEXT NOT NULL
|
|
203
|
+
)`,
|
|
204
|
+
args: []
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Log a gate decision to the audit trail.
|
|
209
|
+
*/
|
|
210
|
+
async logDecision(agent, operation, target, decision) {
|
|
211
|
+
try {
|
|
212
|
+
await this.ensureAuditTable();
|
|
213
|
+
const client = getClient();
|
|
214
|
+
await client.execute({
|
|
215
|
+
sql: `INSERT INTO steward_audit (id, agent, operation, target, allowed, reason, confidence, requires_override, created_at)
|
|
216
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
217
|
+
args: [
|
|
218
|
+
crypto.randomUUID(),
|
|
219
|
+
agent,
|
|
220
|
+
operation,
|
|
221
|
+
target,
|
|
222
|
+
decision.allowed ? 1 : 0,
|
|
223
|
+
decision.reason,
|
|
224
|
+
decision.confidence,
|
|
225
|
+
decision.requires_override ? 1 : 0,
|
|
226
|
+
(/* @__PURE__ */ new Date()).toISOString()
|
|
227
|
+
]
|
|
228
|
+
});
|
|
229
|
+
} catch {
|
|
230
|
+
process.stderr.write(
|
|
231
|
+
`[steward-gate] Audit log write failed for ${agent}:${operation}
|
|
232
|
+
`
|
|
233
|
+
);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
export {
|
|
239
|
+
StewardGate
|
|
240
|
+
};
|