chainlesschain 0.162.72 → 0.162.73
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-1bl50Cen.js → AIOps-DTI_-iZ_.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-Bw4kAx-1.js → ActionButton-CtpbGicW.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-junq7r42.js → Analytics-C1HwMd7E.js} +2 -2
- package/src/assets/web-panel/assets/{AppLayout-vf1TVGeu.js → AppLayout-Db953rqB.js} +5 -5
- package/src/assets/web-panel/assets/{Audit-CBzpgcL9.js → Audit-CuIi9Vup.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-ChwGPeP4.js → Backup-DwR7Wlve.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-2G2KGE6M.js → BaseInput-B5wNMp7S.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-Cr9NwfDA.js → Chat-DivalHgk.js} +4 -4
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CJvlo_ay.js → ChatBubbleRenderer-BwPSr02C.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-DN_5PBT7.js → Checkbox-CJrXPCJH.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-D4bluAgT.js → Codegen-BieZvOkC.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DBP3UjYW.js → Col-BzvPsQgb.js} +1 -1
- package/src/assets/web-panel/assets/{Community-ge-SvR3c.js → Community-CWcAMlpQ.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DGXvlGNv.js → Compact-Bj_BLBpw.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-Cn7nBsFQ.js → Compliance-DKvo0WAi.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DgHEO2de.js → Cowork-DRajk8JO.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-DUbYxPs0.js → Cron-DPz9MoUo.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-3J0MWPQq.js → Crosschain-BpSuvmns.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BR_Jpkh4.js → DID-Co98G00H.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-ffykLkAJ.js → Dashboard-8TSG0W7f.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DaI38dXT.js → Dropdown-CKViu7w3.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-CnIzkUVG.js → EmailListRenderer-BqfdADvJ.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-BxrgAAZg.js → FamilyGuardDashboard-aWu1imGZ.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BuS_FRh3.js → Federation-w4YpT8EN.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DBG-8g1w.js → FormItemContext-CAk4CXid.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-CmEc8RgH.js → GenericCardRenderer-MoJw4J2L.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CK10BYwY.js → Git-HNU_a9Jz.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-C8cABM_I.js → Governance-BkIXWYUS.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-Dr4_DIw3.js → Inference-CnquB88h.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-0_bLuvvb.js → KnowledgeGraph-PGSMF-uq.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-PVGZxt9z.js → Logs-DCc-nYzu.js} +2 -2
- package/src/assets/web-panel/assets/{Marketplace-BtVnS4HW.js → Marketplace-CyGX8XEt.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BVulusCC.js → McpTools-DBkZ5yUL.js} +4 -4
- package/src/assets/web-panel/assets/{Memory-DEMtNbJ9.js → Memory-DmYLRCwo.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-5QL654FQ.js → MobileBridge-CszJjeNc.js} +3 -3
- package/src/assets/web-panel/assets/{MobileProjects-G5Du9Thr.js → MobileProjects-DWgtDsta.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-CNFPJej0.js → Mtc-Bmt_Pmg4.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-DAJ81Cej.js → MtcAudit-BmG0ys0l.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-Cwj8tXfT.js → Multisig-DNd5iMmD.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Di0ptaL6.js → NLProgramming-yxbNl09B.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Cse_4Ox6.js → Notes-CQ0qAzI4.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-ntpoi5ec.js → NotificationSettings-CIzkE4ao.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-CbKsOM0D.js → OrderTableRenderer-e1VMUxTi.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-Bhjya5h9.js → Organization-BNBIlf_R.js} +2 -2
- package/src/assets/web-panel/assets/{Overflow-C0u3aive.js → Overflow-C5GzzJTq.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BWrTwf_a.js → P2P-DjL2jIED.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-pld2Qlqk.js → PdhVaultBrowser-C2EYDmpW.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-CW5FG3mE.js → Permissions-BVGCXxDp.js} +2 -2
- package/src/assets/web-panel/assets/{PersonalDataHub-BuBmqfDa.js → PersonalDataHub-B1xBro16.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-nZr06BNO.js → Pipeline-DIYWiDnt.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-B_XvMHYv.js → Privacy--Qx3QdO1.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CbRHJy85.js → ProjectInit-DYOEcV04.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CCH8SpEa.js → ProjectSettings-BcOx5-KS.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-D5Min2Fu.js → Projects-CO69txk4.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-DgCY5A8A.js → Providers-Bj8pCgzo.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DEcKTiTV.js → QuickAsk-Cukpq-4s.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BRaq2oKc.js → Recommend-DJB5wUfM.js} +1 -1
- package/src/assets/web-panel/assets/{Reputation-DzdbBdVv.js → Reputation-B9t0-nT0.js} +1 -1
- package/src/assets/web-panel/assets/{Row-Ds2JNh7c.js → Row-4cniRgxC.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-Bk1-t4Ie.js → RssFeed-Y4db_T9t.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DaVhRwoq.js → Search-DggZDzlc.js} +1 -1
- package/src/assets/web-panel/assets/{Security-D9mXjPSu.js → Security-C67A6kED.js} +2 -2
- package/src/assets/web-panel/assets/{Services-D8sukL97.js → Services-BocBjvaa.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-COCJt30X.js → Skeleton-C9jI-iOy.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-DtFPSPSc.js → Skills-2baFHKOW.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DIab-wjR.js → Sla-CnowXeRb.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-xxIH9hgB.js → SpeechSettings-DWGBkmUt.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-DrpxzJOH.js → SyncSettings-B89qwCgX.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-C1_WvNc0.js +1 -0
- package/src/assets/web-panel/assets/{Templates-COE-dSks.js → Templates-P8dBhbxa.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CLGObu4M.js → Tenant-DHo0pxrm.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-Bw8WBvW3.js → Terminal-Dr-HvjH-.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-D4gdk3Qb.js → TimelineRenderer-DM7dOaUR.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-CSoL_uAw.js → Tokens-DnJxqOPM.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BCRcowFi.js → Trigger-C-FLgMzr.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-D5QPZ198.js → Trust-CIT_RVqA.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-C7SsMqfZ.js → UkeySign-Cg9VS6y6.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-CDQ4HNZL.js → VideoEditing-BzoxE8mA.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-VmG4P_Fm.js → Wallet-ZkmCII8R.js} +2 -2
- package/src/assets/web-panel/assets/{WebAuthn-qtC0dZxA.js → WebAuthn-CptQdp3u.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-C_CSdk3l.js → WorkflowEditor-Vkz28khO.js} +1 -1
- package/src/assets/web-panel/assets/{chat-BGm8YCIo.js → chat-DXdmvvEA.js} +1 -1
- package/src/assets/web-panel/assets/{colors-BScOmAwk.js → colors-De7FCj5l.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-HDwaT31n.js → compact-item-DnT3XzME.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-CheSjPm8.js → createContext-ECZfCCqd.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-gaA8VqZf.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-C1_NbX0O.js → hasIn-Uodg6pAt.js} +1 -1
- package/src/assets/web-panel/assets/{index-DbfAaBxL.js → index-1dWvOqru.js} +1 -1
- package/src/assets/web-panel/assets/{index-D8xpncJ0.js → index-BC8SOuGi.js} +1 -1
- package/src/assets/web-panel/assets/{index-C6WXnaG4.js → index-BUMNJRCl.js} +1 -1
- package/src/assets/web-panel/assets/{index-DppSbT8L.js → index-Bg1RsfAJ.js} +3 -3
- package/src/assets/web-panel/assets/{index-KG9xVANC.js → index-Blo85ZKd.js} +1 -1
- package/src/assets/web-panel/assets/{index-B94_DZF-.js → index-BtJ8BHU0.js} +1 -1
- package/src/assets/web-panel/assets/{index-DoZwBGUX.js → index-C01WM7Pk.js} +1 -1
- package/src/assets/web-panel/assets/{index-eSBoP6E_.js → index-C4KhsGXo.js} +1 -1
- package/src/assets/web-panel/assets/{index-CSaztnyZ.js → index-C6JgjkY7.js} +1 -1
- package/src/assets/web-panel/assets/{index-Clqj2JTi.js → index-C9_Cnvha.js} +1 -1
- package/src/assets/web-panel/assets/{index-DzE-95XH.js → index-CCguvASR.js} +1 -1
- package/src/assets/web-panel/assets/{index-C71Z__li.js → index-CLzPxAp4.js} +1 -1
- package/src/assets/web-panel/assets/{index-ggl9cj35.js → index-CMuqxCVw.js} +1 -1
- package/src/assets/web-panel/assets/{index-DkiIxTIS.js → index-COTabJQd.js} +1 -1
- package/src/assets/web-panel/assets/{index-BKQordyU.js → index-CPjI3AGE.js} +1 -1
- package/src/assets/web-panel/assets/{index-DVyL9jbT.js → index-CaDZ-LMg.js} +1 -1
- package/src/assets/web-panel/assets/{index-lB5kN9Yc.js → index-CbbfcGeJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DDk0s3nO.js → index-CcLDjTgI.js} +1 -1
- package/src/assets/web-panel/assets/{index-D2gy4IX0.js → index-CffZBdA1.js} +1 -1
- package/src/assets/web-panel/assets/{index-C4FSaMAu.js → index-CwXP0KcT.js} +1 -1
- package/src/assets/web-panel/assets/{index-DB6gbgU2.js → index-D2YOclGO.js} +1 -1
- package/src/assets/web-panel/assets/{index-DhTELUKN.js → index-DBsl2SuZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-6C8mxO8j.js → index-DCvmjxu9.js} +1 -1
- package/src/assets/web-panel/assets/{index-CYkezxqK.js → index-DGwgEqwl.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dk2N6hxE.js → index-DOIeo8Qs.js} +1 -1
- package/src/assets/web-panel/assets/{index-KXrUKw1h.js → index-DPcpxSQt.js} +1 -1
- package/src/assets/web-panel/assets/index-DTpmiTGK.js +1 -0
- package/src/assets/web-panel/assets/{index-BMxPL1oG.js → index-Db33l8Ix.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cm55PcYG.js → index-Dbfj4QL5.js} +1 -1
- package/src/assets/web-panel/assets/{index-ByoUjX8f.js → index-Dd9Bx3tJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bd2zS3jK.js → index-Dkvf5upf.js} +1 -1
- package/src/assets/web-panel/assets/index-DwpvMYUU.js +1 -0
- package/src/assets/web-panel/assets/{index-i-xYmSsZ.js → index-Dy0AT-uc.js} +1 -1
- package/src/assets/web-panel/assets/{index-CxoOEb-l.js → index-FU8Zo5cp.js} +1 -1
- package/src/assets/web-panel/assets/{index-yKmudyK7.js → index-JVwNC4yP.js} +1 -1
- package/src/assets/web-panel/assets/{index-DaATJtzu.js → index-JqSxr1A7.js} +1 -1
- package/src/assets/web-panel/assets/{index-BGROuzQG.js → index-KV6dXwKC.js} +1 -1
- package/src/assets/web-panel/assets/{index-DSuWcpsv.js → index-LwNszM-5.js} +1 -1
- package/src/assets/web-panel/assets/{index-DQ01dBAS.js → index-cHnmjGqB.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-D7Q7zDzP.js → initDefaultProps-B3H1sf95.js} +1 -1
- package/src/assets/web-panel/assets/{motion-B4DcaqPb.js → motion-DreYO5eb.js} +1 -1
- package/src/assets/web-panel/assets/{move-CYxmYrFY.js → move-B0OVU04M.js} +1 -1
- package/src/assets/web-panel/assets/{omit-ze_9dKw3.js → omit-PcEEXHLZ.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-D24HrRSv.js → pickAttrs-DH6-hDkF.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BWJZVYyS.js → placementArrow-DFamUSEw.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-CseJia_L.js → responsiveObserve-DT1grAyh.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CBWNEpey.js → slide-41lCsY6d.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-f4e6p7yd.js → statusUtils-FzJ7j2T7.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-DZmfWZ8G.js → styleChecker-D0Zvn50h.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-4RBaBnVI.js → useFlexGapSupport-BTxsJE5n.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-Cv6bNoEA.js → useFs-DRVttEr3.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-DOTETJIA.js → usePersonalDataHub-BSe7NVv0.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DqS1K6-J.js → vnode-D8O7tUXh.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-C1MYzIJG.js → zoom-CMQc1RZ4.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agent.js +12 -0
- package/src/lib/agents.js +16 -5
- package/src/lib/output-styles.js +41 -7
- package/src/lib/project-root.cjs +87 -0
- package/src/lib/settings-hooks.cjs +18 -6
- package/src/lib/settings-loader.cjs +12 -5
- package/src/lib/slash-commands.js +18 -2
- package/src/runtime/agent-core.js +25 -4
- package/src/runtime/mcp-config.js +78 -1
- package/src/assets/web-panel/assets/Tasks-maiJ3jAT.js +0 -1
- package/src/assets/web-panel/assets/devWarning-CjO6o19j.js +0 -1
- package/src/assets/web-panel/assets/index--jhpSxS1.js +0 -1
- package/src/assets/web-panel/assets/index-J4Rzclyc.js +0 -1
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* project-root — locate the nearest ancestor project root by walking up from a
|
|
3
|
+
* starting directory until a `.git` marker is found.
|
|
4
|
+
*
|
|
5
|
+
* Shared by the `.claude` / `.chainlesschain` discovery layers (settings.json
|
|
6
|
+
* permission rules, output-styles, slash-commands, sub-agents) so that running
|
|
7
|
+
* `cc` from a project SUBDIRECTORY still picks up the project-root config —
|
|
8
|
+
* Claude-Code 2.1.178 "closest `.claude` directory wins" parity. This mirrors
|
|
9
|
+
* the git-root resolution already used by skill-loader + project-instructions,
|
|
10
|
+
* which previously left these four layers as the only cwd-only stragglers (so a
|
|
11
|
+
* subdir run silently dropped the project's permission rules — a safety gap).
|
|
12
|
+
*
|
|
13
|
+
* A single `.cjs` module so the CJS `settings-loader` can `require` it and the
|
|
14
|
+
* ESM loaders can `import` it — one source of truth for the walk.
|
|
15
|
+
*
|
|
16
|
+
* DEFENSIVE BY DESIGN: callers thread their own (often mocked) `fs` / `path`
|
|
17
|
+
* through `deps`. If `.git` is not found via that `fs`, or the injected `path`
|
|
18
|
+
* lacks `dirname` / `resolve`, the walk bails to `null` and the caller keeps its
|
|
19
|
+
* existing cwd-only behavior unchanged — keeping the heavily-mocked unit tests
|
|
20
|
+
* green while real runs (real `node:path`) walk up correctly.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
const fsDefault = require("node:fs");
|
|
24
|
+
const pathDefault = require("node:path");
|
|
25
|
+
|
|
26
|
+
const _deps = { fs: fsDefault, path: pathDefault };
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Walk up from `cwd` to the nearest directory containing `.git`. Returns the
|
|
30
|
+
* resolved root path, or `null` when none is found (or deps are unusable).
|
|
31
|
+
* @param {string} cwd
|
|
32
|
+
* @param {{ fs?: object, path?: object }} [deps]
|
|
33
|
+
*/
|
|
34
|
+
function findGitProjectRoot(cwd, deps = {}) {
|
|
35
|
+
const fs = deps.fs || _deps.fs;
|
|
36
|
+
const path = deps.path || _deps.path;
|
|
37
|
+
if (!fs || typeof fs.existsSync !== "function") return null;
|
|
38
|
+
if (!path || typeof path.dirname !== "function" || typeof path.join !== "function") {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
let dir;
|
|
42
|
+
try {
|
|
43
|
+
dir = typeof path.resolve === "function" ? path.resolve(cwd || ".") : String(cwd || ".");
|
|
44
|
+
} catch {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
// Bounded walk (64 levels) so a malformed `dirname` can never spin forever.
|
|
48
|
+
for (let i = 0; i < 64 && dir; i++) {
|
|
49
|
+
try {
|
|
50
|
+
if (fs.existsSync(path.join(dir, ".git"))) return dir;
|
|
51
|
+
} catch {
|
|
52
|
+
/* unreadable dir → keep walking up */
|
|
53
|
+
}
|
|
54
|
+
let parent;
|
|
55
|
+
try {
|
|
56
|
+
parent = path.dirname(dir);
|
|
57
|
+
} catch {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
if (!parent || parent === dir) break;
|
|
61
|
+
dir = parent;
|
|
62
|
+
}
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* The extra project-root base directory to ADD to a cwd-based discovery list
|
|
68
|
+
* when running from a subdirectory. Returns the git root when it exists AND is a
|
|
69
|
+
* strict ancestor of `cwd`; returns `null` when `cwd` is itself the root (its
|
|
70
|
+
* own dirs already cover it) or no root is found.
|
|
71
|
+
* @param {string} cwd
|
|
72
|
+
* @param {{ fs?: object, path?: object }} [deps]
|
|
73
|
+
*/
|
|
74
|
+
function projectRootBase(cwd, deps = {}) {
|
|
75
|
+
const root = findGitProjectRoot(cwd, deps);
|
|
76
|
+
if (!root) return null;
|
|
77
|
+
const path = deps.path || _deps.path;
|
|
78
|
+
let resolvedCwd = cwd;
|
|
79
|
+
try {
|
|
80
|
+
if (path && typeof path.resolve === "function") resolvedCwd = path.resolve(cwd || ".");
|
|
81
|
+
} catch {
|
|
82
|
+
/* fall through with raw cwd */
|
|
83
|
+
}
|
|
84
|
+
return root === resolvedCwd ? null : root;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
module.exports = { findGitProjectRoot, projectRootBase, _deps };
|
|
@@ -28,6 +28,7 @@ const path = require("node:path");
|
|
|
28
28
|
const os = require("node:os");
|
|
29
29
|
const fsDefault = require("node:fs");
|
|
30
30
|
const { SUGGEST_UMBRELLA } = require("./permission-rules.cjs");
|
|
31
|
+
const { projectRootBase } = require("./project-root.cjs");
|
|
31
32
|
|
|
32
33
|
const _deps = { fs: fsDefault, homedir: () => os.homedir() };
|
|
33
34
|
|
|
@@ -44,14 +45,25 @@ const HOOK_EVENTS = Object.freeze([
|
|
|
44
45
|
"Notification",
|
|
45
46
|
]);
|
|
46
47
|
|
|
47
|
-
/**
|
|
48
|
+
/**
|
|
49
|
+
* Same hierarchy as settings-loader (user < project-root < cwd < --settings).
|
|
50
|
+
* When run from a SUBDIRECTORY, the project-root `.claude` hooks apply (below
|
|
51
|
+
* cwd's, above the user layer) — same walk-up as settings-loader's settingsPaths
|
|
52
|
+
* (shared `projectRootBase`, threaded through this loader's own `_deps.fs` to
|
|
53
|
+
* keep test injection intact). Hooks RUN SHELL COMMANDS, so a guard hook in the
|
|
54
|
+
* project-root settings must NOT silently vanish when `cc` is invoked from a
|
|
55
|
+
* subdirectory. `projectRootBase` returns null when cwd IS the root.
|
|
56
|
+
*/
|
|
48
57
|
function settingsFiles(cwd, explicitFile) {
|
|
49
58
|
const home = _deps.homedir();
|
|
50
|
-
const list = [
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
path.join(
|
|
54
|
-
|
|
59
|
+
const list = [path.join(home, ".claude", "settings.json")];
|
|
60
|
+
const root = projectRootBase(cwd, { fs: _deps.fs, path });
|
|
61
|
+
if (root) {
|
|
62
|
+
list.push(path.join(root, ".claude", "settings.json"));
|
|
63
|
+
list.push(path.join(root, ".claude", "settings.local.json"));
|
|
64
|
+
}
|
|
65
|
+
list.push(path.join(cwd, ".claude", "settings.json"));
|
|
66
|
+
list.push(path.join(cwd, ".claude", "settings.local.json"));
|
|
55
67
|
if (explicitFile) list.push(path.resolve(cwd, explicitFile));
|
|
56
68
|
return list;
|
|
57
69
|
}
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
const fsDefault = require("node:fs");
|
|
28
28
|
const path = require("node:path");
|
|
29
29
|
const os = require("node:os");
|
|
30
|
+
const { projectRootBase } = require("./project-root.cjs");
|
|
30
31
|
|
|
31
32
|
const _deps = { fs: fsDefault, homedir: () => os.homedir() };
|
|
32
33
|
|
|
@@ -72,11 +73,17 @@ function accrete(target, sources, arr, file, kind) {
|
|
|
72
73
|
/** The ordered list of candidate settings files for a cwd. */
|
|
73
74
|
function settingsPaths(cwd, explicitFile) {
|
|
74
75
|
const home = _deps.homedir();
|
|
75
|
-
const list = [
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
76
|
+
const list = [path.join(home, ".claude", "settings.json")];
|
|
77
|
+
// When run from a subdirectory, the project-root `.claude` sits BELOW cwd's
|
|
78
|
+
// own (closest wins) but ABOVE the user layer — so its rules apply yet a
|
|
79
|
+
// cwd-local settings file still overrides them. Null when cwd IS the root.
|
|
80
|
+
const root = projectRootBase(cwd, { fs: _deps.fs, path });
|
|
81
|
+
if (root) {
|
|
82
|
+
list.push(path.join(root, ".claude", "settings.json"));
|
|
83
|
+
list.push(path.join(root, ".claude", "settings.local.json"));
|
|
84
|
+
}
|
|
85
|
+
list.push(path.join(cwd, ".claude", "settings.json"));
|
|
86
|
+
list.push(path.join(cwd, ".claude", "settings.local.json"));
|
|
80
87
|
if (explicitFile) list.push(path.resolve(cwd, explicitFile));
|
|
81
88
|
return list;
|
|
82
89
|
}
|
|
@@ -23,6 +23,7 @@ import pathDefault from "node:path";
|
|
|
23
23
|
import { homedir } from "node:os";
|
|
24
24
|
import { execSync as execSyncDefault } from "node:child_process";
|
|
25
25
|
import { expandFileRefs } from "../runtime/file-ref-expander.js";
|
|
26
|
+
import { projectRootBase } from "./project-root.cjs";
|
|
26
27
|
|
|
27
28
|
const _deps = { fs: fsDefault, path: pathDefault, execSync: execSyncDefault };
|
|
28
29
|
|
|
@@ -62,16 +63,31 @@ export const BANG_TIMEOUT_MS = 10_000;
|
|
|
62
63
|
* on a name clash). `opts.home` overrides the personal root for tests.
|
|
63
64
|
*/
|
|
64
65
|
export function commandDirs(cwd = process.cwd(), opts = {}) {
|
|
66
|
+
const fs = opts.deps?.fs || _deps.fs;
|
|
65
67
|
const path = opts.deps?.path || _deps.path;
|
|
66
68
|
const home = opts.home || homedir();
|
|
67
69
|
// Project-native `.chainlesschain/commands/` takes precedence, then the
|
|
68
70
|
// Claude-Code-portable `.claude/commands/` (so existing definitions work
|
|
69
71
|
// unchanged), then personal. Both project dirs share the "project" scope.
|
|
70
|
-
|
|
72
|
+
const dirs = [
|
|
71
73
|
{ dir: path.join(cwd, ".chainlesschain", "commands"), scope: "project" },
|
|
72
74
|
{ dir: path.join(cwd, ".claude", "commands"), scope: "project" },
|
|
73
|
-
{ dir: path.join(home, ".claude", "commands"), scope: "personal" },
|
|
74
75
|
];
|
|
76
|
+
// Subdirectory run: also scan the project-root `.claude` (cwd stays closest
|
|
77
|
+
// and wins on a name clash via discoverCommands' reverse + last-write-wins).
|
|
78
|
+
const root = projectRootBase(cwd, { fs, path });
|
|
79
|
+
if (root) {
|
|
80
|
+
dirs.push({
|
|
81
|
+
dir: path.join(root, ".chainlesschain", "commands"),
|
|
82
|
+
scope: "project",
|
|
83
|
+
});
|
|
84
|
+
dirs.push({
|
|
85
|
+
dir: path.join(root, ".claude", "commands"),
|
|
86
|
+
scope: "project",
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
dirs.push({ dir: path.join(home, ".claude", "commands"), scope: "personal" });
|
|
90
|
+
return dirs;
|
|
75
91
|
}
|
|
76
92
|
|
|
77
93
|
/** Recursively collect `*.md` files under `dir` as `{file, rel}` (rel uses /). */
|
|
@@ -3587,12 +3587,32 @@ export async function* agentLoop(messages, options) {
|
|
|
3587
3587
|
try {
|
|
3588
3588
|
const compactor = await _getAutoCompactor(options);
|
|
3589
3589
|
if (compactor && compactor.shouldAutoCompact(messages)) {
|
|
3590
|
+
// Cheap surgical pre-pass (Claude-Code microcompact parity): trim old
|
|
3591
|
+
// large tool results IN PLACE before the disruptive full
|
|
3592
|
+
// summarization. If the trim brings the context back under threshold,
|
|
3593
|
+
// the full compaction below is skipped this round — so heavy-tool
|
|
3594
|
+
// conversations rarely hit a full summarize. Opt out:
|
|
3595
|
+
// autoMicroCompact: false.
|
|
3596
|
+
if (options.autoMicroCompact !== false) {
|
|
3597
|
+
try {
|
|
3598
|
+
const { microCompact } = await import("../lib/micro-compact.js");
|
|
3599
|
+
const mc = microCompact(messages);
|
|
3600
|
+
if (mc.stats.trimmed > 0) {
|
|
3601
|
+
messages.splice(0, messages.length, ...mc.messages);
|
|
3602
|
+
yield { type: "micro-compaction", runId, stats: mc.stats };
|
|
3603
|
+
}
|
|
3604
|
+
} catch {
|
|
3605
|
+
// microcompact is best-effort — never break the run
|
|
3606
|
+
}
|
|
3607
|
+
}
|
|
3608
|
+
// After the trim, is the full (disruptive) compaction still needed?
|
|
3609
|
+
const needFull = compactor.shouldAutoCompact(messages);
|
|
3590
3610
|
// settings.json PreCompact hooks: a `block` decision SKIPS this
|
|
3591
3611
|
// compaction round (e.g. the hook archived / owns the history). Fires
|
|
3592
3612
|
// right before the history would be compacted.
|
|
3593
3613
|
let preCompactBlocked = false;
|
|
3594
3614
|
let preCompactReason = null;
|
|
3595
|
-
if (options.settingsHooks) {
|
|
3615
|
+
if (needFull && options.settingsHooks) {
|
|
3596
3616
|
try {
|
|
3597
3617
|
const pc = runObserveHooks(
|
|
3598
3618
|
options.settingsHooks,
|
|
@@ -3619,9 +3639,10 @@ export async function* agentLoop(messages, options) {
|
|
|
3619
3639
|
reason: preCompactReason,
|
|
3620
3640
|
};
|
|
3621
3641
|
}
|
|
3622
|
-
const { messages: compacted, stats } =
|
|
3623
|
-
|
|
3624
|
-
|
|
3642
|
+
const { messages: compacted, stats } =
|
|
3643
|
+
!needFull || preCompactBlocked
|
|
3644
|
+
? { messages, stats: { saved: 0 } }
|
|
3645
|
+
: await compactor.compress(messages, { preserveToolPairs: true });
|
|
3625
3646
|
if (stats.saved > 0 && compacted.length < messages.length) {
|
|
3626
3647
|
messages.splice(0, messages.length, ...compacted);
|
|
3627
3648
|
// Persist the compaction so a later --resume rebuilds from the
|
|
@@ -15,7 +15,9 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import fs from "fs";
|
|
18
|
+
import path from "path";
|
|
18
19
|
import { MCPClient } from "../harness/mcp-client.js";
|
|
20
|
+
import { projectRootBase } from "../lib/project-root.cjs";
|
|
19
21
|
import {
|
|
20
22
|
discoverIdeServer,
|
|
21
23
|
ideServerToMcpConfig,
|
|
@@ -375,10 +377,73 @@ export async function loadIdeMcp(opts = {}, deps = {}) {
|
|
|
375
377
|
return out;
|
|
376
378
|
}
|
|
377
379
|
|
|
380
|
+
/**
|
|
381
|
+
* Discover + connect a project-scoped `.mcp.json` (Claude-Code parity). Reads a
|
|
382
|
+
* `.mcp.json` from the git project root (walked up from cwd, same as the
|
|
383
|
+
* `.claude` config layers) and from cwd itself, merging their `mcpServers`
|
|
384
|
+
* (cwd wins on a name clash — closest wins). Best-effort: a missing / empty /
|
|
385
|
+
* malformed file contributes nothing and never throws.
|
|
386
|
+
*
|
|
387
|
+
* SECURITY: a checked-in `.mcp.json` can spawn arbitrary commands, so this layer
|
|
388
|
+
* is OPT-IN (default-off) — it only runs when explicitly enabled with
|
|
389
|
+
* `--project-mcp` / `CC_PROJECT_MCP=1` (truthy). When enabled, the servers it
|
|
390
|
+
* loads are announced via writeErr. Connected into `deps.into`, so an explicit
|
|
391
|
+
* `--mcp-config` server or a registered (`cc mcp add`) server WINS on a name
|
|
392
|
+
* clash (the first batch wins in setupMcpFromConfig).
|
|
393
|
+
*
|
|
394
|
+
* @param {object} opts { cwd?, env? }
|
|
395
|
+
* @param {object} [deps] { writeErr, into, readFile, fileExists, createClient }
|
|
396
|
+
*/
|
|
397
|
+
export async function loadProjectMcp(opts = {}, deps = {}) {
|
|
398
|
+
const env = opts.env || process.env;
|
|
399
|
+
// Opt-in gate (default-off): only load a project `.mcp.json` when explicitly
|
|
400
|
+
// enabled — a checked-in file spawning commands in any cloned repo is a
|
|
401
|
+
// supply-chain risk, so the user must turn it on per run / per shell.
|
|
402
|
+
const flag = String(env.CC_PROJECT_MCP || "").toLowerCase();
|
|
403
|
+
if (flag !== "1" && flag !== "true") return deps.into || null;
|
|
404
|
+
const cwd = opts.cwd || process.cwd();
|
|
405
|
+
const readFile = deps.readFile || ((p) => fs.readFileSync(p, "utf-8"));
|
|
406
|
+
const fileExists = deps.fileExists || ((p) => fs.existsSync(p));
|
|
407
|
+
const writeErr = deps.writeErr || (() => {});
|
|
408
|
+
|
|
409
|
+
// Project-root `.mcp.json` (below cwd's), then cwd's own — so a cwd-local file
|
|
410
|
+
// overrides the root on a name clash. projectRootBase() is null when cwd IS
|
|
411
|
+
// the root (its own file already covers it) or there is no git project.
|
|
412
|
+
const files = [];
|
|
413
|
+
const root = projectRootBase(cwd, { fs, path });
|
|
414
|
+
if (root) files.push(path.join(root, ".mcp.json"));
|
|
415
|
+
files.push(path.join(cwd, ".mcp.json"));
|
|
416
|
+
|
|
417
|
+
const servers = {};
|
|
418
|
+
const seenFiles = [];
|
|
419
|
+
for (const file of files) {
|
|
420
|
+
if (!fileExists(file)) continue;
|
|
421
|
+
let raw;
|
|
422
|
+
try {
|
|
423
|
+
raw = JSON.parse(readFile(file));
|
|
424
|
+
} catch (err) {
|
|
425
|
+
writeErr(` mcp: ignoring malformed ${file} (${err.message})\n`);
|
|
426
|
+
continue;
|
|
427
|
+
}
|
|
428
|
+
const parsed = parseMcpServers(raw);
|
|
429
|
+
if (Object.keys(parsed).length > 0) {
|
|
430
|
+
Object.assign(servers, parsed); // later file (cwd) overrides earlier (root)
|
|
431
|
+
seenFiles.push(file);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
if (Object.keys(servers).length === 0) return deps.into || null;
|
|
435
|
+
writeErr(
|
|
436
|
+
` mcp: ${Object.keys(servers).length} server(s) from project .mcp.json ` +
|
|
437
|
+
`(${seenFiles.join(", ")}) — loaded via --project-mcp\n`,
|
|
438
|
+
);
|
|
439
|
+
return setupMcpFromConfig(servers, deps);
|
|
440
|
+
}
|
|
441
|
+
|
|
378
442
|
/**
|
|
379
443
|
* Resolve the full MCP tool surface for one agent run: the ad-hoc
|
|
380
444
|
* `--mcp-config` file (if any) PLUS registered auto-connect servers (unless
|
|
381
|
-
* disabled) PLUS
|
|
445
|
+
* disabled) PLUS a project-scoped `.mcp.json` (opt-in, `--project-mcp`) PLUS an
|
|
446
|
+
* auto-discovered IDE bridge, connected into a single client.
|
|
382
447
|
* Returns the combined `{mcpClient, extraToolDefinitions, ...}` or null when
|
|
383
448
|
* there's nothing. Throws only on a bad `--mcp-config` file (explicit request).
|
|
384
449
|
*
|
|
@@ -391,6 +456,7 @@ export async function loadIdeMcp(opts = {}, deps = {}) {
|
|
|
391
456
|
export async function resolveAgentMcp(args = {}, deps = {}) {
|
|
392
457
|
const doFile = deps.loadMcpConfig || loadMcpConfig;
|
|
393
458
|
const doReg = deps.loadRegisteredMcp || loadRegisteredMcp;
|
|
459
|
+
const doProject = deps.loadProjectMcp || loadProjectMcp;
|
|
394
460
|
const doIde = deps.loadIdeMcp || loadIdeMcp;
|
|
395
461
|
// Thread the agent session id down to setupMcpFromConfig so spawned stdio MCP
|
|
396
462
|
// servers get CC_SESSION_ID / CLAUDE_CODE_SESSION_ID (Claude-Code parity).
|
|
@@ -413,6 +479,17 @@ export async function resolveAgentMcp(args = {}, deps = {}) {
|
|
|
413
479
|
into: result || undefined,
|
|
414
480
|
});
|
|
415
481
|
}
|
|
482
|
+
// Project-scoped `.mcp.json` (Claude-Code parity). After --mcp-config +
|
|
483
|
+
// registered (those win on a name clash), before IDE auto-discovery. Skipped
|
|
484
|
+
// under --strict-mcp-config (returned above). OPT-IN: loadProjectMcp is a
|
|
485
|
+
// no-op unless --project-mcp / CC_PROJECT_MCP=1 is set (default-off — a
|
|
486
|
+
// checked-in .mcp.json can spawn commands). `projectMcp:false` hard-skips it.
|
|
487
|
+
if (args.projectMcp !== false) {
|
|
488
|
+
result = await doProject(
|
|
489
|
+
{ cwd: args.cwd, env: args.env || process.env },
|
|
490
|
+
{ ...fwd, into: result || undefined },
|
|
491
|
+
);
|
|
492
|
+
}
|
|
416
493
|
if (args.ide !== false) {
|
|
417
494
|
const env = args.env || process.env;
|
|
418
495
|
const inIde = (deps.isInIdeTerminal || isInIdeTerminal)(env);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{E as B,b as z,r as D,I as p,J as c,U as _,c as n,K as a,S,V as w,o as P,x as I,P as i,Q as g,R as r,F as h,Z as F}from"./vendor-BvqAck49.js";import{u as R,_ as O}from"./index-DppSbT8L.js";import{R as E}from"./icons-DP3uiYxy.js";const V=B("tasks",()=>{const k=D([]),l=D(!1);let u=null,e=null;const x=z(()=>k.value.filter(t=>t.status==="running")),b=z(()=>k.value.filter(t=>t.status==="pending")),y=z(()=>k.value.filter(t=>t.status==="completed"||t.status==="failed"||t.status==="timeout"));async function f(){const t=R();l.value=!0;try{const s=await t.sendRaw({type:"tasks-list"});s&&Array.isArray(s.tasks)&&(k.value=s.tasks)}catch{}finally{l.value=!1}}async function o(t){const s=R();try{await s.sendRaw({type:"tasks-stop",taskId:t})}catch{}finally{await f()}}const d=D(null);function m(t=5e3){v(),f(),u=setInterval(f,t),T()}function v(){u&&(clearInterval(u),u=null),e&&(e(),e=null)}function T(){const t=R();if(e)return;const s=C=>{C.type==="task:notification"&&C.payload?.task&&(d.value=C.payload.task,f(),setTimeout(()=>{d.value=null},8e3))};e=t.onRuntimeEvent(s)}function N(t){return!t||t<0?"-":t<1e3?`${t}ms`:t<6e4?`${(t/1e3).toFixed(1)}s`:`${(t/6e4).toFixed(1)}m`}function A(t){switch(t){case"running":return"processing";case"pending":return"default";case"completed":return"success";case"failed":return"error";case"timeout":return"warning";default:return"default"}}return{tasks:k,loading:l,running:x,pending:b,completed:y,lastNotification:d,fetchTasks:f,stopTask:o,startPolling:m,stopPolling:v,formatDuration:N,getStatusColor:A}}),U={__name:"Tasks",setup(k,{expose:l}){l();const u=V(),e=[{title:"状态",key:"status",width:90},{title:"描述",key:"description",ellipsis:!0},{title:"类型",dataIndex:"type",width:100},{title:"耗时",key:"duration",width:90},{title:"创建时间",key:"createdAt",width:180},{title:"结果",key:"result",ellipsis:!0},{title:"操作",key:"action",width:80}];function x(o){return o.status==="running"&&o.startedAt?u.formatDuration(Date.now()-o.startedAt):o.completedAt&&o.startedAt?u.formatDuration(o.completedAt-o.startedAt):"-"}function b(o){return o?new Date(o).toLocaleString():"-"}function y(o,d){return o?o.length>d?`${o.slice(0,d)}...`:o:""}P(()=>u.startPolling(5e3)),I(()=>u.stopPolling());const f={store:u,columns:e,getDuration:x,formatTime:b,truncate:y,onMounted:P,onUnmounted:I,get ReloadOutlined(){return E},get useTasksStore(){return V}};return Object.defineProperty(f,"__isScriptSetup",{enumerable:!1,value:!0}),f}},L={class:"page-header"},j={key:0,class:"error-text"},q={key:1},J={class:"task-header"},K={class:"task-desc"},M={class:"task-id"},Q={class:"task-meta"},W=["title"],Z={key:0,class:"error-text"},G={key:1,class:"success-text"},H={key:2,class:"muted-text"};function X(k,l,u,e,x,b){const y=p("a-button"),f=p("a-space"),o=p("a-alert"),d=p("a-statistic"),m=p("a-card"),v=p("a-col"),T=p("a-row"),N=p("a-tag"),A=p("a-table");return i(),c("div",null,[_("div",L,[l[3]||(l[3]=_("div",null,[_("h2",{class:"page-title"},"后台任务"),_("p",{class:"page-sub"},"查看后台任务队列、实时通知和任务执行结果。")],-1)),n(f,null,{default:a(()=>[n(y,{ghost:"",loading:e.store.loading,onClick:l[0]||(l[0]=t=>e.store.fetchTasks())},{icon:a(()=>[n(e.ReloadOutlined)]),default:a(()=>[l[2]||(l[2]=g(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),e.store.lastNotification?(i(),S(o,{key:0,type:e.store.lastNotification.status==="completed"?"success":"error","show-icon":"",closable:"",class:"banner",onClose:l[1]||(l[1]=t=>e.store.lastNotification=null)},{message:a(()=>[g(" 任务"+r(e.store.lastNotification.status==="completed"?"完成":"结束")+": "+r(e.store.lastNotification.description||e.store.lastNotification.id.slice(0,16)),1)]),description:a(()=>[e.store.lastNotification.error?(i(),c("span",j,r(e.store.lastNotification.error),1)):e.store.lastNotification.result?(i(),c("span",q,r(e.truncate(String(e.store.lastNotification.result),120)),1)):w("v-if",!0)]),_:1},8,["type"])):w("v-if",!0),n(T,{gutter:[16,16],class:"stats-row"},{default:a(()=>[n(v,{xs:12,sm:6},{default:a(()=>[n(m,{class:"stat-card",size:"small"},{default:a(()=>[n(d,{title:"全部任务",value:e.store.tasks.length},null,8,["value"])]),_:1})]),_:1}),n(v,{xs:12,sm:6},{default:a(()=>[n(m,{class:"stat-card",size:"small"},{default:a(()=>[n(d,{title:"运行中",value:e.store.running.length},null,8,["value"])]),_:1})]),_:1}),n(v,{xs:12,sm:6},{default:a(()=>[n(m,{class:"stat-card",size:"small"},{default:a(()=>[n(d,{title:"等待中",value:e.store.pending.length},null,8,["value"])]),_:1})]),_:1}),n(v,{xs:12,sm:6},{default:a(()=>[n(m,{class:"stat-card",size:"small"},{default:a(()=>[n(d,{title:"已完成",value:e.store.completed.length},null,8,["value"])]),_:1})]),_:1})]),_:1}),e.store.running.length>0?(i(),S(m,{key:1,title:"运行中的任务",class:"panel-card",size:"small"},{default:a(()=>[(i(!0),c(h,null,F(e.store.running,t=>(i(),c("div",{key:t.id,class:"task-item running"},[_("div",J,[n(N,{color:e.store.getStatusColor(t.status)},{default:a(()=>[g(r(t.status.toUpperCase()),1)]),_:2},1032,["color"]),_("span",K,r(t.description),1),_("span",M,r(t.id.slice(0,16)),1)]),_("div",Q,[_("span",null,"类型: "+r(t.type||"-"),1),_("span",null,"已运行: "+r(e.store.formatDuration(Date.now()-t.startedAt)),1),n(y,{size:"small",danger:"",onClick:s=>e.store.stopTask(t.id)},{default:a(()=>[...l[4]||(l[4]=[g("停止",-1)])]),_:1},8,["onClick"])])]))),128))]),_:1})):w("v-if",!0),n(m,{class:"panel-card"},{default:a(()=>[n(A,{columns:e.columns,"data-source":e.store.tasks,pagination:{pageSize:15,size:"small"},loading:e.store.loading,"row-key":"id",size:"small"},{bodyCell:a(({column:t,record:s})=>[t.key==="status"?(i(),S(N,{key:0,color:e.store.getStatusColor(s.status)},{default:a(()=>[g(r(s.status),1)]),_:2},1032,["color"])):t.key==="description"?(i(),c("span",{key:1,title:s.command},r(s.description),9,W)):t.key==="duration"?(i(),c(h,{key:2},[g(r(e.getDuration(s)),1)],64)):t.key==="createdAt"?(i(),c(h,{key:3},[g(r(e.formatTime(s.createdAt)),1)],64)):t.key==="result"?(i(),c(h,{key:4},[s.error?(i(),c("span",Z,r(e.truncate(s.error,60)),1)):s.result?(i(),c("span",G,r(e.truncate(String(s.result),60)),1)):(i(),c("span",H,"-"))],64)):t.key==="action"?(i(),c(h,{key:5},[s.status==="running"?(i(),S(y,{key:0,size:"small",danger:"",onClick:C=>e.store.stopTask(s.id)},{default:a(()=>[...l[5]||(l[5]=[g(" 停止 ",-1)])]),_:1},8,["onClick"])):w("v-if",!0)],64)):w("v-if",!0)]),_:1},8,["data-source","loading"])]),_:1})])}const et=O(U,[["render",X],["__scopeId","data-v-da5ff6a2"],["__file","/tmp/cc-web-panel-qgRwCf/repo/packages/web-panel/src/views/Tasks.vue"]]);export{et as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{O as r}from"./index-DppSbT8L.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as o}from"./Row-Ds2JNh7c.js";import{U as t}from"./index-DppSbT8L.js";import"./vendor-BvqAck49.js";import"./responsiveObserve-CseJia_L.js";import"./useFlexGapSupport-4RBaBnVI.js";import"./styleChecker-DZmfWZ8G.js";import"./index-D2gy4IX0.js";import"./icons-DP3uiYxy.js";const l=t(o);export{l as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as o}from"./Col-DBP3UjYW.js";import{U as t}from"./index-DppSbT8L.js";import"./vendor-BvqAck49.js";import"./index-D2gy4IX0.js";import"./icons-DP3uiYxy.js";const s=t(o);export{s as default};
|