chainlesschain 0.166.127 → 0.166.128

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/README.md +11 -1
  2. package/package.json +1 -1
  3. package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
  4. package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
  5. package/src/assets/web-panel/assets/{AIOps-DkSOwKNn.js → AIOps-BmGA5zXX.js} +1 -1
  6. package/src/assets/web-panel/assets/{ActionButton-CaYSnkeR.js → ActionButton-B7WXwoF0.js} +1 -1
  7. package/src/assets/web-panel/assets/{Analytics-D8kEgXLP.js → Analytics-IvJG43B5.js} +2 -2
  8. package/src/assets/web-panel/assets/{AppLayout-D43FaO4a.js → AppLayout-DWY017_e.js} +5 -5
  9. package/src/assets/web-panel/assets/Artifacts-BOyohM_-.js +1 -0
  10. package/src/assets/web-panel/assets/{Audit-0ogv1Zu5.js → Audit-CD9sTnBN.js} +1 -1
  11. package/src/assets/web-panel/assets/{BackgroundAgents-BhLnn-Gw.js → BackgroundAgents-J6gg5z0U.js} +1 -1
  12. package/src/assets/web-panel/assets/{Backup-D4591rlk.js → Backup-D7ik3lse.js} +1 -1
  13. package/src/assets/web-panel/assets/{BaseInput-gK1PjPDZ.js → BaseInput-MrDd5zcz.js} +1 -1
  14. package/src/assets/web-panel/assets/{Chat-CCDmOYwg.js → Chat-DbxRqGiK.js} +5 -5
  15. package/src/assets/web-panel/assets/ChatBubbleRenderer-DbeJAwMg.js +1 -0
  16. package/src/assets/web-panel/assets/{Checkbox-DG4PRH9M.js → Checkbox-CditB77B.js} +1 -1
  17. package/src/assets/web-panel/assets/{Codegen-DtJxGiSg.js → Codegen-Ds0UZWZG.js} +1 -1
  18. package/src/assets/web-panel/assets/{Col-4wGBC25p.js → Col-CZlj1XI2.js} +1 -1
  19. package/src/assets/web-panel/assets/{Community-dOCSc8t-.js → Community-j4B2SoT6.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compact-Du4kXsyN.js → Compact-BuKQutaO.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compliance-BbI5XMcz.js → Compliance-DAgDyS-p.js} +1 -1
  22. package/src/assets/web-panel/assets/{Cowork-CbQRpyiK.js → Cowork-DX2-I6V3.js} +2 -2
  23. package/src/assets/web-panel/assets/{Cron-CtWy2bMC.js → Cron-dJpc-FxX.js} +2 -2
  24. package/src/assets/web-panel/assets/{Crosschain-CzdM5hF6.js → Crosschain-7m8euM3v.js} +1 -1
  25. package/src/assets/web-panel/assets/{DID-CcBboBJN.js → DID-CLoYoCe1.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dashboard-I7m0oCeC.js → Dashboard-DR1rRMb7.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dropdown-CKIy2Ikn.js → Dropdown-BsKhCfvH.js} +1 -1
  28. package/src/assets/web-panel/assets/{EmailListRenderer-BNuxCq89.js → EmailListRenderer-BAGexzJu.js} +1 -1
  29. package/src/assets/web-panel/assets/EvolutionSettings-BqYYmC01.js +1 -0
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-QThmET-n.js → FamilyGuardDashboard-BIpueefy.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-Bqf7YYlV.js → Federation-BluNep6d.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-DZAM28ve.js → FormItemContext-CerdM3am.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-DunXFYML.js → GenericCardRenderer-DXh4tOjU.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-BgwOjaMf.js → Git-CEE0cGmf.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-B1za4wCP.js → Governance-Bc-XNDhM.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-DMPqX1oN.js → Inference-CiBzXyZ-.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-ChDn3okr.js → KnowledgeGraph-CV2IiyuN.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-BQoPB6-O.js → Logs-fbQYKuSz.js} +2 -2
  39. package/src/assets/web-panel/assets/MarkdownRenderer-B73ZyMRI.js +1 -0
  40. package/src/assets/web-panel/assets/{Marketplace-DZXEaPpe.js → Marketplace-C5utdpxZ.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-CZbVOFaG.js → McpTools-CPE4SaF3.js} +3 -3
  42. package/src/assets/web-panel/assets/{Memory-Cl3T8asu.js → Memory-DTFDszzk.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-DK_ayU9I.js → MobileBridge-DxqPmTzP.js} +1 -1
  44. package/src/assets/web-panel/assets/{MobileProjects-DEWAA2gT.js → MobileProjects-CwcK8l2y.js} +1 -1
  45. package/src/assets/web-panel/assets/{Mtc-z-XAWzMh.js → Mtc-DrjECLGO.js} +2 -2
  46. package/src/assets/web-panel/assets/{MtcAudit-CX7qJvQS.js → MtcAudit-4IURCa-3.js} +5 -5
  47. package/src/assets/web-panel/assets/{Multisig-DiQlKgxx.js → Multisig-CggLV1Cp.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-Ciuxcu00.js → NLProgramming-DkOQJT73.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-BAvqNw_6.js → Notes-Dodcva6s.js} +3 -3
  50. package/src/assets/web-panel/assets/{NotificationSettings-DkHDTslA.js → NotificationSettings-CQ3HeTs6.js} +1 -1
  51. package/src/assets/web-panel/assets/{OrderTableRenderer--WZdD2oV.js → OrderTableRenderer-pT2nzmIO.js} +1 -1
  52. package/src/assets/web-panel/assets/{Organization-Bv6bMLCe.js → Organization-B6HFsIfU.js} +4 -4
  53. package/src/assets/web-panel/assets/{Overflow-Bwoz_oq1.js → Overflow-G9dju55N.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-De7T0ZeB.js → P2P-C1BCE155.js} +2 -2
  55. package/src/assets/web-panel/assets/{PdhVaultBrowser-Dblr2x25.js → PdhVaultBrowser-BFAxXn5D.js} +3 -3
  56. package/src/assets/web-panel/assets/{Permissions-C-jAt-cg.js → Permissions-DWg7cw9Q.js} +4 -4
  57. package/src/assets/web-panel/assets/{PersonalDataHub-yXeXDMgf.js → PersonalDataHub-BQxuOQOO.js} +3 -3
  58. package/src/assets/web-panel/assets/{Pipeline-C8CYoLOa.js → Pipeline-C3Gse9Ne.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-B-gwnOGT.js → Privacy-Dcsjx6Oi.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-CbNjHiBV.js → ProjectInit-DeYlnXJQ.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-BMUY0GCP.js → ProjectSettings-D7kbZ_K7.js} +2 -2
  62. package/src/assets/web-panel/assets/Projects-C5m3NGzM.js +1 -0
  63. package/src/assets/web-panel/assets/{Providers-K_tlWkON.js → Providers-oT6jy83z.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-2RSZDzJI.js → QrScannerModal-NZ11GEBa.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-mhbcQRMI.js → QuickAsk-CtQU4Tx0.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-BXm0uG0q.js → Recommend-3CoXYu3O.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-xhOpmNZG.js → RemoteSession-C2d4LzBM.js} +3 -3
  68. package/src/assets/web-panel/assets/{Reputation-CwbCWB-3.js → Reputation-WZQHrGwl.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-BdAjmDBO.js → Row-ChiqY7Hg.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-Cq4LZ9WU.js → RssFeed-Cjwl2Kum.js} +2 -2
  71. package/src/assets/web-panel/assets/{Search-C_I6B-4l.js → Search-DRDMZxTF.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-CdH6mzL-.js → Security-D0y4LlQ4.js} +3 -3
  73. package/src/assets/web-panel/assets/{Services-CWu1wqtS.js → Services-ChpkqWm0.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-daw9DiVM.js → Skeleton-D3WGZ8yO.js} +1 -1
  75. package/src/assets/web-panel/assets/{Skills-CmurIxkM.js → Skills-Bv_7HaUW.js} +1 -1
  76. package/src/assets/web-panel/assets/{Sla-cETA5aPO.js → Sla-crZMKyX0.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-B1llZgu3.js → SpeechSettings-ByWn5XDZ.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-DufZ-B2q.js → SyncSettings--R55vxvj.js} +2 -2
  79. package/src/assets/web-panel/assets/{Tasks-PfRLKTFY.js → Tasks-BZA_Via_.js} +1 -1
  80. package/src/assets/web-panel/assets/{Templates-DGtz-vT8.js → Templates-9eJ9yY8Q.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-JeKYLN0b.js → Tenant-CfWX2jqj.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-BiMsF2Y0.js → Terminal-CUXUF4kL.js} +2 -2
  83. package/src/assets/web-panel/assets/TimelineRenderer-77y9bkYN.js +1 -0
  84. package/src/assets/web-panel/assets/{Tokens-DpIg-0ju.js → Tokens-CvyrdLH6.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-DreKHxyb.js → Trigger-MNRl_YNr.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-D7ByQvBQ.js → Trust-BHOXK-Mp.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-OudyQByy.js → UkeySign-Bz1oZNyQ.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-BhU6nzCF.js → VideoEditing-DlqmXyZv.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-BCEpB6E0.js → Wallet-Dg1rnqEG.js} +4 -4
  90. package/src/assets/web-panel/assets/{WebAuthn-DwjAM5Mr.js → WebAuthn-DJtGeaOk.js} +5 -5
  91. package/src/assets/web-panel/assets/{WorkflowEditor-ChQqlAmY.js → WorkflowEditor-DJPubjX5.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-CzUKWqTy.js → chat-BWweDuIV.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-D3Y_Pvu4.js → colors-BX5ViADF.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-ByyPRfkA.js → compact-item-Df8MLbXp.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-Dt5PF6VI.js → createContext-C0FDTwdV.js} +1 -1
  96. package/src/assets/web-panel/assets/devWarning-BgM5vq1s.js +1 -0
  97. package/src/assets/web-panel/assets/{hasIn-BuIaEKuC.js → hasIn-PpL6GdNk.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-DWW5svXU.js → index-7VyVOEf7.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-NFqKQquS.js → index-B3K1uZ7R.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DHzVIQLX.js → index-B4UxFB2N.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BztqxXMP.js → index-B8-pSyP7.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-B600riYP.js → index-B982oUKN.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-CFXZ9lbO.js → index-BF0ERucU.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BmVY2f7I.js → index-BMIEWinN.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-EtrWRKu2.js → index-BWSCphaT.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DSXjiZAV.js → index-BeFhy4BX.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-CgPKUSe4.js → index-Beh1kLwx.js} +1 -1
  108. package/src/assets/web-panel/assets/index-Bl-HTXWn.js +1 -0
  109. package/src/assets/web-panel/assets/{index-D51wU4q-.js → index-C0PqPK-8.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Di78LDr8.js → index-C2JU-gdS.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-_oJnnOnZ.js → index-C8wl7Ica.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-CZX4_hGp.js → index-C9FOwTgX.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-Dlec7Sr4.js → index-C9N1u8jV.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BcqZAAr5.js → index-Cf86RSQk.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BwlY7Yap.js → index-ChV82mzs.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CmrfHS36.js → index-Cj00JSqq.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-GyTOYTFg.js → index-Cm7vZvA3.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DSgroT-P.js → index-CmMzB4C-.js} +3 -3
  119. package/src/assets/web-panel/assets/{index-BSWTyRhI.js → index-CxY_U5RT.js} +1 -1
  120. package/src/assets/web-panel/assets/index-Cxf0YfM5.js +1 -0
  121. package/src/assets/web-panel/assets/{index-COsjgjvP.js → index-D5Ei75Wt.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-BdvZNMNm.js → index-DBzaRg4E.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-F-T8AHeo.js → index-DFtzEEYe.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DxVLI-Iu.js → index-DGLbojjx.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-D7QSTEjb.js → index-D_6XIMVV.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-1YgdY0Vq.js → index-DddQd0_V.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-Cb7MzML-.js → index-DwZkBGXd.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-gg5zO3aD.js → index-DxJqyIP8.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-huWw0XBb.js → index-Dy8K2laU.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-DpAqy6Co.js → index-FAZH69my.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CByWkXdO.js → index-NdEUFm32.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-BO29sPX8.js → index-P1ERNJla.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-CCBm8_o4.js → index-R0LQ3fgq.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-CAfX0VyL.js → index-UXM5vpt4.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-CDTS4qJm.js → index-iif2A1eL.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-BFQGN97S.js → index-itNn6pW1.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-Bny6G13G.js → initDefaultProps-DeMthvi4.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-DRhRj_uM.js → motion-_7kbkzE0.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-D0wKnhYr.js → move-gCI04pLw.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-BXXSTJBk.js → mtc-parser-D5UWHv2U.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-d8t9Yze4.js → omit-CDCZcqeS.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-nyB6BMe6.js → pickAttrs-DGMDLi3S.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-CSFyBNA2.js → placementArrow-C-3vC1Vh.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-DYmiKhJa.js → responsiveObserve-vdoYucvi.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-D4KZSRmt.js → slide-B62FhgyZ.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-BcrcPeFm.js → statusUtils-DCLlfnym.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-BFgOb1vz.js → styleChecker-CGvQ4LRR.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-DQ5qSQlN.js → useFlexGapSupport-BqkGoKwe.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-Cafq069l.js → useFs-Bkr_nU3q.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-DTma9Ary.js → usePersonalDataHub-CYxMIUEq.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-HvC2-bE9.js → vnode-sAbcY1FX.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-AZxADWXu.js → zoom-Dm2pLrXi.js} +1 -1
  153. package/src/assets/web-panel/index.html +1 -1
  154. package/src/command-help-index.json +1 -1
  155. package/src/commands/agent.js +29 -0
  156. package/src/commands/setup.js +35 -10
  157. package/src/constants.js +15 -89
  158. package/src/data/changelog.json +14 -1
  159. package/src/lib/bm25-search.js +6 -3
  160. package/src/lib/coding-task-guidance.js +6 -1
  161. package/src/lib/context-memory-kernel/memory-query-index.js +35 -17
  162. package/src/lib/goal-check-evidence.js +159 -0
  163. package/src/lib/goal-condition-engine.js +24 -2
  164. package/src/lib/llm-connection-probe.js +48 -4
  165. package/src/lib/llm-onboarding-catalog.json +131 -0
  166. package/src/lib/skill-retrieval-router.js +2 -1
  167. package/src/lib/skill-search-tokenizer.js +143 -0
  168. package/src/repl/agent-repl.js +8 -4
  169. package/src/runtime/agent-core.js +87 -7
  170. package/src/runtime/headless-runner.js +138 -66
  171. package/src/runtime/headless-stream.js +1 -0
  172. package/src/runtime/mcp-tool-search-ranking.js +142 -0
  173. package/src/runtime/mcp-tool-search.js +198 -60
  174. package/src/assets/web-panel/assets/Artifacts-DfxY2Gqs.js +0 -1
  175. package/src/assets/web-panel/assets/ChatBubbleRenderer-CnpWe3dp.js +0 -1
  176. package/src/assets/web-panel/assets/EvolutionSettings-BeBovLZs.js +0 -1
  177. package/src/assets/web-panel/assets/MarkdownRenderer-uS1yHX12.js +0 -1
  178. package/src/assets/web-panel/assets/Projects-DpCaWXv6.js +0 -1
  179. package/src/assets/web-panel/assets/TimelineRenderer-DhcBAGPg.js +0 -1
  180. package/src/assets/web-panel/assets/devWarning-BgSxkkQ3.js +0 -1
  181. package/src/assets/web-panel/assets/index-D5v6roiB.js +0 -1
  182. 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
