chainlesschain 0.162.45 → 0.162.46

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 (158) hide show
  1. package/package.json +2 -2
  2. package/src/assets/web-panel/assets/{AIOps-D-W6s4eA.js → AIOps-QzHleqCS.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-nPOyfwP_.js → ActionButton-CZ3F-KVY.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-DoX0H6wa.js → Analytics-CHml-drq.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-BYNnmmUE.js → AppLayout-a-fczvRH.js} +5 -5
  6. package/src/assets/web-panel/assets/{Audit-AjglOteL.js → Audit-CtMWsXwm.js} +1 -1
  7. package/src/assets/web-panel/assets/{Backup-DT38xAKk.js → Backup-ErWTcS0A.js} +1 -1
  8. package/src/assets/web-panel/assets/{BaseInput-DT1pD4sT.js → BaseInput-B4w2b2dA.js} +1 -1
  9. package/src/assets/web-panel/assets/{Chat-Z77BT13i.js → Chat-CFPKVfmV.js} +6 -6
  10. package/src/assets/web-panel/assets/{ChatBubbleRenderer-C1MKMzjB.js → ChatBubbleRenderer-WGpUTY92.js} +1 -1
  11. package/src/assets/web-panel/assets/{Checkbox-CVOMmTDm.js → Checkbox-C4vasfJc.js} +1 -1
  12. package/src/assets/web-panel/assets/{Codegen-Bqy11vCf.js → Codegen-DHmDAbSg.js} +1 -1
  13. package/src/assets/web-panel/assets/{Col-C3A1d5Wt.js → Col-LhgveyhM.js} +1 -1
  14. package/src/assets/web-panel/assets/{Community-D2q6UNaX.js → Community-CB8gtudt.js} +1 -1
  15. package/src/assets/web-panel/assets/{Compact-C2701nAm.js → Compact-CTndsUSy.js} +1 -1
  16. package/src/assets/web-panel/assets/{Compliance-SJnaA5oN.js → Compliance-CCpGUHPm.js} +1 -1
  17. package/src/assets/web-panel/assets/{Cowork-BvTYuhJy.js → Cowork-CQmJiOM_.js} +2 -2
  18. package/src/assets/web-panel/assets/{Cron-sJ-9lLUV.js → Cron-TrTmpnSB.js} +2 -2
  19. package/src/assets/web-panel/assets/{Crosschain-CStGE_K9.js → Crosschain-DvaR1Xq4.js} +1 -1
  20. package/src/assets/web-panel/assets/{DID-JY0Kx-7a.js → DID-CdDdiRs3.js} +2 -2
  21. package/src/assets/web-panel/assets/{Dashboard-BiZEZPRN.js → Dashboard-S6gCBQDc.js} +2 -2
  22. package/src/assets/web-panel/assets/{Dropdown-DK2BszlZ.js → Dropdown-CWO-Kwzl.js} +1 -1
  23. package/src/assets/web-panel/assets/{EmailListRenderer-DtjOYS0Q.js → EmailListRenderer-Crnrr1-p.js} +1 -1
  24. package/src/assets/web-panel/assets/{FamilyGuardDashboard-D2EI2B5E.js → FamilyGuardDashboard-OpG9ZtfR.js} +1 -1
  25. package/src/assets/web-panel/assets/{Federation-CebAtHrY.js → Federation-B0sybW7G.js} +1 -1
  26. package/src/assets/web-panel/assets/{FormItemContext-Bd8WNQLm.js → FormItemContext-DjHMvxwJ.js} +1 -1
  27. package/src/assets/web-panel/assets/{GenericCardRenderer-tH3zcpN9.js → GenericCardRenderer-DtU5cWwE.js} +1 -1
  28. package/src/assets/web-panel/assets/{Git-DARoXdm7.js → Git-BhOjZX2a.js} +2 -2
  29. package/src/assets/web-panel/assets/{Governance-gcKIyn7g.js → Governance-D3_hjjA-.js} +1 -1
  30. package/src/assets/web-panel/assets/{Inference-Rh4pllPC.js → Inference-DwxLXmgA.js} +1 -1
  31. package/src/assets/web-panel/assets/{KnowledgeGraph-Cvh73WwA.js → KnowledgeGraph-C8-FVs02.js} +1 -1
  32. package/src/assets/web-panel/assets/{Logs-BBZSagwy.js → Logs-CrHjnzfr.js} +2 -2
  33. package/src/assets/web-panel/assets/{Marketplace-e5C7xHES.js → Marketplace-KW1Am18o.js} +1 -1
  34. package/src/assets/web-panel/assets/{McpTools-BzfXvajQ.js → McpTools-ezYH1J8m.js} +5 -5
  35. package/src/assets/web-panel/assets/{Memory-C3ZgSBrL.js → Memory-Dcv8Gume.js} +2 -2
  36. package/src/assets/web-panel/assets/{MobileBridge-BYVobYJJ.js → MobileBridge-v18J0LN4.js} +2 -2
  37. package/src/assets/web-panel/assets/MobileProjects-kk6hAwkK.js +1 -0
  38. package/src/assets/web-panel/assets/{Mtc-BxNytLEb.js → Mtc-Cm35-vh_.js} +5 -5
  39. package/src/assets/web-panel/assets/{MtcAudit-BUadScwJ.js → MtcAudit-DyeKAlI_.js} +4 -4
  40. package/src/assets/web-panel/assets/{Multisig-BWZmAn6M.js → Multisig-Dy-imleB.js} +3 -3
  41. package/src/assets/web-panel/assets/{NLProgramming-B4eau0Yo.js → NLProgramming-DMVmWNAH.js} +1 -1
  42. package/src/assets/web-panel/assets/{Notes-eHe1Jd1n.js → Notes-Dq6oHKbl.js} +3 -3
  43. package/src/assets/web-panel/assets/{NotificationSettings-DFMSI_xu.js → NotificationSettings-CCaSupDi.js} +1 -1
  44. package/src/assets/web-panel/assets/OrderTableRenderer-DOwptdNb.js +1 -0
  45. package/src/assets/web-panel/assets/{Organization-M_NYVPks.js → Organization-8TF96XtV.js} +4 -4
  46. package/src/assets/web-panel/assets/{Overflow-Bi-TzxkX.js → Overflow-BnYnh84b.js} +1 -1
  47. package/src/assets/web-panel/assets/{P2P-vtorIyuM.js → P2P-CZk3Qkec.js} +2 -2
  48. package/src/assets/web-panel/assets/{PdhVaultBrowser-D9I3WUUZ.js → PdhVaultBrowser-D1HrzBx2.js} +3 -3
  49. package/src/assets/web-panel/assets/{Permissions-YFbIKLZw.js → Permissions-CwJ6hcaI.js} +4 -4
  50. package/src/assets/web-panel/assets/{PersonalDataHub-JM8yN0w0.js → PersonalDataHub-BGnPTj1G.js} +3 -3
  51. package/src/assets/web-panel/assets/{Pipeline-Cyvwlqpr.js → Pipeline-BzXhXLBz.js} +1 -1
  52. package/src/assets/web-panel/assets/{Privacy-CIKHwg7m.js → Privacy-BaVQ3GwL.js} +1 -1
  53. package/src/assets/web-panel/assets/{ProjectInit-Bj6-CmbC.js → ProjectInit-Bik3h4R7.js} +2 -2
  54. package/src/assets/web-panel/assets/{ProjectSettings-CBnTXhIt.js → ProjectSettings-CIuC6Hpr.js} +2 -2
  55. package/src/assets/web-panel/assets/{Projects-B3CwPTNd.js → Projects-DLjnWEe6.js} +1 -1
  56. package/src/assets/web-panel/assets/{Providers-dtUZaXuY.js → Providers-mhxZrHiK.js} +1 -1
  57. package/src/assets/web-panel/assets/{QuickAsk-BWzt81Dm.js → QuickAsk-Dk9mayL0.js} +1 -1
  58. package/src/assets/web-panel/assets/{Recommend-CToDb_n9.js → Recommend-BHC2sBZY.js} +1 -1
  59. package/src/assets/web-panel/assets/{Reputation-B6MCFsXH.js → Reputation-DV26B11J.js} +1 -1
  60. package/src/assets/web-panel/assets/{Row-CipchQUs.js → Row-bJlVEnFC.js} +1 -1
  61. package/src/assets/web-panel/assets/{RssFeed-CR3mpmuE.js → RssFeed-D_XucmWY.js} +3 -3
  62. package/src/assets/web-panel/assets/{Search-DRvRD7_k.js → Search-uKXcm_Kf.js} +1 -1
  63. package/src/assets/web-panel/assets/{Security-Bv1bEvfO.js → Security-DEzqsQLn.js} +4 -4
  64. package/src/assets/web-panel/assets/{Services-BLAljjtu.js → Services-I8qKgcom.js} +2 -2
  65. package/src/assets/web-panel/assets/{Skeleton-BRFNIS9s.js → Skeleton-BmrglBMu.js} +1 -1
  66. package/src/assets/web-panel/assets/{Skills-B6dEwkkO.js → Skills-CHN4ZDyP.js} +1 -1
  67. package/src/assets/web-panel/assets/{Sla-A97O6hQJ.js → Sla-Ca6FsUS2.js} +1 -1
  68. package/src/assets/web-panel/assets/{SpeechSettings-DNBeqO5l.js → SpeechSettings-CP8IikWb.js} +1 -1
  69. package/src/assets/web-panel/assets/{SyncSettings-C61PTeaN.js → SyncSettings-Bqp-kPAA.js} +2 -2
  70. package/src/assets/web-panel/assets/{Tasks-C8q-8JXF.js → Tasks-C7FvJjze.js} +1 -1
  71. package/src/assets/web-panel/assets/{Templates-R-4ZBAPY.js → Templates-Bq51Irli.js} +1 -1
  72. package/src/assets/web-panel/assets/{Tenant-dRpKvdmN.js → Tenant-OTducEVg.js} +1 -1
  73. package/src/assets/web-panel/assets/Terminal-ywwPryM5.js +3 -0
  74. package/src/assets/web-panel/assets/{TimelineRenderer-BbXUD3AZ.js → TimelineRenderer-kCmFL2wc.js} +1 -1
  75. package/src/assets/web-panel/assets/{Tokens-CuYIAO1f.js → Tokens-BUfD650M.js} +1 -1
  76. package/src/assets/web-panel/assets/{Trigger-bt_5ffBh.js → Trigger-CqpM6xE7.js} +1 -1
  77. package/src/assets/web-panel/assets/{Trust-rk4LCtlg.js → Trust--4gS7a0j.js} +1 -1
  78. package/src/assets/web-panel/assets/{UkeySign-Bgf8zhuS.js → UkeySign-B7wfki-b.js} +1 -1
  79. package/src/assets/web-panel/assets/{VideoEditing-B_D_kcq5.js → VideoEditing-FwDEX2S-.js} +1 -1
  80. package/src/assets/web-panel/assets/{Wallet-BuhroOcU.js → Wallet-DS_c2rMk.js} +4 -4
  81. package/src/assets/web-panel/assets/{WebAuthn-DNVp_EWD.js → WebAuthn-CdMhP-GP.js} +4 -4
  82. package/src/assets/web-panel/assets/{WorkflowEditor-C94Nr2Yq.js → WorkflowEditor-DVvpoOmg.js} +1 -1
  83. package/src/assets/web-panel/assets/{chat-CqvcO82L.js → chat-BQyTT2BS.js} +1 -1
  84. package/src/assets/web-panel/assets/{colors-CiHv7zLX.js → colors-DvylfUTx.js} +1 -1
  85. package/src/assets/web-panel/assets/{compact-item-BbL_7DRy.js → compact-item-Budvh2nW.js} +1 -1
  86. package/src/assets/web-panel/assets/{createContext-BcnUkPGe.js → createContext-DkNa84zG.js} +1 -1
  87. package/src/assets/web-panel/assets/devWarning-CG_75MBJ.js +1 -0
  88. package/src/assets/web-panel/assets/{hasIn-bKZM79uJ.js → hasIn-Dc1juUIf.js} +1 -1
  89. package/src/assets/web-panel/assets/{index-Drdlb5iB.js → index-B0u5DW4Z.js} +1 -1
  90. package/src/assets/web-panel/assets/{index-Bfcq_Svy.js → index-BC08UMEf.js} +1 -1
  91. package/src/assets/web-panel/assets/{index-Cc48TfA8.js → index-BCD2L2SI.js} +1 -1
  92. package/src/assets/web-panel/assets/{index-C0Dew6UJ.js → index-BCv_FUY5.js} +1 -1
  93. package/src/assets/web-panel/assets/{index-DAayTu3W.js → index-BEviVulf.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-Dpb_Zh3w.js → index-BQJA__yH.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-AJLQ9KfF.js → index-BTnZ44a_.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-D-jqR16_.js → index-BTzrvuB0.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-C1b8TGYq.js → index-BWcGURYh.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-SeP48n4C.js → index-BYuozZuh.js} +1 -1
  99. package/src/assets/web-panel/assets/index-Ba6DLEa1.js +1 -0
  100. package/src/assets/web-panel/assets/{index-Kl_dtIkL.js → index-BgYKjtNP.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-CWPLkrPr.js → index-BgxdM7b_.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-2nrwvHPn.js → index-Bk_Uhu49.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-Bd0u4iTg.js → index-By8Bs_eN.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CPJ4NWCv.js → index-C1X5QpSy.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-ByEejvcB.js → index-C8he-Xo0.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-Csgtimo8.js → index-CFMS9PKh.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BySbK7vA.js → index-CGHLsKyb.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-D5X8cqw-.js → index-CKoWcis9.js} +1 -1
  109. package/src/assets/web-panel/assets/index-CLycnSs-.js +1 -0
  110. package/src/assets/web-panel/assets/{index-B1StZUmz.js → index-CbCIBifY.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-kHUuRAFp.js → index-Cz41iB_M.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-ABAWaz7Y.js → index-D2dcbmzD.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-BlIYy94Y.js → index-D74oTZL7.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-B76qMGe0.js → index-D7FYxxFT.js} +3 -3
  115. package/src/assets/web-panel/assets/{index-Zxnsweba.js → index-DMCqz0wy.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-UrCGcZXp.js → index-DO9Lvv1w.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DYH3St42.js → index-DRNJnXik.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CQonLmOf.js → index-DTcZkWJ7.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-Bh9TSxy7.js → index-D_0nyIY9.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-sdSZZzwh.js → index-DecFF9je.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DNBdA_cQ.js → index-DwJ0d_2Z.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-BSzQlPjx.js → index-DxCPTrC-.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-JteeOvFE.js → index-TsPv8m1Z.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-vzVBm4mg.js → index-YVdWdhK_.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-Kt6y6Hh5.js → index-eD_MN29w.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-J8Xba8Zt.js → index-jTGSFnNF.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-DPHskdVZ.js → index-yx5Y6xb7.js} +1 -1
  128. package/src/assets/web-panel/assets/{initDefaultProps-Cg2ZQCW2.js → initDefaultProps-gLjyJG0Q.js} +1 -1
  129. package/src/assets/web-panel/assets/{motion-CVup4XZf.js → motion-BtXv1r2p.js} +1 -1
  130. package/src/assets/web-panel/assets/{move-0we4XeEJ.js → move-BgFqW2gA.js} +1 -1
  131. package/src/assets/web-panel/assets/{omit-DNvkWjsk.js → omit-CeIwl-eJ.js} +1 -1
  132. package/src/assets/web-panel/assets/{pickAttrs-DNGWkffo.js → pickAttrs-VlY4igbs.js} +1 -1
  133. package/src/assets/web-panel/assets/{placementArrow-DdMP7Lk2.js → placementArrow-B9Wjn3oR.js} +1 -1
  134. package/src/assets/web-panel/assets/{responsiveObserve-CgCiGZ6t.js → responsiveObserve-BBgHTvYX.js} +1 -1
  135. package/src/assets/web-panel/assets/{slide-CQxOWXtr.js → slide-DWw81KAi.js} +1 -1
  136. package/src/assets/web-panel/assets/{statusUtils-BVYop9K6.js → statusUtils-Bsho38w-.js} +1 -1
  137. package/src/assets/web-panel/assets/{styleChecker-BTkUPq_y.js → styleChecker-BNvVEdm1.js} +1 -1
  138. package/src/assets/web-panel/assets/{useFlexGapSupport-CKncli3p.js → useFlexGapSupport-DG9bkwrT.js} +1 -1
  139. package/src/assets/web-panel/assets/{useFs-B7k6cPxd.js → useFs-DU7qrIrQ.js} +1 -1
  140. package/src/assets/web-panel/assets/{usePersonalDataHub-CiVRczRO.js → usePersonalDataHub-DX-Bf7VJ.js} +1 -1
  141. package/src/assets/web-panel/assets/{vnode-CPueAEhr.js → vnode-B1UcnNoK.js} +1 -1
  142. package/src/assets/web-panel/assets/{zoom-BhzuJF_P.js → zoom-BFgJuvLv.js} +1 -1
  143. package/src/assets/web-panel/index.html +1 -1
  144. package/src/commands/agent.js +44 -30
  145. package/src/commands/hub.js +87 -0
  146. package/src/harness/mcp-client.js +86 -1
  147. package/src/lib/auto-checkpoint-default.js +49 -0
  148. package/src/lib/personal-data-hub-wiring.js +44 -2
  149. package/src/lib/repl-completer.js +6 -3
  150. package/src/lib/skill-loader.js +43 -7
  151. package/src/repl/agent-repl.js +27 -1
  152. package/src/runtime/mcp-config.js +19 -1
  153. package/src/assets/web-panel/assets/MobileProjects-Bl8xCXs4.js +0 -1
  154. package/src/assets/web-panel/assets/OrderTableRenderer-Ctejeurt.js +0 -1
  155. package/src/assets/web-panel/assets/Terminal-egMhD-wn.js +0 -3
  156. package/src/assets/web-panel/assets/devWarning-BSbU0obw.js +0 -1
  157. package/src/assets/web-panel/assets/index-DHgbmZ-Y.js +0 -1
  158. package/src/assets/web-panel/assets/index-pr3q7Jlo.js +0 -1
