chainlesschain 0.162.72 → 0.162.74

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 (159) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/assets/{AIOps-1bl50Cen.js → AIOps-C-0Db2rX.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-Bw4kAx-1.js → ActionButton-CMzrHsYE.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-junq7r42.js → Analytics-7De_11Y4.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-vf1TVGeu.js → AppLayout-BbTNvwDg.js} +5 -5
  6. package/src/assets/web-panel/assets/{Audit-CBzpgcL9.js → Audit-NgkyFEr9.js} +1 -1
  7. package/src/assets/web-panel/assets/{Backup-ChwGPeP4.js → Backup-CZydm333.js} +1 -1
  8. package/src/assets/web-panel/assets/{BaseInput-2G2KGE6M.js → BaseInput-BJwgC2UN.js} +1 -1
  9. package/src/assets/web-panel/assets/{Chat-Cr9NwfDA.js → Chat-DAR90oE4.js} +5 -5
  10. package/src/assets/web-panel/assets/ChatBubbleRenderer-DfqwfACj.js +1 -0
  11. package/src/assets/web-panel/assets/{Checkbox-DN_5PBT7.js → Checkbox-CJxO-pD5.js} +1 -1
  12. package/src/assets/web-panel/assets/{Codegen-D4bluAgT.js → Codegen-ClsSgl-P.js} +1 -1
  13. package/src/assets/web-panel/assets/{Col-DBP3UjYW.js → Col-DfffBuFa.js} +1 -1
  14. package/src/assets/web-panel/assets/{Community-ge-SvR3c.js → Community-fPnkVJpl.js} +1 -1
  15. package/src/assets/web-panel/assets/{Compact-DGXvlGNv.js → Compact-CP9f3DZt.js} +1 -1
  16. package/src/assets/web-panel/assets/{Compliance-Cn7nBsFQ.js → Compliance-fCITFB2R.js} +1 -1
  17. package/src/assets/web-panel/assets/{Cowork-DgHEO2de.js → Cowork-GyZhY5mY.js} +2 -2
  18. package/src/assets/web-panel/assets/{Cron-DUbYxPs0.js → Cron-toRv3QGW.js} +2 -2
  19. package/src/assets/web-panel/assets/{Crosschain-3J0MWPQq.js → Crosschain-C0ShIRvX.js} +1 -1
  20. package/src/assets/web-panel/assets/{DID-BR_Jpkh4.js → DID-CB-4ILVF.js} +2 -2
  21. package/src/assets/web-panel/assets/{Dashboard-ffykLkAJ.js → Dashboard-DsbaECcP.js} +2 -2
  22. package/src/assets/web-panel/assets/{Dropdown-DaI38dXT.js → Dropdown-klGzPkCq.js} +1 -1
  23. package/src/assets/web-panel/assets/{EmailListRenderer-CnIzkUVG.js → EmailListRenderer-DF7bHNgQ.js} +1 -1
  24. package/src/assets/web-panel/assets/{FamilyGuardDashboard-BxrgAAZg.js → FamilyGuardDashboard-CoXn37ZA.js} +1 -1
  25. package/src/assets/web-panel/assets/{Federation-BuS_FRh3.js → Federation-CGjH3107.js} +1 -1
  26. package/src/assets/web-panel/assets/{FormItemContext-DBG-8g1w.js → FormItemContext-BbW5tEzw.js} +1 -1
  27. package/src/assets/web-panel/assets/{GenericCardRenderer-CmEc8RgH.js → GenericCardRenderer-Ed6pit6I.js} +1 -1
  28. package/src/assets/web-panel/assets/{Git-CK10BYwY.js → Git-wSniJ4nQ.js} +2 -2
  29. package/src/assets/web-panel/assets/{Governance-C8cABM_I.js → Governance-BEXL8yvz.js} +1 -1
  30. package/src/assets/web-panel/assets/{Inference-Dr4_DIw3.js → Inference-RQRU05O3.js} +1 -1
  31. package/src/assets/web-panel/assets/{KnowledgeGraph-0_bLuvvb.js → KnowledgeGraph-DcB0jIhB.js} +1 -1
  32. package/src/assets/web-panel/assets/{Logs-PVGZxt9z.js → Logs-Dq3ULqtY.js} +2 -2
  33. package/src/assets/web-panel/assets/{Marketplace-BtVnS4HW.js → Marketplace-CMM0PWC-.js} +1 -1
  34. package/src/assets/web-panel/assets/{McpTools-BVulusCC.js → McpTools-DHtW5q72.js} +3 -3
  35. package/src/assets/web-panel/assets/{Memory-DEMtNbJ9.js → Memory-BPNffBX4.js} +2 -2
  36. package/src/assets/web-panel/assets/{MobileBridge-5QL654FQ.js → MobileBridge-DBduGG-4.js} +3 -3
  37. package/src/assets/web-panel/assets/{MobileProjects-G5Du9Thr.js → MobileProjects-C7WN944V.js} +1 -1
  38. package/src/assets/web-panel/assets/{Mtc-CNFPJej0.js → Mtc-BgNC4GSE.js} +2 -2
  39. package/src/assets/web-panel/assets/{MtcAudit-DAJ81Cej.js → MtcAudit-BH8w3RJG.js} +2 -2
  40. package/src/assets/web-panel/assets/{Multisig-Cwj8tXfT.js → Multisig-rqVGkM71.js} +3 -3
  41. package/src/assets/web-panel/assets/{NLProgramming-Di0ptaL6.js → NLProgramming-BsQUtVNj.js} +1 -1
  42. package/src/assets/web-panel/assets/{Notes-Cse_4Ox6.js → Notes-C8kfVgBk.js} +3 -3
  43. package/src/assets/web-panel/assets/{NotificationSettings-ntpoi5ec.js → NotificationSettings-CnkwLmEc.js} +1 -1
  44. package/src/assets/web-panel/assets/{OrderTableRenderer-CbKsOM0D.js → OrderTableRenderer-DX7--1Qh.js} +1 -1
  45. package/src/assets/web-panel/assets/{Organization-Bhjya5h9.js → Organization-Cwo4kTgX.js} +4 -4
  46. package/src/assets/web-panel/assets/{Overflow-C0u3aive.js → Overflow-B45Usajd.js} +1 -1
  47. package/src/assets/web-panel/assets/{P2P-BWrTwf_a.js → P2P-C3jEcPvs.js} +2 -2
  48. package/src/assets/web-panel/assets/{PdhVaultBrowser-pld2Qlqk.js → PdhVaultBrowser-CGDVPsiI.js} +3 -3
  49. package/src/assets/web-panel/assets/{Permissions-CW5FG3mE.js → Permissions-B08m9YV_.js} +2 -2
  50. package/src/assets/web-panel/assets/{PersonalDataHub-BuBmqfDa.js → PersonalDataHub-C921TFhZ.js} +4 -4
  51. package/src/assets/web-panel/assets/{Pipeline-nZr06BNO.js → Pipeline-AvBEIM1o.js} +1 -1
  52. package/src/assets/web-panel/assets/{Privacy-B_XvMHYv.js → Privacy-g6QVOyQC.js} +1 -1
  53. package/src/assets/web-panel/assets/{ProjectInit-CbRHJy85.js → ProjectInit-C1L7umfx.js} +2 -2
  54. package/src/assets/web-panel/assets/{ProjectSettings-CCH8SpEa.js → ProjectSettings-1NsCP5Rt.js} +2 -2
  55. package/src/assets/web-panel/assets/{Projects-D5Min2Fu.js → Projects-BDxJtwFv.js} +1 -1
  56. package/src/assets/web-panel/assets/{Providers-DgCY5A8A.js → Providers-DltXHH7X.js} +1 -1
  57. package/src/assets/web-panel/assets/{QuickAsk-DEcKTiTV.js → QuickAsk-1Pw54Hz2.js} +1 -1
  58. package/src/assets/web-panel/assets/{Recommend-BRaq2oKc.js → Recommend-hB-Jmtl7.js} +1 -1
  59. package/src/assets/web-panel/assets/{Reputation-DzdbBdVv.js → Reputation-DkWxzI44.js} +1 -1
  60. package/src/assets/web-panel/assets/{Row-Ds2JNh7c.js → Row-CZhFZDZ6.js} +1 -1
  61. package/src/assets/web-panel/assets/{RssFeed-Bk1-t4Ie.js → RssFeed-BK-SqcmK.js} +3 -3
  62. package/src/assets/web-panel/assets/{Search-DaVhRwoq.js → Search-Bf_2YuHL.js} +1 -1
  63. package/src/assets/web-panel/assets/{Security-D9mXjPSu.js → Security-CkirTQxl.js} +3 -3
  64. package/src/assets/web-panel/assets/{Services-D8sukL97.js → Services-B9q0W9nR.js} +2 -2
  65. package/src/assets/web-panel/assets/{Skeleton-COCJt30X.js → Skeleton-BPDuoXu5.js} +1 -1
  66. package/src/assets/web-panel/assets/{Skills-DtFPSPSc.js → Skills-B-LPU5PB.js} +1 -1
  67. package/src/assets/web-panel/assets/{Sla-DIab-wjR.js → Sla-Clv-rKdc.js} +1 -1
  68. package/src/assets/web-panel/assets/{SpeechSettings-xxIH9hgB.js → SpeechSettings-0IZfUTng.js} +1 -1
  69. package/src/assets/web-panel/assets/{SyncSettings-DrpxzJOH.js → SyncSettings-nEJzARVZ.js} +2 -2
  70. package/src/assets/web-panel/assets/Tasks-CwXHXIkl.js +1 -0
  71. package/src/assets/web-panel/assets/{Templates-COE-dSks.js → Templates-DqjCbx0G.js} +1 -1
  72. package/src/assets/web-panel/assets/{Tenant-CLGObu4M.js → Tenant-D9gOurTB.js} +1 -1
  73. package/src/assets/web-panel/assets/{Terminal-Bw8WBvW3.js → Terminal-CnsQIiHq.js} +2 -2
  74. package/src/assets/web-panel/assets/TimelineRenderer-Di3hxrOR.js +1 -0
  75. package/src/assets/web-panel/assets/{Tokens-CSoL_uAw.js → Tokens-V_QvhzEW.js} +1 -1
  76. package/src/assets/web-panel/assets/{Trigger-BCRcowFi.js → Trigger-CzBN5yUT.js} +1 -1
  77. package/src/assets/web-panel/assets/{Trust-D5QPZ198.js → Trust-C_NrVDAW.js} +1 -1
  78. package/src/assets/web-panel/assets/{UkeySign-C7SsMqfZ.js → UkeySign-leU9ylJd.js} +1 -1
  79. package/src/assets/web-panel/assets/{VideoEditing-CDQ4HNZL.js → VideoEditing-DwzlNpBk.js} +1 -1
  80. package/src/assets/web-panel/assets/{Wallet-VmG4P_Fm.js → Wallet-dSIjpeqj.js} +2 -2
  81. package/src/assets/web-panel/assets/{WebAuthn-qtC0dZxA.js → WebAuthn-DAKdy3CS.js} +5 -5
  82. package/src/assets/web-panel/assets/{WorkflowEditor-C_CSdk3l.js → WorkflowEditor-DOif-wp_.js} +1 -1
  83. package/src/assets/web-panel/assets/{chat-BGm8YCIo.js → chat-B9CiS_S6.js} +1 -1
  84. package/src/assets/web-panel/assets/{colors-BScOmAwk.js → colors-BlIfHTi3.js} +1 -1
  85. package/src/assets/web-panel/assets/{compact-item-HDwaT31n.js → compact-item-BhlUVQn4.js} +1 -1
  86. package/src/assets/web-panel/assets/{createContext-CheSjPm8.js → createContext-BAKscpCQ.js} +1 -1
  87. package/src/assets/web-panel/assets/devWarning-DwewKXVi.js +1 -0
  88. package/src/assets/web-panel/assets/{hasIn-C1_NbX0O.js → hasIn-Da29JBzS.js} +1 -1
  89. package/src/assets/web-panel/assets/{index-eSBoP6E_.js → index-B8Jktv0L.js} +1 -1
  90. package/src/assets/web-panel/assets/index-B9-zs80P.js +1 -0
  91. package/src/assets/web-panel/assets/{index-CxoOEb-l.js → index-BI-BXKcX.js} +1 -1
  92. package/src/assets/web-panel/assets/{index-lB5kN9Yc.js → index-BJVCQ4u4.js} +1 -1
  93. package/src/assets/web-panel/assets/{index-i-xYmSsZ.js → index-BRC7HesQ.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-CSaztnyZ.js → index-BUjl0ati.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-yKmudyK7.js → index-BV5N_JGL.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-Cm55PcYG.js → index-B_uUznWT.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-ggl9cj35.js → index-BcVXBouF.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-D8xpncJ0.js → index-BhX9Ferp.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-DhTELUKN.js → index-Boucptjt.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-C71Z__li.js → index-Brth8YUr.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BMxPL1oG.js → index-Btl77NCX.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-B94_DZF-.js → index-BwrQlS19.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-BGROuzQG.js → index-C5b8LYJi.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-DB6gbgU2.js → index-C6-66JOV.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-DaATJtzu.js → index-CFwvL9Lx.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-6C8mxO8j.js → index-CJobtOqU.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-CYkezxqK.js → index-CKlBeA-P.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DppSbT8L.js → index-CM1idCUO.js} +3 -3
  109. package/src/assets/web-panel/assets/index-CU0CJgzs.js +1 -0
  110. package/src/assets/web-panel/assets/{index-D2gy4IX0.js → index-CUiZfnAi.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DQ01dBAS.js → index-CcLdhhVn.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-KG9xVANC.js → index-Cgp_jQ8s.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-DVyL9jbT.js → index-CxMk5saD.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-DzE-95XH.js → index-D8H2a4NL.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DDk0s3nO.js → index-DBq6xzDm.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DbfAaBxL.js → index-DCMOBmSn.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DSuWcpsv.js → index-DGRftOr1.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DoZwBGUX.js → index-DJybkYpX.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-C6WXnaG4.js → index-DK3w8-wH.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-Bd2zS3jK.js → index-DKggkQGO.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-Clqj2JTi.js → index-DcZ_Fb-p.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-Dk2N6hxE.js → index-DuiRwSJ_.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-DkiIxTIS.js → index-FLBlK1Zl.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-C4FSaMAu.js → index-TAakqe_Q.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-ByoUjX8f.js → index-VcI9Ml8H.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-BKQordyU.js → index-dmxCnT7f.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-KXrUKw1h.js → index-z3klVdjk.js} +1 -1
  128. package/src/assets/web-panel/assets/{initDefaultProps-D7Q7zDzP.js → initDefaultProps-DozNsdEE.js} +1 -1
  129. package/src/assets/web-panel/assets/{motion-B4DcaqPb.js → motion-DHBmFfzK.js} +1 -1
  130. package/src/assets/web-panel/assets/{move-CYxmYrFY.js → move-BBloskCm.js} +1 -1
  131. package/src/assets/web-panel/assets/{omit-ze_9dKw3.js → omit-BMB6RBkL.js} +1 -1
  132. package/src/assets/web-panel/assets/{pickAttrs-D24HrRSv.js → pickAttrs-9cBYsZy-.js} +1 -1
  133. package/src/assets/web-panel/assets/{placementArrow-BWJZVYyS.js → placementArrow-DphoF2as.js} +1 -1
  134. package/src/assets/web-panel/assets/{responsiveObserve-CseJia_L.js → responsiveObserve-7eccwdTq.js} +1 -1
  135. package/src/assets/web-panel/assets/{slide-CBWNEpey.js → slide-BAF1i2qq.js} +1 -1
  136. package/src/assets/web-panel/assets/{statusUtils-f4e6p7yd.js → statusUtils-Bw7QssM3.js} +1 -1
  137. package/src/assets/web-panel/assets/{styleChecker-DZmfWZ8G.js → styleChecker-C9oBEpYS.js} +1 -1
  138. package/src/assets/web-panel/assets/{useFlexGapSupport-4RBaBnVI.js → useFlexGapSupport-iiGRCohz.js} +1 -1
  139. package/src/assets/web-panel/assets/{useFs-Cv6bNoEA.js → useFs-1aj0rWmC.js} +1 -1
  140. package/src/assets/web-panel/assets/{usePersonalDataHub-DOTETJIA.js → usePersonalDataHub-nF5DnTyb.js} +1 -1
  141. package/src/assets/web-panel/assets/{vnode-DqS1K6-J.js → vnode-DFx6RVaA.js} +1 -1
  142. package/src/assets/web-panel/assets/{zoom-C1MYzIJG.js → zoom-DwIxKwes.js} +1 -1
  143. package/src/assets/web-panel/index.html +1 -1
  144. package/src/commands/agent.js +12 -0
  145. package/src/lib/agents.js +16 -5
  146. package/src/lib/output-styles.js +41 -7
  147. package/src/lib/project-root.cjs +87 -0
  148. package/src/lib/settings-hooks.cjs +18 -6
  149. package/src/lib/settings-loader.cjs +12 -5
  150. package/src/lib/slash-commands.js +18 -2
  151. package/src/lib/sync-engine-cli.js +6 -4
  152. package/src/runtime/agent-core.js +25 -4
  153. package/src/runtime/mcp-config.js +78 -1
  154. package/src/assets/web-panel/assets/ChatBubbleRenderer-CJvlo_ay.js +0 -1
  155. package/src/assets/web-panel/assets/Tasks-maiJ3jAT.js +0 -1
  156. package/src/assets/web-panel/assets/TimelineRenderer-D4gdk3Qb.js +0 -1
  157. package/src/assets/web-panel/assets/devWarning-CjO6o19j.js +0 -1
  158. package/src/assets/web-panel/assets/index--jhpSxS1.js +0 -1
  159. package/src/assets/web-panel/assets/index-J4Rzclyc.js +0 -1
