chainlesschain 0.166.109 → 0.166.112

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 (206) hide show
  1. package/README.md +6 -4
  2. package/package.json +3 -2
  3. package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
  4. package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
  5. package/src/assets/web-panel/assets/{AIOps-DkrNbDzS.js → AIOps-sOceeExN.js} +1 -1
  6. package/src/assets/web-panel/assets/{ActionButton-DJjFXDhv.js → ActionButton-BQs-vRUr.js} +1 -1
  7. package/src/assets/web-panel/assets/{Analytics-DyUbagRn.js → Analytics-sfAHHMhA.js} +2 -2
  8. package/src/assets/web-panel/assets/{AppLayout-p7kJWSvn.js → AppLayout-0gAvE0c8.js} +4 -4
  9. package/src/assets/web-panel/assets/{Artifacts-C3rVh4Ak.js → Artifacts-Dh9s2Qmd.js} +1 -1
  10. package/src/assets/web-panel/assets/{Audit-Bch_L_YO.js → Audit-CITm26SU.js} +1 -1
  11. package/src/assets/web-panel/assets/{BackgroundAgents-BNHy8zP6.js → BackgroundAgents-BiMbBOh0.js} +1 -1
  12. package/src/assets/web-panel/assets/{Backup-BUaye_Ys.js → Backup-CNpnhI3h.js} +1 -1
  13. package/src/assets/web-panel/assets/{BaseInput-D49mzAVz.js → BaseInput-BI_lltkp.js} +1 -1
  14. package/src/assets/web-panel/assets/{Chat-2MDzM_us.js → Chat-BgfB88xY.js} +5 -5
  15. package/src/assets/web-panel/assets/ChatBubbleRenderer-BDP3fGoz.js +1 -0
  16. package/src/assets/web-panel/assets/{Checkbox-5p1T_KEq.js → Checkbox-4xy9rS3j.js} +1 -1
  17. package/src/assets/web-panel/assets/{Codegen-TKtiLaoZ.js → Codegen-D93h9ihS.js} +1 -1
  18. package/src/assets/web-panel/assets/{Col-BVCMG9mS.js → Col-BRf3STY-.js} +1 -1
  19. package/src/assets/web-panel/assets/{Community-D09-QczH.js → Community-f187ziSL.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compact-QuRMCnj7.js → Compact-D4hXWuo1.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compliance-CN0PV7fk.js → Compliance-C6cYKI6H.js} +1 -1
  22. package/src/assets/web-panel/assets/{Cowork-5N2zhAty.js → Cowork-C1i1f8LD.js} +2 -2
  23. package/src/assets/web-panel/assets/{Cron-BxT8UZ0S.js → Cron-BacCE4LA.js} +2 -2
  24. package/src/assets/web-panel/assets/{Crosschain-Dp-noQl4.js → Crosschain-DXztxOoH.js} +1 -1
  25. package/src/assets/web-panel/assets/{DID-B7MZFkjG.js → DID-rpf4HN8x.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dashboard-DulJ3rKV.js → Dashboard-h4bgtH7L.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dropdown-DV4ov4zF.js → Dropdown-CyQnoHmu.js} +1 -1
  28. package/src/assets/web-panel/assets/{EmailListRenderer-DB2-ooz6.js → EmailListRenderer-FCtp4AcB.js} +1 -1
  29. package/src/assets/web-panel/assets/{EvolutionSettings-B1Rb6p7q.js → EvolutionSettings-JbISHTWR.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-U8aHayx-.js → FamilyGuardDashboard-DCIQLyfK.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-BkQULBHY.js → Federation-DDbFpwja.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-CtviG260.js → FormItemContext-CXF0jtXb.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-DnPirB24.js → GenericCardRenderer-CUaNfAM0.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-CK57Oro6.js → Git-Bhoz2gDf.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-DbI-LB8-.js → Governance-FiiXHe8e.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-sEG4T1Jg.js → Inference-brpTW2Q3.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-9SLJR3h9.js → KnowledgeGraph-BCWP-f6k.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-BIZYcISQ.js → Logs-CxYcduoK.js} +2 -2
  39. package/src/assets/web-panel/assets/MarkdownRenderer-12vD1nC1.js +1 -0
  40. package/src/assets/web-panel/assets/{Marketplace-CRmLLwAE.js → Marketplace-DANdmW7l.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-DkOFkSO1.js → McpTools-Bi_EKkb5.js} +3 -3
  42. package/src/assets/web-panel/assets/{Memory-M29Kd9TU.js → Memory-DecoMbYw.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-Tl6JvPw_.js → MobileBridge-DrOhFKp0.js} +1 -1
  44. package/src/assets/web-panel/assets/MobileProjects-rRwP16dN.js +1 -0
  45. package/src/assets/web-panel/assets/{Mtc-DkUjX1F5.js → Mtc-SLPII1iw.js} +2 -2
  46. package/src/assets/web-panel/assets/{MtcAudit-BCqr1I4q.js → MtcAudit-DWoVORYy.js} +2 -2
  47. package/src/assets/web-panel/assets/{Multisig-DmoqYGQ5.js → Multisig-Dxpnmq-m.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-DNRQeRke.js → NLProgramming-kNTpNqCP.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-CQSBeiY6.js → Notes-D1uXCfVd.js} +3 -3
  50. package/src/assets/web-panel/assets/{NotificationSettings-gNY9bbH6.js → NotificationSettings-D3Qt8Gkl.js} +1 -1
  51. package/src/assets/web-panel/assets/{OrderTableRenderer-DW0CNjh8.js → OrderTableRenderer-qvaah2-m.js} +1 -1
  52. package/src/assets/web-panel/assets/{Organization-CthnbKag.js → Organization-EhRl4JoJ.js} +4 -4
  53. package/src/assets/web-panel/assets/{Overflow-_GQ3sbXu.js → Overflow-BTt5C_5W.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-BTr7ea6W.js → P2P-CeR2jyb0.js} +2 -2
  55. package/src/assets/web-panel/assets/PdhVaultBrowser-BzD3OHWq.js +7 -0
  56. package/src/assets/web-panel/assets/{Permissions-DMny2Cjs.js → Permissions-BOPyeRlz.js} +3 -3
  57. package/src/assets/web-panel/assets/{PersonalDataHub-CyYlMSoI.js → PersonalDataHub-DcmNNsfO.js} +4 -4
  58. package/src/assets/web-panel/assets/{Pipeline-FASu2Oc4.js → Pipeline-DuL3kwWC.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-9bC5FnsJ.js → Privacy-CkQRdlSU.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-BOYZwB5G.js → ProjectInit-moE_vQ1P.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-45DViNG-.js → ProjectSettings-PnTWi4NQ.js} +2 -2
  62. package/src/assets/web-panel/assets/{Projects-C2fZzMZc.js → Projects-DZvbT3D7.js} +1 -1
  63. package/src/assets/web-panel/assets/{Providers-BgjvZx9F.js → Providers-CkcrHYy9.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-Brw-3csB.js → QrScannerModal-nYNFGf_H.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-DWG-A5zB.js → QuickAsk-53WNo7xT.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-DuQGxjIR.js → Recommend-CmYN_NaS.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-T1cdSSRL.js → RemoteSession-BuOdNEjA.js} +2 -2
  68. package/src/assets/web-panel/assets/{Reputation-9FT2dI4G.js → Reputation-BgkheZou.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-yNIbNftX.js → Row-DvA3klj1.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-BIchNoPd.js → RssFeed-CgkIL3PG.js} +3 -3
  71. package/src/assets/web-panel/assets/{Search-msDJ8UTZ.js → Search-Cv2twJdL.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-DE46oBYT.js → Security-XrD2UNU6.js} +2 -2
  73. package/src/assets/web-panel/assets/{Services-Dori7vc3.js → Services-LujCntCK.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-D3O3sUFz.js → Skeleton-ZZCOsxPX.js} +1 -1
  75. package/src/assets/web-panel/assets/{Skills-BV0ct8SO.js → Skills-BEXGkOrU.js} +1 -1
  76. package/src/assets/web-panel/assets/{Sla-DflIVOrh.js → Sla-CIqmCgdD.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-Cpbv2Zz6.js → SpeechSettings-DkVbwJox.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-Dgg6-wbe.js → SyncSettings-BVGgUs0p.js} +2 -2
  79. package/src/assets/web-panel/assets/{Tasks-Cb6e4Klx.js → Tasks-C1lh68l5.js} +1 -1
  80. package/src/assets/web-panel/assets/{Templates-GfdAATGz.js → Templates-BG4zNAFx.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-D0gecLXl.js → Tenant-t2o6i5fY.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-BFRPJt-0.js → Terminal-CH8UDdVO.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-BobtChxX.js → TimelineRenderer-B5sYY1IO.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-CifeZtHV.js → Tokens-D0y7QkG5.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-BHBvbBCf.js → Trigger-BA2nKko0.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-6lvqjKYp.js → Trust-CrFKCQIs.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-CqzMc-G5.js → UkeySign-B3x_-Zun.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-OIiRG582.js → VideoEditing-TEwxbLH6.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-4MeKq0q_.js → Wallet-Larp5rrt.js} +2 -2
  90. package/src/assets/web-panel/assets/{WebAuthn-eHBRjGQG.js → WebAuthn-DfWbEIZe.js} +4 -4
  91. package/src/assets/web-panel/assets/{WorkflowEditor-DlzYdEqW.js → WorkflowEditor-8LKiKExY.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-CBcjOzkX.js → chat-ByxYOvYW.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-zgwsYQSa.js → colors-Dh4yAClh.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-Dcd9H5Bn.js → compact-item-f5n2j1WZ.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-DR1tO-8r.js → createContext-DIprYuXL.js} +1 -1
  96. package/src/assets/web-panel/assets/devWarning-DRIge35Z.js +1 -0
  97. package/src/assets/web-panel/assets/{hasIn-CtfbUH_p.js → hasIn-CvYeap2I.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-D1GxtY-h.js → index-3ROY-lYB.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-CT7zIkqP.js → index-6VEWxOyC.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-Cdhy5ckh.js → index-7eG1J-GT.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DvPOpvvH.js → index-B0AXUhiJ.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-Cur8LNNn.js → index-BS_dpgzu.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DWG98orp.js → index-BaXSBxy-.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-C5XGvJb0.js → index-Bk8oWRk6.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-DA2-Bhy8.js → index-BlImvgb7.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CwHgaYVH.js → index-BoayvJ48.js} +1 -1
  107. package/src/assets/web-panel/assets/index-Bq24rTYx.js +1 -0
  108. package/src/assets/web-panel/assets/{index-DHEiuvhA.js → index-BsU46c7D.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-DSvcz0RO.js → index-BvyFQF8I.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-D7ZOiIKb.js → index-C2RGykST.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CmzQzTY5.js → index-C5aH2Pj2.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-oWOlF7CM.js → index-CD0s5ESV.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-DVpp9YSQ.js → index-CIZQtz8G.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-DWuCGhHa.js → index-CJjc8ObW.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-JSfldpw4.js → index-CTqJNul4.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-dvF6C39V.js → index-CcvA1nae.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-CmVIM-m2.js → index-CpR0zD38.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CaGNqkY0.js → index-CzabQZ7I.js} +1 -1
  119. package/src/assets/web-panel/assets/index-D2f18WsK.js +1 -0
  120. package/src/assets/web-panel/assets/{index-BXfGHUz_.js → index-DGyTzElU.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-LN7Hkl1C.js → index-DI8jC7gQ.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DfzOYmOj.js → index-DUj-sL9U.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-BoxowMYS.js → index-DaZVtafQ.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CSQCHpDo.js → index-DjvON8oh.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-B3QUK1ks.js → index-DlJCDpeN.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-J-ORW1i6.js → index-DlTwZIeX.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-z8lrkcb-.js → index-DlULGx8u.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-hTcre7U9.js → index-DmcAL4hd.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DYPMJ5Mb.js → index-DshB3-Up.js} +3 -3
  130. package/src/assets/web-panel/assets/{index-5XaB_Tjg.js → index-Du435yzt.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-C0kP88Pb.js → index-bt-0zMmH.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-D8WPohye.js → index-c_CxUQl3.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-DeAi4CNt.js → index-fpWv4u3Z.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-BndPtS9D.js → index-hwbaD3Nk.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-DTx4FyLU.js → index-uDiVjYrS.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-CPLLgPxA.js → index-xU0eHLIH.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-CVMtDrWZ.js → initDefaultProps-DRuE92W6.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-Dye3IU8k.js → motion-6Sgma5Vd.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-C251Zo34.js → move-BbQsH8sb.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-BDiOORoQ.js → mtc-parser-BdC4INal.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-DTDA_RHv.js → omit-DeC5m_bi.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-CqEUTPcT.js → pickAttrs-DuehpBws.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-BOB8QWH3.js → placementArrow-CJEhv2ij.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-CZDXP1d9.js → responsiveObserve-Dyw3lDGr.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-DPaRw3E9.js → slide-BMaLXTbS.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-Ba9d7XZ7.js → statusUtils-c1K_SdJH.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-mZKU3lvW.js → styleChecker-CefBry8k.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-VcauLq0M.js → useFlexGapSupport-Dj2IsZpo.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-Cal9KRcx.js → useFs-RLfB3yqb.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-DISoRyQB.js → usePersonalDataHub-DbRVH_NA.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-B58C6w6B.js → vnode-DTn_QVJz.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-BPlBAMKB.js → zoom-DuFR0E7i.js} +1 -1
  153. package/src/assets/web-panel/index.html +1 -1
  154. package/src/command-help-index.json +1 -1
  155. package/src/commands/agent.js +12 -5
  156. package/src/commands/ask.js +96 -21
  157. package/src/commands/complete.js +14 -10
  158. package/src/commands/llm.js +23 -41
  159. package/src/commands/session.js +2 -2
  160. package/src/commands/stream.js +9 -5
  161. package/src/commands/ui.js +30 -2
  162. package/src/data/changelog.json +39 -0
  163. package/src/gateways/ws/llm-chat-protocol.js +18 -10
  164. package/src/gateways/ws/llm-creds.js +29 -79
  165. package/src/gateways/ws/ws-agent-handler.js +1 -1
  166. package/src/gateways/ws/ws-session-gateway.js +26 -12
  167. package/src/lib/__tests__/provider-stream.test.js +70 -4
  168. package/src/lib/chat-core.js +186 -24
  169. package/src/lib/cowork-adapter.js +29 -15
  170. package/src/lib/evolution/agent-evolution-runtime-composition.js +10 -7
  171. package/src/lib/evolution/evolution-deployment-config.js +27 -4
  172. package/src/lib/evolution/evolution-deployment-loader.js +58 -3
  173. package/src/lib/evolution/evolution-deployment-profile.js +2 -2
  174. package/src/lib/evolution/evolution-evidence-projector.js +18 -3
  175. package/src/lib/evolution/evolution-file-witness.js +10 -0
  176. package/src/lib/evolution/evolution-ledger.js +237 -28
  177. package/src/lib/evolution/evolution-windows-directory-durability.js +322 -0
  178. package/src/lib/evolution/governed-hub-llm.js +2 -1
  179. package/src/lib/evolution/governed-model-turn.js +4 -1
  180. package/src/lib/evolution/local-ui-evolution-deployment.js +682 -0
  181. package/src/lib/evolution/local-ui-evolution-host.mjs +26 -0
  182. package/src/lib/evolution/local-ui-evolution-runtime.js +601 -0
  183. package/src/lib/evolution/opaque-hex-id.js +28 -0
  184. package/src/lib/hub-llm-client.js +22 -14
  185. package/src/lib/image-input.js +19 -3
  186. package/src/lib/llm-config-defaults.js +19 -30
  187. package/src/lib/llm-connection-config.js +4 -0
  188. package/src/lib/llm-connection-probe.js +5 -1
  189. package/src/lib/llm-connection-resolution.js +94 -0
  190. package/src/lib/llm-providers.js +33 -11
  191. package/src/lib/ollama-base-url.js +14 -0
  192. package/src/lib/provider-protocol.js +104 -0
  193. package/src/lib/provider-stream.js +163 -4
  194. package/src/lib/runnable-provider.js +1 -0
  195. package/src/repl/chat-repl.js +58 -11
  196. package/src/runtime/agent-core.js +26 -43
  197. package/src/runtime/headless-runner.js +11 -4
  198. package/src/runtime/headless-stream.js +10 -4
  199. package/src/runtime/policies/agent-policy.js +17 -11
  200. package/src/assets/web-panel/assets/ChatBubbleRenderer-DOX3Y5EJ.js +0 -1
  201. package/src/assets/web-panel/assets/MarkdownRenderer-9nfWupWP.js +0 -1
  202. package/src/assets/web-panel/assets/MobileProjects-Bq-FPDzS.js +0 -1
  203. package/src/assets/web-panel/assets/PdhVaultBrowser-D9McHF9I.js +0 -7
  204. package/src/assets/web-panel/assets/devWarning-DYhpRtve.js +0 -1
  205. package/src/assets/web-panel/assets/index-DPJXFIY7.js +0 -1
  206. package/src/assets/web-panel/assets/index-DjBhR5M_.js +0 -1
