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,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* lsp-server-registry tests — language mapping, bin resolution (project-local
|
|
3
|
+
* wins over PATH), plugin server registration, and availability probing. FS
|
|
4
|
+
* existence is faked via `_deps.existsSync`; no real toolchain needed.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
8
|
+
import path from "path";
|
|
9
|
+
import {
|
|
10
|
+
languageIdForFile,
|
|
11
|
+
resolveServer,
|
|
12
|
+
resolveBin,
|
|
13
|
+
probeServers,
|
|
14
|
+
registerLanguageServer,
|
|
15
|
+
_resetPluginServers,
|
|
16
|
+
_deps,
|
|
17
|
+
} from "../lsp-server-registry.js";
|
|
18
|
+
|
|
19
|
+
let origExists;
|
|
20
|
+
beforeEach(() => {
|
|
21
|
+
origExists = _deps.existsSync;
|
|
22
|
+
_resetPluginServers();
|
|
23
|
+
});
|
|
24
|
+
afterEach(() => {
|
|
25
|
+
_deps.existsSync = origExists;
|
|
26
|
+
_resetPluginServers();
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
/** existsSync true only for the given absolute paths (normalized separators). */
|
|
30
|
+
function existsFor(paths) {
|
|
31
|
+
const set = new Set(paths.map((p) => p.replace(/\\/g, "/")));
|
|
32
|
+
_deps.existsSync = (p) => set.has(String(p).replace(/\\/g, "/"));
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
describe("languageIdForFile", () => {
|
|
36
|
+
it("maps common extensions", () => {
|
|
37
|
+
expect(languageIdForFile("a.ts")).toBe("typescript");
|
|
38
|
+
expect(languageIdForFile("a.TSX")).toBe("typescriptreact");
|
|
39
|
+
expect(languageIdForFile("a.py")).toBe("python");
|
|
40
|
+
expect(languageIdForFile("a.go")).toBe("go");
|
|
41
|
+
expect(languageIdForFile("a.rs")).toBe("rust");
|
|
42
|
+
});
|
|
43
|
+
it("returns null for unsupported extensions", () => {
|
|
44
|
+
expect(languageIdForFile("a.txt")).toBeNull();
|
|
45
|
+
expect(languageIdForFile("noext")).toBeNull();
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
describe("resolveBin", () => {
|
|
50
|
+
it("prefers project node_modules/.bin over PATH", () => {
|
|
51
|
+
const isWin = process.platform === "win32";
|
|
52
|
+
const binName = isWin
|
|
53
|
+
? "typescript-language-server.cmd"
|
|
54
|
+
: "typescript-language-server";
|
|
55
|
+
const localBin = path.join("/proj", "node_modules", ".bin", binName);
|
|
56
|
+
existsFor([localBin]);
|
|
57
|
+
const resolved = resolveBin("typescript-language-server", "/proj");
|
|
58
|
+
expect(resolved.replace(/\\/g, "/")).toBe(localBin.replace(/\\/g, "/"));
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it("returns null when nothing resolves", () => {
|
|
62
|
+
existsFor([]);
|
|
63
|
+
expect(resolveBin("nonexistent-server", "/proj")).toBeNull();
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
describe("resolveServer", () => {
|
|
68
|
+
it("resolves a TS server command with --stdio args", () => {
|
|
69
|
+
const isWin = process.platform === "win32";
|
|
70
|
+
const binName = isWin
|
|
71
|
+
? "typescript-language-server.cmd"
|
|
72
|
+
: "typescript-language-server";
|
|
73
|
+
existsFor([path.join("/proj", "node_modules", ".bin", binName)]);
|
|
74
|
+
const s = resolveServer("typescript", "/proj");
|
|
75
|
+
expect(s).toMatchObject({
|
|
76
|
+
languageId: "typescript",
|
|
77
|
+
id: "typescript-language-server",
|
|
78
|
+
args: ["--stdio"],
|
|
79
|
+
});
|
|
80
|
+
expect(s.command).toContain("typescript-language-server");
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it("returns null for a language with no installed server", () => {
|
|
84
|
+
existsFor([]);
|
|
85
|
+
expect(resolveServer("rust", "/proj")).toBeNull();
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it("returns null for an unknown language", () => {
|
|
89
|
+
existsFor([]);
|
|
90
|
+
expect(resolveServer("cobol", "/proj")).toBeNull();
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
describe("plugin server registration", () => {
|
|
95
|
+
it("registers an extra language server and its extensions", () => {
|
|
96
|
+
registerLanguageServer({
|
|
97
|
+
languageId: "zig",
|
|
98
|
+
extensions: [".zig"],
|
|
99
|
+
command: "zls",
|
|
100
|
+
args: [],
|
|
101
|
+
});
|
|
102
|
+
expect(languageIdForFile("a.zig")).toBe("zig");
|
|
103
|
+
const isWin = process.platform === "win32";
|
|
104
|
+
existsFor([
|
|
105
|
+
path.join("/proj", "node_modules", ".bin", isWin ? "zls.cmd" : "zls"),
|
|
106
|
+
]);
|
|
107
|
+
const s = resolveServer("zig", "/proj");
|
|
108
|
+
expect(s).toMatchObject({ id: "zls" });
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it("rejects an incomplete registration", () => {
|
|
112
|
+
expect(() => registerLanguageServer({ languageId: "x" })).toThrow(
|
|
113
|
+
/requires/,
|
|
114
|
+
);
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
describe("probeServers", () => {
|
|
119
|
+
it("reports availability per server family", () => {
|
|
120
|
+
existsFor([]); // nothing installed
|
|
121
|
+
const rows = probeServers("/proj");
|
|
122
|
+
expect(rows.every((r) => r.available === false)).toBe(true);
|
|
123
|
+
// one row per distinct server id (TS family collapses)
|
|
124
|
+
const ids = rows.map((r) => r.id);
|
|
125
|
+
expect(new Set(ids).size).toBe(ids.length);
|
|
126
|
+
expect(ids).toContain("typescript-language-server");
|
|
127
|
+
});
|
|
128
|
+
});
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LSP code-intelligence latency benchmark.
|
|
3
|
+
*
|
|
4
|
+
* Measures the two numbers the Phase 2 acceptance criteria call for on real
|
|
5
|
+
* repos: **startup latency** (cold spawn + project index + first answer) and
|
|
6
|
+
* **per-query latency** (warm def / refs / hover / diagnostics / symbols), plus
|
|
7
|
+
* best-effort server-process RSS. Pure timing/stat helpers are separated out so
|
|
8
|
+
* they are unit-testable without spawning anything.
|
|
9
|
+
*
|
|
10
|
+
* Deliberately drives the SAME `CodeIntelligence` the agent tool uses, so the
|
|
11
|
+
* numbers reflect real agent-path latency, not a synthetic micro-path.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { CodeIntelligence } from "./code-intelligence.js";
|
|
15
|
+
|
|
16
|
+
/** now() in fractional milliseconds — injectable for deterministic tests. */
|
|
17
|
+
export const _deps = {
|
|
18
|
+
now: () => Number(process.hrtime.bigint() / 1000n) / 1000,
|
|
19
|
+
sampleRss: sampleRssDefault,
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/** p-th percentile (0..100) of an UNSORTED sample via linear interpolation. */
|
|
23
|
+
export function percentile(samples, p) {
|
|
24
|
+
if (!samples.length) return null;
|
|
25
|
+
const sorted = [...samples].sort((a, b) => a - b);
|
|
26
|
+
if (sorted.length === 1) return sorted[0];
|
|
27
|
+
const rank = (p / 100) * (sorted.length - 1);
|
|
28
|
+
const lo = Math.floor(rank);
|
|
29
|
+
const hi = Math.ceil(rank);
|
|
30
|
+
if (lo === hi) return sorted[lo];
|
|
31
|
+
return sorted[lo] + (sorted[hi] - sorted[lo]) * (rank - lo);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Summary stats for a latency sample (all in ms), rounded to 0.1ms. */
|
|
35
|
+
export function summarize(samples) {
|
|
36
|
+
if (!samples.length) return { n: 0 };
|
|
37
|
+
const round = (x) => (x == null ? null : Math.round(x * 10) / 10);
|
|
38
|
+
const sum = samples.reduce((a, b) => a + b, 0);
|
|
39
|
+
return {
|
|
40
|
+
n: samples.length,
|
|
41
|
+
min: round(Math.min(...samples)),
|
|
42
|
+
median: round(percentile(samples, 50)),
|
|
43
|
+
p95: round(percentile(samples, 95)),
|
|
44
|
+
max: round(Math.max(...samples)),
|
|
45
|
+
mean: round(sum / samples.length),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Run the benchmark. Returns a structured report; never throws for the
|
|
51
|
+
* "no server installed" case (returns { available:false, reason }).
|
|
52
|
+
*
|
|
53
|
+
* @param {object} opts
|
|
54
|
+
* @param {string} opts.projectRoot
|
|
55
|
+
* @param {string} opts.file a real source file in the project
|
|
56
|
+
* @param {number} [opts.runs=20] timed iterations per operation
|
|
57
|
+
* @param {number} [opts.warmup=2] untimed warmup iterations per operation
|
|
58
|
+
* @param {(msg:string)=>void} [opts.onProgress]
|
|
59
|
+
*/
|
|
60
|
+
export async function runLatencyBenchmark(opts) {
|
|
61
|
+
const {
|
|
62
|
+
projectRoot,
|
|
63
|
+
file,
|
|
64
|
+
runs = 20,
|
|
65
|
+
warmup = 2,
|
|
66
|
+
onProgress = () => {},
|
|
67
|
+
} = opts;
|
|
68
|
+
const ci = new CodeIntelligence({ projectRoot, coldStart: true });
|
|
69
|
+
const report = {
|
|
70
|
+
file,
|
|
71
|
+
runs,
|
|
72
|
+
available: true,
|
|
73
|
+
coldStartMs: null,
|
|
74
|
+
probe: null,
|
|
75
|
+
ops: {},
|
|
76
|
+
server: null,
|
|
77
|
+
};
|
|
78
|
+
try {
|
|
79
|
+
// --- cold start: first query pays spawn + project index ---
|
|
80
|
+
onProgress("cold start (spawn + index + first query)…");
|
|
81
|
+
const t0 = _deps.now();
|
|
82
|
+
const first = await ci.documentSymbols(file);
|
|
83
|
+
report.coldStartMs = round1(_deps.now() - t0);
|
|
84
|
+
if (!first.available) {
|
|
85
|
+
return { available: false, reason: first.reason };
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// --- choose a probe position from a real symbol (so def/refs have a target) ---
|
|
89
|
+
const probe = pickProbe(first.symbols);
|
|
90
|
+
report.probe = probe;
|
|
91
|
+
|
|
92
|
+
// best-effort server memory now that it's warm
|
|
93
|
+
report.server = await captureServerInfo(ci);
|
|
94
|
+
|
|
95
|
+
// --- timed operations (warm) ---
|
|
96
|
+
const ops = [
|
|
97
|
+
{ name: "document_symbols", run: () => ci.documentSymbols(file) },
|
|
98
|
+
{
|
|
99
|
+
name: "definition",
|
|
100
|
+
run: () => ci.definition(file, probe.line, probe.col),
|
|
101
|
+
needsProbe: true,
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
name: "references",
|
|
105
|
+
run: () => ci.references(file, probe.line, probe.col),
|
|
106
|
+
needsProbe: true,
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
name: "hover",
|
|
110
|
+
run: () => ci.hover(file, probe.line, probe.col),
|
|
111
|
+
needsProbe: true,
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
name: "diagnostics",
|
|
115
|
+
run: () => ci.diagnostics(file, { timeoutMs: 4000 }),
|
|
116
|
+
},
|
|
117
|
+
];
|
|
118
|
+
|
|
119
|
+
for (const op of ops) {
|
|
120
|
+
if (op.needsProbe && !probe) {
|
|
121
|
+
report.ops[op.name] = { skipped: "no probe symbol" };
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
onProgress(`${op.name} …`);
|
|
125
|
+
for (let i = 0; i < warmup; i++) await op.run();
|
|
126
|
+
const samples = [];
|
|
127
|
+
for (let i = 0; i < runs; i++) {
|
|
128
|
+
const s = _deps.now();
|
|
129
|
+
await op.run();
|
|
130
|
+
samples.push(_deps.now() - s);
|
|
131
|
+
}
|
|
132
|
+
report.ops[op.name] = summarize(samples);
|
|
133
|
+
}
|
|
134
|
+
return report;
|
|
135
|
+
} finally {
|
|
136
|
+
await ci.dispose();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function pickProbe(symbols) {
|
|
141
|
+
if (!Array.isArray(symbols) || !symbols.length) return null;
|
|
142
|
+
// Prefer a function/method/class — those have meaningful def/refs.
|
|
143
|
+
const preferred = symbols.find((s) =>
|
|
144
|
+
["function", "method", "class"].includes(s.kind),
|
|
145
|
+
);
|
|
146
|
+
const s = preferred || symbols[0];
|
|
147
|
+
return { line: s.line, col: s.col, name: s.name, kind: s.kind };
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
async function captureServerInfo(ci) {
|
|
151
|
+
try {
|
|
152
|
+
const servers = ci.manager.listServers();
|
|
153
|
+
if (!servers.length) return null;
|
|
154
|
+
const s = servers[0];
|
|
155
|
+
const rssMb = s.pid != null ? await _deps.sampleRss(s.pid) : null;
|
|
156
|
+
return { serverId: s.serverId, pid: s.pid, rssMb };
|
|
157
|
+
} catch {
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Best-effort resident-set-size (MB) of the server, summed over the pid AND its
|
|
164
|
+
* descendants. This matters on Windows: a `.cmd` server is launched through
|
|
165
|
+
* `cmd.exe /c`, so the tracked pid is the launcher and the real language server
|
|
166
|
+
* (node/tsserver) is a child — measuring only the launcher reports a few MB and
|
|
167
|
+
* lies. We sum the whole subtree. Returns null if it can't be read (never throws
|
|
168
|
+
* — memory is a bonus metric, not load-bearing).
|
|
169
|
+
*/
|
|
170
|
+
async function sampleRssDefault(pid) {
|
|
171
|
+
const { execFileSync } = await import("child_process");
|
|
172
|
+
try {
|
|
173
|
+
if (process.platform === "win32") {
|
|
174
|
+
// One snapshot of every process → parent map → sum the subtree at `pid`.
|
|
175
|
+
const csv = execFileSync(
|
|
176
|
+
"wmic",
|
|
177
|
+
[
|
|
178
|
+
"process",
|
|
179
|
+
"get",
|
|
180
|
+
"ProcessId,ParentProcessId,WorkingSetSize",
|
|
181
|
+
"/format:csv",
|
|
182
|
+
],
|
|
183
|
+
{ encoding: "utf8", windowsHide: true, maxBuffer: 16 * 1024 * 1024 },
|
|
184
|
+
);
|
|
185
|
+
const bytes = sumSubtreeRssFromWmicCsv(csv, pid);
|
|
186
|
+
return bytes != null ? Math.round(bytes / (1024 * 1024)) : null;
|
|
187
|
+
}
|
|
188
|
+
// POSIX: not wrapped, so the pid is the real server. Sum pid + children.
|
|
189
|
+
const out = execFileSync("ps", ["-o", "pid=,ppid=,rss="], {
|
|
190
|
+
encoding: "utf8",
|
|
191
|
+
});
|
|
192
|
+
const rows = out
|
|
193
|
+
.trim()
|
|
194
|
+
.split(/\r?\n/)
|
|
195
|
+
.map((l) => l.trim().split(/\s+/).map(Number));
|
|
196
|
+
const kb = sumSubtreeRss(
|
|
197
|
+
rows.map(([p, pp, rss]) => ({ pid: p, ppid: pp, val: rss })),
|
|
198
|
+
pid,
|
|
199
|
+
);
|
|
200
|
+
return kb != null ? Math.round(kb / 1024) : null;
|
|
201
|
+
} catch {
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/** Parse `wmic ... /format:csv` output and sum WorkingSetSize over pid's subtree (bytes). */
|
|
207
|
+
export function sumSubtreeRssFromWmicCsv(csv, rootPid) {
|
|
208
|
+
const lines = csv
|
|
209
|
+
.split(/\r?\n/)
|
|
210
|
+
.map((l) => l.trim())
|
|
211
|
+
.filter(Boolean);
|
|
212
|
+
const header = lines.find((l) => /ProcessId/i.test(l));
|
|
213
|
+
if (!header) return null;
|
|
214
|
+
const cols = header.split(",");
|
|
215
|
+
const iPid = cols.findIndex((c) => /^ProcessId$/i.test(c));
|
|
216
|
+
const iPpid = cols.findIndex((c) => /^ParentProcessId$/i.test(c));
|
|
217
|
+
const iRss = cols.findIndex((c) => /^WorkingSetSize$/i.test(c));
|
|
218
|
+
if (iPid < 0 || iPpid < 0 || iRss < 0) return null;
|
|
219
|
+
const rows = [];
|
|
220
|
+
for (const l of lines) {
|
|
221
|
+
if (l === header || /ProcessId/i.test(l)) continue;
|
|
222
|
+
const f = l.split(",");
|
|
223
|
+
const pid = Number(f[iPid]);
|
|
224
|
+
const ppid = Number(f[iPpid]);
|
|
225
|
+
const val = Number(f[iRss]);
|
|
226
|
+
if (Number.isFinite(pid))
|
|
227
|
+
rows.push({ pid, ppid, val: Number.isFinite(val) ? val : 0 });
|
|
228
|
+
}
|
|
229
|
+
return sumSubtreeRss(rows, rootPid);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/** Sum `val` over `rootPid` and all its transitive descendants. */
|
|
233
|
+
export function sumSubtreeRss(rows, rootPid) {
|
|
234
|
+
const childrenOf = new Map();
|
|
235
|
+
const valOf = new Map();
|
|
236
|
+
for (const r of rows) {
|
|
237
|
+
valOf.set(r.pid, r.val);
|
|
238
|
+
if (!childrenOf.has(r.ppid)) childrenOf.set(r.ppid, []);
|
|
239
|
+
childrenOf.get(r.ppid).push(r.pid);
|
|
240
|
+
}
|
|
241
|
+
if (!valOf.has(rootPid)) return null;
|
|
242
|
+
let total = 0;
|
|
243
|
+
const seen = new Set();
|
|
244
|
+
const stack = [rootPid];
|
|
245
|
+
while (stack.length) {
|
|
246
|
+
const p = stack.pop();
|
|
247
|
+
if (seen.has(p)) continue;
|
|
248
|
+
seen.add(p);
|
|
249
|
+
total += valOf.get(p) || 0;
|
|
250
|
+
for (const c of childrenOf.get(p) || []) stack.push(c);
|
|
251
|
+
}
|
|
252
|
+
return total;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
function round1(x) {
|
|
256
|
+
return Math.round(x * 10) / 10;
|
|
257
|
+
}
|