chainlesschain 0.162.125 → 0.162.126

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/assets/{AIOps-DcqNhZhA.js → AIOps-BrTOcqIJ.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-BigtmPoq.js → ActionButton-na9cocmf.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-1J_X_HF4.js → Analytics-BtDygkpt.js} +2 -2
  5. package/src/assets/web-panel/assets/{AppLayout-DlcDG_a_.js → AppLayout-D_t5CS18.js} +5 -5
  6. package/src/assets/web-panel/assets/{Audit-Do-y8_3w.js → Audit-BYMZccCy.js} +1 -1
  7. package/src/assets/web-panel/assets/{Backup-S2Df-50Y.js → Backup-D2qDfAdL.js} +1 -1
  8. package/src/assets/web-panel/assets/{BaseInput-D5kgWJfk.js → BaseInput-kj456Ju9.js} +1 -1
  9. package/src/assets/web-panel/assets/{Chat-aUcp3kN1.js → Chat-BY0A0ZLE.js} +5 -5
  10. package/src/assets/web-panel/assets/ChatBubbleRenderer-D1VvrOPQ.js +1 -0
  11. package/src/assets/web-panel/assets/{Checkbox-DTg1U7Xs.js → Checkbox-DiBhtXsh.js} +1 -1
  12. package/src/assets/web-panel/assets/{Codegen-YO9ZZ4Ky.js → Codegen-B1ER0L0j.js} +1 -1
  13. package/src/assets/web-panel/assets/{Col-BHonE9fU.js → Col-CjLmza7D.js} +1 -1
  14. package/src/assets/web-panel/assets/{Community-DA2AlEFh.js → Community-BNId05U7.js} +1 -1
  15. package/src/assets/web-panel/assets/{Compact-DULxLRNg.js → Compact-BuuMj7K1.js} +1 -1
  16. package/src/assets/web-panel/assets/{Compliance-BZqfuuZL.js → Compliance-DUuDycaJ.js} +1 -1
  17. package/src/assets/web-panel/assets/{Cowork-CJe3vyMS.js → Cowork-BKHiF6uL.js} +2 -2
  18. package/src/assets/web-panel/assets/{Cron-CeV8AtRu.js → Cron-C7p-lHnC.js} +2 -2
  19. package/src/assets/web-panel/assets/{Crosschain-CAg66zS5.js → Crosschain-BvSOx8a6.js} +1 -1
  20. package/src/assets/web-panel/assets/{DID-Dtup5JZm.js → DID-D1k9jgHv.js} +2 -2
  21. package/src/assets/web-panel/assets/{Dashboard-DAR_8PNy.js → Dashboard-B9mCCnqY.js} +2 -2
  22. package/src/assets/web-panel/assets/{Dropdown-K5bTaCYN.js → Dropdown-ge9UHSXF.js} +1 -1
  23. package/src/assets/web-panel/assets/{EmailListRenderer-C890uErx.js → EmailListRenderer-TZO7ppXi.js} +1 -1
  24. package/src/assets/web-panel/assets/{FamilyGuardDashboard-B-Tj_8yM.js → FamilyGuardDashboard-DkhLJmzx.js} +1 -1
  25. package/src/assets/web-panel/assets/{Federation-C6WZ98ni.js → Federation-JLuA_8zp.js} +1 -1
  26. package/src/assets/web-panel/assets/{FormItemContext-D-LTfGWd.js → FormItemContext-C4w-rzNg.js} +1 -1
  27. package/src/assets/web-panel/assets/{GenericCardRenderer-C80DK4W7.js → GenericCardRenderer-Btns4sV9.js} +1 -1
  28. package/src/assets/web-panel/assets/{Git-Cjvvv3zW.js → Git-BheXMjzC.js} +2 -2
  29. package/src/assets/web-panel/assets/{Governance-C0BND77H.js → Governance-D9rLlatH.js} +1 -1
  30. package/src/assets/web-panel/assets/{Inference-BL9kTtSu.js → Inference-DiklIMcd.js} +1 -1
  31. package/src/assets/web-panel/assets/{KnowledgeGraph-CnVTBmJf.js → KnowledgeGraph-C70EWL03.js} +1 -1
  32. package/src/assets/web-panel/assets/{Logs-CbCbg7K6.js → Logs-Zt_MLI10.js} +2 -2
  33. package/src/assets/web-panel/assets/{Marketplace-CG5On-fH.js → Marketplace-suQxES99.js} +1 -1
  34. package/src/assets/web-panel/assets/{McpTools-AYYDZZK7.js → McpTools-CclpCDpY.js} +5 -5
  35. package/src/assets/web-panel/assets/{Memory-tMWbMDQq.js → Memory-B2lHOUwF.js} +2 -2
  36. package/src/assets/web-panel/assets/{MobileBridge-BAOsf4wB.js → MobileBridge-BMXKoDAD.js} +1 -1
  37. package/src/assets/web-panel/assets/{MobileProjects-BT-2komQ.js → MobileProjects-a6mWVdBV.js} +1 -1
  38. package/src/assets/web-panel/assets/{Mtc-BFwfC63n.js → Mtc-BFpM4Fkj.js} +5 -5
  39. package/src/assets/web-panel/assets/{MtcAudit-DYG3CWdH.js → MtcAudit-DDQkxkbS.js} +2 -2
  40. package/src/assets/web-panel/assets/{Multisig-KJwd0yWT.js → Multisig-Crkd_zKQ.js} +3 -3
  41. package/src/assets/web-panel/assets/{NLProgramming-BmL5dNWm.js → NLProgramming-Dpk5An7B.js} +1 -1
  42. package/src/assets/web-panel/assets/{Notes-DmkaVaMc.js → Notes-BrFnOMNz.js} +3 -3
  43. package/src/assets/web-panel/assets/{NotificationSettings-tmVQszDZ.js → NotificationSettings-CM0iApFM.js} +1 -1
  44. package/src/assets/web-panel/assets/{OrderTableRenderer-BtrR7anf.js → OrderTableRenderer-XXjeqkdz.js} +1 -1
  45. package/src/assets/web-panel/assets/{Organization-pppktQyW.js → Organization-CHFW_38T.js} +4 -4
  46. package/src/assets/web-panel/assets/{Overflow-D3lBoQDA.js → Overflow-C-vl3EjV.js} +1 -1
  47. package/src/assets/web-panel/assets/{P2P-BgE2qGlZ.js → P2P-BT7Slavq.js} +2 -2
  48. package/src/assets/web-panel/assets/PdhVaultBrowser-DRUaULap.js +7 -0
  49. package/src/assets/web-panel/assets/{Permissions-BR8no2Xe.js → Permissions-DkhOAvMz.js} +3 -3
  50. package/src/assets/web-panel/assets/{PersonalDataHub-DabbyQEF.js → PersonalDataHub-Dl7dSOvV.js} +2 -2
  51. package/src/assets/web-panel/assets/{Pipeline-n4sNpEz8.js → Pipeline-B3nVI4p6.js} +1 -1
  52. package/src/assets/web-panel/assets/{Privacy-CGNp4n8M.js → Privacy-Dv1SXx1Q.js} +1 -1
  53. package/src/assets/web-panel/assets/{ProjectInit-CAVA5VsX.js → ProjectInit-DrAhVi5p.js} +2 -2
  54. package/src/assets/web-panel/assets/{ProjectSettings-GCgkfM7A.js → ProjectSettings-h-ggCYN_.js} +2 -2
  55. package/src/assets/web-panel/assets/{Projects-BYK17p52.js → Projects-CM91hYdr.js} +1 -1
  56. package/src/assets/web-panel/assets/{Providers-DpUT5W-d.js → Providers-rfkZel3N.js} +1 -1
  57. package/src/assets/web-panel/assets/{QuickAsk-ZJxTb7vi.js → QuickAsk-XepZB7h_.js} +1 -1
  58. package/src/assets/web-panel/assets/{Recommend-CIzFRDk1.js → Recommend-DzQWsh1a.js} +1 -1
  59. package/src/assets/web-panel/assets/{Reputation-lQ_WDNZn.js → Reputation-CDeaal0j.js} +1 -1
  60. package/src/assets/web-panel/assets/{Row-1MEtrgtF.js → Row-BN4aKhFH.js} +1 -1
  61. package/src/assets/web-panel/assets/{RssFeed-SSgcPPl4.js → RssFeed-INP6VYAA.js} +2 -2
  62. package/src/assets/web-panel/assets/{Search-CcTMOGNY.js → Search-ChPbwatu.js} +1 -1
  63. package/src/assets/web-panel/assets/{Security-BA1KMaDx.js → Security-C97ZCY8N.js} +3 -3
  64. package/src/assets/web-panel/assets/{Services-_aj7czZn.js → Services-Cbtl2Ajs.js} +2 -2
  65. package/src/assets/web-panel/assets/{Skeleton-BWgg_0Zr.js → Skeleton-B13sFxBQ.js} +1 -1
  66. package/src/assets/web-panel/assets/{Skills-C2ZIziYM.js → Skills-vI9zSIKX.js} +1 -1
  67. package/src/assets/web-panel/assets/{Sla-CYxp4axY.js → Sla-Cr3oBH39.js} +1 -1
  68. package/src/assets/web-panel/assets/{SpeechSettings-C7Csp1jV.js → SpeechSettings-BwemqPPV.js} +1 -1
  69. package/src/assets/web-panel/assets/{SyncSettings-svGeswiw.js → SyncSettings-CLA78P-Z.js} +2 -2
  70. package/src/assets/web-panel/assets/{Tasks-ClISj6oK.js → Tasks-DBjQ_DOM.js} +1 -1
  71. package/src/assets/web-panel/assets/{Templates-CmO-Fp7r.js → Templates-BkSLDkBs.js} +1 -1
  72. package/src/assets/web-panel/assets/{Tenant-a3Ac3lxz.js → Tenant-Dn0nSlib.js} +1 -1
  73. package/src/assets/web-panel/assets/{Terminal-DyJIRh81.js → Terminal-C8f4boru.js} +2 -2
  74. package/src/assets/web-panel/assets/{TimelineRenderer-acXS5N5h.js → TimelineRenderer-DW_rMtJR.js} +1 -1
  75. package/src/assets/web-panel/assets/{Tokens-DJW0KqV4.js → Tokens-BdffrKYV.js} +1 -1
  76. package/src/assets/web-panel/assets/{Trigger-0HeTi4r6.js → Trigger-CX4CUg-Q.js} +1 -1
  77. package/src/assets/web-panel/assets/{Trust-aFym34eo.js → Trust-Cq9Bl7Od.js} +1 -1
  78. package/src/assets/web-panel/assets/{UkeySign-CYhszHJv.js → UkeySign-BQy18_VY.js} +1 -1
  79. package/src/assets/web-panel/assets/{VideoEditing-BbJxPF9X.js → VideoEditing-h5hzK7Vw.js} +1 -1
  80. package/src/assets/web-panel/assets/{Wallet-DDthEwiu.js → Wallet-BLotT3gw.js} +2 -2
  81. package/src/assets/web-panel/assets/{WebAuthn-DQ6McYPg.js → WebAuthn-8cCANYLE.js} +2 -2
  82. package/src/assets/web-panel/assets/{WorkflowEditor-CnF8zRsi.js → WorkflowEditor-Db6NwtAv.js} +1 -1
  83. package/src/assets/web-panel/assets/{chat-Dzkx2gTP.js → chat-BPk1LbpL.js} +1 -1
  84. package/src/assets/web-panel/assets/{colors-35T51Oo5.js → colors-BnNal71p.js} +1 -1
  85. package/src/assets/web-panel/assets/{compact-item-TtzNrlu1.js → compact-item-W2VC0tcy.js} +1 -1
  86. package/src/assets/web-panel/assets/{createContext-Y1LkWrYb.js → createContext-DceVsgnZ.js} +1 -1
  87. package/src/assets/web-panel/assets/devWarning--rwFDBhx.js +1 -0
  88. package/src/assets/web-panel/assets/{hasIn-BOYw1BgS.js → hasIn-BEq6EDcp.js} +1 -1
  89. package/src/assets/web-panel/assets/{index-BtlJWaSP.js → index-5gIBUFBn.js} +1 -1
  90. package/src/assets/web-panel/assets/{index-CLqC2sRT.js → index-APCHxOkM.js} +1 -1
  91. package/src/assets/web-panel/assets/{index-C7Wt5feN.js → index-B2dMhwZi.js} +1 -1
  92. package/src/assets/web-panel/assets/{index-CqhwG1ox.js → index-B8cPjrEH.js} +1 -1
  93. package/src/assets/web-panel/assets/{index-BxWUEFKy.js → index-BDC5HsxZ.js} +1 -1
  94. package/src/assets/web-panel/assets/index-BPFuPGKi.js +1 -0
  95. package/src/assets/web-panel/assets/{index-NM9Oke2k.js → index-BUkDcIwJ.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-BWgNn9As.js → index-BWcCyH6-.js} +3 -3
  97. package/src/assets/web-panel/assets/{index-CVrUs6rf.js → index-BgZikQoh.js} +1 -1
  98. package/src/assets/web-panel/assets/index-Bwjus13Y.js +1 -0
  99. package/src/assets/web-panel/assets/{index-D6tG4B25.js → index-BzSzRWsw.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DjeUZxE5.js → index-C1K9CsGr.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DmkG479D.js → index-CBZVISK6.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-Bw1iOGhM.js → index-CEJN-R2L.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-G4ClSmJc.js → index-CG5dGC9E.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-D47robkX.js → index-CMGLpstm.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-BKRlWHUp.js → index-CWrGCndd.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DhMSOd_2.js → index-CbcvfpCV.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-Dx0hIfC-.js → index-Ceqv4lI2.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-CdyFg4FI.js → index-CsT6frT8.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-B7aKAZzS.js → index-D8PQKsDT.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-8jffdb6b.js → index-DGncdA-j.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-XIuZV9by.js → index-DHanQHO0.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-Dhfw-BXs.js → index-DaUBk28E.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-hyqEKkBT.js → index-Di2J4b4V.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-DAizH273.js → index-DtuLvWZN.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CPGNc2tF.js → index-DvS1J8xc.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-KgXrlfNF.js → index-DxePJdwP.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DFhlelzN.js → index-Et4XvL49.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-zF77jnI2.js → index-GlFxgcj4.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-Cs82BHAj.js → index-HV119Oui.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-Dof7lWA_.js → index-InGW87pj.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-Bs69SI96.js → index-P1-s8JR7.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-D4BgCBa3.js → index-SdABCNoi.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-BSpFe6j5.js → index-WTAZbN-c.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-D7dCBw_M.js → index-_2I-KzOj.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BGPEaeB1.js → index-m1sVaWVU.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CZ16GlOs.js → index-s37wwyeN.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-D2od7Bgx.js → index-tyWABqp9.js} +1 -1
  128. package/src/assets/web-panel/assets/{initDefaultProps-DD5y5msp.js → initDefaultProps-DzrCDb3j.js} +1 -1
  129. package/src/assets/web-panel/assets/{motion-BuoutMia.js → motion-BQERVnE3.js} +1 -1
  130. package/src/assets/web-panel/assets/{move-DkpjqOXg.js → move-I9ACA5XJ.js} +1 -1
  131. package/src/assets/web-panel/assets/{mtc-parser-BmGJD-v-.js → mtc-parser-Dd2Pw-tr.js} +1 -1
  132. package/src/assets/web-panel/assets/{omit-DftUE0Sz.js → omit-DwzYRzWV.js} +1 -1
  133. package/src/assets/web-panel/assets/{pickAttrs-DDRb9FIu.js → pickAttrs-BSGULyIL.js} +1 -1
  134. package/src/assets/web-panel/assets/{placementArrow-DPgtxOOD.js → placementArrow-tSYYjAts.js} +1 -1
  135. package/src/assets/web-panel/assets/{responsiveObserve-BQFRzFeZ.js → responsiveObserve-Dy2lqikT.js} +1 -1
  136. package/src/assets/web-panel/assets/{slide-DQ4lmUSz.js → slide-RaB4Uq0c.js} +1 -1
  137. package/src/assets/web-panel/assets/{statusUtils-C1TR4ZiQ.js → statusUtils-CBpC_wZg.js} +1 -1
  138. package/src/assets/web-panel/assets/{styleChecker-B-Suj978.js → styleChecker-BEKwPWt5.js} +1 -1
  139. package/src/assets/web-panel/assets/{useFlexGapSupport-Q7bDZ3EI.js → useFlexGapSupport-C4CnYJH1.js} +1 -1
  140. package/src/assets/web-panel/assets/{useFs-DHjRLyQH.js → useFs-n24jutw5.js} +1 -1
  141. package/src/assets/web-panel/assets/{usePersonalDataHub-lQOvCvCr.js → usePersonalDataHub-DMgS8F6G.js} +1 -1
  142. package/src/assets/web-panel/assets/{vnode-Ie0g4-p3.js → vnode-BSp2KYcj.js} +1 -1
  143. package/src/assets/web-panel/assets/{zoom-CHP0YEoH.js → zoom-7UfQtTPh.js} +1 -1
  144. package/src/assets/web-panel/index.html +1 -1
  145. package/src/commands/agent.js +41 -2
  146. package/src/commands/compliance.js +3 -1
  147. package/src/commands/review.js +47 -17
  148. package/src/commands/session.js +11 -2
  149. package/src/gateways/ws/message-dispatcher.js +145 -165
  150. package/src/gateways/ws/ws-session-gateway.js +39 -5
  151. package/src/harness/jsonl-session-store.js +39 -12
  152. package/src/harness/worktree-isolator.js +5 -0
  153. package/src/lib/agent-core.js +1 -0
  154. package/src/lib/audit-logger.js +3 -1
  155. package/src/lib/chat-core.js +5 -2
  156. package/src/lib/chat-intent-service.js +68 -21
  157. package/src/lib/config-manager.js +25 -1
  158. package/src/lib/credential-guard.js +43 -1
  159. package/src/lib/git-integration.js +5 -0
  160. package/src/lib/interaction-adapter.js +32 -11
  161. package/src/lib/jsonl-session-store.js +1 -0
  162. package/src/lib/llm-config-defaults.js +37 -0
  163. package/src/lib/mcp-oauth.js +76 -10
  164. package/src/lib/permission-engine.js +4 -1
  165. package/src/lib/pipeline-orchestrator.js +20 -2
  166. package/src/lib/project-instructions.js +13 -0
  167. package/src/lib/repl-denials.js +137 -0
  168. package/src/lib/safe-json.js +22 -0
  169. package/src/lib/sandbox-v2.js +7 -6
  170. package/src/lib/search-command.js +65 -0
  171. package/src/lib/settings-hooks.cjs +133 -0
  172. package/src/lib/settings-loader.cjs +16 -7
  173. package/src/lib/social-graph.js +3 -1
  174. package/src/lib/stream-retry.js +27 -0
  175. package/src/lib/turn-context.js +15 -5
  176. package/src/repl/agent-repl.js +81 -8
  177. package/src/runtime/__tests__/message-roles.test.js +36 -3
  178. package/src/runtime/agent-core.js +175 -50
  179. package/src/runtime/coding-agent-contract-shared.cjs +9 -2
  180. package/src/runtime/coding-agent-shell-policy.cjs +23 -2
  181. package/src/runtime/file-ref-expander.js +51 -7
  182. package/src/runtime/headless-runner.js +83 -2
  183. package/src/runtime/headless-stream.js +69 -3
  184. package/src/runtime/mcp-config.js +42 -1
  185. package/src/runtime/message-roles.js +14 -1
  186. package/src/assets/web-panel/assets/ChatBubbleRenderer-Pg7dIsiE.js +0 -1
  187. package/src/assets/web-panel/assets/PdhVaultBrowser-D26Bz5gS.js +0 -7
  188. package/src/assets/web-panel/assets/devWarning-D_lwLZ6O.js +0 -1
  189. package/src/assets/web-panel/assets/index-CEwuCM44.js +0 -1
  190. package/src/assets/web-panel/assets/index-DzzgU4IU.js +0 -1
