chainlesschain 0.162.125 → 0.162.126

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 (190) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/assets/{AIOps-DcqNhZhA.js → AIOps-BrTOcqIJ.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-BigtmPoq.js → ActionButton-na9cocmf.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-1J_X_HF4.js → Analytics-BtDygkpt.js} +2 -2
  5. package/src/assets/web-panel/assets/{AppLayout-DlcDG_a_.js → AppLayout-D_t5CS18.js} +5 -5
  6. package/src/assets/web-panel/assets/{Audit-Do-y8_3w.js → Audit-BYMZccCy.js} +1 -1
  7. package/src/assets/web-panel/assets/{Backup-S2Df-50Y.js → Backup-D2qDfAdL.js} +1 -1
  8. package/src/assets/web-panel/assets/{BaseInput-D5kgWJfk.js → BaseInput-kj456Ju9.js} +1 -1
  9. package/src/assets/web-panel/assets/{Chat-aUcp3kN1.js → Chat-BY0A0ZLE.js} +5 -5
  10. package/src/assets/web-panel/assets/ChatBubbleRenderer-D1VvrOPQ.js +1 -0
  11. package/src/assets/web-panel/assets/{Checkbox-DTg1U7Xs.js → Checkbox-DiBhtXsh.js} +1 -1
  12. package/src/assets/web-panel/assets/{Codegen-YO9ZZ4Ky.js → Codegen-B1ER0L0j.js} +1 -1
  13. package/src/assets/web-panel/assets/{Col-BHonE9fU.js → Col-CjLmza7D.js} +1 -1
  14. package/src/assets/web-panel/assets/{Community-DA2AlEFh.js → Community-BNId05U7.js} +1 -1
  15. package/src/assets/web-panel/assets/{Compact-DULxLRNg.js → Compact-BuuMj7K1.js} +1 -1
  16. package/src/assets/web-panel/assets/{Compliance-BZqfuuZL.js → Compliance-DUuDycaJ.js} +1 -1
  17. package/src/assets/web-panel/assets/{Cowork-CJe3vyMS.js → Cowork-BKHiF6uL.js} +2 -2
  18. package/src/assets/web-panel/assets/{Cron-CeV8AtRu.js → Cron-C7p-lHnC.js} +2 -2
  19. package/src/assets/web-panel/assets/{Crosschain-CAg66zS5.js → Crosschain-BvSOx8a6.js} +1 -1
  20. package/src/assets/web-panel/assets/{DID-Dtup5JZm.js → DID-D1k9jgHv.js} +2 -2
  21. package/src/assets/web-panel/assets/{Dashboard-DAR_8PNy.js → Dashboard-B9mCCnqY.js} +2 -2
  22. package/src/assets/web-panel/assets/{Dropdown-K5bTaCYN.js → Dropdown-ge9UHSXF.js} +1 -1
  23. package/src/assets/web-panel/assets/{EmailListRenderer-C890uErx.js → EmailListRenderer-TZO7ppXi.js} +1 -1
  24. package/src/assets/web-panel/assets/{FamilyGuardDashboard-B-Tj_8yM.js → FamilyGuardDashboard-DkhLJmzx.js} +1 -1
  25. package/src/assets/web-panel/assets/{Federation-C6WZ98ni.js → Federation-JLuA_8zp.js} +1 -1
  26. package/src/assets/web-panel/assets/{FormItemContext-D-LTfGWd.js → FormItemContext-C4w-rzNg.js} +1 -1
  27. package/src/assets/web-panel/assets/{GenericCardRenderer-C80DK4W7.js → GenericCardRenderer-Btns4sV9.js} +1 -1
  28. package/src/assets/web-panel/assets/{Git-Cjvvv3zW.js → Git-BheXMjzC.js} +2 -2
  29. package/src/assets/web-panel/assets/{Governance-C0BND77H.js → Governance-D9rLlatH.js} +1 -1
  30. package/src/assets/web-panel/assets/{Inference-BL9kTtSu.js → Inference-DiklIMcd.js} +1 -1
  31. package/src/assets/web-panel/assets/{KnowledgeGraph-CnVTBmJf.js → KnowledgeGraph-C70EWL03.js} +1 -1
  32. package/src/assets/web-panel/assets/{Logs-CbCbg7K6.js → Logs-Zt_MLI10.js} +2 -2
  33. package/src/assets/web-panel/assets/{Marketplace-CG5On-fH.js → Marketplace-suQxES99.js} +1 -1
  34. package/src/assets/web-panel/assets/{McpTools-AYYDZZK7.js → McpTools-CclpCDpY.js} +5 -5
  35. package/src/assets/web-panel/assets/{Memory-tMWbMDQq.js → Memory-B2lHOUwF.js} +2 -2
  36. package/src/assets/web-panel/assets/{MobileBridge-BAOsf4wB.js → MobileBridge-BMXKoDAD.js} +1 -1
  37. package/src/assets/web-panel/assets/{MobileProjects-BT-2komQ.js → MobileProjects-a6mWVdBV.js} +1 -1
  38. package/src/assets/web-panel/assets/{Mtc-BFwfC63n.js → Mtc-BFpM4Fkj.js} +5 -5
  39. package/src/assets/web-panel/assets/{MtcAudit-DYG3CWdH.js → MtcAudit-DDQkxkbS.js} +2 -2
  40. package/src/assets/web-panel/assets/{Multisig-KJwd0yWT.js → Multisig-Crkd_zKQ.js} +3 -3
  41. package/src/assets/web-panel/assets/{NLProgramming-BmL5dNWm.js → NLProgramming-Dpk5An7B.js} +1 -1
  42. package/src/assets/web-panel/assets/{Notes-DmkaVaMc.js → Notes-BrFnOMNz.js} +3 -3
  43. package/src/assets/web-panel/assets/{NotificationSettings-tmVQszDZ.js → NotificationSettings-CM0iApFM.js} +1 -1
  44. package/src/assets/web-panel/assets/{OrderTableRenderer-BtrR7anf.js → OrderTableRenderer-XXjeqkdz.js} +1 -1
  45. package/src/assets/web-panel/assets/{Organization-pppktQyW.js → Organization-CHFW_38T.js} +4 -4
  46. package/src/assets/web-panel/assets/{Overflow-D3lBoQDA.js → Overflow-C-vl3EjV.js} +1 -1
  47. package/src/assets/web-panel/assets/{P2P-BgE2qGlZ.js → P2P-BT7Slavq.js} +2 -2
  48. package/src/assets/web-panel/assets/PdhVaultBrowser-DRUaULap.js +7 -0
  49. package/src/assets/web-panel/assets/{Permissions-BR8no2Xe.js → Permissions-DkhOAvMz.js} +3 -3
  50. package/src/assets/web-panel/assets/{PersonalDataHub-DabbyQEF.js → PersonalDataHub-Dl7dSOvV.js} +2 -2
  51. package/src/assets/web-panel/assets/{Pipeline-n4sNpEz8.js → Pipeline-B3nVI4p6.js} +1 -1
  52. package/src/assets/web-panel/assets/{Privacy-CGNp4n8M.js → Privacy-Dv1SXx1Q.js} +1 -1
  53. package/src/assets/web-panel/assets/{ProjectInit-CAVA5VsX.js → ProjectInit-DrAhVi5p.js} +2 -2
  54. package/src/assets/web-panel/assets/{ProjectSettings-GCgkfM7A.js → ProjectSettings-h-ggCYN_.js} +2 -2
  55. package/src/assets/web-panel/assets/{Projects-BYK17p52.js → Projects-CM91hYdr.js} +1 -1
  56. package/src/assets/web-panel/assets/{Providers-DpUT5W-d.js → Providers-rfkZel3N.js} +1 -1
  57. package/src/assets/web-panel/assets/{QuickAsk-ZJxTb7vi.js → QuickAsk-XepZB7h_.js} +1 -1
  58. package/src/assets/web-panel/assets/{Recommend-CIzFRDk1.js → Recommend-DzQWsh1a.js} +1 -1
  59. package/src/assets/web-panel/assets/{Reputation-lQ_WDNZn.js → Reputation-CDeaal0j.js} +1 -1
  60. package/src/assets/web-panel/assets/{Row-1MEtrgtF.js → Row-BN4aKhFH.js} +1 -1
  61. package/src/assets/web-panel/assets/{RssFeed-SSgcPPl4.js → RssFeed-INP6VYAA.js} +2 -2
  62. package/src/assets/web-panel/assets/{Search-CcTMOGNY.js → Search-ChPbwatu.js} +1 -1
  63. package/src/assets/web-panel/assets/{Security-BA1KMaDx.js → Security-C97ZCY8N.js} +3 -3
  64. package/src/assets/web-panel/assets/{Services-_aj7czZn.js → Services-Cbtl2Ajs.js} +2 -2
  65. package/src/assets/web-panel/assets/{Skeleton-BWgg_0Zr.js → Skeleton-B13sFxBQ.js} +1 -1
  66. package/src/assets/web-panel/assets/{Skills-C2ZIziYM.js → Skills-vI9zSIKX.js} +1 -1
  67. package/src/assets/web-panel/assets/{Sla-CYxp4axY.js → Sla-Cr3oBH39.js} +1 -1
  68. package/src/assets/web-panel/assets/{SpeechSettings-C7Csp1jV.js → SpeechSettings-BwemqPPV.js} +1 -1
  69. package/src/assets/web-panel/assets/{SyncSettings-svGeswiw.js → SyncSettings-CLA78P-Z.js} +2 -2
  70. package/src/assets/web-panel/assets/{Tasks-ClISj6oK.js → Tasks-DBjQ_DOM.js} +1 -1
  71. package/src/assets/web-panel/assets/{Templates-CmO-Fp7r.js → Templates-BkSLDkBs.js} +1 -1
  72. package/src/assets/web-panel/assets/{Tenant-a3Ac3lxz.js → Tenant-Dn0nSlib.js} +1 -1
  73. package/src/assets/web-panel/assets/{Terminal-DyJIRh81.js → Terminal-C8f4boru.js} +2 -2
  74. package/src/assets/web-panel/assets/{TimelineRenderer-acXS5N5h.js → TimelineRenderer-DW_rMtJR.js} +1 -1
  75. package/src/assets/web-panel/assets/{Tokens-DJW0KqV4.js → Tokens-BdffrKYV.js} +1 -1
  76. package/src/assets/web-panel/assets/{Trigger-0HeTi4r6.js → Trigger-CX4CUg-Q.js} +1 -1
  77. package/src/assets/web-panel/assets/{Trust-aFym34eo.js → Trust-Cq9Bl7Od.js} +1 -1
  78. package/src/assets/web-panel/assets/{UkeySign-CYhszHJv.js → UkeySign-BQy18_VY.js} +1 -1
  79. package/src/assets/web-panel/assets/{VideoEditing-BbJxPF9X.js → VideoEditing-h5hzK7Vw.js} +1 -1
  80. package/src/assets/web-panel/assets/{Wallet-DDthEwiu.js → Wallet-BLotT3gw.js} +2 -2
  81. package/src/assets/web-panel/assets/{WebAuthn-DQ6McYPg.js → WebAuthn-8cCANYLE.js} +2 -2
  82. package/src/assets/web-panel/assets/{WorkflowEditor-CnF8zRsi.js → WorkflowEditor-Db6NwtAv.js} +1 -1
  83. package/src/assets/web-panel/assets/{chat-Dzkx2gTP.js → chat-BPk1LbpL.js} +1 -1
  84. package/src/assets/web-panel/assets/{colors-35T51Oo5.js → colors-BnNal71p.js} +1 -1
  85. package/src/assets/web-panel/assets/{compact-item-TtzNrlu1.js → compact-item-W2VC0tcy.js} +1 -1
  86. package/src/assets/web-panel/assets/{createContext-Y1LkWrYb.js → createContext-DceVsgnZ.js} +1 -1
  87. package/src/assets/web-panel/assets/devWarning--rwFDBhx.js +1 -0
  88. package/src/assets/web-panel/assets/{hasIn-BOYw1BgS.js → hasIn-BEq6EDcp.js} +1 -1
  89. package/src/assets/web-panel/assets/{index-BtlJWaSP.js → index-5gIBUFBn.js} +1 -1
  90. package/src/assets/web-panel/assets/{index-CLqC2sRT.js → index-APCHxOkM.js} +1 -1
  91. package/src/assets/web-panel/assets/{index-C7Wt5feN.js → index-B2dMhwZi.js} +1 -1
  92. package/src/assets/web-panel/assets/{index-CqhwG1ox.js → index-B8cPjrEH.js} +1 -1
  93. package/src/assets/web-panel/assets/{index-BxWUEFKy.js → index-BDC5HsxZ.js} +1 -1
  94. package/src/assets/web-panel/assets/index-BPFuPGKi.js +1 -0
  95. package/src/assets/web-panel/assets/{index-NM9Oke2k.js → index-BUkDcIwJ.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-BWgNn9As.js → index-BWcCyH6-.js} +3 -3
  97. package/src/assets/web-panel/assets/{index-CVrUs6rf.js → index-BgZikQoh.js} +1 -1
  98. package/src/assets/web-panel/assets/index-Bwjus13Y.js +1 -0
  99. package/src/assets/web-panel/assets/{index-D6tG4B25.js → index-BzSzRWsw.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DjeUZxE5.js → index-C1K9CsGr.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DmkG479D.js → index-CBZVISK6.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-Bw1iOGhM.js → index-CEJN-R2L.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-G4ClSmJc.js → index-CG5dGC9E.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-D47robkX.js → index-CMGLpstm.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-BKRlWHUp.js → index-CWrGCndd.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DhMSOd_2.js → index-CbcvfpCV.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-Dx0hIfC-.js → index-Ceqv4lI2.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-CdyFg4FI.js → index-CsT6frT8.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-B7aKAZzS.js → index-D8PQKsDT.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-8jffdb6b.js → index-DGncdA-j.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-XIuZV9by.js → index-DHanQHO0.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-Dhfw-BXs.js → index-DaUBk28E.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-hyqEKkBT.js → index-Di2J4b4V.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-DAizH273.js → index-DtuLvWZN.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CPGNc2tF.js → index-DvS1J8xc.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-KgXrlfNF.js → index-DxePJdwP.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DFhlelzN.js → index-Et4XvL49.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-zF77jnI2.js → index-GlFxgcj4.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-Cs82BHAj.js → index-HV119Oui.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-Dof7lWA_.js → index-InGW87pj.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-Bs69SI96.js → index-P1-s8JR7.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-D4BgCBa3.js → index-SdABCNoi.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-BSpFe6j5.js → index-WTAZbN-c.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-D7dCBw_M.js → index-_2I-KzOj.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BGPEaeB1.js → index-m1sVaWVU.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CZ16GlOs.js → index-s37wwyeN.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-D2od7Bgx.js → index-tyWABqp9.js} +1 -1
  128. package/src/assets/web-panel/assets/{initDefaultProps-DD5y5msp.js → initDefaultProps-DzrCDb3j.js} +1 -1
  129. package/src/assets/web-panel/assets/{motion-BuoutMia.js → motion-BQERVnE3.js} +1 -1
  130. package/src/assets/web-panel/assets/{move-DkpjqOXg.js → move-I9ACA5XJ.js} +1 -1
  131. package/src/assets/web-panel/assets/{mtc-parser-BmGJD-v-.js → mtc-parser-Dd2Pw-tr.js} +1 -1
  132. package/src/assets/web-panel/assets/{omit-DftUE0Sz.js → omit-DwzYRzWV.js} +1 -1
  133. package/src/assets/web-panel/assets/{pickAttrs-DDRb9FIu.js → pickAttrs-BSGULyIL.js} +1 -1
  134. package/src/assets/web-panel/assets/{placementArrow-DPgtxOOD.js → placementArrow-tSYYjAts.js} +1 -1
  135. package/src/assets/web-panel/assets/{responsiveObserve-BQFRzFeZ.js → responsiveObserve-Dy2lqikT.js} +1 -1
  136. package/src/assets/web-panel/assets/{slide-DQ4lmUSz.js → slide-RaB4Uq0c.js} +1 -1
  137. package/src/assets/web-panel/assets/{statusUtils-C1TR4ZiQ.js → statusUtils-CBpC_wZg.js} +1 -1
  138. package/src/assets/web-panel/assets/{styleChecker-B-Suj978.js → styleChecker-BEKwPWt5.js} +1 -1
  139. package/src/assets/web-panel/assets/{useFlexGapSupport-Q7bDZ3EI.js → useFlexGapSupport-C4CnYJH1.js} +1 -1
  140. package/src/assets/web-panel/assets/{useFs-DHjRLyQH.js → useFs-n24jutw5.js} +1 -1
  141. package/src/assets/web-panel/assets/{usePersonalDataHub-lQOvCvCr.js → usePersonalDataHub-DMgS8F6G.js} +1 -1
  142. package/src/assets/web-panel/assets/{vnode-Ie0g4-p3.js → vnode-BSp2KYcj.js} +1 -1
  143. package/src/assets/web-panel/assets/{zoom-CHP0YEoH.js → zoom-7UfQtTPh.js} +1 -1
  144. package/src/assets/web-panel/index.html +1 -1
  145. package/src/commands/agent.js +41 -2
  146. package/src/commands/compliance.js +3 -1
  147. package/src/commands/review.js +47 -17
  148. package/src/commands/session.js +11 -2
  149. package/src/gateways/ws/message-dispatcher.js +145 -165
  150. package/src/gateways/ws/ws-session-gateway.js +39 -5
  151. package/src/harness/jsonl-session-store.js +39 -12
  152. package/src/harness/worktree-isolator.js +5 -0
  153. package/src/lib/agent-core.js +1 -0
  154. package/src/lib/audit-logger.js +3 -1
  155. package/src/lib/chat-core.js +5 -2
  156. package/src/lib/chat-intent-service.js +68 -21
  157. package/src/lib/config-manager.js +25 -1
  158. package/src/lib/credential-guard.js +43 -1
  159. package/src/lib/git-integration.js +5 -0
  160. package/src/lib/interaction-adapter.js +32 -11
  161. package/src/lib/jsonl-session-store.js +1 -0
  162. package/src/lib/llm-config-defaults.js +37 -0
  163. package/src/lib/mcp-oauth.js +76 -10
  164. package/src/lib/permission-engine.js +4 -1
  165. package/src/lib/pipeline-orchestrator.js +20 -2
  166. package/src/lib/project-instructions.js +13 -0
  167. package/src/lib/repl-denials.js +137 -0
  168. package/src/lib/safe-json.js +22 -0
  169. package/src/lib/sandbox-v2.js +7 -6
  170. package/src/lib/search-command.js +65 -0
  171. package/src/lib/settings-hooks.cjs +133 -0
  172. package/src/lib/settings-loader.cjs +16 -7
  173. package/src/lib/social-graph.js +3 -1
  174. package/src/lib/stream-retry.js +27 -0
  175. package/src/lib/turn-context.js +15 -5
  176. package/src/repl/agent-repl.js +81 -8
  177. package/src/runtime/__tests__/message-roles.test.js +36 -3
  178. package/src/runtime/agent-core.js +175 -50
  179. package/src/runtime/coding-agent-contract-shared.cjs +9 -2
  180. package/src/runtime/coding-agent-shell-policy.cjs +23 -2
  181. package/src/runtime/file-ref-expander.js +51 -7
  182. package/src/runtime/headless-runner.js +83 -2
  183. package/src/runtime/headless-stream.js +69 -3
  184. package/src/runtime/mcp-config.js +42 -1
  185. package/src/runtime/message-roles.js +14 -1
  186. package/src/assets/web-panel/assets/ChatBubbleRenderer-Pg7dIsiE.js +0 -1
  187. package/src/assets/web-panel/assets/PdhVaultBrowser-D26Bz5gS.js +0 -7
  188. package/src/assets/web-panel/assets/devWarning-D_lwLZ6O.js +0 -1
  189. package/src/assets/web-panel/assets/index-CEwuCM44.js +0 -1
  190. package/src/assets/web-panel/assets/index-DzzgU4IU.js +0 -1