@@ -22,6 +22,7 @@ import { EvolutionRunLedgerAdapter } from "./evolution-run-ledger-adapter.js";
22
22
  import { createEvolutionRunWikiEvidenceResolver } from "./evolution-run-wiki-evidence-resolver.js";
23
23
  import { WikiMaintainerLedgerAdapter } from "./wiki-maintainer-ledger-adapter.js";
24
24
  import { EvidenceBackedWikiMaintainer } from "./evidence-backed-wiki-maintainer.js";
25
+ import { ensureDirectoryTreeDurable } from "./evolution-windows-directory-durability.js";
25
26
  import { createWikiEvidenceCommitGuard } from "./wiki-evidence-commit-guard.js";
26
27
  import { EvolutionWorkbenchMetricsLedgerAdapter } from "./evolution-workbench-metrics-ledger-adapter.js";
27
28
  import { EvolutionReleaseTrainLedgerAdapter } from "./evolution-release-train-ledger-adapter.js";
@@ -158,7 +159,7 @@ function normalizeClock(clock) {
158
159
  });
159
160
  }
160
161
 
161
- function layout(stateRootDir, tenantId, runId, initialize = true) {
162
+ function layout(stateRootDir, tenantId, runId, initialize = true, fsImpl = fs) {
162
163
  if (typeof stateRootDir !== "string" || stateRootDir.trim() === "") {
163
164
  throw new TypeError("stateRootDir is required");
164
165
  }
@@ -176,11 +177,12 @@ function layout(stateRootDir, tenantId, runId, initialize = true) {
176
177
  ledgerAuthorityRootDir: path.join(scope, "ledger-authority"),
177
178
  witnessFilePath: path.join(scope, "witness", "checkpoint.json"),
178
179
  });
179
- if (initialize)
180
- fs.mkdirSync(path.dirname(result.witnessFilePath), {
181
- recursive: true,
182
- mode: 0o700,
183
- });
180
+ if (initialize) {
181
+ ensureDirectoryTreeDurable(
182
+ fsImpl,
183
+ path.dirname(result.witnessFilePath),
184
+ );
185
+ }
184
186
  return result;
185
187
  }