@@ -50,6 +50,11 @@ import { mergeConsecutiveMessages } from "./message-roles.js";
50
50
  import { isHeadlessConfigCommand } from "../lib/headless-config-command.js";
51
51
  import { withQuietStdout } from "./quiet-stdout.js";
52
52
  import { CostBudget } from "../lib/cost-budget.js";
53
+ import {
54
+ classifyDenial,
55
+ recordDenial,
56
+ formatDenials,
57
+ } from "../lib/repl-denials.js";
53
58
 
54
59
  /** Tools that cannot mutate the filesystem or run commands. */
55
60
  export const READ_ONLY_TOOLS = Object.freeze([
@@ -294,17 +299,46 @@ export async function runAgentHeadless(options = {}, deps = {}) {
294
299
  let settingsHooks = options.settingsHooks || null;
295
300
  if (!settingsHooks) {
296
301
  try {
297
- const { loadHooks } = await import("../lib/settings-hooks.cjs");
302
+ const { loadHooks, projectHookTrustNotice } =
303
+ await import("../lib/settings-hooks.cjs");
298
304
  const loaded = loadHooks({ cwd, settingsFile: options.settingsFile });
299
305
  settingsHooks =
300
306
  loaded.hooks && Object.keys(loaded.hooks).length > 0
301
307
  ? loaded.hooks
302
308
  : null;
309
+ // First-run trust notice for an untrusted/cloned repo's shell-running
310
+ // hooks (Claude-Code 2.1.195 parity). Best-effort, stderr-only.
311
+ try {
312
+ const notice = projectHookTrustNotice({
313
+ cwd,
314
+ settingsFile: options.settingsFile,
315
+ });
316
+ if (notice) process.stderr.write(notice + "\n");
317
+ } catch {
318
+ /* trust notice is best-effort */
319
+ }
303
320
  } catch {
304
321
  settingsHooks = null; // fail-open
305
322
  }
306
323
  }
307
324
 
325
+ // autoMode.classifyAllShell (Claude-Code 2.1.193): route the built-in
326
+ // verification allowlist through the shell-policy classifier instead of
327
+ // fast-pathing it. Explicit option wins; otherwise read settings.json.
328
+ let classifyAllShell = options.classifyAllShell || false;
329
+ if (!classifyAllShell) {
330
+ try {
331
+ const { readBooleanSetting } = await import("../lib/settings-loader.cjs");
332
+ classifyAllShell =
333
+ readBooleanSetting("autoMode.classifyAllShell", {
334
+ cwd,
335
+ settingsFile: options.settingsFile,
336
+ }) === true;
337
+ } catch {
338
+ classifyAllShell = false; // fail-open
339
+ }
340
+ }
341
+
308
342
  const runLoop = deps.agentLoop || coreAgentLoop;
309
343
  const doBootstrap = deps.bootstrap || bootstrap;
310
344
  const getApprovalGate =
@@ -776,6 +810,7 @@ export async function runAgentHeadless(options = {}, deps = {}) {
776
810
  approvalGate,
777
811
  permissionRules,
778
812
  settingsHooks,
813
+ classifyAllShell,
779
814
  enabledToolNames,
780
815
  disabledTools,
781
816
  iterationBudget: budget,
@@ -847,6 +882,10 @@ export async function runAgentHeadless(options = {}, deps = {}) {
847
882
 
848
883
  const startedAt = deps.now ? deps.now() : Date.now();
849
884
  const toolCalls = [];
885
+ // Policy denials (blocked tool calls) collected for an end-of-run summary,
886
+ // so a non-interactive run surfaces what got blocked the way the REPL's
887
+ // `/permissions denials` does (Claude-Code 2.1.193 denial reasons).
888
+ const denials = [];
850
889
  const usage = {
851
890
  input_tokens: 0,
852
891
  output_tokens: 0,
@@ -924,6 +963,26 @@ export async function runAgentHeadless(options = {}, deps = {}) {
924
963
  if (toolCalls.length > 0) {
925
964
  toolCalls[toolCalls.length - 1].is_error = Boolean(err);
926
965
  }
966
+ // Track policy denials (not plain tool failures) for the end-of-run
967
+ // summary. The preceding tool-executing pushed the args.
968
+ if (err) {
969
+ const last = toolCalls[toolCalls.length - 1];
970
+ const denial = classifyDenial({
971
+ tool: event.tool,
972
+ result: event.result,
973
+ error: event.error,
974
+ argsSummary:
975
+ last && last.tool === event.tool
976
+ ? formatToolArgs(event.tool, last.args)
977
+ : "",
978
+ });
979
+ if (denial) {
980
+ recordDenial(denials, {
981
+ ...denial,
982
+ at: deps.now ? deps.now() : Date.now(),
983
+ });
984
+ }
985
+ }
927
986
  break;
928
987
  }
929
988
  case "token-usage": {
@@ -1013,6 +1072,7 @@ export async function runAgentHeadless(options = {}, deps = {}) {
1013
1072
  usage,
1014
1073
  numTurns: budget.consumed,
1015
1074
  durationMs: (deps.now ? deps.now() : Date.now()) - startedAt,
1075
+ denials,
1016
1076
  }),
1017
1077
  ) + "\n",
1018
1078
  );
@@ -1132,6 +1192,21 @@ export async function runAgentHeadless(options = {}, deps = {}) {
1132
1192
  }
1133
1193
  }
1134
1194
 
1195
+ // End-of-run policy-denial summary so a non-interactive run surfaces what was
1196
+ // blocked (mirrors the REPL's `/permissions denials`). Text → stderr lines;
1197
+ // stream → a `denials_summary` event before the final result.
1198
+ if (denials.length) {
1199
+ if (isText) {
1200
+ writeErr(
1201
+ `\n ${denials.length} tool call(s) were denied by policy this run:\n` +
1202
+ formatDenials(denials, { now: deps.now ? deps.now() : Date.now() }) +
1203
+ "\n",
1204
+ );
1205
+ } else if (isStream) {
1206
+ emitStream({ type: "denials_summary", count: denials.length, denials });
1207
+ }
1208
+ }
1209
+
1135
1210
  if (isStream) {
1136
1211
  emitStream({
1137
1212
  type: "result",
@@ -1155,6 +1230,7 @@ export async function runAgentHeadless(options = {}, deps = {}) {
1155
1230
  usage,
1156
1231
  numTurns: budget.consumed,
1157
1232
  durationMs,
1233
+ denials,
1158
1234
  }),
1159
1235
  ) + "\n",
1160
1236
  );
@@ -1175,8 +1251,9 @@ function buildResultEnvelope({
1175
1251
  usage,
1176
1252
  numTurns,
1177
1253
  durationMs,
1254
+ denials,
1178
1255
  }) {
1179
- return {
1256
+ const env = {
1180
1257
  type: "result",
1181
1258
  subtype,
1182
1259
  is_error: isError,
@@ -1187,4 +1264,8 @@ function buildResultEnvelope({
1187
1264
  tool_calls: toolCalls,
1188
1265
  usage,
1189
1266
  };
1267
+ // Only present when something was blocked — keeps the no-denial envelope
1268
+ // byte-identical to before (Claude-Code 2.1.193 denial reasons, json mode).
1269
+ if (Array.isArray(denials) && denials.length) env.denials = denials;
1270
+ return env;
1190
1271
  }
@@ -318,9 +318,26 @@ export function sanitizeLlmHint(raw) {
318
318
  /**
319
319
  * Yield NDJSON lines from a byte/string stream (stdin). Splits on "\n" and
320
320
  * flushes any trailing partial line when the stream ends.
321
+ *
322
+ * A single line with no terminating "\n" must never accumulate without bound:
323
+ * a stuck / garbage producer (or a runaway multi-MB inline payload) that never
324
+ * emits a newline would otherwise grow `buf` unbounded and OOM this long-lived
325
+ * stream process. When a line exceeds the cap, a short head is yielded (so the
326
+ * caller surfaces it as an invalid-JSON error rather than dropping it silently)
327
+ * and the rest of that monster line is discarded until its newline — the stream
328
+ * resyncs cleanly to the next well-formed line. Cap precedence:
329
+ * `opts.maxLineLength` > `CC_MAX_INPUT_LINE_BYTES` env > 16 MB default.
321
330
  */
322
- export async function* readJsonLines(input) {
331
+ export async function* readJsonLines(input, opts = {}) {
332
+ const envCap = Number(process.env.CC_MAX_INPUT_LINE_BYTES);
333
+ const maxLineLength =
334
+ Number.isFinite(opts.maxLineLength) && opts.maxLineLength > 0
335
+ ? opts.maxLineLength
336
+ : Number.isFinite(envCap) && envCap > 0
337
+ ? envCap
338
+ : 16 * 1024 * 1024;
323
339
  let buf = "";
340
+ let overflow = false; // discarding the tail of an over-long line until its \n
324
341
  // Reuse ONE streaming decoder across chunks so a multi-byte UTF-8 character
325
342
  // (e.g. a 3-byte Chinese char) split across two Buffer chunks is reassembled
326
343
  // rather than corrupted. process.stdin yields Buffers with no setEncoding, so
@@ -332,14 +349,34 @@ export async function* readJsonLines(input) {
332
349
  typeof chunk === "string"
333
350
  ? chunk
334
351
  : decoder.decode(chunk, { stream: true });
352
+ // Still skipping past an over-long line: drop everything up to (and
353
+ // including) the next newline, then resume normal line parsing. While no
354
+ // newline has arrived, keep `buf` empty so we don't re-grow it.
355
+ if (overflow) {
356
+ const nl = buf.indexOf("\n");
357
+ if (nl < 0) {
358
+ buf = "";
359
+ continue;
360
+ }
361
+ buf = buf.slice(nl + 1);
362
+ overflow = false;
363
+ }
335
364
  let idx;
336
365
  while ((idx = buf.indexOf("\n")) >= 0) {
337
366
  yield buf.slice(0, idx);
338
367
  buf = buf.slice(idx + 1);
339
368
  }
369
+ // No newline in the remaining buffer and it has blown past the cap — this is
370
+ // a pathological unterminated line. Yield a short head (an invalid-JSON
371
+ // error for the caller) and discard the rest until the next newline.
372
+ if (buf.length > maxLineLength) {
373
+ yield buf.slice(0, 200);
374
+ buf = "";
375
+ overflow = true;
376
+ }
340
377
  }
341
378
  buf += decoder.decode(); // flush any bytes held from a final partial char
342
- if (buf.trim()) yield buf;
379
+ if (!overflow && buf.trim()) yield buf;
343
380
  }
344
381
 
345
382
  /**
@@ -497,17 +534,45 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
497
534
  let settingsHooks = options.settingsHooks || null;
498
535
  if (!settingsHooks) {
499
536
  try {
500
- const { loadHooks } = await import("../lib/settings-hooks.cjs");
537
+ const { loadHooks, projectHookTrustNotice } =
538
+ await import("../lib/settings-hooks.cjs");
501
539
  const loaded = loadHooks({ cwd, settingsFile: options.settingsFile });
502
540
  settingsHooks =
503
541
  loaded.hooks && Object.keys(loaded.hooks).length > 0
504
542
  ? loaded.hooks
505
543
  : null;
544
+ // First-run trust notice for an untrusted/cloned repo's shell-running
545
+ // hooks (Claude-Code 2.1.195 parity). stderr keeps the NDJSON stdout clean.
546
+ try {
547
+ const notice = projectHookTrustNotice({
548
+ cwd,
549
+ settingsFile: options.settingsFile,
550
+ });
551
+ if (notice) process.stderr.write(notice + "\n");
552
+ } catch {
553
+ /* trust notice is best-effort */
554
+ }
506
555
  } catch {
507
556
  settingsHooks = null; // fail-open
508
557
  }
509
558
  }
510
559
 
560
+ // autoMode.classifyAllShell (Claude-Code 2.1.193): classify the built-in
561
+ // verification allowlist through the shell-policy instead of fast-pathing it.
562
+ let classifyAllShell = options.classifyAllShell || false;
563
+ if (!classifyAllShell) {
564
+ try {
565
+ const { readBooleanSetting } = await import("../lib/settings-loader.cjs");
566
+ classifyAllShell =
567
+ readBooleanSetting("autoMode.classifyAllShell", {
568
+ cwd,
569
+ settingsFile: options.settingsFile,
570
+ }) === true;
571
+ } catch {
572
+ classifyAllShell = false; // fail-open
573
+ }
574
+ }
575
+
511
576
  const input = deps.input || process.stdin;
512
577
  const runLoop = deps.agentLoop || coreAgentLoop;
513
578
  const doBootstrap = deps.bootstrap || bootstrap;
@@ -914,6 +979,7 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
914
979
  approvalGate,
915
980
  permissionRules,
916
981
  settingsHooks,
982
+ classifyAllShell,
917
983
  enabledToolNames,
918
984
  disabledTools,
919
985
  // --interactive-approvals: settings/hook `ask` (and, with an IDE bridge,
@@ -65,6 +65,22 @@ export function mcpToolName(server, tool) {
65
65
  return `mcp__${server}__${tool}`;
66
66
  }
67
67
 
68
+ /**
69
+ * Case-insensitive "does this header map already carry `name`?". HTTP header
70
+ * names are case-insensitive, so a caller-supplied `AUTHORIZATION` must count
71
+ * the same as `Authorization` — otherwise the OAuth-injection guard below would
72
+ * not see it and would add a SECOND, conflicting auth header, leaking our
73
+ * stored token where the user explicitly pinned their own credential.
74
+ */
75
+ export function hasHeaderInsensitive(headers, name) {
76
+ if (!headers || typeof headers !== "object") return false;
77
+ const want = String(name).toLowerCase();
78
+ for (const k of Object.keys(headers)) {
79
+ if (k.toLowerCase() === want) return true;
80
+ }
81
+ return false;
82
+ }
83
+
68
84
  /**
69
85
  * When an MCP connect fails with an authentication error (HTTP 401/403, or an
70
86
  * explicit Unauthorized/Forbidden) on a URL-based server, return an actionable
@@ -143,7 +159,7 @@ export async function setupMcpFromConfig(servers, deps = {}) {
143
159
  // unless the config already supplies an Authorization header. Best-effort:
144
160
  // no token / a refresh failure just connects unauthenticated.
145
161
  let connectCfg = cfg;
146
- if (cfg.url && !cfg.headers?.Authorization && !cfg.headers?.authorization) {
162
+ if (cfg.url && !hasHeaderInsensitive(cfg.headers, "Authorization")) {
147
163
  try {
148
164
  const { ensureValidToken } = await import("../lib/mcp-oauth.js");
149
165
  const token = await ensureValidToken(cfg.url);
@@ -152,6 +168,31 @@ export async function setupMcpFromConfig(servers, deps = {}) {
152
168
  ...cfg,
153
169
  headers: { ...cfg.headers, Authorization: `Bearer ${token}` },
154
170
  };
171
+ // Auto-recover from a mid-session 401/403 (server-side token rotation
172
+ // / revocation while the locally-stored copy still looks unexpired):
173
+ // register a reconnector that force-refreshes the bearer, so the
174
+ // mcp-client's callTool retry path reconnects and re-runs the call
175
+ // once with a fresh token (Claude-Code 2.1.193: "MCP auth re-runs and
176
+ // reconnects automatically on 401/403"). Best-effort, and skipped for
177
+ // a server whose config carries its own Authorization header (handled
178
+ // by the guard above) — an explicit IDE-bridge reconnector registered
179
+ // after setup still wins on any name clash.
180
+ if (typeof mcpClient.setReconnector === "function") {
181
+ const baseCfg = cfg;
182
+ mcpClient.setReconnector(name, async () => {
183
+ const { ensureValidToken: reauth } =
184
+ await import("../lib/mcp-oauth.js");
185
+ const fresh = await reauth(baseCfg.url, { forceRefresh: true });
186
+ if (!fresh) return null;
187
+ return {
188
+ ...baseCfg,
189
+ headers: {
190
+ ...baseCfg.headers,
191
+ Authorization: `Bearer ${fresh}`,
192
+ },
193
+ };
194
+ });
195
+ }
155
196
  }
156
197
  } catch {
157
198
  // OAuth wiring is best-effort
@@ -64,6 +64,17 @@ function joinContent(a, b) {
64
64
  */
65
65
  const MERGEABLE_ROLES = new Set(["user", "assistant"]);
66
66
 
67
+ /**
68
+ * Does this message carry tool calls? An assistant turn with `tool_calls` is a
69
+ * STRUCTURED turn whose calls must stay paired with their `tool` results —
70
+ * folding it loses one side's tool_calls (orphaning results / unanswered calls)
71
+ * and the strict-API 400s. Such turns are never merged (left to alternate; the
72
+ * tool-pair fix lives in sanitizeToolPairs, not here).
73
+ */
74
+ function hasToolCalls(msg) {
75
+ return Array.isArray(msg && msg.tool_calls) && msg.tool_calls.length > 0;
76
+ }
77
+
67
78
  /**
68
79
  * Merge consecutive same-role messages so the conversation alternates roles for
69
80
  * the provider. Only `user`/`assistant` turns fold; `tool` and `system` turns
@@ -85,7 +96,9 @@ export function mergeConsecutiveMessages(messages) {
85
96
  msg &&
86
97
  typeof msg.role === "string" &&
87
98
  MERGEABLE_ROLES.has(msg.role) &&
88
- prev.role === msg.role
99
+ prev.role === msg.role &&
100
+ !hasToolCalls(prev) && // never fold a structured tool-call turn — merging
101
+ !hasToolCalls(msg) // drops one side's tool_calls and breaks pairing
89
102
  ) {
90
103
  out[out.length - 1] = {
91
104
  ...prev,
@@ -1 +0,0 @@
1
- import{I as v,P as u,J as y,U as a,R as n,S,K as C,Q as x,V as w,_ as B,b as s}from"./vendor-BvqAck49.js";import{_ as k}from"./index-BWgNn9As.js";import"./icons-DP3uiYxy.js";const T={__name:"ChatBubbleRenderer",props:{event:{type:Object,required:!0}},setup(c,{expose:d}){d();const t=c,r=s(()=>{const e=t.event.content||{};return e.text||e.body||e.message||e.title||JSON.stringify(e).slice(0,200)}),i=s(()=>{const e=t.event.content||{};return e.from||e.sender||e.senderName||t.event.actor||"(unknown)"}),l=s(()=>{const e=(t.event.actor||"").toLowerCase();return e.includes("self")||e==="me"||e.endsWith("_self")}),o=s(()=>{const e=t.event.source.adapter||"";return e.startsWith("messaging-qq")?"magenta":e==="wechat"?"green":"blue"}),m=s(()=>{if(!t.event.occurredAt)return"";try{const e=new Date(t.event.occurredAt),p=e.getFullYear(),f=String(e.getMonth()+1).padStart(2,"0"),g=String(e.getDate()).padStart(2,"0"),b=String(e.getHours()).padStart(2,"0"),h=String(e.getMinutes()).padStart(2,"0");return`${p}-${f}-${g} ${b}:${h}`}catch{return""}}),_={props:t,messageText:r,actorLabel:i,isMine:l,adapterColor:o,formattedTime:m,computed:s};return Object.defineProperty(_,"__isScriptSetup",{enumerable:!1,value:!0}),_}},N={class:"bubble"},R={class:"meta"},M={class:"actor"},O={class:"time"},V={class:"body"};function q(c,d,t,r,i,l){const o=v("a-tag");return u(),y("div",{class:B(["chat-row",{mine:r.isMine}])},[a("div",N,[a("div",R,[a("span",M,n(r.actorLabel),1),a("span",O,n(r.formattedTime),1)]),a("div",V,n(r.messageText),1),t.event.source.adapter?(u(),S(o,{key:0,class:"src",color:r.adapterColor},{default:C(()=>[x(n(t.event.source.adapter),1)]),_:1},8,["color"])):w("v-if",!0)])],2)}const A=k(T,[["render",q],["__scopeId","data-v-49238629"],["__file","/tmp/cc-web-panel-aRyQTO/repo/packages/web-panel/src/components/pdh/renderers/ChatBubbleRenderer.vue"]]);export{A as default};
@@ -1,7 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./ChatBubbleRenderer-Pg7dIsiE.js","./vendor-BvqAck49.js","./index-BWgNn9As.js","./icons-DP3uiYxy.js","./index-Cq93VfoF.css","./ChatBubbleRenderer-gy5SDGw2.css","./OrderTableRenderer-BtrR7anf.js","./OrderTableRenderer-CfrDjSHT.css","./TimelineRenderer-acXS5N5h.js","./TimelineRenderer-BlTAtkOc.css","./EmailListRenderer-C890uErx.js","./EmailListRenderer-DTPZPx_S.css","./GenericCardRenderer-C80DK4W7.js","./GenericCardRenderer-o85VDYQS.css"])))=>i.map(i=>d[i]);
2
- import{E as ue,r as E,b as w,I as g,P as u,J as S,U as v,c,S as C,V as R,_ as M,F as V,Z as se,a0 as ae,R as x,K as m,Q as b,W as A,o as Q}from"./vendor-BvqAck49.js";import{u as J}from"./usePersonalDataHub-lQOvCvCr.js";import{_ as F,e as L,d as P}from"./index-BWgNn9As.js";import{a9 as q,af as U,M as z,aH as G,u as H,aG as K,ap as W,ab as Y,e as de,d as fe,k as pe,ah as me,az as _e,R as ye}from"./icons-DP3uiYxy.js";const I=Object.freeze({q:"",category:null,adapter:null,subtype:null,since:null,until:null}),B=50,Z=300,X=ue("pdhBrowser",()=>{const r=E({...I}),t=E([]),n=E(null),e=E(!1),o=E(!1),a=E(null),l=E(null),s=E(!1),i=E({byCategory:{},byAdapter:{},bySubtype:{},total:0});let d=0,_=null;const T=w(()=>t.value.length>0),j=w(()=>n.value!=null);function h(O={}){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,...O}}async function y(){const O=++d;e.value=!0,a.value=null;const p=J();try{const[f,D]=await Promise.all([p.searchEvents(h({limit:B})),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(O!==d)return;t.value=f.rows||[],n.value=f.nextCursor||null,l.value=f.mode||"like",s.value=!!f.shortQuery,i.value={byCategory:D.byCategory||{},byAdapter:D.byAdapter||{},bySubtype:D.bySubtype||{},total:D.total||0}}catch(f){if(O!==d)return;a.value=f&&f.message?f.message:String(f),t.value=[],n.value=null}finally{O===d&&(e.value=!1)}}async function k(){if(!n.value||o.value)return;o.value=!0,a.value=null;const O=J();try{const p=await O.searchEvents(h({cursor:n.value,limit:B}));t.value=t.value.concat(p.rows||[]),n.value=p.nextCursor||null,l.value=p.mode||l.value}catch(p){a.value=p&&p.message?p.message:String(p)}finally{o.value=!1}}function le(O,p){if(!(O in I))throw new Error(`pdhBrowser.setFilter: unknown key "${O}"`);r.value={...r.value,[O]:p},_&&clearTimeout(_),_=setTimeout(()=>{_=null,y()},Z)}function ie(O){return r.value={...I,...O},_&&(clearTimeout(_),_=null),y()}function ce(){r.value={...I},t.value=[],n.value=null,a.value=null,i.value={byCategory:{},byAdapter:{},bySubtype:{},total:0}}return{filters:r,results:t,cursor:n,isLoading:e,isAppending:o,error:a,mode:l,shortQuery:s,facets:i,hasResults:T,canLoadMore:j,search:y,loadMore:k,setFilter:le,setFilters:ie,reset:ce,PAGE_SIZE:B,SEARCH_DEBOUNCE_MS:Z}}),ge=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:K,shopping:H,travel:G,system:z,"ai-chat":U,other:q};function a(i){return o[i]||q}function l(i){return i?{backgroundColor:"#fff",color:"#1677ff"}:{backgroundColor:"#f0f0f0",color:"#666"}}const s={props:n,total:e,ICONS:o,iconFor:a,badgeStyle:l,computed:w,get AppstoreOutlined(){return q},get MessageOutlined(){return Y},get PlayCircleOutlined(){return W},get MailOutlined(){return K},get ShoppingOutlined(){return H},get CarOutlined(){return G},get MobileOutlined(){return z},get RobotOutlined(){return U},get CATEGORIES(){return ge},get categoryLabel(){return N}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}},Oe={class:"pdh-sidebar"},Se=["onClick"],we={class:"label"};function Ce(r,t,n,e,o,a){const l=g("a-badge");return u(),S("div",Oe,[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(l,{key:0,count:e.total,"number-style":e.badgeStyle(n.selected===null),"overflow-count":9999},null,8,["count","number-style"])):R("v-if",!0)],2),(u(!0),S(V,null,se(e.CATEGORIES,s=>(u(),S("div",{key:s,class:M(["cat-item",{active:n.selected===s,dim:!n.facets.byCategory[s]}]),onClick:i=>r.$emit("select",s)},[(u(),C(ae(e.iconFor(s)),{class:"icon"})),v("span",we,x(e.categoryLabel(s)),1),n.facets.byCategory[s]?(u(),C(l,{key:0,count:n.facets.byCategory[s],"number-style":e.badgeStyle(n.selected===s),"overflow-count":9999},null,8,["count","number-style"])):R("v-if",!0)],10,Se))),128))])}const ke=F(he,[["render",Ce],["__scopeId","data-v-6b62a22e"],["__file","/tmp/cc-web-panel-aRyQTO/repo/packages/web-panel/src/components/pdh/CategorySidebar.vue"]]),Re={__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,a=w(()=>e.filters.category?`在「${e.filters.category}」类目内搜索…`:"搜索关键词(如:支付宝、罗技、Kotlin)…"),l=w(()=>Object.entries(e.facets.byAdapter||{}).sort((y,k)=>k[1]-y[1]).map(([y,k])=>({value:y,label:`${y} (${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 T(h){if(!h||h.length===0){o("set-filter","since",null),o("set-filter","until",null);return}const[y,k]=h;o("set-filter","since",y?+y:null),o("set-filter","until",k?+k:null)}const j={props:e,emit:o,placeholderText:a,adapterOptions:l,dateRangeValue:s,hasActiveFilters:i,onQInput:d,onSearch:_,onDateChange:T,computed:w,get SearchOutlined(){return pe},get CloseCircleOutlined(){return fe},get InfoCircleOutlined(){return de}};return Object.defineProperty(j,"__isScriptSetup",{enumerable:!1,value:!0}),j}},Ee={class:"pdh-filter-bar"},xe={key:1,class:"hint"},Te={key:2,class:"hint"};function je(r,t,n,e,o,a){const l=g("a-input-search"),s=g("a-select"),i=g("a-range-picker"),d=g("a-button");return u(),S("div",Ee,[c(l,{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})):R("v-if",!0),n.shortQuery?(u(),S("span",xe,[c(e.InfoCircleOutlined),t[3]||(t[3]=b(" 关键词需至少 3 字 (FTS5 trigram 限制) ",-1))])):n.mode==="like"?(u(),S("span",Te,[c(e.InfoCircleOutlined),t[4]||(t[4]=b(" 当前为 LIKE 兜底模式 ",-1))])):R("v-if",!0)])}const Ae=F(Re,[["render",je],["__scopeId","data-v-d7cce6e9"],["__file","/tmp/cc-web-panel-aRyQTO/repo/packages/web-panel/src/components/pdh/SearchFilterBar.vue"]]),Le={__name:"RendererDispatcher",props:{event:{type:Object,required:!0}},setup(r,{expose:t}){t();const n=A(()=>L(()=>import("./ChatBubbleRenderer-Pg7dIsiE.js"),__vite__mapDeps([0,1,2,3,4,5]),import.meta.url)),e=A(()=>L(()=>import("./OrderTableRenderer-BtrR7anf.js"),__vite__mapDeps([6,1,2,3,4,7]),import.meta.url)),o=A(()=>L(()=>import("./TimelineRenderer-acXS5N5h.js"),__vite__mapDeps([8,1,2,3,4,9]),import.meta.url)),a=A(()=>L(()=>import("./EmailListRenderer-C890uErx.js"),__vite__mapDeps([10,1,2,3,4,11]),import.meta.url)),l=A(()=>L(()=>import("./GenericCardRenderer-C80DK4W7.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 a;default:return l}}const i={ChatBubbleRenderer:n,OrderTableRenderer:e,TimelineRenderer:o,EmailListRenderer:a,GenericCardRenderer:l,rendererFor:s,defineAsyncComponent:A,get getCategory(){return $}};return Object.defineProperty(i,"__isScriptSetup",{enumerable:!1,value:!0}),i}};function Fe(r,t,n,e,o,a){return u(),C(ae(e.rendererFor(n.event)),{event:n.event},null,8,["event"])}const De=F(Le,[["render",Fe],["__file","/tmp/cc-web-panel-aRyQTO/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 a=Number.isFinite(o.occurredAt)?o.occurredAt:null,l=a?new Date(a).toISOString():"",s=o.source&&o.source.adapter||"",i=o.content&&(o.content.text||o.content.title||o.content.subject)||"";return[o.id||"",o.subtype||"",a!=null?String(a):"",l,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),a=document.createElement("a");return a.href=o,a.download=t,document.body.appendChild(a),a.click(),document.body.removeChild(a),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"),a=String(n.getDate()).padStart(2,"0"),l=r==="ndjson"?"ndjson":r,s=t?`-${t}`:"";return`pdh-events-${e}-${o}-${a}${s}.${l}`}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 a(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 l({key:i}){try{const d=a(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:a,onClick:l,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 qe(r,t,n,e,o,a){const l=g("a-button"),s=g("a-menu-item"),i=g("a-menu"),d=g("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(l,{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 Be=F(Pe,[["render",qe],["__file","/tmp/cc-web-panel-aRyQTO/repo/packages/web-panel/src/components/pdh/ExportDropdown.vue"]]),Ve={__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 a(s,i){n.setFilter(s,i)}Q(()=>{!n.hasResults&&!n.isLoading&&n.search()});const l={store:n,emptyHint:e,onCategorySelect:o,onSetFilter:a,onMounted:Q,computed:w,get ReloadOutlined(){return ye},get usePdhBrowserStore(){return X},get categoryLabel(){return N},CategorySidebar:ke,SearchFilterBar:Ae,RendererDispatcher:De,ExportDropdown:Be};return Object.defineProperty(l,"__isScriptSetup",{enumerable:!1,value:!0}),l}},Ne={class:"pdh-browser-page"},Me={class:"page-header"},Qe={class:"main-pane"},Je={class:"results-summary"},Ue={key:0},ze={key:0},Ge={key:1},He={class:"loaded-of"},Ke={class:"results-list"},We={key:2,class:"load-more"};function Ye(r,t,n,e,o,a){const l=g("a-tag"),s=g("a-button"),i=g("a-space"),d=g("a-col"),_=g("a-spin"),T=g("a-alert"),j=g("a-empty"),h=g("a-row");return u(),S("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(l,{key:0,color:"green"},{default:m(()=>[...t[3]||(t[3]=[b("FTS5 trigram",-1)])]),_:1})):e.store.mode==="like"?(u(),C(l,{key:1,color:"orange"},{default:m(()=>[...t[4]||(t[4]=[b("LIKE 兜底",-1)])]),_:1})):R("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]=y=>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",Qe,[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]=y=>{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(),S("span",Ue,[c(_,{size:"small"}),t[7]||(t[7]=b(" 载入中… ",-1))])):(u(),S(V,{key:1},[v("strong",null,x(e.store.facets.total),1),t[11]||(t[11]=b(" 条事件 ",-1)),e.store.filters.category?(u(),S("span",ze,[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)])):R("v-if",!0),e.store.filters.q?(u(),S("span",Ge,[t[9]||(t[9]=b(' / 关键词 "',-1)),v("em",null,x(e.store.filters.q),1),t[10]||(t[10]=b('"',-1))])):R("v-if",!0),v("span",He," / 已显示 "+x(e.store.results.length),1)],64))]),e.store.error?(u(),C(T,{key:0,type:"error","show-icon":"",message:e.store.error,closable:"",style:{margin:"12px 0"}},null,8,["message"])):R("v-if",!0),!e.store.isLoading&&e.store.results.length===0&&!e.store.error?(u(),C(j,{key:1,description:e.emptyHint,style:{"margin-top":"40px"}},null,8,["description"])):R("v-if",!0),v("div",Ke,[(u(!0),S(V,null,se(e.store.results,(y,k)=>(u(),C(e.RendererDispatcher,{key:`r-${k}-${y.id}`,event:y},null,8,["event"]))),128))]),e.store.canLoadMore?(u(),S("div",We,[c(s,{loading:e.store.isAppending,onClick:t[2]||(t[2]=y=>e.store.loadMore()),block:""},{default:m(()=>[...t[12]||(t[12]=[b(" 加载下一页 (50 条) ",-1)])]),_:1},8,["loading"])])):R("v-if",!0)])]),_:1})]),_:1})])}const tt=F(Ve,[["render",Ye],["__scopeId","data-v-0f7c02cd"],["__file","/tmp/cc-web-panel-aRyQTO/repo/packages/web-panel/src/views/PdhVaultBrowser.vue"]]);export{tt as default};
@@ -1 +0,0 @@
1
- import{R as r}from"./index-BWgNn9As.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-BHonE9fU.js";import{a0 as t}from"./index-BWgNn9As.js";import"./vendor-BvqAck49.js";import"./index-BSpFe6j5.js";import"./icons-DP3uiYxy.js";const s=t(o);export{s as default};
@@ -1 +0,0 @@
1
- import{A as o}from"./Row-1MEtrgtF.js";import{a0 as t}from"./index-BWgNn9As.js";import"./vendor-BvqAck49.js";import"./responsiveObserve-BQFRzFeZ.js";import"./useFlexGapSupport-Q7bDZ3EI.js";import"./styleChecker-B-Suj978.js";import"./index-BSpFe6j5.js";import"./icons-DP3uiYxy.js";const l=t(o);export{l as default};