- return {
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 normalizeTerms(query) {
459
- return String(query || "")
460
- .toLowerCase()
461
- .split(/[\s,]+/)
462
- .map((t) => t.trim())
463
- .filter(Boolean);
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 the deferred-tool registry. Two modes:
468
- * - `select:name1,name2` — exact names; a bare (un-prefixed) tool name is
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 configuredMaxResults = registry?.maxResults;
479
- const maxResults =
480
- Number.isInteger(opts.maxResults) && opts.maxResults > 0
481
- ? Math.min(opts.maxResults, 50)
482
- : Number.isInteger(configuredMaxResults) && configuredMaxResults > 0
483
- ? Math.min(configuredMaxResults, 50)
484
- : TOOL_SEARCH_DEFAULTS.maxResults;
485
- const entries = new Map(
486
- [...(registry?.deferred || [])].filter(([, entry]) => entry.stale !== true),
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 (/^select:/i.test(q)) {
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: scored.slice(0, maxResults),
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
- payload.available = [...(registry?.deferred || [])]
615
- .filter(([, entry]) => entry.stale !== true)
616
- .map(([name]) => name)
617
- .slice(0, 100);
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
- "Schemas loaded — call these tools directly with arguments matching `parameters`." +
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 sent = estimateToolDefTokens(def, estimate);
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 === def ? sent : estimateToolDefTokens(fullDef, estimate);
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: { active, deferredCount, loadedCount },
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{E as H,b as z,r as C,I as k,J as y,U as _,c as r,K as o,S as R,V as B,o as V,f as D,P as d,Q as f,R as p,F as j}from"./vendor-Bn1JzzAn.js";import{M as J}from"./MarkdownRenderer-uS1yHX12.js";import{u as F,_ as Q,d as S}from"./index-DSgroT-P.js";import{R as W}from"./icons-DG5UD-6K.js";import"./markdown-Bq2x0XsR.js";import"./markdown-DUKxbhE4.js";const K=H("artifacts",()=>{const h=C([]),t=C(!1),u=C(""),e=C(""),v=C(null),b=C(!1),A=z(()=>[...new Set(h.value.map(a=>a.kind).filter(Boolean))].sort());async function l(){const n=F();t.value=!0;try{const a={type:"artifact-list"};u.value&&(a.kind=u.value),e.value&&(a.session=e.value);const s=await n.sendRaw(a);s&&Array.isArray(s.artifacts)&&(h.value=[...s.artifacts].reverse())}catch{}finally{t.value=!1}}async function g(n){const a=F();b.value=!0,v.value={entry:n,previewable:!1};try{const s=await a.sendRaw({type:"artifact-content",artifactId:n.id});v.value={entry:n,previewable:s?.previewable===!0,encoding:s?.encoding||null,content:s?.content||"",truncated:s?.truncated===!0,reason:s?.reason||null}}catch(s){v.value={entry:n,previewable:!1,reason:s?.message||"preview failed"}}finally{b.value=!1}}function i(){v.value=null}const m=z(()=>{const n=v.value;return!n?.previewable||n.encoding!=="base64"?null:`data:${n.entry?.mime||"image/png"};base64,${n.content}`}),O=z(()=>{const n=v.value;return n?.previewable===!0&&n.encoding==="utf8"&&String(n.entry?.mime||"").toLowerCase()==="text/markdown"});async function M(n,a={}){if(!n?.id)return!1;const s=a.fetch||globalThis.fetch,L=a.document||globalThis.document,T=a.URL||globalThis.URL,N=(a.config||globalThis.window?.__CC_CONFIG__)??{};try{const U=await s(`/api/artifacts/${n.id}/download`,{headers:N.wsToken?{Authorization:`Bearer ${N.wsToken}`}:{}});if(!U.ok)return!1;const G=await U.blob(),E=T.createObjectURL(G),I=L.createElement("a");return I.href=E,I.download=n.title||n.id,L.body.appendChild(I),I.click(),I.remove(),T.revokeObjectURL(E),!0}catch{return!1}}async function P(n){const a=F();if(!n)return!1;try{const s=await a.sendRaw({type:"artifact-remove",artifactId:n});return v.value?.entry?.id===n&&(v.value=null),await l(),s?.found===!0}catch{return!1}}async function c(){const n=F();try{const a=await n.sendRaw({type:"artifact-clean"});return await l(),Number(a?.removed)||0}catch{return 0}}function w(n){const a=Number(n)||0;return a<1024?`${a} B`:a<1024*1024?`${(a/1024).toFixed(1)} KB`:`${(a/(1024*1024)).toFixed(1)} MB`}function x(n){switch(n){case"report":return"blue";case"patch":return"purple";case"screenshot":return"cyan";case"log":return"default";case"data":return"green";default:return"default"}}return{artifacts:h,loading:t,kindFilter:u,sessionFilter:e,kinds:A,preview:v,previewLoading:b,previewImageSrc:m,previewIsMarkdown:O,fetchArtifacts:l,openPreview:g,closePreview:i,removeArtifact:P,cleanExpired:c,downloadArtifact:M,formatSize:w,kindColor:x}}),q={__name:"Artifacts",setup(h,{expose:t}){t();const u=K(),e=[{title:"标题",key:"title",dataIndex:"title",ellipsis:!0},{title:"类型",key:"kind",dataIndex:"kind",width:110},{title:"MIME",dataIndex:"mime",width:160,ellipsis:!0},{title:"大小",key:"size",dataIndex:"size",width:90},{title:"发布时间",key:"createdAt",dataIndex:"createdAt",width:170},{title:"会话",dataIndex:"sessionId",width:160,ellipsis:!0},{title:"操作",key:"actions",width:150}],v=z(()=>u.kinds.map(i=>({label:i,value:i})));async function b(i){await u.removeArtifact(i)?S.success("已删除"):S.error("删除失败")}async function A(){const i=await u.cleanExpired();S.info(i>0?`清理了 ${i} 个过期交付物`:"没有过期交付物")}async function l(i){await u.downloadArtifact(i)||S.error("下载失败")}V(()=>{u.fetchArtifacts()}),D(()=>{u.closePreview()});const g={store:u,columns:e,kindOptions:v,onRemove:b,onClean:A,onDownload:l,computed:z,onBeforeUnmount:D,onMounted:V,get ReloadOutlined(){return W},get message(){return S},MarkdownRenderer:J,get useArtifactsStore(){return K}};return Object.defineProperty(g,"__isScriptSetup",{enumerable:!1,value:!0}),g}},X={class:"page-header"},Y=["onClick"],Z=["src"],$={key:1,class:"preview-markdown"},ee={key:2,class:"preview-text"},te={class:"preview-meta"},ne={key:0};function ae(h,t,u,e,v,b){const A=k("a-select"),l=k("a-button"),g=k("a-popconfirm"),i=k("a-space"),m=k("a-tag"),O=k("a-table"),M=k("a-empty"),P=k("a-card");return d(),y("div",null,[_("div",X,[t[7]||(t[7]=_("div",null,[_("h2",{class:"page-title"},"交付物"),_("p",{class:"page-sub"}," agent 用 publish_artifact 发布的交付物(报告 / patch / 截图 / 日志),在这里预览与管理(cc artifacts 同源)。 ")],-1)),r(i,null,{default:o(()=>[r(A,{value:e.store.kindFilter,"onUpdate:value":t[0]||(t[0]=c=>e.store.kindFilter=c),style:{"min-width":"120px"},placeholder:"全部类型","allow-clear":"",options:e.kindOptions,onChange:t[1]||(t[1]=c=>e.store.fetchArtifacts())},null,8,["value","options"]),r(g,{title:"删除所有过期交付物?",onConfirm:e.onClean},{default:o(()=>[r(l,null,{default:o(()=>[...t[5]||(t[5]=[f("清理过期",-1)])]),_:1})]),_:1}),r(l,{ghost:"",loading:e.store.loading,onClick:t[2]||(t[2]=c=>e.store.fetchArtifacts())},{icon:o(()=>[r(e.ReloadOutlined)]),default:o(()=>[t[6]||(t[6]=f(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),r(O,{"data-source":e.store.artifacts,columns:e.columns,"row-key":"id",size:"small",pagination:{pageSize:10,hideOnSinglePage:!0}},{bodyCell:o(({column:c,record:w})=>[c.key==="title"?(d(),y("a",{key:0,onClick:x=>e.store.openPreview(w)},p(w.title),9,Y)):c.key==="kind"?(d(),R(m,{key:1,color:e.store.kindColor(w.kind)},{default:o(()=>[f(p(w.kind),1)]),_:2},1032,["color"])):c.key==="size"?(d(),y(j,{key:2},[f(p(e.store.formatSize(w.size)),1)],64)):c.key==="createdAt"?(d(),y(j,{key:3},[f(p((w.createdAt||"").replace("T"," ").slice(0,19)),1)],64)):c.key==="actions"?(d(),R(i,{key:4},{default:o(()=>[r(l,{size:"small",onClick:x=>e.store.openPreview(w)},{default:o(()=>[...t[8]||(t[8]=[f("预览",-1)])]),_:1},8,["onClick"]),r(l,{size:"small",onClick:x=>e.onDownload(w)},{default:o(()=>[...t[9]||(t[9]=[f("下载",-1)])]),_:1},8,["onClick"]),r(g,{title:"删除该交付物?",onConfirm:x=>e.onRemove(w.id)},{default:o(()=>[r(l,{size:"small",danger:""},{default:o(()=>[...t[10]||(t[10]=[f("删除",-1)])]),_:1})]),_:1},8,["onConfirm"])]),_:2},1024)):B("v-if",!0)]),_:1},8,["data-source"]),e.store.preview?(d(),R(P,{key:0,size:"small",class:"preview-card",loading:e.store.previewLoading},{title:o(()=>[r(i,null,{default:o(()=>[_("span",null,p(e.store.preview.entry?.title),1),r(m,{color:e.store.kindColor(e.store.preview.entry?.kind)},{default:o(()=>[f(p(e.store.preview.entry?.kind),1)]),_:1},8,["color"]),r(m,{color:"default"},{default:o(()=>[f(p(e.store.preview.entry?.mime),1)]),_:1}),e.store.preview.truncated?(d(),R(m,{key:0,color:"warning"},{default:o(()=>[...t[11]||(t[11]=[f("已截断预览",-1)])]),_:1})):B("v-if",!0)]),_:1})]),extra:o(()=>[r(i,null,{default:o(()=>[r(l,{size:"small",onClick:t[3]||(t[3]=c=>e.onDownload(e.store.preview.entry))},{default:o(()=>[...t[12]||(t[12]=[f("下载",-1)])]),_:1}),r(l,{size:"small",onClick:t[4]||(t[4]=c=>e.store.closePreview())},{default:o(()=>[...t[13]||(t[13]=[f("关闭",-1)])]),_:1})]),_:1})]),default:o(()=>[e.store.previewImageSrc?(d(),y("img",{key:0,src:e.store.previewImageSrc,class:"preview-image",alt:"artifact preview"},null,8,Z)):e.store.previewIsMarkdown?(d(),y("div",$,[r(e.MarkdownRenderer,{content:e.store.preview.content||""},null,8,["content"])])):e.store.preview.previewable?(d(),y("pre",ee,p(e.store.preview.content||"(空文件)"),1)):(d(),R(M,{key:3,description:e.store.preview.reason||"该类型不支持在线预览,可在本机用 cc artifacts open <id> 打开"},null,8,["description"])),_("div",te,[_("span",null,p(e.store.preview.entry?.id),1),e.store.preview.entry?.sessionId?(d(),y("span",ne," · session "+p(e.store.preview.entry.sessionId),1)):B("v-if",!0),_("span",null," · sha256 "+p((e.store.preview.entry?.sha256||"").slice(0,12))+"…",1)])]),_:1},8,["loading"])):B("v-if",!0)])}const de=Q(q,[["render",ae],["__scopeId","data-v-c8b48f8c"],["__file","/tmp/cc-web-panel-d0LHhd/repo/packages/web-panel/src/views/Artifacts.vue"]]);export{de as default};
@@ -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{I as s,J as T,U as i,c as a,K as o,S as j,V as C,o as V,r as k,a as A,b as I,P,Q as c,R as v,F as q,Z as z}from"./vendor-Bn1JzzAn.js";import{_ as W,u as N,d}from"./index-DSgroT-P.js";import{R as F}from"./icons-DG5UD-6K.js";function B(h){return["ask","agent"].map(t=>{const n=h?.readiness?.[t],e=n?.state==="admitted",m=n?.scope==="deployment-admission"&&n.runtimeVerification==="not_checked"&&Array.isArray(n.requiredCommands)&&n.requiredCommands.includes(t)&&(e?n.ready===!0&&n.taskReady===null:["not_configured","disabled","invalid","command_not_allowed"].includes(n.state)&&n.ready===!1&&n.taskReady===!1);return{command:t,state:m?n.state:"unknown",summary:m?e?"部署准入通过":"部署准入被阻断":"未提供准入诊断",detail:m&&typeof n.detail=="string"?n.detail:"当前 CLI 未提供可识别的部署准入诊断,请更新 CLI。",remediation:m&&typeof n.remediation=="string"?n.remediation:""}})}function H(h,t){for(const n of Object.keys(h))delete h[n];Object.assign(h,{source:"none",effectiveEnabled:!1,profileEnabled:!1,verified:!1,commands:[],readiness:null},t||{})}const J={__name:"EvolutionSettings",setup(h,{expose:t}){t();const n=N(),e=k(!1),m=k(!1),S=k(!1),_=k(!1),R=k(!1),y=k(""),f=k(""),p=k(""),u=A({source:"none",effectiveEnabled:!1,profileEnabled:!1,verified:!1,commands:[]}),x=I(()=>e.value||m.value||S.value||_.value||R.value),O=I(()=>B(u));function w(r){H(u,r),f.value=u.descriptorPath||"",p.value=u.trustRootPath||"",y.value=u.modulePath||y.value||""}async function g(r,U=3e4){return await n.waitConnected(8e3),(await n.sendRaw(r,U)).result}async function E(){e.value=!0;try{w(await g({type:"evolution.deployment.status"}))}catch(r){d.error("读取配置失败:"+r.message)}finally{e.value=!1}}async function b(){if(!f.value.trim()||!p.value.trim()){d.warning("请填写描述符和信任根公钥的绝对路径");return}m.value=!0;try{w(await g({type:"evolution.deployment.configure",descriptorPath:f.value.trim(),trustRootPath:p.value.trim()},6e4)),d.success("签名校验通过,配置已保存并启用;自动发布仍为 HOLD")}catch(r){d.error("配置失败:"+r.message)}finally{m.value=!1}}async function D(){if(!y.value.trim()){d.warning("请填写测试部署宿主模块的服务器绝对路径");return}_.value=!0;try{w(await g({type:"evolution.deployment.init-test",modulePath:y.value.trim()},6e4)),d.success("TEST 测试开发环境已生成并启用;禁止用于生产")}catch(r){d.error("生成测试环境失败:"+r.message)}finally{_.value=!1}}async function L(){if(!f.value.trim()||!p.value.trim()){d.warning("请填写正式描述符和正式信任根公钥的绝对路径");return}R.value=!0;try{w(await g({type:"evolution.deployment.replace-test",descriptorPath:f.value.trim(),trustRootPath:p.value.trim()},6e4)),d.success("测试根已安全轮换为正式受管证书;请重启 cc ui、IDE 或 Desktop 长驻进程后做正式验证")}catch(r){d.error("替换失败:"+r.message)}finally{R.value=!1}}async function l(){S.value=!0;try{w(await g({type:"evolution.deployment.set-enabled",enabled:!u.profileEnabled})),d.success(u.profileEnabled?"已启用":"已停用")}catch(r){d.error("更新失败:"+r.message)}finally{S.value=!1}}V(E);const M={ws:n,loading:e,saving:m,toggling:S,initializingTest:_,replacingTest:R,modulePath:y,descriptorPath:f,trustRootPath:p,status:u,busy:x,readinessRows:O,apply:w,request:g,loadStatus:E,save:b,initTest:D,replaceTest:L,toggle:l,computed:I,onMounted:V,reactive:A,ref:k,get ReloadOutlined(){return F},get message(){return d},get useWsStore(){return N},get deploymentReadinessRows(){return B},get replaceDeploymentStatus(){return H}};return Object.defineProperty(M,"__isScriptSetup",{enumerable:!1,value:!0}),M}},Q={class:"page-head"},K={class:"mono"},Z={class:"mono"},G={class:"admission-status","aria-live":"polite"},X=["data-admission-command"],Y={class:"mono"},$={key:0,class:"mono"};function ee(h,t,n,e,m,S){const _=s("a-button"),R=s("a-switch"),y=s("a-card"),f=s("a-alert"),p=s("a-input"),u=s("a-form-item"),x=s("a-divider"),O=s("a-space"),w=s("a-form"),g=s("a-col"),E=s("a-tag"),b=s("a-descriptions-item"),D=s("a-descriptions"),L=s("a-row");return P(),T("div",null,[i("div",Q,[t[4]||(t[4]=i("div",null,[i("h2",{class:"page-title"},"Skill 自进化配置"),i("p",{class:"page-sub"}," 默认关闭;CLI、IDE 插件与 cc ui 共用 evolution.enabled 配置。 ")],-1)),a(_,{loading:e.loading,onClick:e.loadStatus},{icon:o(()=>[a(e.ReloadOutlined)]),default:o(()=>[t[3]||(t[3]=c("刷新 ",-1))]),_:1},8,["loading"])]),a(y,{title:"自进化开关",class:"notice"},{default:o(()=>[a(R,{checked:e.status.profileEnabled,loading:e.toggling,disabled:e.busy||e.loading,"checked-children":"已开启","un-checked-children":"已关闭",onChange:e.toggle},null,8,["checked","loading","disabled"]),t[5]||(t[5]=i("p",null," 关闭后仍可正常聊天和使用 Agent。首次开启会初始化本地运行时,也可使用下方配置的部署。 ",-1)),t[6]||(t[6]=i("p",null," Quick Ask 的下一次请求生效;正在运行的 Agent 会话请停止后重新启动。候选项发布仍需人工审核。 ",-1)),t[7]||(t[7]=i("p",{class:"mono"},'config.json:"evolution": { "enabled": false }',-1))]),_:1}),a(f,{message:"自进化与自动发布分别控制",description:"开启后使用经过签名的 Skill 自进化运行时;自动发布始终保持 HOLD。",type:"info","show-icon":"",class:"notice"}),e.status.deploymentMode==="test"?(P(),j(f,{key:0,message:"当前为 TEST 测试开发环境",description:"本机自动生成的测试密钥不能用于生产。正式 descriptor 和 trust root 到位后,请使用下方“一键替换测试证书并转正式”。",type:"error","show-icon":"",class:"notice"})):C("v-if",!0),a(L,{gutter:16},{default:o(()=>[a(g,{xs:24,xl:15},{default:o(()=>[a(y,{title:"上线前测试与正式部署",class:"panel-card"},{default:o(()=>[a(w,{layout:"vertical"},{default:o(()=>[a(u,{label:"测试部署宿主模块"},{extra:o(()=>[...t[8]||(t[8]=[c("首次填写后点击一次即可生成 Ed25519 测试密钥、签名描述符并启用;宿主模块修改后再次点击可刷新。",-1)])]),default:o(()=>[a(p,{value:e.modulePath,"onUpdate:value":t[0]||(t[0]=l=>e.modulePath=l),disabled:e.busy,placeholder:"运行 cc ui 的机器上 deployment host .mjs/.js 的绝对路径"},null,8,["value","disabled"])]),_:1}),a(_,{type:"primary",loading:e.initializingTest,onClick:e.initTest},{default:o(()=>[...t[9]||(t[9]=[c("一键生成/刷新测试环境",-1)])]),_:1},8,["loading"]),a(x),a(u,{label:"签名部署描述符"},{extra:o(()=>[...t[10]||(t[10]=[c("Web 页面不能读取本机文件选择器,请填写运行 cc ui 的机器上的绝对路径。",-1)])]),default:o(()=>[a(p,{value:e.descriptorPath,"onUpdate:value":t[1]||(t[1]=l=>e.descriptorPath=l),disabled:e.busy,placeholder:"deployment descriptor JSON 的服务器绝对路径"},null,8,["value","disabled"])]),_:1}),a(u,{label:"Ed25519 信任根公钥"},{default:o(()=>[a(p,{value:e.trustRootPath,"onUpdate:value":t[2]||(t[2]=l=>e.trustRootPath=l),disabled:e.busy,placeholder:"信任根 public key 的服务器绝对路径"},null,8,["value","disabled"])]),_:1}),a(O,null,{default:o(()=>[a(_,{type:"primary",loading:e.saving,onClick:e.save},{default:o(()=>[...t[11]||(t[11]=[c("校验、保存并启用",-1)])]),_:1},8,["loading"]),e.status.deploymentMode==="test"?(P(),j(_,{key:0,loading:e.replacingTest,onClick:e.replaceTest},{default:o(()=>[...t[12]||(t[12]=[c("一键替换测试证书并转正式",-1)])]),_:1},8,["loading"])):C("v-if",!0)]),_:1})]),_:1})]),_:1})]),_:1}),a(g,{xs:24,xl:9},{default:o(()=>[a(y,{title:"治理状态",class:"panel-card status-card"},{default:o(()=>[a(D,{column:1,size:"small"},{default:o(()=>[a(b,{label:"部署模式"},{default:o(()=>[a(E,{color:e.status.deploymentMode==="test"?"red":"blue"},{default:o(()=>[c(v(e.status.deploymentMode==="test"?"TEST(仅限上线前联调)":e.status.deploymentMode||"none"),1)]),_:1},8,["color"])]),_:1}),a(b,{label:"生效状态"},{default:o(()=>[a(E,{color:e.status.effectiveEnabled?"green":"default"},{default:o(()=>[c(v(e.status.effectiveEnabled?"已启用":"未启用"),1)]),_:1},8,["color"])]),_:1}),a(b,{label:"生效来源"},{default:o(()=>[c(v(e.status.source||"none"),1)]),_:1}),a(b,{label:"签名校验"},{default:o(()=>[a(E,{color:e.status.verified?"green":"red"},{default:o(()=>[c(v(e.status.verified?"已通过":"未通过"),1)]),_:1},8,["color"])]),_:1}),a(b,{label:"自动发布"},{default:o(()=>[a(E,{color:"orange"},{default:o(()=>[...t[13]||(t[13]=[c("HOLD",-1)])]),_:1})]),_:1}),a(b,{label:"配置文件"},{default:o(()=>[i("span",K,v(e.status.profilePath||"—"),1)]),_:1}),a(b,{label:"允许命令"},{default:o(()=>[i("span",Z,v((e.status.commands||[]).join(", ")||"—"),1)]),_:1})]),_:1}),i("section",G,[t[14]||(t[14]=i("h3",null,"自进化部署准入",-1)),t[15]||(t[15]=i("p",null,"这里只检查部署准入,实际任务运行尚未验证。",-1)),(P(!0),T(q,null,z(e.readinessRows,l=>(P(),T("div",{key:l.command,"data-admission-command":l.command},[i("strong",null,v(l.command)+":"+v(l.summary),1),i("p",Y,v(l.detail),1),l.remediation?(P(),T("p",$,v(l.remediation),1)):C("v-if",!0)],8,X))),128))]),e.status.error?(P(),j(f,{key:0,message:e.status.error,type:"error","show-icon":"",class:"error"},null,8,["message"])):C("v-if",!0)]),_:1})]),_:1})]),_:1})])}const le=W(J,[["render",ee],["__scopeId","data-v-5a42105e"],["__file","/tmp/cc-web-panel-d0LHhd/repo/packages/web-panel/src/views/EvolutionSettings.vue"]]);export{le 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{I as S,P as n,J as i,U as l,S as h,R as o,c,K as d,Q as u,V as g,b as a}from"./vendor-Bn1JzzAn.js";import{_ as b}from"./index-DSgroT-P.js";import{aE as O,aI as C}from"./icons-DG5UD-6K.js";const D={__name:"TimelineRenderer",props:{event:{type:Object,required:!0}},setup(v,{expose:_}){_();const r=v,e=a(()=>r.event.content||{}),p=a(()=>{const t=r.event.source.adapter||"";return t.startsWith("travel-12306")||t.startsWith("travel-ctrip")}),m=a(()=>e.value.from&&e.value.to?`${e.value.from} → ${e.value.to}`:e.value.origin&&e.value.destination?`${e.value.origin} → ${e.value.destination}`:null),s=a(()=>r.event.place||e.value.placeName||e.value.poi),N=a(()=>e.value.trainNo),T=a(()=>e.value.flightNo),k=a(()=>e.value.title||e.value.text||e.value.description||"—"),x=a(()=>{const t=[];return e.value.departureTime&&t.push(`出发 ${e.value.departureTime}`),e.value.arrivalTime&&t.push(`到达 ${e.value.arrivalTime}`),e.value.duration&&t.push(`${e.value.duration}`),e.value.distance&&t.push(`${e.value.distance}`),t.length?t.join(" · "):null}),y=a(()=>{if(!r.event.occurredAt)return"";const t=new Date(r.event.occurredAt);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}),f={props:r,c:e,isTravel:p,route:m,placeName:s,trainNo:N,flightNo:T,fallbackText:k,extraDetail:x,formattedTime:y,computed:a,get CarOutlined(){return C},get EnvironmentOutlined(){return O}};return Object.defineProperty(f,"__isScriptSetup",{enumerable:!1,value:!0}),f}},E={class:"timeline-event"},V={class:"dot"},w={class:"card"},B={class:"head"},R={class:"time"},j={class:"primary"},I={key:0},A={key:1},H={key:2},M={key:0,class:"trip-no"},P={key:1,class:"extra"};function W(v,_,r,e,p,m){const s=S("a-tag");return n(),i("div",E,[l("div",V,[e.isTravel?(n(),h(e.CarOutlined,{key:0})):(n(),h(e.EnvironmentOutlined,{key:1}))]),l("div",w,[l("div",B,[l("span",R,o(e.formattedTime),1),c(s,{color:"cyan"},{default:d(()=>[u(o(r.event.source.adapter),1)]),_:1}),c(s,null,{default:d(()=>[u(o(r.event.subtype),1)]),_:1})]),l("div",j,[e.route?(n(),i("span",I,o(e.route),1)):e.placeName?(n(),i("span",A,"📍 "+o(e.placeName),1)):(n(),i("span",H,o(e.fallbackText),1))]),e.trainNo||e.flightNo?(n(),i("div",M,[c(s,{color:"blue"},{default:d(()=>[u(o(e.trainNo||e.flightNo),1)]),_:1})])):g("v-if",!0),e.extraDetail?(n(),i("div",P,o(e.extraDetail),1)):g("v-if",!0)])])}const K=b(D,[["render",W],["__scopeId","data-v-18400280"],["__file","/tmp/cc-web-panel-d0LHhd/repo/packages/web-panel/src/components/pdh/renderers/TimelineRenderer.vue"]]);export{K 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};