chainlesschain 0.162.108 → 0.162.109

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 (174) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/assets/{AIOps-B8T7xeuV.js → AIOps-DOMx_gkg.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-BDxBsVYw.js → ActionButton-C3V6-KN7.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-5cYrjLzN.js → Analytics-DhcH00zB.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-DkanJ7a5.js → AppLayout-DxaARGVc.js} +4 -4
  6. package/src/assets/web-panel/assets/{Audit-8r3yG5R0.js → Audit-B5v_yPs_.js} +1 -1
  7. package/src/assets/web-panel/assets/{Backup-DmdJpAwc.js → Backup-y0trXy2c.js} +1 -1
  8. package/src/assets/web-panel/assets/{BaseInput-CCTC_ROJ.js → BaseInput-BKmOrsWP.js} +1 -1
  9. package/src/assets/web-panel/assets/{Chat-BE4xBoCH.js → Chat-YxvzoXfA.js} +6 -6
  10. package/src/assets/web-panel/assets/{ChatBubbleRenderer-ita18CO8.js → ChatBubbleRenderer-BT502wFg.js} +1 -1
  11. package/src/assets/web-panel/assets/{Checkbox-DVUDDyL5.js → Checkbox-CWlobcH7.js} +1 -1
  12. package/src/assets/web-panel/assets/{Codegen-C07Q688Z.js → Codegen-DyDnpB9x.js} +1 -1
  13. package/src/assets/web-panel/assets/{Col-Bfmb67bb.js → Col-vSk5m8e6.js} +1 -1
  14. package/src/assets/web-panel/assets/{Community-DvUS6LOy.js → Community-ms1KDyit.js} +1 -1
  15. package/src/assets/web-panel/assets/{Compact-B2jvuCf2.js → Compact-CgOlMunA.js} +1 -1
  16. package/src/assets/web-panel/assets/{Compliance-B4VnGZOX.js → Compliance-BtmnlvkF.js} +1 -1
  17. package/src/assets/web-panel/assets/{Cowork-Bf1UR9uf.js → Cowork-oEgcjamv.js} +4 -4
  18. package/src/assets/web-panel/assets/{Cron-BYU0OhXx.js → Cron-C45dOmbZ.js} +2 -2
  19. package/src/assets/web-panel/assets/{Crosschain-DhtbpJ8Y.js → Crosschain-COCW4N4S.js} +1 -1
  20. package/src/assets/web-panel/assets/{DID-DFtdsXjV.js → DID-D6L3jdjB.js} +2 -2
  21. package/src/assets/web-panel/assets/{Dashboard-BOqMlucS.js → Dashboard-CZO_nWR9.js} +2 -2
  22. package/src/assets/web-panel/assets/{Dropdown-DWcGi1lU.js → Dropdown-BHogrwxg.js} +1 -1
  23. package/src/assets/web-panel/assets/EmailListRenderer-DVU5KA6Y.js +1 -0
  24. package/src/assets/web-panel/assets/{FamilyGuardDashboard-_qKQM8YZ.js → FamilyGuardDashboard-BpJuZRlS.js} +1 -1
  25. package/src/assets/web-panel/assets/{Federation-DxaaO_Pn.js → Federation-C8XUIu9h.js} +1 -1
  26. package/src/assets/web-panel/assets/{FormItemContext-Bijk4-hV.js → FormItemContext-Dkv__07L.js} +1 -1
  27. package/src/assets/web-panel/assets/{GenericCardRenderer-CXs5JGAs.js → GenericCardRenderer-PI4Hv6J7.js} +1 -1
  28. package/src/assets/web-panel/assets/{Git-vopq_XAi.js → Git-DwoiOK7x.js} +2 -2
  29. package/src/assets/web-panel/assets/{Governance-D6lEr1e2.js → Governance-CZMrVnKF.js} +1 -1
  30. package/src/assets/web-panel/assets/{Inference-D716knRp.js → Inference-DGMCR5fY.js} +1 -1
  31. package/src/assets/web-panel/assets/{KnowledgeGraph-Mt7L5B8p.js → KnowledgeGraph-CHnyTP7N.js} +1 -1
  32. package/src/assets/web-panel/assets/{Logs-BmY4Aozy.js → Logs-aHwf1vTL.js} +2 -2
  33. package/src/assets/web-panel/assets/{Marketplace-Bk7yghOV.js → Marketplace-DrrJWlYy.js} +1 -1
  34. package/src/assets/web-panel/assets/{McpTools-BdEGNK8B.js → McpTools-FsvEQItl.js} +5 -5
  35. package/src/assets/web-panel/assets/{Memory-DaGxWezP.js → Memory-BaLEbZZU.js} +2 -2
  36. package/src/assets/web-panel/assets/{MobileBridge-D2QqiIXV.js → MobileBridge-Cbpe-UlH.js} +2 -2
  37. package/src/assets/web-panel/assets/{MobileProjects-JQQ60jth.js → MobileProjects-WpHJ6m0I.js} +1 -1
  38. package/src/assets/web-panel/assets/{Mtc-DHp0q17f.js → Mtc-B2-MRjt7.js} +2 -2
  39. package/src/assets/web-panel/assets/{MtcAudit-RWrCriuc.js → MtcAudit-BPKg4478.js} +2 -2
  40. package/src/assets/web-panel/assets/{Multisig-BR_5j51g.js → Multisig-DL-OMvg9.js} +3 -3
  41. package/src/assets/web-panel/assets/{NLProgramming-MF3ZkPYq.js → NLProgramming-BFbo7QJF.js} +1 -1
  42. package/src/assets/web-panel/assets/{Notes-BDWwfQ-t.js → Notes-DxlawFPj.js} +4 -4
  43. package/src/assets/web-panel/assets/{NotificationSettings-Xk8BtRL5.js → NotificationSettings-mXTgzIC1.js} +1 -1
  44. package/src/assets/web-panel/assets/{OrderTableRenderer-DaVlfAsv.js → OrderTableRenderer-BUcf5CYv.js} +1 -1
  45. package/src/assets/web-panel/assets/{Organization-CNdU6Jxx.js → Organization-FeID8_Wf.js} +4 -4
  46. package/src/assets/web-panel/assets/{Overflow-DOf8iK6T.js → Overflow-DTFS4Vaz.js} +1 -1
  47. package/src/assets/web-panel/assets/{P2P-DvOwefeB.js → P2P-BkylEhA8.js} +2 -2
  48. package/src/assets/web-panel/assets/PdhVaultBrowser-D8bxEEcj.js +7 -0
  49. package/src/assets/web-panel/assets/{Permissions-DM_Cha_-.js → Permissions-BSQ09sRI.js} +4 -4
  50. package/src/assets/web-panel/assets/{PersonalDataHub-DGOiN1md.js → PersonalDataHub-Ba5iRuIi.js} +2 -2
  51. package/src/assets/web-panel/assets/{Pipeline-BMZcrOpC.js → Pipeline-DmL3Gpxg.js} +1 -1
  52. package/src/assets/web-panel/assets/{Privacy-CcBD3ZJ_.js → Privacy-DAvd_DSh.js} +1 -1
  53. package/src/assets/web-panel/assets/{ProjectInit-BQmkVkFp.js → ProjectInit-AxBuFwBR.js} +2 -2
  54. package/src/assets/web-panel/assets/{ProjectSettings-BL0iqE5h.js → ProjectSettings-BZ40fAt5.js} +2 -2
  55. package/src/assets/web-panel/assets/{Projects-7iyoLF6T.js → Projects-BHNbHuBF.js} +1 -1
  56. package/src/assets/web-panel/assets/{Providers-IQqLZ_11.js → Providers-CDkzXPon.js} +1 -1
  57. package/src/assets/web-panel/assets/{QuickAsk-Cp0Lpic1.js → QuickAsk-CzKbOUkP.js} +1 -1
  58. package/src/assets/web-panel/assets/{Recommend-DN-26aef.js → Recommend-D82aHoFt.js} +1 -1
  59. package/src/assets/web-panel/assets/{Reputation-ChdhhVGu.js → Reputation-zpuCi7ft.js} +1 -1
  60. package/src/assets/web-panel/assets/{Row-2RBgBLEz.js → Row-BDq7p96-.js} +1 -1
  61. package/src/assets/web-panel/assets/{RssFeed-CfogWRiS.js → RssFeed-pAo6EJPy.js} +3 -3
  62. package/src/assets/web-panel/assets/{Search-CrREUZpz.js → Search-BXv5RRMM.js} +1 -1
  63. package/src/assets/web-panel/assets/{Security-CcDdV-6d.js → Security-Gn-HnKp5.js} +4 -4
  64. package/src/assets/web-panel/assets/{Services-qG5L2PHE.js → Services-BlfMJ4ZL.js} +2 -2
  65. package/src/assets/web-panel/assets/{Skeleton-7CVgHJwr.js → Skeleton-Q8cKUNTJ.js} +1 -1
  66. package/src/assets/web-panel/assets/{Skills-BEbdNS7s.js → Skills-BjOLODy1.js} +1 -1
  67. package/src/assets/web-panel/assets/{Sla-C4ENvrVM.js → Sla-TbklgbfG.js} +1 -1
  68. package/src/assets/web-panel/assets/{SpeechSettings-DuvM2AsQ.js → SpeechSettings-DzKKyV6J.js} +1 -1
  69. package/src/assets/web-panel/assets/{SyncSettings-Bm9Np5Yt.js → SyncSettings-Bq-76qhL.js} +2 -2
  70. package/src/assets/web-panel/assets/{Tasks-K2ZtJ47C.js → Tasks-DWBUnqic.js} +1 -1
  71. package/src/assets/web-panel/assets/{Templates-C3GJa4ya.js → Templates-CS77urAR.js} +1 -1
  72. package/src/assets/web-panel/assets/{Tenant-BLQnLb8K.js → Tenant-B1hx8tjz.js} +1 -1
  73. package/src/assets/web-panel/assets/Terminal-CNX2SAIP.js +3 -0
  74. package/src/assets/web-panel/assets/{TimelineRenderer-BD8NwNAK.js → TimelineRenderer-CS_iGXXB.js} +1 -1
  75. package/src/assets/web-panel/assets/{Tokens-BIsO2iiX.js → Tokens-CPfe_Ndx.js} +1 -1
  76. package/src/assets/web-panel/assets/{Trigger-FJv5zeym.js → Trigger-DARLZ6w5.js} +1 -1
  77. package/src/assets/web-panel/assets/{Trust-9FRFEAhW.js → Trust-R_mlmd7H.js} +1 -1
  78. package/src/assets/web-panel/assets/{UkeySign-aOdZVwgi.js → UkeySign-CysEd--z.js} +1 -1
  79. package/src/assets/web-panel/assets/{VideoEditing-C1KyY7ZB.js → VideoEditing-eQ46o05K.js} +1 -1
  80. package/src/assets/web-panel/assets/{Wallet-CH5edY0l.js → Wallet-C5788NxS.js} +4 -4
  81. package/src/assets/web-panel/assets/{WebAuthn-BUPlkFe0.js → WebAuthn-CK_CPM4k.js} +5 -5
  82. package/src/assets/web-panel/assets/{WorkflowEditor-BoH8bG7y.js → WorkflowEditor-DhvdLkE6.js} +1 -1
  83. package/src/assets/web-panel/assets/{chat-DRS34SZq.js → chat-CcKQhy1e.js} +1 -1
  84. package/src/assets/web-panel/assets/{colors-DxdhROQh.js → colors-B4d3_MCE.js} +1 -1
  85. package/src/assets/web-panel/assets/{compact-item-C5f4y3lM.js → compact-item-DC-Xf92z.js} +1 -1
  86. package/src/assets/web-panel/assets/{createContext-DkyzEt2y.js → createContext-KBHDmwRY.js} +1 -1
  87. package/src/assets/web-panel/assets/devWarning-Da3Hdd0q.js +1 -0
  88. package/src/assets/web-panel/assets/{hasIn-CIRkRQ69.js → hasIn-DEuYFeVL.js} +1 -1
  89. package/src/assets/web-panel/assets/{index-DgJf60U0.js → index-2Csz0FGD.js} +1 -1
  90. package/src/assets/web-panel/assets/{index-D3WhDg1s.js → index-8BCBAwoA.js} +3 -3
  91. package/src/assets/web-panel/assets/{index-B_ytTrAE.js → index-B4RknAfS.js} +1 -1
  92. package/src/assets/web-panel/assets/{index-CyMVWOwq.js → index-B5cOdkHy.js} +1 -1
  93. package/src/assets/web-panel/assets/{index-X7QcpsDO.js → index-BB9f50Gt.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-DnAbauX-.js → index-BCbc993k.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-BHACYX-h.js → index-BJbBr6_l.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-CSHsX3UZ.js → index-BK8vM7es.js} +1 -1
  97. package/src/assets/web-panel/assets/index-BMeXnsEn.js +1 -0
  98. package/src/assets/web-panel/assets/{index-btOwnCpT.js → index-BZjC0VTy.js} +1 -1
  99. package/src/assets/web-panel/assets/index-BdqPeWvV.js +1 -0
  100. package/src/assets/web-panel/assets/{index-dtUUXiuv.js → index-Bm39r2a4.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BrNCtBLG.js → index-BwD3FKsC.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-BLLkL7YU.js → index-BxlEfskb.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-Cv9YEv3M.js → index-C4Ose5wC.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-DSpV3T2E.js → index-CCnk_-ug.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-BStiYEJX.js → index-CTgs-ddr.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-BfZal2SO.js → index-CdabmsmR.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-fgBegFCK.js → index-ChJ_B7b9.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DpHZisZn.js → index-Cl0As6V5.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-DR_uUG6x.js → index-CxtHBFqA.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-1Vd3bgPH.js → index-Cyb-NAiR.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-Dz-Xl9WT.js → index-DE0-JQay.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-C0VYKzdU.js → index-DQMDCc8g.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-CXE4fjlC.js → index-DQXNz0yD.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CO4PAGWX.js → index-DSXxbnHU.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-2uQYIxL1.js → index-DTudiivg.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-BzC5O6l6.js → index-DZN3yAE2.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-Bc59VV8o.js → index-DhGYNT5Y.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-BdzFfdXs.js → index-DkoDAyug.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DdLAPzIl.js → index-EnBI6ILp.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CLjIL9vZ.js → index-JXP0mbdx.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-Kyd48UEO.js → index-N4xZOl6m.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DtOM1jbe.js → index-Tcf8b4Dr.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-Bskk24yp.js → index-VkeJvcgx.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-B5r9kCHD.js → index-ZbZ9FKyc.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-wdXKonKr.js → index-gOIec6-U.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-5Mph6K8H.js → index-p5OuYAoC.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-DV5W06OY.js → index-tW1RyKbL.js} +1 -1
  128. package/src/assets/web-panel/assets/{initDefaultProps-4uTrrqjb.js → initDefaultProps-BSjGxzmn.js} +1 -1
  129. package/src/assets/web-panel/assets/{motion-gkRvxGHW.js → motion-B5_Cszlm.js} +1 -1
  130. package/src/assets/web-panel/assets/{move-CIgnaWNe.js → move-Zi4ZApRv.js} +1 -1
  131. package/src/assets/web-panel/assets/{omit-DB-Ux8Gg.js → omit-BNHsjZx4.js} +1 -1
  132. package/src/assets/web-panel/assets/{pickAttrs-ree-Itb0.js → pickAttrs-GzJRqTuY.js} +1 -1
  133. package/src/assets/web-panel/assets/{placementArrow-EdAP6bCf.js → placementArrow-CXfzbh2d.js} +1 -1
  134. package/src/assets/web-panel/assets/{responsiveObserve-B1DqSgFh.js → responsiveObserve-lhENMtmd.js} +1 -1
  135. package/src/assets/web-panel/assets/{slide-D_9NP_KE.js → slide-BaUzfEHc.js} +1 -1
  136. package/src/assets/web-panel/assets/{statusUtils-CAytzvoR.js → statusUtils-ZYc611Fn.js} +1 -1
  137. package/src/assets/web-panel/assets/{styleChecker-zb3gob1_.js → styleChecker-CaymUbb1.js} +1 -1
  138. package/src/assets/web-panel/assets/{useFlexGapSupport-BQWuGrL0.js → useFlexGapSupport-9EAy_UPY.js} +1 -1
  139. package/src/assets/web-panel/assets/{useFs-QMEsYkGX.js → useFs-CUqinWaA.js} +1 -1
  140. package/src/assets/web-panel/assets/{usePersonalDataHub-Ccrz7-au.js → usePersonalDataHub-eOXrcae-.js} +1 -1
  141. package/src/assets/web-panel/assets/{vnode-DZVY4QM-.js → vnode-gBQTchDv.js} +1 -1
  142. package/src/assets/web-panel/assets/{zoom-Dii_0V_X.js → zoom-CCC5-LNi.js} +1 -1
  143. package/src/assets/web-panel/index.html +1 -1
  144. package/src/commands/agent.js +6 -0
  145. package/src/commands/hub.js +6 -2
  146. package/src/commands/mcp.js +42 -10
  147. package/src/commands/pdh.js +4 -1
  148. package/src/constants.js +2 -2
  149. package/src/gateways/ws/video-protocol.js +7 -0
  150. package/src/harness/feature-flags.js +19 -6
  151. package/src/harness/prompt-compressor.js +1 -0
  152. package/src/lib/agent-core.js +2 -0
  153. package/src/lib/config-manager.js +42 -1
  154. package/src/lib/git-integration.js +1 -2
  155. package/src/lib/learning/learning-hooks.js +6 -0
  156. package/src/lib/llm-providers.js +2 -0
  157. package/src/lib/mcp-auth-target.js +53 -0
  158. package/src/lib/shell-approval.js +7 -12
  159. package/src/lib/skill-loader.js +6 -2
  160. package/src/lib/suggest-name.js +91 -0
  161. package/src/lib/task-model-selector.js +5 -5
  162. package/src/repl/agent-repl.js +9 -1
  163. package/src/repl/slash-macro.js +7 -1
  164. package/src/runtime/agent-core.js +62 -3
  165. package/src/runtime/coding-agent-contract-shared.cjs +11 -1
  166. package/src/runtime/headless-runner.js +57 -4
  167. package/src/runtime/headless-stream.js +50 -2
  168. package/src/session/index.js +6 -2
  169. package/src/assets/web-panel/assets/EmailListRenderer-smcpeq18.js +0 -1
  170. package/src/assets/web-panel/assets/PdhVaultBrowser-BmrU5B5U.js +0 -7
  171. package/src/assets/web-panel/assets/Terminal-BGgZIwb0.js +0 -3
  172. package/src/assets/web-panel/assets/devWarning-vwZx8E0a.js +0 -1
  173. package/src/assets/web-panel/assets/index-Dhn6EWMQ.js +0 -1
  174. package/src/assets/web-panel/assets/index-dGvDljur.js +0 -1