@@ -1,24 +1,40 @@
1
1
  /**
2
2
  * Multi-layer skill loader for CLI
3
3
  *
4
- * 4-layer priority system (highest wins on name collision):
5
- * 0 (lowest) bundled — desktop-app-vue/.../skills/builtin/
6
- * 1 marketplace — <userData>/marketplace/skills/
7
- * 2 managed — <userData>/skills/
8
- * 3 (highest) workspace <projectRoot>/.chainlesschain/skills/
4
+ * 6-layer priority system (highest wins on name collision):
5
+ * 0 (lowest) bundled — desktop-app-vue/.../skills/builtin/
6
+ * 1 marketplace — <userData>/marketplace/skills/
7
+ * 2 managed — <userData>/skills/
8
+ * 3 claude-user ~/.claude/skills/ (Claude-Code 可移植)
9
+ * 4 claude-project — <projectRoot>/.claude/skills/ (Claude-Code 可移植)
10
+ * 5 (highest) workspace — <projectRoot>/.chainlesschain/skills/
11
+ *
12
+ * The two `claude-*` layers are Claude-Code portability (its 2.1.157
13
+ * ".claude/skills auto-load" behavior): a repo carrying Claude-Code skills
14
+ * works in cc unchanged — same SKILL.md format — while native
15
+ * `.chainlesschain/skills` still wins on name collisions.
9
16
  */