186
188
 
@@ -408,7 +410,7 @@ export function createAgentEvolutionRuntimeComposition({
408
410
  capture(authorities.witness?.signer, "sign", "witness signer");
409
411
  capture(authorities.witness?.verifier, "verify", "witness verifier");
410
412
  assertIndependentSigningAuthorities(authorities.ledger, authorities.witness);
411
- const storage = layout(stateRootDir, tenantId, runId);
413
+ const storage = layout(stateRootDir, tenantId, runId, true, fsImpl ?? fs);
412
414
  const artifactPorts = new EvolutionArtifactPorts({
413
415
  tenantId,
414
416
  audience,
@@ -712,6 +714,7 @@ export function createAgentEvolutionRuntimeComposition({
712
714
  tenantId,
713
715
  sourceRunId,
714
716
  false,
717
+ fsImpl ?? fs,
715
718
  );
716
719
  if (!fs.existsSync(sourceStorage.witnessFilePath))
717
720
  throw new Error("Cache source Run witness does not exist");
@@ -103,6 +103,9 @@ function withDeploymentReadiness(status) {
103
103
  return Object.freeze({
104
104
  ...status,
105
105
  readiness: Object.freeze({
106
+ ui: assessEvolutionDeploymentReadiness(status, {
107
+ requiredCommands: ["ui"],
108
+ }),
106
109
  ask: assessEvolutionDeploymentReadiness(status, {
107
110
  requiredCommands: ["ask"],
108
111
  }),
@@ -197,6 +200,13 @@ export async function configureEvolutionDeployment(
197
200
  options,
198
201
  );
199
202
  updateEvolutionDeploymentProfile((current) => {
203
+ if (options.expectedProfileAbsent === true && current) {
204
+ const error = new Error(
205
+ "Evolution deployment profile was configured during local initialization",
206
+ );
207
+ error.code = "EVOLUTION_DEPLOYMENT_PROFILE_ALREADY_CONFIGURED";
208
+ throw error;
209
+ }
200
210
  if (
201
211
  current?.activeTrustRootDigest &&
202
212
  current.activeTrustRootDigest !== verified.descriptor.trustRootDigest
@@ -245,6 +255,11 @@ export async function configureEvolutionDeployment(
245
255
  verified.descriptor.revision,
246
256
  ),
247
257
  };
258
+ const preserveLocalMode =
259
+ deploymentMode === undefined &&
260
+ current?.deploymentMode === "local" &&
261
+ current.descriptorPath === verified.descriptorPath &&
262
+ current.trustRootPath === verified.trustRootPath;
248
263
  const preserveTestMode =
249
264
  deploymentMode === undefined &&
250
265
  current?.deploymentMode === "test" &&
@@ -257,10 +272,18 @@ export async function configureEvolutionDeployment(
257
272
  revisionFloors,
258
273
  activeTrustRootDigest: verified.descriptor.trustRootDigest,
259
274
  revokedDescriptorRevisions,
260
- deploymentMode: preserveTestMode ? "test" : deploymentMode || "managed",
261
- testPrivateKeyPath: preserveTestMode
262
- ? current.testPrivateKeyPath
263
- : testPrivateKeyPath || null,
275
+ deploymentMode:
276
+ preserveLocalMode
277
+ ? "local"
278
+ : preserveTestMode
279
+ ? "test"
280
+ : deploymentMode || "managed",
281
+ testPrivateKeyPath:
282
+ deploymentMode === "test"
283
+ ? testPrivateKeyPath || null
284
+ : preserveTestMode
285
+ ? current.testPrivateKeyPath
286
+ : null,
264
287
  };
265
288
  }, options);
266
289
  return getEvolutionDeploymentStatus(options);
@@ -1,6 +1,6 @@
1
1
  import { createHash, createPublicKey, verify } from "node:crypto";
2
2
  import { readFile, realpath } from "node:fs/promises";
3
- import { isAbsolute } from "node:path";
3
+ import { dirname, isAbsolute, join } from "node:path";
4
4
  import { types as utilTypes } from "node:util";
5
5
  import {
6
6
  assertEvolutionDeploymentActiveTrustRoot,
@@ -840,6 +840,15 @@ function bindFactoriesToModule(factories, moduleDigest) {
840
840
  return factories[name](options);
841
841
  };
842
842
  }
843
+ if (typeof factories.createLocalUiEvolutionComposition === "function") {
844
+ result.createLocalUiEvolutionComposition = (options = {}) => {
845
+ if (options?.handlerArtifactDigest !== moduleDigest)
846
+ throw new Error(
847
+ "Local UI Evolution host digest must equal the authenticated deployment module digest",
848
+ );
849
+ return factories.createLocalUiEvolutionComposition(options);
850
+ };
851
+ }
843
852
  for (const name of [
844
853
  "createSkillEvaluatedPromotionProvider",
845
854
  "createSkillPromotionReviewProvider",
@@ -1012,19 +1021,32 @@ export async function loadEvolutionDeploymentCommandDependencies(
1012
1021
  commandName,
1013
1022
  {
1014
1023
  env = process.env,
1024
+ cwd = process.cwd(),
1015
1025
  read = readFile,
1016
1026
  resolveRealPath = realpath,
1017
1027
  importModule = (url) => import(url),
1018
1028
  additionalFactories = {},
1029
+ initializeDefaultLocalUi = false,
1019
1030
  } = {},
1020
1031
  ) {
1021
1032
  if (!SUPPORTED_COMMANDS.has(commandName)) return null;
1022
1033
  let descriptorPath = env.CHAINLESSCHAIN_EVOLUTION_DEPLOYMENT_DESCRIPTOR;
1023
1034
  let trustRootPath = env.CHAINLESSCHAIN_EVOLUTION_DEPLOYMENT_TRUST_ROOT;
1035
+ if (
1036
+ initializeDefaultLocalUi === true &&
1037
+ commandName === "ui" &&
1038
+ !descriptorPath &&
1039
+ !trustRootPath
1040
+ ) {
1041
+ const { initializeDefaultLocalUiEvolutionDeployment } = await import(
1042
+ "./local-ui-evolution-deployment.js"
1043
+ );
1044
+ await initializeDefaultLocalUiEvolutionDeployment({ env, cwd });
1045
+ }
1024
1046
  let fromSavedProfile = false;
1025
1047
  let saved = null;
1026
1048
  if (!descriptorPath && !trustRootPath) {
1027
- saved = await readEvolutionDeploymentProfile({ env });
1049
+ saved = await readEvolutionDeploymentProfile({ env, cwd });
1028
1050
  if (saved.error) {
1029
1051
  return deniedAgentDependencies(
1030
1052
  commandName,
@@ -1086,6 +1108,23 @@ export async function loadEvolutionDeploymentCommandDependencies(
1086
1108
  throw error;
1087
1109
  }
1088
1110
  const { descriptor, moduleBytes } = verified;
1111
+ const localProfile =
1112
+ fromSavedProfile && saved.profile.deploymentMode === "local";
1113
+ if (localProfile) {
1114
+ const localHostPath = join(
1115
+ dirname(saved.filePath),
1116
+ "local-ui-host",
1117
+ "ui-host.mjs",
1118
+ );
1119
+ const canonicalLocalHostPath = await realpath(localHostPath);
1120
+ if (
1121
+ descriptor.commands.length !== 1 ||
1122
+ descriptor.commands[0] !== "ui" ||
1123
+ verified.modulePath !== canonicalLocalHostPath
1124
+ ) {
1125
+ throw new Error("Local Evolution deployment is not the protected UI host");
1126
+ }
1127
+ }
1089
1128
  if (!descriptor.commands.includes(commandName)) {
1090
1129
  return deniedAgentDependencies(
1091
1130
  commandName,
@@ -1105,8 +1144,24 @@ export async function loadEvolutionDeploymentCommandDependencies(
1105
1144
  throw new Error(
1106
1145
  "evolution deployment module must export createChainlessChainCommandDependencies",
1107
1146
  );
1147
+ const builtIn = await loadBuiltInFactories(commandName);
1148
+ let localFactories = null;
1149
+ if (localProfile) {
1150
+ const { createLocalUiEvolutionComposition } = await import(
1151
+ "./local-ui-evolution-runtime.js"
1152
+ );
1153
+ localFactories = {
1154
+ createLocalUiEvolutionComposition: (options = {}) =>
1155
+ createLocalUiEvolutionComposition({
1156
+ ...options,
1157
+ localDirectory: join(dirname(saved.filePath), "local-ui-host"),
1158
+ env,
1159
+ cwd,
1160
+ }),
1161
+ };
1162
+ }
1108
1163
  const builtInFactories = bindFactoriesToModule(
1109
- await loadBuiltInFactories(commandName),
1164
+ { ...builtIn, ...(localFactories || {}) },
1110
1165
  descriptor.moduleDigest,
1111
1166
  );
1112
1167
  if (
@@ -124,7 +124,7 @@ function normalizeProfile(value) {
124
124
  const deploymentMode = beforeDeploymentMode
125
125
  ? "managed"
126
126
  : value.deploymentMode;
127
- if (!["managed", "test"].includes(deploymentMode))
127
+ if (!["managed", "test", "local"].includes(deploymentMode))
128
128
  throw new TypeError("evolution deployment profile mode is invalid");
129
129
  const testPrivateKeyPath = beforeDeploymentMode
130
130
  ? null
@@ -133,7 +133,7 @@ function normalizeProfile(value) {
133
133
  (deploymentMode === "test" &&
134
134
  (typeof testPrivateKeyPath !== "string" ||
135
135
  !isAbsolute(testPrivateKeyPath))) ||
136
- (deploymentMode === "managed" && testPrivateKeyPath !== null)
136
+ (deploymentMode !== "test" && testPrivateKeyPath !== null)
137
137
  ) {
138
138
  throw new TypeError(
139
139
  "evolution deployment profile test private key path is invalid",
@@ -20,6 +20,7 @@ import {
20
20
  EVIDENCE_JSON_POLICY,
21
21
  isAgentToolArgumentsPath,
22
22
  } from "./evidence-json-text.js";
23
+ import { formatLocalUiTenantReferenceId } from "./opaque-hex-id.js";
23
24
 
24
25
  export const EVOLUTION_SOURCE_VERIFICATION_SCHEMA =
25
26
  "chainlesschain.evolution-source-verification/v1";
@@ -89,6 +90,9 @@ const SOURCE_SCHEMES = new Set(["rollout", "tool", "outcome", "recording"]);
89
90
  const SOURCE_COMMITMENT_PURPOSE = "chainlesschain.evolution-source-payload/v1";
90
91
  const TRUSTED_PAYLOAD_COMMITMENT_PURPOSE =
91
92
  "chainlesschain.evolution-trusted-payload/v1";
93
+ const LEGACY_LOCAL_UI_TENANT_ID_PATTERN = /^local-ui-[a-f0-9]{32}$/u;
94
+ const FORMATTED_LOCAL_UI_TENANT_ID_PATTERN =
95
+ /^local-ui-(?:[a-f0-9]{8}-){3}[a-f0-9]{8}$/u;
92
96
 
93
97
  const INPUT_KEYS = new Set(["sourceEnvelope", "payload"]);
94
98
  const SOURCE_VERIFICATION_KEYS = new Set([
@@ -873,6 +877,17 @@ function normalizeId(value, label, maximum = 256) {
873
877
  return value;
874
878
  }
875
879
 
880
+ function normalizeTenantId(value, label) {
881
+ if (
882
+ typeof value === "string" &&
883
+ (LEGACY_LOCAL_UI_TENANT_ID_PATTERN.test(value) ||
884
+ FORMATTED_LOCAL_UI_TENANT_ID_PATTERN.test(value))
885
+ ) {
886
+ return value;
887
+ }
888
+ return normalizeId(value, label);
889
+ }
890
+
876
891
  function normalizeDigest(
877
892
  value,
878
893
  label,
@@ -970,7 +985,7 @@ function normalizeOpaqueUri(value, { label, schemes, tenantId }) {
970
985
  parsed.port ||
971
986
  parsed.search ||
972
987
  parsed.hash ||
973
- parsed.hostname !== tenantId ||
988
+ parsed.hostname !== formatLocalUiTenantReferenceId(tenantId) ||
974
989
  !decodedPath.startsWith("/") ||
975
990
  decodedPath
976
991
  .split("/")
@@ -1635,7 +1650,7 @@ function validateSourceVerification(
1635
1650
  { failures },
1636
1651
  );
1637
1652
  }
1638
- const tenantId = normalizeId(value.tenantId, "source tenantId");
1653
+ const tenantId = normalizeTenantId(value.tenantId, "source tenantId");
1639
1654
  const principalId = normalizeId(value.principalId, "source principalId");
1640
1655
  const sourceRef = normalizeOpaqueUri(value.sourceRef, {
1641
1656
  label: "sourceRef",
@@ -2737,7 +2752,7 @@ function validateRawMetadata(raw, receipt) {
2737
2752
  }
2738
2753
  const createdAtMs = new Date(createdAt).getTime();
2739
2754
  normalizeId(raw.evidenceId, "Raw evidenceId");
2740
- normalizeId(raw.tenantId, "Raw tenantId");
2755
+ normalizeTenantId(raw.tenantId, "Raw tenantId");
2741
2756
  normalizeId(raw.principalId, "Raw principalId");
2742
2757
  normalizeOpaqueUri(raw.sourceRef, {
2743
2758
  label: "Raw sourceRef",
@@ -685,6 +685,16 @@ export function createEvolutionFileWitness({
685
685
  };
686
686
 
687
687
  const syncDirectory = (directoryPath = directory) => {
688
+ const directorySync = Object.getOwnPropertyDescriptor(
689
+ fsImpl,
690
+ "syncDirectorySync",
691
+ );
692
+ if (directorySync) {
693
+ if (typeof directorySync.value !== "function") {
694
+ throw new Error("syncDirectorySync must be a data function");
695
+ }
696
+ return Reflect.apply(directorySync.value, fsImpl, [directoryPath]);
697
+ }
688
698
  let descriptor;
689
699
  try {
690
700
  descriptor = fsImpl.openSync(directoryPath, "r");