@@ -250,7 +250,10 @@ export async function runAgentHeadless(options = {}, deps = {}) {
250
250
  );
251
251
  }
252
252
 
253
- const model = options.model || "qwen2.5:7b";
253
+ // `let` (not const): a custom-command macro's `model:` frontmatter may
254
+ // override it below (when the user passed no explicit --model), mirroring
255
+ // `cc command run`.
256
+ let model = options.model || "qwen2.5:7b";
254
257
  const provider = options.provider || "ollama";
255
258
  const baseUrl = options.baseUrl || "http://localhost:11434";
256
259
  const apiKey = options.apiKey || null;
@@ -369,12 +372,60 @@ export async function runAgentHeadless(options = {}, deps = {}) {
369
372
  return { exitCode: isError ? 1 : 0, result: text, isError };
370
373
  }
371
374
 
375
+ // ── Custom slash-command macros (Claude-Code parity: a .claude/commands/*
376
+ // command runs in `-p` mode too, not just the interactive REPL). A leading
377
+ // `/name …` that resolves to a user/project command is expanded into its
378
+ // prompt template ($ARGUMENTS / $1.. + !`bang` + @file) before the turn; an
379
+ // unknown `/...` (or plain text) is left untouched so it reaches the LLM
380
+ // verbatim. expandCommand already runs @file expansion, so the @-ref pass
381
+ // below is skipped when a macro matched. Opt out with options.slashMacros:false.
382
+ let userContent = prompt;
383
+ let slashExpanded = false;
384
+ // A matched command's `allowed-tools:` frontmatter scopes the run (parsed
385
+ // below into enabledToolNames) the same way `cc command run` does.
386
+ let macroAllowedTools = null;
387
+ if (options.slashMacros !== false && prompt.startsWith("/")) {
388
+ try {
389
+ const doMacro =
390
+ deps.resolveSlashMacro ||
391
+ (await import("../repl/slash-macro.js")).resolveSlashMacro;
392
+ const macro = await doMacro(prompt, { cwd });
393
+ if (macro && macro.matched) {
394
+ userContent = macro.promptText;
395
+ slashExpanded = true;
396
+ for (const w of macro.warnings || []) {
397
+ writeErr(` /${macro.name}: ${w}\n`);
398
+ }
399
+ writeErr(` command: /${macro.name} [${macro.scope}]\n`);
400
+ // Frontmatter `model:` / `allowed-tools:` scope the run exactly like
401
+ // `cc command run` — but an explicit --model / --allowed-tools still
402
+ // wins (those arrive as a set options.model / options.allowedTools).
403
+ if (macro.model && !options.model) {
404
+ model = macro.model;
405
+ writeErr(` command: model → ${model}\n`);
406
+ try {
407
+ const { maybeWarnDeprecatedModel } =
408
+ await import("../lib/model-deprecation.js");
409
+ maybeWarnDeprecatedModel({ model });
410
+ } catch {
411
+ // deprecation notice is best-effort
412
+ }
413
+ }
414
+ if (macro.allowedTools && !options.allowedTools) {
415
+ macroAllowedTools = parseToolList(macro.allowedTools);
416
+ }
417
+ }
418
+ } catch {
419
+ // macro resolution is best-effort — fall back to the literal prompt
420
+ }
421
+ }
422
+
372
423
  // ── Expand @file references in the prompt (Claude-Code parity) ─────────
