chainlesschain 0.166.127 → 0.166.129
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/README.md +25 -1
- package/package.json +1 -1
- package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
- package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-DkSOwKNn.js → AIOps-CjPaaF2r.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CaYSnkeR.js → ActionButton-_zlP_Z6z.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-D8kEgXLP.js → Analytics-C7X31L8l.js} +2 -2
- package/src/assets/web-panel/assets/{AppLayout-D43FaO4a.js → AppLayout-BmYa34Se.js} +3 -3
- package/src/assets/web-panel/assets/{Artifacts-DfxY2Gqs.js → Artifacts-B_YKNjlp.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-0ogv1Zu5.js → Audit-5JsI67XQ.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BhLnn-Gw.js → BackgroundAgents-BL3QbzvS.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-D4591rlk.js → Backup-BRmg-gTa.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-gK1PjPDZ.js → BaseInput-DNE7mT3K.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CCDmOYwg.js → Chat-OYwAopdM.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-Dtxw3Wgt.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-DG4PRH9M.js → Checkbox-nMgYkH8H.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DtJxGiSg.js → Codegen-B9G2ngLI.js} +1 -1
- package/src/assets/web-panel/assets/{Col-4wGBC25p.js → Col-i0owJaGP.js} +1 -1
- package/src/assets/web-panel/assets/{Community-dOCSc8t-.js → Community-B3Ta0mI_.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-Du4kXsyN.js → Compact-DDXrvvm-.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-BbI5XMcz.js → Compliance-Bn4Uq6U1.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-CbQRpyiK.js → Cowork-CO5NKD6r.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-CtWy2bMC.js → Cron-ByjNese0.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CzdM5hF6.js → Crosschain-BN1FUYyi.js} +1 -1
- package/src/assets/web-panel/assets/{DID-CcBboBJN.js → DID-CUFX5RL3.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-I7m0oCeC.js → Dashboard-D_2FDPBP.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-CKIy2Ikn.js → Dropdown-lGOMtIzb.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-BNuxCq89.js → EmailListRenderer-DA3Qf1S2.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-BeBovLZs.js → EvolutionSettings-DLcnicCr.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-QThmET-n.js → FamilyGuardDashboard-BPOSaIN1.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-Bqf7YYlV.js → Federation-DzJUCQq8.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DZAM28ve.js → FormItemContext-DVx1XNKx.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DunXFYML.js → GenericCardRenderer-BkqzO_lh.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BgwOjaMf.js → Git-Dr_rdT_j.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-B1za4wCP.js → Governance-DyVkZddw.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-DMPqX1oN.js → Inference-IN2YDd4v.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-ChDn3okr.js → KnowledgeGraph-Ceiy4n6N.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BQoPB6-O.js → Logs-d7pIEAX2.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-DmSl0MNI.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-DZXEaPpe.js → Marketplace-uVE7U14g.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CZbVOFaG.js → McpTools-DUfBM--y.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-Cl3T8asu.js → Memory-6gkcR02J.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DK_ayU9I.js → MobileBridge-Cl6ys2O9.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DEWAA2gT.js → MobileProjects-5P8jN4gf.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-z-XAWzMh.js → Mtc-DtiT1Kol.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-CX7qJvQS.js → MtcAudit-DZz8iiTE.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-DiQlKgxx.js → Multisig-DFH3-fBJ.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Ciuxcu00.js → NLProgramming-BYNuDOt-.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-BAvqNw_6.js → Notes-BCY4jgYy.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-DkHDTslA.js → NotificationSettings-Bk2ltghU.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer--WZdD2oV.js → OrderTableRenderer-OdeXEGAn.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-Bv6bMLCe.js → Organization-CY4_mSiV.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-Bwoz_oq1.js → Overflow-CaRUAOY_.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-De7T0ZeB.js → P2P-Bd96rBWQ.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-Dblr2x25.js → PdhVaultBrowser-JjnExxan.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-C-jAt-cg.js → Permissions-CW1PUJB0.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-yXeXDMgf.js → PersonalDataHub-BNn9alTk.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-C8CYoLOa.js → Pipeline-01_PBiUu.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-B-gwnOGT.js → Privacy-BP4DlVGb.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CbNjHiBV.js → ProjectInit-CAMnQj4n.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-BMUY0GCP.js → ProjectSettings-DKxV5On_.js} +2 -2
- package/src/assets/web-panel/assets/Projects-B_4kRnM8.js +1 -0
- package/src/assets/web-panel/assets/{Providers-K_tlWkON.js → Providers-DeqqZyUv.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-2RSZDzJI.js → QrScannerModal-fFkycCT4.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-mhbcQRMI.js → QuickAsk-Ln6qQidy.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BXm0uG0q.js → Recommend-DeENA-y0.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-xhOpmNZG.js → RemoteSession-CRxSYxo4.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-CwbCWB-3.js → Reputation-B2kU2F0l.js} +1 -1
- package/src/assets/web-panel/assets/{Row-BdAjmDBO.js → Row-lV_nLlFq.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-Cq4LZ9WU.js → RssFeed-Df21mCdF.js} +2 -2
- package/src/assets/web-panel/assets/{Search-C_I6B-4l.js → Search-8_Dz4qU9.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CdH6mzL-.js → Security-Cl5-PEcp.js} +3 -3
- package/src/assets/web-panel/assets/{Services-CWu1wqtS.js → Services-C5qgCqA7.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-daw9DiVM.js → Skeleton-ASRgSh_Y.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CmurIxkM.js → Skills-DWx01ZJ7.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-cETA5aPO.js → Sla-I2gbgtW8.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-B1llZgu3.js → SpeechSettings-BqTikzfe.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-DufZ-B2q.js → SyncSettings-D3zCpBFV.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-PfRLKTFY.js → Tasks-DjMWII45.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-DGtz-vT8.js → Templates-Cq7qDnHX.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-JeKYLN0b.js → Tenant-DEasKDpQ.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BiMsF2Y0.js → Terminal-J6fLkTzi.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-DhcBAGPg.js → TimelineRenderer-CNvWrWN-.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DpIg-0ju.js → Tokens-BSgHJCKH.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DreKHxyb.js → Trigger-DgGU_D0o.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-D7ByQvBQ.js → Trust-BANlv-uB.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-OudyQByy.js → UkeySign-qh8GPRsU.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BhU6nzCF.js → VideoEditing-DBiGTB4H.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BCEpB6E0.js → Wallet-DMUFR7cL.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DwjAM5Mr.js → WebAuthn-DP9nQQzW.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-ChQqlAmY.js → WorkflowEditor-DT_6jDkL.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CzUKWqTy.js → chat-C_kELmV6.js} +1 -1
- package/src/assets/web-panel/assets/{colors-D3Y_Pvu4.js → colors-DE-ZxAv_.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-ByyPRfkA.js → compact-item-BowulLDi.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-Dt5PF6VI.js → createContext-DCh8oMBQ.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BVvJAp91.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-BuIaEKuC.js → hasIn-Be7mK-iw.js} +1 -1
- package/src/assets/web-panel/assets/{index-BO29sPX8.js → index-3Ql7xQLn.js} +1 -1
- package/src/assets/web-panel/assets/{index-CFXZ9lbO.js → index-4KkYmFy5.js} +1 -1
- package/src/assets/web-panel/assets/{index-DHzVIQLX.js → index-6OluUVJJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DxVLI-Iu.js → index-Ao-LXr-d.js} +1 -1
- package/src/assets/web-panel/assets/{index-COsjgjvP.js → index-B-3EDOlf.js} +1 -1
- package/src/assets/web-panel/assets/index-B7IhCfsh.js +1 -0
- package/src/assets/web-panel/assets/{index-CCBm8_o4.js → index-BDIIR8g6.js} +1 -1
- package/src/assets/web-panel/assets/index-BMrbe_Ey.js +1 -0
- package/src/assets/web-panel/assets/{index-BFQGN97S.js → index-BdzVLz-c.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmrfHS36.js → index-BlzMqaWB.js} +1 -1
- package/src/assets/web-panel/assets/{index-GyTOYTFg.js → index-BwY31W-u.js} +1 -1
- package/src/assets/web-panel/assets/{index-CAfX0VyL.js → index-C2pCquZC.js} +1 -1
- package/src/assets/web-panel/assets/{index-BdvZNMNm.js → index-CKmC6ugN.js} +1 -1
- package/src/assets/web-panel/assets/{index-CgPKUSe4.js → index-CL2hAUWh.js} +1 -1
- package/src/assets/web-panel/assets/{index-BmVY2f7I.js → index-CUXfwAhF.js} +1 -1
- package/src/assets/web-panel/assets/{index-Di78LDr8.js → index-CXvy8HrM.js} +1 -1
- package/src/assets/web-panel/assets/{index-DpAqy6Co.js → index-C_VnSUjh.js} +1 -1
- package/src/assets/web-panel/assets/{index-DSXjiZAV.js → index-CecGCLWI.js} +1 -1
- package/src/assets/web-panel/assets/{index-D51wU4q-.js → index-Ck6MYKVN.js} +1 -1
- package/src/assets/web-panel/assets/{index-gg5zO3aD.js → index-Cvy4vdVW.js} +1 -1
- package/src/assets/web-panel/assets/{index-1YgdY0Vq.js → index-CwJfLNqv.js} +1 -1
- package/src/assets/web-panel/assets/{index-NFqKQquS.js → index-D3lOYd9_.js} +1 -1
- package/src/assets/web-panel/assets/{index-CDTS4qJm.js → index-DEDVYN7D.js} +1 -1
- package/src/assets/web-panel/assets/{index-BwlY7Yap.js → index-DLCzaLH4.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcqZAAr5.js → index-DMDaGPxG.js} +1 -1
- package/src/assets/web-panel/assets/{index-DWW5svXU.js → index-DMKo49Um.js} +1 -1
- package/src/assets/web-panel/assets/{index-CByWkXdO.js → index-DN1AT3FH.js} +1 -1
- package/src/assets/web-panel/assets/{index-EtrWRKu2.js → index-DOebEvgn.js} +1 -1
- package/src/assets/web-panel/assets/{index-D7QSTEjb.js → index-DPX3N4T8.js} +1 -1
- package/src/assets/web-panel/assets/{index-F-T8AHeo.js → index-DSRKtgJg.js} +1 -1
- package/src/assets/web-panel/assets/{index-B600riYP.js → index-DSqZBvQM.js} +1 -1
- package/src/assets/web-panel/assets/{index-BSWTyRhI.js → index-DbrQO1p9.js} +1 -1
- package/src/assets/web-panel/assets/{index-huWw0XBb.js → index-DjC2TJeH.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dlec7Sr4.js → index-LVrxqU88.js} +1 -1
- package/src/assets/web-panel/assets/{index-CZX4_hGp.js → index-OH54KMLN.js} +1 -1
- package/src/assets/web-panel/assets/{index-DSgroT-P.js → index-Qx8cTReg.js} +3 -3
- package/src/assets/web-panel/assets/{index-BztqxXMP.js → index-_cYsz4df.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cb7MzML-.js → index-lN916819.js} +1 -1
- package/src/assets/web-panel/assets/{index-_oJnnOnZ.js → index-nLHTuHoT.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-Bny6G13G.js → initDefaultProps-BNhziAal.js} +1 -1
- package/src/assets/web-panel/assets/{motion-DRhRj_uM.js → motion-fUkbJz38.js} +1 -1
- package/src/assets/web-panel/assets/{move-D0wKnhYr.js → move-rFx211Cl.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BXXSTJBk.js → mtc-parser-CEP1wN3R.js} +1 -1
- package/src/assets/web-panel/assets/{omit-d8t9Yze4.js → omit-DacHd_Zm.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-nyB6BMe6.js → pickAttrs-Dqp58Ep2.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-CSFyBNA2.js → placementArrow-Cv6Rm0pV.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DYmiKhJa.js → responsiveObserve-rNE0p9ZW.js} +1 -1
- package/src/assets/web-panel/assets/{slide-D4KZSRmt.js → slide-C97JxD4S.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BcrcPeFm.js → statusUtils-Cxk1gV9M.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-BFgOb1vz.js → styleChecker-CbtKKsPo.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DQ5qSQlN.js → useFlexGapSupport-CQATs2JQ.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-Cafq069l.js → useFs-6c7qrpE_.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-DTma9Ary.js → usePersonalDataHub-OjxtBGe7.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-HvC2-bE9.js → vnode-CSlXfUSh.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-AZxADWXu.js → zoom-Cc1qKiSZ.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/commands/agent.js +29 -0
- package/src/commands/setup.js +35 -10
- package/src/constants.js +15 -89
- package/src/data/changelog.json +27 -1
- package/src/lib/bm25-search.js +6 -3
- package/src/lib/codex-app-server-adapter.js +36 -22
- package/src/lib/codex-app-server-support.js +91 -0
- package/src/lib/coding-change-review-context.js +258 -0
- package/src/lib/coding-task-guidance.js +9 -1
- package/src/lib/context-memory-kernel/memory-query-index.js +35 -17
- package/src/lib/context-memory-kernel/provider-context.js +22 -12
- package/src/lib/goal-check-evidence.js +159 -0
- package/src/lib/goal-condition-engine.js +24 -2
- package/src/lib/llm-connection-probe.js +48 -4
- package/src/lib/llm-onboarding-catalog.json +131 -0
- package/src/lib/skill-retrieval-router.js +2 -1
- package/src/lib/skill-search-tokenizer.js +143 -0
- package/src/repl/agent-repl.js +8 -4
- package/src/runtime/agent-core.js +207 -42
- package/src/runtime/headless-runner.js +138 -66
- package/src/runtime/headless-stream.js +1 -0
- package/src/runtime/mcp-tool-search-ranking.js +142 -0
- package/src/runtime/mcp-tool-search.js +198 -60
- package/src/assets/web-panel/assets/ChatBubbleRenderer-CnpWe3dp.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-uS1yHX12.js +0 -1
- package/src/assets/web-panel/assets/Projects-DpCaWXv6.js +0 -1
- package/src/assets/web-panel/assets/devWarning-BgSxkkQ3.js +0 -1
- package/src/assets/web-panel/assets/index-D5v6roiB.js +0 -1
- package/src/assets/web-panel/assets/index-DgXZCvH5.js +0 -1
|
@@ -30,15 +30,18 @@
|
|
|
30
30
|
* "enabled": "auto" | true | false, // default "auto" (threshold)
|
|
31
31
|
* "thresholdRatio": 0.1, // auto: defer when schemas > 10% window
|
|
32
32
|
* "maxResults": 5, // tool_search default result cap
|
|
33
|
+
* "catalogMode": "stubs" | "compact", // compact provider projection (opt-in)
|
|
33
34
|
* "alwaysLoad": ["serverName", "mcp__srv__tool", "mcp__srv__*"]
|
|
34
35
|
* } } }
|
|
35
36
|
* env CC_TOOL_SEARCH=1|0|auto // overrides settings.enabled
|
|
37
|
+
* env CC_TOOL_SEARCH_CATALOG=compact|stubs // provider projection only
|
|
36
38
|
*
|
|
37
39
|
* OFF / below-threshold path is byte-identical: `maybeApplyToolSearch` returns
|
|
38
40
|
* null without touching the mcp wiring object.
|
|
39
41
|
*/
|
|
40
42
|
|
|
41
43
|
import settingsLoader from "../lib/settings-loader.cjs";
|
|
44
|
+
import { rankMcpToolSearchEntries } from "./mcp-tool-search-ranking.js";
|
|
42
45
|
import {
|
|
43
46
|
estimateTokens as defaultEstimateTokens,
|
|
44
47
|
getContextWindow,
|
|
@@ -52,6 +55,7 @@ export const TOOL_SEARCH_DEFAULTS = Object.freeze({
|
|
|
52
55
|
enabled: "auto",
|
|
53
56
|
thresholdRatio: 0.1,
|
|
54
57
|
maxResults: 5,
|
|
58
|
+
catalogMode: "stubs",
|
|
55
59
|
alwaysLoad: Object.freeze([]),
|
|
56
60
|
});
|
|
57
61
|
|
|
@@ -102,6 +106,9 @@ function sanitizeToolSearchSettings(raw, into) {
|
|
|
102
106
|
(p) => typeof p === "string" && p.length > 0,
|
|
103
107
|
);
|
|
104
108
|
}
|
|
109
|
+
if (raw.catalogMode === "stubs" || raw.catalogMode === "compact") {
|
|
110
|
+
out.catalogMode = raw.catalogMode;
|
|
111
|
+
}
|
|
105
112
|
return out;
|
|
106
113
|
}
|
|
107
114
|
|
|
@@ -110,7 +117,7 @@ function sanitizeToolSearchSettings(raw, into) {
|
|
|
110
117
|
* + managed settings + the CC_TOOL_SEARCH env override. Never throws.
|
|
111
118
|
*
|
|
112
119
|
* @param {object} [opts] { env, cwd, settingsFile, onWarn }
|
|
113
|
-
* @returns {{enabled:(boolean|"auto"), thresholdRatio:number, maxResults:number, alwaysLoad:string[]}}
|
|
120
|
+
* @returns {{enabled:(boolean|"auto"), thresholdRatio:number, maxResults:number, catalogMode:string, alwaysLoad:string[]}}
|
|
114
121
|
*/
|
|
115
122
|
export function resolveToolSearchConfig(opts = {}) {
|
|
116
123
|
const env = opts.env || process.env;
|
|
@@ -119,6 +126,7 @@ export function resolveToolSearchConfig(opts = {}) {
|
|
|
119
126
|
enabled: TOOL_SEARCH_DEFAULTS.enabled,
|
|
120
127
|
thresholdRatio: TOOL_SEARCH_DEFAULTS.thresholdRatio,
|
|
121
128
|
maxResults: TOOL_SEARCH_DEFAULTS.maxResults,
|
|
129
|
+
catalogMode: TOOL_SEARCH_DEFAULTS.catalogMode,
|
|
122
130
|
alwaysLoad: [...TOOL_SEARCH_DEFAULTS.alwaysLoad],
|
|
123
131
|
};
|
|
124
132
|
try {
|
|
@@ -142,6 +150,11 @@ export function resolveToolSearchConfig(opts = {}) {
|
|
|
142
150
|
if (flag === "1" || flag === "true") effective.enabled = true;
|
|
143
151
|
else if (flag === "0" || flag === "false") effective.enabled = false;
|
|
144
152
|
else if (flag === "auto") effective.enabled = "auto";
|
|
153
|
+
const catalogMode = String(env.CC_TOOL_SEARCH_CATALOG || "")
|
|
154
|
+
.trim()
|
|
155
|
+
.toLowerCase();
|
|
156
|
+
if (catalogMode === "stubs" || catalogMode === "compact")
|
|
157
|
+
effective.catalogMode = catalogMode;
|
|
145
158
|
return effective;
|
|
146
159
|
}
|
|
147
160
|
|
|
@@ -232,8 +245,8 @@ function buildStubDefinition(fullDef) {
|
|
|
232
245
|
};
|
|
233
246
|
}
|
|
234
247
|
|
|
235
|
-
export function buildToolSearchDefinition() {
|
|
236
|
-
|
|
248
|
+
export function buildToolSearchDefinition({ catalogMode = "stubs" } = {}) {
|
|
249
|
+
const definition = {
|
|
237
250
|
type: "function",
|
|
238
251
|
function: {
|
|
239
252
|
name: TOOL_SEARCH_TOOL_NAME,
|
|
@@ -262,6 +275,60 @@ export function buildToolSearchDefinition() {
|
|
|
262
275
|
},
|
|
263
276
|
},
|
|
264
277
|
};
|
|
278
|
+
if (catalogMode === "compact") {
|
|
279
|
+
definition.function.description =
|
|
280
|
+
"Discover connected MCP tools that are omitted from the initial tool list. " +
|
|
281
|
+
'Search tool names and descriptions with keywords, or use "select:<exact_name>". ' +
|
|
282
|
+
'Use "servers:" with offset/max_results for a paged server directory. ' +
|
|
283
|
+
"Search returns full schemas and makes the selected tools available in the next model request. " +
|
|
284
|
+
"Search first, then call the selected tool by its returned name in a later request. " +
|
|
285
|
+
"Discovery does not grant execution permission.";
|
|
286
|
+
definition.function.parameters.properties.offset = {
|
|
287
|
+
type: "integer",
|
|
288
|
+
minimum: 0,
|
|
289
|
+
description: 'Server directory offset, used only with query "servers:".',
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
return definition;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/** Provider-only projection. The host's complete capability ceiling stays intact. */
|
|
296
|
+
export function projectMcpToolDefinitions(definitions, executors) {
|
|
297
|
+
const search = executors?.[TOOL_SEARCH_TOOL_NAME];
|
|
298
|
+
const registry = search?.kind === "tool-search" ? search.registry : null;
|
|
299
|
+
if (
|
|
300
|
+
registry?.catalogMode !== "compact" ||
|
|
301
|
+
!definitions.some((def) => def?.function?.name === TOOL_SEARCH_TOOL_NAME)
|
|
302
|
+
)
|
|
303
|
+
return definitions;
|
|
304
|
+
const allowed = new Set(definitions.map((def) => def?.function?.name));
|
|
305
|
+
const projected = definitions
|
|
306
|
+
.filter((def) => {
|
|
307
|
+
const name = def?.function?.name;
|
|
308
|
+
const exec = executors[name];
|
|
309
|
+
return (
|
|
310
|
+
!registry.deferred.has(name) &&
|
|
311
|
+
!(exec?.deferred === true && exec.registry === registry) &&
|
|
312
|
+
!(name?.startsWith("mcp__") && !exec)
|
|
313
|
+
);
|
|
314
|
+
})
|
|
315
|
+
.map((def) =>
|
|
316
|
+
def?.function?.name === TOOL_SEARCH_TOOL_NAME
|
|
317
|
+
? registry.compactSearchDefinition
|
|
318
|
+
: def,
|
|
319
|
+
);
|
|
320
|
+
// Insertion order keeps already-discovered schemas ahead of later additions.
|
|
321
|
+
for (const name of registry.loaded) {
|
|
322
|
+
const entry = registry.deferred.get(name);
|
|
323
|
+
if (
|
|
324
|
+
allowed.has(name) &&
|
|
325
|
+
entry &&
|
|
326
|
+
entry.stale !== true &&
|
|
327
|
+
entry.executor === executors[name]
|
|
328
|
+
)
|
|
329
|
+
projected.push(entry.definition);
|
|
330
|
+
}
|
|
331
|
+
return projected;
|
|
265
332
|
}
|
|
266
333
|
|
|
267
334
|
// ─── deferral transform ────────────────────────────────────────────────────
|
|
@@ -296,6 +363,13 @@ export function applyToolSearchDeferral(mcp, opts = {}) {
|
|
|
296
363
|
: {},
|
|
297
364
|
};
|
|
298
365
|
const firstApplication = !mcp.toolSearchRegistry;
|
|
366
|
+
registry.catalogMode =
|
|
367
|
+
opts.catalogMode === "compact" || opts.catalogMode === "stubs"
|
|
368
|
+
? opts.catalogMode
|
|
369
|
+
: registry.catalogMode || "stubs";
|
|
370
|
+
registry.compactSearchDefinition ||= buildToolSearchDefinition({
|
|
371
|
+
catalogMode: "compact",
|
|
372
|
+
});
|
|
299
373
|
|
|
300
374
|
const activeNames = new Set(
|
|
301
375
|
mcp.extraToolDefinitions.map((def) => def?.function?.name),
|
|
@@ -397,6 +471,11 @@ export function applyToolSearchDeferral(mcp, opts = {}) {
|
|
|
397
471
|
mcp.extraToolDefinitions.push(...remaining, ...newStubs);
|
|
398
472
|
}
|
|
399
473
|
|
|
474
|
+
if (registry.catalogMode === "compact") {
|
|
475
|
+
savedTokens =
|
|
476
|
+
describeMcpToolContext(mcp, { estimate, config: TOOL_SEARCH_DEFAULTS })
|
|
477
|
+
?.savedTokens || 0;
|
|
478
|
+
}
|
|
400
479
|
return { registry, deferredCount: newStubs.length, savedTokens };
|
|
401
480
|
}
|
|
402
481
|
|
|
@@ -436,6 +515,7 @@ export function maybeApplyToolSearch(mcp, opts = {}) {
|
|
|
436
515
|
const summary = applyToolSearchDeferral(mcp, {
|
|
437
516
|
estimate,
|
|
438
517
|
alwaysLoad: config.alwaysLoad,
|
|
518
|
+
catalogMode: config.catalogMode,
|
|
439
519
|
});
|
|
440
520
|
if (summary) {
|
|
441
521
|
summary.maxResults = config.maxResults;
|
|
@@ -455,38 +535,36 @@ export function maybeApplyToolSearch(mcp, opts = {}) {
|
|
|
455
535
|
|
|
456
536
|
// ─── search ────────────────────────────────────────────────────────────────
|
|
457
537
|
|
|
458
|
-
function
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
.
|
|
462
|
-
.
|
|
463
|
-
|
|
538
|
+
function searchResultLimit(registry, requested) {
|
|
539
|
+
const configuredMaxResults = registry?.maxResults;
|
|
540
|
+
return Number.isInteger(requested) && requested > 0
|
|
541
|
+
? Math.min(requested, 50)
|
|
542
|
+
: Number.isInteger(configuredMaxResults) && configuredMaxResults > 0
|
|
543
|
+
? Math.min(configuredMaxResults, 50)
|
|
544
|
+
: TOOL_SEARCH_DEFAULTS.maxResults;
|
|
464
545
|
}
|
|
465
546
|
|
|
466
547
|
/**
|
|
467
|
-
* Search
|
|
468
|
-
*
|
|
469
|
-
* accepted when it matches exactly one deferred tool.
|
|
470
|
-
* - keyword — scores name hits (×3) over description hits (×1); a `+term`
|
|
471
|
-
* must appear in the tool name.
|
|
472
|
-
* Does NOT mutate the loaded set — callers (executeToolSearch) mark results.
|
|
473
|
-
*
|
|
474
|
-
* @returns {{mode:string, results:Array<{name:string,entry:object}>, notFound:string[]}}
|
|
548
|
+
* Search exact `select:` names or ranked keywords without marking schemas
|
|
549
|
+
* loaded. Optional allowedToolNames restricts discovery to the host ceiling.
|
|
475
550
|
*/
|
|
476
551
|
export function searchDeferredTools(registry, query, opts = {}) {
|
|
477
552
|
const q = String(query || "").trim();
|
|
478
|
-
const
|
|
479
|
-
const
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
553
|
+
const maxResults = searchResultLimit(registry, opts.maxResults);
|
|
554
|
+
const selectMode = /^select:/i.test(q);
|
|
555
|
+
const allowed =
|
|
556
|
+
opts.allowedToolNames == null ? null : new Set(opts.allowedToolNames);
|
|
557
|
+
const eligible = function* () {
|
|
558
|
+
for (const [name, entry] of registry?.deferred || []) {
|
|
559
|
+
if (entry.stale !== true && (!allowed || allowed.has(name)))
|
|
560
|
+
yield [name, entry];
|
|
561
|
+
}
|
|
562
|
+
};
|
|
563
|
+
// Keyword ranking already checks liveness while scanning. Avoid cloning the
|
|
564
|
+
// whole directory on every query; only exact selection needs keyed lookup.
|
|
565
|
+
const entries = selectMode ? new Map(eligible()) : eligible();
|
|
488
566
|
|
|
489
|
-
if (
|
|
567
|
+
if (selectMode) {
|
|
490
568
|
const wanted = q
|
|
491
569
|
.slice(q.indexOf(":") + 1)
|
|
492
570
|
.split(",")
|
|
@@ -521,31 +599,9 @@ export function searchDeferredTools(registry, query, opts = {}) {
|
|
|
521
599
|
return { mode: "select", results, notFound, omittedCount };
|
|
522
600
|
}
|
|
523
601
|
|
|
524
|
-
const terms = normalizeTerms(q);
|
|
525
|
-
if (terms.length === 0) return { mode: "keyword", results: [], notFound: [] };
|
|
526
|
-
const required = terms
|
|
527
|
-
.filter((t) => t.startsWith("+") && t.length > 1)
|
|
528
|
-
.map((t) => t.slice(1));
|
|
529
|
-
const scoring = terms.map((t) => (t.startsWith("+") ? t.slice(1) : t));
|
|
530
|
-
|
|
531
|
-
const scored = [];
|
|
532
|
-
for (const [name, entry] of entries) {
|
|
533
|
-
const lowerName = name.toLowerCase();
|
|
534
|
-
const lowerDesc = String(
|
|
535
|
-
entry.definition?.function?.description || "",
|
|
536
|
-
).toLowerCase();
|
|
537
|
-
if (required.some((t) => !lowerName.includes(t))) continue;
|
|
538
|
-
let score = 0;
|
|
539
|
-
for (const t of scoring) {
|
|
540
|
-
if (lowerName.includes(t)) score += 3;
|
|
541
|
-
if (lowerDesc.includes(t)) score += 1;
|
|
542
|
-
}
|
|
543
|
-
if (score > 0) scored.push({ name, entry, score });
|
|
544
|
-
}
|
|
545
|
-
scored.sort((a, b) => b.score - a.score || a.name.localeCompare(b.name));
|
|
546
602
|
return {
|
|
547
603
|
mode: "keyword",
|
|
548
|
-
results:
|
|
604
|
+
results: rankMcpToolSearchEntries(entries, q, maxResults),
|
|
549
605
|
notFound: [],
|
|
550
606
|
};
|
|
551
607
|
}
|
|
@@ -556,7 +612,7 @@ export function searchDeferredTools(registry, query, opts = {}) {
|
|
|
556
612
|
* prompt-cache-friendly delivery channel — conversation content, not the
|
|
557
613
|
* tools array).
|
|
558
614
|
*/
|
|
559
|
-
export function executeToolSearch(registry, args = {}) {
|
|
615
|
+
export function executeToolSearch(registry, args = {}, options = {}) {
|
|
560
616
|
const query = typeof args.query === "string" ? args.query : "";
|
|
561
617
|
if (!query.trim()) {
|
|
562
618
|
return {
|
|
@@ -570,12 +626,62 @@ export function executeToolSearch(registry, args = {}) {
|
|
|
570
626
|
"tool_search query is too long; select fewer tool names or use shorter keywords.",
|
|
571
627
|
};
|
|
572
628
|
}
|
|
629
|
+
if (registry.catalogMode === "compact" && /^servers:$/i.test(query.trim())) {
|
|
630
|
+
const offset = args.offset === undefined ? 0 : args.offset;
|
|
631
|
+
if (!Number.isSafeInteger(offset) || offset < 0)
|
|
632
|
+
return {
|
|
633
|
+
error: "Server directory offset must be a non-negative integer.",
|
|
634
|
+
};
|
|
635
|
+
const allowed =
|
|
636
|
+
options.allowedToolNames == null
|
|
637
|
+
? null
|
|
638
|
+
: new Set(options.allowedToolNames);
|
|
639
|
+
const servers = new Map();
|
|
640
|
+
for (const [name, entry] of registry.deferred) {
|
|
641
|
+
if (entry.stale === true || (allowed && !allowed.has(name))) continue;
|
|
642
|
+
if (typeof entry.serverName !== "string" || !entry.serverName) continue;
|
|
643
|
+
const previous = servers.get(entry.serverName);
|
|
644
|
+
if (previous) previous.toolCount++;
|
|
645
|
+
else
|
|
646
|
+
servers.set(entry.serverName, { toolCount: 1, exampleToolName: name });
|
|
647
|
+
}
|
|
648
|
+
const names = [...servers.keys()].sort();
|
|
649
|
+
const limit = searchResultLimit(
|
|
650
|
+
registry,
|
|
651
|
+
typeof args.max_results === "number"
|
|
652
|
+
? Math.floor(args.max_results)
|
|
653
|
+
: undefined,
|
|
654
|
+
);
|
|
655
|
+
const page = names.slice(offset, offset + limit).map((name) => {
|
|
656
|
+
const entry = servers.get(name);
|
|
657
|
+
if (name.length <= 192) return { name, toolCount: entry.toolCount };
|
|
658
|
+
let label = name.slice(0, 191);
|
|
659
|
+
if (/[\uD800-\uDBFF]$/.test(label)) label = label.slice(0, -1);
|
|
660
|
+
return {
|
|
661
|
+
name: label + "…",
|
|
662
|
+
nameTruncated: true,
|
|
663
|
+
toolCount: entry.toolCount,
|
|
664
|
+
...(entry.exampleToolName.length <= 128
|
|
665
|
+
? { exampleToolName: entry.exampleToolName }
|
|
666
|
+
: {}),
|
|
667
|
+
};
|
|
668
|
+
});
|
|
669
|
+
return {
|
|
670
|
+
servers: page,
|
|
671
|
+
totalServers: names.length,
|
|
672
|
+
offset,
|
|
673
|
+
nextOffset:
|
|
674
|
+
offset + page.length < names.length ? offset + page.length : null,
|
|
675
|
+
note: "Directory only; no schemas loaded. Search keywords across all permitted servers or select an exact tool name. Offsets address the current live directory.",
|
|
676
|
+
};
|
|
677
|
+
}
|
|
573
678
|
const {
|
|
574
679
|
mode,
|
|
575
680
|
results,
|
|
576
681
|
notFound,
|
|
577
682
|
omittedCount = 0,
|
|
578
683
|
} = searchDeferredTools(registry, query, {
|
|
684
|
+
allowedToolNames: options.allowedToolNames,
|
|
579
685
|
maxResults:
|
|
580
686
|
typeof args.max_results === "number"
|
|
581
687
|
? Math.floor(args.max_results)
|
|
@@ -611,13 +717,27 @@ export function executeToolSearch(registry, args = {}) {
|
|
|
611
717
|
mode === "select"
|
|
612
718
|
? "No deferred tool matched those names. Names must be the full mcp__<server>__<tool> form (or a unique bare tool name)."
|
|
613
719
|
: "No deferred tool matched. Try different keywords, or select by exact name.";
|
|
614
|
-
|
|
615
|
-
.
|
|
616
|
-
|
|
617
|
-
|
|
720
|
+
if (registry.catalogMode === "compact") {
|
|
721
|
+
payload.note +=
|
|
722
|
+
' Use query "servers:" to inspect the permitted server directory.';
|
|
723
|
+
} else {
|
|
724
|
+
const allowed =
|
|
725
|
+
options.allowedToolNames == null
|
|
726
|
+
? null
|
|
727
|
+
: new Set(options.allowedToolNames);
|
|
728
|
+
payload.available = [...(registry?.deferred || [])]
|
|
729
|
+
.filter(
|
|
730
|
+
([name, entry]) =>
|
|
731
|
+
entry.stale !== true && (!allowed || allowed.has(name)),
|
|
732
|
+
)
|
|
733
|
+
.map(([name]) => name)
|
|
734
|
+
.slice(0, 100);
|
|
735
|
+
}
|
|
618
736
|
} else {
|
|
619
737
|
payload.note =
|
|
620
|
-
|
|
738
|
+
(registry.catalogMode === "compact"
|
|
739
|
+
? "Schemas loaded — these tools are available by their returned names in the next model request. Call them with arguments matching `parameters`."
|
|
740
|
+
: "Schemas loaded — call these tools directly with arguments matching `parameters`.") +
|
|
621
741
|
(omittedCount > 0
|
|
622
742
|
? " Some selected tools were omitted by max_results; select those tools in a separate search before calling them."
|
|
623
743
|
: "");
|
|
@@ -683,6 +803,11 @@ export function describeMcpToolContext(mcp, opts = {}) {
|
|
|
683
803
|
const window = getContextWindow(opts.model, opts.provider);
|
|
684
804
|
|
|
685
805
|
const servers = new Map(); // server → {tools, sentTokens, fullTokens, deferred}
|
|
806
|
+
const projected = projectMcpToolDefinitions(
|
|
807
|
+
mcp.extraToolDefinitions,
|
|
808
|
+
mcp.externalToolExecutors,
|
|
809
|
+
);
|
|
810
|
+
const visible = new Map(projected.map((def) => [def?.function?.name, def]));
|
|
686
811
|
let sentTokens = 0;
|
|
687
812
|
let fullTokens = 0;
|
|
688
813
|
for (const def of mcp.extraToolDefinitions) {
|
|
@@ -698,10 +823,11 @@ export function describeMcpToolContext(mcp, opts = {}) {
|
|
|
698
823
|
: isSearchTool
|
|
699
824
|
? "(tool_search)"
|
|
700
825
|
: "(resources)";
|
|
701
|
-
const
|
|
826
|
+
const sentDef = visible.get(name);
|
|
827
|
+
const sent = sentDef ? estimateToolDefTokens(sentDef, estimate) : 0;
|
|
702
828
|
const fullDef = registry?.deferred?.get(name)?.definition || def;
|
|
703
829
|
const full =
|
|
704
|
-
fullDef ===
|
|
830
|
+
fullDef === sentDef ? sent : estimateToolDefTokens(fullDef, estimate);
|
|
705
831
|
const row = servers.get(server) || {
|
|
706
832
|
server,
|
|
707
833
|
tools: 0,
|
|
@@ -762,7 +888,19 @@ export function describeMcpToolContext(mcp, opts = {}) {
|
|
|
762
888
|
savedTokens: Math.max(0, fullTokens - sentTokens),
|
|
763
889
|
window,
|
|
764
890
|
servers: rows,
|
|
765
|
-
toolSearch: {
|
|
891
|
+
toolSearch: {
|
|
892
|
+
active,
|
|
893
|
+
deferredCount,
|
|
894
|
+
loadedCount,
|
|
895
|
+
...(registry?.catalogMode === "compact"
|
|
896
|
+
? {
|
|
897
|
+
catalogMode: "compact",
|
|
898
|
+
visibleDeferredCount: projected.filter((def) =>
|
|
899
|
+
registry.deferred.has(def?.function?.name),
|
|
900
|
+
).length,
|
|
901
|
+
}
|
|
902
|
+
: {}),
|
|
903
|
+
},
|
|
766
904
|
advice,
|
|
767
905
|
};
|
|
768
906
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as v,P as u,J as S,U as n,R as a,S as y,K as C,Q as x,V as w,_ as B,b as s}from"./vendor-Bn1JzzAn.js";import{_ as k}from"./index-DSgroT-P.js";import"./icons-DG5UD-6K.js";const N={__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}),_}},T={class:"bubble"},L={class:"meta"},M={class:"actor"},R={class:"time"},V={class:"body"};function q(c,d,t,r,i,l){const o=v("a-tag");return u(),S("div",{class:B(["chat-row",{mine:r.isMine}])},[n("div",T,[n("div",L,[n("span",M,a(r.actorLabel),1),n("span",R,a(r.formattedTime),1)]),n("div",V,a(r.messageText),1),t.event.source.adapter?(u(),y(o,{key:0,class:"src",color:r.adapterColor},{default:C(()=>[x(a(t.event.source.adapter),1)]),_:1},8,["color"])):w("v-if",!0)])],2)}const A=k(N,[["render",q],["__scopeId","data-v-49238629"],["__file","/tmp/cc-web-panel-d0LHhd/repo/packages/web-panel/src/components/pdh/renderers/ChatBubbleRenderer.vue"]]);export{A as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{P as c,J as d,b as s}from"./vendor-Bn1JzzAn.js";import{r as a}from"./markdown-Bq2x0XsR.js";import{_ as p}from"./index-DSgroT-P.js";const _={__name:"MarkdownRenderer",props:{content:{type:String,default:""}},setup(t,{expose:o}){o();const e=t,r=s(()=>a(e.content||"")),n={props:e,rendered:r,computed:s,get renderMarkdown(){return a}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}},i=["innerHTML"];function m(t,o,e,r,n,u){return c(),d("div",{class:"markdown-content",innerHTML:r.rendered},null,8,i)}const w=p(_,[["render",m],["__scopeId","data-v-0b0b9f63"],["__file","/tmp/cc-web-panel-d0LHhd/repo/packages/web-panel/src/components/MarkdownRenderer.vue"]]);export{w as M};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as i,J as A,U as I,R as s,Q as r,c as t,K as a,V as _,S as x,o as oe,b as ee,r as u,P as p,F as ne,a2 as ge}from"./vendor-Bn1JzzAn.js";import{_ as we,b as re,u as ie,d}from"./index-DSgroT-P.js";import{u as de}from"./useShellMode-CgR0wCYM.js";import{aN as ke,aO as Fe,aP as be,f as je,a5 as Ce,a8 as xe,at as Oe,R as Se}from"./icons-DG5UD-6K.js";const Pe={__name:"Projects",setup(se,{expose:l}){l();const{t:te}=re(),e=ie(),{isEmbedded:W}=de();async function w(o,f,ye,ae=8e3){if(W){const Z=await e.sendRaw({...f,type:o},ae);if(!Z?.ok){const $=Z?.error;throw new Error(typeof $=="string"?$:$?.message||`${o} failed`)}return Z.result}return e.executeJson(ye,ae)}const B=u(!1),y=u([]),O=u(""),S=u(""),P=u(!1),v=u(null),U=u([]),k=u(!1),L=u(!1),E=u(!1),F=u({name:"",description:"",type:"document",rootPath:""}),z=[{title:"ID",key:"id",width:110},{title:"名称",key:"name"},{title:"类型",key:"project_type",width:120},{title:"状态",key:"status",width:100},{title:"同步",key:"sync_status",width:100},{title:"更新",key:"updated_at",width:160},{title:"操作",key:"actions",width:180,fixed:"right"}],V=ee(()=>{const o={active:0,draft:0,completed:0,archived:0};for(const f of y.value)o[f.status]!==void 0&&(o[f.status]+=1);return o}),J=ee(()=>y.value.filter(o=>!(O.value&&o.status!==O.value||S.value&&!o.name.toLowerCase().includes(S.value.toLowerCase()))));function g(o){switch(o){case"active":return"green";case"draft":return"default";case"completed":return"cyan";case"archived":return"gold";default:return"default"}}function H(o){switch(o){case"synced":return"green";case"pending":return"orange";case"conflict":return"red";case"error":return"red";default:return"default"}}function K(o){return!o&&o!==0?"-":new Date(typeof o=="number"?o:parseInt(o,10)).toLocaleString("zh-CN",{hour12:!1})}async function C(){B.value=!0;try{const o=await w("project.list",{limit:500},"project list --limit 500 --json",1e4);y.value=Array.isArray(o?.projects)?o.projects:Array.isArray(o)?o:[]}catch(o){d.error("加载失败: "+(o.message||o)),y.value=[]}finally{B.value=!1}}function Q(o){return{onClick:()=>M(o)}}async function M(o){v.value=o,P.value=!0,k.value=!0,U.value=[];try{const f=await w("project.listFiles",{projectId:o.id,limit:200},`project list-files ${o.id} --json`,8e3);U.value=Array.isArray(f?.files)?f.files:[]}catch{U.value=[]}finally{k.value=!1}}async function G(o){try{(await w("project.delete",{id:o.id},`project delete ${o.id} --json`,8e3))?.ok?(d.success(`已删除项目 '${o.name}'`),P.value=!1,await C()):d.error("删除失败")}catch(f){d.error(f.message||String(f))}}function X(){F.value={name:"",description:"",type:"document",rootPath:""},L.value=!0}async function T(){if(!F.value.name.trim()){d.warning("请输入项目名称");return}E.value=!0;try{const o=await w("project.init",{name:F.value.name.trim(),description:F.value.description||null,projectType:F.value.type,rootPath:F.value.rootPath||null},`project init "${F.value.name.trim()}" --type ${F.value.type} --json`,8e3);o?.id?(d.success(`已创建项目 '${o.name}'`),L.value=!1,await C()):d.error("创建失败")}catch(o){d.error(o.message||String(o))}finally{E.value=!1}}const b=u(!1),D=u(!1),j=u({path:"",content:""}),h=u(!1),m=u(!1),R=u({path:""}),n=u(!1),c=u(null),q=u(""),Y=u(!1);function ue(){j.value={path:"",content:""},b.value=!0}function ce(){R.value={path:""},h.value=!0}async function N(){if(v.value){k.value=!0;try{const o=await w("project.listFiles",{projectId:v.value.id,limit:200},`project list-files ${v.value.id} --json`,8e3);U.value=Array.isArray(o?.files)?o.files:[]}catch(o){d.error("刷新文件失败: "+(o.message||o))}finally{k.value=!1}}}async function fe(){if(!j.value.path.trim()){d.warning("请输入文件路径");return}if(v.value){D.value=!0;try{const o=await w("project.createFile",{projectId:v.value.id,filePath:j.value.path.trim(),content:j.value.content||""},`project create-file ${v.value.id} "${j.value.path.trim()}" --json`,8e3);o?.id?(d.success(`已创建文件 '${o.file_name}'`),b.value=!1,await N(),await C()):d.error("创建文件失败")}catch(o){d.error(o.message||String(o))}finally{D.value=!1}}}async function pe(){if(!R.value.path.trim()){d.warning("请输入文件夹路径");return}if(v.value){m.value=!0;try{const o=await w("project.createFolder",{projectId:v.value.id,folderPath:R.value.path.trim()},`project create-folder ${v.value.id} "${R.value.path.trim()}" --json`,8e3);o?.id?(d.success(`已创建文件夹 '${o.file_name}'`),h.value=!1,await N(),await C()):d.error("创建文件夹失败")}catch(o){d.error(o.message||String(o))}finally{m.value=!1}}}async function ve(o){try{(await w("project.deleteFile",{fileId:o.id},`project delete-file ${o.id} --json`,8e3))?.deleted?(d.success(`已删除 '${o.file_name}'`),await N(),await C()):d.error("删除失败")}catch(f){d.error(f.message||String(f))}}async function me(o){if(o.is_folder){d.info("文件夹无内容可编辑");return}try{const f=await w("project.getFile",{fileId:o.id},`project get-file ${o.id} --json`,8e3);c.value=o,q.value=f?.content||"",n.value=!0}catch(f){d.error("读取文件失败: "+(f.message||f))}}async function _e(){if(c.value){Y.value=!0;try{(await w("project.writeFile",{fileId:c.value.id,content:q.value},`project write-file ${c.value.id} --json`,8e3))?.id?(d.success("已保存"),n.value=!1,await N()):d.error("保存失败")}catch(o){d.error(o.message||String(o))}finally{Y.value=!1}}}oe(()=>{C()});const le={t:te,ws:e,isEmbedded:W,callProjectTopic:w,loading:B,projects:y,statusFilter:O,nameFilter:S,detailOpen:P,detail:v,files:U,filesLoading:k,createOpen:L,creating:E,newProject:F,columns:z,countByStatus:V,filteredProjects:J,statusColor:g,syncColor:H,formatTime:K,loadAll:C,onRowClick:Q,openDetail:M,onDelete:G,onShowCreate:X,onCreate:T,createFileOpen:b,creatingFile:D,newFile:j,createFolderOpen:h,creatingFolder:m,newFolder:R,editFileOpen:n,editingFile:c,editFileContent:q,savingFile:Y,openCreateFile:ue,openCreateFolder:ce,refreshFiles:N,onCreateFile:fe,onCreateFolder:pe,onDeleteFile:ve,openEditFile:me,onSaveFile:_e,ref:u,computed:ee,onMounted:oe,get ReloadOutlined(){return Se},get PlusOutlined(){return Oe},get FolderOutlined(){return xe},get FileTextOutlined(){return Ce},get CheckCircleOutlined(){return je},get CheckSquareOutlined(){return be},get FileAddOutlined(){return Fe},get FolderAddOutlined(){return ke},get message(){return d},get useI18n(){return re},get useWsStore(){return ie},get useShellMode(){return de}};return Object.defineProperty(le,"__isScriptSetup",{enumerable:!1,value:!0}),le}},ze={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},he={class:"page-title"},Ae={class:"page-sub"},Ie={class:"filter-bar",style:{"margin-bottom":"12px",display:"flex",gap:"12px","align-items":"center"}},Ue={key:0,style:{"font-size":"12px",color:"#888"}},De={key:0,style:{color:"#888","font-size":"12px"}},Re={key:0},Te={key:1,style:{color:"#888"}},Be=["onClick"],Le={key:0,style:{color:"#888","font-size":"12px"}};function Ee(se,l,te,e,W,w){const B=i("router-link"),y=i("a-button"),O=i("a-space"),S=i("a-statistic"),P=i("a-card"),v=i("a-col"),U=i("a-row"),k=i("a-radio-button"),L=i("a-radio-group"),E=i("a-input-search"),F=i("a-alert"),z=i("a-tag"),V=i("a-popconfirm"),J=i("a-table"),g=i("a-descriptions-item"),H=i("a-descriptions"),K=i("a-divider"),C=i("a-empty"),Q=i("a-list-item"),M=i("a-list"),G=i("a-spin"),X=i("a-drawer"),T=i("a-input"),b=i("a-form-item"),D=i("a-textarea"),j=i("a-form"),h=i("a-modal"),m=i("a-select-option"),R=i("a-select");return p(),A("div",null,[I("div",ze,[I("div",null,[I("h2",he,s(e.t("projects.title")),1),I("p",Ae,[l[17]||(l[17]=r("桌面 / CLI / 手机 三端共享同一份项目数据,Phase 3d sync 自动同步 (",-1)),t(B,{to:"/project-init"},{default:a(()=>[...l[16]||(l[16]=[r("项目初始化 / 环境设置",-1)])]),_:1}),l[18]||(l[18]=r(")",-1))])]),t(O,null,{default:a(()=>[t(y,{loading:e.loading,onClick:e.loadAll},{icon:a(()=>[t(e.ReloadOutlined)]),default:a(()=>[l[19]||(l[19]=r(" 刷新 ",-1))]),_:1},8,["loading"]),t(y,{type:"primary",onClick:e.onShowCreate},{icon:a(()=>[t(e.PlusOutlined)]),default:a(()=>[l[20]||(l[20]=r(" 新建项目 ",-1))]),_:1})]),_:1})]),_(" Stats "),t(U,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"总项目",value:e.projects.length,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:a(()=>[t(e.FolderOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"活跃",value:e.countByStatus.active,"value-style":{color:"#52c41a",fontSize:"20px"}},{prefix:a(()=>[t(e.CheckCircleOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"草稿",value:e.countByStatus.draft,"value-style":{color:"#8c8c8c",fontSize:"20px"}},{prefix:a(()=>[t(e.FileTextOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"已完成",value:e.countByStatus.completed,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:a(()=>[t(e.CheckSquareOutlined)]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),_(" Filter "),I("div",Ie,[t(L,{value:e.statusFilter,"onUpdate:value":l[0]||(l[0]=n=>e.statusFilter=n),size:"small","button-style":"solid"},{default:a(()=>[t(k,{value:""},{default:a(()=>[...l[21]||(l[21]=[r("全部",-1)])]),_:1}),t(k,{value:"active"},{default:a(()=>[...l[22]||(l[22]=[r("活跃",-1)])]),_:1}),t(k,{value:"draft"},{default:a(()=>[...l[23]||(l[23]=[r("草稿",-1)])]),_:1}),t(k,{value:"completed"},{default:a(()=>[...l[24]||(l[24]=[r("已完成",-1)])]),_:1}),t(k,{value:"archived"},{default:a(()=>[...l[25]||(l[25]=[r("已归档",-1)])]),_:1})]),_:1},8,["value"]),t(E,{value:e.nameFilter,"onUpdate:value":l[1]||(l[1]=n=>e.nameFilter=n),placeholder:"按名称过滤",style:{"max-width":"260px"},"allow-clear":""},null,8,["value"])]),!e.projects.length&&!e.loading?(p(),x(F,{key:0,type:"info",message:"还没有项目",description:'运行 `cc project init <name>` 或点击右上角"新建项目"按钮创建。桌面 / CLI / 手机三端共享同一份数据。',"show-icon":"",style:{"margin-bottom":"16px"}})):_("v-if",!0),e.projects.length||e.loading?(p(),x(J,{key:1,columns:e.columns,"data-source":e.filteredProjects,loading:e.loading,pagination:{pageSize:20,showSizeChanger:!0},"row-key":"id","custom-row":e.onRowClick},{bodyCell:a(({column:n,record:c})=>[n.key==="id"?(p(),A("code",Ue,s(c.id.slice(0,8))+"…",1)):n.key==="name"?(p(),A(ne,{key:1},[I("strong",null,s(c.name),1),c.description?(p(),A("div",De,s(c.description),1)):_("v-if",!0)],64)):n.key==="project_type"?(p(),x(z,{key:2},{default:a(()=>[r(s(c.project_type),1)]),_:2},1024)):n.key==="status"?(p(),x(z,{key:3,color:e.statusColor(c.status)},{default:a(()=>[r(s(c.status),1)]),_:2},1032,["color"])):n.key==="sync_status"?(p(),x(z,{key:4,color:e.syncColor(c.sync_status)},{default:a(()=>[r(s(c.sync_status||"unknown"),1)]),_:2},1032,["color"])):n.key==="updated_at"?(p(),A(ne,{key:5},[r(s(e.formatTime(c.updated_at)),1)],64)):n.key==="actions"?(p(),x(O,{key:6,onClick:l[2]||(l[2]=ge(()=>{},["stop"]))},{default:a(()=>[t(y,{size:"small",onClick:q=>e.openDetail(c)},{default:a(()=>[...l[26]||(l[26]=[r("详情",-1)])]),_:1},8,["onClick"]),t(V,{title:`删除项目 '${c.name}' ?`,"ok-text":"删除","ok-type":"danger","cancel-text":"取消",onConfirm:q=>e.onDelete(c)},{default:a(()=>[t(y,{size:"small",danger:""},{default:a(()=>[...l[27]||(l[27]=[r("删除",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)):_("v-if",!0)]),_:1},8,["data-source","loading"])):_("v-if",!0),_(" Detail drawer "),t(X,{open:e.detailOpen,"onUpdate:open":l[3]||(l[3]=n=>e.detailOpen=n),title:e.detail?.name||"项目详情",width:"640",placement:"right"},{default:a(()=>[e.detail?(p(),x(H,{key:0,column:1,bordered:"",size:"small"},{default:a(()=>[t(g,{label:"ID"},{default:a(()=>[I("code",null,s(e.detail.id),1)]),_:1}),t(g,{label:"名称"},{default:a(()=>[r(s(e.detail.name),1)]),_:1}),t(g,{label:"描述"},{default:a(()=>[r(s(e.detail.description||"-"),1)]),_:1}),t(g,{label:"类型"},{default:a(()=>[t(z,null,{default:a(()=>[r(s(e.detail.project_type),1)]),_:1})]),_:1}),t(g,{label:"状态"},{default:a(()=>[t(z,{color:e.statusColor(e.detail.status)},{default:a(()=>[r(s(e.detail.status),1)]),_:1},8,["color"])]),_:1}),t(g,{label:"同步状态"},{default:a(()=>[t(z,{color:e.syncColor(e.detail.sync_status)},{default:a(()=>[r(s(e.detail.sync_status||"unknown"),1)]),_:1},8,["color"])]),_:1}),t(g,{label:"用户"},{default:a(()=>[r(s(e.detail.user_id),1)]),_:1}),t(g,{label:"根路径"},{default:a(()=>[e.detail.root_path?(p(),A("code",Re,s(e.detail.root_path),1)):(p(),A("span",Te,"(无)"))]),_:1}),t(g,{label:"文件数"},{default:a(()=>[r(s(e.detail.file_count||0),1)]),_:1}),t(g,{label:"创建"},{default:a(()=>[r(s(e.formatTime(e.detail.created_at)),1)]),_:1}),t(g,{label:"更新"},{default:a(()=>[r(s(e.formatTime(e.detail.updated_at)),1)]),_:1})]),_:1})):_("v-if",!0),t(K,null,{default:a(()=>[...l[28]||(l[28]=[r("文件",-1)])]),_:1}),_(" Sub-phase 7.3 (2026-05-17): 文件 CRUD toolbar "),t(O,{style:{"margin-bottom":"12px"}},{default:a(()=>[t(y,{size:"small",type:"primary",disabled:!e.detail,onClick:e.openCreateFile},{default:a(()=>[t(e.FileAddOutlined),l[29]||(l[29]=r(" 新建文件 ",-1))]),_:1},8,["disabled"]),t(y,{size:"small",disabled:!e.detail,onClick:e.openCreateFolder},{default:a(()=>[t(e.FolderAddOutlined),l[30]||(l[30]=r(" 新建文件夹 ",-1))]),_:1},8,["disabled"])]),_:1}),t(G,{spinning:e.filesLoading},{default:a(()=>[!e.files.length&&!e.filesLoading?(p(),x(C,{key:0,description:"无文件 (点上方按钮新建)"})):(p(),x(M,{key:1,size:"small","data-source":e.files},{renderItem:a(({item:n})=>[t(Q,null,{extra:a(()=>[t(O,null,{default:a(()=>[n.file_size?(p(),A("span",Le,s(n.file_size)+" B",1)):_("v-if",!0),t(V,{title:`删除 ${n.is_folder?"文件夹":"文件"} '${n.file_name}' ?`,"ok-text":"删除","ok-type":"danger","cancel-text":"取消",onConfirm:c=>e.onDeleteFile(n)},{default:a(()=>[t(y,{size:"small",danger:""},{default:a(()=>[...l[31]||(l[31]=[r("×",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)]),default:a(()=>[I("span",{style:{cursor:"pointer"},onClick:c=>e.openEditFile(n)},s(n.is_folder?"📁":"📄")+" "+s(n.file_path),9,Be)]),_:2},1024)]),_:1},8,["data-source"]))]),_:1},8,["spinning"])]),_:1},8,["open","title"]),_(" Sub-phase 7.3: Create file modal "),t(h,{open:e.createFileOpen,"onUpdate:open":l[6]||(l[6]=n=>e.createFileOpen=n),title:"新建文件","confirm-loading":e.creatingFile,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreateFile},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(b,{label:"文件路径(项目内)",required:""},{default:a(()=>[t(T,{value:e.newFile.path,"onUpdate:value":l[4]||(l[4]=n=>e.newFile.path=n),placeholder:"例如 README.md 或 src/main.kt"},null,8,["value"])]),_:1}),t(b,{label:"初始内容(可选)"},{default:a(()=>[t(D,{value:e.newFile.content,"onUpdate:value":l[5]||(l[5]=n=>e.newFile.content=n),rows:6,placeholder:"留空创建空文件"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),_(" Sub-phase 7.3: Create folder modal "),t(h,{open:e.createFolderOpen,"onUpdate:open":l[8]||(l[8]=n=>e.createFolderOpen=n),title:"新建文件夹","confirm-loading":e.creatingFolder,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreateFolder},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(b,{label:"文件夹路径(项目内)",required:""},{default:a(()=>[t(T,{value:e.newFolder.path,"onUpdate:value":l[7]||(l[7]=n=>e.newFolder.path=n),placeholder:"例如 src/utils"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),_(" Sub-phase 7.3: Edit file content modal "),t(h,{open:e.editFileOpen,"onUpdate:open":l[10]||(l[10]=n=>e.editFileOpen=n),title:`编辑 ${e.editingFile?.file_name||""}`,"confirm-loading":e.savingFile,"ok-text":"保存","cancel-text":"取消",onOk:e.onSaveFile,width:"720"},{default:a(()=>[t(D,{value:e.editFileContent,"onUpdate:value":l[9]||(l[9]=n=>e.editFileContent=n),rows:18,"auto-size":{minRows:12,maxRows:24},style:{"font-family":"monospace"}},null,8,["value"])]),_:1},8,["open","title","confirm-loading"]),_(" Create modal "),t(h,{open:e.createOpen,"onUpdate:open":l[15]||(l[15]=n=>e.createOpen=n),title:"新建项目","confirm-loading":e.creating,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreate},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(b,{label:"项目名称",required:""},{default:a(()=>[t(T,{value:e.newProject.name,"onUpdate:value":l[11]||(l[11]=n=>e.newProject.name=n),placeholder:"例如:旅行计划-上海"},null,8,["value"])]),_:1}),t(b,{label:"描述"},{default:a(()=>[t(D,{value:e.newProject.description,"onUpdate:value":l[12]||(l[12]=n=>e.newProject.description=n),rows:2},null,8,["value"])]),_:1}),t(b,{label:"类型"},{default:a(()=>[t(R,{value:e.newProject.type,"onUpdate:value":l[13]||(l[13]=n=>e.newProject.type=n)},{default:a(()=>[t(m,{value:"document"},{default:a(()=>[...l[32]||(l[32]=[r("文档 (document)",-1)])]),_:1}),t(m,{value:"data"},{default:a(()=>[...l[33]||(l[33]=[r("数据 (data)",-1)])]),_:1}),t(m,{value:"web"},{default:a(()=>[...l[34]||(l[34]=[r("Web",-1)])]),_:1}),t(m,{value:"app"},{default:a(()=>[...l[35]||(l[35]=[r("应用 (app)",-1)])]),_:1}),t(m,{value:"presentation"},{default:a(()=>[...l[36]||(l[36]=[r("演示文稿",-1)])]),_:1}),t(m,{value:"spreadsheet"},{default:a(()=>[...l[37]||(l[37]=[r("表格",-1)])]),_:1}),t(m,{value:"design"},{default:a(()=>[...l[38]||(l[38]=[r("设计",-1)])]),_:1}),t(m,{value:"code"},{default:a(()=>[...l[39]||(l[39]=[r("代码",-1)])]),_:1}),t(m,{value:"workflow"},{default:a(()=>[...l[40]||(l[40]=[r("工作流",-1)])]),_:1}),t(m,{value:"knowledge"},{default:a(()=>[...l[41]||(l[41]=[r("知识库",-1)])]),_:1})]),_:1},8,["value"])]),_:1}),t(b,{label:"根路径 (可选)"},{default:a(()=>[t(T,{value:e.newProject.rootPath,"onUpdate:value":l[14]||(l[14]=n=>e.newProject.rootPath=n),placeholder:"留空则仅元数据"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"])])}const We=we(Pe,[["render",Ee],["__scopeId","data-v-019ac5aa"],["__file","/tmp/cc-web-panel-d0LHhd/repo/packages/web-panel/src/views/Projects.vue"]]);export{We as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Q as r}from"./index-DSgroT-P.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-BdAjmDBO.js";import{a0 as t}from"./index-DSgroT-P.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-DYmiKhJa.js";import"./useFlexGapSupport-DQ5qSQlN.js";import"./styleChecker-BFgOb1vz.js";import"./index-CZX4_hGp.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as o}from"./Col-4wGBC25p.js";import{a0 as t}from"./index-DSgroT-P.js";import"./vendor-Bn1JzzAn.js";import"./index-CZX4_hGp.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};
|