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.
Files changed (232) hide show
  1. package/README.md +6 -4
  2. package/package.json +3 -1
  3. package/src/assets/web-panel/assets/{AIOps-Cp8KiMmv.js → AIOps-CDpT0WXV.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-B4d9BGsm.js → ActionButton-BNfUljWx.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-Cf9yXTkv.js → Analytics-C9323DEx.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-40UkmxtP.js → AppLayout-CRrjb2db.js} +4 -4
  7. package/src/assets/web-panel/assets/{Artifacts-Ckkb4oOA.js → Artifacts-Db-DGqJS.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-Dnf569k5.js → Audit-CJdHRJ0W.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-CA6bLem4.js → BackgroundAgents-_RSCnTYs.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-ChQU0I_Q.js → Backup-8GFQi-dM.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-BHeZXnNN.js → BaseInput-C87NtgUZ.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-DcFVYB2E.js → Chat-DcTMWS8G.js} +5 -5
  13. package/src/assets/web-panel/assets/ChatBubbleRenderer-5ZDPTW_H.js +1 -0
  14. package/src/assets/web-panel/assets/{Checkbox-2PDbejv2.js → Checkbox-DM9EmYee.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-DJBn1RAu.js → Codegen-M2YqDRNN.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-CPRq7n6y.js → Col-oB1LLxyf.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-axvINFMi.js → Community-TcVZK5tF.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-_OX4Qbe0.js → Compact-XKmq-3K_.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-DWAkvzRL.js → Compliance-C6CBiDRy.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-CUIJ25oj.js → Cowork-Dz9CGqXH.js} +4 -4
  21. package/src/assets/web-panel/assets/{Cron-nR0m7H3_.js → Cron-CxJDgDVL.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-CgTLXzh_.js → Crosschain-DMP0JsaQ.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-BllzRB6Q.js → DID-I5IQeogb.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-C9f0IIBN.js → Dashboard-BfLW2MXj.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-BkahetiO.js → Dropdown-BK8EjAlh.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-rartVC-k.js → EmailListRenderer-C3iqSv5I.js} +1 -1
  27. package/src/assets/web-panel/assets/EvolutionSettings-BJmBzpW6.js +1 -0
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DgUdFvw1.js → FamilyGuardDashboard-T19rnqm-.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-oFpIQU6g.js → Federation-CozrbPMy.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-BUH5xlyP.js → FormItemContext-k1dCLNNJ.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-ilRa-ueg.js → GenericCardRenderer-DbaW_Jvt.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-DlHHSF8j.js → Git-CQHRyEIt.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-yQiiXIWe.js → Governance-BMJYZgMy.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-BUDRVGOP.js → Inference-B7mpNU7V.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-BaGyIoN1.js → KnowledgeGraph-Br0Blg6B.js} +1 -1
  36. package/src/assets/web-panel/assets/{Logs-C1cO6zE0.js → Logs-HIdk0S6M.js} +2 -2
  37. package/src/assets/web-panel/assets/{MarkdownRenderer-_z_Iaoes.js → MarkdownRenderer-HxeocBHy.js} +1 -1
  38. package/src/assets/web-panel/assets/{Marketplace-CM8cGL0K.js → Marketplace-Bkfq69UP.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-CDqAMU0U.js → McpTools-dtmx0bHO.js} +3 -3
  40. package/src/assets/web-panel/assets/{Memory-CfB0-Ofv.js → Memory-CrRlOuEf.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-BL18ytvB.js → MobileBridge-D4ZIZiAH.js} +1 -1
  42. package/src/assets/web-panel/assets/{MobileProjects-PIyyxbuJ.js → MobileProjects-C90Rw7GE.js} +1 -1
  43. package/src/assets/web-panel/assets/{Mtc-BTTrFCol.js → Mtc-CC6k_uh4.js} +4 -4
  44. package/src/assets/web-panel/assets/{MtcAudit-JHZn037c.js → MtcAudit-T_CUIYUy.js} +4 -4
  45. package/src/assets/web-panel/assets/{Multisig-CMf9NEdB.js → Multisig-N_e0RRWk.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-Dhk3qaus.js → NLProgramming-Iq3VzEv0.js} +1 -1
  47. package/src/assets/web-panel/assets/Notes-B5sKJUJt.js +7 -0
  48. package/src/assets/web-panel/assets/{NotificationSettings-gxdaVEit.js → NotificationSettings-K8UVp8qQ.js} +1 -1
  49. package/src/assets/web-panel/assets/OrderTableRenderer-BWNyM-6m.js +1 -0
  50. package/src/assets/web-panel/assets/{Organization-CzvHcDNO.js → Organization-DMO1NJxI.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-Dclx30Vv.js → Overflow-BBY6b31Z.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-CM0Wm9vZ.js → P2P-DmsL0y0v.js} +2 -2
  53. package/src/assets/web-panel/assets/{PdhVaultBrowser-fYmQzmTA.js → PdhVaultBrowser-C65AX_RY.js} +3 -3
  54. package/src/assets/web-panel/assets/{Permissions-B_oATenG.js → Permissions-CWcpRtWa.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-CptiVBh5.js → PersonalDataHub--ZNDIdsn.js} +3 -3
  56. package/src/assets/web-panel/assets/{Pipeline-DkHzgyyI.js → Pipeline-DCdj5NGb.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-DzZvwcKh.js → Privacy-BRKu7Q3E.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-CzkCs-5G.js → ProjectInit-BJ7ozIAb.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-BB8dcxRD.js → ProjectSettings-B2cVLiXW.js} +2 -2
  60. package/src/assets/web-panel/assets/{Projects-B7PW9CFY.js → Projects-Ce9r_W-p.js} +1 -1
  61. package/src/assets/web-panel/assets/{Providers-Tfx-ti1V.js → Providers-BDespvGZ.js} +1 -1
  62. package/src/assets/web-panel/assets/{QrScannerModal-EvWlNhfX.js → QrScannerModal-BUNO4fDU.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-CUspgbNC.js → QuickAsk-D2TUqeBV.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-COY2g77J.js → Recommend-BNNQPHBH.js} +1 -1
  65. package/src/assets/web-panel/assets/{RemoteSession-BzMBU6E6.js → RemoteSession-D2t1V_Cm.js} +2 -2
  66. package/src/assets/web-panel/assets/{Reputation-RtYRF4YP.js → Reputation-DVK5hEqI.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-Bva3l9Lc.js → Row-BB9RTwmE.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-BhjzLvW3.js → RssFeed-DmEO7liZ.js} +2 -2
  69. package/src/assets/web-panel/assets/{Search-BYzT2PTR.js → Search-UwEYjnDB.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-Bcl4-KTv.js → Security-DebqSsMp.js} +4 -4
  71. package/src/assets/web-panel/assets/{Services-BRRa4A0f.js → Services-CuuPts3C.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-DYQ016qy.js → Skeleton-DbWpmbgf.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-CAUKL9JA.js → Skills-BaK7SxzT.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-BTyUqfuD.js → Sla-BFHv51Jb.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-CUjMihrs.js → SpeechSettings-B9b1R6uK.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-CvfOSupr.js → SyncSettings-BnO0CN02.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-EvjNXrWH.js → Tasks-Dy01Vq49.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-wPAp0EoM.js → Templates-BCy2AMHc.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-CP0D-q9Q.js → Tenant-4Tx9y_Y1.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-CQ0f2iFg.js → Terminal-CPOoUH8J.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-D3JrGSPb.js → TimelineRenderer-C85GlJzu.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-yXf2PPp9.js → Tokens-_xneFBGF.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-DfmMOoZ2.js → Trigger-BizG4rTr.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-BTCyMgf1.js → Trust-Dh8EIn3n.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-DKCwIBHi.js → UkeySign-C5NWoHWQ.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-CQpDSzLO.js → VideoEditing-0YfrySL6.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-CyFrzC3K.js → Wallet-BZVH8Ags.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-D6Nr_1kd.js → WebAuthn-kNofa6vm.js} +3 -3
  89. package/src/assets/web-panel/assets/{WorkflowEditor-CgR9tNrB.js → WorkflowEditor-BNO34_j0.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-CRG_IeyP.js → chat-ifQ2FlwD.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-MdE3TStI.js → colors-1TL8H6EH.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-B0LRuiNV.js → compact-item-DBfRjs_T.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-B_V5fjcX.js → createContext-Bs6V4iBf.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-BHnbnuYL.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-DSL-c_hr.js → hasIn-Bz6LMY_0.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DE7bSYmW.js → index--WvT2Il3.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-DBwBZwio.js → index-84mi5rsv.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-BsAEd-Do.js → index-B5SJCUZ7.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-CdHMc9LQ.js → index-B6RClMZl.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-B3iW-mhn.js → index-BB1Af7Fv.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-C67dPW0L.js → index-BQL_tldd.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-BpwGsAA-.js → index-BXJXMaZe.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-CZICtYJ0.js → index-BhPDhmvN.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BbZZ7P_c.js → index-BiZ7Nz5-.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-Didyuq2Z.js → index-BoCTDcn6.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-BNhWoD6d.js → index-BxqC3LiO.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DRRY44XP.js → index-C6c0j-Ki.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-D3pJBTvo.js → index-C7d6QlfR.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CdplnAS9.js → index-C9QYxq61.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-CPYshcic.js → index-CBh48_Mh.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CkN53KiJ.js → index-CNKHoXWI.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-OBhlHSMN.js → index-CXVBQ82k.js} +3 -3
  113. package/src/assets/web-panel/assets/{index-DtOTppk8.js → index-CXtiLagi.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CNytQuFq.js → index-Cn7EIWmI.js} +1 -1
  115. package/src/assets/web-panel/assets/index-CsRz9-ZH.js +1 -0
  116. package/src/assets/web-panel/assets/{index-BIDCNwy6.js → index-CtB45Hok.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BQAsL19t.js → index-Cu_V6ZJH.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-c8OqO3rq.js → index-Cykt9BbN.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-Bq8-2Ibv.js → index-DDhy4eCS.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CXMeisJK.js → index-DEPPzM8I.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BD0w-888.js → index-DMVktlxG.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-CVDi4rS9.js → index-DOww5Qny.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-Tg3yl8wc.js → index-DWPp-d07.js} +1 -1
  124. package/src/assets/web-panel/assets/index-DnjMFf3m.js +1 -0
  125. package/src/assets/web-panel/assets/{index-DVgTf7CZ.js → index-DvM2xBUA.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-SmQfEHjp.js → index-EK3XtMxA.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-C5dqieYX.js → index-XJIV7HEw.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-0200QxC4.js → index-cNwsev6n.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-C-aKWR2v.js → index-f_7L9GvP.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-KaSejHjf.js → index-lUL3bD2z.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CS3bOhV7.js → index-pOUFfRdN.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-CEOAZm5j.js → index-rGhS02f8.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-BMm8tO2X.js → index-vHtnQsnV.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-BHp1nSur.js → index-vb1XIxEB.js} +1 -1
  135. package/src/assets/web-panel/assets/{initDefaultProps-P8SBN6Di.js → initDefaultProps-DpRIjwTt.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-BubbjUT_.js → motion-CG4_9o-Z.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-Chcykv0I.js → move-Dku1fXtf.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-DyiYuGDu.js → mtc-parser-BvAVeX-3.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-Rdwb_Neb.js → omit-DFu0x78D.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-CCr0MYHl.js → pickAttrs-CmI-FNcK.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-B1ZXz3bb.js → placementArrow-CGERYewB.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-BGEdwej6.js → responsiveObserve-D7G8bF5J.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-CpnsUMaT.js → slide-B2sXwWXy.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-C7x-TVp_.js → statusUtils-DI5yh0n3.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-CC5k_791.js → styleChecker-deGJ5dp_.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-BpZFKsJW.js → useFlexGapSupport-OqHBXEmi.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-CVq5HySy.js → useFs-Dqgx0Qv_.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-BGkdLryu.js → usePersonalDataHub-Be-lveh2.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-uLtOUEK-.js → vnode-CFxB876W.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-BfVC9iUs.js → zoom-BFOYrl4e.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/command-help-index.json +3 -3
  153. package/src/commands/agent.js +8 -0
  154. package/src/commands/background-session.js +31 -3
  155. package/src/commands/chat.js +5 -1
  156. package/src/commands/eval.js +86 -28
  157. package/src/commands/llm.js +104 -1
  158. package/src/commands/plugin.js +130 -1
  159. package/src/commands/sandbox.js +121 -2
  160. package/src/commands/serve.js +11 -2
  161. package/src/commands/skill.js +29 -0
  162. package/src/data/changelog.json +13 -0
  163. package/src/gateways/ws/session-protocol.js +13 -0
  164. package/src/gateways/ws/ws-agent-handler.js +17 -0
  165. package/src/gateways/ws/ws-server.js +3 -0
  166. package/src/gateways/ws/ws-session-state.js +131 -0
  167. package/src/generated/cc-agent-protocol.schema.json +4 -0
  168. package/src/lazy-dispatch.js +8 -1
  169. package/src/lib/agent-sandbox.js +337 -53
  170. package/src/lib/app-server/cli-agent-kernel-adapter.js +28 -0
  171. package/src/lib/app-server/server.js +93 -0
  172. package/src/lib/background-agent-keeper-client.js +2 -0
  173. package/src/lib/background-agent-keeper-protocol.js +7 -0
  174. package/src/lib/background-agent-supervisor.js +194 -47
  175. package/src/lib/codex-app-server-adapter.js +81 -27
  176. package/src/lib/context-memory-kernel/durable-memory-port.js +31 -8
  177. package/src/lib/context-memory-kernel/provider-context.js +53 -19
  178. package/src/lib/deferred-question-context.js +122 -0
  179. package/src/lib/eval/evidence.js +202 -64
  180. package/src/lib/eval/plugin-suite.js +917 -0
  181. package/src/lib/eval/runner.js +10 -3
  182. package/src/lib/evolution/agent-evolution-runtime-composition.js +236 -1
  183. package/src/lib/evolution/agent-model-projection.js +97 -1
  184. package/src/lib/evolution/evidence-backed-wiki-maintainer.js +154 -1
  185. package/src/lib/evolution/evolution-artifact-ports.js +6 -0
  186. package/src/lib/evolution/evolution-deployment-loader.js +87 -3
  187. package/src/lib/evolution/evolution-eval-gate.js +8 -0
  188. package/src/lib/evolution/evolution-eval-runtime-composition.js +255 -0
  189. package/src/lib/evolution/evolution-evidence-artifact-adapter.js +58 -2
  190. package/src/lib/evolution/evolution-ledger-file-backend.js +23 -2
  191. package/src/lib/evolution/evolution-ledger-manifest-chain.js +223 -7
  192. package/src/lib/evolution/evolution-ledger-v2-journal.js +525 -0
  193. package/src/lib/evolution/evolution-ledger-v2-manifest-backend.js +46 -2
  194. package/src/lib/evolution/evolution-ledger.js +57 -1
  195. package/src/lib/evolution/evolution-run-ledger-adapter.js +93 -0
  196. package/src/lib/evolution/evolution-run-wiki-evidence-resolver.js +259 -0
  197. package/src/lib/evolution/governed-hub-llm.js +238 -5
  198. package/src/lib/evolution/governed-hub-resolver.js +82 -4
  199. package/src/lib/evolution/governed-hub-skill.js +11 -5
  200. package/src/lib/evolution/governed-skill-synthesis-provider-chat.js +10 -1
  201. package/src/lib/evolution/skill-runtime-revalidation-ledger-adapter.js +254 -0
  202. package/src/lib/evolution/skill-runtime-revalidation.js +530 -0
  203. package/src/lib/evolution/skill-target-matrix-eval.js +4 -4
  204. package/src/lib/evolution/wiki-evidence-commit-guard.js +366 -0
  205. package/src/lib/evolution/wiki-informed-skill-proposer.js +13 -1
  206. package/src/lib/goal-context.js +14 -5
  207. package/src/lib/interaction-adapter.js +166 -1
  208. package/src/lib/model-capabilities.js +271 -0
  209. package/src/lib/model-context-catalog.js +105 -0
  210. package/src/lib/model-context-window.js +4 -49
  211. package/src/lib/openai-responses.js +428 -0
  212. package/src/lib/plugin-runtime/scopes.js +7 -1
  213. package/src/lib/remote-read-loop-guard.js +2 -2
  214. package/src/lib/runtime-usage-ledger.js +16 -0
  215. package/src/lib/skill-loader.js +12 -0
  216. package/src/lib/with-file-lock.js +3 -1
  217. package/src/repl/agent-repl.js +5 -1
  218. package/src/runtime/agent-core.js +348 -23
  219. package/src/runtime/agent-runtime.js +7 -0
  220. package/src/runtime/coding-agent-contract-shared.cjs +13 -1
  221. package/src/runtime/headless-runner.js +4 -1
  222. package/src/runtime/headless-stream.js +133 -44
  223. package/src/runtime/runtime-factory.js +26 -2
  224. package/src/workers/background-agent-keeper.js +23 -13
  225. package/src/workers/background-agent-worker.js +27 -13
  226. package/src/assets/web-panel/assets/ChatBubbleRenderer-Bi2SY9E_.js +0 -1
  227. package/src/assets/web-panel/assets/EvolutionSettings-BqpG3XHV.js +0 -1
  228. package/src/assets/web-panel/assets/Notes-6F8EarNN.js +0 -7
  229. package/src/assets/web-panel/assets/OrderTableRenderer-gVgXQWdc.js +0 -1
  230. package/src/assets/web-panel/assets/devWarning-BtFLt3qI.js +0 -1
  231. package/src/assets/web-panel/assets/index-BhuWQHeG.js +0 -1
  232. 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
- const chat = identity.chat.bind(llm);
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 { createGovernedHubLlm } from "./governed-hub-llm.js";
2
+ import {
3
+ captureGovernedHubSdkPorts,
4
+ createGovernedHubLlm,
5
+ } from "./governed-hub-llm.js";
3
6
 
4
- export function createGovernedHubResolver(ports, factory) {
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
- const vector = await embeddingStage._embed(profileMessage.content);
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(hub.llm, factory, {
15
- onFailure(error) {
16
- failure = error;
17
- failed = true;
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({ provider, model, baseUrl, apiKey });
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();