chainlesschain 0.166.20 → 0.166.22

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 (222) hide show
  1. package/README.md +67 -9
  2. package/package.json +2 -2
  3. package/src/assets/web-panel/assets/{AIOps-CcJst5Zs.js → AIOps-oJ7USzMC.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-BpHPFKd3.js → ActionButton-BlgnZe_C.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-DHAsASuS.js → Analytics-D2rRbTLu.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-BTKwo5RC.js → AppLayout-FwS3f0B2.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-BcCBTggA.js → Artifacts-iF-_08Hi.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-z1JvJYbT.js → Audit-D24p0zQw.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-CJ7DCMDR.js → BackgroundAgents-Cg3mRVi9.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-CKpxw4uw.js → Backup-EOqht3H-.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-2jI_IlUB.js → BaseInput-9XWYq2hj.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-C_4RfBeN.js → Chat-Dq5yardA.js} +5 -5
  13. package/src/assets/web-panel/assets/ChatBubbleRenderer-Ds3pA-ET.js +1 -0
  14. package/src/assets/web-panel/assets/{Checkbox-BnF4z4N1.js → Checkbox-CuyCBoBf.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-m_LMamhM.js → Codegen-DjWtYHNe.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-DzMbA760.js → Col-CrVr_iuG.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-SScuZUcW.js → Community-C6QxpfGc.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-CiOHRvwQ.js → Compact-B-v5r6Pa.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-97FzYz-6.js → Compliance-zNiLiFgD.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-C0ss-SRl.js → Cowork-D9K7lMOu.js} +2 -2
  21. package/src/assets/web-panel/assets/{Cron-CCbdc9fp.js → Cron-DAjO36z4.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-BPnabXej.js → Crosschain-Bxqn0aqB.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-B65hFnHs.js → DID-DfRmLUe-.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-B6qR_TF2.js → Dashboard-Cz8KF3fr.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-6c-2Fxm-.js → Dropdown-C4oVfkP0.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-GD57mfiz.js → EmailListRenderer-ivyZKN8k.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-B2mxG6LN.js → FamilyGuardDashboard-DoxY1CPW.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-cZS-uvAo.js → Federation-C93gZxnb.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-UbSfBIe1.js → FormItemContext-D_lEjYJE.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-BMAtvGt1.js → GenericCardRenderer-BNFN9YjN.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-DAlhOiDA.js → Git-mUu2HcLI.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-B-RRVaP8.js → Governance-CNuosrge.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-DBl-pXYR.js → Inference-DwY5pbCB.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-DjqOkvgY.js → KnowledgeGraph-aRUxhACD.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-CEV7AEAD.js → Logs-DFfsWYy_.js} +2 -2
  36. package/src/assets/web-panel/assets/{MarkdownRenderer-BDCxa4d1.js → MarkdownRenderer-DqTx7_u1.js} +1 -1
  37. package/src/assets/web-panel/assets/{Marketplace-oRjzfmYJ.js → Marketplace-COI-ciM-.js} +1 -1
  38. package/src/assets/web-panel/assets/{McpTools-BiTnznLw.js → McpTools-BJJwaIpe.js} +3 -3
  39. package/src/assets/web-panel/assets/{Memory-DR0C5K4N.js → Memory-CDO6SGDZ.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge--oR8wEcp.js → MobileBridge-BlZ5tFf4.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-DKqpYMuG.js → MobileProjects-DuoxbgWz.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-Dg0D6fDQ.js → Mtc-6ec9j70b.js} +2 -2
  43. package/src/assets/web-panel/assets/{MtcAudit-D4_-yWTK.js → MtcAudit-BuL7HkC7.js} +5 -5
  44. package/src/assets/web-panel/assets/{Multisig-Coz55FxA.js → Multisig-CJxR85lk.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-BWVjgW9Y.js → NLProgramming-B71O1S4l.js} +1 -1
  46. package/src/assets/web-panel/assets/{Notes-BflVuGwr.js → Notes-Bsw5zbpV.js} +3 -3
  47. package/src/assets/web-panel/assets/{NotificationSettings-CT0F_dJ7.js → NotificationSettings-BnAhXuK_.js} +1 -1
  48. package/src/assets/web-panel/assets/{OrderTableRenderer-Dyrnqy_o.js → OrderTableRenderer-BJ0R5GGz.js} +1 -1
  49. package/src/assets/web-panel/assets/{Organization-CMDTM2z5.js → Organization-B7wwNxoP.js} +2 -2
  50. package/src/assets/web-panel/assets/{Overflow-acKvvYpC.js → Overflow-CfAGr0gM.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-CRq5j9Ax.js → P2P-KhMg22Fz.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser-DmtzN6Kn.js → PdhVaultBrowser-NdAXI9ft.js} +4 -4
  53. package/src/assets/web-panel/assets/{Permissions-SZ-kjJDa.js → Permissions-CIYjqyT7.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-DXh-ZfgJ.js → PersonalDataHub-D2ht3P_R.js} +6 -6
  55. package/src/assets/web-panel/assets/{Pipeline-DhBU9ftP.js → Pipeline-i6flZW1m.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-BgEXpO_V.js → Privacy-DE0lhYVc.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-B2DJ-dmK.js → ProjectInit-BL3YbyxS.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-ve3SocWc.js → ProjectSettings-CEtdg7ni.js} +2 -2
  59. package/src/assets/web-panel/assets/{Projects-5ZvFasSJ.js → Projects-CvtU5peJ.js} +1 -1
  60. package/src/assets/web-panel/assets/{Providers-C8fcF3BK.js → Providers-DKt_Cg-j.js} +1 -1
  61. package/src/assets/web-panel/assets/{QrScannerModal-unjO8lNO.js → QrScannerModal-DA61jNSx.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-BT1QtT7D.js → QuickAsk-fS9ryUmq.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-BSjFrY1w.js → Recommend-CR9dZU5Y.js} +1 -1
  64. package/src/assets/web-panel/assets/{RemoteSession-CWV0bICg.js → RemoteSession-BV0BR2Dz.js} +2 -2
  65. package/src/assets/web-panel/assets/{Reputation-BMjiMsk2.js → Reputation-BIeGUvYD.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-9XCY22PM.js → Row-DHDT1aro.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-DQ9PDy7Q.js → RssFeed-Cq6YKb1h.js} +3 -3
  68. package/src/assets/web-panel/assets/{Search-Boym2HwG.js → Search-DEF6vsy6.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-Gbq3lGQb.js → Security-CHtYiKY9.js} +4 -4
  70. package/src/assets/web-panel/assets/{Services-OcUfLdnu.js → Services-u16lvBJN.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-BjTog6cA.js → Skeleton-CGbizyDj.js} +1 -1
  72. package/src/assets/web-panel/assets/{Skills-Dny4ft_1.js → Skills-BZMQcAa7.js} +1 -1
  73. package/src/assets/web-panel/assets/{Sla-Cy_VnhpZ.js → Sla-Bm-CycVi.js} +1 -1
  74. package/src/assets/web-panel/assets/{SpeechSettings-CrFuL_lp.js → SpeechSettings-BudpA5kr.js} +1 -1
  75. package/src/assets/web-panel/assets/{SyncSettings-k-FnjuOR.js → SyncSettings-B8q1C1eC.js} +2 -2
  76. package/src/assets/web-panel/assets/{Tasks-ZEqDSo0_.js → Tasks-SU1pBWc-.js} +1 -1
  77. package/src/assets/web-panel/assets/{Templates-CYYksYV5.js → Templates-CyOfJzmt.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-BvTTRTHS.js → Tenant-xqWSm2GP.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-DMOQOtkj.js → Terminal-D1Ttgjsi.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-CnudkJxk.js → TimelineRenderer-Da2lYs5D.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-VW6Wocdp.js → Tokens-B34-SduO.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger-BtOxZqP6.js → Trigger-C8zyYm4R.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-XcGJoTQx.js → Trust-D1Pvqems.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-aASNCs5j.js → UkeySign-Do3VVnAy.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-Bz89M52u.js → VideoEditing-Dz7egVIA.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-uU4dSS_N.js → Wallet-Dcuw-OxR.js} +3 -3
  87. package/src/assets/web-panel/assets/{WebAuthn-Brrroxgr.js → WebAuthn-DPlw-QsB.js} +3 -3
  88. package/src/assets/web-panel/assets/{WorkflowEditor-Cny-evI9.js → WorkflowEditor-h4OsnU5q.js} +1 -1
  89. package/src/assets/web-panel/assets/{chat-CJ5iSwWq.js → chat-eO9wEwrW.js} +1 -1
  90. package/src/assets/web-panel/assets/{colors-DWa-2flG.js → colors-34lSmOXw.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-DFwUfptU.js → compact-item-CK4kEWJ4.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-FHWWcyeB.js → createContext-E0A57xed.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-CF3xafX2.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-QY_TElrN.js → hasIn-BD9ZMGAl.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-BcVr-LOk.js → index--N0u6kTG.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-CUiTugu3.js → index-8qMA1DWQ.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-0umhind6.js → index-B0rkHxKK.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-wqiOz655.js → index-B_G_ElKO.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-B18zERdP.js → index-BbX_Dted.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-Dy2PnKZx.js → index-Bjs90Eh9.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-th467RN6.js → index-BmNbU2Z6.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-uRUZdL7I.js → index-Brqc9Emx.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-hw1J_Oxs.js → index-BsGmo6v1.js} +1 -1
  104. package/src/assets/web-panel/assets/index-C907rPwd.js +1 -0
  105. package/src/assets/web-panel/assets/{index-CjejB-z9.js → index-CT1_eRL-.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DaHvj4jA.js → index-CZBaqe3d.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-B33frlaD.js → index-CZkFMeWL.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BYbwQ7SP.js → index-Ch175NUw.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-va4Rt-yM.js → index-CsrKJJcX.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-DDpXDi4J.js → index-CuSau5ya.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-D-Mhq8K6.js → index-Cx3Jn1r0.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-CKS7n6mE.js → index-Cz3unNfL.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-BRsGZBHc.js → index-D4bB_x_v.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-Bd7McYpJ.js → index-DCn-ECvK.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DUfILsc-.js → index-DFLE2qO9.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DUepuy7O.js → index-DGRxt5wj.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BR4RMPnB.js → index-DONOUtlz.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-Dlq-u9E4.js → index-DP-UZAQN.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DCHMVYG1.js → index-Da5fmOHB.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-BiHRihC0.js → index-DcE1BspQ.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CGv5In_T.js → index-DcbgVLOH.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-BQCtBurK.js → index-DeXNCyQJ.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-D2rPJ6Sv.js → index-DiT_REby.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CUoLd1dt.js → index-DpfisY1g.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-2ufsNuVn.js → index-DrOalGut.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-aTiI7lOQ.js → index-DrSAAuJj.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-BUNwuu5v.js → index-DrsDA_md.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CkmgbT7h.js → index-DvKcroix.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BEjwv2x6.js → index-DzXjP44T.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CeGn0A4W.js → index-MIg5Z8qe.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-C5F1vwec.js → index-o8pYehRq.js} +3 -3
  132. package/src/assets/web-panel/assets/index-wueRSK2d.js +1 -0
  133. package/src/assets/web-panel/assets/{index-w3SdYwaC.js → index-yAGBu2E0.js} +1 -1
  134. package/src/assets/web-panel/assets/{initDefaultProps-BeSPUFDz.js → initDefaultProps-DMTkAomF.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-Dcajvjm9.js → motion-Cnti1F5g.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-B76orau-.js → move-CGxmHUga.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-zB6yFwcX.js → mtc-parser-CuwwLoq7.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-BsbNjz8w.js → omit-BpdlTkPM.js} +1 -1
  139. package/src/assets/web-panel/assets/{pickAttrs-BiJ9tssQ.js → pickAttrs-D7nWrThp.js} +1 -1
  140. package/src/assets/web-panel/assets/{placementArrow-BdfMjMeN.js → placementArrow-Bhx0TV8F.js} +1 -1
  141. package/src/assets/web-panel/assets/{responsiveObserve-rV4LGpbU.js → responsiveObserve-CZ1KesZh.js} +1 -1
  142. package/src/assets/web-panel/assets/{slide-HsVw1qFQ.js → slide-CnldF8J6.js} +1 -1
  143. package/src/assets/web-panel/assets/{statusUtils-D1ry8XPE.js → statusUtils-CZfo_GOA.js} +1 -1
  144. package/src/assets/web-panel/assets/{styleChecker-B1t6aQQ_.js → styleChecker-B2QCcAv5.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFlexGapSupport-C8qbl-9w.js → useFlexGapSupport-DzzjIS4J.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFs-R7g_mYTC.js → useFs-B_atg9M0.js} +1 -1
  147. package/src/assets/web-panel/assets/{usePersonalDataHub-Cd-kCe7Z.js → usePersonalDataHub-DhZs3QYN.js} +1 -1
  148. package/src/assets/web-panel/assets/{vnode-9WhK5UWA.js → vnode-DcePTYAm.js} +1 -1
  149. package/src/assets/web-panel/assets/{zoom-CUqppPco.js → zoom-BYmlnjRk.js} +1 -1
  150. package/src/assets/web-panel/index.html +1 -1
  151. package/src/command-help-index.json +2 -2
  152. package/src/commands/agent.js +19 -1
  153. package/src/commands/evolution-knowledge.js +54 -0
  154. package/src/commands/evolution-workbench.js +83 -0
  155. package/src/commands/evolution.js +6 -1
  156. package/src/commands/serve.js +47 -0
  157. package/src/commands/skill.js +158 -16
  158. package/src/data/changelog.json +26 -0
  159. package/src/gateways/ws/session-protocol.js +2 -0
  160. package/src/gateways/ws/ws-agent-handler.js +124 -69
  161. package/src/gateways/ws/ws-server.js +19 -0
  162. package/src/generated/cc-agent-protocol.schema.json +7 -1
  163. package/src/harness/jsonl-session-store.js +25 -1
  164. package/src/index.js +11 -3
  165. package/src/lazy-dispatch.js +9 -1
  166. package/src/lib/app-server/cli-agent-kernel-adapter.js +8 -0
  167. package/src/lib/app-server/graph-runtime.js +40 -1
  168. package/src/lib/app-server/server.js +181 -3
  169. package/src/lib/app-server/websocket-transport.js +23 -0
  170. package/src/lib/evolution/agent-evolution-runtime-composition-brand.js +17 -0
  171. package/src/lib/evolution/agent-evolution-runtime-composition.js +165 -1
  172. package/src/lib/evolution/controlled-skill-production-pilot.js +912 -0
  173. package/src/lib/evolution/evolution-artifact-ports.js +30 -0
  174. package/src/lib/evolution/evolution-deployment-loader.js +208 -0
  175. package/src/lib/evolution/evolution-raw-crypto-shred.js +185 -0
  176. package/src/lib/evolution/evolution-release-train-ledger-adapter.js +335 -0
  177. package/src/lib/evolution/evolution-release-train.js +538 -0
  178. package/src/lib/evolution/evolution-workbench-batch-executor.js +195 -0
  179. package/src/lib/evolution/evolution-workbench-cli-host.js +169 -0
  180. package/src/lib/evolution/evolution-workbench-metrics-ledger-adapter.js +648 -0
  181. package/src/lib/evolution/evolution-workbench-metrics.js +943 -0
  182. package/src/lib/evolution/evolution-workbench-projection.js +753 -0
  183. package/src/lib/evolution/evolution-workbench-version-control.js +272 -0
  184. package/src/lib/evolution/evolvable-artifact-ledger-adapter.js +688 -0
  185. package/src/lib/evolution/governed-knowledge-artifact-lifecycle.js +364 -0
  186. package/src/lib/evolution/governed-knowledge-conflict-merge.js +352 -0
  187. package/src/lib/evolution/governed-knowledge-dependency-authority.js +273 -0
  188. package/src/lib/evolution/governed-knowledge-dependency-ledger-executor.js +646 -0
  189. package/src/lib/evolution/governed-knowledge-merge-ledger-executor.js +671 -0
  190. package/src/lib/evolution/governed-knowledge-merge-publisher-authority.js +310 -0
  191. package/src/lib/evolution/governed-knowledge-node-crypto-authority.js +348 -0
  192. package/src/lib/evolution/governed-knowledge-rbac-approval-authority.js +621 -0
  193. package/src/lib/evolution/governed-knowledge-review-host.js +249 -0
  194. package/src/lib/evolution/governed-knowledge-sync-ledger-adapter.js +729 -0
  195. package/src/lib/evolution/governed-knowledge-sync-merge-publisher.js +312 -0
  196. package/src/lib/evolution/governed-knowledge-sync.js +795 -0
  197. package/src/lib/evolution/governed-knowledge-trust-ledger.js +707 -0
  198. package/src/lib/evolution/governed-skill-marketplace.js +430 -0
  199. package/src/lib/evolution/governed-wiki-pruning.js +435 -0
  200. package/src/lib/evolution/skill-outcome-index-authority.js +268 -0
  201. package/src/lib/evolution/skill-outcome-source-catalog-authority.js +237 -0
  202. package/src/lib/evolution/skill-writer-inventory-manifest.js +7 -6
  203. package/src/lib/evolution/statistical-progressive-canary.js +683 -0
  204. package/src/lib/evolution/wikiskill-benchmark.js +510 -0
  205. package/src/lib/public-ide-capability-manifest.js +4 -0
  206. package/src/lib/session-host-lease.js +11 -16
  207. package/src/lib/skill-outcome-authority.js +43 -0
  208. package/src/lib/skill-outcome-transcript-authority.js +252 -0
  209. package/src/lib/skill-retrieval-router-benchmark.js +135 -0
  210. package/src/lib/skill-retrieval-router.js +235 -0
  211. package/src/lib/skill-vector-authority.js +325 -0
  212. package/src/lib/skill-vector-process-authority.js +386 -0
  213. package/src/repl/agent-repl.js +7 -1
  214. package/src/runtime/agent-core.js +133 -13
  215. package/src/runtime/agent-runtime.js +42 -0
  216. package/src/runtime/headless-runner.js +32 -0
  217. package/src/runtime/headless-stream.js +39 -1
  218. package/src/runtime/runtime-factory.js +62 -4
  219. package/src/assets/web-panel/assets/ChatBubbleRenderer-eMmw1eZF.js +0 -1
  220. package/src/assets/web-panel/assets/devWarning-DxufPwXC.js +0 -1
  221. package/src/assets/web-panel/assets/index-ZMTB9p5z.js +0 -1
  222. package/src/assets/web-panel/assets/index-_PvIDelE.js +0 -1