@@ -1 +1 @@
1
- import{u as f}from"./index-BWgNn9As.js";function d(n){if(!n)return n;if(n.error)throw new Error(n.error);return n.result!==void 0?n.result:n}function p(n,t,a,e,r){return typeof n.onMessage!="function"||typeof n.sendRaw!="function"?n.sendRaw({type:t,...a},r).then(d):new Promise((u,s)=>{const l=typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2)}`,w=`${t}.event`,g=`${t}.end`;let c=!1,y=()=>{};const o=(i,b)=>{if(!c){c=!0,clearTimeout(m);try{y()}catch{}i(b)}},m=setTimeout(()=>{o(s,new Error(`stream timeout (${r}ms): ${t}`))},r),h=n.onMessage(i=>{if(!(c||!i)&&!(i.id!==l&&i.requestId!==l)){if(i.type===w){if(typeof e=="function")try{e(i.event||i)}catch{}return}if(i.type===g){o(u,d(i));return}i.type==="error"&&o(s,new Error(i.message||"stream error"))}});y=typeof h=="function"?h:()=>{},Promise.resolve(n.sendRaw({id:l,type:t,...a},r)).catch(()=>{})})}function D(){const n=f(),t=(a,e={},r=3e4)=>n.sendRaw({type:a,...e},r).then(d);return{async health(){return await t("personal-data-hub.health",{},8e3)},async stats(){return await t("personal-data-hub.stats",{},8e3)},async listAdapters(){return await t("personal-data-hub.list-adapters",{},5e3)},async pickFile(a={}){try{const e=await n.sendRaw({type:"fs.openDialog",title:a.title,filters:a.filters},6e4),r=e&&e.result!==void 0?e.result:e;return r&&r.ok&&typeof r.filePath=="string"?r.filePath:null}catch{return null}},async adapterReadiness(a){return await t("personal-data-hub.adapter-readiness",Number.isInteger(a)?{timeoutMs:a}:{},15e3)},async syncAdapter(a,e={}){return await t("personal-data-hub.sync-adapter",{name:a,options:e},12e4)},async syncAll(a={}){return await t("personal-data-hub.sync-all",{options:a},6e5)},async registerMock({name:a="mock",count:e=20,seed:r=1}={}){return await t("personal-data-hub.register-mock",{name:a,count:e,seed:r})},async unregister(a){return await t("personal-data-hub.unregister",{name:a})},async ask(a,e={}){return await t("personal-data-hub.ask",{question:a,options:e},18e4)},async queryEvents(a={}){return await t("personal-data-hub.query-events",a,1e4)},async recentAudit(a={}){return await t("personal-data-hub.recent-audit",a,1e4)},async searchEvents(a={}){return await t("personal-data-hub.search-events",a,15e3)},async facetCounts(a={}){return await t("personal-data-hub.facet-counts",a,1e4)},async testEmailAuth(a){return await t("personal-data-hub.test-email-auth",{account:a},3e4)},async registerEmail(a,e={}){return await t("personal-data-hub.register-email",{account:a,opts:e},15e3)},async unregisterEmail(a){return await t("personal-data-hub.unregister-email",{email:a},5e3)},async listEmailAccounts(){return await t("personal-data-hub.list-email-accounts",{},5e3)},async eventDetail(a){return await t("personal-data-hub.event-detail",{eventId:a},5e3)},async syncAdapterStream(a,e={},r){return await p(n,"personal-data-hub.sync-adapter-stream",{name:a,options:e},r,6e5)},async syncAllStream(a={},e){return await p(n,"personal-data-hub.sync-all-stream",{options:a},e,9e5)},async registerAlipay(a,e={}){return await t("personal-data-hub.register-alipay",{account:a,opts:e},15e3)},async unregisterAlipay(a){return await t("personal-data-hub.unregister-alipay",{email:a},5e3)},async listAlipayAccounts(){return await t("personal-data-hub.list-alipay-accounts",{},5e3)},async importAlipayBill({zipPath:a,csvPath:e,zipPassword:r}={}){return await t("personal-data-hub.import-alipay-bill",{zipPath:a,csvPath:e,zipPassword:r},3e5)},async reviewQueueList(a=50){return await t("personal-data-hub.review-queue-list",{limit:a},5e3)},async reviewDecision(a,e){return await t("personal-data-hub.review-decision",{reviewId:a,decision:e},5e3)},async manualMerge(a,e){return await t("personal-data-hub.manual-merge",{aId:a,bId:e},5e3)},async manualUnmerge(a){return await t("personal-data-hub.manual-unmerge",{personId:a},5e3)},async resolverDrain(a=50){return await t("personal-data-hub.resolver-drain",{limit:a},18e4)},async resolverStats(){return await t("personal-data-hub.resolver-stats",{},5e3)},async skillsList(){return await t("personal-data-hub.skills-list",{},5e3)},async runSkill(a,e={}){return await t("personal-data-hub.run-skill",{name:a,options:e},12e4)},async openAichatLogin(a,e={}){return await t("personal-data-hub.aichat-open-login",{vendor:a,opts:e},1e4)},async probeAichatCookies(a,e){return await t("personal-data-hub.aichat-probe-cookies",{vendor:a,cookieHeader:e},1e4)},async registerAichatVendor(a,e,r={}){return await t("personal-data-hub.aichat-register-vendor",{vendor:a,cookies:e,opts:r},3e4)},async rotateAichatLogin(a){return await t("personal-data-hub.aichat-rotate-login",{vendor:a},1e4)},async listAichatAccounts(){return await t("personal-data-hub.list-aichat-accounts",{},5e3)},async unregisterAichat(a){return await t("personal-data-hub.unregister-aichat",{vendor:a},5e3)},async aichatHealthCheckOnce(){return await t("personal-data-hub.aichat-health-check-once",{},3e4)},async probeWechatEnv(){return await t("personal-data-hub.wechat-env-probe",{},15e3)},async registerWechat({account:a,dbPath:e,wechatDataPath:r,fridaOpts:u,keyProviderOverride:s}={}){return await t("personal-data-hub.register-wechat",{account:a,dbPath:e,wechatDataPath:r,fridaOpts:u,keyProviderOverride:s},45e3)},async listWechatAccounts(){return await t("personal-data-hub.list-wechat-accounts",{},5e3)},async unregisterWechat(a){return await t("personal-data-hub.unregister-wechat",{uin:a},5e3)},async bilibiliAdbSync(a={}){return await t("personal-data-hub.bilibili-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bilibiliAdbDoctor(){return await t("personal-data-hub.bilibili-adb-doctor",{},15e3)},async weiboAdbSync(a={}){return await t("personal-data-hub.weibo-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async xhsAdbSync(a={}){return await t("personal-data-hub.xhs-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async toutiaoAdbSync(a={}){return await t("personal-data-hub.toutiao-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},9e4)},async kuaishouAdbSync(a={}){return await t("personal-data-hub.kuaishou-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bridgeDoctor(){return await t("personal-data-hub.bridge-doctor",{},6e4)},async douyinAdbSync(a={}){return await t("personal-data-hub.douyin-adb-sync",{uid:a.uid,limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)}}}export{D as u};
1
+ import{u as f}from"./index-BWcCyH6-.js";function d(n){if(!n)return n;if(n.error)throw new Error(n.error);return n.result!==void 0?n.result:n}function p(n,t,a,e,r){return typeof n.onMessage!="function"||typeof n.sendRaw!="function"?n.sendRaw({type:t,...a},r).then(d):new Promise((u,s)=>{const l=typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2)}`,w=`${t}.event`,g=`${t}.end`;let c=!1,y=()=>{};const o=(i,b)=>{if(!c){c=!0,clearTimeout(m);try{y()}catch{}i(b)}},m=setTimeout(()=>{o(s,new Error(`stream timeout (${r}ms): ${t}`))},r),h=n.onMessage(i=>{if(!(c||!i)&&!(i.id!==l&&i.requestId!==l)){if(i.type===w){if(typeof e=="function")try{e(i.event||i)}catch{}return}if(i.type===g){o(u,d(i));return}i.type==="error"&&o(s,new Error(i.message||"stream error"))}});y=typeof h=="function"?h:()=>{},Promise.resolve(n.sendRaw({id:l,type:t,...a},r)).catch(()=>{})})}function D(){const n=f(),t=(a,e={},r=3e4)=>n.sendRaw({type:a,...e},r).then(d);return{async health(){return await t("personal-data-hub.health",{},8e3)},async stats(){return await t("personal-data-hub.stats",{},8e3)},async listAdapters(){return await t("personal-data-hub.list-adapters",{},5e3)},async pickFile(a={}){try{const e=await n.sendRaw({type:"fs.openDialog",title:a.title,filters:a.filters},6e4),r=e&&e.result!==void 0?e.result:e;return r&&r.ok&&typeof r.filePath=="string"?r.filePath:null}catch{return null}},async adapterReadiness(a){return await t("personal-data-hub.adapter-readiness",Number.isInteger(a)?{timeoutMs:a}:{},15e3)},async syncAdapter(a,e={}){return await t("personal-data-hub.sync-adapter",{name:a,options:e},12e4)},async syncAll(a={}){return await t("personal-data-hub.sync-all",{options:a},6e5)},async registerMock({name:a="mock",count:e=20,seed:r=1}={}){return await t("personal-data-hub.register-mock",{name:a,count:e,seed:r})},async unregister(a){return await t("personal-data-hub.unregister",{name:a})},async ask(a,e={}){return await t("personal-data-hub.ask",{question:a,options:e},18e4)},async queryEvents(a={}){return await t("personal-data-hub.query-events",a,1e4)},async recentAudit(a={}){return await t("personal-data-hub.recent-audit",a,1e4)},async searchEvents(a={}){return await t("personal-data-hub.search-events",a,15e3)},async facetCounts(a={}){return await t("personal-data-hub.facet-counts",a,1e4)},async testEmailAuth(a){return await t("personal-data-hub.test-email-auth",{account:a},3e4)},async registerEmail(a,e={}){return await t("personal-data-hub.register-email",{account:a,opts:e},15e3)},async unregisterEmail(a){return await t("personal-data-hub.unregister-email",{email:a},5e3)},async listEmailAccounts(){return await t("personal-data-hub.list-email-accounts",{},5e3)},async eventDetail(a){return await t("personal-data-hub.event-detail",{eventId:a},5e3)},async syncAdapterStream(a,e={},r){return await p(n,"personal-data-hub.sync-adapter-stream",{name:a,options:e},r,6e5)},async syncAllStream(a={},e){return await p(n,"personal-data-hub.sync-all-stream",{options:a},e,9e5)},async registerAlipay(a,e={}){return await t("personal-data-hub.register-alipay",{account:a,opts:e},15e3)},async unregisterAlipay(a){return await t("personal-data-hub.unregister-alipay",{email:a},5e3)},async listAlipayAccounts(){return await t("personal-data-hub.list-alipay-accounts",{},5e3)},async importAlipayBill({zipPath:a,csvPath:e,zipPassword:r}={}){return await t("personal-data-hub.import-alipay-bill",{zipPath:a,csvPath:e,zipPassword:r},3e5)},async reviewQueueList(a=50){return await t("personal-data-hub.review-queue-list",{limit:a},5e3)},async reviewDecision(a,e){return await t("personal-data-hub.review-decision",{reviewId:a,decision:e},5e3)},async manualMerge(a,e){return await t("personal-data-hub.manual-merge",{aId:a,bId:e},5e3)},async manualUnmerge(a){return await t("personal-data-hub.manual-unmerge",{personId:a},5e3)},async resolverDrain(a=50){return await t("personal-data-hub.resolver-drain",{limit:a},18e4)},async resolverStats(){return await t("personal-data-hub.resolver-stats",{},5e3)},async skillsList(){return await t("personal-data-hub.skills-list",{},5e3)},async runSkill(a,e={}){return await t("personal-data-hub.run-skill",{name:a,options:e},12e4)},async openAichatLogin(a,e={}){return await t("personal-data-hub.aichat-open-login",{vendor:a,opts:e},1e4)},async probeAichatCookies(a,e){return await t("personal-data-hub.aichat-probe-cookies",{vendor:a,cookieHeader:e},1e4)},async registerAichatVendor(a,e,r={}){return await t("personal-data-hub.aichat-register-vendor",{vendor:a,cookies:e,opts:r},3e4)},async rotateAichatLogin(a){return await t("personal-data-hub.aichat-rotate-login",{vendor:a},1e4)},async listAichatAccounts(){return await t("personal-data-hub.list-aichat-accounts",{},5e3)},async unregisterAichat(a){return await t("personal-data-hub.unregister-aichat",{vendor:a},5e3)},async aichatHealthCheckOnce(){return await t("personal-data-hub.aichat-health-check-once",{},3e4)},async probeWechatEnv(){return await t("personal-data-hub.wechat-env-probe",{},15e3)},async registerWechat({account:a,dbPath:e,wechatDataPath:r,fridaOpts:u,keyProviderOverride:s}={}){return await t("personal-data-hub.register-wechat",{account:a,dbPath:e,wechatDataPath:r,fridaOpts:u,keyProviderOverride:s},45e3)},async listWechatAccounts(){return await t("personal-data-hub.list-wechat-accounts",{},5e3)},async unregisterWechat(a){return await t("personal-data-hub.unregister-wechat",{uin:a},5e3)},async bilibiliAdbSync(a={}){return await t("personal-data-hub.bilibili-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bilibiliAdbDoctor(){return await t("personal-data-hub.bilibili-adb-doctor",{},15e3)},async weiboAdbSync(a={}){return await t("personal-data-hub.weibo-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async xhsAdbSync(a={}){return await t("personal-data-hub.xhs-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async toutiaoAdbSync(a={}){return await t("personal-data-hub.toutiao-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},9e4)},async kuaishouAdbSync(a={}){return await t("personal-data-hub.kuaishou-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bridgeDoctor(){return await t("personal-data-hub.bridge-doctor",{},6e4)},async douyinAdbSync(a={}){return await t("personal-data-hub.douyin-adb-sync",{uid:a.uid,limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)}}}export{D as u};
@@ -1 +1 @@
1
- import{O as i,h as a,w as l}from"./index-BWgNn9As.js";import{a7 as o,k as g,C as d,F as f,A as p}from"./vendor-BvqAck49.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 N(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,N as t};
1
+ import{O as i,h as a,w as l}from"./index-BWcCyH6-.js";import{a7 as o,k as g,C as d,F as f,A as p}from"./vendor-BvqAck49.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 N(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,N as t};
@@ -1,4 +1,4 @@
1
- import{K as o}from"./index-BWgNn9As.js";import{i as f}from"./motion-BuoutMia.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-BWcCyH6-.js";import{i as f}from"./motion-BQERVnE3.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-BWgNn9As.js"></script>
11
+ <script type="module" crossorigin src="./assets/index-BWcCyH6-.js"></script>
12
12
  <link rel="modulepreload" crossorigin href="./assets/vendor-BvqAck49.js">
13
13
  <link rel="modulepreload" crossorigin href="./assets/icons-DP3uiYxy.js">
14
14
  <link rel="stylesheet" crossorigin href="./assets/index-Cq93VfoF.css">
@@ -533,11 +533,50 @@ export function registerAgentCommand(program) {
533
533
  // flags there, and BEFORE every dispatch (headless/stream/REPL) since
534
534
  // they all read options.provider/model/baseUrl/apiKey.
535
535
  {
536
- const { applyConfigLlmDefaults } =
536
+ const { applyConfigLlmDefaults, reconcileConfigLlmProvider } =
537
537
  await import("../lib/llm-config-defaults.js");
538
- applyConfigLlmDefaults(options, loadConfig().llm || {}, {
538
+
539
+ // Self-repair a MISLABELED config (provider disagrees with the provider
540
+ // its baseUrl actually belongs to — the recurring "anthropic + volces
541
+ // baseUrl + haiku" corruption whose writer was never found). The baseUrl
542
+ // is authoritative, so correct provider/model to match it AND persist:
543
+ // without this the on-disk config stays wrong and runnable-provider
544
+ // relabels on EVERY run, re-emitting "provider 配置与 baseUrl 不一致".
545
+ // Persisting also fixes what `cc config` and the editor plugin read next.
546
+ const fullConfig = loadConfig();
547
+ const { llm: repairedLlm, changed: cfgRepaired } =
548
+ await reconcileConfigLlmProvider(fullConfig.llm || {});
549
+ if (cfgRepaired) {
550
+ try {
551
+ const { saveConfig } = await import("../lib/config-manager.js");
552
+ saveConfig({ ...fullConfig, llm: repairedLlm });
553
+ if (!process.env.VITEST && !process.env.VITEST_WORKER_ID) {
554
+ process.stderr.write(
555
+ `\x1b[33m[config] 已修正 llm.provider → "${repairedLlm.provider}"` +
556
+ `(原配置 provider 与 baseUrl 不一致;baseUrl 为准)。\x1b[0m\n`,
557
+ );
558
+ }
559
+ } catch {
560
+ /* best-effort: a config repair must never fail the run */
561
+ }
562
+ }
563
+
564
+ applyConfigLlmDefaults(options, repairedLlm, {
539
565
  explicitModel: explicitCliModel, // settings-file model must not ride
540
566
  });
567
+
568
+ // Also reconcile the RESOLVED options: the editor panel may have already
569
+ // spawned us with an explicit `--provider anthropic` (read from the
570
+ // pre-repair config), which applyConfigLlmDefaults leaves intact. Correct
571
+ // it here so it agrees with the baseUrl before the call runs — this is
572
+ // exactly what runnable-provider would do, just earlier and without the
573
+ // every-turn "已按 baseUrl 切换" notice (we already surfaced the repair).
574
+ const { llm: fixedOpts, changed: optsFixed } =
575
+ await reconcileConfigLlmProvider(options);
576
+ if (optsFixed) {
577
+ options.provider = fixedOpts.provider;
578
+ if (fixedOpts.model) options.model = fixedOpts.model;
579
+ }
541
580
  }
542
581
 
543
582
  // Claude-Code 2.1.183 parity: warn up front if the now-resolved model is
@@ -4,6 +4,7 @@
4
4
  */
5
5
 
6
6
  import fs from "fs";
7
+ import { safeJsonParse } from "../lib/safe-json.js";
7
8
  import chalk from "chalk";
8
9
  import { logger } from "../lib/logger.js";
9
10
  import { numericOption } from "../lib/cli-numeric.js";
@@ -168,7 +169,8 @@ function _loadPoliciesFromDb(db, framework) {
168
169
  name: r.name,
169
170
  type: r.type,
170
171
  framework: r.framework,
171
- rules: r.rules ? JSON.parse(r.rules) : {},
172
+ // One corrupt rules cell must not crash the whole policy list.
173
+ rules: safeJsonParse(r.rules, {}),
172
174
  enabled: !!r.enabled,
173
175
  severity: r.severity,
174
176
  createdAt: r.created_at,
@@ -33,6 +33,7 @@ import fs from "node:fs";
33
33
  import path from "node:path";
34
34
  import chalk from "chalk";
35
35
  import { logger } from "../lib/logger.js";
36
+ import { firstBalancedJson } from "../lib/json-schema-output.js";
36
37
 
37
38
  /** Diffs larger than this are truncated before going to the model. */
38
39
  const MAX_DIFF_CHARS = 200_000;
@@ -367,8 +368,9 @@ function resolvePr(cwd, gh) {
367
368
  }
368
369
  let repo = null;
369
370
  try {
370
- repo = JSON.parse(gh(["repo", "view", "--json", "nameWithOwner"], { cwd }))
371
- .nameWithOwner;
371
+ repo = JSON.parse(
372
+ gh(["repo", "view", "--json", "nameWithOwner"], { cwd }),
373
+ ).nameWithOwner;
372
374
  } catch {
373
375
  repo = null;
374
376
  }
@@ -386,16 +388,29 @@ export function parseFindings(text) {
386
388
  let s = String(text).trim();
387
389
  const fence = s.match(/```(?:json)?\s*([\s\S]*?)```/i);
388
390
  if (fence) s = fence[1].trim();
391
+ // Try a BALANCED array first (stops at the first complete [...]); fall back to
392
+ // the greedy first-[..last-] slice. The greedy slice ALONE over-captures when
393
+ // the reply has trailing prose or a stray `]` (e.g. "findings: [ … ]. See [1]")
394
+ // — JSON.parse then fails and EVERY finding is silently dropped.
395
+ const candidates = [];
396
+ const balanced = firstBalancedJson(s, "[");
397
+ if (balanced) candidates.push(balanced);
389
398
  const start = s.indexOf("[");
390
399
  const end = s.lastIndexOf("]");
391
- if (start === -1 || end === -1 || end < start) return [];
392
- let arr;
393
- try {
394
- arr = JSON.parse(s.slice(start, end + 1));
395
- } catch {
396
- return [];
400
+ if (start !== -1 && end > start) candidates.push(s.slice(start, end + 1));
401
+ let arr = null;
402
+ for (const c of candidates) {
403
+ try {
404
+ const parsed = JSON.parse(c);
405
+ if (Array.isArray(parsed)) {
406
+ arr = parsed;
407
+ break;
408
+ }
409
+ } catch {
410
+ /* try the next candidate */
411
+ }
397
412
  }
398
- if (!Array.isArray(arr)) return [];
413
+ if (!arr) return [];
399
414
  return arr
400
415
  .filter(
401
416
  (f) =>
@@ -442,7 +457,11 @@ export function buildReviewPayload(findings, { commitId } = {}) {
442
457
  * Post the findings to the PR as a single review with inline comments
443
458
  * (outward-facing — callers gate this behind --dry-run / confirmation).
444
459
  */
445
- export function postReviewComments(pr, findings, { gh = ghCli, cwd, commitId } = {}) {
460
+ export function postReviewComments(
461
+ pr,
462
+ findings,
463
+ { gh = ghCli, cwd, commitId } = {},
464
+ ) {
446
465
  if (!pr || !pr.repo || !pr.number) {
447
466
  throw new Error("cannot post: PR repo/number not resolved.");
448
467
  }
@@ -487,7 +506,10 @@ export async function runReviewComment(options = {}, deps = {}) {
487
506
  // Default the scope to the PR's base branch (review the PR's changes) unless
488
507
  // the user gave an explicit scope.
489
508
  const explicitScope =
490
- options.staged || options.base || options.range || (options.paths || []).length;
509
+ options.staged ||
510
+ options.base ||
511
+ options.range ||
512
+ (options.paths || []).length;
491
513
  const scopeOpts = {
492
514
  staged: options.staged === true,
493
515
  base: options.base || (explicitScope ? null : pr.baseRefName),
@@ -586,12 +608,20 @@ export async function runReview(options = {}, deps = {}) {
586
608
  paths: options.paths || [],
587
609
  };
588
610
 
589
- const { diff, summary, scope, label, untracked, hasDiff, hasUntracked, truncated } =
590
- collectReviewDiff(scopeOpts, {
591
- cwd,
592
- git,
593
- includeUntracked: options.untracked !== false,
594
- });
611
+ const {
612
+ diff,
613
+ summary,
614
+ scope,
615
+ label,
616
+ untracked,
617
+ hasDiff,
618
+ hasUntracked,
619
+ truncated,
620
+ } = collectReviewDiff(scopeOpts, {
621
+ cwd,
622
+ git,
623
+ includeUntracked: options.untracked !== false,
624
+ });
595
625
  if (!hasDiff && !hasUntracked) {
596
626
  return { exitCode: 0, isError: false, scope, empty: true };
597
627
  }
@@ -188,7 +188,13 @@ export function registerSessionCommand(program) {
188
188
 
189
189
  let messages = sess.messages;
190
190
  if (options.limit) {
191
- messages = messages.slice(-numericOption(options.limit, { name: "--limit", integer: true, min: 1 }));
191
+ messages = messages.slice(
192
+ -numericOption(options.limit, {
193
+ name: "--limit",
194
+ integer: true,
195
+ min: 1,
196
+ }),
197
+ );
192
198
  }
193
199
 
194
200
  for (const msg of messages) {
@@ -383,7 +389,10 @@ export function registerSessionCommand(program) {
383
389
  session: s.id,
384
390
  title: s.title,
385
391
  role: ev.type === "user_message" ? "user" : "assistant",
386
- when: ev.timestamp ? new Date(ev.timestamp).toISOString() : "",
392
+ // toIsoSafe (not a bare truthy guard): an invalid-but-truthy
393
+ // timestamp on a corrupt event would otherwise throw RangeError
394
+ // and crash the whole search.
395
+ when: store.toIsoSafe(ev.timestamp),
387
396
  preview: text
388
397
  .slice(from, idx + q.length + 50)
389
398
  .replace(/\s+/g, " ")
@@ -106,199 +106,179 @@ export function createWsMessageDispatcher(server) {
106
106
  "llm.chat": () => server._handleLlmChat(id, ws, message),
107
107
  };
108
108
 
109
- // Phase I Hosted Session API streaming routes (stream.run).
110
- // Each intermediate event goes out as { id, type: "stream.event", event }
111
- // and the final response is sent by the normal ok/err wrapper.
112
- for (const streamingType of Object.keys(
113
- SESSION_CORE_STREAMING_HANDLERS,
114
- )) {
115
- routes[streamingType] = async () => {
116
- const controller = new AbortController();
117
- const client = server.clients.get(clientId);
118
- if (client) {
119
- client._streamAborts = client._streamAborts || new Map();
120
- client._streamAborts.set(id, controller);
121
- }
122
- const sender = (payload) => server._send(ws, { id, ...payload });
123
- const context = { server, ws, clientId };
124
- try {
125
- const result = await SESSION_CORE_STREAMING_HANDLERS[streamingType](
126
- message,
127
- sender,
128
- controller.signal,
129
- context,
130
- );
131
- server._send(ws, {
132
- id,
133
- type: `${streamingType}.end`,
134
- ...result,
135
- });
136
- } catch (err) {
137
- server._send(ws, {
138
- id,
139
- type: "error",
140
- code: "STREAM_RUN_ERROR",
141
- message: err?.message || String(err),
142
- });
143
- } finally {
144
- if (client?._streamAborts) client._streamAborts.delete(id);
145
- }
146
- };
109
+ // Static core routes take precedence and are dispatched directly. The
110
+ // feature handler maps below are consulted ONLY when no static route
111
+ // matches so a feature topic can never shadow a core protocol route
112
+ // (auth/cancel/ping/execute), and we no longer allocate a closure for all
113
+ // ~79 feature keys on every message (the old per-message Object.keys loops
114
+ // built the entire route table each dispatch). Only the matched handler
115
+ // runs.
116
+ const staticHandler = routes[type];
117
+ if (staticHandler) {
118
+ return staticHandler();
119
+ }
120
+
121
+ // Phase I — Hosted Session API streaming routes (stream.run). Each
122
+ // intermediate event goes out as { id, type:"stream.event", event } and
123
+ // the final response is sent by the normal ok/err wrapper.
124
+ if (SESSION_CORE_STREAMING_HANDLERS[type]) {
125
+ const controller = new AbortController();
126
+ const client = server.clients.get(clientId);
127
+ if (client) {
128
+ client._streamAborts = client._streamAborts || new Map();
129
+ client._streamAborts.set(id, controller);
130
+ }
131
+ const sender = (payload) => server._send(ws, { id, ...payload });
132
+ const context = { server, ws, clientId };
133
+ try {
134
+ const result = await SESSION_CORE_STREAMING_HANDLERS[type](
135
+ message,
136
+ sender,
137
+ controller.signal,
138
+ context,
139
+ );
140
+ server._send(ws, { id, type: `${type}.end`, ...result });
141
+ } catch (err) {
142
+ server._send(ws, {
143
+ id,
144
+ type: "error",
145
+ code: "STREAM_RUN_ERROR",
146
+ message: err?.message || String(err),
147
+ });
148
+ } finally {
149
+ if (client?._streamAborts) client._streamAborts.delete(id);
150
+ }
151
+ return;
147
152
  }
148
153
 
149
154
  // Video Editing streaming routes
150
- for (const videoStreamType of Object.keys(VIDEO_STREAMING_HANDLERS)) {
151
- routes[videoStreamType] = async () => {
152
- const controller = new AbortController();
153
- const client = server.clients.get(clientId);
154
- if (client) {
155
- client._streamAborts = client._streamAborts || new Map();
156
- client._streamAborts.set(id, controller);
157
- }
158
- const sender = (payload) => server._send(ws, { id, ...payload });
159
- try {
160
- const result = await VIDEO_STREAMING_HANDLERS[videoStreamType](
161
- message,
162
- sender,
163
- controller.signal,
164
- );
165
- server._send(ws, {
166
- id,
167
- type: `${videoStreamType}.end`,
168
- ...result,
169
- });
170
- } catch (err) {
171
- server._send(ws, {
172
- id,
173
- type: "error",
174
- code: "VIDEO_STREAM_ERROR",
175
- message: err?.message || String(err),
176
- });
177
- } finally {
178
- if (client?._streamAborts) client._streamAborts.delete(id);
179
- }
180
- };
155
+ if (VIDEO_STREAMING_HANDLERS[type]) {
156
+ const controller = new AbortController();
157
+ const client = server.clients.get(clientId);
158
+ if (client) {
159
+ client._streamAborts = client._streamAborts || new Map();
160
+ client._streamAborts.set(id, controller);
161
+ }
162
+ const sender = (payload) => server._send(ws, { id, ...payload });
163
+ try {
164
+ const result = await VIDEO_STREAMING_HANDLERS[type](
165
+ message,
166
+ sender,
167
+ controller.signal,
168
+ );
169
+ server._send(ws, { id, type: `${type}.end`, ...result });
170
+ } catch (err) {
171
+ server._send(ws, {
172
+ id,
173
+ type: "error",
174
+ code: "VIDEO_STREAM_ERROR",
175
+ message: err?.message || String(err),
176
+ });
177
+ } finally {
178
+ if (client?._streamAborts) client._streamAborts.delete(id);
179
+ }
180
+ return;
181
181
  }
182
182
 
183
183
  // Video Editing request/response routes
184
- for (const videoType of Object.keys(VIDEO_HANDLERS)) {
185
- routes[videoType] = async () => {
186
- try {
187
- const result = await VIDEO_HANDLERS[videoType](message);
188
- server._send(ws, {
189
- id,
190
- type: `${videoType}.response`,
191
- ...result,
192
- });
193
- } catch (err) {
194
- server._send(ws, {
195
- id,
196
- type: "error",
197
- code: "VIDEO_ERROR",
198
- message: err?.message || String(err),
199
- });
200
- }
201
- };
184
+ if (VIDEO_HANDLERS[type]) {
185
+ try {
186
+ const result = await VIDEO_HANDLERS[type](message);
187
+ server._send(ws, { id, type: `${type}.response`, ...result });
188
+ } catch (err) {
189
+ server._send(ws, {
190
+ id,
191
+ type: "error",
192
+ code: "VIDEO_ERROR",
193
+ message: err?.message || String(err),
194
+ });
195
+ }
196
+ return;
202
197
  }
203
198
 
204
199
  // Personal Data Hub topics — same 10 surfaces as the Electron IPC
205
200
  // (see desktop-app-vue/src/main/ipc/personal-data-hub-ipc.js). Each
206
201
  // handler returns { result } or { error }; we wrap with the standard
207
202
  // response envelope so renderer code is shell-agnostic.
208
- for (const hubType of Object.keys(PERSONAL_DATA_HUB_HANDLERS)) {
209
- routes[hubType] = async () => {
210
- try {
211
- const out = await PERSONAL_DATA_HUB_HANDLERS[hubType](message);
212
- if (out && out.error) {
213
- server._send(ws, {
214
- id,
215
- type: "error",
216
- code: "PERSONAL_DATA_HUB_ERROR",
217
- message: out.error,
218
- });
219
- } else {
220
- server._send(ws, {
221
- id,
222
- type: `${hubType}.response`,
223
- result: out && out.result !== undefined ? out.result : out,
224
- });
225
- }
226
- } catch (err) {
203
+ if (PERSONAL_DATA_HUB_HANDLERS[type]) {
204
+ try {
205
+ const out = await PERSONAL_DATA_HUB_HANDLERS[type](message);
206
+ if (out && out.error) {
227
207
  server._send(ws, {
228
208
  id,
229
209
  type: "error",
230
210
  code: "PERSONAL_DATA_HUB_ERROR",
231
- message: err?.message || String(err),
232
- });
233
- }
234
- };
235
- }
236
-
237
- // Phase 5.7 — streaming sync routes. Adapter progress events are
238
- // pushed as `<topic>.event` messages tagged with the request id;
239
- // the final report comes as `<topic>.end`.
240
- for (const streamType of Object.keys(
241
- PERSONAL_DATA_HUB_STREAMING_HANDLERS,
242
- )) {
243
- routes[streamType] = async () => {
244
- const sender = (payload) => server._send(ws, { id, ...payload });
245
- try {
246
- const out = await PERSONAL_DATA_HUB_STREAMING_HANDLERS[streamType](
247
- message,
248
- sender,
249
- );
250
- server._send(ws, {
251
- id,
252
- type: `${streamType}.end`,
253
- ...(out && out.result !== undefined
254
- ? { result: out.result }
255
- : out || {}),
211
+ message: out.error,
256
212
  });
257
- } catch (err) {
213
+ } else {
258
214
  server._send(ws, {
259
215
  id,
260
- type: "error",
261
- code: "PERSONAL_DATA_HUB_STREAM_ERROR",
262
- message: err?.message || String(err),
216
+ type: `${type}.response`,
217
+ result: out && out.result !== undefined ? out.result : out,
263
218
  });
264
219
  }
265
- };
220
+ } catch (err) {
221
+ server._send(ws, {
222
+ id,
223
+ type: "error",
224
+ code: "PERSONAL_DATA_HUB_ERROR",
225
+ message: err?.message || String(err),
226
+ });
227
+ }
228
+ return;
266
229
  }
267
230
 
268
- // Phase IHosted Session API (session-core, memory, beta, usage)
269
- for (const sessionCoreType of Object.keys(SESSION_CORE_HANDLERS)) {
270
- routes[sessionCoreType] = async () => {
271
- try {
272
- const result =
273
- await SESSION_CORE_HANDLERS[sessionCoreType](message);
274
- server._send(ws, {
275
- id,
276
- type: `${sessionCoreType}.response`,
277
- ...result,
278
- });
279
- } catch (err) {
280
- server._send(ws, {
281
- id,
282
- type: "error",
283
- code: "SESSION_CORE_ERROR",
284
- message: err?.message || String(err),
285
- });
286
- }
287
- };
231
+ // Phase 5.7streaming sync routes. Adapter progress events are pushed
232
+ // as `<topic>.event` messages tagged with the request id; the final
233
+ // report comes as `<topic>.end`.
234
+ if (PERSONAL_DATA_HUB_STREAMING_HANDLERS[type]) {
235
+ const sender = (payload) => server._send(ws, { id, ...payload });
236
+ try {
237
+ const out = await PERSONAL_DATA_HUB_STREAMING_HANDLERS[type](
238
+ message,
239
+ sender,
240
+ );
241
+ server._send(ws, {
242
+ id,
243
+ type: `${type}.end`,
244
+ ...(out && out.result !== undefined
245
+ ? { result: out.result }
246
+ : out || {}),
247
+ });
248
+ } catch (err) {
249
+ server._send(ws, {
250
+ id,
251
+ type: "error",
252
+ code: "PERSONAL_DATA_HUB_STREAM_ERROR",
253
+ message: err?.message || String(err),
254
+ });
255
+ }
256
+ return;
288
257
  }
289
258
 
290
- const handler = routes[type];
291
- if (!handler) {
292
- server._send(ws, {
293
- id,
294
- type: "error",
295
- code: "UNKNOWN_TYPE",
296
- message: `Unknown message type: ${type}`,
297
- });
259
+ // Phase I — Hosted Session API (session-core, memory, beta, usage)
260
+ if (SESSION_CORE_HANDLERS[type]) {
261
+ try {
262
+ const result = await SESSION_CORE_HANDLERS[type](message);
263
+ server._send(ws, { id, type: `${type}.response`, ...result });
264
+ } catch (err) {
265
+ server._send(ws, {
266
+ id,
267
+ type: "error",
268
+ code: "SESSION_CORE_ERROR",
269
+ message: err?.message || String(err),
270
+ });
271
+ }
298
272
  return;
299
273
  }
300
274
 
301
- return handler();
275
+ server._send(ws, {
276
+ id,
277
+ type: "error",
278
+ code: "UNKNOWN_TYPE",
279
+ message: `Unknown message type: ${type}`,
280
+ });
281
+ return;
302
282
  },
303
283
  };
304
284
  }