chainlesschain 0.162.148 → 0.162.150
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/README.md +1 -1
- package/package.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-DwpCCp64.js → AIOps-CBLvrjeG.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-C9pBYocA.js → ActionButton-DYv2GtE0.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BWAkeXxK.js → Analytics-CL6PZ-Ww.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-CivFGH6B.js → AppLayout-xuyHt4uA.js} +3 -3
- package/src/assets/web-panel/assets/{Audit-Cm8hRpZm.js → Audit-DOvSVycq.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DXdFMsE8.js → Backup-DMhfTswr.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-uAwSTeql.js → BaseInput-CQxDdm63.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-KU8eeJJE.js → Chat-BEeNhK2a.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-8nul8eTq.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-C6AMDkjd.js → Checkbox-CL04O-ER.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-t2moDxcO.js → Codegen-C50o-n7x.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DCcsRRhN.js → Col-CH-bDkzs.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DtB-8SAC.js → Community-DqAIMvSe.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-CZm8THYA.js → Compact-C43fo_my.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-LiQgC7g1.js → Compliance-BERnMrdP.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-CA8SAxht.js → Cowork-Baw3w1gp.js} +4 -4
- package/src/assets/web-panel/assets/{Cron-CtRaF1wD.js → Cron-BEqAHF1-.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-6-br6Hub.js → Crosschain-CvnmKwK4.js} +1 -1
- package/src/assets/web-panel/assets/{DID-Do2EccrL.js → DID-iMPxgVdt.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-wrXcbzGe.js → Dashboard--4SJX3YR.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-p3FsT245.js → Dropdown-BgLV6xgz.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-D95A2L8q.js → EmailListRenderer-Bvb8oUD8.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-cLuJW2zo.js → FamilyGuardDashboard-DpXPjJB5.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-Brgq_cbN.js → Federation-BbFfJ1Xi.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DWLCkNgh.js → FormItemContext-DeGq1B-q.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-BBqUfQd6.js → GenericCardRenderer-CNW7s9zM.js} +1 -1
- package/src/assets/web-panel/assets/{Git-8F090w4I.js → Git-L1PjW-lT.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CCogEbxb.js → Governance-PK-X58to.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CfLD7v7C.js → Inference-BePWEH-d.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DDuHJewd.js → KnowledgeGraph-LF_sBvdL.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-CE8KSEVC.js → Logs-BKkfk9hy.js} +2 -2
- package/src/assets/web-panel/assets/{Marketplace-DmwpZmhT.js → Marketplace-BNMqUDla.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-Bf7AazU8.js → McpTools-w4WPiyz2.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-D0QU_00S.js → Memory-DUKMVGNi.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-yXS9xdhx.js → MobileBridge-BWhiEyTJ.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-BuDUoGUP.js → MobileProjects-Ocf5JEkX.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BYyHy28p.js → Mtc-D2B6MMhU.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-CK0aqpiZ.js → MtcAudit-DdYjCq1O.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-mNimKYeb.js → Multisig-Cb1hfuUZ.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-AioAJ0YA.js → NLProgramming-CTeImGp7.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CVVNCLHE.js → Notes-BjYNc7eQ.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-C4ABj-TK.js → NotificationSettings-Dn_NtRXQ.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DIp8Xcbd.js → OrderTableRenderer-DVYYIizh.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-uozl_gWK.js → Organization-Be2Kmr5j.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-BCZOM2hK.js → Overflow-Cu_-qRlR.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CArcaiaj.js → P2P-DD2HoGzE.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-Sgq2Srr8.js → PdhVaultBrowser-BRI7DVth.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-BYrQrXnH.js → Permissions-C9Srcs2M.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-BzHStAbz.js → PersonalDataHub-CUqcMgo1.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-k7KqxX1M.js → Pipeline-HBrQGLXt.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-IumTUWqx.js → Privacy-D-B0vjwh.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-BRyImYTf.js → ProjectInit-eTeLIu9e.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-BFIqTBFk.js → ProjectSettings-DrRqCsC6.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-Dpid9CDg.js → Projects-1G9DNOhI.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-CyyFnUPs.js → Providers-RkTZzpxP.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-C82cRx-X.js → QrScannerModal-BSCUgsgC.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DGxDF521.js → QuickAsk-CHgyM3Bz.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Cns-Am1y.js → Recommend-0lry4OZq.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-R7OqAIlg.js → RemoteSession-Cn45UroZ.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-D7mgPIYV.js → Reputation-Q-Zjb707.js} +1 -1
- package/src/assets/web-panel/assets/{Row-B3lEURyd.js → Row-BdM70oda.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-9_UVrpBt.js → RssFeed-DmOAKKap.js} +2 -2
- package/src/assets/web-panel/assets/{Search-ClZeO80q.js → Search-Dwavbm07.js} +1 -1
- package/src/assets/web-panel/assets/{Security-BNNJczEp.js → Security-DukXFCnk.js} +3 -3
- package/src/assets/web-panel/assets/{Services-C5SjrWUj.js → Services-BIlRnITu.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-Ci_obQ-g.js → Skeleton-YYVQdhhQ.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-DdebN15P.js → Skills-B8_iYHz2.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-OinZP2vi.js → Sla-BdVrhT31.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-CxzbNF51.js → SpeechSettings-CD3ggRx7.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-D06N_66b.js → SyncSettings-Bp02VZFH.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-BdEdW0AZ.js → Tasks-DEVmCEsr.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-F1ctKmPa.js → Templates-B6czWc4N.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CVz1Urot.js → Tenant-BCJLv17r.js} +1 -1
- package/src/assets/web-panel/assets/Terminal-CD132d2Y.js +3 -0
- package/src/assets/web-panel/assets/{TimelineRenderer-Doitzjmf.js → TimelineRenderer-ZB-CvkZl.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BpyVRpVA.js → Tokens-BnSY0S-s.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-nWhWYTbU.js → Trigger-VZw9Oy2w.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DK_G-wLx.js → Trust-pZq7Hjd2.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-B5yBUojO.js → UkeySign-DnQaqk4q.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-C5D51qAe.js → VideoEditing-BEUfmvJV.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CLbL9K7v.js → Wallet-CoZKMXJ2.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DZUelI3V.js → WebAuthn-CBOGVx1I.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-8RPxt4KW.js → WorkflowEditor-huSKn7TT.js} +1 -1
- package/src/assets/web-panel/assets/{chat-4N4tOA3d.js → chat-A_3w6FBO.js} +1 -1
- package/src/assets/web-panel/assets/{colors-zbbGVrua.js → colors-D1Bem9Oy.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-D7iMkbnE.js → compact-item-CJYJj0oO.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-CBzPJv-w.js → createContext-BkbFiKT4.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-WDr3_M_N.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-bHdrQSqZ.js → hasIn-CKvUafVY.js} +1 -1
- package/src/assets/web-panel/assets/{index-DbE5D0WL.js → index-AjrSPnvv.js} +1 -1
- package/src/assets/web-panel/assets/{index-BCr0geV9.js → index-B8i0lViZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CiG1IZao.js → index-B9Svn0zc.js} +1 -1
- package/src/assets/web-panel/assets/{index-B1s0Bz9O.js → index-BHdHSX06.js} +1 -1
- package/src/assets/web-panel/assets/{index-QFObYeo1.js → index-BHdailyo.js} +1 -1
- package/src/assets/web-panel/assets/{index-BnBOpqv3.js → index-BJwlEnYo.js} +1 -1
- package/src/assets/web-panel/assets/{index-CdmMoYN1.js → index-BOoAQjJz.js} +1 -1
- package/src/assets/web-panel/assets/{index-DUyjUkY7.js → index-BSgWxAOG.js} +1 -1
- package/src/assets/web-panel/assets/{index-CqdPyWm5.js → index-BdutMsne.js} +1 -1
- package/src/assets/web-panel/assets/{index-DmqlJed-.js → index-BiDWxzbn.js} +1 -1
- package/src/assets/web-panel/assets/{index-S74FpAIn.js → index-By5a0T_W.js} +1 -1
- package/src/assets/web-panel/assets/{index-kmh1TxRa.js → index-C-WIY-FQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BTIjjXry.js → index-C37f6iey.js} +1 -1
- package/src/assets/web-panel/assets/{index-BS4_Mwk6.js → index-C9bWmTcO.js} +1 -1
- package/src/assets/web-panel/assets/{index-BBNr77E1.js → index-CBaosWRO.js} +1 -1
- package/src/assets/web-panel/assets/{index-QNAG4JtR.js → index-CBlBVJ_m.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bqmx24kh.js → index-CD62EEGo.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQfu1U78.js → index-CUj-l7GM.js} +1 -1
- package/src/assets/web-panel/assets/{index-BJ4ZGyW0.js → index-CVS8Ymuq.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ci009ijp.js → index-ChkXUj3f.js} +1 -1
- package/src/assets/web-panel/assets/{index-oDKNgCsP.js → index-Cj0OZ-37.js} +1 -1
- package/src/assets/web-panel/assets/{index-BZb8F8YG.js → index-Co3OFL0t.js} +1 -1
- package/src/assets/web-panel/assets/{index-308gCGh7.js → index-Crp8CbRg.js} +1 -1
- package/src/assets/web-panel/assets/{index-CPxkoKgA.js → index-D22zNXiS.js} +1 -1
- package/src/assets/web-panel/assets/{index-xYCm6W2h.js → index-DTs_D1OL.js} +1 -1
- package/src/assets/web-panel/assets/{index-BtbbdLnf.js → index-DfgCdFrN.js} +3 -3
- package/src/assets/web-panel/assets/{index-BsKehmmS.js → index-DjYrecNb.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkxK86vf.js → index-DpW9cf3e.js} +1 -1
- package/src/assets/web-panel/assets/index-Dwix3p4g.js +1 -0
- package/src/assets/web-panel/assets/{index-CvRMA9uT.js → index-F--HuPG1.js} +1 -1
- package/src/assets/web-panel/assets/{index-DE9j5YgT.js → index-Fuk6t_3K.js} +1 -1
- package/src/assets/web-panel/assets/{index-B7b1hGry.js → index-JEAGMii9.js} +1 -1
- package/src/assets/web-panel/assets/{index-D1YDh7Wr.js → index-PF-mpv8K.js} +1 -1
- package/src/assets/web-panel/assets/index-SHaoZ0CA.js +1 -0
- package/src/assets/web-panel/assets/{index-CQ6NcfWz.js → index-b-sbVdjQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DyoNgbXl.js → index-pyvMVX8r.js} +1 -1
- package/src/assets/web-panel/assets/{index-DISWAYce.js → index-qNTtOVi_.js} +1 -1
- package/src/assets/web-panel/assets/{index-D4XKpj6c.js → index-tgO8iza6.js} +1 -1
- package/src/assets/web-panel/assets/{index-CahryTX0.js → index-ttDQVhZy.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-BD55yNBt.js → initDefaultProps-DtrnfsZH.js} +1 -1
- package/src/assets/web-panel/assets/{motion-B5Bbe77U.js → motion-D4zqSaX3.js} +1 -1
- package/src/assets/web-panel/assets/{move-CTvIqHEH.js → move-CGFGOUQj.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BkNyPQKB.js → mtc-parser-DH2HvkJl.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BaXJXgHA.js → omit-jJ2at5HX.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-Bw6-YTxH.js → pickAttrs-CRyMT1Fv.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BLdbkLqJ.js → placementArrow-DZ_CX0Pt.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-IVYkzntU.js → responsiveObserve-wruHk-h5.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DFMFwwtY.js → slide-BGgx8q67.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-CURYRtZ1.js → statusUtils-Do5M7gKm.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Cfz63s1r.js → styleChecker-CRa-GZpX.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-COJL0KE3.js → useFlexGapSupport-BxPcq6pj.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-YLLojQQf.js → useFs-v5O2ZcJm.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BF_21qUC.js → usePersonalDataHub--z2FU0Px.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-9ZpkA7bb.js → vnode-1emidVKd.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-DhtAfhl8.js → zoom-CcJaRyHs.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/assets/web-panel/remote-session-sw.js +43 -0
- package/src/command-manifest.json +22 -1
- package/src/commands/a2a.js +19 -4
- package/src/commands/activitypub.js +20 -3
- package/src/commands/agent.js +71 -10
- package/src/commands/audit.js +40 -24
- package/src/commands/codeintel.js +320 -0
- package/src/commands/collab.js +15 -2
- package/src/commands/compliance.js +5 -0
- package/src/commands/config.js +4 -1
- package/src/commands/dao.js +86 -14
- package/src/commands/dev.js +2 -0
- package/src/commands/did.js +7 -1
- package/src/commands/dlp.js +23 -1
- package/src/commands/economy.js +29 -3
- package/src/commands/eval.js +255 -0
- package/src/commands/evomap.js +26 -0
- package/src/commands/governance.js +17 -3
- package/src/commands/hardening.js +18 -0
- package/src/commands/incentive.js +5 -0
- package/src/commands/init.js +46 -2
- package/src/commands/kg.js +4 -0
- package/src/commands/loop.js +6 -1
- package/src/commands/lowcode.js +15 -2
- package/src/commands/marketplace.js +40 -6
- package/src/commands/matrix.js +20 -1
- package/src/commands/memory.js +4 -1
- package/src/commands/mtc.js +7 -1
- package/src/commands/nostr.js +31 -4
- package/src/commands/note.js +7 -4
- package/src/commands/plugin.js +474 -0
- package/src/commands/pqc.js +5 -0
- package/src/commands/reputation.js +10 -1
- package/src/commands/scim.js +6 -0
- package/src/commands/session.js +32 -10
- package/src/commands/siem.js +11 -0
- package/src/commands/sla.js +18 -3
- package/src/commands/social.js +38 -5
- package/src/commands/sso.js +10 -2
- package/src/commands/stress.js +23 -4
- package/src/commands/team.js +463 -0
- package/src/commands/tech.js +2 -0
- package/src/commands/tenant.js +10 -1
- package/src/commands/terraform.js +6 -0
- package/src/commands/update.js +1 -1
- package/src/commands/zkp.js +20 -0
- package/src/gateways/ws/message-dispatcher.js +48 -2
- package/src/gateways/ws/remote-session-protocol.js +140 -42
- package/src/gateways/ws/ws-server.js +1 -1
- package/src/harness/jsonl-session-store.js +12 -5
- package/src/harness/plugin-manager.js +16 -4
- package/src/harness/prompt-compressor.js +27 -1
- package/src/harness/remote-command-ledger.js +189 -0
- package/src/harness/remote-session-push-apns.js +246 -0
- package/src/harness/remote-session-push-errors.js +15 -0
- package/src/harness/remote-session-push-fcm.js +9 -25
- package/src/harness/remote-session-push-huawei.js +174 -0
- package/src/harness/remote-session-push-oppo.js +171 -0
- package/src/harness/remote-session-push-senders.js +42 -0
- package/src/harness/remote-session-push-vivo.js +179 -0
- package/src/harness/remote-session-push-web.js +299 -0
- package/src/harness/remote-session-push-xiaomi.js +99 -0
- package/src/harness/worktree-isolator.js +16 -6
- package/src/index.js +6 -0
- package/src/lib/__tests__/logger.test.js +5 -2
- package/src/lib/a2a-protocol.js +25 -1
- package/src/lib/activitypub-bridge.js +61 -0
- package/src/lib/agent-core.js +4 -0
- package/src/lib/agent-economy.js +262 -29
- package/src/lib/agent-network.js +7 -1
- package/src/lib/agent-sandbox.js +161 -5
- package/src/lib/agent-team/task-lease.js +434 -0
- package/src/lib/agent-team/team-budget.js +165 -0
- package/src/lib/agent-team/team-mailbox.js +106 -0
- package/src/lib/agent-team/team-runner.js +282 -0
- package/src/lib/agent-team/team-worktree.js +236 -0
- package/src/lib/agents.js +18 -0
- package/src/lib/async-hook-supervisor.cjs +391 -0
- package/src/lib/audit-logger.js +7 -6
- package/src/lib/autonomous-developer.js +60 -0
- package/src/lib/chat-core.js +17 -4
- package/src/lib/collaboration-governance.js +56 -0
- package/src/lib/community-governance.js +68 -0
- package/src/lib/compliance-manager.js +63 -0
- package/src/lib/cross-chain.js +5 -0
- package/src/lib/dao-governance.js +151 -2
- package/src/lib/did-manager.js +23 -10
- package/src/lib/dlp-engine.js +70 -0
- package/src/lib/eval/runner.js +251 -0
- package/src/lib/eval/tasks.js +626 -0
- package/src/lib/eval/trend.js +200 -0
- package/src/lib/evolution-system.js +92 -0
- package/src/lib/evomap-federation.js +55 -0
- package/src/lib/evomap-governance.js +94 -0
- package/src/lib/fatal-handler.js +17 -1
- package/src/lib/hardening-manager.js +73 -0
- package/src/lib/hierarchical-memory.js +14 -8
- package/src/lib/knowledge-exporter.js +8 -2
- package/src/lib/knowledge-graph.js +79 -0
- package/src/lib/llm-providers.js +23 -14
- package/src/lib/logger.js +4 -1
- package/src/lib/lsp/__tests__/benchmark.test.js +88 -0
- package/src/lib/lsp/__tests__/code-intelligence.integration.test.js +129 -0
- package/src/lib/lsp/__tests__/code-intelligence.test.js +228 -0
- package/src/lib/lsp/__tests__/jsonrpc-stream.test.js +104 -0
- package/src/lib/lsp/__tests__/lsp-client.test.js +269 -0
- package/src/lib/lsp/__tests__/lsp-manager.test.js +333 -0
- package/src/lib/lsp/__tests__/lsp-server-registry.test.js +128 -0
- package/src/lib/lsp/benchmark.js +257 -0
- package/src/lib/lsp/code-intelligence.js +356 -0
- package/src/lib/lsp/jsonrpc-stream.js +139 -0
- package/src/lib/lsp/lsp-client.js +339 -0
- package/src/lib/lsp/lsp-manager.js +375 -0
- package/src/lib/lsp/lsp-server-registry.js +196 -0
- package/src/lib/matrix-bridge.js +84 -0
- package/src/lib/memory-manager.js +5 -3
- package/src/lib/nostr-bridge.js +53 -0
- package/src/lib/permission-engine.js +22 -4
- package/src/lib/plugin-monitor-supervisor.js +238 -0
- package/src/lib/plugin-runtime/__tests__/remote-source.test.js +256 -0
- package/src/lib/plugin-runtime/agents.js +51 -0
- package/src/lib/plugin-runtime/bin.js +100 -0
- package/src/lib/plugin-runtime/hooks.js +100 -0
- package/src/lib/plugin-runtime/install.js +396 -0
- package/src/lib/plugin-runtime/lsp.js +75 -0
- package/src/lib/plugin-runtime/manifest.js +458 -0
- package/src/lib/plugin-runtime/mcp.js +89 -0
- package/src/lib/plugin-runtime/monitors.js +100 -0
- package/src/lib/plugin-runtime/policy.js +152 -0
- package/src/lib/plugin-runtime/reload.js +79 -0
- package/src/lib/plugin-runtime/remote-source.js +240 -0
- package/src/lib/plugin-runtime/scopes.js +197 -0
- package/src/lib/plugin-runtime/settings.js +119 -0
- package/src/lib/plugin-runtime/signature.js +107 -0
- package/src/lib/plugin-runtime/skills.js +43 -0
- package/src/lib/plugin-runtime/trust.js +140 -0
- package/src/lib/pqc-manager.js +64 -0
- package/src/lib/reputation-optimizer.js +101 -0
- package/src/lib/sandbox-egress-proxy.js +262 -0
- package/src/lib/sandbox-fs-policy.js +112 -0
- package/src/lib/sandbox-network-policy.js +151 -0
- package/src/lib/sandbox-v2.js +24 -18
- package/src/lib/scim-manager.js +36 -0
- package/src/lib/session-manager.js +5 -2
- package/src/lib/settings-hook-events.cjs +78 -6
- package/src/lib/settings-hooks.cjs +30 -3
- package/src/lib/settings-loader.cjs +35 -1
- package/src/lib/siem-exporter.js +45 -0
- package/src/lib/skill-loader.js +38 -2
- package/src/lib/skill-marketplace.js +83 -0
- package/src/lib/sla-manager.js +88 -0
- package/src/lib/social-manager.js +74 -0
- package/src/lib/stress-tester.js +65 -0
- package/src/lib/tech-learning-engine.js +75 -0
- package/src/lib/telemetry/span-recorder.js +237 -0
- package/src/lib/tenant-saas.js +107 -0
- package/src/lib/terraform-manager.js +67 -0
- package/src/lib/token-incentive.js +180 -29
- package/src/lib/wallet-manager.js +81 -35
- package/src/lib/zkp-engine.js +87 -0
- package/src/repl/agent-repl.js +417 -6
- package/src/runtime/__tests__/auto-pin.test.js +104 -0
- package/src/runtime/agent-core.js +771 -104
- package/src/runtime/auto-pin.js +117 -0
- package/src/runtime/coding-agent-contract-shared.cjs +82 -8
- package/src/runtime/coding-agent-policy.cjs +32 -7
- package/src/runtime/fallback-model.js +134 -7
- package/src/runtime/headless-runner.js +388 -108
- package/src/runtime/mcp-config.js +46 -0
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DCNfbdlx.js +0 -1
- package/src/assets/web-panel/assets/Terminal-BvAK_Zel.js +0 -3
- package/src/assets/web-panel/assets/devWarning-C2Z5LRgq.js +0 -1
- package/src/assets/web-panel/assets/index-BGp6Yr-Y.js +0 -1
- package/src/assets/web-panel/assets/index-BXiw9dQf.js +0 -1
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cc team` — run a declared task graph across N cooperating teammates with
|
|
3
|
+
* exclusive leases + dependency ordering (Phase 4, Agent Team).
|
|
4
|
+
*
|
|
5
|
+
* A task file is JSON:
|
|
6
|
+
* { "tasks": [ { "key": "build", "title": "...", "dependsOn": [],
|
|
7
|
+
* "command": "npm run build" | "prompt": "fix the bug in x" } ] }
|
|
8
|
+
*
|
|
9
|
+
* cc team plan --tasks graph.json # topological wave preview (no run)
|
|
10
|
+
* cc team run --tasks graph.json # dry-run: validate + schedule, no exec
|
|
11
|
+
* cc team run --tasks graph.json --exec # run each task's shell `command`
|
|
12
|
+
* cc team run --tasks graph.json --agent# hand each task's `prompt` to cc agent
|
|
13
|
+
*
|
|
14
|
+
* The lease/DAG guarantees (no double-processing, deps-before-dependents, crash
|
|
15
|
+
* reclaim) come from TaskLeaseRegistry; TeamRunner drives the N teammates.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import fs from "fs";
|
|
19
|
+
import path from "path";
|
|
20
|
+
import { fileURLToPath } from "url";
|
|
21
|
+
import { spawn } from "child_process";
|
|
22
|
+
import { TaskLeaseRegistry } from "../lib/agent-team/task-lease.js";
|
|
23
|
+
import { TeamRunner } from "../lib/agent-team/team-runner.js";
|
|
24
|
+
import { TeamWorktreeCoordinator } from "../lib/agent-team/team-worktree.js";
|
|
25
|
+
import { TeamBudget } from "../lib/agent-team/team-budget.js";
|
|
26
|
+
import { TeamMailbox } from "../lib/agent-team/team-mailbox.js";
|
|
27
|
+
|
|
28
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
29
|
+
const BIN = path.resolve(__dirname, "..", "..", "bin", "chainlesschain.js");
|
|
30
|
+
|
|
31
|
+
/** Load + validate a task-graph file into a registry (throws on bad input). */
|
|
32
|
+
function loadRegistry(file, { ttlMs } = {}) {
|
|
33
|
+
const abs = path.resolve(process.cwd(), file);
|
|
34
|
+
let doc;
|
|
35
|
+
try {
|
|
36
|
+
doc = JSON.parse(fs.readFileSync(abs, "utf8"));
|
|
37
|
+
} catch (err) {
|
|
38
|
+
throw new Error(`cannot read task file ${abs}: ${err.message}`);
|
|
39
|
+
}
|
|
40
|
+
const tasks = Array.isArray(doc) ? doc : doc.tasks;
|
|
41
|
+
if (!Array.isArray(tasks) || tasks.length === 0) {
|
|
42
|
+
throw new Error("task file must have a non-empty `tasks` array");
|
|
43
|
+
}
|
|
44
|
+
const reg = new TaskLeaseRegistry({ defaultTtlMs: ttlMs });
|
|
45
|
+
for (const t of tasks) {
|
|
46
|
+
const r = reg.addTask({
|
|
47
|
+
key: t.key,
|
|
48
|
+
title: t.title || t.key,
|
|
49
|
+
dependsOn: t.dependsOn || t.deps || [],
|
|
50
|
+
priority: t.priority,
|
|
51
|
+
metadata: { command: t.command || null, prompt: t.prompt || null },
|
|
52
|
+
});
|
|
53
|
+
if (!r.ok) {
|
|
54
|
+
throw new Error(
|
|
55
|
+
`task "${t.key || "(unnamed)"}" rejected: ${r.reason}` +
|
|
56
|
+
(r.cycle ? ` [${r.cycle.join(" → ")}]` : ""),
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return reg;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Topological wave schedule (each wave = tasks whose deps are all in prior waves). */
|
|
64
|
+
function planWaves(reg) {
|
|
65
|
+
const done = new Set();
|
|
66
|
+
const waves = [];
|
|
67
|
+
const all = reg.list();
|
|
68
|
+
let remaining = all.map((t) => t.key);
|
|
69
|
+
let guard = all.length + 1;
|
|
70
|
+
while (remaining.length > 0 && guard-- > 0) {
|
|
71
|
+
const wave = remaining.filter((k) => {
|
|
72
|
+
const t = reg.getTask(k);
|
|
73
|
+
return t.dependsOn.every((d) => done.has(d));
|
|
74
|
+
});
|
|
75
|
+
if (wave.length === 0) break; // unreachable if the graph is a DAG
|
|
76
|
+
waves.push(wave);
|
|
77
|
+
wave.forEach((k) => done.add(k));
|
|
78
|
+
remaining = remaining.filter((k) => !wave.includes(k));
|
|
79
|
+
}
|
|
80
|
+
return waves;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** Real executor: run a task's shell `command`, success = exit 0. */
|
|
84
|
+
function makeShellRunTask(logger) {
|
|
85
|
+
return function runTask({ task }) {
|
|
86
|
+
const command = task.metadata?.command || task?.command;
|
|
87
|
+
if (!command) {
|
|
88
|
+
throw new Error(`task "${task.key}" has no \`command\` to --exec`);
|
|
89
|
+
}
|
|
90
|
+
return new Promise((resolve, reject) => {
|
|
91
|
+
const child = spawn(command, {
|
|
92
|
+
cwd: process.cwd(),
|
|
93
|
+
shell: true,
|
|
94
|
+
env: process.env,
|
|
95
|
+
});
|
|
96
|
+
let err = "";
|
|
97
|
+
child.stderr?.on("data", (d) => (err += d.toString("utf8")));
|
|
98
|
+
child.on("error", (e) => reject(new Error(e.message)));
|
|
99
|
+
child.on("close", (code) => {
|
|
100
|
+
if (code === 0) resolve({ code });
|
|
101
|
+
else reject(new Error(err.trim() || `command exited ${code}`));
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/** Spawn a headless `cc agent -p` for one prompt in `cwd`; resolve on exit 0. */
|
|
108
|
+
function spawnAgent(prompt, cwd, opts = {}) {
|
|
109
|
+
return new Promise((resolve, reject) => {
|
|
110
|
+
const args = [
|
|
111
|
+
BIN,
|
|
112
|
+
"agent",
|
|
113
|
+
"-p",
|
|
114
|
+
prompt,
|
|
115
|
+
"--permission-mode",
|
|
116
|
+
opts.permissionMode || "acceptEdits",
|
|
117
|
+
"--output-format",
|
|
118
|
+
"text",
|
|
119
|
+
];
|
|
120
|
+
if (opts.model) args.push("--model", opts.model);
|
|
121
|
+
const child = spawn(process.execPath, args, {
|
|
122
|
+
cwd,
|
|
123
|
+
env: { ...process.env, CLAUDECODE: "1" },
|
|
124
|
+
windowsHide: true,
|
|
125
|
+
});
|
|
126
|
+
let err = "";
|
|
127
|
+
child.stderr?.on("data", (d) => (err += d.toString("utf8")));
|
|
128
|
+
child.on("error", (e) => reject(new Error(e.message)));
|
|
129
|
+
child.on("close", (code) =>
|
|
130
|
+
code === 0
|
|
131
|
+
? resolve({ code })
|
|
132
|
+
: reject(new Error(err.trim() || `agent exited ${code}`)),
|
|
133
|
+
);
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/** Real executor: hand a task's `prompt` to a headless `cc agent -p` in cwd. */
|
|
138
|
+
function makeAgentRunTask(opts = {}) {
|
|
139
|
+
return function runTask({ task }) {
|
|
140
|
+
const prompt = task.metadata?.prompt || task?.prompt;
|
|
141
|
+
if (!prompt) {
|
|
142
|
+
throw new Error(`task "${task.key}" has no \`prompt\` to --agent`);
|
|
143
|
+
}
|
|
144
|
+
return spawnAgent(prompt, process.cwd(), opts);
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export function registerTeamCommand(program, { logger } = {}) {
|
|
149
|
+
const log = logger || console;
|
|
150
|
+
const team = program
|
|
151
|
+
.command("team")
|
|
152
|
+
.description(
|
|
153
|
+
"Run a declared task graph across N teammates (exclusive leases + dependency DAG)",
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
team
|
|
157
|
+
.command("plan")
|
|
158
|
+
.description("Show the topological wave schedule for a task graph (no run)")
|
|
159
|
+
.requiredOption("--tasks <file>", "Task-graph JSON file")
|
|
160
|
+
.option("--json", "Output the plan as JSON")
|
|
161
|
+
.action((options) => {
|
|
162
|
+
let reg;
|
|
163
|
+
try {
|
|
164
|
+
reg = loadRegistry(options.tasks);
|
|
165
|
+
} catch (err) {
|
|
166
|
+
(log.error || console.error)(err.message);
|
|
167
|
+
process.exitCode = 1;
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
const waves = planWaves(reg);
|
|
171
|
+
if (options.json) {
|
|
172
|
+
console.log(
|
|
173
|
+
JSON.stringify({ waves, total: reg.list().length }, null, 2),
|
|
174
|
+
);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
(log.log || console.log)(
|
|
178
|
+
`Task graph: ${reg.list().length} task(s), ${waves.length} wave(s)`,
|
|
179
|
+
);
|
|
180
|
+
waves.forEach((w, i) => {
|
|
181
|
+
(log.log || console.log)(` wave ${i + 1}: ${w.join(", ")}`);
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
team
|
|
186
|
+
.command("run")
|
|
187
|
+
.description("Run a task graph with N cooperating teammates")
|
|
188
|
+
.requiredOption("--tasks <file>", "Task-graph JSON file")
|
|
189
|
+
.option("--teammates <n>", "Number of concurrent teammates", "2")
|
|
190
|
+
.option("--ttl <seconds>", "Lease TTL per task", "60")
|
|
191
|
+
.option("--exec", "Execute each task's shell `command` (real)")
|
|
192
|
+
.option(
|
|
193
|
+
"--agent",
|
|
194
|
+
"Hand each task's `prompt` to a headless cc agent (real)",
|
|
195
|
+
)
|
|
196
|
+
.option("--model <model>", "Model for --agent runs")
|
|
197
|
+
.option(
|
|
198
|
+
"--worktree",
|
|
199
|
+
"Run each task's `command` in its own git worktree (parallel isolation)",
|
|
200
|
+
)
|
|
201
|
+
.option(
|
|
202
|
+
"--merge",
|
|
203
|
+
"With --worktree: merge each clean branch back to base (conflicts reported, not forced)",
|
|
204
|
+
)
|
|
205
|
+
.option("--max-tasks <n>", "Budget: total task executions across the team")
|
|
206
|
+
.option("--max-tokens <n>", "Budget: total LLM tokens across the team")
|
|
207
|
+
.option(
|
|
208
|
+
"--max-usd <n>",
|
|
209
|
+
"Budget: total estimated USD spend across the team",
|
|
210
|
+
)
|
|
211
|
+
.option(
|
|
212
|
+
"--max-wall <seconds>",
|
|
213
|
+
"Budget: wall-clock seconds for the whole run",
|
|
214
|
+
)
|
|
215
|
+
.option(
|
|
216
|
+
"--state <file>",
|
|
217
|
+
"Persist team progress to a file (for --resume after a crash)",
|
|
218
|
+
)
|
|
219
|
+
.option(
|
|
220
|
+
"--resume",
|
|
221
|
+
"Restore progress from --state (completed tasks stay done; stale leases freed)",
|
|
222
|
+
)
|
|
223
|
+
.option("--json", "Emit the event stream as JSON lines")
|
|
224
|
+
.action(async (options) => {
|
|
225
|
+
const ttlMs = Math.max(1, Number(options.ttl) || 60) * 1000;
|
|
226
|
+
let reg;
|
|
227
|
+
let mailbox = new TeamMailbox();
|
|
228
|
+
let budget = new TeamBudget({
|
|
229
|
+
maxTasks: options.maxTasks,
|
|
230
|
+
maxTokens: options.maxTokens,
|
|
231
|
+
maxUsd: options.maxUsd,
|
|
232
|
+
maxWallMs: options.maxWall
|
|
233
|
+
? Math.max(1, Number(options.maxWall)) * 1000
|
|
234
|
+
: null,
|
|
235
|
+
});
|
|
236
|
+
let priorMembers = [];
|
|
237
|
+
try {
|
|
238
|
+
// Resume from a prior (possibly crashed) run's state: completed tasks
|
|
239
|
+
// stay COMPLETED, and any lease left dangling by a crash is reclaimed so
|
|
240
|
+
// its task is re-run — the team-session-recovery acceptance path. The
|
|
241
|
+
// mailbox + budget are restored too so messages/spend stay consistent.
|
|
242
|
+
if (options.resume && options.state && fs.existsSync(options.state)) {
|
|
243
|
+
const snap = JSON.parse(fs.readFileSync(options.state, "utf8"));
|
|
244
|
+
const isV2 = snap && snap.version >= 2 && snap.registry;
|
|
245
|
+
reg = TaskLeaseRegistry.restore(isV2 ? snap.registry : snap);
|
|
246
|
+
if (isV2) {
|
|
247
|
+
if (snap.mailbox) mailbox = TeamMailbox.restore(snap.mailbox);
|
|
248
|
+
if (snap.budget)
|
|
249
|
+
budget = TeamBudget.restore(snap.budget, {
|
|
250
|
+
// CLI flags on the resume invocation override the prior caps;
|
|
251
|
+
// omitted flags keep them (never silently drop a safety cap).
|
|
252
|
+
overrides: {
|
|
253
|
+
maxTasks: options.maxTasks,
|
|
254
|
+
maxTokens: options.maxTokens,
|
|
255
|
+
maxUsd: options.maxUsd,
|
|
256
|
+
maxWallMs: options.maxWall
|
|
257
|
+
? Math.max(1, Number(options.maxWall)) * 1000
|
|
258
|
+
: undefined,
|
|
259
|
+
},
|
|
260
|
+
});
|
|
261
|
+
priorMembers = Array.isArray(snap.members) ? snap.members : [];
|
|
262
|
+
}
|
|
263
|
+
// A teammate whose lease is still dangling here crashed last run — its
|
|
264
|
+
// task is about to be reclaimed, so report it LOST before the sweep.
|
|
265
|
+
const lostHolders = new Set();
|
|
266
|
+
for (const t of reg.list()) {
|
|
267
|
+
if (t.lease && t.lease.holder) lostHolders.add(t.lease.holder);
|
|
268
|
+
}
|
|
269
|
+
const freed = reg.reclaimExpired();
|
|
270
|
+
for (const h of lostHolders) {
|
|
271
|
+
if (options.json)
|
|
272
|
+
console.log(JSON.stringify({ type: "teammate:lost", holder: h }));
|
|
273
|
+
else (log.info || console.log)(` ⚠ teammate ${h} lost (crashed)`);
|
|
274
|
+
}
|
|
275
|
+
const s = reg.stats();
|
|
276
|
+
(log.info || console.log)(
|
|
277
|
+
`Resumed: ${s.completed}/${s.total} already done` +
|
|
278
|
+
(freed.length
|
|
279
|
+
? `, ${freed.length} stale lease(s) reclaimed`
|
|
280
|
+
: ""),
|
|
281
|
+
);
|
|
282
|
+
} else {
|
|
283
|
+
reg = loadRegistry(options.tasks, { ttlMs });
|
|
284
|
+
}
|
|
285
|
+
} catch (err) {
|
|
286
|
+
(log.error || console.error)(err.message);
|
|
287
|
+
process.exitCode = 1;
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// Persist a snapshot after each task settles so a crash mid-run is
|
|
292
|
+
// resumable (persist-after-run alone would lose everything on a crash).
|
|
293
|
+
// v2 bundles registry + mailbox + budget + member lifecycle so a resume
|
|
294
|
+
// keeps the whole team state consistent, not just the task graph.
|
|
295
|
+
let runnerRef = null;
|
|
296
|
+
const persist = () => {
|
|
297
|
+
if (!options.state) return;
|
|
298
|
+
try {
|
|
299
|
+
fs.writeFileSync(
|
|
300
|
+
options.state,
|
|
301
|
+
JSON.stringify(
|
|
302
|
+
{
|
|
303
|
+
version: 2,
|
|
304
|
+
registry: reg.snapshot(),
|
|
305
|
+
mailbox: mailbox.snapshot(),
|
|
306
|
+
budget: budget.snapshot(),
|
|
307
|
+
members: runnerRef ? runnerRef.members() : priorMembers,
|
|
308
|
+
},
|
|
309
|
+
null,
|
|
310
|
+
2,
|
|
311
|
+
),
|
|
312
|
+
"utf8",
|
|
313
|
+
);
|
|
314
|
+
} catch (e) {
|
|
315
|
+
(log.error || console.error)(` state write failed: ${e.message}`);
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
|
|
319
|
+
// Pick the executor. Default is a dry-run (validate + schedule, no side
|
|
320
|
+
// effects) so `cc team run` is safe to explore, mirroring `cc eval --dry-run`.
|
|
321
|
+
let runTask;
|
|
322
|
+
let coord = null;
|
|
323
|
+
if (options.worktree) {
|
|
324
|
+
coord = new TeamWorktreeCoordinator(process.cwd());
|
|
325
|
+
if (!coord.isGitRepo()) {
|
|
326
|
+
(log.error || console.error)(
|
|
327
|
+
"--worktree requires a git repository (run inside one)",
|
|
328
|
+
);
|
|
329
|
+
process.exitCode = 1;
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
if (options.agent) {
|
|
333
|
+
// --agent --worktree: each teammate drives an agent turn (its `prompt`)
|
|
334
|
+
// inside its OWN git worktree, so parallel edits never fight over the
|
|
335
|
+
// working tree, then integrate/merge the branches like --exec --worktree.
|
|
336
|
+
runTask = coord.makeRunTask({
|
|
337
|
+
runInWorktree: async ({ key, task, cwd }) => {
|
|
338
|
+
const prompt = task.metadata?.prompt || task?.prompt;
|
|
339
|
+
if (!prompt) {
|
|
340
|
+
throw new Error(`task "${key}" has no \`prompt\` to --agent`);
|
|
341
|
+
}
|
|
342
|
+
await spawnAgent(prompt, cwd, { model: options.model });
|
|
343
|
+
},
|
|
344
|
+
});
|
|
345
|
+
} else {
|
|
346
|
+
runTask = coord.makeRunTask();
|
|
347
|
+
}
|
|
348
|
+
} else if (options.exec) {
|
|
349
|
+
// --exec runs each task's `command` verbatim through a shell. A shared
|
|
350
|
+
// or downloaded plan file is untrusted input — surface that before we
|
|
351
|
+
// start executing it, so it's not silently treated as safe.
|
|
352
|
+
log.warn(
|
|
353
|
+
"⚠ --exec executes each task's shell `command` from the plan file. Only run plans you trust.",
|
|
354
|
+
);
|
|
355
|
+
runTask = makeShellRunTask(log);
|
|
356
|
+
} else if (options.agent)
|
|
357
|
+
runTask = makeAgentRunTask({ model: options.model });
|
|
358
|
+
else runTask = async () => ({ dryRun: true });
|
|
359
|
+
|
|
360
|
+
const teammates = Math.max(1, Number(options.teammates) || 2);
|
|
361
|
+
const runner = new TeamRunner(reg, {
|
|
362
|
+
teammates,
|
|
363
|
+
ttlMs,
|
|
364
|
+
runTask,
|
|
365
|
+
budget,
|
|
366
|
+
mailbox,
|
|
367
|
+
onEvent: (e) => {
|
|
368
|
+
if (options.json) console.log(JSON.stringify(e));
|
|
369
|
+
else if (e.type === "task:claimed")
|
|
370
|
+
(log.info || console.log)(` → ${e.key} [${e.holder}]`);
|
|
371
|
+
else if (e.type === "task:completed")
|
|
372
|
+
(log.info || console.log)(` ✔ ${e.key}`);
|
|
373
|
+
else if (e.type === "task:failed")
|
|
374
|
+
(log.info || console.log)(
|
|
375
|
+
` ✗ ${e.key}${e.retry ? " (will retry)" : " (gave up)"}: ${e.error}`,
|
|
376
|
+
);
|
|
377
|
+
else if (e.type === "run:budget-exhausted")
|
|
378
|
+
(log.info || console.log)(
|
|
379
|
+
` ⛔ budget reached (${e.reason || `max-tasks ${e.maxTasks}`}) — no new tasks claimed`,
|
|
380
|
+
);
|
|
381
|
+
if (e.type === "task:completed" || e.type === "task:failed")
|
|
382
|
+
persist();
|
|
383
|
+
},
|
|
384
|
+
});
|
|
385
|
+
runner.seedMembers(priorMembers);
|
|
386
|
+
runnerRef = runner;
|
|
387
|
+
|
|
388
|
+
const summary = await runner.run();
|
|
389
|
+
persist();
|
|
390
|
+
|
|
391
|
+
// Worktree integration: sequentially preview (and optionally merge) each
|
|
392
|
+
// committed branch back to base, then remove the worktrees. Conflicts are
|
|
393
|
+
// reported, never force-merged.
|
|
394
|
+
let integration = null;
|
|
395
|
+
if (coord) {
|
|
396
|
+
integration = coord.integrate({ merge: options.merge === true });
|
|
397
|
+
coord.cleanupAll();
|
|
398
|
+
if (!options.json) {
|
|
399
|
+
(log.log || console.log)("\nWorktree integration:");
|
|
400
|
+
for (const r of integration) {
|
|
401
|
+
if (!r.committed)
|
|
402
|
+
(log.info || console.log)(` · ${r.key}: no changes`);
|
|
403
|
+
else if (r.error)
|
|
404
|
+
(log.info || console.log)(
|
|
405
|
+
` ✗ ${r.key} [${r.branch}]: ${r.error}`,
|
|
406
|
+
);
|
|
407
|
+
else if (!r.clean)
|
|
408
|
+
(log.info || console.log)(
|
|
409
|
+
` ⚠ ${r.key} [${r.branch}]: conflicts in ${r.conflicts.length} file(s) — not merged`,
|
|
410
|
+
);
|
|
411
|
+
else
|
|
412
|
+
(log.info || console.log)(
|
|
413
|
+
` ${r.merged ? "✔ merged" : "✔ clean"} ${r.key} [${r.branch}]`,
|
|
414
|
+
);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
if (options.json && integration)
|
|
420
|
+
console.log(JSON.stringify({ integration }));
|
|
421
|
+
if (!options.json) {
|
|
422
|
+
const s = summary.stats;
|
|
423
|
+
(log.log || console.log)(
|
|
424
|
+
`\nTeam run: ${s.completed}/${s.total} completed` +
|
|
425
|
+
(s.cancelled ? `, ${s.cancelled} cancelled` : "") +
|
|
426
|
+
` (${teammates} teammates, ${summary.executions} executions, peak ${summary.maxConcurrent} concurrent)`,
|
|
427
|
+
);
|
|
428
|
+
if (budget.enabled()) {
|
|
429
|
+
const b = budget.status();
|
|
430
|
+
const parts = [`${b.tasks} task(s)`, `${b.tokens} token(s)`];
|
|
431
|
+
if (b.maxUsd != null) parts.push(`$${b.spentUsd.toFixed(4)}`);
|
|
432
|
+
(log.log || console.log)(
|
|
433
|
+
`Budget: ${parts.join(", ")}` +
|
|
434
|
+
(summary.budgetStopped
|
|
435
|
+
? ` — stopped early (${summary.budgetReason})`
|
|
436
|
+
: ""),
|
|
437
|
+
);
|
|
438
|
+
}
|
|
439
|
+
if (mailbox.size() > 0)
|
|
440
|
+
(log.log || console.log)(
|
|
441
|
+
`Messages: ${mailbox.size()} exchanged between teammates`,
|
|
442
|
+
);
|
|
443
|
+
} else {
|
|
444
|
+
console.log(
|
|
445
|
+
JSON.stringify({
|
|
446
|
+
summary: {
|
|
447
|
+
done: summary.done,
|
|
448
|
+
executions: summary.executions,
|
|
449
|
+
budgetStopped: summary.budgetStopped,
|
|
450
|
+
budgetReason: summary.budgetReason,
|
|
451
|
+
budget: budget.status(),
|
|
452
|
+
members: summary.members,
|
|
453
|
+
messages: mailbox.size(),
|
|
454
|
+
},
|
|
455
|
+
}),
|
|
456
|
+
);
|
|
457
|
+
}
|
|
458
|
+
// Non-zero exit when the graph didn't fully complete — usable as a gate.
|
|
459
|
+
if (!summary.done) process.exitCode = 1;
|
|
460
|
+
});
|
|
461
|
+
|
|
462
|
+
return program;
|
|
463
|
+
}
|
package/src/commands/tech.js
CHANGED
|
@@ -8,6 +8,7 @@ import { logger } from "../lib/logger.js";
|
|
|
8
8
|
import { bootstrap, shutdown } from "../runtime/bootstrap.js";
|
|
9
9
|
import {
|
|
10
10
|
ensureTechLearningTables,
|
|
11
|
+
loadFromDb,
|
|
11
12
|
analyzeTechStack,
|
|
12
13
|
getProfile,
|
|
13
14
|
detectAntiPatterns,
|
|
@@ -57,6 +58,7 @@ function _dbFromCtx(ctx) {
|
|
|
57
58
|
}
|
|
58
59
|
const db = ctx.db.getDatabase();
|
|
59
60
|
ensureTechLearningTables(db);
|
|
61
|
+
loadFromDb(db);
|
|
60
62
|
return db;
|
|
61
63
|
}
|
|
62
64
|
|
package/src/commands/tenant.js
CHANGED
|
@@ -13,6 +13,7 @@ import { parseJsonOption } from "../lib/parse-json-option.js";
|
|
|
13
13
|
import { bootstrap, shutdown } from "../runtime/bootstrap.js";
|
|
14
14
|
import {
|
|
15
15
|
ensureTenantTables,
|
|
16
|
+
loadFromDb as loadTenantsFromDb,
|
|
16
17
|
listPlans,
|
|
17
18
|
listMetrics,
|
|
18
19
|
createTenant,
|
|
@@ -73,6 +74,10 @@ function _dbFromCtx(ctx) {
|
|
|
73
74
|
}
|
|
74
75
|
const db = ctx.db.getDatabase();
|
|
75
76
|
ensureTenantTables(db);
|
|
77
|
+
// Rehydrate the in-memory Maps from the persisted saas_* tables — without this
|
|
78
|
+
// every read is Map-only-empty in the fresh CLI process and a tenant created
|
|
79
|
+
// in a prior invocation is invisible (No tenants. / Tenant not found).
|
|
80
|
+
loadTenantsFromDb(db);
|
|
76
81
|
return db;
|
|
77
82
|
}
|
|
78
83
|
|
|
@@ -382,7 +387,11 @@ export function registerTenantCommand(program) {
|
|
|
382
387
|
.description("Start a new subscription (cancels any prior active one)")
|
|
383
388
|
.requiredOption("-p, --plan <plan>", "Plan id")
|
|
384
389
|
.option("-a, --amount <n>", "Override amount", floatArg("--amount"))
|
|
385
|
-
.option(
|
|
390
|
+
.option(
|
|
391
|
+
"-d, --duration-ms <ms>",
|
|
392
|
+
"Duration in ms (default 30d)",
|
|
393
|
+
intArg("--duration-ms"),
|
|
394
|
+
)
|
|
386
395
|
.option("--json", "Output as JSON")
|
|
387
396
|
.action(async (tenantId, options) => {
|
|
388
397
|
try {
|
|
@@ -8,6 +8,7 @@ import { logger } from "../lib/logger.js";
|
|
|
8
8
|
import { bootstrap, shutdown } from "../runtime/bootstrap.js";
|
|
9
9
|
import {
|
|
10
10
|
ensureTerraformTables,
|
|
11
|
+
loadFromDb,
|
|
11
12
|
listWorkspaces,
|
|
12
13
|
createWorkspace,
|
|
13
14
|
planRun,
|
|
@@ -49,6 +50,7 @@ export function registerTerraformCommand(program) {
|
|
|
49
50
|
}
|
|
50
51
|
const db = ctx.db.getDatabase();
|
|
51
52
|
ensureTerraformTables(db);
|
|
53
|
+
loadFromDb(db);
|
|
52
54
|
|
|
53
55
|
const workspaces = listWorkspaces({ status: options.status });
|
|
54
56
|
if (options.json) {
|
|
@@ -84,6 +86,7 @@ export function registerTerraformCommand(program) {
|
|
|
84
86
|
}
|
|
85
87
|
const db = ctx.db.getDatabase();
|
|
86
88
|
ensureTerraformTables(db);
|
|
89
|
+
loadFromDb(db);
|
|
87
90
|
|
|
88
91
|
const ws = createWorkspace(db, name, {
|
|
89
92
|
description: options.description,
|
|
@@ -114,6 +117,7 @@ export function registerTerraformCommand(program) {
|
|
|
114
117
|
}
|
|
115
118
|
const db = ctx.db.getDatabase();
|
|
116
119
|
ensureTerraformTables(db);
|
|
120
|
+
loadFromDb(db);
|
|
117
121
|
|
|
118
122
|
const run = planRun(db, workspaceId, { runType: options.type });
|
|
119
123
|
logger.success(`Run completed: ${run.planOutput}`);
|
|
@@ -142,6 +146,7 @@ export function registerTerraformCommand(program) {
|
|
|
142
146
|
}
|
|
143
147
|
const db = ctx.db.getDatabase();
|
|
144
148
|
ensureTerraformTables(db);
|
|
149
|
+
loadFromDb(db);
|
|
145
150
|
|
|
146
151
|
const runs = listRuns({ workspaceId: options.workspace });
|
|
147
152
|
if (options.json) {
|
|
@@ -173,6 +178,7 @@ export function registerTerraformCommand(program) {
|
|
|
173
178
|
try {
|
|
174
179
|
const db = ctx.db.getDatabase();
|
|
175
180
|
ensureTerraformTables(db);
|
|
181
|
+
loadFromDb(db);
|
|
176
182
|
return await fn(db);
|
|
177
183
|
} finally {
|
|
178
184
|
await shutdown();
|
package/src/commands/update.js
CHANGED
|
@@ -155,7 +155,7 @@ export function registerUpdateCommand(program) {
|
|
|
155
155
|
}
|
|
156
156
|
|
|
157
157
|
await downloadRelease(result.latestVersion, { force: options.force });
|
|
158
|
-
logger.success(
|
|
158
|
+
logger.success(`Downloaded v${result.latestVersion}`);
|
|
159
159
|
|
|
160
160
|
// Self-update the CLI npm package
|
|
161
161
|
const cliUpdated = await selfUpdateCli(result.latestVersion);
|