@@ -28,6 +28,7 @@ const path = require("node:path");
28
28
  const os = require("node:os");
29
29
  const fsDefault = require("node:fs");
30
30
  const { SUGGEST_UMBRELLA } = require("./permission-rules.cjs");
31
+ const { projectRootBase } = require("./project-root.cjs");
31
32
 
32
33
  const _deps = { fs: fsDefault, homedir: () => os.homedir() };
33
34
 
@@ -44,14 +45,25 @@ const HOOK_EVENTS = Object.freeze([
44
45
  "Notification",
45
46
  ]);
46
47
 
47
- /** Same hierarchy as settings-loader (user < project < .local < --settings). */
48
+ /**
49
+ * Same hierarchy as settings-loader (user < project-root < cwd < --settings).
50
+ * When run from a SUBDIRECTORY, the project-root `.claude` hooks apply (below
51
+ * cwd's, above the user layer) — same walk-up as settings-loader's settingsPaths
52
+ * (shared `projectRootBase`, threaded through this loader's own `_deps.fs` to
53
+ * keep test injection intact). Hooks RUN SHELL COMMANDS, so a guard hook in the
54
+ * project-root settings must NOT silently vanish when `cc` is invoked from a
55
+ * subdirectory. `projectRootBase` returns null when cwd IS the root.
56
+ */
48
57
  function settingsFiles(cwd, explicitFile) {
49
58
  const home = _deps.homedir();
50
- const list = [
51
- path.join(home, ".claude", "settings.json"),
52
- path.join(cwd, ".claude", "settings.json"),
53
- path.join(cwd, ".claude", "settings.local.json"),
54
- ];
59
+ const list = [path.join(home, ".claude", "settings.json")];
60
+ const root = projectRootBase(cwd, { fs: _deps.fs, path });
61
+ if (root) {
62
+ list.push(path.join(root, ".claude", "settings.json"));
63
+ list.push(path.join(root, ".claude", "settings.local.json"));
64
+ }
65
+ list.push(path.join(cwd, ".claude", "settings.json"));
66
+ list.push(path.join(cwd, ".claude", "settings.local.json"));
55
67
  if (explicitFile) list.push(path.resolve(cwd, explicitFile));
56
68
  return list;
57
69
  }