10
17
 
11
18
  import fs from "fs";
19
+ import os from "os";
12
20
  import path from "path";
13
21
  import { fileURLToPath } from "url";
14
22
  import { getElectronUserDataDir } from "./paths.js";
15
23
  import { findProjectRoot } from "./project-detector.js";
24
+ import { findProjectRoot as findGitRoot } from "./project-instructions.js";
16
25
  import { parseSkillMcpServers } from "./skill-mcp.js";
17
26
 
18
27
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
19
28
 
20
29
  /** Layer names in priority order (lowest → highest) */
21
- export const LAYER_NAMES = ["bundled", "marketplace", "managed", "workspace"];
30
+ export const LAYER_NAMES = [
31
+ "bundled",
32
+ "marketplace",
33
+ "managed",
34
+ "claude-user",
35
+ "claude-project",
36
+ "workspace",
37
+ ];
22
38
 
23
39
  /**
24
40
  * Simple YAML frontmatter parser (no dependencies)
@@ -230,7 +246,27 @@ export class CLISkillLoader {
230
246
  exists: fs.existsSync(managedPath),
231
247
  });
232
248
 
233
- // Layer 3: workspace — <projectRoot>/.chainlesschain/skills/
249
+ // Layers 3+4: Claude-Code portability ~/.claude/skills + <root>/.claude/skills
250
+ const home = os.homedir() || "";
251
+ const claudeUserPath = home ? path.join(home, ".claude", "skills") : null;
252
+ layers.push({
253
+ layer: "claude-user",
254
+ path: claudeUserPath,
255
+ exists: Boolean(claudeUserPath && fs.existsSync(claudeUserPath)),
256
+ });
257
+ // Project base: .chainlesschain marker first, git root as fallback so a
258
+ // pure Claude-Code repo (no .chainlesschain/) still gets its skills.
259
+ const claudeBase = findProjectRoot() || findGitRoot(process.cwd());
260
+ const claudeProjectPath = claudeBase
261
+ ? path.join(claudeBase, ".claude", "skills")
262
+ : null;
263
+ layers.push({
264
+ layer: "claude-project",
265
+ path: claudeProjectPath,
266
+ exists: Boolean(claudeProjectPath && fs.existsSync(claudeProjectPath)),
267
+ });
268
+
269
+ // Layer 5 (highest): workspace — <projectRoot>/.chainlesschain/skills/
234
270
  const projectRoot = findProjectRoot();
235
271
  if (projectRoot) {
236
272
  const workspacePath = path.join(projectRoot, ".chainlesschain", "skills");
@@ -20,6 +20,7 @@
20
20
  import readline from "readline";
21
21
  import chalk from "chalk";
22
22
  import fs from "fs";
23
+ import os from "os";
23
24
  import path from "path";
24
25
  import { logger } from "../lib/logger.js";
25
26
  import { getPlanModeManager, PlanState } from "../lib/plan-mode.js";
@@ -748,10 +749,12 @@ export async function startAgentRepl(options = {}) {
748
749
  // (when the IDE bridge is connected) the editor's open tabs ranked first.
749
750
  const { makeAtCompleter } = await import("../lib/repl-completer.js");
750
751
  const atCompleter = makeAtCompleter({
751
- cwd: process.cwd(),
752
+ // cwd left unset on purpose: the completer resolves process.cwd() lazily
753
+ // so it follows `/cd` mid-session.
752
754
  // Keep in sync with the rl.on("line") handlers + /help below.
753
755
  slashCommands: [
754
756
  "/auto",
757
+ "/cd",
755
758
  "/clear",
756
759
  "/compact",
757
760
  "/context",
@@ -1012,6 +1015,9 @@ export async function startAgentRepl(options = {}) {
1012
1015
  logger.log(
1013
1016
  ` ${chalk.cyan("/rewind")} Rewind conversation to an earlier turn (double-Esc lists)`,
1014
1017
  );
1018
+ logger.log(
1019
+ ` ${chalk.cyan("/cd <dir>")} Change working directory mid-session (completion/memory follow)`,
1020
+ );
1015
1021
  logger.log(
1016
1022
  ` ${chalk.cyan("/compact")} Smart compact (importance-based)`,
1017
1023
  );
@@ -1250,6 +1256,26 @@ export async function startAgentRepl(options = {}) {
1250
1256
  return;
1251
1257
  }
1252
1258
 
1259
+ // `/cd` (Claude-Code 2.1.163 parity): relocate the session's working
1260
+ // directory mid-conversation. Everything that reads process.cwd() per
1261
+ // call follows automatically (agent cwd, @-completion, project memory).
1262
+ if (trimmed === "/cd" || trimmed.startsWith("/cd ")) {
1263
+ const target = trimmed.slice(3).trim();
1264
+ if (!target) {
1265
+ logger.info(`cwd: ${process.cwd()}`);
1266
+ } else {
1267
+ try {
1268
+ const expanded = target.replace(/^~(?=$|[\\/])/, os.homedir());
1269
+ process.chdir(path.resolve(process.cwd(), expanded));
1270
+ logger.log(chalk.green(`cwd → ${process.cwd()}`));
1271
+ } catch (err) {
1272
+ logger.error(`/cd failed: ${err.message}`);
1273
+ }
1274
+ }
1275
+ prompt();
1276
+ return;
1277
+ }
1278
+
1253
1279
  if (trimmed === "/rewind" || trimmed.startsWith("/rewind ")) {
1254
1280
  try {
1255
1281
  const { listUserTurns, rewindToTurn, renderTurnList } = await import(
@@ -347,7 +347,25 @@ export async function loadIdeMcp(opts = {}, deps = {}) {
347
347
  }
348
348
  const cfg = toCfg(lock);
349
349
  if (!cfg) return deps.into || null;
350
- return setupMcpFromConfig({ ide: cfg }, deps);
350
+ const out = await setupMcpFromConfig({ ide: cfg }, deps);
351
+ // Hot reconnect: a window reload / extension update restarts the editor's
352
+ // MCP server on a NEW port with a NEW token. Register a reconnector so a
353
+ // failed mcp__ide__* call re-scans the lockfiles mid-session and retries,
354
+ // instead of the IDE tools (and selection/diagnostics injection) silently
355
+ // dying for the rest of the run. Note the stale CHAINLESSCHAIN_IDE_PORT in
356
+ // our env no longer matches any live lock, so discovery falls through to
357
+ // the workspace scan — exactly the path that finds the restarted instance.
358
+ if (out?.mcpClient?.setReconnector) {
359
+ out.mcpClient.setReconnector("ide", () => {
360
+ const fresh = discover({
361
+ cwd: opts.cwd,
362
+ env: opts.env,
363
+ force: opts.force === true,
364
+ });
365
+ return fresh ? toCfg(fresh) : null;
366
+ });
367
+ }
368
+ return out;
351
369
  }
352
370
 
353
371
  /**
@@ -1 +0,0 @@
1
- import{I as n,J as g,c as l,K as r,N as u,P as h,U as o,R as t,Q as b}from"./vendor-BvqAck49.js";import{_ as v,b as m}from"./index-B76qMGe0.js";import{a7 as M,M as y}from"./icons-DP3uiYxy.js";const B={__name:"MobileProjects",setup(p,{expose:i}){i();const c=u(),{t:e}=m();function a(){c.push("/projects")}function _(){c.push("/mobile-bridge")}const s={router:c,t:e,goToProjects:a,goToMobileBridge:_,get useRouter(){return u},get useI18n(){return m},get MobileOutlined(){return y},get FolderOutlined(){return M}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}},x={class:"mobile-projects-placeholder"},O={class:"title"},k={class:"subtitle"},w={class:"explainer"};function T(p,i,c,e,a,_){const s=n("a-alert"),d=n("a-button"),f=n("a-space"),j=n("a-empty"),P=n("a-card");return h(),g("div",x,[l(P,null,{default:r(()=>[l(j,{description:!1},{image:r(()=>[l(e.MobileOutlined,{style:{fontSize:"64px",color:"#bfbfbf"}})]),default:r(()=>[o("h2",O,t(e.t("mobileProjects.title")),1),o("p",k,t(e.t("mobileProjects.subtitle")),1),l(s,{message:e.t("mobileProjects.v02Banner"),type:"info","show-icon":"",class:"banner"},null,8,["message"]),o("div",w,[o("h3",null,t(e.t("mobileProjects.currentDirection")),1),o("p",null,t(e.t("mobileProjects.currentDirectionBody")),1),o("ul",null,[o("li",null,t(e.t("mobileProjects.stepPhone")),1),o("li",null,t(e.t("mobileProjects.stepTap")),1),o("li",null,t(e.t("mobileProjects.stepPull")),1)]),o("h3",null,t(e.t("mobileProjects.reverseDirection")),1),o("p",null,t(e.t("mobileProjects.reverseDirectionBody")),1)]),l(f,{class:"actions"},{default:r(()=>[l(d,{type:"primary",onClick:e.goToProjects},{default:r(()=>[l(e.FolderOutlined),b(" "+t(e.t("mobileProjects.viewLocalProjects")),1)]),_:1}),l(d,{onClick:e.goToMobileBridge},{default:r(()=>[l(e.MobileOutlined),b(" "+t(e.t("mobileProjects.checkBridge")),1)]),_:1})]),_:1})]),_:1})]),_:1})])}const N=v(B,[["render",T],["__scopeId","data-v-9262cc45"],["__file","/tmp/cc-web-panel-MQBjbf/repo/packages/web-panel/src/views/MobileProjects.vue"]]);export{N as default};
@@ -1 +0,0 @@
1
- import{I as w,P as l,J as u,U as s,R as n,c as i,K as v,Q as _,V as g,b as a}from"./vendor-BvqAck49.js";import{_ as S}from"./index-B76qMGe0.js";import"./icons-DP3uiYxy.js";const k={__name:"OrderTableRenderer",props:{event:{type:Object,required:!0}},setup(p,{expose:r}){r();const o=p,e=a(()=>o.event.content||{}),d=a(()=>o.event.extra||{}),m=a(()=>d.value.merchant||e.value.merchant||e.value.counterparty||"—"),c=a(()=>e.value.title||e.value.name||e.value.itemName||e.value.text||"—"),y=a(()=>{const t=e.value.amount??e.value.price??e.value.total;return t==null?"—":`${e.value.currency||"¥"} ${typeof t=="number"?t.toFixed(2):t}`}),T=a(()=>d.value.orderNo||e.value.orderNo||e.value.orderId),f=a(()=>e.value.status||e.value.state),b=a(()=>{const t=(f.value||"").toLowerCase();return t.includes("成功")||t.includes("succe")||t.includes("paid")?"green":t.includes("退")||t.includes("refund")?"orange":t.includes("失败")||t.includes("fail")?"red":"default"}),h=a(()=>{if(!o.event.occurredAt)return"";const t=new Date(o.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")}`}),x={props:o,c:e,e:d,merchantText:m,itemText:c,amountText:y,orderNo:T,statusText:f,statusColor:b,formattedTime:h,computed:a};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}},N={class:"order-card"},C={class:"head"},O={class:"time"},V={class:"row"},B={class:"val"},R={class:"row"},j={class:"val"},D={class:"row amount-row"},I={class:"val amount"},M={key:0,class:"row"},A={class:"val mono"},F={key:1,class:"row"};function P(p,r,o,e,d,m){const c=w("a-tag");return l(),u("div",N,[s("div",C,[s("span",O,n(e.formattedTime),1),i(c,{color:"gold"},{default:v(()=>[_(n(o.event.source.adapter),1)]),_:1}),i(c,null,{default:v(()=>[_(n(o.event.subtype),1)]),_:1})]),s("div",V,[r[0]||(r[0]=s("span",{class:"key"},"商户",-1)),s("span",B,n(e.merchantText),1)]),s("div",R,[r[1]||(r[1]=s("span",{class:"key"},"商品/项目",-1)),s("span",j,n(e.itemText),1)]),s("div",D,[r[2]||(r[2]=s("span",{class:"key"},"金额",-1)),s("span",I,n(e.amountText),1)]),e.orderNo?(l(),u("div",M,[r[3]||(r[3]=s("span",{class:"key"},"单号",-1)),s("span",A,n(e.orderNo),1)])):g("v-if",!0),e.statusText?(l(),u("div",F,[r[4]||(r[4]=s("span",{class:"key"},"状态",-1)),i(c,{color:e.statusColor},{default:v(()=>[_(n(e.statusText),1)]),_:1},8,["color"])])):g("v-if",!0)])}const J=S(k,[["render",P],["__scopeId","data-v-5ed5524d"],["__file","/tmp/cc-web-panel-MQBjbf/repo/packages/web-panel/src/components/pdh/renderers/OrderTableRenderer.vue"]]);export{J as default};
@@ -1,3 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./xterm-BZcWGsqw.js","./markdown-CsiA8-E5.js","./markdown-Dfs9RUU9.css","./addon-fit-CK6X9sAG.js","./xterm-DFuMZ0ql.css"])))=>i.map(i=>d[i]);
2
- import{u as fe,_ as me,d as V,e as U}from"./index-B76qMGe0.js";import{I as z,J as x,U as _,Q as B,S as K,K as T,V as M,c as A,F as Y,Z,R as E,o as G,f as H,w as $,n as D,b as ee,r as S,P as y,_ as ve,a2 as we,a3 as he,a4 as _e}from"./vendor-BvqAck49.js";import{R as ye,b as pe,as as ge}from"./icons-DP3uiYxy.js";const k=new Map,C=new Map,N=new Set,F=new Set;let te=!1;function xe(c){te||(te=!0,c.onMessage(o=>{if(!(!o||typeof o.type!="string")){if(o.type==="terminal.stdout"){const{sessionId:s,data:e,seq:i}=o.payload||{};if(!s)return;let w;try{const d=atob(e||""),f=new Uint8Array(d.length);for(let n=0;n<d.length;n++)f[n]=d.charCodeAt(n);w=new TextDecoder("utf-8").decode(f)}catch{w=""}const u={sessionId:s,data:w,seq:i};k.get(s)?.forEach(d=>d(u)),N.forEach(d=>d(u))}else if(o.type==="terminal.exit"){const{sessionId:s,exitCode:e,signal:i}=o.payload||{};if(!s)return;const w={sessionId:s,exitCode:e,signal:i};C.get(s)?.forEach(u=>u(w)),F.forEach(u=>u(w))}}}))}function ne(c){const o=new TextEncoder().encode(c);let s="";for(let e=0;e<o.length;e++)s+=String.fromCharCode(o[e]);return btoa(s)}function ae(c){const o=atob(c||""),s=new Uint8Array(o.length);for(let e=0;e<o.length;e++)s[e]=o.charCodeAt(e);return new TextDecoder("utf-8").decode(s)}function oe(){const c=fe();xe(c);async function o(n={}){const a=await c.sendRaw({type:"terminal.create",payload:{shell:n.shell,cwd:n.cwd,env:n.env,cols:n.cols,rows:n.rows}});if(a.ok===!1)throw new Error(a.error||"terminal_create_failed");return a.result??a}async function s(){const n=await c.sendRaw({type:"terminal.list",payload:{}});if(n.ok===!1)throw new Error(n.error||"terminal_list_failed");const a=n.result??n;return Array.isArray(a.sessions)?a.sessions:[]}async function e(n,a){const r=await c.sendRaw({type:"terminal.stdin",payload:{sessionId:n,data:ne(String(a))}});if(r.ok===!1)throw new Error(r.error||"terminal_stdin_failed");return r.result??r}async function i(n,a,r){const h=await c.sendRaw({type:"terminal.resize",payload:{sessionId:n,cols:a,rows:r}});if(h.ok===!1)throw new Error(h.error||"terminal_resize_failed");return h.result??h}async function w(n){const a=await c.sendRaw({type:"terminal.close",payload:{sessionId:n}});if(a.ok===!1)throw new Error(a.error||"terminal_close_failed");return a.result??a}async function u(n,a=0){const r=await c.sendRaw({type:"terminal.history",payload:{sessionId:n,fromSeq:a}});if(r.ok===!1)throw new Error(r.error||"terminal_history_failed");const h=r.result??r;return{truncated:!!h.truncated,chunks:(h.chunks||[]).map(L=>({seq:L.seq,data:ae(L.data)}))}}function d(n,a){return n?(k.has(n)||k.set(n,new Set),k.get(n).add(a),()=>{k.get(n)?.delete(a),k.get(n)?.size===0&&k.delete(n)}):(N.add(a),()=>N.delete(a))}function f(n,a){return n?(C.has(n)||C.set(n,new Set),C.get(n).add(a),()=>{C.get(n)?.delete(a),C.get(n)?.size===0&&C.delete(n)}):(F.add(a),()=>F.delete(a))}return{create:o,list:s,stdin:e,resize:i,close:w,history:u,onStdout:d,onExit:f,_internal:{stdoutSubs:k,exitSubs:C,toBase64Utf8:ne,fromBase64Utf8:ae}}}const Se={__name:"Terminal",setup(c,{expose:o}){o();const s=oe(),e=S([]),i=S(null),w=S("pwsh"),u=S(!1),d=S(!1),f=S(""),n=S(""),a=S([]),r=[{value:"pwsh",label:"PowerShell"},{value:"cmd",label:"CMD"},{value:"bash",label:"Bash"},{value:"wsl",label:"WSL"}],h=ee(()=>e.value.find(t=>t.id===i.value));function L(t){return t?t.slice(0,8):""}let O=null,R=null;async function I(){if(O)return{xtermMod:O,fitAddonMod:R};try{O=await U(()=>import("./xterm-BZcWGsqw.js").then(t=>t.x),__vite__mapDeps([0,1,2]),import.meta.url),R=await U(()=>import("./addon-fit-CK6X9sAG.js").then(t=>t.a),__vite__mapDeps([3,1,2]),import.meta.url),await U(()=>Promise.resolve({}),__vite__mapDeps([4]),import.meta.url)}catch(t){throw n.value="xterm 资源加载失败:"+(t?.message||"未知错误"),t}return{xtermMod:O,fitAddonMod:R}}async function q(t){await D();const{xtermMod:l,fitAddonMod:p}=await I(),b=a.value.find(v=>v?.dataset?.sessionId===t.id);if(!b)return;const m=new l.Terminal({cursorBlink:!0,fontFamily:'Consolas, "Courier New", monospace',fontSize:13,theme:{background:"#1e1e1e",foreground:"#d4d4d4"},convertEol:!1}),P=new p.FitAddon;m.loadAddon(P),m.open(b);try{P.fit()}catch{}t.xterm=m,t.fitAddon=P;const ie=m.onData(v=>{s.stdin(t.id,v).catch(g=>{String(g?.message||"").includes("dangerous_keyword_blocked")?V.warning("该命令被桌面端拦截(高危关键字)"):V.error("stdin 失败: "+(g?.message||g))})}),ce=s.onStdout(t.id,({data:v,seq:g})=>{t.lastSeq=g,m.write(v)}),de=s.onExit(t.id,({exitCode:v,signal:g})=>{t.alive=!1,t.exitCode=v,t.signal=g,m.writeln(`\r
3
- \x1B[33m[session exited, code=${v}, signal=${g??"-"}]\x1B[0m`)});t.offs=()=>{try{ie.dispose?.()}catch{}ce(),de()};try{const{chunks:v,truncated:g}=await s.history(t.id,0);g&&m.writeln("\x1B[2m[history truncated — earlier output was evicted]\x1B[0m");for(const J of v)m.write(J.data),t.lastSeq=J.seq}catch(v){m.writeln(`\x1B[31m[history fetch failed: ${v?.message||v}]\x1B[0m`)}const X=new ResizeObserver(()=>{try{P.fit(),s.resize(t.id,m.cols,m.rows).catch(()=>{})}catch{}});X.observe(b);const ue=t.offs;t.offs=()=>{try{X.disconnect()}catch{}ue()}}async function re(){u.value=!0,f.value="";try{const t=await s.create({shell:w.value,cols:80,rows:24}),l={id:t.sessionId,shell:t.shell,cwd:"",alive:!0,lastSeq:0,exitCode:null,xterm:null,fitAddon:null,offs:()=>{}};e.value.push(l),i.value=l.id,await q(l)}catch(t){f.value=t?.message||String(t)}finally{u.value=!1}}async function se(t){try{await s.close(t)}catch(l){f.value=l?.message||String(l)}setTimeout(()=>W(t),500)}function W(t){const l=e.value.findIndex(b=>b.id===t);if(l===-1)return;const p=e.value[l];try{p.offs?.()}catch{}try{p.xterm?.dispose?.()}catch{}e.value.splice(l,1),i.value===t&&(i.value=e.value[0]?.id||null)}function le(t){i.value=t,D(()=>{const l=e.value.find(p=>p.id===t);try{l?.fitAddon?.fit()}catch{}})}async function j(){d.value=!0,f.value="";try{const t=await s.list();for(const l of t){const p=e.value.find(m=>m.id===l.id);if(p){p.alive=l.alive,p.lastSeq=l.lastSeq;continue}const b={id:l.id,shell:l.shell,cwd:l.cwd,alive:l.alive,lastSeq:l.lastSeq,exitCode:null,xterm:null,fitAddon:null,offs:()=>{}};e.value.push(b),await q(b)}!i.value&&e.value.length>0&&(i.value=e.value[0].id)}catch(t){f.value=t?.message||String(t)}finally{d.value=!1}}G(async()=>{await j()}),H(()=>{for(const t of e.value){try{t.offs?.()}catch{}try{t.xterm?.dispose?.()}catch{}}}),$(i,()=>{D(()=>{const t=h.value;try{t?.fitAddon?.fit()}catch{}})});const Q={term:s,sessions:e,activeId:i,newShell:w,creating:u,loadingList:d,error:f,warning:n,xtermContainers:a,shellOptions:r,active:h,shortId:L,get xtermMod(){return O},set xtermMod(t){O=t},get fitAddonMod(){return R},set fitAddonMod(t){R=t},loadXterm:I,mountXterm:q,onCreate:re,onClose:se,removeSession:W,activate:le,refreshList:j,ref:S,computed:ee,onMounted:G,onBeforeUnmount:H,nextTick:D,watch:$,get message(){return V},get PlusOutlined(){return ge},get CloseOutlined(){return pe},get ReloadOutlined(){return ye},get useTerminal(){return oe}};return Object.defineProperty(Q,"__isScriptSetup",{enumerable:!1,value:!0}),Q}},be={class:"terminal-page"},ke={class:"terminal-header"},Ce={class:"page-sub"},Ae={class:"terminal-body"},Ee={class:"session-tabs"},Oe=["onClick"],Te={class:"session-shell"},Me={class:"session-id"},Re={key:0,class:"session-empty"},ze={class:"xterm-host"},Le=["data-session-id"],Pe={key:0,class:"xterm-placeholder"},Be={key:1,class:"terminal-footer"},De={key:0,class:"footer-exit"};function qe(c,o,s,e,i,w){const u=z("a-tag"),d=z("a-select"),f=z("a-button"),n=z("a-space"),a=z("a-alert");return y(),x("div",be,[_("div",ke,[_("div",null,[o[3]||(o[3]=_("h2",{class:"page-title"},"远程终端",-1)),_("p",Ce,[o[2]||(o[2]=B(" 桌面端托管的 PTY 会话;Android 端可远程操控同一通道 ",-1)),e.warning?(y(),K(u,{key:0,color:"orange",style:{"margin-left":"8px"}},{default:T(()=>[B(E(e.warning),1)]),_:1})):M("v-if",!0)])]),A(n,null,{default:T(()=>[A(d,{value:e.newShell,"onUpdate:value":o[0]||(o[0]=r=>e.newShell=r),style:{width:"130px"},size:"small",options:e.shellOptions},null,8,["value"]),A(f,{type:"primary",size:"small",loading:e.creating,onClick:e.onCreate},{icon:T(()=>[A(e.PlusOutlined)]),default:T(()=>[o[4]||(o[4]=B(" 新会话 ",-1))]),_:1},8,["loading"]),A(f,{size:"small",loading:e.loadingList,onClick:e.refreshList},{icon:T(()=>[A(e.ReloadOutlined)]),default:T(()=>[o[5]||(o[5]=B(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),e.error?(y(),K(a,{key:0,message:e.error,type:"error","show-icon":"",closable:"",style:{"margin-bottom":"12px"},onClose:o[1]||(o[1]=r=>e.error="")},null,8,["message"])):M("v-if",!0),_("div",Ae,[_("div",Ee,[(y(!0),x(Y,null,Z(e.sessions,r=>(y(),x("div",{key:r.id,class:ve(["session-tab",{active:r.id===e.activeId,dead:!r.alive}]),onClick:h=>e.activate(r.id)},[_("span",Te,E(r.shell),1),_("span",Me,E(e.shortId(r.id)),1),A(e.CloseOutlined,{class:"session-close",onClick:we(h=>e.onClose(r.id),["stop"])},null,8,["onClick"])],10,Oe))),128)),e.sessions.length===0?(y(),x("div",Re,' 点击 "新会话" 创建第一个终端 ')):M("v-if",!0)]),_("div",ze,[(y(!0),x(Y,null,Z(e.sessions,r=>he((y(),x("div",{key:r.id,ref_for:!0,ref:"xtermContainers","data-session-id":r.id,class:"xterm-container"},null,8,Le)),[[_e,r.id===e.activeId]])),128)),e.sessions.length===0?(y(),x("div",Pe,[...o[6]||(o[6]=[_("span",null,"无活跃会话",-1)])])):M("v-if",!0)])]),e.active?(y(),x("div",Be,[_("span",null,E(e.active.shell)+" · "+E(e.active.cwd||"(默认 cwd)")+" · seq "+E(e.active.lastSeq),1),e.active.alive?M("v-if",!0):(y(),x("span",De,"已退出 (code="+E(e.active.exitCode??"-")+")",1))])):M("v-if",!0)])}const Fe=me(Se,[["render",qe],["__scopeId","data-v-65366a29"],["__file","/tmp/cc-web-panel-MQBjbf/repo/packages/web-panel/src/views/Terminal.vue"]]);export{Fe as default};
@@ -1 +0,0 @@
1
- import{O as r}from"./index-B76qMGe0.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-CipchQUs.js";import{U as t}from"./index-B76qMGe0.js";import"./vendor-BvqAck49.js";import"./responsiveObserve-CgCiGZ6t.js";import"./useFlexGapSupport-CKncli3p.js";import"./styleChecker-BTkUPq_y.js";import"./index-C1b8TGYq.js";import"./icons-DP3uiYxy.js";const l=t(o);export{l as default};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-C3A1d5Wt.js";import{U as t}from"./index-B76qMGe0.js";import"./vendor-BvqAck49.js";import"./index-C1b8TGYq.js";import"./icons-DP3uiYxy.js";const s=t(o);export{s as default};