373
424
  // `@path/to/file` tokens are augmented with the referenced file contents (or
374
425
  // a dir listing) so `cc agent -p "review @src/x.js"` works without a manual
375
426
  // cat-pipe. Opt out with `--no-file-refs` (options.expandFileRefs === false).
376
- let userContent = prompt;
377
- if (options.expandFileRefs !== false) {
427
+ // Skipped when a slash macro already expanded (expandCommand ran @refs).
428
+ if (!slashExpanded && options.expandFileRefs !== false) {
378
429
  const doExpand = deps.expandFileRefs || expandFileRefsAsync;
379
430
  const expanded = await doExpand(prompt, { cwd });
380
431
  userContent = expanded.prompt;
@@ -388,7 +439,9 @@ export async function runAgentHeadless(options = {}, deps = {}) {
388
439
  // ── Permission + tool resolution ──────────────────────────────────────
389
440
  const perm = resolvePermissionMode(options.permissionMode);
390
441
  const enabledToolNames = resolveEnabledTools({
391
- allowedTools: options.allowedTools,
442
+ // An explicit --allowed-tools wins; otherwise a matched command's
443
+ // `allowed-tools:` frontmatter scopes the run (null when neither applies).
444
+ allowedTools: options.allowedTools || macroAllowedTools,
392
445
  readOnly: perm.readOnly,
393
446
  });
394
447
  const disabledTools = options.disallowedTools || [];
@@ -31,6 +31,7 @@ import { CostBudget } from "../lib/cost-budget.js";
31
31
  import {
32
32
  resolvePermissionMode,
33
33
  resolveEnabledTools,
34
+ parseToolList,
34
35
  } from "./headless-runner.js";
35
36
  import {
36
37
  startSession as jsonlStartSession,
@@ -1078,9 +1079,49 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
1078
1079
  })
1079
1080
  : new IterationBudget();
1080
1081
 
1081
- // @file expansion per user event (parity with single-turn headless).
1082
+ // Custom slash-command macro expansion per user event (Claude-Code parity:
1083
+ // a /name from .claude/commands runs in panel / stream mode too, not just
1084
+ // the REPL). expandCommand already runs @file expansion, so the @-ref pass
1085
+ // below is skipped when a macro matched. Opt out: options.slashMacros:false.
1082
1086
  let userContent = parsed.text;
1083
- if (options.expandFileRefs !== false) {
1087
+ let slashExpanded = false;
1088
+ // A matched command's `model:` / `allowed-tools:` frontmatter scopes THIS
1089
+ // turn's loopOptions below (parity with `cc command run` / headless -p).
1090
+ let turnMacroModel = null;
1091
+ let turnMacroTools = null;
1092
+ if (
1093
+ options.slashMacros !== false &&
1094
+ typeof parsed.text === "string" &&
1095
+ parsed.text.startsWith("/")
1096
+ ) {
1097
+ try {
1098
+ const doMacro =
1099
+ deps.resolveSlashMacro ||
1100
+ (await import("../repl/slash-macro.js")).resolveSlashMacro;
1101
+ const macro = await doMacro(parsed.text, { cwd });
1102
+ if (macro && macro.matched) {
1103
+ userContent = macro.promptText;
1104
+ slashExpanded = true;
1105
+ for (const w of macro.warnings || []) {
1106
+ writeErr(` /${macro.name}: ${w}\n`);
1107
+ }
1108
+ writeErr(` command: /${macro.name} [${macro.scope}]\n`);
1109
+ if (macro.model) {
1110
+ turnMacroModel = macro.model;
1111
+ writeErr(` command: model → ${turnMacroModel}\n`);
1112
+ }
1113
+ if (macro.allowedTools) {
1114
+ turnMacroTools = parseToolList(macro.allowedTools);
1115
+ }
1116
+ }
1117
+ } catch {
1118
+ // macro resolution is best-effort — fall back to the literal text
1119
+ }
1120
+ }
1121
+
1122
+ // @file expansion per user event (parity with single-turn headless).
1123
+ // Skipped when a slash macro already expanded (expandCommand ran @refs).
1124
+ if (!slashExpanded && options.expandFileRefs !== false) {
1084
1125
  const expanded = await doExpand(parsed.text, { cwd });
1085
1126
  userContent = expanded.prompt;
1086
1127
  for (const w of expanded.warnings) writeErr(` @ref: ${w}\n`);
@@ -1214,6 +1255,13 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
1214
1255
  messages,
1215
1256
  {
1216
1257
  ...loopOptionsBase,
1258
+ // Custom-command frontmatter scopes THIS turn (parity with `cc command
1259
+ // run` / headless -p): a matched /name applies its model: and
1260
+ // allowed-tools:. Lowest-priority override — an explicit per-turn
1261
+ // privacy (turnLlmOverride) or vision (turnVisionLlm) switch below
1262
+ // still wins on model.
1263
+ ...(turnMacroModel ? { model: turnMacroModel } : {}),
1264
+ ...(turnMacroTools ? { enabledToolNames: turnMacroTools } : {}),
1217
1265
  // §3.5.10 接线6: explicit per-turn LLM override (privacy-tier switch);
1218
1266
  // only the fields provided are overridden (e.g. provider+model+baseUrl
1219
1267
  // to route to your own PC Ollama for one turn).
@@ -2,6 +2,10 @@
2
2
  * CLI session module — thin re-export of @chainlesschain/session-core
3
3
  *
4
4
  * Managed Agents parity Phase A+B.
5
- * Consume via: require("../session") inside packages/cli/src/.
5
+ * Consume via: import { ... } from "../session/index.js" inside packages/cli/src/.
6
+ *
7
+ * NOTE: packages/cli is ESM ("type": "module"). The previous
8
+ * `module.exports = require(...)` form silently broke here (module/require are
9
+ * undefined in ESM); use an ESM re-export.
6
10
  */
7
- module.exports = require("@chainlesschain/session-core");
11
+ export * from "@chainlesschain/session-core";
@@ -1 +0,0 @@
1
- import{I as C,P as c,J as f,U as r,c as g,_ as k,R as n,V as l,K as d,Q as u,S as h,b as t}from"./vendor-BvqAck49.js";import{_ as j}from"./index-D3WhDg1s.js";import{aG as w}from"./icons-DP3uiYxy.js";const V={__name:"EmailListRenderer",props:{event:{type:Object,required:!0}},setup(_,{expose:m}){m();const a=_,e=t(()=>a.event.content||{}),i=t(()=>a.event.extra||{}),p=t(()=>e.value.from||e.value.sender||e.value.fromName||a.event.actor||"(未知发件人)"),s=t(()=>e.value.subject||e.value.title||"(无主题)"),y=t(()=>e.value.snippet||e.value.preview||e.value.body?.slice(0,100)||null),b=t(()=>Array.isArray(e.value.attachments)?e.value.attachments.length:typeof e.value.attachmentCount=="number"?e.value.attachmentCount:0),x=t(()=>i.value.category||e.value.category),S=t(()=>e.value.unread===!0),T=t(()=>{if(!a.event.occurredAt)return"";const o=new Date(a.event.occurredAt);return`${o.getFullYear()}-${String(o.getMonth()+1).padStart(2,"0")}-${String(o.getDate()).padStart(2,"0")} ${String(o.getHours()).padStart(2,"0")}:${String(o.getMinutes()).padStart(2,"0")}`}),v={props:a,c:e,e:i,fromText:p,subjectText:s,snippetText:y,attachmentCount:b,category:x,isUnread:S,formattedTime:T,computed:t,get MailOutlined(){return w}};return Object.defineProperty(v,"__isScriptSetup",{enumerable:!1,value:!0}),v}},M={class:"email-row"},N={class:"left"},O={class:"body"},A={class:"head"},B={class:"from"},E={class:"time"},R={class:"subject"},D={key:0,class:"snippet"},L={class:"meta"};function U(_,m,a,e,i,p){const s=C("a-tag");return c(),f("div",M,[r("div",N,[g(e.MailOutlined,{class:k(["icon",{unread:e.isUnread}])},null,8,["class"])]),r("div",O,[r("div",A,[r("span",B,n(e.fromText),1),r("span",E,n(e.formattedTime),1)]),r("div",R,n(e.subjectText),1),e.snippetText?(c(),f("div",D,n(e.snippetText),1)):l("v-if",!0),r("div",L,[g(s,{color:"blue",class:"src"},{default:d(()=>[u(n(a.event.source.adapter),1)]),_:1}),e.attachmentCount>0?(c(),h(s,{key:0,color:"orange"},{default:d(()=>[u(" 📎 "+n(e.attachmentCount),1)]),_:1})):l("v-if",!0),e.category?(c(),h(s,{key:1},{default:d(()=>[u(n(e.category),1)]),_:1})):l("v-if",!0)])])])}const P=j(V,[["render",U],["__scopeId","data-v-e4ddf632"],["__file","/tmp/cc-web-panel-SVKg9z/repo/packages/web-panel/src/components/pdh/renderers/EmailListRenderer.vue"]]);export{P as default};
@@ -1,7 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./ChatBubbleRenderer-ita18CO8.js","./vendor-BvqAck49.js","./index-D3WhDg1s.js","./icons-DP3uiYxy.js","./index-Cq93VfoF.css","./ChatBubbleRenderer-gy5SDGw2.css","./OrderTableRenderer-DaVlfAsv.js","./OrderTableRenderer-CfrDjSHT.css","./TimelineRenderer-BD8NwNAK.js","./TimelineRenderer-BlTAtkOc.css","./EmailListRenderer-smcpeq18.js","./EmailListRenderer-DTPZPx_S.css","./GenericCardRenderer-CXs5JGAs.js","./GenericCardRenderer-o85VDYQS.css"])))=>i.map(i=>d[i]);
2
- import{E as ue,r as R,b as w,I as y,P as u,J as O,U as v,c,S as C,V as E,_ as M,F as B,Z as se,a0 as le,R as x,K as m,Q as b,W as L,o as z}from"./vendor-BvqAck49.js";import{u as J}from"./usePersonalDataHub-Ccrz7-au.js";import{_ as D,e as F,d as P}from"./index-D3WhDg1s.js";import{a9 as V,af as U,M as K,aH as Q,u as G,aG as H,ap as W,ab as Y,e as de,d as fe,k as pe,ah as me,az as _e,R as ge}from"./icons-DP3uiYxy.js";const I=Object.freeze({q:"",category:null,adapter:null,subtype:null,since:null,until:null}),q=50,Z=300,X=ue("pdhBrowser",()=>{const r=R({...I}),t=R([]),n=R(null),e=R(!1),o=R(!1),l=R(null),a=R(null),s=R(!1),i=R({byCategory:{},byAdapter:{},bySubtype:{},total:0});let d=0,_=null;const j=w(()=>t.value.length>0),A=w(()=>n.value!=null);function h(S={}){const p={},f=r.value;return f.q&&f.q.trim()&&(p.q=f.q.trim()),f.category&&(p.category=f.category),f.adapter&&(p.adapter=f.adapter),f.subtype&&(p.subtype=f.subtype),Number.isFinite(f.since)&&(p.since=f.since),Number.isFinite(f.until)&&(p.until=f.until),{...p,...S}}async function g(){const S=++d;e.value=!0,l.value=null;const p=J();try{const[f,T]=await Promise.all([p.searchEvents(h({limit:q})),p.facetCounts({...r.value.q&&r.value.q.trim()?{q:r.value.q.trim()}:{},...Number.isFinite(r.value.since)?{since:r.value.since}:{},...Number.isFinite(r.value.until)?{until:r.value.until}:{}})]);if(S!==d)return;t.value=f.rows||[],n.value=f.nextCursor||null,a.value=f.mode||"like",s.value=!!f.shortQuery,i.value={byCategory:T.byCategory||{},byAdapter:T.byAdapter||{},bySubtype:T.bySubtype||{},total:T.total||0}}catch(f){if(S!==d)return;l.value=f&&f.message?f.message:String(f),t.value=[],n.value=null}finally{S===d&&(e.value=!1)}}async function k(){if(!n.value||o.value)return;o.value=!0,l.value=null;const S=J();try{const p=await S.searchEvents(h({cursor:n.value,limit:q}));t.value=t.value.concat(p.rows||[]),n.value=p.nextCursor||null,a.value=p.mode||a.value}catch(p){l.value=p&&p.message?p.message:String(p)}finally{o.value=!1}}function ae(S,p){if(!(S in I))throw new Error(`pdhBrowser.setFilter: unknown key "${S}"`);r.value={...r.value,[S]:p},_&&clearTimeout(_),_=setTimeout(()=>{_=null,g()},Z)}function ie(S){return r.value={...I,...S},_&&(clearTimeout(_),_=null),g()}function ce(){r.value={...I},t.value=[],n.value=null,l.value=null,i.value={byCategory:{},byAdapter:{},bySubtype:{},total:0}}return{filters:r,results:t,cursor:n,isLoading:e,isAppending:o,error:l,mode:a,shortQuery:s,facets:i,hasResults:j,canLoadMore:A,search:g,loadMore:k,setFilter:ae,setFilters:ie,reset:ce,PAGE_SIZE:q,SEARCH_DEBOUNCE_MS:Z}}),ye=Object.freeze(["chat","social","email","shopping","travel","system","ai-chat","other"]),ve=Object.freeze({chat:"社交聊天",social:"内容平台",email:"邮件",shopping:"支付订单",travel:"出行",system:"系统数据","ai-chat":"AI 对话",other:"其他"});function N(r){return ve[r]||r||"未知"}const be=Object.freeze([["wechat","chat"],["messaging-","chat"],["social-","social"],["email-","email"],["shopping-","shopping"],["alipay-","shopping"],["travel-","travel"],["system-data","system"],["browser-","system"],["vscode","system"],["win-recent","system"],["git-activity","system"],["shell-history","system"],["local-files","system"],["ai-chat-","ai-chat"]]);function $(r){if(typeof r!="string"||r.length===0)return"other";for(const[t,n]of be)if(t.endsWith("-")||t==="system-data"){if(r.startsWith(t))return n}else if(r===t)return n;return"other"}const he={__name:"CategorySidebar",props:{selected:{type:String,default:null},facets:{type:Object,default:()=>({byCategory:{},total:0})}},emits:["select"],setup(r,{expose:t}){t();const n=r,e=w(()=>n.facets.total||0),o={chat:Y,social:W,email:H,shopping:G,travel:Q,system:K,"ai-chat":U,other:V};function l(i){return o[i]||V}function a(i){return i?{backgroundColor:"#fff",color:"#1677ff"}:{backgroundColor:"#f0f0f0",color:"#666"}}const s={props:n,total:e,ICONS:o,iconFor:l,badgeStyle:a,computed:w,get AppstoreOutlined(){return V},get MessageOutlined(){return Y},get PlayCircleOutlined(){return W},get MailOutlined(){return H},get ShoppingOutlined(){return G},get CarOutlined(){return Q},get MobileOutlined(){return K},get RobotOutlined(){return U},get CATEGORIES(){return ye},get categoryLabel(){return N}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}},Se={class:"pdh-sidebar"},Oe=["onClick"],we={class:"label"};function Ce(r,t,n,e,o,l){const a=y("a-badge");return u(),O("div",Se,[t[2]||(t[2]=v("div",{class:"sidebar-title"},"数据类型",-1)),v("div",{class:M(["cat-item",{active:n.selected===null}]),onClick:t[0]||(t[0]=s=>r.$emit("select",null))},[c(e.AppstoreOutlined,{class:"icon"}),t[1]||(t[1]=v("span",{class:"label"},"全部",-1)),e.total>0?(u(),C(a,{key:0,count:e.total,"number-style":e.badgeStyle(n.selected===null),"overflow-count":9999},null,8,["count","number-style"])):E("v-if",!0)],2),(u(!0),O(B,null,se(e.CATEGORIES,s=>(u(),O("div",{key:s,class:M(["cat-item",{active:n.selected===s,dim:!n.facets.byCategory[s]}]),onClick:i=>r.$emit("select",s)},[(u(),C(le(e.iconFor(s)),{class:"icon"})),v("span",we,x(e.categoryLabel(s)),1),n.facets.byCategory[s]?(u(),C(a,{key:0,count:n.facets.byCategory[s],"number-style":e.badgeStyle(n.selected===s),"overflow-count":9999},null,8,["count","number-style"])):E("v-if",!0)],10,Oe))),128))])}const ke=D(he,[["render",Ce],["__scopeId","data-v-6b62a22e"],["__file","/tmp/cc-web-panel-SVKg9z/repo/packages/web-panel/src/components/pdh/CategorySidebar.vue"]]),Ee={__name:"SearchFilterBar",props:{filters:{type:Object,required:!0},facets:{type:Object,default:()=>({byAdapter:{}})},isLoading:{type:Boolean,default:!1},mode:{type:String,default:null},shortQuery:{type:Boolean,default:!1}},emits:["set-filter","reset"],setup(r,{expose:t,emit:n}){t();const e=r,o=n,l=w(()=>e.filters.category?`在「${e.filters.category}」类目内搜索…`:"搜索关键词(如:支付宝、罗技、Kotlin)…"),a=w(()=>Object.entries(e.facets.byAdapter||{}).sort((g,k)=>k[1]-g[1]).map(([g,k])=>({value:g,label:`${g} (${k})`}))),s=w(()=>!e.filters.since&&!e.filters.until?null:[e.filters.since?new Date(e.filters.since):null,e.filters.until?new Date(e.filters.until):null]),i=w(()=>!!(e.filters.q||e.filters.adapter||e.filters.subtype||e.filters.since||e.filters.until));function d(h){o("set-filter","q",h||"")}function _(h){o("set-filter","q",h||"")}function j(h){if(!h||h.length===0){o("set-filter","since",null),o("set-filter","until",null);return}const[g,k]=h;o("set-filter","since",g?+g:null),o("set-filter","until",k?+k:null)}const A={props:e,emit:o,placeholderText:l,adapterOptions:a,dateRangeValue:s,hasActiveFilters:i,onQInput:d,onSearch:_,onDateChange:j,computed:w,get SearchOutlined(){return pe},get CloseCircleOutlined(){return fe},get InfoCircleOutlined(){return de}};return Object.defineProperty(A,"__isScriptSetup",{enumerable:!1,value:!0}),A}},Re={class:"pdh-filter-bar"},xe={key:1,class:"hint"},je={key:2,class:"hint"};function Ae(r,t,n,e,o,l){const a=y("a-input-search"),s=y("a-select"),i=y("a-range-picker"),d=y("a-button");return u(),O("div",Re,[c(a,{value:n.filters.q,placeholder:e.placeholderText,"enter-button":"搜索","allow-clear":"",loading:n.isLoading,style:{flex:"1","max-width":"480px"},"onUpdate:value":e.onQInput,onSearch:e.onSearch},{prefix:m(()=>[c(e.SearchOutlined)]),_:1},8,["value","placeholder","loading"]),c(s,{value:n.filters.adapter,placeholder:"所有 adapter","allow-clear":"",options:e.adapterOptions,style:{width:"200px"},"onUpdate:value":t[0]||(t[0]=_=>r.$emit("set-filter","adapter",_||null))},null,8,["value","options"]),c(i,{value:e.dateRangeValue,placeholder:["开始日期","结束日期"],style:{width:"280px"},"onUpdate:value":e.onDateChange},null,8,["value"]),e.hasActiveFilters?(u(),C(d,{key:0,type:"link",danger:"",onClick:t[1]||(t[1]=_=>r.$emit("reset"))},{icon:m(()=>[c(e.CloseCircleOutlined)]),default:m(()=>[t[2]||(t[2]=b(" 清空筛选 ",-1))]),_:1})):E("v-if",!0),n.shortQuery?(u(),O("span",xe,[c(e.InfoCircleOutlined),t[3]||(t[3]=b(" 关键词需至少 3 字 (FTS5 trigram 限制) ",-1))])):n.mode==="like"?(u(),O("span",je,[c(e.InfoCircleOutlined),t[4]||(t[4]=b(" 当前为 LIKE 兜底模式 ",-1))])):E("v-if",!0)])}const Le=D(Ee,[["render",Ae],["__scopeId","data-v-d7cce6e9"],["__file","/tmp/cc-web-panel-SVKg9z/repo/packages/web-panel/src/components/pdh/SearchFilterBar.vue"]]),Fe={__name:"RendererDispatcher",props:{event:{type:Object,required:!0}},setup(r,{expose:t}){t();const n=L(()=>F(()=>import("./ChatBubbleRenderer-ita18CO8.js"),__vite__mapDeps([0,1,2,3,4,5]),import.meta.url)),e=L(()=>F(()=>import("./OrderTableRenderer-DaVlfAsv.js"),__vite__mapDeps([6,1,2,3,4,7]),import.meta.url)),o=L(()=>F(()=>import("./TimelineRenderer-BD8NwNAK.js"),__vite__mapDeps([8,1,2,3,4,9]),import.meta.url)),l=L(()=>F(()=>import("./EmailListRenderer-smcpeq18.js"),__vite__mapDeps([10,1,2,3,4,11]),import.meta.url)),a=L(()=>F(()=>import("./GenericCardRenderer-CXs5JGAs.js"),__vite__mapDeps([12,1,2,3,4,13]),import.meta.url));function s(d){const _=d&&d.source&&d.source.adapter;switch($(_)){case"chat":case"ai-chat":return n;case"shopping":return e;case"travel":return o;case"email":return l;default:return a}}const i={ChatBubbleRenderer:n,OrderTableRenderer:e,TimelineRenderer:o,EmailListRenderer:l,GenericCardRenderer:a,rendererFor:s,defineAsyncComponent:L,get getCategory(){return $}};return Object.defineProperty(i,"__isScriptSetup",{enumerable:!1,value:!0}),i}};function De(r,t,n,e,o,l){return u(),C(le(e.rendererFor(n.event)),{event:n.event},null,8,["event"])}const Te=D(Fe,[["render",De],["__file","/tmp/cc-web-panel-SVKg9z/repo/packages/web-panel/src/components/pdh/renderers/RendererDispatcher.vue"]]);function ee(r){return JSON.stringify(r,null,2)}function te(r){return r.map(t=>JSON.stringify(t)).join(`
3
- `)+`
4
- `}function ne(r){const n=["id","subtype","occurredAt","occurredAtIso","actor","place","adapter","summary","contentJson","extraJson"].join(","),e=r.map(o=>{const l=Number.isFinite(o.occurredAt)?o.occurredAt:null,a=l?new Date(l).toISOString():"",s=o.source&&o.source.adapter||"",i=o.content&&(o.content.text||o.content.title||o.content.subject)||"";return[o.id||"",o.subtype||"",l!=null?String(l):"",a,o.actor||"",o.place||"",s,i,o.content?JSON.stringify(o.content):"",o.extra?JSON.stringify(o.extra):""].map(Ie).join(",")});return[n,...e].join(`
5
- `)+`
6
- `}function Ie(r){const t=String(r??"");return t.includes(",")||t.includes('"')||t.includes(`
7
- `)||t.includes("\r")?'"'+t.replace(/"/g,'""')+'"':t}function re(r,t,n="application/octet-stream"){if(typeof window>"u"||typeof document>"u")return t;const e=new Blob([r],{type:n}),o=URL.createObjectURL(e),l=document.createElement("a");return l.href=o,l.download=t,document.body.appendChild(l),l.click(),document.body.removeChild(l),setTimeout(()=>URL.revokeObjectURL(o),1e3),t}function oe(r,t=null){const n=new Date,e=n.getFullYear(),o=String(n.getMonth()+1).padStart(2,"0"),l=String(n.getDate()).padStart(2,"0"),a=r==="ndjson"?"ndjson":r,s=t?`-${t}`:"";return`pdh-events-${e}-${o}-${l}${s}.${a}`}const Pe={__name:"ExportDropdown",props:{events:{type:Array,required:!0},category:{type:String,default:null}},setup(r,{expose:t}){t();const n=r,e=w(()=>n.events.length>0),o={json:"application/json;charset=utf-8",ndjson:"application/x-ndjson;charset=utf-8",csv:"text/csv;charset=utf-8"};function l(i){switch(i){case"json":return ee(n.events);case"ndjson":return te(n.events);case"csv":return ne(n.events);default:throw new Error(`unknown format: ${i}`)}}function a({key:i}){try{const d=l(i),_=oe(i,n.category);re(d,_,o[i]),P.success(`已导出 ${n.events.length} 条到 ${_}`)}catch(d){P.error(`导出失败: ${d.message||d}`)}}const s={props:n,hasResults:e,MIME:o,serialize:l,onClick:a,computed:w,get DownloadOutlined(){return _e},get DownOutlined(){return me},get message(){return P},get eventsToJson(){return ee},get eventsToNdjson(){return te},get eventsToCsv(){return ne},get downloadAs(){return re},get suggestFilename(){return oe}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}};function Ve(r,t,n,e,o,l){const a=y("a-button"),s=y("a-menu-item"),i=y("a-menu"),d=y("a-dropdown");return u(),C(d,{disabled:!e.hasResults},{overlay:m(()=>[c(i,{onClick:e.onClick},{default:m(()=>[c(s,{key:"json"},{default:m(()=>[...t[0]||(t[0]=[b("JSON (.json)",-1)])]),_:1}),c(s,{key:"ndjson"},{default:m(()=>[...t[1]||(t[1]=[b("NDJSON (.ndjson)",-1)])]),_:1}),c(s,{key:"csv"},{default:m(()=>[...t[2]||(t[2]=[b("CSV (.csv)",-1)])]),_:1})]),_:1})]),default:m(()=>[c(a,{disabled:!e.hasResults},{icon:m(()=>[c(e.DownloadOutlined)]),default:m(()=>[b(" 导出 ("+x(n.events.length)+") ",1),c(e.DownOutlined)]),_:1},8,["disabled"])]),_:1},8,["disabled"])}const qe=D(Pe,[["render",Ve],["__file","/tmp/cc-web-panel-SVKg9z/repo/packages/web-panel/src/components/pdh/ExportDropdown.vue"]]),Be={__name:"PdhVaultBrowser",setup(r,{expose:t}){t();const n=X(),e=w(()=>n.filters.q?`没有匹配 "${n.filters.q}" 的事件 — 试试更短的关键词或换个类目`:n.filters.category?`「${N(n.filters.category)}」类目下还没有数据 — 去采集页同步对应 adapter`:"Vault 里还没有数据 — 去「个人数据中台」页面同步任意 adapter");function o(s){n.filters.category=s,n.search()}function l(s,i){n.setFilter(s,i)}z(()=>{!n.hasResults&&!n.isLoading&&n.search()});const a={store:n,emptyHint:e,onCategorySelect:o,onSetFilter:l,onMounted:z,computed:w,get ReloadOutlined(){return ge},get usePdhBrowserStore(){return X},get categoryLabel(){return N},CategorySidebar:ke,SearchFilterBar:Le,RendererDispatcher:Te,ExportDropdown:qe};return Object.defineProperty(a,"__isScriptSetup",{enumerable:!1,value:!0}),a}},Ne={class:"pdh-browser-page"},Me={class:"page-header"},ze={class:"main-pane"},Je={class:"results-summary"},Ue={key:0},Ke={key:0},Qe={key:1},Ge={class:"loaded-of"},He={class:"results-list"},We={key:2,class:"load-more"};function Ye(r,t,n,e,o,l){const a=y("a-tag"),s=y("a-button"),i=y("a-space"),d=y("a-col"),_=y("a-spin"),j=y("a-alert"),A=y("a-empty"),h=y("a-row");return u(),O("div",Ne,[v("div",Me,[t[6]||(t[6]=v("div",null,[v("h2",{class:"page-title"},"数据浏览器"),v("p",{class:"page-sub"}," Vault 里所有已采集的数据,按类目浏览 / 全文检索 / 时间窗口筛选。 完全离线,不外传。 ")],-1)),c(i,null,{default:m(()=>[e.store.mode==="fts5"?(u(),C(a,{key:0,color:"green"},{default:m(()=>[...t[3]||(t[3]=[b("FTS5 trigram",-1)])]),_:1})):e.store.mode==="like"?(u(),C(a,{key:1,color:"orange"},{default:m(()=>[...t[4]||(t[4]=[b("LIKE 兜底",-1)])]),_:1})):E("v-if",!0),c(e.ExportDropdown,{events:e.store.results,category:e.store.filters.category},null,8,["events","category"]),c(s,{onClick:t[0]||(t[0]=g=>e.store.search()),loading:e.store.isLoading},{icon:m(()=>[c(e.ReloadOutlined)]),default:m(()=>[t[5]||(t[5]=b(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),c(h,{gutter:16,class:"browser-layout"},{default:m(()=>[c(d,{xs:24,sm:24,md:6,lg:5,xl:4},{default:m(()=>[c(e.CategorySidebar,{selected:e.store.filters.category,facets:e.store.facets,onSelect:e.onCategorySelect},null,8,["selected","facets"])]),_:1}),c(d,{xs:24,sm:24,md:18,lg:19,xl:20},{default:m(()=>[v("div",ze,[c(e.SearchFilterBar,{filters:e.store.filters,facets:e.store.facets,"is-loading":e.store.isLoading,mode:e.store.mode,"short-query":e.store.shortQuery,onSetFilter:e.onSetFilter,onReset:t[1]||(t[1]=g=>{e.store.reset(),e.store.search()})},null,8,["filters","facets","is-loading","mode","short-query"]),v("div",Je,[e.store.isLoading&&e.store.results.length===0?(u(),O("span",Ue,[c(_,{size:"small"}),t[7]||(t[7]=b(" 载入中… ",-1))])):(u(),O(B,{key:1},[v("strong",null,x(e.store.facets.total),1),t[11]||(t[11]=b(" 条事件 ",-1)),e.store.filters.category?(u(),O("span",Ke,[t[8]||(t[8]=b(" / 当前类目 ",-1)),v("strong",null,x(e.categoryLabel(e.store.filters.category)),1),v("strong",null,x(e.store.facets.byCategory[e.store.filters.category]||0),1)])):E("v-if",!0),e.store.filters.q?(u(),O("span",Qe,[t[9]||(t[9]=b(' / 关键词 "',-1)),v("em",null,x(e.store.filters.q),1),t[10]||(t[10]=b('"',-1))])):E("v-if",!0),v("span",Ge," / 已显示 "+x(e.store.results.length),1)],64))]),e.store.error?(u(),C(j,{key:0,type:"error","show-icon":"",message:e.store.error,closable:"",style:{margin:"12px 0"}},null,8,["message"])):E("v-if",!0),!e.store.isLoading&&e.store.results.length===0&&!e.store.error?(u(),C(A,{key:1,description:e.emptyHint,style:{"margin-top":"40px"}},null,8,["description"])):E("v-if",!0),v("div",He,[(u(!0),O(B,null,se(e.store.results,(g,k)=>(u(),C(e.RendererDispatcher,{key:`r-${k}-${g.id}`,event:g},null,8,["event"]))),128))]),e.store.canLoadMore?(u(),O("div",We,[c(s,{loading:e.store.isAppending,onClick:t[2]||(t[2]=g=>e.store.loadMore()),block:""},{default:m(()=>[...t[12]||(t[12]=[b(" 加载下一页 (50 条) ",-1)])]),_:1},8,["loading"])])):E("v-if",!0)])]),_:1})]),_:1})])}const tt=D(Be,[["render",Ye],["__scopeId","data-v-0f7c02cd"],["__file","/tmp/cc-web-panel-SVKg9z/repo/packages/web-panel/src/views/PdhVaultBrowser.vue"]]);export{tt as default};
@@ -1,3 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./xterm-BZcWGsqw.js","./markdown-CsiA8-E5.js","./markdown-Dfs9RUU9.css","./addon-fit-CK6X9sAG.js","./xterm-DFuMZ0ql.css"])))=>i.map(i=>d[i]);
2
- import{u as fe,_ as me,d as V,e as U}from"./index-D3WhDg1s.js";import{I as z,J as x,U as _,Q as D,S as Q,K as T,V as R,c as A,F as Y,Z,R as E,o as G,f as H,w as $,n as q,b as ee,r as S,P as y,_ as ve,a2 as we,a3 as he,a4 as _e}from"./vendor-BvqAck49.js";import{R as ye,b as pe,as as ge}from"./icons-DP3uiYxy.js";const k=new Map,C=new Map,N=new Set,F=new Set;let te=!1;function xe(c){te||(te=!0,c.onMessage(o=>{if(!(!o||typeof o.type!="string")){if(o.type==="terminal.stdout"){const{sessionId:s,data:e,seq:i}=o.payload||{};if(!s)return;let w;try{const d=atob(e||""),f=new Uint8Array(d.length);for(let n=0;n<d.length;n++)f[n]=d.charCodeAt(n);w=new TextDecoder("utf-8").decode(f)}catch{w=""}const u={sessionId:s,data:w,seq:i};k.get(s)?.forEach(d=>d(u)),N.forEach(d=>d(u))}else if(o.type==="terminal.exit"){const{sessionId:s,exitCode:e,signal:i}=o.payload||{};if(!s)return;const w={sessionId:s,exitCode:e,signal:i};C.get(s)?.forEach(u=>u(w)),F.forEach(u=>u(w))}}}))}function ne(c){const o=new TextEncoder().encode(c);let s="";for(let e=0;e<o.length;e++)s+=String.fromCharCode(o[e]);return btoa(s)}function ae(c){const o=atob(c||""),s=new Uint8Array(o.length);for(let e=0;e<o.length;e++)s[e]=o.charCodeAt(e);return new TextDecoder("utf-8").decode(s)}function oe(){const c=fe();xe(c);async function o(n={}){const a=await c.sendRaw({type:"terminal.create",payload:{shell:n.shell,cwd:n.cwd,env:n.env,cols:n.cols,rows:n.rows}});if(a.ok===!1)throw new Error(a.error||"terminal_create_failed");return a.result??a}async function s(){const n=await c.sendRaw({type:"terminal.list",payload:{}});if(n.ok===!1)throw new Error(n.error||"terminal_list_failed");const a=n.result??n;return Array.isArray(a.sessions)?a.sessions:[]}async function e(n,a){const r=await c.sendRaw({type:"terminal.stdin",payload:{sessionId:n,data:ne(String(a))}});if(r.ok===!1)throw new Error(r.error||"terminal_stdin_failed");return r.result??r}async function i(n,a,r){const h=await c.sendRaw({type:"terminal.resize",payload:{sessionId:n,cols:a,rows:r}});if(h.ok===!1)throw new Error(h.error||"terminal_resize_failed");return h.result??h}async function w(n){const a=await c.sendRaw({type:"terminal.close",payload:{sessionId:n}});if(a.ok===!1)throw new Error(a.error||"terminal_close_failed");return a.result??a}async function u(n,a=0){const r=await c.sendRaw({type:"terminal.history",payload:{sessionId:n,fromSeq:a}});if(r.ok===!1)throw new Error(r.error||"terminal_history_failed");const h=r.result??r;return{truncated:!!h.truncated,chunks:(h.chunks||[]).map(L=>({seq:L.seq,data:ae(L.data)}))}}function d(n,a){return n?(k.has(n)||k.set(n,new Set),k.get(n).add(a),()=>{k.get(n)?.delete(a),k.get(n)?.size===0&&k.delete(n)}):(N.add(a),()=>N.delete(a))}function f(n,a){return n?(C.has(n)||C.set(n,new Set),C.get(n).add(a),()=>{C.get(n)?.delete(a),C.get(n)?.size===0&&C.delete(n)}):(F.add(a),()=>F.delete(a))}return{create:o,list:s,stdin:e,resize:i,close:w,history:u,onStdout:d,onExit:f,_internal:{stdoutSubs:k,exitSubs:C,toBase64Utf8:ne,fromBase64Utf8:ae}}}const Se={__name:"Terminal",setup(c,{expose:o}){o();const s=oe(),e=S([]),i=S(null),w=S("pwsh"),u=S(!1),d=S(!1),f=S(""),n=S(""),a=S([]),r=[{value:"pwsh",label:"PowerShell"},{value:"cmd",label:"CMD"},{value:"bash",label:"Bash"},{value:"wsl",label:"WSL"}],h=ee(()=>e.value.find(t=>t.id===i.value));function L(t){return t?t.slice(0,8):""}let O=null,M=null;async function I(){if(O)return{xtermMod:O,fitAddonMod:M};try{O=await U(()=>import("./xterm-BZcWGsqw.js").then(t=>t.x),__vite__mapDeps([0,1,2]),import.meta.url),M=await U(()=>import("./addon-fit-CK6X9sAG.js").then(t=>t.a),__vite__mapDeps([3,1,2]),import.meta.url),await U(()=>Promise.resolve({}),__vite__mapDeps([4]),import.meta.url)}catch(t){throw n.value="xterm 资源加载失败:"+(t?.message||"未知错误"),t}return{xtermMod:O,fitAddonMod:M}}async function B(t){await q();const{xtermMod:l,fitAddonMod:p}=await I(),b=a.value.find(v=>v?.dataset?.sessionId===t.id);if(!b)return;const m=new l.Terminal({cursorBlink:!0,fontFamily:'Consolas, "Courier New", monospace',fontSize:13,theme:{background:"#1e1e1e",foreground:"#d4d4d4"},convertEol:!1}),P=new p.FitAddon;m.loadAddon(P),m.open(b);try{P.fit()}catch{}t.xterm=m,t.fitAddon=P;const ie=m.onData(v=>{s.stdin(t.id,v).catch(g=>{String(g?.message||"").includes("dangerous_keyword_blocked")?V.warning("该命令被桌面端拦截(高危关键字)"):V.error("stdin 失败: "+(g?.message||g))})}),ce=s.onStdout(t.id,({data:v,seq:g})=>{t.lastSeq=g,m.write(v)}),de=s.onExit(t.id,({exitCode:v,signal:g})=>{t.alive=!1,t.exitCode=v,t.signal=g,m.writeln(`\r
3
- \x1B[33m[session exited, code=${v}, signal=${g??"-"}]\x1B[0m`)});t.offs=()=>{try{ie.dispose?.()}catch{}ce(),de()};try{const{chunks:v,truncated:g}=await s.history(t.id,0);g&&m.writeln("\x1B[2m[history truncated — earlier output was evicted]\x1B[0m");for(const J of v)m.write(J.data),t.lastSeq=J.seq}catch(v){m.writeln(`\x1B[31m[history fetch failed: ${v?.message||v}]\x1B[0m`)}const j=new ResizeObserver(()=>{try{P.fit(),s.resize(t.id,m.cols,m.rows).catch(()=>{})}catch{}});j.observe(b);const ue=t.offs;t.offs=()=>{try{j.disconnect()}catch{}ue()}}async function re(){u.value=!0,f.value="";try{const t=await s.create({shell:w.value,cols:80,rows:24}),l={id:t.sessionId,shell:t.shell,cwd:"",alive:!0,lastSeq:0,exitCode:null,xterm:null,fitAddon:null,offs:()=>{}};e.value.push(l),i.value=l.id,await B(l)}catch(t){f.value=t?.message||String(t)}finally{u.value=!1}}async function se(t){try{await s.close(t)}catch(l){f.value=l?.message||String(l)}setTimeout(()=>W(t),500)}function W(t){const l=e.value.findIndex(b=>b.id===t);if(l===-1)return;const p=e.value[l];try{p.offs?.()}catch{}try{p.xterm?.dispose?.()}catch{}e.value.splice(l,1),i.value===t&&(i.value=e.value[0]?.id||null)}function le(t){i.value=t,q(()=>{const l=e.value.find(p=>p.id===t);try{l?.fitAddon?.fit()}catch{}})}async function K(){d.value=!0,f.value="";try{const t=await s.list();for(const l of t){const p=e.value.find(m=>m.id===l.id);if(p){p.alive=l.alive,p.lastSeq=l.lastSeq;continue}const b={id:l.id,shell:l.shell,cwd:l.cwd,alive:l.alive,lastSeq:l.lastSeq,exitCode:null,xterm:null,fitAddon:null,offs:()=>{}};e.value.push(b),await B(b)}!i.value&&e.value.length>0&&(i.value=e.value[0].id)}catch(t){f.value=t?.message||String(t)}finally{d.value=!1}}G(async()=>{await K()}),H(()=>{for(const t of e.value){try{t.offs?.()}catch{}try{t.xterm?.dispose?.()}catch{}}}),$(i,()=>{q(()=>{const t=h.value;try{t?.fitAddon?.fit()}catch{}})});const X={term:s,sessions:e,activeId:i,newShell:w,creating:u,loadingList:d,error:f,warning:n,xtermContainers:a,shellOptions:r,active:h,shortId:L,get xtermMod(){return O},set xtermMod(t){O=t},get fitAddonMod(){return M},set fitAddonMod(t){M=t},loadXterm:I,mountXterm:B,onCreate:re,onClose:se,removeSession:W,activate:le,refreshList:K,ref:S,computed:ee,onMounted:G,onBeforeUnmount:H,nextTick:q,watch:$,get message(){return V},get PlusOutlined(){return ge},get CloseOutlined(){return pe},get ReloadOutlined(){return ye},get useTerminal(){return oe}};return Object.defineProperty(X,"__isScriptSetup",{enumerable:!1,value:!0}),X}},be={class:"terminal-page"},ke={class:"terminal-header"},Ce={class:"page-sub"},Ae={class:"terminal-body"},Ee={class:"session-tabs"},Oe=["onClick"],Te={class:"session-shell"},Re={class:"session-id"},Me={key:0,class:"session-empty"},ze={class:"xterm-host"},Le=["data-session-id"],Pe={key:0,class:"xterm-placeholder"},De={key:1,class:"terminal-footer"},qe={key:0,class:"footer-exit"};function Be(c,o,s,e,i,w){const u=z("a-tag"),d=z("a-select"),f=z("a-button"),n=z("a-space"),a=z("a-alert");return y(),x("div",be,[_("div",ke,[_("div",null,[o[3]||(o[3]=_("h2",{class:"page-title"},"远程终端",-1)),_("p",Ce,[o[2]||(o[2]=D(" 桌面端托管的 PTY 会话;Android 端可远程操控同一通道 ",-1)),e.warning?(y(),Q(u,{key:0,color:"orange",style:{"margin-left":"8px"}},{default:T(()=>[D(E(e.warning),1)]),_:1})):R("v-if",!0)])]),A(n,null,{default:T(()=>[A(d,{value:e.newShell,"onUpdate:value":o[0]||(o[0]=r=>e.newShell=r),style:{width:"130px"},size:"small",options:e.shellOptions},null,8,["value"]),A(f,{type:"primary",size:"small",loading:e.creating,onClick:e.onCreate},{icon:T(()=>[A(e.PlusOutlined)]),default:T(()=>[o[4]||(o[4]=D(" 新会话 ",-1))]),_:1},8,["loading"]),A(f,{size:"small",loading:e.loadingList,onClick:e.refreshList},{icon:T(()=>[A(e.ReloadOutlined)]),default:T(()=>[o[5]||(o[5]=D(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),e.error?(y(),Q(a,{key:0,message:e.error,type:"error","show-icon":"",closable:"",style:{"margin-bottom":"12px"},onClose:o[1]||(o[1]=r=>e.error="")},null,8,["message"])):R("v-if",!0),_("div",Ae,[_("div",Ee,[(y(!0),x(Y,null,Z(e.sessions,r=>(y(),x("div",{key:r.id,class:ve(["session-tab",{active:r.id===e.activeId,dead:!r.alive}]),onClick:h=>e.activate(r.id)},[_("span",Te,E(r.shell),1),_("span",Re,E(e.shortId(r.id)),1),A(e.CloseOutlined,{class:"session-close",onClick:we(h=>e.onClose(r.id),["stop"])},null,8,["onClick"])],10,Oe))),128)),e.sessions.length===0?(y(),x("div",Me,' 点击 "新会话" 创建第一个终端 ')):R("v-if",!0)]),_("div",ze,[(y(!0),x(Y,null,Z(e.sessions,r=>he((y(),x("div",{key:r.id,ref_for:!0,ref:"xtermContainers","data-session-id":r.id,class:"xterm-container"},null,8,Le)),[[_e,r.id===e.activeId]])),128)),e.sessions.length===0?(y(),x("div",Pe,[...o[6]||(o[6]=[_("span",null,"无活跃会话",-1)])])):R("v-if",!0)])]),e.active?(y(),x("div",De,[_("span",null,E(e.active.shell)+" · "+E(e.active.cwd||"(默认 cwd)")+" · seq "+E(e.active.lastSeq),1),e.active.alive?R("v-if",!0):(y(),x("span",qe,"已退出 (code="+E(e.active.exitCode??"-")+")",1))])):R("v-if",!0)])}const Fe=me(Se,[["render",Be],["__scopeId","data-v-65366a29"],["__file","/tmp/cc-web-panel-SVKg9z/repo/packages/web-panel/src/views/Terminal.vue"]]);export{Fe as default};
@@ -1 +0,0 @@
1
- import{O as r}from"./index-D3WhDg1s.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-Bfmb67bb.js";import{U as t}from"./index-D3WhDg1s.js";import"./vendor-BvqAck49.js";import"./index-DnAbauX-.js";import"./icons-DP3uiYxy.js";const s=t(o);export{s as default};
@@ -1 +0,0 @@
1
- import{A as o}from"./Row-2RBgBLEz.js";import{U as t}from"./index-D3WhDg1s.js";import"./vendor-BvqAck49.js";import"./responsiveObserve-B1DqSgFh.js";import"./useFlexGapSupport-BQWuGrL0.js";import"./styleChecker-zb3gob1_.js";import"./index-DnAbauX-.js";import"./icons-DP3uiYxy.js";const l=t(o);export{l as default};