@@ -27,6 +27,7 @@
27
27
  const fsDefault = require("node:fs");
28
28
  const path = require("node:path");
29
29
  const os = require("node:os");
30
+ const { projectRootBase } = require("./project-root.cjs");
30
31
 
31
32
  const _deps = { fs: fsDefault, homedir: () => os.homedir() };
32
33
 
@@ -72,11 +73,17 @@ function accrete(target, sources, arr, file, kind) {
72
73
  /** The ordered list of candidate settings files for a cwd. */
73
74
  function settingsPaths(cwd, explicitFile) {
74
75
  const home = _deps.homedir();
75
- const list = [
76
- path.join(home, ".claude", "settings.json"),
77
- path.join(cwd, ".claude", "settings.json"),
78
- path.join(cwd, ".claude", "settings.local.json"),
79
- ];
76
+ const list = [path.join(home, ".claude", "settings.json")];
77
+ // When run from a subdirectory, the project-root `.claude` sits BELOW cwd's
78
+ // own (closest wins) but ABOVE the user layer — so its rules apply yet a
79
+ // cwd-local settings file still overrides them. Null when cwd IS the root.
80
+ const root = projectRootBase(cwd, { fs: _deps.fs, path });
81
+ if (root) {
82
+ list.push(path.join(root, ".claude", "settings.json"));
83
+ list.push(path.join(root, ".claude", "settings.local.json"));
84
+ }
85
+ list.push(path.join(cwd, ".claude", "settings.json"));
86
+ list.push(path.join(cwd, ".claude", "settings.local.json"));
80
87
  if (explicitFile) list.push(path.resolve(cwd, explicitFile));
81
88
  return list;
82
89
  }
@@ -23,6 +23,7 @@ import pathDefault from "node:path";
23
23
  import { homedir } from "node:os";
24
24
  import { execSync as execSyncDefault } from "node:child_process";
25
25
  import { expandFileRefs } from "../runtime/file-ref-expander.js";
26
+ import { projectRootBase } from "./project-root.cjs";
26
27
 
27
28
  const _deps = { fs: fsDefault, path: pathDefault, execSync: execSyncDefault };
28
29
 
@@ -62,16 +63,31 @@ export const BANG_TIMEOUT_MS = 10_000;
62
63
  * on a name clash). `opts.home` overrides the personal root for tests.
