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.
- package/package.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-DcqNhZhA.js → AIOps-BrTOcqIJ.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-BigtmPoq.js → ActionButton-na9cocmf.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-1J_X_HF4.js → Analytics-BtDygkpt.js} +2 -2
- package/src/assets/web-panel/assets/{AppLayout-DlcDG_a_.js → AppLayout-D_t5CS18.js} +5 -5
- package/src/assets/web-panel/assets/{Audit-Do-y8_3w.js → Audit-BYMZccCy.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-S2Df-50Y.js → Backup-D2qDfAdL.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-D5kgWJfk.js → BaseInput-kj456Ju9.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-aUcp3kN1.js → Chat-BY0A0ZLE.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-D1VvrOPQ.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-DTg1U7Xs.js → Checkbox-DiBhtXsh.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-YO9ZZ4Ky.js → Codegen-B1ER0L0j.js} +1 -1
- package/src/assets/web-panel/assets/{Col-BHonE9fU.js → Col-CjLmza7D.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DA2AlEFh.js → Community-BNId05U7.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DULxLRNg.js → Compact-BuuMj7K1.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-BZqfuuZL.js → Compliance-DUuDycaJ.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-CJe3vyMS.js → Cowork-BKHiF6uL.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-CeV8AtRu.js → Cron-C7p-lHnC.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CAg66zS5.js → Crosschain-BvSOx8a6.js} +1 -1
- package/src/assets/web-panel/assets/{DID-Dtup5JZm.js → DID-D1k9jgHv.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DAR_8PNy.js → Dashboard-B9mCCnqY.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-K5bTaCYN.js → Dropdown-ge9UHSXF.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-C890uErx.js → EmailListRenderer-TZO7ppXi.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-B-Tj_8yM.js → FamilyGuardDashboard-DkhLJmzx.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-C6WZ98ni.js → Federation-JLuA_8zp.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-D-LTfGWd.js → FormItemContext-C4w-rzNg.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-C80DK4W7.js → GenericCardRenderer-Btns4sV9.js} +1 -1
- package/src/assets/web-panel/assets/{Git-Cjvvv3zW.js → Git-BheXMjzC.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-C0BND77H.js → Governance-D9rLlatH.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BL9kTtSu.js → Inference-DiklIMcd.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-CnVTBmJf.js → KnowledgeGraph-C70EWL03.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-CbCbg7K6.js → Logs-Zt_MLI10.js} +2 -2
- package/src/assets/web-panel/assets/{Marketplace-CG5On-fH.js → Marketplace-suQxES99.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-AYYDZZK7.js → McpTools-CclpCDpY.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-tMWbMDQq.js → Memory-B2lHOUwF.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BAOsf4wB.js → MobileBridge-BMXKoDAD.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-BT-2komQ.js → MobileProjects-a6mWVdBV.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BFwfC63n.js → Mtc-BFpM4Fkj.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-DYG3CWdH.js → MtcAudit-DDQkxkbS.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-KJwd0yWT.js → Multisig-Crkd_zKQ.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-BmL5dNWm.js → NLProgramming-Dpk5An7B.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-DmkaVaMc.js → Notes-BrFnOMNz.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-tmVQszDZ.js → NotificationSettings-CM0iApFM.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-BtrR7anf.js → OrderTableRenderer-XXjeqkdz.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-pppktQyW.js → Organization-CHFW_38T.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-D3lBoQDA.js → Overflow-C-vl3EjV.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BgE2qGlZ.js → P2P-BT7Slavq.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-DRUaULap.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-BR8no2Xe.js → Permissions-DkhOAvMz.js} +3 -3
- package/src/assets/web-panel/assets/{PersonalDataHub-DabbyQEF.js → PersonalDataHub-Dl7dSOvV.js} +2 -2
- package/src/assets/web-panel/assets/{Pipeline-n4sNpEz8.js → Pipeline-B3nVI4p6.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-CGNp4n8M.js → Privacy-Dv1SXx1Q.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CAVA5VsX.js → ProjectInit-DrAhVi5p.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-GCgkfM7A.js → ProjectSettings-h-ggCYN_.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-BYK17p52.js → Projects-CM91hYdr.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-DpUT5W-d.js → Providers-rfkZel3N.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-ZJxTb7vi.js → QuickAsk-XepZB7h_.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-CIzFRDk1.js → Recommend-DzQWsh1a.js} +1 -1
- package/src/assets/web-panel/assets/{Reputation-lQ_WDNZn.js → Reputation-CDeaal0j.js} +1 -1
- package/src/assets/web-panel/assets/{Row-1MEtrgtF.js → Row-BN4aKhFH.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-SSgcPPl4.js → RssFeed-INP6VYAA.js} +2 -2
- package/src/assets/web-panel/assets/{Search-CcTMOGNY.js → Search-ChPbwatu.js} +1 -1
- package/src/assets/web-panel/assets/{Security-BA1KMaDx.js → Security-C97ZCY8N.js} +3 -3
- package/src/assets/web-panel/assets/{Services-_aj7czZn.js → Services-Cbtl2Ajs.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-BWgg_0Zr.js → Skeleton-B13sFxBQ.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-C2ZIziYM.js → Skills-vI9zSIKX.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-CYxp4axY.js → Sla-Cr3oBH39.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-C7Csp1jV.js → SpeechSettings-BwemqPPV.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-svGeswiw.js → SyncSettings-CLA78P-Z.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-ClISj6oK.js → Tasks-DBjQ_DOM.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-CmO-Fp7r.js → Templates-BkSLDkBs.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-a3Ac3lxz.js → Tenant-Dn0nSlib.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-DyJIRh81.js → Terminal-C8f4boru.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-acXS5N5h.js → TimelineRenderer-DW_rMtJR.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DJW0KqV4.js → Tokens-BdffrKYV.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-0HeTi4r6.js → Trigger-CX4CUg-Q.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-aFym34eo.js → Trust-Cq9Bl7Od.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CYhszHJv.js → UkeySign-BQy18_VY.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BbJxPF9X.js → VideoEditing-h5hzK7Vw.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-DDthEwiu.js → Wallet-BLotT3gw.js} +2 -2
- package/src/assets/web-panel/assets/{WebAuthn-DQ6McYPg.js → WebAuthn-8cCANYLE.js} +2 -2
- package/src/assets/web-panel/assets/{WorkflowEditor-CnF8zRsi.js → WorkflowEditor-Db6NwtAv.js} +1 -1
- package/src/assets/web-panel/assets/{chat-Dzkx2gTP.js → chat-BPk1LbpL.js} +1 -1
- package/src/assets/web-panel/assets/{colors-35T51Oo5.js → colors-BnNal71p.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-TtzNrlu1.js → compact-item-W2VC0tcy.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-Y1LkWrYb.js → createContext-DceVsgnZ.js} +1 -1
- package/src/assets/web-panel/assets/devWarning--rwFDBhx.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-BOYw1BgS.js → hasIn-BEq6EDcp.js} +1 -1
- package/src/assets/web-panel/assets/{index-BtlJWaSP.js → index-5gIBUFBn.js} +1 -1
- package/src/assets/web-panel/assets/{index-CLqC2sRT.js → index-APCHxOkM.js} +1 -1
- package/src/assets/web-panel/assets/{index-C7Wt5feN.js → index-B2dMhwZi.js} +1 -1
- package/src/assets/web-panel/assets/{index-CqhwG1ox.js → index-B8cPjrEH.js} +1 -1
- package/src/assets/web-panel/assets/{index-BxWUEFKy.js → index-BDC5HsxZ.js} +1 -1
- package/src/assets/web-panel/assets/index-BPFuPGKi.js +1 -0
- package/src/assets/web-panel/assets/{index-NM9Oke2k.js → index-BUkDcIwJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BWgNn9As.js → index-BWcCyH6-.js} +3 -3
- package/src/assets/web-panel/assets/{index-CVrUs6rf.js → index-BgZikQoh.js} +1 -1
- package/src/assets/web-panel/assets/index-Bwjus13Y.js +1 -0
- package/src/assets/web-panel/assets/{index-D6tG4B25.js → index-BzSzRWsw.js} +1 -1
- package/src/assets/web-panel/assets/{index-DjeUZxE5.js → index-C1K9CsGr.js} +1 -1
- package/src/assets/web-panel/assets/{index-DmkG479D.js → index-CBZVISK6.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bw1iOGhM.js → index-CEJN-R2L.js} +1 -1
- package/src/assets/web-panel/assets/{index-G4ClSmJc.js → index-CG5dGC9E.js} +1 -1
- package/src/assets/web-panel/assets/{index-D47robkX.js → index-CMGLpstm.js} +1 -1
- package/src/assets/web-panel/assets/{index-BKRlWHUp.js → index-CWrGCndd.js} +1 -1
- package/src/assets/web-panel/assets/{index-DhMSOd_2.js → index-CbcvfpCV.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dx0hIfC-.js → index-Ceqv4lI2.js} +1 -1
- package/src/assets/web-panel/assets/{index-CdyFg4FI.js → index-CsT6frT8.js} +1 -1
- package/src/assets/web-panel/assets/{index-B7aKAZzS.js → index-D8PQKsDT.js} +1 -1
- package/src/assets/web-panel/assets/{index-8jffdb6b.js → index-DGncdA-j.js} +1 -1
- package/src/assets/web-panel/assets/{index-XIuZV9by.js → index-DHanQHO0.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dhfw-BXs.js → index-DaUBk28E.js} +1 -1
- package/src/assets/web-panel/assets/{index-hyqEKkBT.js → index-Di2J4b4V.js} +1 -1
- package/src/assets/web-panel/assets/{index-DAizH273.js → index-DtuLvWZN.js} +1 -1
- package/src/assets/web-panel/assets/{index-CPGNc2tF.js → index-DvS1J8xc.js} +1 -1
- package/src/assets/web-panel/assets/{index-KgXrlfNF.js → index-DxePJdwP.js} +1 -1
- package/src/assets/web-panel/assets/{index-DFhlelzN.js → index-Et4XvL49.js} +1 -1
- package/src/assets/web-panel/assets/{index-zF77jnI2.js → index-GlFxgcj4.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cs82BHAj.js → index-HV119Oui.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dof7lWA_.js → index-InGW87pj.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bs69SI96.js → index-P1-s8JR7.js} +1 -1
- package/src/assets/web-panel/assets/{index-D4BgCBa3.js → index-SdABCNoi.js} +1 -1
- package/src/assets/web-panel/assets/{index-BSpFe6j5.js → index-WTAZbN-c.js} +1 -1
- package/src/assets/web-panel/assets/{index-D7dCBw_M.js → index-_2I-KzOj.js} +1 -1
- package/src/assets/web-panel/assets/{index-BGPEaeB1.js → index-m1sVaWVU.js} +1 -1
- package/src/assets/web-panel/assets/{index-CZ16GlOs.js → index-s37wwyeN.js} +1 -1
- package/src/assets/web-panel/assets/{index-D2od7Bgx.js → index-tyWABqp9.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DD5y5msp.js → initDefaultProps-DzrCDb3j.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BuoutMia.js → motion-BQERVnE3.js} +1 -1
- package/src/assets/web-panel/assets/{move-DkpjqOXg.js → move-I9ACA5XJ.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BmGJD-v-.js → mtc-parser-Dd2Pw-tr.js} +1 -1
- package/src/assets/web-panel/assets/{omit-DftUE0Sz.js → omit-DwzYRzWV.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DDRb9FIu.js → pickAttrs-BSGULyIL.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-DPgtxOOD.js → placementArrow-tSYYjAts.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BQFRzFeZ.js → responsiveObserve-Dy2lqikT.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DQ4lmUSz.js → slide-RaB4Uq0c.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-C1TR4ZiQ.js → statusUtils-CBpC_wZg.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-B-Suj978.js → styleChecker-BEKwPWt5.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-Q7bDZ3EI.js → useFlexGapSupport-C4CnYJH1.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-DHjRLyQH.js → useFs-n24jutw5.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-lQOvCvCr.js → usePersonalDataHub-DMgS8F6G.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-Ie0g4-p3.js → vnode-BSp2KYcj.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-CHP0YEoH.js → zoom-7UfQtTPh.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agent.js +41 -2
- package/src/commands/compliance.js +3 -1
- package/src/commands/review.js +47 -17
- package/src/commands/session.js +11 -2
- package/src/gateways/ws/message-dispatcher.js +145 -165
- package/src/gateways/ws/ws-session-gateway.js +39 -5
- package/src/harness/jsonl-session-store.js +39 -12
- package/src/harness/worktree-isolator.js +5 -0
- package/src/lib/agent-core.js +1 -0
- package/src/lib/audit-logger.js +3 -1
- package/src/lib/chat-core.js +5 -2
- package/src/lib/chat-intent-service.js +68 -21
- package/src/lib/config-manager.js +25 -1
- package/src/lib/credential-guard.js +43 -1
- package/src/lib/git-integration.js +5 -0
- package/src/lib/interaction-adapter.js +32 -11
- package/src/lib/jsonl-session-store.js +1 -0
- package/src/lib/llm-config-defaults.js +37 -0
- package/src/lib/mcp-oauth.js +76 -10
- package/src/lib/permission-engine.js +4 -1
- package/src/lib/pipeline-orchestrator.js +20 -2
- package/src/lib/project-instructions.js +13 -0
- package/src/lib/repl-denials.js +137 -0
- package/src/lib/safe-json.js +22 -0
- package/src/lib/sandbox-v2.js +7 -6
- package/src/lib/search-command.js +65 -0
- package/src/lib/settings-hooks.cjs +133 -0
- package/src/lib/settings-loader.cjs +16 -7
- package/src/lib/social-graph.js +3 -1
- package/src/lib/stream-retry.js +27 -0
- package/src/lib/turn-context.js +15 -5
- package/src/repl/agent-repl.js +81 -8
- package/src/runtime/__tests__/message-roles.test.js +36 -3
- package/src/runtime/agent-core.js +175 -50
- package/src/runtime/coding-agent-contract-shared.cjs +9 -2
- package/src/runtime/coding-agent-shell-policy.cjs +23 -2
- package/src/runtime/file-ref-expander.js +51 -7
- package/src/runtime/headless-runner.js +83 -2
- package/src/runtime/headless-stream.js +69 -3
- package/src/runtime/mcp-config.js +42 -1
- package/src/runtime/message-roles.js +14 -1
- package/src/assets/web-panel/assets/ChatBubbleRenderer-Pg7dIsiE.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-D26Bz5gS.js +0 -7
- package/src/assets/web-panel/assets/devWarning-D_lwLZ6O.js +0 -1
- package/src/assets/web-panel/assets/index-CEwuCM44.js +0 -1
- 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 } =
|
|
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
|
-
|
|
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 } =
|
|
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
|
|
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};
|