chainlesschain 0.166.46 → 0.166.47
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 +6 -4
- package/package.json +3 -1
- package/src/assets/web-panel/assets/{AIOps-Cp8KiMmv.js → AIOps-CDpT0WXV.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-B4d9BGsm.js → ActionButton-BNfUljWx.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-Cf9yXTkv.js → Analytics-C9323DEx.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-40UkmxtP.js → AppLayout-CRrjb2db.js} +4 -4
- package/src/assets/web-panel/assets/{Artifacts-Ckkb4oOA.js → Artifacts-Db-DGqJS.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-Dnf569k5.js → Audit-CJdHRJ0W.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-CA6bLem4.js → BackgroundAgents-_RSCnTYs.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-ChQU0I_Q.js → Backup-8GFQi-dM.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BHeZXnNN.js → BaseInput-C87NtgUZ.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-DcFVYB2E.js → Chat-DcTMWS8G.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-5ZDPTW_H.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-2PDbejv2.js → Checkbox-DM9EmYee.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DJBn1RAu.js → Codegen-M2YqDRNN.js} +1 -1
- package/src/assets/web-panel/assets/{Col-CPRq7n6y.js → Col-oB1LLxyf.js} +1 -1
- package/src/assets/web-panel/assets/{Community-axvINFMi.js → Community-TcVZK5tF.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-_OX4Qbe0.js → Compact-XKmq-3K_.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-DWAkvzRL.js → Compliance-C6CBiDRy.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-CUIJ25oj.js → Cowork-Dz9CGqXH.js} +4 -4
- package/src/assets/web-panel/assets/{Cron-nR0m7H3_.js → Cron-CxJDgDVL.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CgTLXzh_.js → Crosschain-DMP0JsaQ.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BllzRB6Q.js → DID-I5IQeogb.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-C9f0IIBN.js → Dashboard-BfLW2MXj.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BkahetiO.js → Dropdown-BK8EjAlh.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-rartVC-k.js → EmailListRenderer-C3iqSv5I.js} +1 -1
- package/src/assets/web-panel/assets/EvolutionSettings-BJmBzpW6.js +1 -0
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DgUdFvw1.js → FamilyGuardDashboard-T19rnqm-.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-oFpIQU6g.js → Federation-CozrbPMy.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BUH5xlyP.js → FormItemContext-k1dCLNNJ.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-ilRa-ueg.js → GenericCardRenderer-DbaW_Jvt.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DlHHSF8j.js → Git-CQHRyEIt.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-yQiiXIWe.js → Governance-BMJYZgMy.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BUDRVGOP.js → Inference-B7mpNU7V.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-BaGyIoN1.js → KnowledgeGraph-Br0Blg6B.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-C1cO6zE0.js → Logs-HIdk0S6M.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-_z_Iaoes.js → MarkdownRenderer-HxeocBHy.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-CM8cGL0K.js → Marketplace-Bkfq69UP.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CDqAMU0U.js → McpTools-dtmx0bHO.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-CfB0-Ofv.js → Memory-CrRlOuEf.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BL18ytvB.js → MobileBridge-D4ZIZiAH.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-PIyyxbuJ.js → MobileProjects-C90Rw7GE.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BTTrFCol.js → Mtc-CC6k_uh4.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-JHZn037c.js → MtcAudit-T_CUIYUy.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-CMf9NEdB.js → Multisig-N_e0RRWk.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Dhk3qaus.js → NLProgramming-Iq3VzEv0.js} +1 -1
- package/src/assets/web-panel/assets/Notes-B5sKJUJt.js +7 -0
- package/src/assets/web-panel/assets/{NotificationSettings-gxdaVEit.js → NotificationSettings-K8UVp8qQ.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-BWNyM-6m.js +1 -0
- package/src/assets/web-panel/assets/{Organization-CzvHcDNO.js → Organization-DMO1NJxI.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-Dclx30Vv.js → Overflow-BBY6b31Z.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CM0Wm9vZ.js → P2P-DmsL0y0v.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-fYmQzmTA.js → PdhVaultBrowser-C65AX_RY.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-B_oATenG.js → Permissions-CWcpRtWa.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-CptiVBh5.js → PersonalDataHub--ZNDIdsn.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-DkHzgyyI.js → Pipeline-DCdj5NGb.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DzZvwcKh.js → Privacy-BRKu7Q3E.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CzkCs-5G.js → ProjectInit-BJ7ozIAb.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-BB8dcxRD.js → ProjectSettings-B2cVLiXW.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-B7PW9CFY.js → Projects-Ce9r_W-p.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-Tfx-ti1V.js → Providers-BDespvGZ.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-EvWlNhfX.js → QrScannerModal-BUNO4fDU.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CUspgbNC.js → QuickAsk-D2TUqeBV.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-COY2g77J.js → Recommend-BNNQPHBH.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-BzMBU6E6.js → RemoteSession-D2t1V_Cm.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-RtYRF4YP.js → Reputation-DVK5hEqI.js} +1 -1
- package/src/assets/web-panel/assets/{Row-Bva3l9Lc.js → Row-BB9RTwmE.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BhjzLvW3.js → RssFeed-DmEO7liZ.js} +2 -2
- package/src/assets/web-panel/assets/{Search-BYzT2PTR.js → Search-UwEYjnDB.js} +1 -1
- package/src/assets/web-panel/assets/{Security-Bcl4-KTv.js → Security-DebqSsMp.js} +4 -4
- package/src/assets/web-panel/assets/{Services-BRRa4A0f.js → Services-CuuPts3C.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DYQ016qy.js → Skeleton-DbWpmbgf.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CAUKL9JA.js → Skills-BaK7SxzT.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-BTyUqfuD.js → Sla-BFHv51Jb.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-CUjMihrs.js → SpeechSettings-B9b1R6uK.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CvfOSupr.js → SyncSettings-BnO0CN02.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-EvjNXrWH.js → Tasks-Dy01Vq49.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-wPAp0EoM.js → Templates-BCy2AMHc.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CP0D-q9Q.js → Tenant-4Tx9y_Y1.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-CQ0f2iFg.js → Terminal-CPOoUH8J.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-D3JrGSPb.js → TimelineRenderer-C85GlJzu.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-yXf2PPp9.js → Tokens-_xneFBGF.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DfmMOoZ2.js → Trigger-BizG4rTr.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BTCyMgf1.js → Trust-Dh8EIn3n.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-DKCwIBHi.js → UkeySign-C5NWoHWQ.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-CQpDSzLO.js → VideoEditing-0YfrySL6.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CyFrzC3K.js → Wallet-BZVH8Ags.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-D6Nr_1kd.js → WebAuthn-kNofa6vm.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-CgR9tNrB.js → WorkflowEditor-BNO34_j0.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CRG_IeyP.js → chat-ifQ2FlwD.js} +1 -1
- package/src/assets/web-panel/assets/{colors-MdE3TStI.js → colors-1TL8H6EH.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-B0LRuiNV.js → compact-item-DBfRjs_T.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-B_V5fjcX.js → createContext-Bs6V4iBf.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BHnbnuYL.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DSL-c_hr.js → hasIn-Bz6LMY_0.js} +1 -1
- package/src/assets/web-panel/assets/{index-DE7bSYmW.js → index--WvT2Il3.js} +1 -1
- package/src/assets/web-panel/assets/{index-DBwBZwio.js → index-84mi5rsv.js} +1 -1
- package/src/assets/web-panel/assets/{index-BsAEd-Do.js → index-B5SJCUZ7.js} +1 -1
- package/src/assets/web-panel/assets/{index-CdHMc9LQ.js → index-B6RClMZl.js} +1 -1
- package/src/assets/web-panel/assets/{index-B3iW-mhn.js → index-BB1Af7Fv.js} +1 -1
- package/src/assets/web-panel/assets/{index-C67dPW0L.js → index-BQL_tldd.js} +1 -1
- package/src/assets/web-panel/assets/{index-BpwGsAA-.js → index-BXJXMaZe.js} +1 -1
- package/src/assets/web-panel/assets/{index-CZICtYJ0.js → index-BhPDhmvN.js} +1 -1
- package/src/assets/web-panel/assets/{index-BbZZ7P_c.js → index-BiZ7Nz5-.js} +1 -1
- package/src/assets/web-panel/assets/{index-Didyuq2Z.js → index-BoCTDcn6.js} +1 -1
- package/src/assets/web-panel/assets/{index-BNhWoD6d.js → index-BxqC3LiO.js} +1 -1
- package/src/assets/web-panel/assets/{index-DRRY44XP.js → index-C6c0j-Ki.js} +1 -1
- package/src/assets/web-panel/assets/{index-D3pJBTvo.js → index-C7d6QlfR.js} +1 -1
- package/src/assets/web-panel/assets/{index-CdplnAS9.js → index-C9QYxq61.js} +1 -1
- package/src/assets/web-panel/assets/{index-CPYshcic.js → index-CBh48_Mh.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkN53KiJ.js → index-CNKHoXWI.js} +1 -1
- package/src/assets/web-panel/assets/{index-OBhlHSMN.js → index-CXVBQ82k.js} +3 -3
- package/src/assets/web-panel/assets/{index-DtOTppk8.js → index-CXtiLagi.js} +1 -1
- package/src/assets/web-panel/assets/{index-CNytQuFq.js → index-Cn7EIWmI.js} +1 -1
- package/src/assets/web-panel/assets/index-CsRz9-ZH.js +1 -0
- package/src/assets/web-panel/assets/{index-BIDCNwy6.js → index-CtB45Hok.js} +1 -1
- package/src/assets/web-panel/assets/{index-BQAsL19t.js → index-Cu_V6ZJH.js} +1 -1
- package/src/assets/web-panel/assets/{index-c8OqO3rq.js → index-Cykt9BbN.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bq8-2Ibv.js → index-DDhy4eCS.js} +1 -1
- package/src/assets/web-panel/assets/{index-CXMeisJK.js → index-DEPPzM8I.js} +1 -1
- package/src/assets/web-panel/assets/{index-BD0w-888.js → index-DMVktlxG.js} +1 -1
- package/src/assets/web-panel/assets/{index-CVDi4rS9.js → index-DOww5Qny.js} +1 -1
- package/src/assets/web-panel/assets/{index-Tg3yl8wc.js → index-DWPp-d07.js} +1 -1
- package/src/assets/web-panel/assets/index-DnjMFf3m.js +1 -0
- package/src/assets/web-panel/assets/{index-DVgTf7CZ.js → index-DvM2xBUA.js} +1 -1
- package/src/assets/web-panel/assets/{index-SmQfEHjp.js → index-EK3XtMxA.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5dqieYX.js → index-XJIV7HEw.js} +1 -1
- package/src/assets/web-panel/assets/{index-0200QxC4.js → index-cNwsev6n.js} +1 -1
- package/src/assets/web-panel/assets/{index-C-aKWR2v.js → index-f_7L9GvP.js} +1 -1
- package/src/assets/web-panel/assets/{index-KaSejHjf.js → index-lUL3bD2z.js} +1 -1
- package/src/assets/web-panel/assets/{index-CS3bOhV7.js → index-pOUFfRdN.js} +1 -1
- package/src/assets/web-panel/assets/{index-CEOAZm5j.js → index-rGhS02f8.js} +1 -1
- package/src/assets/web-panel/assets/{index-BMm8tO2X.js → index-vHtnQsnV.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHp1nSur.js → index-vb1XIxEB.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-P8SBN6Di.js → initDefaultProps-DpRIjwTt.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BubbjUT_.js → motion-CG4_9o-Z.js} +1 -1
- package/src/assets/web-panel/assets/{move-Chcykv0I.js → move-Dku1fXtf.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-DyiYuGDu.js → mtc-parser-BvAVeX-3.js} +1 -1
- package/src/assets/web-panel/assets/{omit-Rdwb_Neb.js → omit-DFu0x78D.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CCr0MYHl.js → pickAttrs-CmI-FNcK.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-B1ZXz3bb.js → placementArrow-CGERYewB.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BGEdwej6.js → responsiveObserve-D7G8bF5J.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CpnsUMaT.js → slide-B2sXwWXy.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-C7x-TVp_.js → statusUtils-DI5yh0n3.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-CC5k_791.js → styleChecker-deGJ5dp_.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-BpZFKsJW.js → useFlexGapSupport-OqHBXEmi.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CVq5HySy.js → useFs-Dqgx0Qv_.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BGkdLryu.js → usePersonalDataHub-Be-lveh2.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-uLtOUEK-.js → vnode-CFxB876W.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-BfVC9iUs.js → zoom-BFOYrl4e.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +3 -3
- package/src/commands/agent.js +8 -0
- package/src/commands/background-session.js +31 -3
- package/src/commands/chat.js +5 -1
- package/src/commands/eval.js +86 -28
- package/src/commands/llm.js +104 -1
- package/src/commands/plugin.js +130 -1
- package/src/commands/sandbox.js +121 -2
- package/src/commands/serve.js +11 -2
- package/src/commands/skill.js +29 -0
- package/src/data/changelog.json +13 -0
- package/src/gateways/ws/session-protocol.js +13 -0
- package/src/gateways/ws/ws-agent-handler.js +17 -0
- package/src/gateways/ws/ws-server.js +3 -0
- package/src/gateways/ws/ws-session-state.js +131 -0
- package/src/generated/cc-agent-protocol.schema.json +4 -0
- package/src/lazy-dispatch.js +8 -1
- package/src/lib/agent-sandbox.js +337 -53
- package/src/lib/app-server/cli-agent-kernel-adapter.js +28 -0
- package/src/lib/app-server/server.js +93 -0
- package/src/lib/background-agent-keeper-client.js +2 -0
- package/src/lib/background-agent-keeper-protocol.js +7 -0
- package/src/lib/background-agent-supervisor.js +194 -47
- package/src/lib/codex-app-server-adapter.js +81 -27
- package/src/lib/context-memory-kernel/durable-memory-port.js +31 -8
- package/src/lib/context-memory-kernel/provider-context.js +53 -19
- package/src/lib/deferred-question-context.js +122 -0
- package/src/lib/eval/evidence.js +202 -64
- package/src/lib/eval/plugin-suite.js +917 -0
- package/src/lib/eval/runner.js +10 -3
- package/src/lib/evolution/agent-evolution-runtime-composition.js +236 -1
- package/src/lib/evolution/agent-model-projection.js +97 -1
- package/src/lib/evolution/evidence-backed-wiki-maintainer.js +154 -1
- package/src/lib/evolution/evolution-artifact-ports.js +6 -0
- package/src/lib/evolution/evolution-deployment-loader.js +87 -3
- package/src/lib/evolution/evolution-eval-gate.js +8 -0
- package/src/lib/evolution/evolution-eval-runtime-composition.js +255 -0
- package/src/lib/evolution/evolution-evidence-artifact-adapter.js +58 -2
- package/src/lib/evolution/evolution-ledger-file-backend.js +23 -2
- package/src/lib/evolution/evolution-ledger-manifest-chain.js +223 -7
- package/src/lib/evolution/evolution-ledger-v2-journal.js +525 -0
- package/src/lib/evolution/evolution-ledger-v2-manifest-backend.js +46 -2
- package/src/lib/evolution/evolution-ledger.js +57 -1
- package/src/lib/evolution/evolution-run-ledger-adapter.js +93 -0
- package/src/lib/evolution/evolution-run-wiki-evidence-resolver.js +259 -0
- package/src/lib/evolution/governed-hub-llm.js +238 -5
- package/src/lib/evolution/governed-hub-resolver.js +82 -4
- package/src/lib/evolution/governed-hub-skill.js +11 -5
- package/src/lib/evolution/governed-skill-synthesis-provider-chat.js +10 -1
- package/src/lib/evolution/skill-runtime-revalidation-ledger-adapter.js +254 -0
- package/src/lib/evolution/skill-runtime-revalidation.js +530 -0
- package/src/lib/evolution/skill-target-matrix-eval.js +4 -4
- package/src/lib/evolution/wiki-evidence-commit-guard.js +366 -0
- package/src/lib/evolution/wiki-informed-skill-proposer.js +13 -1
- package/src/lib/goal-context.js +14 -5
- package/src/lib/interaction-adapter.js +166 -1
- package/src/lib/model-capabilities.js +271 -0
- package/src/lib/model-context-catalog.js +105 -0
- package/src/lib/model-context-window.js +4 -49
- package/src/lib/openai-responses.js +428 -0
- package/src/lib/plugin-runtime/scopes.js +7 -1
- package/src/lib/remote-read-loop-guard.js +2 -2
- package/src/lib/runtime-usage-ledger.js +16 -0
- package/src/lib/skill-loader.js +12 -0
- package/src/lib/with-file-lock.js +3 -1
- package/src/repl/agent-repl.js +5 -1
- package/src/runtime/agent-core.js +348 -23
- package/src/runtime/agent-runtime.js +7 -0
- package/src/runtime/coding-agent-contract-shared.cjs +13 -1
- package/src/runtime/headless-runner.js +4 -1
- package/src/runtime/headless-stream.js +133 -44
- package/src/runtime/runtime-factory.js +26 -2
- package/src/workers/background-agent-keeper.js +23 -13
- package/src/workers/background-agent-worker.js +27 -13
- package/src/assets/web-panel/assets/ChatBubbleRenderer-Bi2SY9E_.js +0 -1
- package/src/assets/web-panel/assets/EvolutionSettings-BqpG3XHV.js +0 -1
- package/src/assets/web-panel/assets/Notes-6F8EarNN.js +0 -7
- package/src/assets/web-panel/assets/OrderTableRenderer-gVgXQWdc.js +0 -1
- package/src/assets/web-panel/assets/devWarning-BtFLt3qI.js +0 -1
- package/src/assets/web-panel/assets/index-BhuWQHeG.js +0 -1
- package/src/assets/web-panel/assets/index-D-4tFek3.js +0 -1
|
@@ -1,13 +1,244 @@
|
|
|
1
1
|
import { createRequire } from "node:module";
|
|
2
|
+
import { types } from "node:util";
|
|
2
3
|
import { prepareGovernedModelTurn } from "./governed-model-turn.js";
|
|
3
4
|
|
|
4
5
|
const { createAuthenticatedEvolutionModelClient } = createRequire(
|
|
5
6
|
import.meta.url,
|
|
6
7
|
)("@chainlesschain/personal-data-hub/model-egress-guard");
|
|
8
|
+
const { OllamaClient } = createRequire(import.meta.url)(
|
|
9
|
+
"@chainlesschain/personal-data-hub/llm-client",
|
|
10
|
+
);
|
|
11
|
+
const { CcLLMAdapter } = createRequire(import.meta.url)(
|
|
12
|
+
"@chainlesschain/personal-data-hub/bridges/cc-llm-adapter",
|
|
13
|
+
);
|
|
14
|
+
const { EntityResolverEmbeddingStage } = createRequire(import.meta.url)(
|
|
15
|
+
"@chainlesschain/personal-data-hub/entity-resolver",
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
const DEFAULT_SDK_PORTS = Object.freeze({
|
|
19
|
+
createAuthenticatedEvolutionModelClient,
|
|
20
|
+
OllamaClient,
|
|
21
|
+
CcLLMAdapter,
|
|
22
|
+
EntityResolverEmbeddingStage,
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
// A packaged Desktop has its own physical SDK copy and private client brand.
|
|
26
|
+
// These main-process module exports select that copy, not Evolution authority.
|
|
27
|
+
// Keep them separate from caller model/skill options; the factory below still
|
|
28
|
+
// has to produce a genuinely branded, Run-bound composition on every call.
|
|
29
|
+
export function captureGovernedHubSdkPorts(ports = DEFAULT_SDK_PORTS) {
|
|
30
|
+
if (
|
|
31
|
+
!ports ||
|
|
32
|
+
typeof ports !== "object" ||
|
|
33
|
+
Array.isArray(ports) ||
|
|
34
|
+
types.isProxy(ports)
|
|
35
|
+
)
|
|
36
|
+
throw new TypeError("Host Hub SDK ports must be an object");
|
|
37
|
+
const captured = {};
|
|
38
|
+
for (const name of Object.keys(DEFAULT_SDK_PORTS)) {
|
|
39
|
+
const descriptor = Object.getOwnPropertyDescriptor(ports, name);
|
|
40
|
+
if (
|
|
41
|
+
!descriptor ||
|
|
42
|
+
!Object.hasOwn(descriptor, "value") ||
|
|
43
|
+
typeof descriptor.value !== "function" ||
|
|
44
|
+
types.isProxy(descriptor.value)
|
|
45
|
+
)
|
|
46
|
+
throw new TypeError(
|
|
47
|
+
`Host Hub SDK ${name} must be a function data property`,
|
|
48
|
+
);
|
|
49
|
+
captured[name] = descriptor.value;
|
|
50
|
+
}
|
|
51
|
+
return Object.freeze(captured);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function isLoopbackEndpoint(value) {
|
|
55
|
+
if (typeof value !== "string") return false;
|
|
56
|
+
try {
|
|
57
|
+
const endpoint = new URL(value);
|
|
58
|
+
return (
|
|
59
|
+
["http:", "https:"].includes(endpoint.protocol) &&
|
|
60
|
+
(endpoint.hostname === "localhost" ||
|
|
61
|
+
endpoint.hostname === "[::1]" ||
|
|
62
|
+
/^127(?:\.\d{1,3}){3}$/.test(endpoint.hostname))
|
|
63
|
+
);
|
|
64
|
+
} catch {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// These transports stay private to the invocation wrapper. The SDK's public
|
|
70
|
+
// chat methods remain default-denied; only the wrapper below can hand this
|
|
71
|
+
// transport messages after a branded composition has projected them.
|
|
72
|
+
function captureHubTransport(llm, sdk) {
|
|
73
|
+
if (
|
|
74
|
+
llm instanceof sdk.OllamaClient &&
|
|
75
|
+
llm.chat === sdk.OllamaClient.prototype.chat
|
|
76
|
+
) {
|
|
77
|
+
const { baseUrl, model, timeoutMs, _fetch: fetchImpl } = llm;
|
|
78
|
+
return {
|
|
79
|
+
// The SDK labels Ollama as local even for a remote baseUrl. Preserve
|
|
80
|
+
// stricter host policy, but never let that label waive cloud consent.
|
|
81
|
+
isLocal: isLoopbackEndpoint(baseUrl),
|
|
82
|
+
assertIdentity() {
|
|
83
|
+
if (
|
|
84
|
+
llm.baseUrl !== baseUrl ||
|
|
85
|
+
llm.model !== model ||
|
|
86
|
+
llm.timeoutMs !== timeoutMs ||
|
|
87
|
+
llm._fetch !== fetchImpl
|
|
88
|
+
)
|
|
89
|
+
throw new Error(
|
|
90
|
+
"Hub model identity changed; reopen the analysis invocation",
|
|
91
|
+
);
|
|
92
|
+
},
|
|
93
|
+
async chat(messages, options) {
|
|
94
|
+
const controller = new AbortController();
|
|
95
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
96
|
+
try {
|
|
97
|
+
const signal = options.signal
|
|
98
|
+
? AbortSignal.any([controller.signal, options.signal])
|
|
99
|
+
: controller.signal;
|
|
100
|
+
const response = await fetchImpl(`${baseUrl}/api/chat`, {
|
|
101
|
+
method: "POST",
|
|
102
|
+
headers: { "Content-Type": "application/json" },
|
|
103
|
+
redirect: "error",
|
|
104
|
+
signal,
|
|
105
|
+
body: JSON.stringify({
|
|
106
|
+
model,
|
|
107
|
+
messages,
|
|
108
|
+
stream: false,
|
|
109
|
+
options: {
|
|
110
|
+
temperature: options.temperature ?? 0.2,
|
|
111
|
+
...(options.numCtx ? { num_ctx: options.numCtx } : {}),
|
|
112
|
+
},
|
|
113
|
+
}),
|
|
114
|
+
});
|
|
115
|
+
if (!response.ok)
|
|
116
|
+
throw new Error(
|
|
117
|
+
`Hub Ollama request failed: HTTP ${response.status}`,
|
|
118
|
+
);
|
|
119
|
+
const data = await response.json();
|
|
120
|
+
if (
|
|
121
|
+
data?.error ||
|
|
122
|
+
data?.done !== true ||
|
|
123
|
+
typeof data?.message?.content !== "string"
|
|
124
|
+
)
|
|
125
|
+
throw new Error(
|
|
126
|
+
"Hub Ollama response did not contain a completed text answer",
|
|
127
|
+
);
|
|
128
|
+
return {
|
|
129
|
+
text: data.message.content,
|
|
130
|
+
model,
|
|
131
|
+
usage: {
|
|
132
|
+
promptTokens: data.prompt_eval_count ?? 0,
|
|
133
|
+
completionTokens: data.eval_count ?? 0,
|
|
134
|
+
totalTokens:
|
|
135
|
+
(data.prompt_eval_count ?? 0) + (data.eval_count ?? 0),
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
} finally {
|
|
139
|
+
clearTimeout(timer);
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
if (
|
|
145
|
+
llm instanceof sdk.CcLLMAdapter &&
|
|
146
|
+
llm.chat === sdk.CcLLMAdapter.prototype.chat
|
|
147
|
+
) {
|
|
148
|
+
const chat = llm._chat;
|
|
149
|
+
const getActiveClient = llm._getActiveClient;
|
|
150
|
+
const getActiveProvider = llm._getActiveProvider;
|
|
151
|
+
const getActiveModel = llm._getActiveModel;
|
|
152
|
+
const provider = getActiveProvider?.();
|
|
153
|
+
const model = getActiveModel?.();
|
|
154
|
+
const client = getActiveClient?.();
|
|
155
|
+
const networkIdentity = {
|
|
156
|
+
baseURL: client?.baseURL,
|
|
157
|
+
host: client?.host,
|
|
158
|
+
model: client?.model,
|
|
159
|
+
chat: client?.chat,
|
|
160
|
+
};
|
|
161
|
+
const httpClient = client?.client;
|
|
162
|
+
const defaults = httpClient?.defaults;
|
|
163
|
+
const httpIdentity = {
|
|
164
|
+
baseURL: defaults?.baseURL,
|
|
165
|
+
post: httpClient?.post,
|
|
166
|
+
request: httpClient?.request,
|
|
167
|
+
};
|
|
168
|
+
const endpoint = networkIdentity.baseURL || networkIdentity.host;
|
|
169
|
+
if (httpClient && endpoint && httpIdentity.baseURL !== endpoint) {
|
|
170
|
+
const error = new Error(
|
|
171
|
+
"Hub Desktop endpoint does not match its selected HTTP client",
|
|
172
|
+
);
|
|
173
|
+
error.code = "CC_AGENT_EVOLUTION_INGRESS_FAILED";
|
|
174
|
+
throw error;
|
|
175
|
+
}
|
|
176
|
+
return {
|
|
177
|
+
// A provider label such as "ollama" does not establish locality. The
|
|
178
|
+
// host must expose its selected client; absent URL evidence is remote.
|
|
179
|
+
isLocal:
|
|
180
|
+
isLoopbackEndpoint(endpoint) &&
|
|
181
|
+
(!httpClient || httpIdentity.baseURL === endpoint),
|
|
182
|
+
assertIdentity() {
|
|
183
|
+
if (
|
|
184
|
+
llm._chat !== chat ||
|
|
185
|
+
llm._getActiveClient !== getActiveClient ||
|
|
186
|
+
llm._getActiveProvider !== getActiveProvider ||
|
|
187
|
+
llm._getActiveModel !== getActiveModel ||
|
|
188
|
+
getActiveProvider?.() !== provider ||
|
|
189
|
+
getActiveModel?.() !== model ||
|
|
190
|
+
getActiveClient?.() !== client ||
|
|
191
|
+
client?.client !== httpClient ||
|
|
192
|
+
httpClient?.defaults !== defaults ||
|
|
193
|
+
defaults?.baseURL !== httpIdentity.baseURL ||
|
|
194
|
+
httpClient?.post !== httpIdentity.post ||
|
|
195
|
+
httpClient?.request !== httpIdentity.request ||
|
|
196
|
+
Object.entries(networkIdentity).some(
|
|
197
|
+
([key, value]) => client?.[key] !== value,
|
|
198
|
+
)
|
|
199
|
+
)
|
|
200
|
+
throw new Error(
|
|
201
|
+
"Hub model identity changed; reopen the analysis invocation",
|
|
202
|
+
);
|
|
203
|
+
},
|
|
204
|
+
async chat(messages, options) {
|
|
205
|
+
const result = await chat(messages, options);
|
|
206
|
+
const text =
|
|
207
|
+
result?.content ??
|
|
208
|
+
result?.text ??
|
|
209
|
+
result?.message?.content ??
|
|
210
|
+
result?.choices?.[0]?.message?.content;
|
|
211
|
+
if (typeof text !== "string")
|
|
212
|
+
throw new Error("Hub Desktop response must contain text");
|
|
213
|
+
const usage = result?.usage ?? {};
|
|
214
|
+
const promptTokens =
|
|
215
|
+
usage.promptTokens ?? usage.prompt_tokens ?? usage.input_tokens ?? 0;
|
|
216
|
+
const completionTokens =
|
|
217
|
+
usage.completionTokens ??
|
|
218
|
+
usage.completion_tokens ??
|
|
219
|
+
usage.output_tokens ??
|
|
220
|
+
0;
|
|
221
|
+
return {
|
|
222
|
+
text,
|
|
223
|
+
model: result.model,
|
|
224
|
+
usage: {
|
|
225
|
+
promptTokens,
|
|
226
|
+
completionTokens,
|
|
227
|
+
totalTokens:
|
|
228
|
+
usage.totalTokens ??
|
|
229
|
+
usage.total_tokens ??
|
|
230
|
+
promptTokens + completionTokens,
|
|
231
|
+
},
|
|
232
|
+
};
|
|
233
|
+
},
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
return { assertIdentity() {}, chat: llm.chat.bind(llm) };
|
|
237
|
+
}
|
|
7
238
|
|
|
8
239
|
// A scoped wrapper preserves the Hub's independent local/cloud consent check.
|
|
9
240
|
// Never replace llm on the process-wide cached Hub or its analysis engine.
|
|
10
|
-
export function createGovernedHubLlm(llm, factory, options = {}) {
|
|
241
|
+
export function createGovernedHubLlm(llm, factory, options = {}, sdkPorts) {
|
|
11
242
|
if (
|
|
12
243
|
!llm ||
|
|
13
244
|
typeof llm.chat !== "function" ||
|
|
@@ -21,7 +252,9 @@ export function createGovernedHubLlm(llm, factory, options = {}) {
|
|
|
21
252
|
throw new TypeError("A Hub evolution factory is required");
|
|
22
253
|
if (options.onFailure != null && typeof options.onFailure !== "function")
|
|
23
254
|
throw new TypeError("onFailure must be a function");
|
|
255
|
+
const sdk = captureGovernedHubSdkPorts(sdkPorts);
|
|
24
256
|
const identity = { name: llm.name, isLocal: llm.isLocal, chat: llm.chat };
|
|
257
|
+
const transport = captureHubTransport(llm, sdk);
|
|
25
258
|
const assertIdentity = () => {
|
|
26
259
|
if (
|
|
27
260
|
llm.name !== identity.name ||
|
|
@@ -32,16 +265,16 @@ export function createGovernedHubLlm(llm, factory, options = {}) {
|
|
|
32
265
|
"Hub model identity changed; reopen the analysis invocation",
|
|
33
266
|
);
|
|
34
267
|
}
|
|
268
|
+
transport.assertIdentity();
|
|
35
269
|
};
|
|
36
|
-
|
|
37
|
-
return createAuthenticatedEvolutionModelClient({
|
|
270
|
+
return sdk.createAuthenticatedEvolutionModelClient({
|
|
38
271
|
getName() {
|
|
39
272
|
assertIdentity();
|
|
40
273
|
return identity.name;
|
|
41
274
|
},
|
|
42
275
|
getIsLocal() {
|
|
43
276
|
assertIdentity();
|
|
44
|
-
return identity.isLocal;
|
|
277
|
+
return identity.isLocal && transport.isLocal !== false;
|
|
45
278
|
},
|
|
46
279
|
async prepare(messages, chatOptions = {}) {
|
|
47
280
|
assertIdentity();
|
|
@@ -53,7 +286,7 @@ export function createGovernedHubLlm(llm, factory, options = {}) {
|
|
|
53
286
|
},
|
|
54
287
|
async transport(messages, chatOptions = {}) {
|
|
55
288
|
assertIdentity();
|
|
56
|
-
const response = await chat(messages, chatOptions);
|
|
289
|
+
const response = await transport.chat(messages, chatOptions);
|
|
57
290
|
assertIdentity();
|
|
58
291
|
return response;
|
|
59
292
|
},
|
|
@@ -1,7 +1,79 @@
|
|
|
1
1
|
import { prepareGovernedModelTurn } from "./governed-model-turn.js";
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
captureGovernedHubSdkPorts,
|
|
4
|
+
createGovernedHubLlm,
|
|
5
|
+
} from "./governed-hub-llm.js";
|
|
3
6
|
|
|
4
|
-
|
|
7
|
+
function captureEmbeddingTransport(stage, sdk) {
|
|
8
|
+
const {
|
|
9
|
+
_embed: embed,
|
|
10
|
+
_embedFn: embedFn,
|
|
11
|
+
_ollamaUrl: baseUrl,
|
|
12
|
+
_model: model,
|
|
13
|
+
} = stage;
|
|
14
|
+
const defaultOllama =
|
|
15
|
+
stage instanceof sdk.EntityResolverEmbeddingStage &&
|
|
16
|
+
embed === sdk.EntityResolverEmbeddingStage.prototype._embed &&
|
|
17
|
+
!embedFn;
|
|
18
|
+
if (defaultOllama) {
|
|
19
|
+
const endpoint = new URL(baseUrl);
|
|
20
|
+
if (
|
|
21
|
+
!["http:", "https:"].includes(endpoint.protocol) ||
|
|
22
|
+
!(
|
|
23
|
+
endpoint.hostname === "localhost" ||
|
|
24
|
+
endpoint.hostname === "[::1]" ||
|
|
25
|
+
/^127(?:\.\d{1,3}){3}$/.test(endpoint.hostname)
|
|
26
|
+
)
|
|
27
|
+
) {
|
|
28
|
+
// Resolver drain has no explicit remote-embedding consent contract.
|
|
29
|
+
// Restoring the local backend must not silently authorize remote input.
|
|
30
|
+
const error = new Error(
|
|
31
|
+
"Default Hub embeddings require a loopback endpoint; remote embedding consent is not supported",
|
|
32
|
+
);
|
|
33
|
+
error.code = "CC_AGENT_EVOLUTION_INGRESS_FAILED";
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const fetchImpl = defaultOllama ? globalThis.fetch : null;
|
|
38
|
+
return {
|
|
39
|
+
assertIdentity() {
|
|
40
|
+
if (
|
|
41
|
+
stage._embed !== embed ||
|
|
42
|
+
stage._embedFn !== embedFn ||
|
|
43
|
+
stage._ollamaUrl !== baseUrl ||
|
|
44
|
+
stage._model !== model
|
|
45
|
+
)
|
|
46
|
+
throw new Error(
|
|
47
|
+
"Hub embedding identity changed; reopen the resolver invocation",
|
|
48
|
+
);
|
|
49
|
+
},
|
|
50
|
+
async embed(profile) {
|
|
51
|
+
if (!defaultOllama) return await embed.call(stage, profile);
|
|
52
|
+
// The raw SDK ollamaEmbed remains closed. This private transport is only
|
|
53
|
+
// invoked below, after the scoped Run projected the profile.
|
|
54
|
+
const response = await fetchImpl(
|
|
55
|
+
`${baseUrl.replace(/\/$/, "")}/api/embeddings`,
|
|
56
|
+
{
|
|
57
|
+
method: "POST",
|
|
58
|
+
headers: { "Content-Type": "application/json" },
|
|
59
|
+
redirect: "error",
|
|
60
|
+
signal: AbortSignal.timeout(60_000),
|
|
61
|
+
body: JSON.stringify({ model, prompt: profile }),
|
|
62
|
+
},
|
|
63
|
+
);
|
|
64
|
+
if (!response.ok)
|
|
65
|
+
throw new Error(
|
|
66
|
+
`Hub embedding request failed: HTTP ${response.status}`,
|
|
67
|
+
);
|
|
68
|
+
const data = await response.json();
|
|
69
|
+
if (data?.error)
|
|
70
|
+
throw new Error("Hub embedding provider returned an error");
|
|
71
|
+
return data?.embedding;
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export function createGovernedHubResolver(ports, factory, sdkPorts) {
|
|
5
77
|
if (typeof factory !== "function")
|
|
6
78
|
throw new TypeError("A resolver evolution factory is required");
|
|
7
79
|
const {
|
|
@@ -12,6 +84,9 @@ export function createGovernedHubResolver(ports, factory) {
|
|
|
12
84
|
EmbeddingStage,
|
|
13
85
|
LLMStage,
|
|
14
86
|
} = ports;
|
|
87
|
+
const sdk = captureGovernedHubSdkPorts(sdkPorts);
|
|
88
|
+
const transport =
|
|
89
|
+
embeddingStage && captureEmbeddingTransport(embeddingStage, sdk);
|
|
15
90
|
// Rebuild stages for each drain. Neither the shared resolver nor its embedding
|
|
16
91
|
// cache may acquire the authority of an individual WebSocket request.
|
|
17
92
|
const embedding =
|
|
@@ -19,6 +94,7 @@ export function createGovernedHubResolver(ports, factory) {
|
|
|
19
94
|
new EmbeddingStage({
|
|
20
95
|
vault: resolver.vault,
|
|
21
96
|
embedFn: async (profile) => {
|
|
97
|
+
transport.assertIdentity();
|
|
22
98
|
const turn = await prepareGovernedModelTurn(factory, {
|
|
23
99
|
mode: "hub-embedding",
|
|
24
100
|
messages: [{ role: "user", content: profile }],
|
|
@@ -35,7 +111,9 @@ export function createGovernedHubResolver(ports, factory) {
|
|
|
35
111
|
throw new Error(
|
|
36
112
|
"Projected embedding input must contain one text message",
|
|
37
113
|
);
|
|
38
|
-
|
|
114
|
+
transport.assertIdentity();
|
|
115
|
+
const vector = await transport.embed(profileMessage.content);
|
|
116
|
+
transport.assertIdentity();
|
|
39
117
|
if (
|
|
40
118
|
(!Array.isArray(vector) && !(vector instanceof Float32Array)) ||
|
|
41
119
|
vector.length === 0 ||
|
|
@@ -51,7 +129,7 @@ export function createGovernedHubResolver(ports, factory) {
|
|
|
51
129
|
const model =
|
|
52
130
|
resolver._llmStage &&
|
|
53
131
|
new LLMStage({
|
|
54
|
-
llm: createGovernedHubLlm(llm, factory),
|
|
132
|
+
llm: createGovernedHubLlm(llm, factory, {}, sdk),
|
|
55
133
|
acceptNonLocal: false,
|
|
56
134
|
});
|
|
57
135
|
return new EntityResolver({
|
|
@@ -8,15 +8,21 @@ export async function runGovernedHubSkill(
|
|
|
8
8
|
runSkill,
|
|
9
9
|
name,
|
|
10
10
|
options,
|
|
11
|
+
sdkPorts,
|
|
11
12
|
) {
|
|
12
13
|
let failure;
|
|
13
14
|
let failed = false;
|
|
14
|
-
const llm = createGovernedHubLlm(
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
const llm = createGovernedHubLlm(
|
|
16
|
+
hub.llm,
|
|
17
|
+
factory,
|
|
18
|
+
{
|
|
19
|
+
onFailure(error) {
|
|
20
|
+
failure = error;
|
|
21
|
+
failed = true;
|
|
22
|
+
},
|
|
18
23
|
},
|
|
19
|
-
|
|
24
|
+
sdkPorts,
|
|
25
|
+
);
|
|
20
26
|
const result = await runSkill({ vault: hub.vault, llm }, name, options);
|
|
21
27
|
if (failed) throw failure;
|
|
22
28
|
return result;
|
|
@@ -7,6 +7,7 @@ const PORTS = new WeakSet();
|
|
|
7
7
|
const OPTION_KEYS = new Set([
|
|
8
8
|
"apiKey",
|
|
9
9
|
"baseUrl",
|
|
10
|
+
"evolutionIngress",
|
|
10
11
|
"maxTokens",
|
|
11
12
|
"model",
|
|
12
13
|
"provider",
|
|
@@ -185,7 +186,15 @@ export function createGovernedSkillSynthesisProviderChat(options = {}) {
|
|
|
185
186
|
128,
|
|
186
187
|
4_096,
|
|
187
188
|
);
|
|
188
|
-
const chat = createChatFn({
|
|
189
|
+
const chat = createChatFn({
|
|
190
|
+
provider,
|
|
191
|
+
model,
|
|
192
|
+
baseUrl,
|
|
193
|
+
apiKey,
|
|
194
|
+
...(options.evolutionIngress == null
|
|
195
|
+
? {}
|
|
196
|
+
: { evolutionIngress: options.evolutionIngress }),
|
|
197
|
+
});
|
|
189
198
|
|
|
190
199
|
const port = async (messages) => {
|
|
191
200
|
const controller = new AbortController();
|