chainlesschain 0.162.175 → 0.162.176

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 (263) hide show
  1. package/package.json +10 -10
  2. package/src/assets/web-panel/assets/{AIOps-DherW0Rh.js → AIOps-BDLu5Elz.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-CDGfqt2Y.js → ActionButton-DH5us-CK.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-BYhkzdgD.js → Analytics-BZ0u8IFG.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-cEKk1cpb.js → AppLayout-Duu8xR14.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-_aXR3WWc.js → Artifacts-Br2YBbh_.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-CYAf-gY7.js → Audit-C3C6a482.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-D4Q20phR.js → BackgroundAgents-CzHvebcj.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-Cq0Tyk58.js → Backup-DZNHYDFd.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-CPj_CdAv.js → BaseInput-VRiC4fIx.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-BQ-Qq0es.js → Chat-Cm08WWAD.js} +4 -4
  12. package/src/assets/web-panel/assets/{ChatBubbleRenderer-Ci97vNTs.js → ChatBubbleRenderer-CGHYrugQ.js} +1 -1
  13. package/src/assets/web-panel/assets/{Checkbox-rke6l3yg.js → Checkbox-DtByk7d7.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-DiacrIPq.js → Codegen-CphXXOfD.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-Cx3BY-Up.js → Col-Hz86TnLR.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-DfmWiQy8.js → Community-HP03ltpD.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-DdQnpxy5.js → Compact-B_N1mqQz.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-lzliOH_r.js → Compliance-CVztRpi8.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-CYx4Un5k.js → Cowork-wUVOyZih.js} +4 -4
  20. package/src/assets/web-panel/assets/{Cron-BGDcPFlo.js → Cron-DW5TLJKw.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-0_X5g2ri.js → Crosschain-CrAFGhWH.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-C0PEf3Eu.js → DID-pA-oD8ke.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-DULQjQ58.js → Dashboard-CXrd5gAw.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-DGRHRbW6.js → Dropdown-EweJcsek.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-ChX8XPwB.js → EmailListRenderer-C9xVLPG4.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-Dyq6IBNu.js → FamilyGuardDashboard-CDcEEqlu.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-DH1NfAL2.js → Federation-DtZda9A_.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-BN1I_uNi.js → FormItemContext-CiYdcVz3.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-Dq_2UYpe.js → GenericCardRenderer-DA13uwA0.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-BAy1yvI2.js → Git-DzRhZD1O.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-Db6Q2iSy.js → Governance-D5RMgOSb.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-0ub6yHcr.js → Inference-BgrPfSNk.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-DtLetM36.js → KnowledgeGraph-DzjnD571.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-Bcoy7CUd.js → Logs-BhWzVDtN.js} +2 -2
  35. package/src/assets/web-panel/assets/{MarkdownRenderer-BfEMFAXf.js → MarkdownRenderer-BDape9cx.js} +1 -1
  36. package/src/assets/web-panel/assets/{Marketplace-tt2rzwRR.js → Marketplace-DJtL5GV7.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-BhOgX-MU.js → McpTools-CZcQygI7.js} +5 -5
  38. package/src/assets/web-panel/assets/{Memory-BJUxeWBL.js → Memory-DUWSDUUu.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-BwUY2G9w.js → MobileBridge-BTwq2WKY.js} +1 -1
  40. package/src/assets/web-panel/assets/MobileProjects-NZvvfDME.js +1 -0
  41. package/src/assets/web-panel/assets/{Mtc-B2WMboOm.js → Mtc-BiGugEQm.js} +5 -5
  42. package/src/assets/web-panel/assets/{MtcAudit-8pNEXO63.js → MtcAudit-DY7a6gUe.js} +2 -2
  43. package/src/assets/web-panel/assets/{Multisig-C1wm5a_1.js → Multisig-BQbDu_w7.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-C1QpKF7g.js → NLProgramming-CM2wXTLv.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-CiQUcxFu.js → Notes-DI6gGs1v.js} +4 -4
  46. package/src/assets/web-panel/assets/{NotificationSettings-BblDPJ_x.js → NotificationSettings-BsZOLWAB.js} +1 -1
  47. package/src/assets/web-panel/assets/{OrderTableRenderer-DRjYcPtb.js → OrderTableRenderer-C48mu09U.js} +1 -1
  48. package/src/assets/web-panel/assets/{Organization-Dp3VKB0X.js → Organization-Cds0_tXr.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-Czx161m9.js → Overflow-WunYMD87.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-ClFi6wOs.js → P2P-Bo6j4DDv.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-CRweW0lz.js → PdhVaultBrowser-Bh2XPD5f.js} +3 -3
  52. package/src/assets/web-panel/assets/{Permissions-BzcRoqTn.js → Permissions-EMvMMC8N.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-ChGTpNMd.js → PersonalDataHub-AX3ypUDV.js} +2 -2
  54. package/src/assets/web-panel/assets/{Pipeline-BMOOpKWA.js → Pipeline-BOx8HOgL.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-D0AZHObH.js → Privacy-tBeTVQVM.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-yYFlZ6Ja.js → ProjectInit-CVYg1W4M.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-DJNVuMQs.js → ProjectSettings-Dvt5I7y1.js} +2 -2
  58. package/src/assets/web-panel/assets/{Projects-Br0rBWH1.js → Projects-Cc7FC9-e.js} +1 -1
  59. package/src/assets/web-panel/assets/Providers-Ct8xqY-E.js +1 -0
  60. package/src/assets/web-panel/assets/{QrScannerModal-81NZOitV.js → QrScannerModal-Cni8Ooja.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-Dic2lCbJ.js → QuickAsk-BJVLKdxr.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-Dh9iwViE.js → Recommend-DPG8Rbbm.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-Bq9VYEFy.js → RemoteSession-DsdR7dCt.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-CxFZ-NbJ.js → Reputation-Csg1YM-b.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-BVSLcaX2.js → Row-D9DoFoEf.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-BbC-5DOH.js → RssFeed-BsvKrXMS.js} +3 -3
  67. package/src/assets/web-panel/assets/{Search-BfjZ1GCr.js → Search-DFUStfgQ.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-CVjhOV5r.js → Security-ILg1zxdK.js} +4 -4
  69. package/src/assets/web-panel/assets/{Services-D45u-Aqe.js → Services-Dd41PCaY.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-WkGoK4he.js → Skeleton-Bzo1cN80.js} +1 -1
  71. package/src/assets/web-panel/assets/{Skills-D_jvQZcj.js → Skills-BDHh17P0.js} +1 -1
  72. package/src/assets/web-panel/assets/{Sla-Bf4QTF3E.js → Sla-jl7UTiRY.js} +1 -1
  73. package/src/assets/web-panel/assets/{SpeechSettings-DVpZdbMN.js → SpeechSettings-BePa-RF6.js} +1 -1
  74. package/src/assets/web-panel/assets/{SyncSettings-DEEojoMS.js → SyncSettings-DiqqDKGZ.js} +2 -2
  75. package/src/assets/web-panel/assets/{Tasks-DFwxpLIk.js → Tasks-DYQ_6lxj.js} +1 -1
  76. package/src/assets/web-panel/assets/{Templates-Bzl-9wY5.js → Templates-JiDeI06L.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-0khxUOB8.js → Tenant-hhgI6zwS.js} +1 -1
  78. package/src/assets/web-panel/assets/Terminal-CjTZPa37.js +3 -0
  79. package/src/assets/web-panel/assets/{TimelineRenderer-B0Y4LONc.js → TimelineRenderer-B8uB5Llk.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-DEE07SFh.js → Tokens-C3b_6r2z.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-BM7xvA5z.js → Trigger-tIP7HKVe.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-Dv3ijvvZ.js → Trust-vjoc11vJ.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-B1-enmMt.js → UkeySign-DUPBnGuH.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-DYiIPByd.js → VideoEditing-CBvhUY5T.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-D-y374BQ.js → Wallet-DUaQ0uA5.js} +4 -4
  86. package/src/assets/web-panel/assets/{WebAuthn-HBDjcUhi.js → WebAuthn-DllSivjE.js} +5 -5
  87. package/src/assets/web-panel/assets/{WorkflowEditor-sKn4qTID.js → WorkflowEditor-xc8D3uO6.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-TVYhaBXj.js → chat-BVicU7oA.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-DMADxY9v.js → colors-DJzLmhLm.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-OftcHpO_.js → compact-item-BvYRfThE.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-DW1zVUSN.js → createContext-DGXxCBKR.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-BT46Y_QI.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-CaUathNp.js → hasIn-SBDJB1y4.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-CeCIYYG7.js → index-1SdDS6lR.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-DAfT3EMd.js → index-9gdI7uUW.js} +1 -1
  96. package/src/assets/web-panel/assets/index-B7nuIywP.js +1 -0
  97. package/src/assets/web-panel/assets/{index-sm1sGIxW.js → index-BJZf9DhV.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-BBNg08cD.js → index-BO1itZaY.js} +3 -3
  99. package/src/assets/web-panel/assets/{index-CKNdnJRo.js → index-BTrBGBJs.js} +1 -1
  100. package/src/assets/web-panel/assets/{index--5UvwqH_.js → index-BYqz4Wrr.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-8YelceUU.js → index-Bf-ctERC.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-Lr0MO-GU.js → index-CKyEivf8.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DZdT8nio.js → index-CdGY9P8a.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-s-EnkUCn.js → index-Cf-O_g_8.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-pSVCBsG4.js → index-CloCgBUR.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-B-19mFhn.js → index-CoJAO1Lm.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DKjqFpYa.js → index-Crk5NTb0.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BJ1PjRY3.js → index-Cs2rmLFt.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-77kgkUgY.js → index-CtwqO5qo.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-D63QVAiJ.js → index-D7HimK0M.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-B52Ztt8Q.js → index-DCdRAgjy.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-DHi634g9.js → index-DCqRS6da.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-BFVbDpqg.js → index-DHVLJ8q0.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BvRw4Fna.js → index-DKrvvWm4.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CZXYI5LU.js → index-DMarmfrv.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CM8W07sc.js → index-DRfiXB_p.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-iDmgT2Dg.js → index-Dm_77jgR.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-hXq7QRA_.js → index-DnjPdvR6.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-BEzLLVYd.js → index-DonCnfMr.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-DYwwUKDg.js → index-DvUTDYXX.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DXcqvWBp.js → index-FxZzRyE1.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-Cmdv6Dev.js → index-MjC4G09d.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-C9JoaYSs.js → index-VMfwIH5G.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CK-p7Hji.js → index-YJkzy8ZF.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BupSWDcl.js → index-d5BVd-cL.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-Bg-7FpaL.js → index-e4fXH_WO.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CpDtN0dl.js → index-hxTODbM1.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-kdMl_0zL.js → index-lpaGoTH3.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-GUKz4Pv9.js → index-wcCL-miV.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-DWVZ3T0t.js → index-xfluRkCT.js} +1 -1
  131. package/src/assets/web-panel/assets/index-ycwAfC-i.js +1 -0
  132. package/src/assets/web-panel/assets/{index-BSp1Ofvx.js → index-z1ZylsLq.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-DdcKTlQR.js → initDefaultProps-C1zO1KnY.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-CL-hTBQj.js → motion-CWLtEGmC.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-qYSAkxNG.js → move-DzD_C3Vm.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-ZwRSZtRP.js → mtc-parser-D880PYJl.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-Bld-8ftI.js → omit-CFR_z2ov.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-DGHs-a9Z.js → pickAttrs-srIhgrSC.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-DRQPMyI5.js → placementArrow-C1rXpibP.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-C5MJG_Yo.js → responsiveObserve-C30gRcSS.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-VZ-fpZCD.js → slide-CvtKiMfV.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-9ocfCyHk.js → statusUtils-DNHO7ITG.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-B6QAwAN5.js → styleChecker-Dt_Sl-g4.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-Bq1twor3.js → useFlexGapSupport-Cjev42Gh.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-DKZq96tz.js → useFs-Baxglj2V.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-D0RmRVXf.js → usePersonalDataHub-B4NkcLaP.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-D6kEj_tt.js → vnode-mIRkdT7o.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-2yfasoQf.js → zoom-HzI5DlH_.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/auth/npm-auth.js +30 -5
  151. package/src/commands/agenda.js +64 -2
  152. package/src/commands/agent.js +39 -1
  153. package/src/commands/config.js +70 -5
  154. package/src/commands/context.js +36 -2
  155. package/src/commands/hub.js +19 -1
  156. package/src/commands/memory.js +21 -6
  157. package/src/commands/permissions.js +57 -1
  158. package/src/commands/plugin.js +2 -0
  159. package/src/commands/review.js +23 -11
  160. package/src/commands/routine.js +31 -8
  161. package/src/commands/session.js +11 -3
  162. package/src/commands/team.js +20 -7
  163. package/src/commands/update.js +65 -10
  164. package/src/gateways/terminal/PtyManager.js +8 -1
  165. package/src/gateways/ws/message-dispatcher.js +3 -0
  166. package/src/gateways/ws/session-protocol.js +26 -0
  167. package/src/gateways/ws/ws-agent-handler.js +107 -69
  168. package/src/gateways/ws/ws-server.js +74 -2
  169. package/src/harness/jsonl-session-store.js +13 -6
  170. package/src/harness/mcp-client.js +200 -1
  171. package/src/lib/__tests__/personal-data-hub-aichat-wizard.test.js +15 -0
  172. package/src/lib/agent-coordinator.js +4 -0
  173. package/src/lib/agent-ipc-bus.js +32 -2
  174. package/src/lib/agent-sandbox.js +16 -2
  175. package/src/lib/agent-schedule-store.js +55 -0
  176. package/src/lib/agent-tool-admission.js +104 -0
  177. package/src/lib/api-key-helper.js +10 -2
  178. package/src/lib/async-hook-supervisor.cjs +12 -2
  179. package/src/lib/changelog.js +19 -11
  180. package/src/lib/channels/channel-manager.js +6 -0
  181. package/src/lib/channels/telegram-channel.js +11 -1
  182. package/src/lib/channels/webhook-channel.js +15 -3
  183. package/src/lib/checkpoint-store.js +10 -2
  184. package/src/lib/cloud/bundle.js +12 -2
  185. package/src/lib/code-review.js +32 -8
  186. package/src/lib/computer-use/control-backend.js +18 -3
  187. package/src/lib/context-breakdown.js +46 -0
  188. package/src/lib/context-source-ledger.js +43 -0
  189. package/src/lib/diff-review-follow-up.js +154 -0
  190. package/src/lib/downloader.js +17 -3
  191. package/src/lib/ensure-utf8.js +11 -3
  192. package/src/lib/event-runtime-producer.js +58 -0
  193. package/src/lib/event-runtime-store.js +354 -0
  194. package/src/lib/event-runtime-worker.js +109 -0
  195. package/src/lib/execution-backend.js +72 -21
  196. package/src/lib/git-integration.js +19 -4
  197. package/src/lib/hook-manager.js +6 -15
  198. package/src/lib/hook-runner.cjs +48 -3
  199. package/src/lib/hooks-v2-producers.js +15 -0
  200. package/src/lib/hooks-v2-runtime.js +70 -21
  201. package/src/lib/host-adb-bridge.js +111 -21
  202. package/src/lib/ide-context.js +128 -1
  203. package/src/lib/interaction-adapter.js +39 -0
  204. package/src/lib/json-schema-validate.js +190 -36
  205. package/src/lib/lan-pairing-preflight.js +13 -2
  206. package/src/lib/lsp/__tests__/lsp-server-registry.test.js +18 -0
  207. package/src/lib/lsp/lsp-client.js +18 -1
  208. package/src/lib/lsp/lsp-manager.js +4 -0
  209. package/src/lib/lsp/lsp-server-registry.js +11 -0
  210. package/src/lib/mcp-oauth.js +8 -2
  211. package/src/lib/npm-invocation.js +29 -0
  212. package/src/lib/packer/pkg-runner.js +13 -2
  213. package/src/lib/packer/precheck.js +33 -16
  214. package/src/lib/packer/web-panel-builder.js +16 -2
  215. package/src/lib/permission-rules.cjs +5 -1
  216. package/src/lib/personal-data-hub-aichat-wizard.js +22 -6
  217. package/src/lib/personal-data-hub-wiring.js +27 -3
  218. package/src/lib/plan-mode.js +204 -11
  219. package/src/lib/plugin-monitor-supervisor.js +39 -4
  220. package/src/lib/plugin-runtime/bin.js +45 -0
  221. package/src/lib/plugin-runtime/hooks.js +14 -1
  222. package/src/lib/plugin-runtime/install.js +2 -1
  223. package/src/lib/plugin-runtime/lsp.js +3 -0
  224. package/src/lib/plugin-runtime/mcp.js +8 -1
  225. package/src/lib/plugin-runtime/monitors.js +4 -0
  226. package/src/lib/plugin-runtime/plugin-options.js +74 -7
  227. package/src/lib/plugin-runtime/signature.js +45 -0
  228. package/src/lib/pr-create.js +21 -8
  229. package/src/lib/pr-link-ledger.js +15 -3
  230. package/src/lib/process-execution-broker/credential-agent.js +23 -3
  231. package/src/lib/process-execution-broker/index.js +315 -38
  232. package/src/lib/process-execution-broker/patch-child-process.js +2 -3
  233. package/src/lib/process-manager.js +18 -3
  234. package/src/lib/publish-workspace.js +14 -6
  235. package/src/lib/secret-store.js +159 -0
  236. package/src/lib/service-manager.js +64 -29
  237. package/src/lib/settings-hook-events.cjs +61 -1
  238. package/src/lib/settings-hooks.cjs +4 -0
  239. package/src/lib/side-effect-ledger.js +22 -0
  240. package/src/lib/sub-agent-context.js +5 -0
  241. package/src/lib/sub-agent-profiles.js +4 -0
  242. package/src/lib/turn-context.js +14 -8
  243. package/src/lib/unattended-action-policy.js +83 -0
  244. package/src/lib/update-notice.js +6 -2
  245. package/src/lib/with-file-lock.js +7 -0
  246. package/src/lib/ws-server.js +1 -0
  247. package/src/repl/agent-repl.js +32 -0
  248. package/src/repl/clipboard-copy.js +8 -2
  249. package/src/repl/pr-comments.js +30 -7
  250. package/src/runtime/agent-core.js +439 -87
  251. package/src/runtime/agent-runtime.js +1 -0
  252. package/src/runtime/coding-agent-contract-shared.cjs +52 -0
  253. package/src/runtime/coding-agent-policy.cjs +20 -0
  254. package/src/runtime/diagnostics.js +73 -8
  255. package/src/runtime/headless-runner.js +63 -0
  256. package/src/runtime/headless-stream.js +269 -17
  257. package/src/runtime/mcp-config.js +16 -1
  258. package/src/assets/web-panel/assets/MobileProjects-BLRfHhqi.js +0 -1
  259. package/src/assets/web-panel/assets/Providers-zZRhNtSu.js +0 -1
  260. package/src/assets/web-panel/assets/Terminal-DWGYhAYU.js +0 -3
  261. package/src/assets/web-panel/assets/devWarning-CLOk6rdE.js +0 -1
  262. package/src/assets/web-panel/assets/index-CSgUfMTM.js +0 -1
  263. package/src/assets/web-panel/assets/index-DliSZvAP.js +0 -1
@@ -1 +1 @@
1
- import{J as o,h}from"./index-BBNg08cD.js";import{b as x}from"./vendor-Bn1JzzAn.js";const v=["xxxl","xxl","xl","lg","md","sm","xs"],p=r=>({xs:`(max-width: ${r.screenXSMax}px)`,sm:`(min-width: ${r.screenSM}px)`,md:`(min-width: ${r.screenMD}px)`,lg:`(min-width: ${r.screenLG}px)`,xl:`(min-width: ${r.screenXL}px)`,xxl:`(min-width: ${r.screenXXL}px)`,xxxl:`{min-width: ${r.screenXXXL}px}`});function w(){const[,r]=o();return x(()=>{const n=p(r.value),i=new Map;let a=-1,c={};return{matchHandlers:{},dispatch(e){return c=e,i.forEach(t=>t(c)),i.size>=1},subscribe(e){return i.size||this.register(),a+=1,i.set(a,e),e(c),a},unsubscribe(e){i.delete(e),i.size||this.unregister()},unregister(){Object.keys(n).forEach(e=>{const t=n[e],s=this.matchHandlers[t];s?.mql.removeListener(s?.listener)}),i.clear()},register(){Object.keys(n).forEach(e=>{const t=n[e],s=l=>{let{matches:m}=l;this.dispatch(h(h({},c),{[e]:m}))},d=window.matchMedia(t);d.addListener(s),this.matchHandlers[t]={mql:d,listener:s},s(d)})},responsiveMap:n}})}export{v as r,w as u};
1
+ import{J as o,h}from"./index-BO1itZaY.js";import{b as x}from"./vendor-Bn1JzzAn.js";const v=["xxxl","xxl","xl","lg","md","sm","xs"],p=r=>({xs:`(max-width: ${r.screenXSMax}px)`,sm:`(min-width: ${r.screenSM}px)`,md:`(min-width: ${r.screenMD}px)`,lg:`(min-width: ${r.screenLG}px)`,xl:`(min-width: ${r.screenXL}px)`,xxl:`(min-width: ${r.screenXXL}px)`,xxxl:`{min-width: ${r.screenXXXL}px}`});function w(){const[,r]=o();return x(()=>{const n=p(r.value),i=new Map;let a=-1,c={};return{matchHandlers:{},dispatch(e){return c=e,i.forEach(t=>t(c)),i.size>=1},subscribe(e){return i.size||this.register(),a+=1,i.set(a,e),e(c),a},unsubscribe(e){i.delete(e),i.size||this.unregister()},unregister(){Object.keys(n).forEach(e=>{const t=n[e],s=this.matchHandlers[t];s?.mql.removeListener(s?.listener)}),i.clear()},register(){Object.keys(n).forEach(e=>{const t=n[e],s=l=>{let{matches:m}=l;this.dispatch(h(h({},c),{[e]:m}))},d=window.matchMedia(t);d.addListener(s),this.matchHandlers[t]={mql:d,listener:s},s(d)})},responsiveMap:n}})}export{v as r,w as u};
@@ -1,4 +1,4 @@
1
- import{K as n}from"./index-BBNg08cD.js";import{i as e}from"./motion-CL-hTBQj.js";const m=new n("antSlideUpIn",{"0%":{transform:"scaleY(0.8)",transformOrigin:"0% 0%",opacity:0},"100%":{transform:"scaleY(1)",transformOrigin:"0% 0%",opacity:1}}),f=new n("antSlideUpOut",{"0%":{transform:"scaleY(1)",transformOrigin:"0% 0%",opacity:1},"100%":{transform:"scaleY(0.8)",transformOrigin:"0% 0%",opacity:0}}),c=new n("antSlideDownIn",{"0%":{transform:"scaleY(0.8)",transformOrigin:"100% 100%",opacity:0},"100%":{transform:"scaleY(1)",transformOrigin:"100% 100%",opacity:1}}),l=new n("antSlideDownOut",{"0%":{transform:"scaleY(1)",transformOrigin:"100% 100%",opacity:1},"100%":{transform:"scaleY(0.8)",transformOrigin:"100% 100%",opacity:0}}),y=new n("antSlideLeftIn",{"0%":{transform:"scaleX(0.8)",transformOrigin:"0% 0%",opacity:0},"100%":{transform:"scaleX(1)",transformOrigin:"0% 0%",opacity:1}}),p=new n("antSlideLeftOut",{"0%":{transform:"scaleX(1)",transformOrigin:"0% 0%",opacity:1},"100%":{transform:"scaleX(0.8)",transformOrigin:"0% 0%",opacity:0}}),O=new n("antSlideRightIn",{"0%":{transform:"scaleX(0.8)",transformOrigin:"100% 0%",opacity:0},"100%":{transform:"scaleX(1)",transformOrigin:"100% 0%",opacity:1}}),d=new n("antSlideRightOut",{"0%":{transform:"scaleX(1)",transformOrigin:"100% 0%",opacity:1},"100%":{transform:"scaleX(0.8)",transformOrigin:"100% 0%",opacity:0}}),g={"slide-up":{inKeyframes:m,outKeyframes:f},"slide-down":{inKeyframes:c,outKeyframes:l},"slide-left":{inKeyframes:y,outKeyframes:p},"slide-right":{inKeyframes:O,outKeyframes:d}},K=(t,r)=>{const{antCls:a}=t,i=`${a}-${r}`,{inKeyframes:s,outKeyframes:o}=g[r];return[e(i,s,o,t.motionDurationMid),{[`
1
+ import{K as n}from"./index-BO1itZaY.js";import{i as e}from"./motion-CWLtEGmC.js";const m=new n("antSlideUpIn",{"0%":{transform:"scaleY(0.8)",transformOrigin:"0% 0%",opacity:0},"100%":{transform:"scaleY(1)",transformOrigin:"0% 0%",opacity:1}}),f=new n("antSlideUpOut",{"0%":{transform:"scaleY(1)",transformOrigin:"0% 0%",opacity:1},"100%":{transform:"scaleY(0.8)",transformOrigin:"0% 0%",opacity:0}}),c=new n("antSlideDownIn",{"0%":{transform:"scaleY(0.8)",transformOrigin:"100% 100%",opacity:0},"100%":{transform:"scaleY(1)",transformOrigin:"100% 100%",opacity:1}}),l=new n("antSlideDownOut",{"0%":{transform:"scaleY(1)",transformOrigin:"100% 100%",opacity:1},"100%":{transform:"scaleY(0.8)",transformOrigin:"100% 100%",opacity:0}}),y=new n("antSlideLeftIn",{"0%":{transform:"scaleX(0.8)",transformOrigin:"0% 0%",opacity:0},"100%":{transform:"scaleX(1)",transformOrigin:"0% 0%",opacity:1}}),p=new n("antSlideLeftOut",{"0%":{transform:"scaleX(1)",transformOrigin:"0% 0%",opacity:1},"100%":{transform:"scaleX(0.8)",transformOrigin:"0% 0%",opacity:0}}),O=new n("antSlideRightIn",{"0%":{transform:"scaleX(0.8)",transformOrigin:"100% 0%",opacity:0},"100%":{transform:"scaleX(1)",transformOrigin:"100% 0%",opacity:1}}),d=new n("antSlideRightOut",{"0%":{transform:"scaleX(1)",transformOrigin:"100% 0%",opacity:1},"100%":{transform:"scaleX(0.8)",transformOrigin:"100% 0%",opacity:0}}),g={"slide-up":{inKeyframes:m,outKeyframes:f},"slide-down":{inKeyframes:c,outKeyframes:l},"slide-left":{inKeyframes:y,outKeyframes:p},"slide-right":{inKeyframes:O,outKeyframes:d}},K=(t,r)=>{const{antCls:a}=t,i=`${a}-${r}`,{inKeyframes:s,outKeyframes:o}=g[r];return[e(i,s,o,t.motionDurationMid),{[`
2
2
  ${i}-enter,
3
3
  ${i}-appear
4
4
  `]:{transform:"scale(0)",transformOrigin:"0% 0%",opacity:0,animationTimingFunction:t.motionEaseOutQuint},[`${i}-leave`]:{animationTimingFunction:t.motionEaseInQuint}}]};export{f as a,c as b,m as c,K as i,l as s};
@@ -1 +1 @@
1
- import{i as e}from"./index-BBNg08cD.js";function r(a,s,t){return e({[`${a}-status-success`]:s==="success",[`${a}-status-warning`]:s==="warning",[`${a}-status-error`]:s==="error",[`${a}-status-validating`]:s==="validating",[`${a}-has-feedback`]:t})}const c=(a,s)=>s||a;export{c as a,r as g};
1
+ import{i as e}from"./index-BO1itZaY.js";function r(a,s,t){return e({[`${a}-status-success`]:s==="success",[`${a}-status-warning`]:s==="warning",[`${a}-status-error`]:s==="error",[`${a}-status-validating`]:s==="validating",[`${a}-has-feedback`]:t})}const c=(a,s)=>s||a;export{c as a,r as g};
@@ -1 +1 @@
1
- import{B as d}from"./index-BBNg08cD.js";const i=()=>d()&&window.document.documentElement,c=e=>{if(d()&&window.document.documentElement){const t=Array.isArray(e)?e:[e],{documentElement:n}=window.document;return t.some(r=>r in n.style)}return!1},u=(e,t)=>{if(!c(e))return!1;const n=document.createElement("div"),r=n.style[e];return n.style[e]=t,n.style[e]!==r};function s(e,t){return!Array.isArray(e)&&t!==void 0?u(e,t):c(e)}let o;const p=()=>{if(!i())return!1;if(o!==void 0)return o;const e=document.createElement("div");return e.style.display="flex",e.style.flexDirection="column",e.style.rowGap="1px",e.appendChild(document.createElement("div")),e.appendChild(document.createElement("div")),document.body.appendChild(e),o=e.scrollHeight===1,document.body.removeChild(e),o};export{i as c,p as d,s as i};
1
+ import{B as d}from"./index-BO1itZaY.js";const i=()=>d()&&window.document.documentElement,c=e=>{if(d()&&window.document.documentElement){const t=Array.isArray(e)?e:[e],{documentElement:n}=window.document;return t.some(r=>r in n.style)}return!1},u=(e,t)=>{if(!c(e))return!1;const n=document.createElement("div"),r=n.style[e];return n.style[e]=t,n.style[e]!==r};function s(e,t){return!Array.isArray(e)&&t!==void 0?u(e,t):c(e)}let o;const p=()=>{if(!i())return!1;if(o!==void 0)return o;const e=document.createElement("div");return e.style.display="flex",e.style.flexDirection="column",e.style.rowGap="1px",e.appendChild(document.createElement("div")),e.appendChild(document.createElement("div")),document.body.appendChild(e),o=e.scrollHeight===1,document.body.removeChild(e),o};export{i as c,p as d,s as i};
@@ -1 +1 @@
1
- import{o,s as t}from"./vendor-Bn1JzzAn.js";import{d as s}from"./styleChecker-B6QAwAN5.js";const r=(()=>{const e=t(!1);return o(()=>{e.value=s()}),e});export{r as u};
1
+ import{o,s as t}from"./vendor-Bn1JzzAn.js";import{d as s}from"./styleChecker-Dt_Sl-g4.js";const r=(()=>{const e=t(!1);return o(()=>{e.value=s()}),e});export{r as u};
@@ -1 +1 @@
1
- import{u as d}from"./index-BBNg08cD.js";import{u as c}from"./useShellMode-CgR0wCYM.js";function u({accept:l=""}={}){return new Promise(a=>{if(typeof document>"u"){a({canceled:!0,path:null,content:null});return}const n=document.createElement("input");n.type="file",l&&(n.accept=l),n.style.display="none",document.body.appendChild(n);let o=!1;const i=()=>{n.parentNode&&n.parentNode.removeChild(n)},r=()=>{if(o)return;o=!0;const e=n.files&&n.files[0];if(!e){i(),a({canceled:!0,path:null,content:null});return}const t=new FileReader;t.onload=()=>{i(),a({canceled:!1,path:e.name,size:e.size,content:typeof t.result=="string"?t.result:""})},t.onerror=()=>{i(),a({canceled:!1,path:e.name,size:e.size,content:null,reason:"read_failed"})},t.readAsText(e)};n.addEventListener("change",r),n.click()})}function f(l,{defaultPath:a="download.txt"}={}){if(typeof document>"u")return{canceled:!0,path:null};const n=new Blob([l],{type:"text/plain"}),o=URL.createObjectURL(n),i=document.createElement("a");return i.href=o,i.download=a,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(o),{canceled:!1,path:a}}function p(l){if(!Array.isArray(l))return"";const a=[];for(const n of l)if(Array.isArray(n.extensions))for(const o of n.extensions)a.push(`.${o.replace(/^\./,"")}`);return a.join(",")}function m(){const l=d();async function a(r={}){if(c().isEmbedded){const e=await l.sendRaw({type:"fs.openDialog",title:r.title,filters:r.filters},6e4);if(e&&e.ok===!1)throw new Error(e.error||"fs.openDialog failed");const t=e?.result??e;return{canceled:!!t.canceled,path:t.path??null,content:t.content??null,size:t.size,reason:t.reason}}return u({accept:p(r.filters)})}async function n(r,e={}){if(typeof r!="string")throw new Error("content must be a string");if(c().isEmbedded){const t=await l.sendRaw({type:"fs.saveDialog",title:e.title,defaultPath:e.defaultPath,filters:e.filters,content:r},6e4);if(t&&t.ok===!1)throw new Error(t.error||"fs.saveDialog failed");const s=t?.result??t;return{canceled:!!s.canceled,path:s.path??null}}return f(r,{defaultPath:e.defaultPath})}async function o(r,e={}){const t=JSON.stringify(r,null,2),s={...e,defaultPath:e.defaultPath||"data.json",filters:e.filters||[{name:"JSON",extensions:["json"]}]};return n(t,s)}async function i(r={}){if(!c().isEmbedded)return{canceled:!0,path:null,initialized:!1,unsupported:!0};const e=await l.sendRaw({type:"fs.openDirectory",title:r.title},6e4);if(e&&e.ok===!1)throw new Error(e.error||"fs.openDirectory failed");const t=e?.result??e;return{canceled:!!t.canceled,path:t.path??null,initialized:!!t.initialized}}return{pickFileText:a,saveText:n,saveJson:o,pickDirectory:i}}export{m as u};
1
+ import{u as d}from"./index-BO1itZaY.js";import{u as c}from"./useShellMode-CgR0wCYM.js";function u({accept:l=""}={}){return new Promise(a=>{if(typeof document>"u"){a({canceled:!0,path:null,content:null});return}const n=document.createElement("input");n.type="file",l&&(n.accept=l),n.style.display="none",document.body.appendChild(n);let o=!1;const i=()=>{n.parentNode&&n.parentNode.removeChild(n)},r=()=>{if(o)return;o=!0;const e=n.files&&n.files[0];if(!e){i(),a({canceled:!0,path:null,content:null});return}const t=new FileReader;t.onload=()=>{i(),a({canceled:!1,path:e.name,size:e.size,content:typeof t.result=="string"?t.result:""})},t.onerror=()=>{i(),a({canceled:!1,path:e.name,size:e.size,content:null,reason:"read_failed"})},t.readAsText(e)};n.addEventListener("change",r),n.click()})}function f(l,{defaultPath:a="download.txt"}={}){if(typeof document>"u")return{canceled:!0,path:null};const n=new Blob([l],{type:"text/plain"}),o=URL.createObjectURL(n),i=document.createElement("a");return i.href=o,i.download=a,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(o),{canceled:!1,path:a}}function p(l){if(!Array.isArray(l))return"";const a=[];for(const n of l)if(Array.isArray(n.extensions))for(const o of n.extensions)a.push(`.${o.replace(/^\./,"")}`);return a.join(",")}function m(){const l=d();async function a(r={}){if(c().isEmbedded){const e=await l.sendRaw({type:"fs.openDialog",title:r.title,filters:r.filters},6e4);if(e&&e.ok===!1)throw new Error(e.error||"fs.openDialog failed");const t=e?.result??e;return{canceled:!!t.canceled,path:t.path??null,content:t.content??null,size:t.size,reason:t.reason}}return u({accept:p(r.filters)})}async function n(r,e={}){if(typeof r!="string")throw new Error("content must be a string");if(c().isEmbedded){const t=await l.sendRaw({type:"fs.saveDialog",title:e.title,defaultPath:e.defaultPath,filters:e.filters,content:r},6e4);if(t&&t.ok===!1)throw new Error(t.error||"fs.saveDialog failed");const s=t?.result??t;return{canceled:!!s.canceled,path:s.path??null}}return f(r,{defaultPath:e.defaultPath})}async function o(r,e={}){const t=JSON.stringify(r,null,2),s={...e,defaultPath:e.defaultPath||"data.json",filters:e.filters||[{name:"JSON",extensions:["json"]}]};return n(t,s)}async function i(r={}){if(!c().isEmbedded)return{canceled:!0,path:null,initialized:!1,unsupported:!0};const e=await l.sendRaw({type:"fs.openDirectory",title:r.title},6e4);if(e&&e.ok===!1)throw new Error(e.error||"fs.openDirectory failed");const t=e?.result??e;return{canceled:!!t.canceled,path:t.path??null,initialized:!!t.initialized}}return{pickFileText:a,saveText:n,saveJson:o,pickDirectory:i}}export{m as u};
@@ -1 +1 @@
1
- import{u as f}from"./index-BBNg08cD.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-BO1itZaY.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{N as i,h as a,w as l}from"./index-BBNg08cD.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-BO1itZaY.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-BBNg08cD.js";import{i as f}from"./motion-CL-hTBQj.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-BO1itZaY.js";import{i as f}from"./motion-CWLtEGmC.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-BBNg08cD.js"></script>
11
+ <script type="module" crossorigin src="./assets/index-BO1itZaY.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">
@@ -4,8 +4,33 @@
4
4
  * @module auth/npm-auth
5
5
  */
6
6
 
7
- import { execSync } from "child_process";
8
7
  import { logger } from "../lib/logger.js";
8
+ import { executionBroker } from "../lib/process-execution-broker/index.js";
9
+ import { resolveNpmInvocation } from "../lib/npm-invocation.js";
10
+
11
+ export const _deps = {
12
+ platform: process.platform,
13
+ execPath: process.execPath,
14
+ execFileSync: (...args) => executionBroker.execFileSync(...args),
15
+ };
16
+
17
+ function runNpm(args, options = {}) {
18
+ const invocation = resolveNpmInvocation({
19
+ platform: _deps.platform,
20
+ execPath: _deps.execPath,
21
+ });
22
+ return _deps.execFileSync(
23
+ invocation.command,
24
+ [...invocation.prefixArgs, ...args],
25
+ {
26
+ ...options,
27
+ origin: "auth:npm",
28
+ policy: "allow",
29
+ scope: "auth",
30
+ shell: false,
31
+ },
32
+ );
33
+ }
9
34
 
10
35
  /**
11
36
  * Check if user is currently logged in to npm
@@ -13,7 +38,7 @@ import { logger } from "../lib/logger.js";
13
38
  */
14
39
  export function isLoggedIn() {
15
40
  try {
16
- execSync("npm whoami", { stdio: "ignore" });
41
+ runNpm(["whoami"], { stdio: "ignore" });
17
42
  return true;
18
43
  } catch {
19
44
  return false;
@@ -26,7 +51,7 @@ export function isLoggedIn() {
26
51
  */
27
52
  export function getCurrentUser() {
28
53
  try {
29
- return execSync("npm whoami", { encoding: "utf8" }).trim();
54
+ return runNpm(["whoami"], { encoding: "utf8" }).trim();
30
55
  } catch {
31
56
  return null;
32
57
  }
@@ -39,7 +64,7 @@ export function getCurrentUser() {
39
64
  export async function login() {
40
65
  try {
41
66
  logger.info("Running npm login...");
42
- execSync("npm login", { stdio: "inherit" });
67
+ runNpm(["login"], { stdio: "inherit" });
43
68
  return isLoggedIn();
44
69
  } catch (err) {
45
70
  logger.error(`Login failed: ${err.message}`);
@@ -54,7 +79,7 @@ export async function login() {
54
79
  export async function logout() {
55
80
  try {
56
81
  logger.info("Running npm logout...");
57
- execSync("npm logout", { stdio: "inherit" });
82
+ runNpm(["logout"], { stdio: "inherit" });
58
83
  return !isLoggedIn();
59
84
  } catch (err) {
60
85
  logger.error(`Logout failed: ${err.message}`);
@@ -53,8 +53,14 @@ export function registerAgendaCommand(program) {
53
53
  .description("Fire every entry that is due now")
54
54
  .option("--dry-run", "Show what would fire without running anything")
55
55
  .option("--json", "Machine-readable JSON output")
56
+ .option(
57
+ "--watch <seconds>",
58
+ "Keep running as a resident scheduler and poll at this interval",
59
+ )
56
60
  .action(async (options) => {
57
- process.exitCode = await runAgendaRun(options);
61
+ process.exitCode = options.watch
62
+ ? await runAgendaDaemon(options)
63
+ : await runAgendaRun(options);
58
64
  });
59
65
 
60
66
  cmd
@@ -219,7 +225,11 @@ export async function runAgendaRun(options = {}, _deps = {}) {
219
225
  const retired = options.dryRun
220
226
  ? partitionSchedule(store.list(), { now }).expired
221
227
  : store.retireExpired(now);
222
- const due = store.due(null, now);
228
+ const due = options.dryRun
229
+ ? store.due(null, now)
230
+ : typeof store.claimDue === "function"
231
+ ? store.claimDue(now, options.leaseMs)
232
+ : store.due(null, now);
223
233
  const actions = [];
224
234
 
225
235
  for (const entry of due) {
@@ -337,6 +347,7 @@ export async function runAgendaRun(options = {}, _deps = {}) {
337
347
  }
338
348
  }
339
349
  } catch (err) {
350
+ store.releaseClaim?.(entry.id);
340
351
  actions.push({
341
352
  id: entry.id,
342
353
  kind: entry.kind,
@@ -373,6 +384,53 @@ export async function runAgendaRun(options = {}, _deps = {}) {
373
384
  return actions.some((a) => a.action === "error") ? 1 : 0;
374
385
  }
375
386
 
387
+ /**
388
+ * Resident scheduler loop for `cc agenda run --watch <seconds>`.
389
+ *
390
+ * The store remains the source of truth: every tick re-reads durable entries,
391
+ * retires expired work, and claims due entries through the same lease path as
392
+ * one-shot execution. A signal or injected AbortSignal stops after the current
393
+ * tick; `maxTicks` is intentionally supported for deterministic tests.
394
+ */
395
+ export async function runAgendaDaemon(options = {}, _deps = {}) {
396
+ const intervalSeconds = Number(options.watch);
397
+ const intervalMs = Math.max(
398
+ 250,
399
+ Number.isFinite(intervalSeconds) && intervalSeconds > 0
400
+ ? intervalSeconds * 1000
401
+ : 60000,
402
+ );
403
+ const signal = options.signal || _deps.signal || null;
404
+ const runOnce = _deps.runOnce || ((next) => runAgendaRun(next, _deps));
405
+ const sleep =
406
+ _deps.sleep ||
407
+ ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
408
+ let stopped = Boolean(signal?.aborted);
409
+ let lastCode = 0;
410
+ let ticks = 0;
411
+ const stop = () => {
412
+ stopped = true;
413
+ };
414
+ const onAbort = () => stop();
415
+ signal?.addEventListener?.("abort", onAbort, { once: true });
416
+ const onSignal = () => stop();
417
+ process.once("SIGINT", onSignal);
418
+ process.once("SIGTERM", onSignal);
419
+ try {
420
+ while (!stopped) {
421
+ lastCode = Math.max(lastCode, await runOnce({ ...options, watch: null }));
422
+ ticks += 1;
423
+ if (Number.isFinite(_deps.maxTicks) && ticks >= _deps.maxTicks) break;
424
+ await sleep(intervalMs);
425
+ }
426
+ } finally {
427
+ signal?.removeEventListener?.("abort", onAbort);
428
+ process.removeListener("SIGINT", onSignal);
429
+ process.removeListener("SIGTERM", onSignal);
430
+ }
431
+ return lastCode;
432
+ }
433
+
376
434
  // ─── default effectful deps (overridable in tests) ─────────────────────────
377
435
 
378
436
  /**
@@ -397,6 +455,10 @@ export function buildAgentArgs(prompt, policy = null) {
397
455
  if (disallow.length > 0) {
398
456
  args.push("--disallowed-tools", disallow.join(","));
399
457
  }
458
+ args.push("--unattended");
459
+ if (policy && Array.isArray(policy.unattendedAllowlist) && policy.unattendedAllowlist.length > 0) {
460
+ args.push("--unattended-allow", policy.unattendedAllowlist.join(","));
461
+ }
400
462
  if (policy && typeof policy === "object") {
401
463
  if (
402
464
  typeof policy.permissionMode === "string" &&
@@ -195,6 +195,14 @@ export function registerAgentCommand(program) {
195
195
  "--worktree",
196
196
  "Run this session in a fresh git worktree (isolated branch; auto-removed when the session changes nothing)",
197
197
  )
198
+ .option(
199
+ "--unattended",
200
+ "Enable fail-closed shell action policy for scheduled/event-driven runs",
201
+ )
202
+ .option(
203
+ "--unattended-allow <classes>",
204
+ "Comma-separated action classes explicitly allowed for unattended shell runs",
205
+ )
198
206
  .option(
199
207
  "--sandbox [image]",
200
208
  "Run shell commands in an ephemeral Docker sandbox (network disabled by default)",
@@ -422,6 +430,21 @@ export function registerAgentCommand(program) {
422
430
  console.log(JSON.stringify(buildAgentCapabilities(), null, 2));
423
431
  return;
424
432
  }
433
+ let toolAdmission = null;
434
+ if (process.env.CC_TOOL_ADMISSION) {
435
+ try {
436
+ const { parseToolAdmissionConfig } =
437
+ await import("../lib/agent-tool-admission.js");
438
+ toolAdmission = parseToolAdmissionConfig(
439
+ process.env.CC_TOOL_ADMISSION,
440
+ );
441
+ } catch (error) {
442
+ process.stderr.write(
443
+ `CC_TOOL_ADMISSION: ${error.message}; refusing an ungoverned session.\n`,
444
+ );
445
+ process.exit(6);
446
+ }
447
+ }
425
448
  // CC_API_KEY env fallback for --api-key: lets callers (IDE plugins,
426
449
  // scripts) pass the key via the environment instead of argv, where it
427
450
  // is visible to every local process (/proc/<pid>/cmdline, Win32_Process).
@@ -754,6 +777,16 @@ export function registerAgentCommand(program) {
754
777
  await import("../lib/settings-loader.cjs");
755
778
  const sc = loadSettingsConfig({
756
779
  cwd: process.cwd(),
780
+ unattendedActionPolicy: options.unattended
781
+ ? {
782
+ unattended: true,
783
+ allowlist: String(options.unattendedAllow || "")
784
+ .split(",")
785
+ .map((value) => value.trim())
786
+ .filter(Boolean),
787
+ trigger: { trusted: true },
788
+ }
789
+ : null,
757
790
  settingsFile: options.settings || null,
758
791
  });
759
792
  for (const [k, v] of Object.entries(sc.env || {})) {
@@ -997,7 +1030,11 @@ export function registerAgentCommand(program) {
997
1030
  jsonSchema: options.jsonSchema || null,
998
1031
  });
999
1032
  } catch (err) {
1000
- process.stderr.write(`Error: ${err.message}\n`);
1033
+ process.stderr.write(
1034
+ process.env.CC_DEBUG && err?.stack
1035
+ ? `${err.stack}\n`
1036
+ : `Error: ${err.message}\n`,
1037
+ );
1001
1038
  await _finishWorktree();
1002
1039
  process.exit(1);
1003
1040
  }
@@ -1168,6 +1205,7 @@ export function registerAgentCommand(program) {
1168
1205
  baseUrl: visionLlm.baseUrl || options.baseUrl,
1169
1206
  apiKey: visionLlm.apiKey || options.apiKey,
1170
1207
  sessionId: options.session,
1208
+ toolAdmission,
1171
1209
  // A resolved --session/--continue/--resume id means "replay this
1172
1210
  // conversation and persist the new turns"; the runner loads prior
1173
1211
  // history when the id already exists and creates it otherwise.
@@ -9,6 +9,75 @@ import {
9
9
  import { getConfigPath } from "../lib/paths.js";
10
10
  import logger from "../lib/logger.js";
11
11
  import { listFeatures, setFeature, getFlagInfo } from "../lib/feature-flags.js";
12
+ import { executionBroker } from "../lib/process-execution-broker/index.js";
13
+
14
+ export const _deps = {
15
+ spawnSync: (...args) => executionBroker.spawnSync(...args),
16
+ };
17
+
18
+ /** Parse the conventional $EDITOR string without invoking a shell. */
19
+ export function parseEditorCommand(value) {
20
+ const input = String(value || "").trim();
21
+ if (!input) return [];
22
+ const tokens = [];
23
+ let token = "";
24
+ let quote = null;
25
+ let started = false;
26
+ for (let index = 0; index < input.length; index += 1) {
27
+ const char = input[index];
28
+ if (quote) {
29
+ if (char === quote) {
30
+ quote = null;
31
+ started = true;
32
+ } else if (char === "\\" && input[index + 1] === quote) {
33
+ token += quote;
34
+ index += 1;
35
+ } else {
36
+ token += char;
37
+ }
38
+ continue;
39
+ }
40
+ if (char === '"' || char === "'") {
41
+ quote = char;
42
+ started = true;
43
+ continue;
44
+ }
45
+ if (/\s/.test(char)) {
46
+ if (started || token) {
47
+ tokens.push(token);
48
+ token = "";
49
+ started = false;
50
+ }
51
+ continue;
52
+ }
53
+ if (
54
+ char === "\\" &&
55
+ (input[index + 1] === '"' || input[index + 1] === "'")
56
+ ) {
57
+ token += input[index + 1];
58
+ index += 1;
59
+ started = true;
60
+ continue;
61
+ }
62
+ token += char;
63
+ started = true;
64
+ }
65
+ if (quote) throw new Error("EDITOR contains an unterminated quote");
66
+ if (started || token) tokens.push(token);
67
+ return tokens;
68
+ }
69
+
70
+ export function openConfigEditor(editor, configPath, deps = _deps) {
71
+ const [file, ...editorArgs] = parseEditorCommand(editor);
72
+ if (!file) throw new Error("EDITOR command is empty");
73
+ return deps.spawnSync(file, [...editorArgs, configPath], {
74
+ stdio: "inherit",
75
+ origin: "config:editor",
76
+ policy: "allow",
77
+ scope: "config",
78
+ shell: false,
79
+ });
80
+ }
12
81
 
13
82
  export function registerConfigCommand(program) {
14
83
  const cmd = program
@@ -109,12 +178,8 @@ export function registerConfigCommand(program) {
109
178
  process.env.EDITOR ||
110
179
  process.env.VISUAL ||
111
180
  (process.platform === "win32" ? "notepad" : "vi");
112
- const { execSync } = await import("node:child_process");
113
181
  try {
114
- // Escape any `"` in the path so it can't break out of the quoted arg
115
- // (editor stays unquoted so `$EDITOR` values with args still work).
116
- const safePath = configPath.replace(/"/g, '\\"');
117
- execSync(`${editor} "${safePath}"`, { stdio: "inherit" });
182
+ openConfigEditor(editor, configPath);
118
183
  } catch (err) {
119
184
  logger.error(`Failed to open editor: ${err.message}`);
120
185
  logger.info(`Config file is at: ${configPath}`);
@@ -100,12 +100,17 @@ export function registerContextCommand(program) {
100
100
  // different window.
101
101
  let recordedModel = "";
102
102
  let recordedProvider = "";
103
+ let recordedContextSources = null;
103
104
  try {
104
- const start = (readEvents(sessionId) || []).find(
105
+ const sessionEvents = readEvents(sessionId) || [];
106
+ const start = sessionEvents.find(
105
107
  (e) => e.type === "session_start",
106
108
  );
107
109
  recordedModel = start?.data?.model || "";
108
110
  recordedProvider = start?.data?.provider || "";
111
+ recordedContextSources = [...sessionEvents]
112
+ .reverse()
113
+ .find((e) => e.type === "context_sources")?.data || null;
109
114
  } catch {
110
115
  // header optional — fall through to flags/defaults
111
116
  }
@@ -129,7 +134,12 @@ export function registerContextCommand(program) {
129
134
  try {
130
135
  const { loadProjectInstructions } =
131
136
  await import("../lib/project-instructions.js");
132
- const { breakdownInstructionSources, rankContextSources } =
137
+ const {
138
+ breakdownInstructionSources,
139
+ breakdownMcpSchemas,
140
+ breakdownSkillSources,
141
+ rankContextSources,
142
+ } =
133
143
  await import("../lib/context-breakdown.js");
134
144
  const cwd = process.cwd();
135
145
  let instructionExcludes;
@@ -151,15 +161,37 @@ export function registerContextCommand(program) {
151
161
  estimateTokens,
152
162
  cwd,
153
163
  );
164
+ const mcp = breakdownMcpSchemas(
165
+ recordedContextSources?.mcp || [],
166
+ estimateTokens,
167
+ );
168
+ const skills = breakdownSkillSources(
169
+ recordedContextSources?.skills || [],
170
+ estimateTokens,
171
+ );
154
172
  const ranked = rankContextSources({
155
173
  instructionTotal: instr.total,
156
174
  buckets,
157
175
  counts,
176
+ extraSources: [
177
+ ...mcp.sources.map((source) => ({
178
+ ...source,
179
+ kind: "mcp_schema",
180
+ })),
181
+ ...skills.sources.map((source) => ({
182
+ ...source,
183
+ kind: "skill",
184
+ })),
185
+ ],
158
186
  });
159
187
  sourceReport = {
160
188
  cwd,
161
189
  instructions: instr.sources,
162
190
  instructionTokens: instr.total,
191
+ mcpSchemas: mcp.sources,
192
+ mcpSchemaTokens: mcp.total,
193
+ skills: skills.sources,
194
+ skillTokens: skills.total,
163
195
  ranked: ranked.sources,
164
196
  combinedTotal: ranked.total,
165
197
  };
@@ -189,6 +221,8 @@ export function registerContextCommand(program) {
189
221
  sources: sourceReport.ranked,
190
222
  instructions: sourceReport.instructions,
191
223
  instructionTokens: sourceReport.instructionTokens,
224
+ mcpSchemas: sourceReport.mcpSchemas,
225
+ mcpSchemaTokens: sourceReport.mcpSchemaTokens,
192
226
  combinedTotal: sourceReport.combinedTotal,
193
227
  cwd: sourceReport.cwd,
194
228
  }
@@ -531,6 +531,12 @@ async function cmdSyncAdapter(name, options) {
531
531
  // sources (wechat-pc), --db-path as an explicit alias for the DB file.
532
532
  if (options.key) opts.key = String(options.key);
533
533
  if (options.dbPath) opts.dbPath = String(options.dbPath);
534
+ // WhatsApp public-backup ADB path. `--key` accepts the crypt15 64-hex
535
+ // root key or a crypt14/encrypted_backup.key file path. Device selection
536
+ // follows --serial, then ADB_SERIAL, then the single connected device.
537
+ if (options.serial) opts.serial = String(options.serial);
538
+ if (options.whatsappBusiness) opts.business = true;
539
+ if (options.remotePath) opts.remotePath = String(options.remotePath);
534
540
  // QQ NT (qq-pc): the SQLCipher passphrase from qq-win-db-key (ASCII, e.g.
535
541
  // "5{sww#,6aq=)8=A@"). Routes qq-pc through the decrypt+parse sidecar.
536
542
  if (options.passphrase) opts.passphrase = String(options.passphrase);
@@ -3013,7 +3019,19 @@ export function registerHubCommand(program) {
3013
3019
  )
3014
3020
  .option(
3015
3021
  "--key <hex>",
3016
- "SQLCipher key (64-hex) for encrypted local DBs (e.g. wechat-pc)",
3022
+ "Encryption key: SQLCipher 64-hex, WhatsApp crypt15 64-hex, or WhatsApp key-file path",
3023
+ )
3024
+ .option(
3025
+ "--serial <adb-serial>",
3026
+ "Android device serial for ADB-backed adapters (otherwise ADB_SERIAL or the single connected device)",
3027
+ )
3028
+ .option(
3029
+ "--whatsapp-business",
3030
+ "Pull the WhatsApp Business public backup instead of the personal app backup",
3031
+ )
3032
+ .option(
3033
+ "--remote-path <android-path>",
3034
+ "Explicit WhatsApp msgstore backup path inside an allowed public Databases directory",
3017
3035
  )
3018
3036
  .option(
3019
3037
  "--passphrase <key>",
@@ -4,8 +4,11 @@
4
4
  */
5
5
 
6
6
  import chalk from "chalk";
7
+ import path from "node:path";
7
8
  import { logger } from "../lib/logger.js";
8
9
  import { bootstrap, shutdown } from "../runtime/bootstrap.js";
10
+ import { parseEditorCommand } from "./config.js";
11
+ import { executionBroker } from "../lib/process-execution-broker/index.js";
9
12
  import {
10
13
  getMemoryDir,
11
14
  addMemory,
@@ -50,6 +53,22 @@ import {
50
53
  getMemoryManagerStatsV2,
51
54
  } from "../lib/memory-manager.js";
52
55
 
56
+ export const _deps = {
57
+ execFileSync: (...args) => executionBroker.execFileSync(...args),
58
+ };
59
+
60
+ export function openMemoryEditor(editor, filePath, deps = _deps) {
61
+ const [file, ...editorArgs] = parseEditorCommand(editor);
62
+ if (!file) throw new Error("EDITOR command is empty");
63
+ return deps.execFileSync(file, [...editorArgs, filePath], {
64
+ stdio: "inherit",
65
+ origin: "memory:editor",
66
+ policy: "allow",
67
+ scope: "memory",
68
+ shell: false,
69
+ });
70
+ }
71
+
53
72
  export function registerMemoryCommand(program) {
54
73
  const memory = program
55
74
  .command("memory")
@@ -596,17 +615,13 @@ export function registerMemoryCommand(program) {
596
615
  const content = getMemoryFile(memoryDir);
597
616
 
598
617
  if (options.edit) {
599
- const { execSync } = await import("child_process");
600
618
  const editor =
601
619
  process.env.EDITOR ||
602
620
  process.env.VISUAL ||
603
621
  (process.platform === "win32" ? "notepad" : "nano");
604
- const filePath = `${memoryDir}/MEMORY.md`;
622
+ const filePath = path.join(memoryDir, "MEMORY.md");
605
623
  try {
606
- // Escape any `"` in the path so it can't break out of the quoted
607
- // arg (editor stays unquoted so `$EDITOR` values with args work).
608
- const safePath = filePath.replace(/"/g, '\\"');
609
- execSync(`${editor} "${safePath}"`, { stdio: "inherit" });
624
+ openMemoryEditor(editor, filePath);
610
625
  logger.success("Memory file updated");
611
626
  } catch {
612
627
  logger.error(