@@ -0,0 +1,510 @@
1
+ import { createHash } from "node:crypto";
2
+
3
+ export const WIKISKILL_BENCHMARK_PLAN_SCHEMA =
4
+ "chainlesschain.wikiskill-benchmark-plan/v1";
5
+ export const WIKISKILL_BENCHMARK_REPORT_SCHEMA =
6
+ "chainlesschain.wikiskill-benchmark-report/v1";
7
+ export const WIKISKILL_BENCHMARK_ENVELOPE_SCHEMA =
8
+ "chainlesschain.wikiskill-benchmark-envelope/v1";
9
+
10
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
11
+ const COMMIT = /^[a-f0-9]{40}$/u;
12
+ const FAILURE_CLASSES = new Set([
13
+ "none",
14
+ "model",
15
+ "tool",
16
+ "provider",
17
+ "sandbox",
18
+ "permission",
19
+ "infrastructure",
20
+ "grader",
21
+ "unknown",
22
+ ]);
23
+
24
+ function canonical(value) {
25
+ if (value === null || typeof value !== "object") return JSON.stringify(value);
26
+ if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
27
+ return `{${Object.keys(value)
28
+ .sort()
29
+ .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
30
+ .join(",")}}`;
31
+ }
32
+
33
+ function digest(domain, value) {
34
+ return `sha256:${createHash("sha256")
35
+ .update(domain)
36
+ .update("\0")
37
+ .update(canonical(value))
38
+ .digest("hex")}`;
39
+ }
40
+
41
+ function exactKeys(value, keys, name) {
42
+ if (!value || typeof value !== "object" || Array.isArray(value))
43
+ throw new TypeError(`${name} must be an object`);
44
+ const actual = Object.keys(value).sort();
45
+ const expected = [...keys].sort();
46
+ if (canonical(actual) !== canonical(expected))
47
+ throw new TypeError(`${name} has unexpected or missing fields`);
48
+ }
49
+
50
+ function string(value, name) {
51
+ if (typeof value !== "string" || value.trim() === "")
52
+ throw new TypeError(`${name} must be a non-empty string`);
53
+ return value;
54
+ }
55
+
56
+ function sha(value, name) {
57
+ if (!DIGEST.test(value ?? ""))
58
+ throw new TypeError(`${name} must be a sha256 digest`);
59
+ return value;
60
+ }
61
+
62
+ function finite(value, name, { min = 0, max = Number.MAX_VALUE } = {}) {
63
+ const number = Number(value);
64
+ if (!Number.isFinite(number) || number < min || number > max)
65
+ throw new TypeError(`${name} is outside its allowed range`);
66
+ return number;
67
+ }
68
+
69
+ function normalizeDatasets(datasets) {
70
+ if (!Array.isArray(datasets) || datasets.length !== 5)
71
+ throw new TypeError("datasets must contain exactly five entries");
72
+ const ids = new Set();
73
+ return datasets.map((dataset, index) => {
74
+ exactKeys(
75
+ dataset,
76
+ ["id", "version", "digest", "splitIds"],
77
+ `dataset ${index}`,
78
+ );
79
+ const id = string(dataset.id, `dataset ${index} id`);
80
+ if (ids.has(id)) throw new TypeError(`duplicate dataset id: ${id}`);
81
+ ids.add(id);
82
+ if (!Array.isArray(dataset.splitIds) || dataset.splitIds.length === 0)
83
+ throw new TypeError(`dataset ${id} must contain splitIds`);
84
+ const splitIds = dataset.splitIds.map((item, splitIndex) =>
85
+ string(item, `dataset ${id} split ${splitIndex}`),
86
+ );
87
+ if (new Set(splitIds).size !== splitIds.length)
88
+ throw new TypeError(`dataset ${id} contains duplicate splitIds`);
89
+ return Object.freeze({
90
+ id,
91
+ version: string(dataset.version, `dataset ${id} version`),
92
+ digest: sha(dataset.digest, `dataset ${id} digest`),
93
+ splitIds: Object.freeze(splitIds),
94
+ splitDigest: digest(WIKISKILL_BENCHMARK_PLAN_SCHEMA, splitIds),
95
+ });
96
+ });
97
+ }
98
+
99
+ export function createWikiSkillBenchmarkPlan(input = {}) {
100
+ exactKeys(
101
+ input,
102
+ [
103
+ "gitCommit",
104
+ "runnerDigest",
105
+ "model",
106
+ "inference",
107
+ "environment",
108
+ "datasets",
109
+ "toolDigest",
110
+ "apiDigest",
111
+ "promptDigest",
112
+ "skillDigest",
113
+ "wikiDigest",
114
+ "seedSchedule",
115
+ "bootstrapSamples",
116
+ ],
117
+ "benchmark plan",
118
+ );
119
+ exactKeys(input.model, ["checkpoint", "digest"], "model");
120
+ exactKeys(
121
+ input.environment,
122
+ ["containerDigest", "vllmVersion", "hardware"],
123
+ "environment",
124
+ );
125
+ if (
126
+ !input.inference ||
127
+ typeof input.inference !== "object" ||
128
+ Array.isArray(input.inference)
129
+ )
130
+ throw new TypeError("inference must be an object");
131
+ if (!Array.isArray(input.seedSchedule) || input.seedSchedule.length < 3)
132
+ throw new TypeError(
133
+ "seedSchedule must contain at least three independent runs",
134
+ );
135
+ const seedSchedule = input.seedSchedule.map((seed, index) => {
136
+ if (!Number.isSafeInteger(seed) || seed < 0)
137
+ throw new TypeError(
138
+ `seedSchedule ${index} must be a non-negative safe integer`,
139
+ );
140
+ return seed;
141
+ });
142
+ if (new Set(seedSchedule).size !== seedSchedule.length)
143
+ throw new TypeError("seedSchedule must not contain duplicates");
144
+ if (input.bootstrapSamples !== 1_000)
145
+ throw new TypeError("bootstrapSamples must equal 1000");
146
+ const gitCommit = string(input.gitCommit, "gitCommit");
147
+ if (!COMMIT.test(gitCommit))
148
+ throw new TypeError("gitCommit must be a full commit SHA");
149
+ const core = {
150
+ schema: WIKISKILL_BENCHMARK_PLAN_SCHEMA,
151
+ gitCommit,
152
+ runnerDigest: sha(input.runnerDigest, "runnerDigest"),
153
+ model: Object.freeze({
154
+ checkpoint: string(input.model.checkpoint, "model checkpoint"),
155
+ digest: sha(input.model.digest, "model digest"),
156
+ }),
157
+ inference: Object.freeze(JSON.parse(canonical(input.inference))),
158
+ environment: Object.freeze({
159
+ containerDigest: sha(
160
+ input.environment.containerDigest,
161
+ "container digest",
162
+ ),
163
+ vllmVersion: string(input.environment.vllmVersion, "vLLM version"),
164
+ hardware: string(input.environment.hardware, "hardware"),
165
+ }),
166
+ datasets: Object.freeze(normalizeDatasets(input.datasets)),
167
+ toolDigest: sha(input.toolDigest, "toolDigest"),
168
+ apiDigest: sha(input.apiDigest, "apiDigest"),
169
+ promptDigest: sha(input.promptDigest, "promptDigest"),
170
+ skillDigest: sha(input.skillDigest, "skillDigest"),
171
+ wikiDigest: sha(input.wikiDigest, "wikiDigest"),
172
+ seedSchedule: Object.freeze(seedSchedule),
173
+ bootstrapSamples: 1_000,
174
+ };
175
+ return Object.freeze({
176
+ ...core,
177
+ planDigest: digest(WIKISKILL_BENCHMARK_PLAN_SCHEMA, core),
178
+ });
179
+ }
180
+
181
+ function normalizeArm(arm, name) {
182
+ exactKeys(
183
+ arm,
184
+ [
185
+ "score",
186
+ "traceDigest",
187
+ "graderReceiptDigest",
188
+ "failureClass",
189
+ "tokens",
190
+ "cost",
191
+ "latencyMs",
192
+ ],
193
+ name,
194
+ );
195
+ if (!FAILURE_CLASSES.has(arm.failureClass))
196
+ throw new TypeError(`${name} failureClass is invalid`);
197
+ return Object.freeze({
198
+ score: finite(arm.score, `${name} score`, { max: 1 }),
199
+ traceDigest: sha(arm.traceDigest, `${name} traceDigest`),
200
+ graderReceiptDigest: sha(
201
+ arm.graderReceiptDigest,
202
+ `${name} graderReceiptDigest`,
203
+ ),
204
+ failureClass: arm.failureClass,
205
+ tokens: finite(arm.tokens, `${name} tokens`),
206
+ cost: finite(arm.cost, `${name} cost`),
207
+ latencyMs: finite(arm.latencyMs, `${name} latencyMs`),
208
+ });
209
+ }
210
+
211
+ function percentile(sorted, probability) {
212
+ if (sorted.length === 1) return sorted[0];
213
+ const position = (sorted.length - 1) * probability;
214
+ const lower = Math.floor(position);
215
+ const upper = Math.ceil(position);
216
+ const weight = position - lower;
217
+ return sorted[lower] * (1 - weight) + sorted[upper] * weight;
218
+ }
219
+
220
+ function prngFromDigest(value) {
221
+ let state = Number.parseInt(value.slice(7, 15), 16) || 0x9e3779b9;
222
+ return () => {
223
+ state ^= state << 13;
224
+ state ^= state >>> 17;
225
+ state ^= state << 5;
226
+ return (state >>> 0) / 0x1_0000_0000;
227
+ };
228
+ }
229
+
230
+ function mean(values) {
231
+ return values.reduce((sum, value) => sum + value, 0) / values.length;
232
+ }
233
+
234
+ export function buildWikiSkillBenchmarkReport({ plan, runs } = {}) {
235
+ if (
236
+ !plan ||
237
+ plan.schema !== WIKISKILL_BENCHMARK_PLAN_SCHEMA ||
238
+ !DIGEST.test(plan.planDigest ?? "")
239
+ )
240
+ throw new TypeError("a canonical benchmark plan is required");
241
+ const expectedPlanDigest = digest(
242
+ WIKISKILL_BENCHMARK_PLAN_SCHEMA,
243
+ Object.fromEntries(
244
+ Object.entries(plan).filter(([key]) => key !== "planDigest"),
245
+ ),
246
+ );
247
+ if (expectedPlanDigest !== plan.planDigest)
248
+ throw new Error("benchmark plan digest mismatch");
249
+ if (!Array.isArray(runs) || runs.length !== plan.seedSchedule.length)
250
+ throw new TypeError("runs must exactly cover the seed schedule");
251
+ const expectedCases = new Map(
252
+ plan.datasets.flatMap((dataset) =>
253
+ dataset.splitIds.map((splitId) => [`${dataset.id}\0${splitId}`, dataset]),
254
+ ),
255
+ );
256
+ const seenSeeds = new Set();
257
+ const normalizedRuns = runs.map((run, runIndex) => {
258
+ exactKeys(run, ["runId", "seed", "cases"], `run ${runIndex}`);
259
+ if (!plan.seedSchedule.includes(run.seed) || seenSeeds.has(run.seed))
260
+ throw new TypeError(`run ${runIndex} seed is absent or duplicated`);
261
+ seenSeeds.add(run.seed);
262
+ if (!Array.isArray(run.cases) || run.cases.length !== expectedCases.size)
263
+ throw new TypeError(`run ${runIndex} does not cover every split`);
264
+ const seenCases = new Set();
265
+ const cases = run.cases.map((item, caseIndex) => {
266
+ exactKeys(
267
+ item,
268
+ ["datasetId", "splitId", "baseline", "skill"],
269
+ `run ${runIndex} case ${caseIndex}`,
270
+ );
271
+ const key = `${item.datasetId}\0${item.splitId}`;
272
+ if (!expectedCases.has(key) || seenCases.has(key))
273
+ throw new TypeError(`run ${runIndex} has an absent or duplicate split`);
274
+ seenCases.add(key);
275
+ return Object.freeze({
276
+ datasetId: item.datasetId,
277
+ splitId: item.splitId,
278
+ baseline: normalizeArm(item.baseline, `run ${runIndex} baseline`),
279
+ skill: normalizeArm(item.skill, `run ${runIndex} skill`),
280
+ });
281
+ });
282
+ cases.sort((left, right) =>
283
+ `${left.datasetId}\0${left.splitId}`.localeCompare(
284
+ `${right.datasetId}\0${right.splitId}`,
285
+ ),
286
+ );
287
+ return Object.freeze({
288
+ runId: string(run.runId, `run ${runIndex} runId`),
289
+ seed: run.seed,
290
+ cases: Object.freeze(cases),
291
+ });
292
+ });
293
+ normalizedRuns.sort(
294
+ (left, right) =>
295
+ plan.seedSchedule.indexOf(left.seed) -
296
+ plan.seedSchedule.indexOf(right.seed),
297
+ );
298
+
299
+ const perDataset = plan.datasets.map((dataset) => {
300
+ const observations = normalizedRuns.flatMap((run) =>
301
+ run.cases.filter((item) => item.datasetId === dataset.id),
302
+ );
303
+ const baseline = mean(observations.map((item) => item.baseline.score));
304
+ const skill = mean(observations.map((item) => item.skill.score));
305
+ return Object.freeze({
306
+ datasetId: dataset.id,
307
+ count: observations.length,
308
+ baseline,
309
+ skill,
310
+ delta: skill - baseline,
311
+ });
312
+ });
313
+ const equalWeightBaseline = mean(perDataset.map((item) => item.baseline));
314
+ const equalWeightSkill = mean(perDataset.map((item) => item.skill));
315
+ const deltas = normalizedRuns.flatMap((run) =>
316
+ run.cases.map((item) => item.skill.score - item.baseline.score),
317
+ );
318
+ const random = prngFromDigest(plan.planDigest);
319
+ const bootstrap = Array.from({ length: plan.bootstrapSamples }, () => {
320
+ const sample = Array.from(
321
+ { length: deltas.length },
322
+ () => deltas[Math.floor(random() * deltas.length)],
323
+ );
324
+ return mean(sample);
325
+ }).sort((left, right) => left - right);
326
+ const measurements = normalizedRuns.flatMap((run) =>
327
+ run.cases.flatMap((item) => [item.baseline, item.skill]),
328
+ );
329
+ const core = {
330
+ schema: WIKISKILL_BENCHMARK_REPORT_SCHEMA,
331
+ planDigest: plan.planDigest,
332
+ gitCommit: plan.gitCommit,
333
+ runnerDigest: plan.runnerDigest,
334
+ datasetDigests: Object.freeze(
335
+ plan.datasets.map(({ id, digest: datasetDigest, splitDigest }) => ({
336
+ id,
337
+ digest: datasetDigest,
338
+ splitDigest,
339
+ })),
340
+ ),
341
+ runCount: normalizedRuns.length,
342
+ pairedObservationCount: deltas.length,
343
+ perDataset: Object.freeze(perDataset),
344
+ metrics: Object.freeze({
345
+ equalWeightBaseline,
346
+ equalWeightSkill,
347
+ delta: equalWeightSkill - equalWeightBaseline,
348
+ pairedBootstrap95Ci: Object.freeze([
349
+ percentile(bootstrap, 0.025),
350
+ percentile(bootstrap, 0.975),
351
+ ]),
352
+ bootstrapSamples: plan.bootstrapSamples,
353
+ tokens: measurements.reduce((sum, item) => sum + item.tokens, 0),
354
+ cost: measurements.reduce((sum, item) => sum + item.cost, 0),
355
+ latencyMs: Object.freeze({
356
+ p50: percentile(
357
+ measurements.map((item) => item.latencyMs).sort((a, b) => a - b),
358
+ 0.5,
359
+ ),
360
+ p95: percentile(
361
+ measurements.map((item) => item.latencyMs).sort((a, b) => a - b),
362
+ 0.95,
363
+ ),
364
+ p99: percentile(
365
+ measurements.map((item) => item.latencyMs).sort((a, b) => a - b),
366
+ 0.99,
367
+ ),
368
+ }),
369
+ }),
370
+ failureCounts: Object.freeze(
371
+ [...FAILURE_CLASSES].reduce((result, classification) => {
372
+ result[classification] = measurements.filter(
373
+ (item) => item.failureClass === classification,
374
+ ).length;
375
+ return result;
376
+ }, {}),
377
+ ),
378
+ runs: Object.freeze(normalizedRuns),
379
+ };
380
+ return Object.freeze({
381
+ ...core,
382
+ reportDigest: digest(WIKISKILL_BENCHMARK_REPORT_SCHEMA, core),
383
+ });
384
+ }
385
+
386
+ export async function executeWikiSkillBenchmark({ plan, runner } = {}) {
387
+ if (
388
+ !plan ||
389
+ plan.schema !== WIKISKILL_BENCHMARK_PLAN_SCHEMA ||
390
+ !DIGEST.test(plan.planDigest ?? "")
391
+ )
392
+ throw new TypeError("a canonical benchmark plan is required");
393
+ if (typeof runner !== "function")
394
+ throw new TypeError("benchmark runner is required");
395
+ const runs = [];
396
+ for (const seed of plan.seedSchedule) {
397
+ const cases = [];
398
+ for (const dataset of plan.datasets) {
399
+ for (const splitId of dataset.splitIds) {
400
+ const common = Object.freeze({
401
+ planDigest: plan.planDigest,
402
+ seed,
403
+ dataset: Object.freeze({
404
+ id: dataset.id,
405
+ version: dataset.version,
406
+ digest: dataset.digest,
407
+ splitId,
408
+ splitDigest: dataset.splitDigest,
409
+ }),
410
+ model: plan.model,
411
+ inference: plan.inference,
412
+ environment: plan.environment,
413
+ toolDigest: plan.toolDigest,
414
+ apiDigest: plan.apiDigest,
415
+ promptDigest: plan.promptDigest,
416
+ runnerDigest: plan.runnerDigest,
417
+ });
418
+ const baseline = await runner(
419
+ Object.freeze({
420
+ ...common,
421
+ arm: "no-skill",
422
+ skillDigest: null,
423
+ wikiDigest: null,
424
+ }),
425
+ );
426
+ const skill = await runner(
427
+ Object.freeze({
428
+ ...common,
429
+ arm: "skill",
430
+ skillDigest: plan.skillDigest,
431
+ wikiDigest: plan.wikiDigest,
432
+ }),
433
+ );
434
+ cases.push({
435
+ datasetId: dataset.id,
436
+ splitId,
437
+ baseline,
438
+ skill,
439
+ });
440
+ }
441
+ }
442
+ runs.push({
443
+ runId: digest(WIKISKILL_BENCHMARK_REPORT_SCHEMA, {
444
+ planDigest: plan.planDigest,
445
+ seed,
446
+ }),
447
+ seed,
448
+ cases,
449
+ });
450
+ }
451
+ return buildWikiSkillBenchmarkReport({ plan, runs });
452
+ }
453
+
454
+ export async function signWikiSkillBenchmarkReport({ report, attestor } = {}) {
455
+ if (
456
+ !report ||
457
+ report.schema !== WIKISKILL_BENCHMARK_REPORT_SCHEMA ||
458
+ !DIGEST.test(report.reportDigest ?? "")
459
+ )
460
+ throw new TypeError("a canonical benchmark report is required");
461
+ if (typeof attestor !== "function")
462
+ throw new TypeError("attestor is required");
463
+ const attestation = await attestor(report.reportDigest);
464
+ if (!attestation || typeof attestation !== "object")
465
+ throw new Error("benchmark attestor returned no attestation");
466
+ return Object.freeze({
467
+ schema: WIKISKILL_BENCHMARK_ENVELOPE_SCHEMA,
468
+ report,
469
+ attestation: Object.freeze({ ...attestation }),
470
+ });
471
+ }
472
+
473
+ export async function projectWikiSkillBenchmarkClaim({
474
+ envelope,
475
+ verifyAttestation,
476
+ } = {}) {
477
+ const hold = Object.freeze({
478
+ provenance: "external-paper-only",
479
+ status: "HOLD",
480
+ reportDigest: null,
481
+ metrics: null,
482
+ });
483
+ if (!envelope) return hold;
484
+ if (
485
+ envelope.schema !== WIKISKILL_BENCHMARK_ENVELOPE_SCHEMA ||
486
+ typeof verifyAttestation !== "function"
487
+ )
488
+ throw new TypeError("signed benchmark envelope and verifier are required");
489
+ const { report } = envelope;
490
+ if (!report || report.schema !== WIKISKILL_BENCHMARK_REPORT_SCHEMA)
491
+ throw new Error("benchmark report is invalid");
492
+ const core = Object.fromEntries(
493
+ Object.entries(report).filter(([key]) => key !== "reportDigest"),
494
+ );
495
+ if (digest(WIKISKILL_BENCHMARK_REPORT_SCHEMA, core) !== report.reportDigest)
496
+ throw new Error("benchmark report digest mismatch");
497
+ if (
498
+ !(await verifyAttestation({
499
+ digest: report.reportDigest,
500
+ attestation: envelope.attestation,
501
+ }))
502
+ )
503
+ throw new Error("benchmark report attestation rejected");
504
+ return Object.freeze({
505
+ provenance: "chainlesschain-measured",
506
+ status: "VERIFIED",
507
+ reportDigest: report.reportDigest,
508
+ metrics: report.metrics,
509
+ });
510
+ }
@@ -59,6 +59,8 @@ const VSCODE_COMMANDS = [
59
59
  "chainlesschain.appServerPilot.interrupt",
60
60
  "chainlesschain.usage.show",
61
61
  "chainlesschain.plugins.manage",
62
+ "chainlesschain.skills.retrieve",
63
+ "chainlesschain.evolution.workbench",
62
64
  "chainlesschain.worktree.tasks",
63
65
  "chainlesschain.chrome.connector",
64
66
  "chainlesschain.artifacts.show",
@@ -114,6 +116,8 @@ const JETBRAINS_ACTIONS = [
114
116
  "chainlesschain.policy.Viewer",
115
117
  "chainlesschain.context.Center",
116
118
  "chainlesschain.plugins.Manage",
119
+ "chainlesschain.skills.Retrieve",
120
+ "chainlesschain.evolution.Workbench",
117
121
  "chainlesschain.worktree.Tasks",
118
122
  "chainlesschain.chrome.Connector",
119
123
  "chainlesschain.workspace.ScanAutoExec",
@@ -3,10 +3,13 @@
3
3
  *
4
4
  * A lease is cooperative authority for production hosts, not a same-UID
5
5
  * sandbox. Every process sharing CHAINLESSCHAIN_HOME observes the same strict
6
- * state file. A monotonically increasing fencing token prevents an expired or
7
- * crashed host from publishing through guarded session-store write paths after
8
- * a successor takes over. A separate monotonic revocation epoch lets an
9
- * operator fence a still-live host; every guarded transition re-reads it.
6
+ * state file. A monotonically increasing fencing token prevents a crashed host
7
+ * from publishing through guarded session-store write paths after a successor
8
+ * takes over. A separate monotonic revocation epoch lets an operator fence a
9
+ * still-live host; every guarded transition re-reads it. An exact local owner
10
+ * may renew after its TTL when the event loop was blocked: no successor can
11
+ * have been admitted while that owner PID remained live, and any revocation or
12
+ * takeover still changes the durable authority tuple and fences the old host.
10
13
  */
11
14
 
12
15
  import fs from "node:fs";
@@ -440,9 +443,9 @@ export class SessionHostLeaseAuthority {
440
443
  const incumbent = snapshot.active;
441
444
  // Never take authority from a process that the OS still reports as
442
445
  // alive, even after its heartbeat TTL. It may be blocked inside an
443
- // external side effect and resume later. Expiry fences that host's
444
- // next guarded transition; takeover additionally requires proven
445
- // process death so two executors cannot overlap.
446
+ // external side effect and resume later. The exact local owner may
447
+ // renew late; takeover additionally requires proven process death so
448
+ // two executors cannot overlap.
446
449
  if (incumbent && this._isProcessAlive(incumbent.ownerPid)) {
447
450
  throw leaseError(
448
451
  SESSION_HOST_LEASE_HELD_CODE,
@@ -522,13 +525,6 @@ export class SessionHostLeaseAuthority {
522
525
  );
523
526
  }
524
527
  const now = Math.trunc(this._now());
525
- if (snapshot.active.expiresAtMs <= now) {
526
- throw leaseError(
527
- SESSION_HOST_LEASE_FENCED_CODE,
528
- `Session host lease expired for ${id}`,
529
- { sessionId: id, fencingToken: record.active.fencingToken },
530
- );
531
- }
532
528
  const next = {
533
529
  ...snapshot.active,
534
530
  renewedAtMs: now,
@@ -898,8 +894,7 @@ export class SessionHostLeaseAuthority {
898
894
  record &&
899
895
  (record.released ||
900
896
  record.active.revocationEpoch !== snapshot.revocationEpoch ||
901
- !sameLease(snapshot.active, record.active) ||
902
- snapshot.active.expiresAtMs <= now)
897
+ !sameLease(snapshot.active, record.active))
903
898
  ) {
904
899
  const error = leaseError(
905
900
  SESSION_HOST_LEASE_FENCED_CODE,
@@ -0,0 +1,43 @@
1
+ import {
2
+ buildSkillOutcomeIndexAuthority,
3
+ unavailableSkillOutcomeIndexAuthority,
4
+ } from "./evolution/skill-outcome-index-authority.js";
5
+ import {
6
+ buildSkillOutcomeTranscriptAuthority,
7
+ unavailableSkillOutcomeTranscriptAuthority,
8
+ } from "./skill-outcome-transcript-authority.js";
9
+
10
+ export function resolveSkillOutcomeAuthority(options = {}, dependencies = {}) {
11
+ if (
12
+ options &&
13
+ typeof options === "object" &&
14
+ Object.prototype.hasOwnProperty.call(options, "index")
15
+ ) {
16
+ const buildIndex =
17
+ dependencies.buildSkillOutcomeIndexAuthority ||
18
+ buildSkillOutcomeIndexAuthority;
19
+ const unavailableIndex =
20
+ dependencies.unavailableSkillOutcomeIndexAuthority ||
21
+ unavailableSkillOutcomeIndexAuthority;
22
+ try {
23
+ return buildIndex(options.index, dependencies.indexDependencies);
24
+ } catch (error) {
25
+ return unavailableIndex(error);
26
+ }
27
+ }
28
+
29
+ const buildTranscript =
30
+ dependencies.buildSkillOutcomeTranscriptAuthority ||
31
+ buildSkillOutcomeTranscriptAuthority;
32
+ const unavailableTranscript =
33
+ dependencies.unavailableSkillOutcomeTranscriptAuthority ||
34
+ unavailableSkillOutcomeTranscriptAuthority;
35
+ try {
36
+ return buildTranscript(
37
+ options?.transcriptOptions,
38
+ dependencies.transcriptDependencies,
39
+ );
40
+ } catch (error) {
41
+ return unavailableTranscript(error);
42
+ }
43
+ }