chainlesschain 0.166.70 → 0.166.72

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 (168) hide show
  1. package/README.md +34 -7
  2. package/package.json +1 -1
  3. package/src/assets/web-panel/assets/{AIOps-BBxGVjAo.js → AIOps-Vk4bgcvz.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-SrT9X1LG.js → ActionButton-dm1pfXdM.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-D0MPWFct.js → Analytics-C9WdXlkB.js} +2 -2
  6. package/src/assets/web-panel/assets/{AppLayout-DlmlYhUp.js → AppLayout-0f-jWk68.js} +5 -5
  7. package/src/assets/web-panel/assets/Artifacts-C7HWVeFu.js +1 -0
  8. package/src/assets/web-panel/assets/{Audit-BWfARNeo.js → Audit-CymWJrNf.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-AT_lu-OI.js → BackgroundAgents-9bWGX_cn.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-6pH5UJRI.js → Backup-DFBHB3_Y.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-CccGGr8I.js → BaseInput-D9Lm9d3n.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-B6aQ-lXU.js → Chat-maC7odiU.js} +5 -5
  13. package/src/assets/web-panel/assets/{ChatBubbleRenderer-cKmA5EAa.js → ChatBubbleRenderer-Crsqn0B1.js} +1 -1
  14. package/src/assets/web-panel/assets/{Checkbox-Dc_dMjlV.js → Checkbox-BrZgAIL0.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-CHm0YK-0.js → Codegen-ChqWBE8R.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-IaBwOtml.js → Col-C5TaXHn9.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-U5N0EakJ.js → Community-D8m4Egsw.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-D6bK2hw-.js → Compact-CMJmi_Bw.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-B0G1zA62.js → Compliance-CW7Bwy8s.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-BvJxGzAT.js → Cowork-DLhPTsU6.js} +3 -3
  21. package/src/assets/web-panel/assets/{Cron-N5JOZWe9.js → Cron-DBrXtf_1.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-CgnzS-_7.js → Crosschain-CzLbJF3j.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-BTMEilVf.js → DID-DreItINq.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-Bc-1wTPH.js → Dashboard-B_gO9CjY.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-DfJLRkz2.js → Dropdown-DXpPiTH_.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-DOkzpgap.js → EmailListRenderer-Cb1YonC_.js} +1 -1
  27. package/src/assets/web-panel/assets/{EvolutionSettings-23ZdCcyg.js → EvolutionSettings-GQb6tV_E.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-mBhA1oWh.js → FamilyGuardDashboard-DUtpqpsn.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-C9Kmj_hs.js → Federation-CfZsj0gb.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-CeU7fnW_.js → FormItemContext-Cdr40ozm.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-s-QOculU.js → GenericCardRenderer-BRaf18hh.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-BbePEFdx.js → Git-7SqGn3Zi.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-PnVQJUn7.js → Governance-D1mfL8Fz.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-sCcd1Foj.js → Inference-BXVyCWMd.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-DdM6cJOh.js → KnowledgeGraph-C-wAA2Ub.js} +1 -1
  36. package/src/assets/web-panel/assets/Logs-DWxiJiFe.js +2 -0
  37. package/src/assets/web-panel/assets/MarkdownRenderer-BJl3Hibe.js +1 -0
  38. package/src/assets/web-panel/assets/{Marketplace-DQ76qwhE.js → Marketplace-CmOVgbTO.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-CZqTYtmV.js → McpTools-Cx4WyryN.js} +3 -3
  40. package/src/assets/web-panel/assets/{Memory-CWtnaJCd.js → Memory-Di6wy0Ky.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-C3Ngpr63.js → MobileBridge-DrR7I1A7.js} +1 -1
  42. package/src/assets/web-panel/assets/{MobileProjects-CpJPlABd.js → MobileProjects-SnNFgay-.js} +1 -1
  43. package/src/assets/web-panel/assets/{Mtc-CKL_fDu2.js → Mtc-DPZpfO4G.js} +2 -2
  44. package/src/assets/web-panel/assets/{MtcAudit-CIDSj87F.js → MtcAudit-CTT74J6Y.js} +2 -2
  45. package/src/assets/web-panel/assets/{Multisig-BoLpIo5g.js → Multisig-DoLT96hm.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-CWJX8SH5.js → NLProgramming-BY-9TS7_.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes-CdGvaOEe.js → Notes-1_rKLQkS.js} +4 -4
  48. package/src/assets/web-panel/assets/{NotificationSettings-C067lOY0.js → NotificationSettings-D8N1NZ6Y.js} +1 -1
  49. package/src/assets/web-panel/assets/OrderTableRenderer-Ch-HjmbS.js +1 -0
  50. package/src/assets/web-panel/assets/{Organization-CwhP3jqH.js → Organization-DKQtaPAc.js} +2 -2
  51. package/src/assets/web-panel/assets/{Overflow-Ks7pF8mI.js → Overflow-B3n9XpS2.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-BytzAo-_.js → P2P-Fn8LWurl.js} +2 -2
  53. package/src/assets/web-panel/assets/{PdhVaultBrowser-f7PUa-As.js → PdhVaultBrowser-CsumgiUO.js} +5 -5
  54. package/src/assets/web-panel/assets/{Permissions-DYgQYc6c.js → Permissions-CTCN6Rk6.js} +3 -3
  55. package/src/assets/web-panel/assets/{PersonalDataHub-xa4C85B5.js → PersonalDataHub-BwpvzXm7.js} +3 -3
  56. package/src/assets/web-panel/assets/{Pipeline-Ci4P4D_9.js → Pipeline-C1_hrCCQ.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-Bc0i4kUv.js → Privacy-C-BmNft5.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-BNQNNbq1.js → ProjectInit-B9HYk17G.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-C9a52UVV.js → ProjectSettings-BFgA-an1.js} +2 -2
  60. package/src/assets/web-panel/assets/Projects-Yofw9TrC.js +1 -0
  61. package/src/assets/web-panel/assets/{Providers-aqNSVXqu.js → Providers-B83JppEP.js} +1 -1
  62. package/src/assets/web-panel/assets/{QrScannerModal-BhiK-alo.js → QrScannerModal-D5ZRpUGC.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-DqiqZt1A.js → QuickAsk-B-mz9iY-.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-c0WOkaCq.js → Recommend-DtjVu00v.js} +1 -1
  65. package/src/assets/web-panel/assets/{RemoteSession-Cf_4L-X3.js → RemoteSession-Dk8IBiG3.js} +3 -3
  66. package/src/assets/web-panel/assets/{Reputation-BVFrZQ_z.js → Reputation-DpTIK7Oe.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-CZ1AwkDl.js → Row-DVYQoXil.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed--WyTTgfC.js → RssFeed-ikMaTwEE.js} +3 -3
  69. package/src/assets/web-panel/assets/{Search-BgxZ24St.js → Search-CHVHCNdo.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-DVkmHsXI.js → Security-MxjX-UDp.js} +2 -2
  71. package/src/assets/web-panel/assets/{Services-CTZQQWlI.js → Services-CmwTYlHk.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-DWwUMTlS.js → Skeleton-BQzBoW5V.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-D6iyc72U.js → Skills-B-mPG69i.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-ChMCfgKV.js → Sla-DOQbR10a.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-CtwWxhK7.js → SpeechSettings-wPQkSA9J.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-DAbLxMOM.js → SyncSettings-BPyc0P-r.js} +2 -2
  77. package/src/assets/web-panel/assets/Tasks-DbBA-eHJ.js +1 -0
  78. package/src/assets/web-panel/assets/{Templates-Dig8IEP-.js → Templates-BRpihbvV.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-DeR5U47w.js → Tenant-B1qu8vDX.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-CHXg-gsD.js → Terminal-CEe3YAvM.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-Bi4GJgwI.js → TimelineRenderer-Biz2ENj5.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-D6ubE4ut.js → Tokens-Bh-mJyas.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-CUQI4HlL.js → Trigger-DaFKe1bY.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-CgTAWXd7.js → Trust-DsJ7u_-G.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-R2bAawIX.js → UkeySign-9I90JZxO.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-46u-3sdP.js → VideoEditing-C96s3pW9.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-DdrACErK.js → Wallet-DTMqIySe.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-Cq266Ihg.js → WebAuthn-C3rh3szY.js} +5 -5
  89. package/src/assets/web-panel/assets/{WorkflowEditor-DV0ES1wc.js → WorkflowEditor-C3as7vBp.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-D5xy9-vl.js → chat-zsGetwuT.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-BBs5Knx_.js → colors-Dt9qbWYV.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-BuFzMOeP.js → compact-item-BJWYHVIL.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-D6gC8UX1.js → createContext-pKrpnY7l.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-CAmY8PZd.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-kBeod51t.js → hasIn-sbUKl7Xu.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-Xmeq1989.js → index--wWXhZQU.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-D8i4RtvF.js → index-0CK6iR4G.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-DkcAtMWM.js → index-5GohpTfK.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-DiEf8pdZ.js → index-B53DhH1R.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-BPfLeT9D.js → index-B9DoXtNz.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DjJD0ItG.js → index-BFMPJahZ.js} +3 -3
  102. package/src/assets/web-panel/assets/{index-B9sYKnfE.js → index-BQtTUsCI.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-CSR6G5y_.js → index-BR1gZBlK.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-43tYtngc.js → index-BRpfrG-e.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-8LcW9fNg.js → index-BSXJ2PbY.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CdXTYNGI.js → index-BWPF2Hth.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DuFsuweQ.js → index-BZmBSuN8.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-_j1YrDlh.js → index-Bf8dv266.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-DVY9bZaC.js → index-BfQmb4PB.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-qXVSh34h.js → index-BiZ6Lupa.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-Dn4FQfDW.js → index-CR5WxgE-.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-WMRvzqet.js → index-CRsSdHdW.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-Db_4IGgr.js → index-C_z7zLle.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BEipvyo3.js → index-CnrxgbPB.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DP74sxrD.js → index-D7tOZZAs.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-C9RbA1u6.js → index-DD_IBhgm.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-AVkVBAgT.js → index-DFQTgkPD.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-slOdrjUJ.js → index-DIxu3nOh.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DLO3EJ28.js → index-DJZq5jWm.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-Cy8WOPIM.js → index-DRAzhNw6.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BJtaYRSM.js → index-DWBlZsqf.js} +1 -1
  122. package/src/assets/web-panel/assets/index-Dfsrnshy.js +1 -0
  123. package/src/assets/web-panel/assets/{index-DT8dVo6h.js → index-Di-YcQHn.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-BrmMhNQe.js → index-Dmp7IdrF.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-ZMxLi0bZ.js → index-DoMii5CD.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-D5w7mVUz.js → index-T8ASbPWt.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CoF4d2sR.js → index-fQ-JtwM7.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-D8vRjV35.js → index-n8vVPeJ6.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-C61TSHk7.js → index-oUag3zZf.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-Cc0nr-mJ.js → index-omZRNwB7.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DWpwO1tg.js → index-qE4san4o.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-BNgGahh_.js → index-sakhsZMa.js} +1 -1
  133. package/src/assets/web-panel/assets/index-tlLfPT5e.js +1 -0
  134. package/src/assets/web-panel/assets/{index-CDc8ZBhw.js → index-vTPOhhfW.js} +1 -1
  135. package/src/assets/web-panel/assets/{initDefaultProps-CdcTIUHj.js → initDefaultProps-BVpFM2mv.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-DMIDKmqt.js → motion-Mrl9_kZM.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-DRq4Pk0-.js → move-CvRC7fRw.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-SYFo5WKx.js → mtc-parser-C7PSeivU.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-B_X6VxfU.js → omit-RI1cO_Ok.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-DnuDKnw_.js → pickAttrs-akwD3e22.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-DBFRmoTN.js → placementArrow-C4f-tfqj.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-BaUVjf33.js → responsiveObserve-hyHNGoSW.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-rLCDXDVC.js → slide-B6vlTDr6.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-CzNprwdC.js → statusUtils-D8poWZW8.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-DsaDdSa9.js → styleChecker-Bz1ZKvoD.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-BKHgNy2p.js → useFlexGapSupport-C-vv_T11.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-C_OQYo_E.js → useFs-BubqlAej.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-CiGRKQ5k.js → usePersonalDataHub-CTNJrVC8.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-C9-ch6HP.js → vnode-DbT41Wli.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-HoUcoyA4.js → zoom-R0Rxz73D.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/command-help-index.json +1 -1
  153. package/src/commands/agent.js +19 -6
  154. package/src/data/changelog.json +26 -0
  155. package/src/lib/decision-layer/benchmark.js +64 -3
  156. package/src/lib/decision-layer/providers.js +150 -0
  157. package/src/lib/decision-layer/runtime.js +18 -5
  158. package/src/lib/decision-layer/typesafe-provider.js +8 -66
  159. package/src/runtime/headless-runner.js +15 -6
  160. package/src/assets/web-panel/assets/Artifacts-BzLV8tLT.js +0 -1
  161. package/src/assets/web-panel/assets/Logs-Dznmdibo.js +0 -2
  162. package/src/assets/web-panel/assets/MarkdownRenderer-nFgRqRUW.js +0 -1
  163. package/src/assets/web-panel/assets/OrderTableRenderer-Bkdj8JZF.js +0 -1
  164. package/src/assets/web-panel/assets/Projects-DoqbdOhN.js +0 -1
  165. package/src/assets/web-panel/assets/Tasks-Dvm355ug.js +0 -1
  166. package/src/assets/web-panel/assets/devWarning-jGzCD1Og.js +0 -1
  167. package/src/assets/web-panel/assets/index-DVuuRGW6.js +0 -1
  168. package/src/assets/web-panel/assets/index-DjkHUbjO.js +0 -1
@@ -1 +1 @@
1
- import{u as v}from"./index-DjJD0ItG.js";import{u as _}from"./useShellMode-CgR0wCYM.js";function d(r){if(!r)return r;if(r.error)throw new Error(r.error);return r.result!==void 0?r.result:r}async function p(r,s={},e=!0){try{if(e!==!0||!r||typeof r.sendRaw!="function")return{status:"unavailable",path:null};const a=await r.sendRaw({type:"fs.openDirectory",title:s.title},6e4);if(a&&(a.ok===!1||a.error))return{status:"unavailable",path:null};const t=a&&a.result!==void 0?a.result:a;return t&&(t.ok===!1||t.error||t.unsupported===!0)?{status:"unavailable",path:null}:t&&t.canceled===!0?{status:"cancelled",path:null}:t&&typeof t.path=="string"&&t.path.length>0?{status:"selected",path:t.path}:{status:"unavailable",path:null}}catch{return{status:"unavailable",path:null}}}function b(r,s,e,a,t){return typeof r.onMessage!="function"||typeof r.sendRaw!="function"?r.sendRaw({type:s,...e},t).then(d):new Promise((n,u)=>{const l=typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2)}`,w=`${s}.event`,m=`${s}.end`;let c=!1,h=()=>{};const o=(i,f)=>{if(!c){c=!0,clearTimeout(g);try{h()}catch{}i(f)}},g=setTimeout(()=>{o(u,new Error(`stream timeout (${t}ms): ${s}`))},t),y=r.onMessage(i=>{if(!(c||!i)&&!(i.id!==l&&i.requestId!==l)){if(i.type===w){if(typeof a=="function")try{a(i.event||i)}catch{}return}if(i.type===m){o(n,d(i));return}i.type==="error"&&o(u,new Error(i.message||"stream error"))}});h=typeof y=="function"?y:()=>{},Promise.resolve(r.sendRaw({id:l,type:s,...e},t)).catch(()=>{})})}function k(){const r=v(),s=_(),e=(a,t={},n=3e4)=>r.sendRaw({type:a,...t},n).then(d);return{async health(){return await e("personal-data-hub.health",{},8e3)},async stats(){return await e("personal-data-hub.stats",{},8e3)},async listAdapters(){return await e("personal-data-hub.list-adapters",{},5e3)},async pickFile(a={}){try{const t=await r.sendRaw({type:"fs.openDialog",title:a.title,filters:a.filters},6e4),n=t&&t.result!==void 0?t.result:t,u=n&&typeof n.path=="string"?n.path:n&&typeof n.filePath=="string"?n.filePath:null;return n&&n.canceled!==!0&&u?u:null}catch{return null}},async pickDirectoryResult(a={}){return await p(r,a,s.isEmbedded)},async pickDirectory(a={}){const t=await p(r,a,s.isEmbedded);return t.status==="selected"?t.path:null},async adapterReadiness(a){return await e("personal-data-hub.adapter-readiness",Number.isInteger(a)?{timeoutMs:a}:{},15e3)},async syncAdapter(a,t={}){return await e("personal-data-hub.sync-adapter",{name:a,options:t},6e5)},async syncAll(a={}){return await e("personal-data-hub.sync-all",{options:a},6e5)},async registerMock({name:a="mock",count:t=20,seed:n=1}={}){return await e("personal-data-hub.register-mock",{name:a,count:t,seed:n})},async unregister(a){return await e("personal-data-hub.unregister",{name:a})},async ask(a,t={}){return await e("personal-data-hub.ask",{question:a,options:t},18e4)},async queryEvents(a={}){return await e("personal-data-hub.query-events",a,1e4)},async recentAudit(a={}){return await e("personal-data-hub.recent-audit",a,1e4)},async searchEvents(a={}){return await e("personal-data-hub.search-events",a,15e3)},async facetCounts(a={}){return await e("personal-data-hub.facet-counts",a,1e4)},async testEmailAuth(a){return await e("personal-data-hub.test-email-auth",{account:a},3e4)},async registerEmail(a,t={}){return await e("personal-data-hub.register-email",{account:a,opts:t},15e3)},async unregisterEmail(a){return await e("personal-data-hub.unregister-email",{email:a},5e3)},async listEmailAccounts(){return await e("personal-data-hub.list-email-accounts",{},5e3)},async activateEmail(a){return await e("personal-data-hub.activate-email",{email:a},5e3)},async eventDetail(a){return await e("personal-data-hub.event-detail",{eventId:a},5e3)},async syncAdapterStream(a,t={},n){return await b(r,"personal-data-hub.sync-adapter-stream",{name:a,options:t},n,6e5)},async syncAllStream(a={},t){return await b(r,"personal-data-hub.sync-all-stream",{options:a},t,9e5)},async registerAlipay(a,t={}){return await e("personal-data-hub.register-alipay",{account:a,opts:t},15e3)},async unregisterAlipay(a){return await e("personal-data-hub.unregister-alipay",{email:a},5e3)},async listAlipayAccounts(){return await e("personal-data-hub.list-alipay-accounts",{},5e3)},async activateAlipay(a){return await e("personal-data-hub.activate-alipay",{email:a},5e3)},async importAlipayBill({zipPath:a,csvPath:t,zipPassword:n}={}){return await e("personal-data-hub.import-alipay-bill",{zipPath:a,csvPath:t,zipPassword:n},3e5)},async reviewQueueList(a=50){return await e("personal-data-hub.review-queue-list",{limit:a},5e3)},async reviewDecision(a,t){return await e("personal-data-hub.review-decision",{reviewId:a,decision:t},5e3)},async manualMerge(a,t){return await e("personal-data-hub.manual-merge",{aId:a,bId:t},5e3)},async manualUnmerge(a){return await e("personal-data-hub.manual-unmerge",{personId:a},5e3)},async resolverDrain(a=50){return await e("personal-data-hub.resolver-drain",{limit:a},18e4)},async resolverStats(){return await e("personal-data-hub.resolver-stats",{},5e3)},async skillsList(){return await e("personal-data-hub.skills-list",{},5e3)},async runSkill(a,t={}){return await e("personal-data-hub.run-skill",{name:a,options:t},12e4)},async openAichatLogin(a,t={}){return await e("personal-data-hub.aichat-open-login",{vendor:a,opts:t},1e4)},async probeAichatCookies(a,t){return await e("personal-data-hub.aichat-probe-cookies",{vendor:a,cookieHeader:t},1e4)},async registerAichatVendor(a,t,n={}){return await e("personal-data-hub.aichat-register-vendor",{vendor:a,cookies:t,opts:n},3e4)},async rotateAichatLogin(a){return await e("personal-data-hub.aichat-rotate-login",{vendor:a},1e4)},async listAichatAccounts(){return await e("personal-data-hub.list-aichat-accounts",{},5e3)},async unregisterAichat(a){return await e("personal-data-hub.unregister-aichat",{vendor:a},5e3)},async aichatHealthCheckOnce(){return await e("personal-data-hub.aichat-health-check-once",{},3e4)},async probeWechatEnv(){return await e("personal-data-hub.wechat-env-probe",{},15e3)},async registerWechat({account:a,dbPath:t,wechatDataPath:n,fridaOpts:u,keyProviderOverride:l}={}){return await e("personal-data-hub.register-wechat",{account:a,dbPath:t,wechatDataPath:n,fridaOpts:u,keyProviderOverride:l},45e3)},async listWechatAccounts(){return await e("personal-data-hub.list-wechat-accounts",{},5e3)},async activateWechat(a,t={}){return await e("personal-data-hub.activate-wechat",{uin:a,fridaOpts:t.fridaOpts,keyProviderOverride:t.keyProviderOverride},45e3)},async unregisterWechat(a){return await e("personal-data-hub.unregister-wechat",{uin:a},5e3)},async bilibiliAdbSync(a={}){return await e("personal-data-hub.bilibili-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bilibiliAdbDoctor(){return await e("personal-data-hub.bilibili-adb-doctor",{},15e3)},async weiboAdbSync(a={}){return await e("personal-data-hub.weibo-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async xhsAdbSync(a={}){return await e("personal-data-hub.xhs-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async toutiaoAdbSync(a={}){return await e("personal-data-hub.toutiao-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},9e4)},async kuaishouAdbSync(a={}){return await e("personal-data-hub.kuaishou-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bridgeDoctor(){return await e("personal-data-hub.bridge-doctor",{},6e4)},async douyinAdbSync(a={}){return await e("personal-data-hub.douyin-adb-sync",{uid:a.uid,limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)}}}export{k as u};
1
+ import{u as v}from"./index-BFMPJahZ.js";import{u as _}from"./useShellMode-CgR0wCYM.js";function d(r){if(!r)return r;if(r.error)throw new Error(r.error);return r.result!==void 0?r.result:r}async function p(r,s={},e=!0){try{if(e!==!0||!r||typeof r.sendRaw!="function")return{status:"unavailable",path:null};const a=await r.sendRaw({type:"fs.openDirectory",title:s.title},6e4);if(a&&(a.ok===!1||a.error))return{status:"unavailable",path:null};const t=a&&a.result!==void 0?a.result:a;return t&&(t.ok===!1||t.error||t.unsupported===!0)?{status:"unavailable",path:null}:t&&t.canceled===!0?{status:"cancelled",path:null}:t&&typeof t.path=="string"&&t.path.length>0?{status:"selected",path:t.path}:{status:"unavailable",path:null}}catch{return{status:"unavailable",path:null}}}function b(r,s,e,a,t){return typeof r.onMessage!="function"||typeof r.sendRaw!="function"?r.sendRaw({type:s,...e},t).then(d):new Promise((n,u)=>{const l=typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2)}`,w=`${s}.event`,m=`${s}.end`;let c=!1,h=()=>{};const o=(i,f)=>{if(!c){c=!0,clearTimeout(g);try{h()}catch{}i(f)}},g=setTimeout(()=>{o(u,new Error(`stream timeout (${t}ms): ${s}`))},t),y=r.onMessage(i=>{if(!(c||!i)&&!(i.id!==l&&i.requestId!==l)){if(i.type===w){if(typeof a=="function")try{a(i.event||i)}catch{}return}if(i.type===m){o(n,d(i));return}i.type==="error"&&o(u,new Error(i.message||"stream error"))}});h=typeof y=="function"?y:()=>{},Promise.resolve(r.sendRaw({id:l,type:s,...e},t)).catch(()=>{})})}function k(){const r=v(),s=_(),e=(a,t={},n=3e4)=>r.sendRaw({type:a,...t},n).then(d);return{async health(){return await e("personal-data-hub.health",{},8e3)},async stats(){return await e("personal-data-hub.stats",{},8e3)},async listAdapters(){return await e("personal-data-hub.list-adapters",{},5e3)},async pickFile(a={}){try{const t=await r.sendRaw({type:"fs.openDialog",title:a.title,filters:a.filters},6e4),n=t&&t.result!==void 0?t.result:t,u=n&&typeof n.path=="string"?n.path:n&&typeof n.filePath=="string"?n.filePath:null;return n&&n.canceled!==!0&&u?u:null}catch{return null}},async pickDirectoryResult(a={}){return await p(r,a,s.isEmbedded)},async pickDirectory(a={}){const t=await p(r,a,s.isEmbedded);return t.status==="selected"?t.path:null},async adapterReadiness(a){return await e("personal-data-hub.adapter-readiness",Number.isInteger(a)?{timeoutMs:a}:{},15e3)},async syncAdapter(a,t={}){return await e("personal-data-hub.sync-adapter",{name:a,options:t},6e5)},async syncAll(a={}){return await e("personal-data-hub.sync-all",{options:a},6e5)},async registerMock({name:a="mock",count:t=20,seed:n=1}={}){return await e("personal-data-hub.register-mock",{name:a,count:t,seed:n})},async unregister(a){return await e("personal-data-hub.unregister",{name:a})},async ask(a,t={}){return await e("personal-data-hub.ask",{question:a,options:t},18e4)},async queryEvents(a={}){return await e("personal-data-hub.query-events",a,1e4)},async recentAudit(a={}){return await e("personal-data-hub.recent-audit",a,1e4)},async searchEvents(a={}){return await e("personal-data-hub.search-events",a,15e3)},async facetCounts(a={}){return await e("personal-data-hub.facet-counts",a,1e4)},async testEmailAuth(a){return await e("personal-data-hub.test-email-auth",{account:a},3e4)},async registerEmail(a,t={}){return await e("personal-data-hub.register-email",{account:a,opts:t},15e3)},async unregisterEmail(a){return await e("personal-data-hub.unregister-email",{email:a},5e3)},async listEmailAccounts(){return await e("personal-data-hub.list-email-accounts",{},5e3)},async activateEmail(a){return await e("personal-data-hub.activate-email",{email:a},5e3)},async eventDetail(a){return await e("personal-data-hub.event-detail",{eventId:a},5e3)},async syncAdapterStream(a,t={},n){return await b(r,"personal-data-hub.sync-adapter-stream",{name:a,options:t},n,6e5)},async syncAllStream(a={},t){return await b(r,"personal-data-hub.sync-all-stream",{options:a},t,9e5)},async registerAlipay(a,t={}){return await e("personal-data-hub.register-alipay",{account:a,opts:t},15e3)},async unregisterAlipay(a){return await e("personal-data-hub.unregister-alipay",{email:a},5e3)},async listAlipayAccounts(){return await e("personal-data-hub.list-alipay-accounts",{},5e3)},async activateAlipay(a){return await e("personal-data-hub.activate-alipay",{email:a},5e3)},async importAlipayBill({zipPath:a,csvPath:t,zipPassword:n}={}){return await e("personal-data-hub.import-alipay-bill",{zipPath:a,csvPath:t,zipPassword:n},3e5)},async reviewQueueList(a=50){return await e("personal-data-hub.review-queue-list",{limit:a},5e3)},async reviewDecision(a,t){return await e("personal-data-hub.review-decision",{reviewId:a,decision:t},5e3)},async manualMerge(a,t){return await e("personal-data-hub.manual-merge",{aId:a,bId:t},5e3)},async manualUnmerge(a){return await e("personal-data-hub.manual-unmerge",{personId:a},5e3)},async resolverDrain(a=50){return await e("personal-data-hub.resolver-drain",{limit:a},18e4)},async resolverStats(){return await e("personal-data-hub.resolver-stats",{},5e3)},async skillsList(){return await e("personal-data-hub.skills-list",{},5e3)},async runSkill(a,t={}){return await e("personal-data-hub.run-skill",{name:a,options:t},12e4)},async openAichatLogin(a,t={}){return await e("personal-data-hub.aichat-open-login",{vendor:a,opts:t},1e4)},async probeAichatCookies(a,t){return await e("personal-data-hub.aichat-probe-cookies",{vendor:a,cookieHeader:t},1e4)},async registerAichatVendor(a,t,n={}){return await e("personal-data-hub.aichat-register-vendor",{vendor:a,cookies:t,opts:n},3e4)},async rotateAichatLogin(a){return await e("personal-data-hub.aichat-rotate-login",{vendor:a},1e4)},async listAichatAccounts(){return await e("personal-data-hub.list-aichat-accounts",{},5e3)},async unregisterAichat(a){return await e("personal-data-hub.unregister-aichat",{vendor:a},5e3)},async aichatHealthCheckOnce(){return await e("personal-data-hub.aichat-health-check-once",{},3e4)},async probeWechatEnv(){return await e("personal-data-hub.wechat-env-probe",{},15e3)},async registerWechat({account:a,dbPath:t,wechatDataPath:n,fridaOpts:u,keyProviderOverride:l}={}){return await e("personal-data-hub.register-wechat",{account:a,dbPath:t,wechatDataPath:n,fridaOpts:u,keyProviderOverride:l},45e3)},async listWechatAccounts(){return await e("personal-data-hub.list-wechat-accounts",{},5e3)},async activateWechat(a,t={}){return await e("personal-data-hub.activate-wechat",{uin:a,fridaOpts:t.fridaOpts,keyProviderOverride:t.keyProviderOverride},45e3)},async unregisterWechat(a){return await e("personal-data-hub.unregister-wechat",{uin:a},5e3)},async bilibiliAdbSync(a={}){return await e("personal-data-hub.bilibili-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bilibiliAdbDoctor(){return await e("personal-data-hub.bilibili-adb-doctor",{},15e3)},async weiboAdbSync(a={}){return await e("personal-data-hub.weibo-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async xhsAdbSync(a={}){return await e("personal-data-hub.xhs-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async toutiaoAdbSync(a={}){return await e("personal-data-hub.toutiao-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},9e4)},async kuaishouAdbSync(a={}){return await e("personal-data-hub.kuaishou-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bridgeDoctor(){return await e("personal-data-hub.bridge-doctor",{},6e4)},async douyinAdbSync(a={}){return await e("personal-data-hub.douyin-adb-sync",{uid:a.uid,limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)}}}export{k as u};
@@ -1 +1 @@
1
- import{N as i,h as a,w as l}from"./index-DjJD0ItG.js";import{a7 as o,k as g,C as d,F as f,A as p}from"./vendor-Bn1JzzAn.js";function c(e){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1,u=e;if(Array.isArray(e)&&(u=i(e)[0]),!u)return null;const n=o(u,r,s);return n.props=t?a(a({},n.props),r):n.props,l(typeof n.props.class!="object","class must be string"),n}function V(e){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;return e.map(s=>c(s,r,t))}function v(e,r,t){p(o(e,a({},r)),t)}const m=e=>(e||[]).some(r=>g(r)?!(r.type===d||r.type===f&&!m(r.children)):!0)?e:null;function h(e,r,t,s){var u;const n=(u=e[r])===null||u===void 0?void 0:u.call(e,t);return m(n)?n:s?.()}export{h as a,V as b,c,v as t};
1
+ import{N as i,h as a,w as l}from"./index-BFMPJahZ.js";import{a7 as o,k as g,C as d,F as f,A as p}from"./vendor-Bn1JzzAn.js";function c(e){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1,u=e;if(Array.isArray(e)&&(u=i(e)[0]),!u)return null;const n=o(u,r,s);return n.props=t?a(a({},n.props),r):n.props,l(typeof n.props.class!="object","class must be string"),n}function V(e){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;return e.map(s=>c(s,r,t))}function v(e,r,t){p(o(e,a({},r)),t)}const m=e=>(e||[]).some(r=>g(r)?!(r.type===d||r.type===f&&!m(r.children)):!0)?e:null;function h(e,r,t,s){var u;const n=(u=e[r])===null||u===void 0?void 0:u.call(e,t);return m(n)?n:s?.()}export{h as a,V as b,c,v as t};
@@ -1,4 +1,4 @@
1
- import{K as o}from"./index-DjJD0ItG.js";import{i as f}from"./motion-DMIDKmqt.js";const c=new o("antZoomIn",{"0%":{transform:"scale(0.2)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),y=new o("antZoomOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.2)",opacity:0}}),a=new o("antZoomBigIn",{"0%":{transform:"scale(0.8)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),s=new o("antZoomBigOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.8)",opacity:0}}),g=new o("antZoomUpIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 0%"}}),O=new o("antZoomUpOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 0%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0}}),l=new o("antZoomLeftIn",{"0%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"0% 50%"}}),u=new o("antZoomLeftOut",{"0%":{transform:"scale(1)",transformOrigin:"0% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0}}),p=new o("antZoomRightIn",{"0%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"100% 50%"}}),z=new o("antZoomRightOut",{"0%":{transform:"scale(1)",transformOrigin:"100% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0}}),K=new o("antZoomDownIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 100%"}}),w=new o("antZoomDownOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 100%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0}}),I={zoom:{inKeyframes:c,outKeyframes:y},"zoom-big":{inKeyframes:a,outKeyframes:s},"zoom-big-fast":{inKeyframes:a,outKeyframes:s},"zoom-left":{inKeyframes:l,outKeyframes:u},"zoom-right":{inKeyframes:p,outKeyframes:z},"zoom-up":{inKeyframes:g,outKeyframes:O},"zoom-down":{inKeyframes:K,outKeyframes:w}},h=(n,r)=>{const{antCls:m}=n,t=`${m}-${r}`,{inKeyframes:i,outKeyframes:e}=I[r];return[f(t,i,e,r==="zoom-big-fast"?n.motionDurationFast:n.motionDurationMid),{[`
1
+ import{K as o}from"./index-BFMPJahZ.js";import{i as f}from"./motion-Mrl9_kZM.js";const c=new o("antZoomIn",{"0%":{transform:"scale(0.2)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),y=new o("antZoomOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.2)",opacity:0}}),a=new o("antZoomBigIn",{"0%":{transform:"scale(0.8)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),s=new o("antZoomBigOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.8)",opacity:0}}),g=new o("antZoomUpIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 0%"}}),O=new o("antZoomUpOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 0%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0}}),l=new o("antZoomLeftIn",{"0%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"0% 50%"}}),u=new o("antZoomLeftOut",{"0%":{transform:"scale(1)",transformOrigin:"0% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0}}),p=new o("antZoomRightIn",{"0%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"100% 50%"}}),z=new o("antZoomRightOut",{"0%":{transform:"scale(1)",transformOrigin:"100% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0}}),K=new o("antZoomDownIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 100%"}}),w=new o("antZoomDownOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 100%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0}}),I={zoom:{inKeyframes:c,outKeyframes:y},"zoom-big":{inKeyframes:a,outKeyframes:s},"zoom-big-fast":{inKeyframes:a,outKeyframes:s},"zoom-left":{inKeyframes:l,outKeyframes:u},"zoom-right":{inKeyframes:p,outKeyframes:z},"zoom-up":{inKeyframes:g,outKeyframes:O},"zoom-down":{inKeyframes:K,outKeyframes:w}},h=(n,r)=>{const{antCls:m}=n,t=`${m}-${r}`,{inKeyframes:i,outKeyframes:e}=I[r];return[f(t,i,e,r==="zoom-big-fast"?n.motionDurationFast:n.motionDurationMid),{[`
2
2
  ${t}-enter,
3
3
  ${t}-appear
4
4
  `]:{transform:"scale(0)",opacity:0,animationTimingFunction:n.motionEaseOutCirc,"&-prepare":{transform:"none"}},[`${t}-leave`]:{animationTimingFunction:n.motionEaseInOutCirc}}]};export{h as i,c as z};
@@ -8,7 +8,7 @@
8
8
  // Injected by web-ui-server.js at serve time
9
9
  window.__CC_CONFIG__ = __CC_CONFIG_PLACEHOLDER__;
10
10
  </script>
11
- <script type="module" crossorigin src="./assets/index-DjJD0ItG.js"></script>
11
+ <script type="module" crossorigin src="./assets/index-BFMPJahZ.js"></script>
12
12
  <link rel="modulepreload" crossorigin href="./assets/vendor-Bn1JzzAn.js">
13
13
  <link rel="modulepreload" crossorigin href="./assets/icons-DG5UD-6K.js">
14
14
  <link rel="stylesheet" crossorigin href="./assets/index-Cq93VfoF.css">
@@ -5,7 +5,7 @@
5
5
  "a2a": "Usage: chainlesschain a2a [options] [command]\n\nA2A Protocol — agent-to-agent communication\n\nOptions:\n -h, --help display help for command\n\nCommands:\n register [options] <name> Register an agent card\n discover [options] Discover agents by capability or skill\n submit [options] <agent-id> <input> Submit a task to an agent\n status [options] <task-id> Get task status\n complete <task-id> <output> Mark a task as completed\n fail <task-id> <error> Mark a task as failed\n peers [options] List all registered agents\n cards [options] List all agent cards with details\n negotiate [options] <agent-id> <capabilities> Check if an agent supports required capabilities\n task-statuses [options] List V2 task statuses (Phase 81)\n card-statuses [options] List V2 card statuses (Phase 81)\n subscription-types [options] List V2 subscription types (Phase 81)\n negotiation-results [options] List V2 negotiation outcomes (Phase 81)\n validate-card [options] <name> Validate an agent card against the A2A schema\n set-card-status [options] <cardId> <status> Transition a card between active/inactive/expired\n card-status [options] <cardId> Show a card's V2 status\n send-task-v2 [options] <agentId> <input> Submit a V2 task (in-memory, with optional timeout)\n start-working [options] <taskId> Transition a V2 task to working\n request-input [options] <taskId> <prompt> Request user input while a V2 task is working\n provide-input [options] <taskId> <input> Provide input for an input-required V2 task\n complete-task-v2 [options] <taskId> [output] Complete a V2 task (from working only)\n fail-task-v2 [options] <taskId> [error] Fail a V2 task with an error message\n cancel-task [options] <taskId> [reason] Cancel a non-terminal V2 task\n check-timeout [options] <taskId> Check V2 task timeout (auto-fails if past deadline)\n task-v2 [options] <taskId> Show a V2 task snapshot\n tasks-v2 [options] List V2 tasks\n negotiate-v2 [options] <cardJson> Phase 81 capability negotiation against an agent card\n stats-v2 [options] Aggregate V2 stats (tasks + cards + subscriptions)\n enums-v2 Show V2 governance enums\n register-agent-v2 [options] Register an a2a agent profile (pending)\n activate-agent-v2 <id> Activate agent\n suspend-agent-v2 <id> Suspend agent\n retire-agent-v2 <id> Retire agent (terminal)\n touch-agent-v2 <id> Refresh lastTouchedAt\n get-agent-v2 <id> Get agent\n list-agents-v2 List agents\n create-message-v2 [options] Create an a2a message (queued)\n start-message-v2 <id> Transition message to sending\n deliver-message-v2 <id> Transition message to delivered\n fail-message-v2 [options] <id> Fail message\n cancel-message-v2 [options] <id> Cancel message\n get-message-v2 <id> Get message\n list-messages-v2 List messages\n set-max-active-agents-v2 <n> Set per-owner active cap\n set-max-pending-messages-v2 <n> Set per-agent pending cap\n set-agent-idle-ms-v2 <n> Set idle threshold\n set-message-stuck-ms-v2 <n> Set stuck threshold\n auto-suspend-idle-agents-v2 Auto-suspend idle agents\n auto-fail-stuck-messages-v2 Auto-fail stuck sending messages\n gov-stats-v2 V2 governance aggregate stats\n help [command] display help for command\n",
6
6
  "activitypub": "Usage: chainlesschain activitypub|ap [options] [command]\n\nActivityPub C2S bridge — actors, outbox/inbox, Follow/Create/Like/Announce\n\nOptions:\n -h, --help display help for command\n\nCommands:\n actor Manage local and remote ActivityPub actors\n publish [options] <content> Publish a Create(Note) activity to the actor's outbox\n follow [options] <target> Publish a Follow activity (target: username or actor URL)\n accept [options] <follow-activity-id> Accept a pending Follow request\n unfollow [options] <target> Publish an Undo(Follow) activity\n like [options] <object-id> Publish a Like activity for an object URL\n announce [options] <object-id> Publish an Announce (boost) activity for an object URL\n outbox [options] <username> List an actor's outbox activities\n inbox [options] <username> List an actor's inbox activities\n deliver [options] <username> <activity-json> Simulate inbox delivery — push a JSON activity into a local actor's inbox\n followers [options] <username> List followers of an actor\n search [options] <query> Search actors and/or notes in the local Fediverse index\n following [options] <username> List who this actor is following\n enums-v2 Show V2 enums\n register-actor-v2 [options] Register an AP actor profile (pending)\n activate-actor-v2 <id> Activate actor\n suspend-actor-v2 <id> Suspend actor\n deactivate-actor-v2 <id> Deactivate actor (terminal)\n touch-actor-v2 <id> Refresh lastTouchedAt\n get-actor-v2 <id> Get actor\n list-actors-v2 List actors\n create-activity-v2 [options] Create an AP activity (queued)\n start-activity-v2 <id> Transition activity to delivering\n deliver-activity-v2 <id> Transition activity to delivered\n fail-activity-v2 [options] <id> Fail activity\n cancel-activity-v2 [options] <id> Cancel activity\n get-activity-v2 <id> Get activity\n list-activities-v2 List activities\n set-max-active-actors-v2 <n> Set per-owner active cap\n set-max-pending-activities-v2 <n> Set per-actor pending cap\n set-actor-idle-ms-v2 <n> Set idle threshold\n set-activity-stuck-ms-v2 <n> Set stuck threshold\n auto-suspend-idle-actors-v2 Auto-suspend idle actors\n auto-fail-stuck-activities-v2 Auto-fail stuck delivering activities\n gov-stats-v2 V2 governance aggregate stats\n help [command] display help for command\n",
7
7
  "agenda": "Usage: chainlesschain agenda [options] [command]\n\nFire agent-scheduled wakeups / crons / monitors (persisted by the `schedule`\ntool)\n\nOptions:\n -h, --help display help for command\n\nCommands:\n list [options] List all scheduled entries\n run [options] Fire every entry that is due now\n cancel [options] <id> Remove a scheduled entry by id\n prune [options] Remove finished entries (fired / matched / exhausted /\n expired)\n help [command] display help for command\n",
8
- "agent": "Usage: chainlesschain agent|a [options] [task...]\n\nStart an agentic AI session (reads/writes files, runs commands)\n\nArguments:\n task Headless task 鈥?when given (or with -p /\n piped stdin), runs non-interactively\n\nOptions:\n --model <model> Model name\n --provider <provider> LLM provider (ollama, openai,\n volcengine, deepseek, ...)\n --base-url <url> API base URL\n --api-key <key> API key\n --think [level] Enable Anthropic extended thinking\n (level: think | hard | ultra; Anthropic\n models only)\n --ultrathink Maximum Anthropic extended thinking (=\n --think ultra)\n --thinking-budget <n> Thinking token budget for legacy Claude\n models (Sonnet 4.5 / Opus 4.0-4.5 /\n older); clamped below max_tokens.\n Adaptive-thinking models ignore it (they\n use --think's effort). Requires\n --think/--ultrathink.\n --image <path> Attach an image (png/jpg/jpeg/gif/webp)\n to the prompt for a vision-capable model\n (headless; repeatable)\n --vision-model <id> Model to use when an image is attached\n (default: config llm.visionModel or\n doubao-seed-2-0-lite-260215)\n --session <id> Resume a previous agent session\n -c, --continue Resume the most recent session (no id\n needed 鈥?claude --continue parity)\n --resume [id] Resume a session by id (no id 鈫?most\n recent 鈥?claude --resume parity)\n --fork-session When resuming, branch into a NEW session\n id and leave the original untouched\n (claude --fork-session parity)\n --fork-request-id <key> Stable idempotency key for\n --fork-session retries (omit for a new\n fork each invocation)\n --add-dir <dir> Extra working directory the agent may\n read/search/edit (repeatable)\n --checkpoint Auto-snapshot the work tree before each\n mutating tool (DEFAULT inside a git\n repo; cc checkpoint restore to roll\n back)\n --no-checkpoint Disable auto-checkpointing (it is on by\n default inside git repos)\n --managed-checkpoint Checkpoint bounded mutating tools with\n Process Broker; unavailable writer\n lifetimes are reported as coverage none\n --managed-checkpoint-state <dir> Durable managed-checkpoint state\n directory (must be outside the\n workspace)\n --managed-checkpoint-exclude <path> Explicit workspace path excluded from\n managed checkpoints; repeatable and\n reported as partial coverage\n --safe-mode Run bare: disable project memory,\n settings hooks, memory recall, IDE\n context, status line and update notice\n (permission rules STAY active)\n --bare Everything --safe-mode disables PLUS\n skills, plugins and MCP/IDE auto-connect\n — minimal fast surface for scripted\n calls (explicit --mcp-config still\n loads; permission rules STAY active)\n --ephemeral No session persistence: nothing is\n written to the session store (headless;\n a --resume id still replays history\n read-only)\n --decision-mode <mode> Jev Skill-routing experiment for durable\n headless sessions: off | shadow |\n suggest (default: \"off\")\n --decision-model <model> TypeSafe decision model (default:\n jev-latest)\n --decision-base-url <url> TypeSafe decision API base URL (HTTPS or\n loopback only)\n --decision-timeout-ms <ms> Jev decision timeout in milliseconds\n (50-30000; default: 800)\n --capabilities Print a machine-readable capability\n manifest (JSON: protocol version, tools,\n permission modes, exit codes) and exit\n --disable-slash-commands Interactive REPL: don't dispatch '/'\n input as slash commands — it reaches the\n model verbatim (/exit and /quit stay\n live)\n --ax-screen-reader Screen-reader friendly output: no ANSI\n colors, no in-place status line repaints\n (also CC_SCREEN_READER=1)\n --worktree Run this session in a fresh git worktree\n (isolated branch; auto-removed when the\n session changes nothing)\n --no-worktree Background Git task: explicitly share\n the current work tree (intended for\n read-only tasks; writable runs are not\n isolated)\n --unattended Enable fail-closed shell action policy\n for scheduled/event-driven runs\n --unattended-allow <classes> Comma-separated action classes\n explicitly allowed for unattended shell\n runs\n --sandbox [image] Run shell commands in an ephemeral\n Docker sandbox (network disabled by\n default)\n --sandbox-mode <mode> Sandbox posture: off | workspace-write |\n strict (explicit isolation modes fail\n closed)\n --sandbox-network Allow network access inside --sandbox\n --otlp <file> Write the agent run's OpenTelemetry\n spans (model/tool/retry) as OTLP/JSON to\n <file>\n --otlp-content Include prompt/response CONTENT in\n --otlp spans (off by default; content is\n redacted unless this is set)\n --auto-rewake When an async `asyncRewake` hook (e.g. a\n background test) fails at turn end,\n re-engage the agent to fix it (bounded\n by --max-rewakes)\n --auto-pin Force-pin the original task (first user\n turn) through compaction (ON by default;\n disable with CC_AUTO_PIN=0 or config\n context.autoPin=false)\n --max-rewakes <n> Max auto-rewake re-drives per run\n (default 1); implies --auto-rewake\n --bg, --background Start as a detached background agent and\n return its id immediately\n --agent-id <id> Agent id for scoped memory recall\n --recall-limit <n> Top-K memories to inject into system\n prompt\n --recall-query <q> Query string for startup memory recall\n --no-recall-memory Disable startup memory recall\n --vim Start the interactive REPL in vim-mode\n line editing (toggle later with /vim; or\n CC_VIM=1)\n --no-stream Disable streamed response rendering\n --no-park-on-exit Close the session-core handle on exit\n instead of parking it\n --bundle <path> Agent bundle directory (may execute\n local MCP commands from mcp.json)\n -p, --print [prompt] Headless: run one non-interactive turn\n and exit\n --output-format <fmt> Headless output: text | json |\n stream-json (default: \"text\")\n --max-turns <n> Cap agent loop iterations (0 =\n unlimited; interactive streams default\n to unlimited, unattended runs to 50)\n --json-schema <file> Headless structured output: final reply\n must be JSON validating against this\n schema (invalid replies retried)\n --allowed-tools <list> Comma/space-separated tool allow-list\n (headless)\n --disallowed-tools <list> Comma/space-separated tool deny-list\n (headless)\n --permission-mode <mode> manual | auto | dontAsk | default | plan\n | acceptEdits | bypassPermissions (plan\n headless-only)\n --no-file-refs Disable @path file-reference expansion\n in the prompt (headless)\n --no-slash-macros Disable /name custom-command\n (.claude/commands) expansion in the\n prompt (headless)\n --system-prompt <text> Replace the built-in system prompt\n (literal text or @file)\n --append-system-prompt <text> Append extra guidance to the system\n prompt (literal text or @file)\n --no-project-memory Skip auto-loaded project memory (cc.md /\n CLAUDE.md / AGENTS.md hierarchy,\n .chainlesschain/rules.md,\n .claude/rules/*.md) — a lean system\n prompt for token-tight surfaces (e.g.\n IDE chat). The agent can still read\n those files with tools when it needs\n them.\n --output-style <name> Apply a named output-style persona\n (.claude/output-styles/<name>.md or a\n built-in: concise | explanatory |\n learning)\n --input-format <fmt> Headless input: text | stream-json\n (NDJSON user events on stdin,\n multi-turn) (default: \"text\")\n --trace-id <id> Correlation id stamped as `trace_id` on\n every stream-json output line (also read\n from CC_TRACE_ID). Lets an IDE/bridge\n trace one run across its own logs, the\n CLI, transcripts and diagnostics.\n Auto-generated per run when omitted.\n --fallback-model <model> Backup model(s) to try in order when the\n primary fails (transient error or\n model-not-found). Repeatable or\n comma-separated; up to 3. A\n `provider:model` entry (e.g.\n openai:gpt-4o) falls back\n cross-provider, using that provider's\n API key from its env var (skipped if\n unset — never reuses the primary key).\n Defaults to config llm.fallbackModels.\n --include-partial-messages Emit live assistant-text deltas as\n stream_event lines (requires\n --output-format stream-json)\n --include-hook-events Emit redacted hook and subagent\n lifecycle events (requires\n --output-format stream-json)\n --goal [id] Bind a cc goal into the run (id, or omit\n the value to auto-resolve the active\n goal)\n --goal-assess After the run, ask the model to assess\n goal progress and persist it (opt-in;\n costs one extra completion; requires\n --goal)\n --goal-condition <spec> Session completion condition; re-drives\n outer turns until met. Prefix\n exit-zero:/file-exists:/contains:/regex:\n (deterministic) or model:<desc>\n (model-judged)\n --max-outer-turns <n> Max outer re-drive turns for\n --goal-condition (default 10, hard cap\n 100)\n --goal-max-tokens <n> Token budget across --goal-condition\n outer turns\n --goal-max-cost <usd> Cost budget (USD) across\n --goal-condition outer turns\n --goal-max-time <ms> Wall-clock budget (ms) across\n --goal-condition outer turns\n --mcp-config <file> Load ad-hoc MCP servers from a JSON file\n for this run (headless); their tools\n become callable (mcp__<server>__<tool>)\n --no-mcp Don't auto-connect MCP servers\n registered with `cc mcp add\n --auto-connect` (--mcp-config still\n loads)\n --ide Force-enable IDE bridge auto-connect:\n discover a running editor's MCP server\n via ~/.chainlesschain/ide/*.json\n (default: auto inside an IDE integrated\n terminal)\n --no-ide Disable IDE bridge auto-connect\n --pdh Force-enable PDH bridge auto-connect:\n discover the Android app's\n device-capability MCP server via\n ~/.chainlesschain/pdh-bridge/*.json\n (default: auto when\n CHAINLESSCHAIN_PDH_PORT is set)\n --no-pdh Disable PDH bridge auto-connect\n --jetbrains Force-enable IntelliJ IDEA built-in MCP\n (IDEA >= 2025.2) as server `idea`\n (default: auto when the ChainlessChain\n JetBrains plugin injects\n CHAINLESSCHAIN_JETBRAINS_MCP_URL)\n --no-jetbrains Disable IDEA built-in MCP auto-connect\n --interactive-approvals Stream mode: confirm-tier approvals\n become approval_request/approval\n stdin-stdout events instead of failing\n closed (chat-panel UX)\n --permission-prompt-tool <tool> Defer tool approvals to an MCP tool\n (mcp__<server>__<tool>; requires\n --mcp-config) instead of headless\n fail-closed\n --remote-control Route confirm-tier approvals to paired\n mobile/web devices — requires a relay or\n explicit LAN opt-in; headless waits\n fail-closed, interactive races the\n terminal prompt (also /remote-control)\n --remote-control-allow-lan Permit --remote-control to expose its\n authenticated WS endpoint on a trusted\n LAN\n --channels <list> Inbound channels for the interactive\n session (webhook[:port],telegram) —\n external events enter as user turns;\n webhook needs its bearer token, telegram\n needs channels.telegram.allowFrom\n --settings <file> Merge an extra\n .claude/settings.json-shaped file for\n this run: permission rules\n (allow/ask/deny) + native config\n overrides (model, env)\n --max-budget-usd <amount> Hard USD spend cap: stop the run before\n the next paid LLM call once the\n estimated cost reaches this (headless;\n uses the cc cost price table)\n --session-budget Enable the durable session-wide budget\n authority (headless; requires\n --session/--resume/--continue)\n --session-max-concurrent <n> Durable session cap for concurrent child\n work\n --session-max-spawns <n> Durable session cap for total child-work\n admissions\n --session-max-depth <n> Durable session cap for child-agent\n nesting depth\n --session-max-turns <n> Durable session cap for model turns\n across resumes\n --session-max-tokens <n> Durable session cap for\n provider-reported tokens across resumes\n --session-max-cost-usd <amount> Durable session cost cap across resumes\n (requires priced provider usage)\n --session-max-wall-ms <n> Durable session cap for cumulative\n active wall time\n --session-max-tool-ms <n> Durable session cap for aggregate tool\n execution time\n --observability-workspace <id> Persist a workspace scope on new session\n authority for causal reports\n --observability-team <id> Persist a team scope on new session\n authority for causal reports\n --observability-policy <id> Persist a policy scope on new session\n authority for causal reports\n --strict-mcp-config Use ONLY --mcp-config servers; ignore\n registered (cc mcp add) and IDE-bridge\n MCP for a reproducible tool surface\n --project-mcp Opt in to loading a project-scoped\n .mcp.json (default off; a checked-in\n .mcp.json can spawn commands)\n --replay-user-messages Stream-input mode: echo each accepted\n stdin user message back as a `user`\n event (transcript/correlation)\n --allow-dangerous-bypass Bypass all permission prompts in\n headless mode (DANGEROUS: auto-approves\n all tool calls) (default: false)\n -y, --yolo Alias for --allow-dangerous-bypass\n (default: false)\n --dangerously-skip-permissions Alias for --allow-dangerous-bypass\n (default: false)\n -h, --help display help for command\n",
8
+ "agent": "Usage: chainlesschain agent|a [options] [task...]\n\nStart an agentic AI session (reads/writes files, runs commands)\n\nArguments:\n task Headless task 鈥?when given (or with -p /\n piped stdin), runs non-interactively\n\nOptions:\n --model <model> Model name\n --provider <provider> LLM provider (ollama, openai,\n volcengine, deepseek, ...)\n --base-url <url> API base URL\n --api-key <key> API key\n --think [level] Enable Anthropic extended thinking\n (level: think | hard | ultra; Anthropic\n models only)\n --ultrathink Maximum Anthropic extended thinking (=\n --think ultra)\n --thinking-budget <n> Thinking token budget for legacy Claude\n models (Sonnet 4.5 / Opus 4.0-4.5 /\n older); clamped below max_tokens.\n Adaptive-thinking models ignore it (they\n use --think's effort). Requires\n --think/--ultrathink.\n --image <path> Attach an image (png/jpg/jpeg/gif/webp)\n to the prompt for a vision-capable model\n (headless; repeatable)\n --vision-model <id> Model to use when an image is attached\n (default: config llm.visionModel or\n doubao-seed-2-0-lite-260215)\n --session <id> Resume a previous agent session\n -c, --continue Resume the most recent session (no id\n needed 鈥?claude --continue parity)\n --resume [id] Resume a session by id (no id 鈫?most\n recent 鈥?claude --resume parity)\n --fork-session When resuming, branch into a NEW session\n id and leave the original untouched\n (claude --fork-session parity)\n --fork-request-id <key> Stable idempotency key for\n --fork-session retries (omit for a new\n fork each invocation)\n --add-dir <dir> Extra working directory the agent may\n read/search/edit (repeatable)\n --checkpoint Auto-snapshot the work tree before each\n mutating tool (DEFAULT inside a git\n repo; cc checkpoint restore to roll\n back)\n --no-checkpoint Disable auto-checkpointing (it is on by\n default inside git repos)\n --managed-checkpoint Checkpoint bounded mutating tools with\n Process Broker; unavailable writer\n lifetimes are reported as coverage none\n --managed-checkpoint-state <dir> Durable managed-checkpoint state\n directory (must be outside the\n workspace)\n --managed-checkpoint-exclude <path> Explicit workspace path excluded from\n managed checkpoints; repeatable and\n reported as partial coverage\n --safe-mode Run bare: disable project memory,\n settings hooks, memory recall, IDE\n context, status line and update notice\n (permission rules STAY active)\n --bare Everything --safe-mode disables PLUS\n skills, plugins and MCP/IDE auto-connect\n — minimal fast surface for scripted\n calls (explicit --mcp-config still\n loads; permission rules STAY active)\n --ephemeral No session persistence: nothing is\n written to the session store (headless;\n a --resume id still replays history\n read-only)\n --decision-mode <mode> Typed Skill-routing experiment for\n durable headless sessions: off | shadow\n | suggest (default: \"off\")\n --decision-provider <provider> Decision provider: typesafe | laya\n (local) | system-one (compatible API)\n (default: \"typesafe\")\n --decision-model <model> Decision model (defaults:\n typesafe=jev-latest, laya=laya; required\n for system-one)\n --decision-base-url <url> System One API base URL (laya: loopback\n only; other providers: HTTPS or\n loopback)\n --decision-timeout-ms <ms> Decision timeout in milliseconds\n (50-30000; default: 800)\n --capabilities Print a machine-readable capability\n manifest (JSON: protocol version, tools,\n permission modes, exit codes) and exit\n --disable-slash-commands Interactive REPL: don't dispatch '/'\n input as slash commands — it reaches the\n model verbatim (/exit and /quit stay\n live)\n --ax-screen-reader Screen-reader friendly output: no ANSI\n colors, no in-place status line repaints\n (also CC_SCREEN_READER=1)\n --worktree Run this session in a fresh git worktree\n (isolated branch; auto-removed when the\n session changes nothing)\n --no-worktree Background Git task: explicitly share\n the current work tree (intended for\n read-only tasks; writable runs are not\n isolated)\n --unattended Enable fail-closed shell action policy\n for scheduled/event-driven runs\n --unattended-allow <classes> Comma-separated action classes\n explicitly allowed for unattended shell\n runs\n --sandbox [image] Run shell commands in an ephemeral\n Docker sandbox (network disabled by\n default)\n --sandbox-mode <mode> Sandbox posture: off | workspace-write |\n strict (explicit isolation modes fail\n closed)\n --sandbox-network Allow network access inside --sandbox\n --otlp <file> Write the agent run's OpenTelemetry\n spans (model/tool/retry) as OTLP/JSON to\n <file>\n --otlp-content Include prompt/response CONTENT in\n --otlp spans (off by default; content is\n redacted unless this is set)\n --auto-rewake When an async `asyncRewake` hook (e.g. a\n background test) fails at turn end,\n re-engage the agent to fix it (bounded\n by --max-rewakes)\n --auto-pin Force-pin the original task (first user\n turn) through compaction (ON by default;\n disable with CC_AUTO_PIN=0 or config\n context.autoPin=false)\n --max-rewakes <n> Max auto-rewake re-drives per run\n (default 1); implies --auto-rewake\n --bg, --background Start as a detached background agent and\n return its id immediately\n --agent-id <id> Agent id for scoped memory recall\n --recall-limit <n> Top-K memories to inject into system\n prompt\n --recall-query <q> Query string for startup memory recall\n --no-recall-memory Disable startup memory recall\n --vim Start the interactive REPL in vim-mode\n line editing (toggle later with /vim; or\n CC_VIM=1)\n --no-stream Disable streamed response rendering\n --no-park-on-exit Close the session-core handle on exit\n instead of parking it\n --bundle <path> Agent bundle directory (may execute\n local MCP commands from mcp.json)\n -p, --print [prompt] Headless: run one non-interactive turn\n and exit\n --output-format <fmt> Headless output: text | json |\n stream-json (default: \"text\")\n --max-turns <n> Cap agent loop iterations (0 =\n unlimited; interactive streams default\n to unlimited, unattended runs to 50)\n --json-schema <file> Headless structured output: final reply\n must be JSON validating against this\n schema (invalid replies retried)\n --allowed-tools <list> Comma/space-separated tool allow-list\n (headless)\n --disallowed-tools <list> Comma/space-separated tool deny-list\n (headless)\n --permission-mode <mode> manual | auto | dontAsk | default | plan\n | acceptEdits | bypassPermissions (plan\n headless-only)\n --no-file-refs Disable @path file-reference expansion\n in the prompt (headless)\n --no-slash-macros Disable /name custom-command\n (.claude/commands) expansion in the\n prompt (headless)\n --system-prompt <text> Replace the built-in system prompt\n (literal text or @file)\n --append-system-prompt <text> Append extra guidance to the system\n prompt (literal text or @file)\n --no-project-memory Skip auto-loaded project memory (cc.md /\n CLAUDE.md / AGENTS.md hierarchy,\n .chainlesschain/rules.md,\n .claude/rules/*.md) — a lean system\n prompt for token-tight surfaces (e.g.\n IDE chat). The agent can still read\n those files with tools when it needs\n them.\n --output-style <name> Apply a named output-style persona\n (.claude/output-styles/<name>.md or a\n built-in: concise | explanatory |\n learning)\n --input-format <fmt> Headless input: text | stream-json\n (NDJSON user events on stdin,\n multi-turn) (default: \"text\")\n --trace-id <id> Correlation id stamped as `trace_id` on\n every stream-json output line (also read\n from CC_TRACE_ID). Lets an IDE/bridge\n trace one run across its own logs, the\n CLI, transcripts and diagnostics.\n Auto-generated per run when omitted.\n --fallback-model <model> Backup model(s) to try in order when the\n primary fails (transient error or\n model-not-found). Repeatable or\n comma-separated; up to 3. A\n `provider:model` entry (e.g.\n openai:gpt-4o) falls back\n cross-provider, using that provider's\n API key from its env var (skipped if\n unset — never reuses the primary key).\n Defaults to config llm.fallbackModels.\n --include-partial-messages Emit live assistant-text deltas as\n stream_event lines (requires\n --output-format stream-json)\n --include-hook-events Emit redacted hook and subagent\n lifecycle events (requires\n --output-format stream-json)\n --goal [id] Bind a cc goal into the run (id, or omit\n the value to auto-resolve the active\n goal)\n --goal-assess After the run, ask the model to assess\n goal progress and persist it (opt-in;\n costs one extra completion; requires\n --goal)\n --goal-condition <spec> Session completion condition; re-drives\n outer turns until met. Prefix\n exit-zero:/file-exists:/contains:/regex:\n (deterministic) or model:<desc>\n (model-judged)\n --max-outer-turns <n> Max outer re-drive turns for\n --goal-condition (default 10, hard cap\n 100)\n --goal-max-tokens <n> Token budget across --goal-condition\n outer turns\n --goal-max-cost <usd> Cost budget (USD) across\n --goal-condition outer turns\n --goal-max-time <ms> Wall-clock budget (ms) across\n --goal-condition outer turns\n --mcp-config <file> Load ad-hoc MCP servers from a JSON file\n for this run (headless); their tools\n become callable (mcp__<server>__<tool>)\n --no-mcp Don't auto-connect MCP servers\n registered with `cc mcp add\n --auto-connect` (--mcp-config still\n loads)\n --ide Force-enable IDE bridge auto-connect:\n discover a running editor's MCP server\n via ~/.chainlesschain/ide/*.json\n (default: auto inside an IDE integrated\n terminal)\n --no-ide Disable IDE bridge auto-connect\n --pdh Force-enable PDH bridge auto-connect:\n discover the Android app's\n device-capability MCP server via\n ~/.chainlesschain/pdh-bridge/*.json\n (default: auto when\n CHAINLESSCHAIN_PDH_PORT is set)\n --no-pdh Disable PDH bridge auto-connect\n --jetbrains Force-enable IntelliJ IDEA built-in MCP\n (IDEA >= 2025.2) as server `idea`\n (default: auto when the ChainlessChain\n JetBrains plugin injects\n CHAINLESSCHAIN_JETBRAINS_MCP_URL)\n --no-jetbrains Disable IDEA built-in MCP auto-connect\n --interactive-approvals Stream mode: confirm-tier approvals\n become approval_request/approval\n stdin-stdout events instead of failing\n closed (chat-panel UX)\n --permission-prompt-tool <tool> Defer tool approvals to an MCP tool\n (mcp__<server>__<tool>; requires\n --mcp-config) instead of headless\n fail-closed\n --remote-control Route confirm-tier approvals to paired\n mobile/web devices — requires a relay or\n explicit LAN opt-in; headless waits\n fail-closed, interactive races the\n terminal prompt (also /remote-control)\n --remote-control-allow-lan Permit --remote-control to expose its\n authenticated WS endpoint on a trusted\n LAN\n --channels <list> Inbound channels for the interactive\n session (webhook[:port],telegram) —\n external events enter as user turns;\n webhook needs its bearer token, telegram\n needs channels.telegram.allowFrom\n --settings <file> Merge an extra\n .claude/settings.json-shaped file for\n this run: permission rules\n (allow/ask/deny) + native config\n overrides (model, env)\n --max-budget-usd <amount> Hard USD spend cap: stop the run before\n the next paid LLM call once the\n estimated cost reaches this (headless;\n uses the cc cost price table)\n --session-budget Enable the durable session-wide budget\n authority (headless; requires\n --session/--resume/--continue)\n --session-max-concurrent <n> Durable session cap for concurrent child\n work\n --session-max-spawns <n> Durable session cap for total child-work\n admissions\n --session-max-depth <n> Durable session cap for child-agent\n nesting depth\n --session-max-turns <n> Durable session cap for model turns\n across resumes\n --session-max-tokens <n> Durable session cap for\n provider-reported tokens across resumes\n --session-max-cost-usd <amount> Durable session cost cap across resumes\n (requires priced provider usage)\n --session-max-wall-ms <n> Durable session cap for cumulative\n active wall time\n --session-max-tool-ms <n> Durable session cap for aggregate tool\n execution time\n --observability-workspace <id> Persist a workspace scope on new session\n authority for causal reports\n --observability-team <id> Persist a team scope on new session\n authority for causal reports\n --observability-policy <id> Persist a policy scope on new session\n authority for causal reports\n --strict-mcp-config Use ONLY --mcp-config servers; ignore\n registered (cc mcp add) and IDE-bridge\n MCP for a reproducible tool surface\n --project-mcp Opt in to loading a project-scoped\n .mcp.json (default off; a checked-in\n .mcp.json can spawn commands)\n --replay-user-messages Stream-input mode: echo each accepted\n stdin user message back as a `user`\n event (transcript/correlation)\n --allow-dangerous-bypass Bypass all permission prompts in\n headless mode (DANGEROUS: auto-approves\n all tool calls) (default: false)\n -y, --yolo Alias for --allow-dangerous-bypass\n (default: false)\n --dangerously-skip-permissions Alias for --allow-dangerous-bypass\n (default: false)\n -h, --help display help for command\n",
9
9
  "agent-network": "Usage: chainlesschain agent-network|anet [options] [command]\n\nDecentralized Agent Network (Phase 24) — DID / registry / credentials / task\nrouting\n\nOptions:\n -h, --help display help for command\n\nCommands:\n config [options] Show network constants & reputation weights\n dimensions [options] List reputation dimensions\n task-statuses [options] List task lifecycle statuses\n did-create [options] Create an Agent DID (Ed25519 + DID document)\n did-resolve [options] <did> Resolve DID → DID document\n dids [options] List Agent DIDs\n did-deactivate [options] <did> Deactivate a DID (also forces registry offline)\n sign [options] <did> <data> Sign data with agent's Ed25519 key\n verify [options] <did> <data> <signature> Verify a signature from an agent\n register [options] <did> <orgId> Register an Agent in the federated registry\n unregister [options] <did> Remove an Agent from the registry\n heartbeat [options] <did> Bump last_heartbeat (forces online)\n discover [options] Discover agents (capability / org / status)\n sweep [options] Mark stale online agents offline\n peer-add [options] <peerId> Add/update a Kademlia peer (k-bucket auto-computed)\n peer-remove [options] <peerId> Remove a peer\n peers [options] List peers (optionally by k-bucket)\n auth-start [options] <did> Issue an auth challenge for a DID\n auth-complete [options] <sessionId> <signature> Complete auth with signature over challenge\n auth-validate [options] <token> Validate a session token (returns agentDid or exits 1)\n auth-sessions [options] List auth sessions\n credential-issue [options] <issuerDid> <subjectDid> Issue a VC with HMAC/Ed25519 proof\n credential-verify [options] <id> Verify a VC (signature + expiry + revocation)\n credential-revoke [options] <id> Revoke a credential\n credential-show [options] <id> Show a credential\n credentials [options] List credentials (filter by subject/issuer/status/type)\n task-route [options] <sourceOrg> <taskType> Route task → pick best-rep agent matching capability\n task-show [options] <taskId> Show a task\n task-status [options] <taskId> <status> Update task status (terminal states set completedAt)\n task-cancel [options] <taskId> Cancel a task (sets CANCELLED + reason)\n tasks [options] List tasks\n rep-update [options] <did> <dimension> <score> Record a reputation observation\n rep-show [options] <did> Show reputation summary (weighted total + per-dim avg)\n rep-history [options] <did> Show reputation history (newest first)\n rep-top [options] Top agents by dimension (or total)\n stats [options] Network-level statistics\n agent-maturities-v2 List V2 agent maturity states\n task-lifecycles-v2 List V2 task lifecycle states\n stats-v2 V2 agent-network stats\n get-max-active-agents-v2 Get max active agents per network (V2)\n set-max-active-agents-v2 <n> Set max active agents per network (V2)\n get-max-pending-tasks-v2 Get max pending tasks per agent (V2)\n set-max-pending-tasks-v2 <n> Set max pending tasks per agent (V2)\n get-agent-idle-ms-v2 Get agent idle threshold (V2)\n set-agent-idle-ms-v2 <ms> Set agent idle threshold (V2)\n get-task-stuck-ms-v2 Get task stuck threshold (V2)\n set-task-stuck-ms-v2 <ms> Set task stuck threshold (V2)\n active-agent-count-v2 <networkId> Active agent count for network (V2)\n pending-task-count-v2 <agentId> Pending task count for agent (V2)\n register-agent-v2 [options] <id> Register a V2 agent\n get-agent-v2 <id> Get a V2 agent\n list-agents-v2 [options] List V2 agents\n set-agent-status-v2 <id> <next> Set V2 agent status\n activate-agent-v2 <id> Activate a V2 agent\n suspend-agent-v2 <id> Suspend a V2 agent\n revoke-agent-v2 <id> Revoke a V2 agent\n touch-agent-v2 <id> Touch a V2 agent\n create-task-v2 [options] <id> Create a V2 task\n get-task-v2 <id> Get a V2 task\n list-tasks-v2 [options] List V2 tasks\n set-task-status-v2 <id> <next> Set V2 task status\n start-task-v2 <id> Start a V2 task\n complete-task-v2 <id> Complete a V2 task\n fail-task-v2 <id> Fail a V2 task\n cancel-task-v2 <id> Cancel a V2 task\n auto-suspend-idle-agents-v2 Auto-suspend idle V2 agents\n auto-fail-stuck-tasks-v2 Auto-fail stuck V2 tasks\n help [command] display help for command\n",
10
10
  "agents": "Usage: chainlesschain agents [options] [command]\n\nUser-defined subagents (.claude/agents/*.md)\n\nOptions:\n -h, --help display help for command\n\nCommands:\n background|bg [options] List background agent sessions\n logs [options] <id> Print recent output from a background agent\n view [options] <id> Show a detailed background agent view\n stop [options] <id> Stop a running background agent\n rename [options] <id> <title...> Rename a background agent session\n list|ls [options] List discovered subagents (project +\n personal)\n show [options] <name> Show an agent's metadata + system prompt\n run [options] <name> [task...] Run a task headlessly as the named subagent\n new [options] <name> Scaffold a new agent file (project-native\n .chainlesschain/agents/)\n help [command] display help for command\n",
11
11
  "android": "Usage: chainlesschain android [options] [command]\n\nAndroid-native bridge: ContentResolver / SAF / Accessibility / Shizuku / root\n(Plan A A7)\n\nOptions:\n -h, --help display help for command\n\nCommands:\n caps [options] Probe what bridge capabilities are available on this\n device\n contacts ContentResolver: contacts\n sms ContentResolver: SMS\n calls ContentResolver: call log\n app PackageManager: app inventory + Intent\n fs SAF / sandbox filesystem\n a11y Accessibility Service\n shizuku Shizuku ADB-like privileges\n root Magisk root su\n perms [options] <name> Check (and request) a runtime permission\n help [command] display help for command\n",
@@ -384,20 +384,25 @@ export function registerAgentCommand(program, dependencies = {}) {
384
384
  )
385
385
  .option(
386
386
  "--decision-mode <mode>",
387
- "Jev Skill-routing experiment for durable headless sessions: off | shadow | suggest",
387
+ "Typed Skill-routing experiment for durable headless sessions: off | shadow | suggest",
388
388
  "off",
389
389
  )
390
+ .option(
391
+ "--decision-provider <provider>",
392
+ "Decision provider: typesafe | laya (local) | system-one (compatible API)",
393
+ "typesafe",
394
+ )
390
395
  .option(
391
396
  "--decision-model <model>",
392
- "TypeSafe decision model (default: jev-latest)",
397
+ "Decision model (defaults: typesafe=jev-latest, laya=laya; required for system-one)",
393
398
  )
394
399
  .option(
395
400
  "--decision-base-url <url>",
396
- "TypeSafe decision API base URL (HTTPS or loopback only)",
401
+ "System One API base URL (laya: loopback only; other providers: HTTPS or loopback)",
397
402
  )
398
403
  .option(
399
404
  "--decision-timeout-ms <ms>",
400
- "Jev decision timeout in milliseconds (50-30000; default: 800)",
405
+ "Decision timeout in milliseconds (50-30000; default: 800)",
401
406
  )
402
407
  .option(
403
408
  "--capabilities",
@@ -1519,6 +1524,9 @@ export function registerAgentCommand(program, dependencies = {}) {
1519
1524
  try {
1520
1525
  if (
1521
1526
  (options.decisionMode || "off") === "off" &&
1527
+ (options.decisionProvider || "typesafe") === "typesafe" &&
1528
+ options.decisionModel === undefined &&
1529
+ options.decisionBaseUrl === undefined &&
1522
1530
  options.decisionTimeoutMs === undefined
1523
1531
  ) {
1524
1532
  decisionConfig = Object.freeze({ mode: "off" });
@@ -1546,11 +1554,15 @@ export function registerAgentCommand(program, dependencies = {}) {
1546
1554
  let decisionApiKey;
1547
1555
  if (decisionMode !== "off") {
1548
1556
  try {
1557
+ const credentialName =
1558
+ decisionConfig.provider === "typesafe"
1559
+ ? "TYPESAFE_API_KEY"
1560
+ : "DECISION_API_KEY";
1549
1561
  decisionApiKey =
1550
- (await resolveCredentialEnvironmentValue("TYPESAFE_API_KEY", {
1562
+ (await resolveCredentialEnvironmentValue(credentialName, {
1551
1563
  env: process.env,
1552
1564
  })) || undefined;
1553
- if (!decisionApiKey) {
1565
+ if (decisionConfig.provider === "typesafe" && !decisionApiKey) {
1554
1566
  throw new Error(
1555
1567
  "TYPESAFE_API_KEY is required when --decision-mode is shadow or suggest",
1556
1568
  );
@@ -2015,6 +2027,7 @@ export function registerAgentCommand(program, dependencies = {}) {
2015
2027
  priceTable,
2016
2028
  sessionBudgetRoot,
2017
2029
  decisionMode,
2030
+ decisionProvider: options.decisionProvider,
2018
2031
  decisionModel: options.decisionModel,
2019
2032
  decisionBaseUrl: options.decisionBaseUrl,
2020
2033
  decisionTimeoutMs: options.decisionTimeoutMs,
@@ -1,6 +1,32 @@
1
1
  {
2
2
  "source": "CHANGELOG.md",
3
3
  "releases": [
4
+ {
5
+ "productVersion": null,
6
+ "cliVersion": "0.166.72",
7
+ "cliVersions": ["0.166.72"],
8
+ "date": null,
9
+ "title": "",
10
+ "sections": [
11
+ {
12
+ "heading": "Fixed - cc CLI 0.166.72: local Skill decision evaluation",
13
+ "body": "- Record a local decision deadline as `provider-timeout` with unknown usage and\n an observation, while preserving user cancellation and ledger failures as\n terminal errors.\n- Report one-sided 95% exact binomial upper bounds for false Skill suggestions\n and accepted suggestion errors; missing denominators can no longer pass the\n offline benchmark quality check.\n- Add a repeatable real-weight Laya smoke probe and document its CPU latency,\n Chinese routing limitation, and checkpoint identities without claiming a\n formal quality or cost result."
14
+ }
15
+ ]
16
+ },
17
+ {
18
+ "productVersion": null,
19
+ "cliVersion": "0.166.71",
20
+ "cliVersions": ["0.166.71"],
21
+ "date": null,
22
+ "title": "",
23
+ "sections": [
24
+ {
25
+ "heading": "Added - cc CLI 0.166.71: open local Skill decision providers",
26
+ "body": "- Add `--decision-provider` selection for the existing governed Skill decision\n layer, with `typesafe`, loopback-only `laya`, and compatible `system-one`\n providers.\n- Run Apache-2.0 Laya models behind a local `/v1/systemone` service without a\n TypeSafe credential, while preserving the durable-session, candidate-binding,\n budget, timeout, and observation boundaries introduced by the Jev pilot.\n- Keep TypeSafe and local-service credentials isolated: TypeSafe continues to\n require `TYPESAFE_API_KEY`; authenticated Laya and compatible services may use\n `DECISION_API_KEY` and never inherit the TypeSafe secret.\n- Reject redirects, URL credentials, remote plaintext endpoints, and non-loopback\n Laya endpoints. Invalid or unavailable local decisions leave the existing\n Skill retrieval result unchanged.\n- Document a pinned real-backend `laya-serve` setup and the limits of model\n labels, multilingual routing, context windows, and upstream benchmark claims."
27
+ }
28
+ ]
29
+ },
4
30
  {
5
31
  "productVersion": null,
6
32
  "cliVersion": "0.166.70",
@@ -3,9 +3,46 @@ import { performance } from "node:perf_hooks";
3
3
  import { decisionDigest } from "./contracts.js";
4
4
 
5
5
  export const SKILL_DECISION_BENCHMARK_SCHEMA =
6
- "chainlesschain.skill-decision-benchmark/v1";
6
+ "chainlesschain.skill-decision-benchmark/v2";
7
7
 
8
8
  const DIGEST = /^sha256:[a-f0-9]{64}$/u;
9
+ const ONE_SIDED_ALPHA = 0.05;
10
+
11
+ // Exact Clopper-Pearson upper bound: find p where P(Binomial(n, p) <= k)
12
+ // equals alpha. Keep zero-denominator metrics inconclusive.
13
+ function binomialUpperBound(errors, trials) {
14
+ if (trials === 0) return null;
15
+ if (errors === trials) return 1;
16
+ if (errors === 0) return -Math.expm1(Math.log(ONE_SIDED_ALPHA) / trials);
17
+
18
+ const logFactorials = [0];
19
+ for (let i = 1; i <= trials; i += 1) {
20
+ logFactorials.push(logFactorials[i - 1] + Math.log(i));
21
+ }
22
+ const logCombination =
23
+ logFactorials[trials] -
24
+ logFactorials[errors] -
25
+ logFactorials[trials - errors];
26
+ let lower = errors / trials;
27
+ let upper = 1;
28
+ for (let iteration = 0; iteration < 60; iteration += 1) {
29
+ const probability = (lower + upper) / 2;
30
+ let term = Math.exp(
31
+ logCombination +
32
+ errors * Math.log(probability) +
33
+ (trials - errors) * Math.log1p(-probability),
34
+ );
35
+ let cumulative = term;
36
+ for (let count = errors; count > 0; count -= 1) {
37
+ term *=
38
+ (count / (trials - count + 1)) * ((1 - probability) / probability);
39
+ cumulative += term;
40
+ }
41
+ if (cumulative > ONE_SIDED_ALPHA) lower = probability;
42
+ else upper = probability;
43
+ }
44
+ return (lower + upper) / 2;
45
+ }
9
46
 
10
47
  function ratio(value, label) {
11
48
  const number = Number(value);
@@ -141,6 +178,23 @@ export async function runSkillDecisionBenchmark({
141
178
  unavailableRate: unavailable / normalizedCases.length,
142
179
  p95Ms: latencies[Math.max(0, Math.ceil(latencies.length * 0.95) - 1)],
143
180
  });
181
+ const counts = Object.freeze({
182
+ accepted,
183
+ acceptedErrors,
184
+ positives,
185
+ affirmative,
186
+ noMatches,
187
+ noMatchFalseSuggestions,
188
+ abstentions,
189
+ unavailable,
190
+ });
191
+ const oneSided95Upper = Object.freeze({
192
+ acceptedSuggestionErrorRate: binomialUpperBound(acceptedErrors, accepted),
193
+ noMatchFalseSuggestionRate: binomialUpperBound(
194
+ noMatchFalseSuggestions,
195
+ noMatches,
196
+ ),
197
+ });
144
198
  const core = {
145
199
  schema: SKILL_DECISION_BENCHMARK_SCHEMA,
146
200
  caseCount: normalizedCases.length,
@@ -150,9 +204,16 @@ export async function runSkillDecisionBenchmark({
150
204
  ),
151
205
  thresholds: gate,
152
206
  metrics,
207
+ counts,
208
+ oneSided95Upper,
153
209
  passed:
154
- metrics.acceptedSuggestionErrorRate <= gate.acceptedSuggestionErrorRate &&
155
- metrics.noMatchFalseSuggestionRate <= gate.noMatchFalseSuggestionRate &&
210
+ oneSided95Upper.acceptedSuggestionErrorRate !== null &&
211
+ oneSided95Upper.acceptedSuggestionErrorRate <=
212
+ gate.acceptedSuggestionErrorRate &&
213
+ oneSided95Upper.noMatchFalseSuggestionRate !== null &&
214
+ oneSided95Upper.noMatchFalseSuggestionRate <=
215
+ gate.noMatchFalseSuggestionRate &&
216
+ positives > 0 &&
156
217
  metrics.affirmativeCoverage >= gate.affirmativeCoverage &&
157
218
  metrics.p95Ms <= gate.p95Ms,
158
219
  rows: Object.freeze(rows),
@@ -0,0 +1,150 @@
1
+ import { openDecisionProviderAuthority } from "./provider-authority.js";
2
+
3
+ const PROVIDERS = Object.freeze({
4
+ typesafe: {
5
+ model: "jev-latest",
6
+ baseUrl: "https://api.typesafe.ai",
7
+ label: "TypeSafe",
8
+ },
9
+ laya: {
10
+ model: "laya",
11
+ baseUrl: "http://127.0.0.1:8000",
12
+ label: "Laya",
13
+ },
14
+ "system-one": { label: "System One" },
15
+ });
16
+
17
+ function boundedText(value, label, limit = 160) {
18
+ if (
19
+ typeof value !== "string" ||
20
+ value.trim() === "" ||
21
+ value.length > limit ||
22
+ /\p{Cc}/u.test(value)
23
+ ) {
24
+ throw new TypeError(`${label} is required and must be bounded text`);
25
+ }
26
+ return value.trim();
27
+ }
28
+
29
+ function endpointFor(baseUrl, provider) {
30
+ const parsed = new URL(baseUrl);
31
+ if (parsed.protocol !== "https:" && parsed.protocol !== "http:") {
32
+ throw new TypeError("decision provider URL must use HTTP or HTTPS");
33
+ }
34
+ if (parsed.username || parsed.password || /[?#]/u.test(baseUrl)) {
35
+ throw new TypeError(
36
+ "decision provider URL must not contain credentials, a query, or a fragment",
37
+ );
38
+ }
39
+ const loopback = ["127.0.0.1", "localhost", "[::1]"].includes(
40
+ parsed.hostname,
41
+ );
42
+ if (provider === "laya" && !loopback) {
43
+ throw new TypeError("Laya decision provider URL must use loopback");
44
+ }
45
+ if (parsed.protocol !== "https:" && !loopback) {
46
+ throw new TypeError("decision provider URL must use HTTPS or loopback");
47
+ }
48
+ const path = parsed.pathname.replace(/\/+$/u, "");
49
+ parsed.pathname = path.endsWith("/v1/systemone")
50
+ ? path
51
+ : path.endsWith("/v1")
52
+ ? `${path}/systemone`
53
+ : `${path}/v1/systemone`;
54
+ return parsed.toString();
55
+ }
56
+
57
+ export function resolveDecisionProviderOptions({
58
+ decisionProvider = "typesafe",
59
+ decisionModel,
60
+ decisionBaseUrl,
61
+ } = {}) {
62
+ const provider = boundedText(decisionProvider, "decision provider");
63
+ if (!Object.hasOwn(PROVIDERS, provider)) {
64
+ throw new TypeError(`unknown decision provider: ${provider}`);
65
+ }
66
+ const defaults = PROVIDERS[provider];
67
+ const model = boundedText(decisionModel ?? defaults.model, "decision model");
68
+ const baseUrl = boundedText(
69
+ decisionBaseUrl ?? defaults.baseUrl,
70
+ "decision base URL",
71
+ 4096,
72
+ );
73
+ endpointFor(baseUrl, provider);
74
+ return { provider, model, baseUrl };
75
+ }
76
+
77
+ function boundedSecret(value, provider) {
78
+ if (value === undefined && provider !== "typesafe") return undefined;
79
+ if (
80
+ typeof value !== "string" ||
81
+ value.trim() === "" ||
82
+ value.length > 8192 ||
83
+ /\p{Cc}/u.test(value)
84
+ ) {
85
+ throw new TypeError(
86
+ `${PROVIDERS[provider].label} API key is required or invalid`,
87
+ );
88
+ }
89
+ return value;
90
+ }
91
+
92
+ function providerError(status, provider) {
93
+ const error = new Error(
94
+ `${PROVIDERS[provider].label} decision request failed with status ${status}`,
95
+ );
96
+ error.code = "CC_DECISION_PROVIDER_HTTP_ERROR";
97
+ error.status = status;
98
+ return error;
99
+ }
100
+
101
+ export function createDecisionProvider({
102
+ provider,
103
+ model,
104
+ baseUrl,
105
+ apiKey,
106
+ fetchImpl = globalThis.fetch,
107
+ } = {}) {
108
+ const options = resolveDecisionProviderOptions({
109
+ decisionProvider: provider,
110
+ decisionModel: model,
111
+ decisionBaseUrl: baseUrl,
112
+ });
113
+ const secret = boundedSecret(apiKey, options.provider);
114
+ if (typeof fetchImpl !== "function") {
115
+ throw new TypeError("decision provider fetch implementation is required");
116
+ }
117
+ const endpoint = endpointFor(options.baseUrl, options.provider);
118
+ return openDecisionProviderAuthority({
119
+ provider: options.provider,
120
+ model: options.model,
121
+ decide: async (request, { signal } = {}) => {
122
+ const response = await fetchImpl(endpoint, {
123
+ method: "POST",
124
+ headers: {
125
+ ...(secret === undefined
126
+ ? {}
127
+ : { authorization: `Bearer ${secret}` }),
128
+ "content-type": "application/json",
129
+ },
130
+ body: JSON.stringify({
131
+ model: options.model,
132
+ state: request.payload.state,
133
+ questions: request.payload.questions,
134
+ }),
135
+ signal,
136
+ redirect: "error",
137
+ });
138
+ if (!response?.ok) {
139
+ throw providerError(response?.status ?? 0, options.provider);
140
+ }
141
+ const body = await response.json();
142
+ return {
143
+ provider: options.provider,
144
+ model: typeof body?.model === "string" ? body.model : options.model,
145
+ answers: body?.answers,
146
+ usage: body?.usage,
147
+ };
148
+ },
149
+ });
150
+ }
@@ -143,6 +143,7 @@ export function createSkillDecisionRuntime({
143
143
  throw new TypeError("decision runtime clock returned an invalid date");
144
144
  }
145
145
  let outcome;
146
+ let requestSignal = null;
146
147
  try {
147
148
  const raw = await runMeteredDirectModelCall({
148
149
  sessionId: boundSessionId,
@@ -152,10 +153,12 @@ export function createSkillDecisionRuntime({
152
153
  source: "model",
153
154
  operationId: `decision:${decisionId}`,
154
155
  sessionBudget,
155
- call: () =>
156
- providerAuthority.decide(request, {
157
- signal: timeoutSignal(signal, timeoutMs),
158
- }),
156
+ call: () => {
157
+ requestSignal = timeoutSignal(signal, timeoutMs);
158
+ return providerAuthority.decide(request, {
159
+ signal: requestSignal,
160
+ });
161
+ },
159
162
  });
160
163
  const normalized = normalizeSkillDecisionProviderResult(request, raw);
161
164
  const resolved = resolveSkillDecision(request, normalized, thresholds);
@@ -170,7 +173,17 @@ export function createSkillDecisionRuntime({
170
173
  resultDigest: resolved.resultDigest,
171
174
  };
172
175
  } catch (error) {
173
- if (signal?.aborted || isTerminalModelFailure(error)) throw error;
176
+ const localTimeout =
177
+ !signal?.aborted &&
178
+ requestSignal?.aborted &&
179
+ requestSignal.reason === error &&
180
+ error?.name === "TimeoutError";
181
+ if (
182
+ signal?.aborted ||
183
+ (isTerminalModelFailure(error) && !localTimeout)
184
+ ) {
185
+ throw error;
186
+ }
174
187
  outcome = {
175
188
  status: "unavailable",
176
189
  reasonCode: projectUnavailable(error),