63
64
  */
64
65
  export function commandDirs(cwd = process.cwd(), opts = {}) {
66
+ const fs = opts.deps?.fs || _deps.fs;
65
67
  const path = opts.deps?.path || _deps.path;
66
68
  const home = opts.home || homedir();
67
69
  // Project-native `.chainlesschain/commands/` takes precedence, then the
68
70
  // Claude-Code-portable `.claude/commands/` (so existing definitions work
69
71
  // unchanged), then personal. Both project dirs share the "project" scope.
70
- return [
72
+ const dirs = [
71
73
  { dir: path.join(cwd, ".chainlesschain", "commands"), scope: "project" },
72
74
  { dir: path.join(cwd, ".claude", "commands"), scope: "project" },
73
- { dir: path.join(home, ".claude", "commands"), scope: "personal" },
74
75
  ];
76
+ // Subdirectory run: also scan the project-root `.claude` (cwd stays closest
77
+ // and wins on a name clash via discoverCommands' reverse + last-write-wins).
78
+ const root = projectRootBase(cwd, { fs, path });
79
+ if (root) {
80
+ dirs.push({
81
+ dir: path.join(root, ".chainlesschain", "commands"),
82
+ scope: "project",
83
+ });
84
+ dirs.push({
85
+ dir: path.join(root, ".claude", "commands"),
86
+ scope: "project",
87
+ });
88
+ }
89
+ dirs.push({ dir: path.join(home, ".claude", "commands"), scope: "personal" });
90
+ return dirs;
75
91
  }
76
92
 
77
93
  /** Recursively collect `*.md` files under `dir` as `{file, rel}` (rel uses /). */
@@ -39,6 +39,10 @@ function generateFilename(item) {
39
39
 
40
40
  function generateMarkdown(item) {
41
41
  const tags = item.tags ? String(item.tags) : "";
42
+ // Conditionally include the tags line via a spread — a previous
43
+ // `.filter(Boolean)` here dropped the empty tags entry but ALSO ate the
44
+ // intended trailing "" newline, so the closing `---` was glued directly
45
+ // onto the body ("---body") producing malformed YAML front matter.
42
46
  const frontMatter = [
43
47
  "---",
44
48
  `id: ${item.id}`,
@@ -46,12 +50,10 @@ function generateMarkdown(item) {
46
50
  `type: ${item.type || "note"}`,
47
51
  `created_at: ${item.created_at}`,
48
52
  `updated_at: ${item.updated_at}`,
49
- tags ? `tags: ${tags}` : "",
53
+ ...(tags ? [`tags: ${tags}`] : []),
50
54
  "---",
51
55
  "",
52
- ]
53
- .filter(Boolean)
54
- .join("\n");
56
+ ].join("\n");
55
57
  return frontMatter + (item.content || "") + "\n";
56
58
  }
57
59
 
@@ -3587,12 +3587,32 @@ export async function* agentLoop(messages, options) {
3587
3587
  try {
3588
3588
  const compactor = await _getAutoCompactor(options);
3589
3589
  if (compactor && compactor.shouldAutoCompact(messages)) {
3590
+ // Cheap surgical pre-pass (Claude-Code microcompact parity): trim old
3591
+ // large tool results IN PLACE before the disruptive full
3592
+ // summarization. If the trim brings the context back under threshold,
3593
+ // the full compaction below is skipped this round — so heavy-tool
3594
+ // conversations rarely hit a full summarize. Opt out:
3595
+ // autoMicroCompact: false.
3596
+ if (options.autoMicroCompact !== false) {
3597
+ try {
3598
+ const { microCompact } = await import("../lib/micro-compact.js");
3599
+ const mc = microCompact(messages);
3600
+ if (mc.stats.trimmed > 0) {
3601
+ messages.splice(0, messages.length, ...mc.messages);
3602
+ yield { type: "micro-compaction", runId, stats: mc.stats };
3603
+ }
3604
+ } catch {
3605
+ // microcompact is best-effort — never break the run
3606
+ }
3607
+ }
3608
+ // After the trim, is the full (disruptive) compaction still needed?
3609
+ const needFull = compactor.shouldAutoCompact(messages);
3590
3610
  // settings.json PreCompact hooks: a `block` decision SKIPS this
3591
3611
  // compaction round (e.g. the hook archived / owns the history). Fires
3592
3612
  // right before the history would be compacted.
3593
3613
  let preCompactBlocked = false;
3594
3614
  let preCompactReason = null;
3595
- if (options.settingsHooks) {
3615
+ if (needFull && options.settingsHooks) {
3596
3616
  try {
3597
3617
  const pc = runObserveHooks(
3598
3618
  options.settingsHooks,
@@ -3619,9 +3639,10 @@ export async function* agentLoop(messages, options) {
3619
3639
  reason: preCompactReason,
3620
3640
  };
3621
3641
  }
3622
- const { messages: compacted, stats } = preCompactBlocked
3623
- ? { messages, stats: { saved: 0 } }
3624
- : await compactor.compress(messages, { preserveToolPairs: true });
3642
+ const { messages: compacted, stats } =
3643
+ !needFull || preCompactBlocked
3644
+ ? { messages, stats: { saved: 0 } }
3645
+ : await compactor.compress(messages, { preserveToolPairs: true });
3625
3646
  if (stats.saved > 0 && compacted.length < messages.length) {
3626
3647
  messages.splice(0, messages.length, ...compacted);
3627
3648
  // Persist the compaction so a later --resume rebuilds from the
@@ -15,7 +15,9 @@
15
15
  */
16
16
 
17
17
  import fs from "fs";
18
+ import path from "path";
18
19
  import { MCPClient } from "../harness/mcp-client.js";
20
+ import { projectRootBase } from "../lib/project-root.cjs";
19
21
  import {
20
22
  discoverIdeServer,
21
23
  ideServerToMcpConfig,
@@ -375,10 +377,73 @@ export async function loadIdeMcp(opts = {}, deps = {}) {
375
377
  return out;
376
378
  }
377
379
 
380
+ /**
381
+ * Discover + connect a project-scoped `.mcp.json` (Claude-Code parity). Reads a
382
+ * `.mcp.json` from the git project root (walked up from cwd, same as the
383
+ * `.claude` config layers) and from cwd itself, merging their `mcpServers`
384
+ * (cwd wins on a name clash — closest wins). Best-effort: a missing / empty /
385
+ * malformed file contributes nothing and never throws.
386
+ *
387
+ * SECURITY: a checked-in `.mcp.json` can spawn arbitrary commands, so this layer
388
+ * is OPT-IN (default-off) — it only runs when explicitly enabled with
389
+ * `--project-mcp` / `CC_PROJECT_MCP=1` (truthy). When enabled, the servers it
390
+ * loads are announced via writeErr. Connected into `deps.into`, so an explicit
391
+ * `--mcp-config` server or a registered (`cc mcp add`) server WINS on a name
392
+ * clash (the first batch wins in setupMcpFromConfig).
393
+ *
394
+ * @param {object} opts { cwd?, env? }
395
+ * @param {object} [deps] { writeErr, into, readFile, fileExists, createClient }
396
+ */
397
+ export async function loadProjectMcp(opts = {}, deps = {}) {
398
+ const env = opts.env || process.env;
399
+ // Opt-in gate (default-off): only load a project `.mcp.json` when explicitly
400
+ // enabled — a checked-in file spawning commands in any cloned repo is a
401
+ // supply-chain risk, so the user must turn it on per run / per shell.
402
+ const flag = String(env.CC_PROJECT_MCP || "").toLowerCase();
403
+ if (flag !== "1" && flag !== "true") return deps.into || null;
404
+ const cwd = opts.cwd || process.cwd();
405
+ const readFile = deps.readFile || ((p) => fs.readFileSync(p, "utf-8"));
406
+ const fileExists = deps.fileExists || ((p) => fs.existsSync(p));
407
+ const writeErr = deps.writeErr || (() => {});
408
+
409
+ // Project-root `.mcp.json` (below cwd's), then cwd's own — so a cwd-local file
410
+ // overrides the root on a name clash. projectRootBase() is null when cwd IS
411
+ // the root (its own file already covers it) or there is no git project.
412
+ const files = [];
413
+ const root = projectRootBase(cwd, { fs, path });
414
+ if (root) files.push(path.join(root, ".mcp.json"));
415
+ files.push(path.join(cwd, ".mcp.json"));
416
+
417
+ const servers = {};
418
+ const seenFiles = [];
419
+ for (const file of files) {
420
+ if (!fileExists(file)) continue;
421
+ let raw;
422
+ try {
423
+ raw = JSON.parse(readFile(file));
424
+ } catch (err) {
425
+ writeErr(` mcp: ignoring malformed ${file} (${err.message})\n`);
426
+ continue;
427
+ }
428
+ const parsed = parseMcpServers(raw);
429
+ if (Object.keys(parsed).length > 0) {
430
+ Object.assign(servers, parsed); // later file (cwd) overrides earlier (root)
431
+ seenFiles.push(file);
432
+ }
433
+ }
434
+ if (Object.keys(servers).length === 0) return deps.into || null;
435
+ writeErr(
436
+ ` mcp: ${Object.keys(servers).length} server(s) from project .mcp.json ` +
437
+ `(${seenFiles.join(", ")}) — loaded via --project-mcp\n`,
438
+ );
439
+ return setupMcpFromConfig(servers, deps);
440
+ }
441
+
378
442
  /**
379
443
  * Resolve the full MCP tool surface for one agent run: the ad-hoc
380
444
  * `--mcp-config` file (if any) PLUS registered auto-connect servers (unless
381
- * disabled) PLUS an auto-discovered IDE bridge, connected into a single client.
445
+ * disabled) PLUS a project-scoped `.mcp.json` (opt-in, `--project-mcp`) PLUS an
446
+ * auto-discovered IDE bridge, connected into a single client.
382
447
  * Returns the combined `{mcpClient, extraToolDefinitions, ...}` or null when
383
448
  * there's nothing. Throws only on a bad `--mcp-config` file (explicit request).
384
449
  *
@@ -391,6 +456,7 @@ export async function loadIdeMcp(opts = {}, deps = {}) {
391
456
  export async function resolveAgentMcp(args = {}, deps = {}) {
392
457
  const doFile = deps.loadMcpConfig || loadMcpConfig;
393
458
  const doReg = deps.loadRegisteredMcp || loadRegisteredMcp;
459
+ const doProject = deps.loadProjectMcp || loadProjectMcp;
394
460
  const doIde = deps.loadIdeMcp || loadIdeMcp;
395
461
  // Thread the agent session id down to setupMcpFromConfig so spawned stdio MCP
396
462
  // servers get CC_SESSION_ID / CLAUDE_CODE_SESSION_ID (Claude-Code parity).
@@ -413,6 +479,17 @@ export async function resolveAgentMcp(args = {}, deps = {}) {
413
479
  into: result || undefined,
414
480
  });
415
481
  }
482
+ // Project-scoped `.mcp.json` (Claude-Code parity). After --mcp-config +
483
+ // registered (those win on a name clash), before IDE auto-discovery. Skipped
484
+ // under --strict-mcp-config (returned above). OPT-IN: loadProjectMcp is a
485
+ // no-op unless --project-mcp / CC_PROJECT_MCP=1 is set (default-off — a
486
+ // checked-in .mcp.json can spawn commands). `projectMcp:false` hard-skips it.
487
+ if (args.projectMcp !== false) {
488
+ result = await doProject(
489
+ { cwd: args.cwd, env: args.env || process.env },
490
+ { ...fwd, into: result || undefined },
491
+ );
492
+ }
416
493
  if (args.ide !== false) {
417
494
  const env = args.env || process.env;
418
495
  const inIde = (deps.isInIdeTerminal || isInIdeTerminal)(env);
@@ -1 +0,0 @@
1
- import{I as v,P as u,J as S,U as n,R as a,S as y,K as C,Q as w,V as x,_ as B,b as s}from"./vendor-BvqAck49.js";import{_ as k}from"./index-DppSbT8L.js";import"./icons-DP3uiYxy.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}),_}},R={class:"bubble"},T={class:"meta"},q={class:"actor"},M={class:"time"},V={class:"body"};function D(c,d,t,r,i,l){const o=v("a-tag");return u(),S("div",{class:B(["chat-row",{mine:r.isMine}])},[n("div",R,[n("div",T,[n("span",q,a(r.actorLabel),1),n("span",M,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(()=>[w(a(t.event.source.adapter),1)]),_:1},8,["color"])):x("v-if",!0)])],2)}const A=k(N,[["render",D],["__scopeId","data-v-49238629"],["__file","/tmp/cc-web-panel-qgRwCf/repo/packages/web-panel/src/components/pdh/renderers/ChatBubbleRenderer.vue"]]);export{A as default};
@@ -1 +0,0 @@
1
- import{E as B,b as z,r as D,I as p,J as c,U as _,c as n,K as a,S,V as w,o as P,x as I,P as i,Q as g,R as r,F as h,Z as F}from"./vendor-BvqAck49.js";import{u as R,_ as O}from"./index-DppSbT8L.js";import{R as E}from"./icons-DP3uiYxy.js";const V=B("tasks",()=>{const k=D([]),l=D(!1);let u=null,e=null;const x=z(()=>k.value.filter(t=>t.status==="running")),b=z(()=>k.value.filter(t=>t.status==="pending")),y=z(()=>k.value.filter(t=>t.status==="completed"||t.status==="failed"||t.status==="timeout"));async function f(){const t=R();l.value=!0;try{const s=await t.sendRaw({type:"tasks-list"});s&&Array.isArray(s.tasks)&&(k.value=s.tasks)}catch{}finally{l.value=!1}}async function o(t){const s=R();try{await s.sendRaw({type:"tasks-stop",taskId:t})}catch{}finally{await f()}}const d=D(null);function m(t=5e3){v(),f(),u=setInterval(f,t),T()}function v(){u&&(clearInterval(u),u=null),e&&(e(),e=null)}function T(){const t=R();if(e)return;const s=C=>{C.type==="task:notification"&&C.payload?.task&&(d.value=C.payload.task,f(),setTimeout(()=>{d.value=null},8e3))};e=t.onRuntimeEvent(s)}function N(t){return!t||t<0?"-":t<1e3?`${t}ms`:t<6e4?`${(t/1e3).toFixed(1)}s`:`${(t/6e4).toFixed(1)}m`}function A(t){switch(t){case"running":return"processing";case"pending":return"default";case"completed":return"success";case"failed":return"error";case"timeout":return"warning";default:return"default"}}return{tasks:k,loading:l,running:x,pending:b,completed:y,lastNotification:d,fetchTasks:f,stopTask:o,startPolling:m,stopPolling:v,formatDuration:N,getStatusColor:A}}),U={__name:"Tasks",setup(k,{expose:l}){l();const u=V(),e=[{title:"状态",key:"status",width:90},{title:"描述",key:"description",ellipsis:!0},{title:"类型",dataIndex:"type",width:100},{title:"耗时",key:"duration",width:90},{title:"创建时间",key:"createdAt",width:180},{title:"结果",key:"result",ellipsis:!0},{title:"操作",key:"action",width:80}];function x(o){return o.status==="running"&&o.startedAt?u.formatDuration(Date.now()-o.startedAt):o.completedAt&&o.startedAt?u.formatDuration(o.completedAt-o.startedAt):"-"}function b(o){return o?new Date(o).toLocaleString():"-"}function y(o,d){return o?o.length>d?`${o.slice(0,d)}...`:o:""}P(()=>u.startPolling(5e3)),I(()=>u.stopPolling());const f={store:u,columns:e,getDuration:x,formatTime:b,truncate:y,onMounted:P,onUnmounted:I,get ReloadOutlined(){return E},get useTasksStore(){return V}};return Object.defineProperty(f,"__isScriptSetup",{enumerable:!1,value:!0}),f}},L={class:"page-header"},j={key:0,class:"error-text"},q={key:1},J={class:"task-header"},K={class:"task-desc"},M={class:"task-id"},Q={class:"task-meta"},W=["title"],Z={key:0,class:"error-text"},G={key:1,class:"success-text"},H={key:2,class:"muted-text"};function X(k,l,u,e,x,b){const y=p("a-button"),f=p("a-space"),o=p("a-alert"),d=p("a-statistic"),m=p("a-card"),v=p("a-col"),T=p("a-row"),N=p("a-tag"),A=p("a-table");return i(),c("div",null,[_("div",L,[l[3]||(l[3]=_("div",null,[_("h2",{class:"page-title"},"后台任务"),_("p",{class:"page-sub"},"查看后台任务队列、实时通知和任务执行结果。")],-1)),n(f,null,{default:a(()=>[n(y,{ghost:"",loading:e.store.loading,onClick:l[0]||(l[0]=t=>e.store.fetchTasks())},{icon:a(()=>[n(e.ReloadOutlined)]),default:a(()=>[l[2]||(l[2]=g(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),e.store.lastNotification?(i(),S(o,{key:0,type:e.store.lastNotification.status==="completed"?"success":"error","show-icon":"",closable:"",class:"banner",onClose:l[1]||(l[1]=t=>e.store.lastNotification=null)},{message:a(()=>[g(" 任务"+r(e.store.lastNotification.status==="completed"?"完成":"结束")+": "+r(e.store.lastNotification.description||e.store.lastNotification.id.slice(0,16)),1)]),description:a(()=>[e.store.lastNotification.error?(i(),c("span",j,r(e.store.lastNotification.error),1)):e.store.lastNotification.result?(i(),c("span",q,r(e.truncate(String(e.store.lastNotification.result),120)),1)):w("v-if",!0)]),_:1},8,["type"])):w("v-if",!0),n(T,{gutter:[16,16],class:"stats-row"},{default:a(()=>[n(v,{xs:12,sm:6},{default:a(()=>[n(m,{class:"stat-card",size:"small"},{default:a(()=>[n(d,{title:"全部任务",value:e.store.tasks.length},null,8,["value"])]),_:1})]),_:1}),n(v,{xs:12,sm:6},{default:a(()=>[n(m,{class:"stat-card",size:"small"},{default:a(()=>[n(d,{title:"运行中",value:e.store.running.length},null,8,["value"])]),_:1})]),_:1}),n(v,{xs:12,sm:6},{default:a(()=>[n(m,{class:"stat-card",size:"small"},{default:a(()=>[n(d,{title:"等待中",value:e.store.pending.length},null,8,["value"])]),_:1})]),_:1}),n(v,{xs:12,sm:6},{default:a(()=>[n(m,{class:"stat-card",size:"small"},{default:a(()=>[n(d,{title:"已完成",value:e.store.completed.length},null,8,["value"])]),_:1})]),_:1})]),_:1}),e.store.running.length>0?(i(),S(m,{key:1,title:"运行中的任务",class:"panel-card",size:"small"},{default:a(()=>[(i(!0),c(h,null,F(e.store.running,t=>(i(),c("div",{key:t.id,class:"task-item running"},[_("div",J,[n(N,{color:e.store.getStatusColor(t.status)},{default:a(()=>[g(r(t.status.toUpperCase()),1)]),_:2},1032,["color"]),_("span",K,r(t.description),1),_("span",M,r(t.id.slice(0,16)),1)]),_("div",Q,[_("span",null,"类型: "+r(t.type||"-"),1),_("span",null,"已运行: "+r(e.store.formatDuration(Date.now()-t.startedAt)),1),n(y,{size:"small",danger:"",onClick:s=>e.store.stopTask(t.id)},{default:a(()=>[...l[4]||(l[4]=[g("停止",-1)])]),_:1},8,["onClick"])])]))),128))]),_:1})):w("v-if",!0),n(m,{class:"panel-card"},{default:a(()=>[n(A,{columns:e.columns,"data-source":e.store.tasks,pagination:{pageSize:15,size:"small"},loading:e.store.loading,"row-key":"id",size:"small"},{bodyCell:a(({column:t,record:s})=>[t.key==="status"?(i(),S(N,{key:0,color:e.store.getStatusColor(s.status)},{default:a(()=>[g(r(s.status),1)]),_:2},1032,["color"])):t.key==="description"?(i(),c("span",{key:1,title:s.command},r(s.description),9,W)):t.key==="duration"?(i(),c(h,{key:2},[g(r(e.getDuration(s)),1)],64)):t.key==="createdAt"?(i(),c(h,{key:3},[g(r(e.formatTime(s.createdAt)),1)],64)):t.key==="result"?(i(),c(h,{key:4},[s.error?(i(),c("span",Z,r(e.truncate(s.error,60)),1)):s.result?(i(),c("span",G,r(e.truncate(String(s.result),60)),1)):(i(),c("span",H,"-"))],64)):t.key==="action"?(i(),c(h,{key:5},[s.status==="running"?(i(),S(y,{key:0,size:"small",danger:"",onClick:C=>e.store.stopTask(s.id)},{default:a(()=>[...l[5]||(l[5]=[g(" 停止 ",-1)])]),_:1},8,["onClick"])):w("v-if",!0)],64)):w("v-if",!0)]),_:1},8,["data-source","loading"])]),_:1})])}const et=O(U,[["render",X],["__scopeId","data-v-da5ff6a2"],["__file","/tmp/cc-web-panel-qgRwCf/repo/packages/web-panel/src/views/Tasks.vue"]]);export{et as default};
@@ -1 +0,0 @@
1
- import{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-BvqAck49.js";import{_ as b}from"./index-DppSbT8L.js";import{aD as O,aH as C}from"./icons-DP3uiYxy.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}},w={class:"timeline-event"},R={class:"dot"},V={class:"card"},B={class:"head"},E={class:"time"},j={class:"primary"},q={key:0},A={key:1},H={key:2},I={key:0,class:"trip-no"},M={key:1,class:"extra"};function P(v,_,r,e,p,m){const s=S("a-tag");return n(),i("div",w,[l("div",R,[e.isTravel?(n(),h(e.CarOutlined,{key:0})):(n(),h(e.EnvironmentOutlined,{key:1}))]),l("div",V,[l("div",B,[l("span",E,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",q,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",I,[c(s,{color:"blue"},{default:d(()=>[u(o(e.trainNo||e.flightNo),1)]),_:1})])):g("v-if",!0),e.extraDetail?(n(),i("div",M,o(e.extraDetail),1)):g("v-if",!0)])])}const K=b(D,[["render",P],["__scopeId","data-v-18400280"],["__file","/tmp/cc-web-panel-qgRwCf/repo/packages/web-panel/src/components/pdh/renderers/TimelineRenderer.vue"]]);export{K as default};
@@ -1 +0,0 @@
1
- import{O as r}from"./index-DppSbT8L.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
@@ -1 +0,0 @@
1
- import{A as o}from"./Row-Ds2JNh7c.js";import{U as t}from"./index-DppSbT8L.js";import"./vendor-BvqAck49.js";import"./responsiveObserve-CseJia_L.js";import"./useFlexGapSupport-4RBaBnVI.js";import"./styleChecker-DZmfWZ8G.js";import"./index-D2gy4IX0.js";import"./icons-DP3uiYxy.js";const l=t(o);export{l as default};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-DBP3UjYW.js";import{U as t}from"./index-DppSbT8L.js";import"./vendor-BvqAck49.js";import"./index-D2gy4IX0.js";import"./icons-DP3uiYxy.js";const s=t(o);export{s as default};