chainlesschain 0.162.37 → 0.162.38

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 (157) hide show
  1. package/package.json +3 -2
  2. package/src/assets/web-panel/assets/{AIOps-_oxz4VHy.js → AIOps-DV0Q9zKL.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-uaeqFuDj.js → ActionButton-C6vH8rhL.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-BPVV0OUf.js → Analytics-BvPDc2ui.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-ppCYKm3I.js → AppLayout-CWnyqTqY.js} +5 -5
  6. package/src/assets/web-panel/assets/{Audit-DFAY6umk.js → Audit-BzenidV4.js} +1 -1
  7. package/src/assets/web-panel/assets/{Backup-pAPBFDyP.js → Backup-CSl7bNwK.js} +1 -1
  8. package/src/assets/web-panel/assets/{BaseInput-BbBl0uT2.js → BaseInput-DAY3iHIq.js} +1 -1
  9. package/src/assets/web-panel/assets/{Chat-Ct22JUnT.js → Chat-Jyhm9fgk.js} +6 -6
  10. package/src/assets/web-panel/assets/{ChatBubbleRenderer-DPlsLl22.js → ChatBubbleRenderer-CwlAnVjy.js} +1 -1
  11. package/src/assets/web-panel/assets/{Checkbox-DEkCollc.js → Checkbox-D4rwURAi.js} +1 -1
  12. package/src/assets/web-panel/assets/{Codegen-Tor-de39.js → Codegen-DYdjTEfC.js} +1 -1
  13. package/src/assets/web-panel/assets/{Col-ojNrLQU7.js → Col-DsVyZ_fS.js} +1 -1
  14. package/src/assets/web-panel/assets/{Community-CLOGhqMF.js → Community-CjCpl27Q.js} +1 -1
  15. package/src/assets/web-panel/assets/{Compact-CYKNlSZ4.js → Compact-kt18dsjm.js} +1 -1
  16. package/src/assets/web-panel/assets/{Compliance-C5E6ABuA.js → Compliance-BV5urquU.js} +1 -1
  17. package/src/assets/web-panel/assets/{Cowork-CHeEsZ3W.js → Cowork-C4SovPWC.js} +2 -2
  18. package/src/assets/web-panel/assets/{Cron-B4e1n2e7.js → Cron-uuNs_xzA.js} +2 -2
  19. package/src/assets/web-panel/assets/{Crosschain-DbNV8P9R.js → Crosschain-DR5a65tR.js} +1 -1
  20. package/src/assets/web-panel/assets/{DID-C5_Tk3nC.js → DID-B1KTf2-5.js} +2 -2
  21. package/src/assets/web-panel/assets/{Dashboard-BhdV_c4N.js → Dashboard-Dkj7XgED.js} +2 -2
  22. package/src/assets/web-panel/assets/{Dropdown-CEi5AMtM.js → Dropdown-BhXCuJ19.js} +1 -1
  23. package/src/assets/web-panel/assets/{EmailListRenderer-DOhPiYng.js → EmailListRenderer-DG8365Iv.js} +1 -1
  24. package/src/assets/web-panel/assets/{FamilyGuardDashboard-fu4NRP3X.js → FamilyGuardDashboard-BdHGPu39.js} +1 -1
  25. package/src/assets/web-panel/assets/{Federation-B7BtIWKL.js → Federation-Dwvxl0zR.js} +1 -1
  26. package/src/assets/web-panel/assets/{FormItemContext-BmPWZVLP.js → FormItemContext-BVmhCVWU.js} +1 -1
  27. package/src/assets/web-panel/assets/{GenericCardRenderer-hsOPNJq8.js → GenericCardRenderer-DDPjvF2s.js} +1 -1
  28. package/src/assets/web-panel/assets/{Git-Bi_EFBUH.js → Git-foK6WTSr.js} +2 -2
  29. package/src/assets/web-panel/assets/{Governance-emf2ubDK.js → Governance-CfqMdu6Y.js} +1 -1
  30. package/src/assets/web-panel/assets/{Inference-B7KjKzkI.js → Inference-BKrLO4GO.js} +1 -1
  31. package/src/assets/web-panel/assets/{KnowledgeGraph-uAaBK0F3.js → KnowledgeGraph-6o6Q-mmF.js} +1 -1
  32. package/src/assets/web-panel/assets/{Logs-utK7hNpj.js → Logs-L5ZIW0Dz.js} +2 -2
  33. package/src/assets/web-panel/assets/{Marketplace-CzQe6n3z.js → Marketplace-BWkfEocP.js} +1 -1
  34. package/src/assets/web-panel/assets/{McpTools-CuAaJr51.js → McpTools-BPebQbWU.js} +5 -5
  35. package/src/assets/web-panel/assets/{Memory-CRuZZJ75.js → Memory-C0Dq-X3C.js} +2 -2
  36. package/src/assets/web-panel/assets/{MobileBridge-Cp06wunh.js → MobileBridge-DRBoutTY.js} +2 -2
  37. package/src/assets/web-panel/assets/{MobileProjects-DJEdUwhr.js → MobileProjects-BMP6eLp1.js} +1 -1
  38. package/src/assets/web-panel/assets/{Mtc-8YY4dR7g.js → Mtc-Cj3QPM9p.js} +2 -2
  39. package/src/assets/web-panel/assets/{MtcAudit-BmPJYHar.js → MtcAudit-rBQYbfQR.js} +2 -2
  40. package/src/assets/web-panel/assets/{Multisig-d-ydyVdq.js → Multisig-Dbuy4OY4.js} +3 -3
  41. package/src/assets/web-panel/assets/{NLProgramming-DA_ikw_n.js → NLProgramming-CMnt1se-.js} +1 -1
  42. package/src/assets/web-panel/assets/{Notes-DIyF-fRe.js → Notes-BX9tSCiF.js} +4 -4
  43. package/src/assets/web-panel/assets/{NotificationSettings-CzPZXEtK.js → NotificationSettings-BFeirVRq.js} +1 -1
  44. package/src/assets/web-panel/assets/OrderTableRenderer-ybiMlKQW.js +1 -0
  45. package/src/assets/web-panel/assets/{Organization-DdDZ_Ap6.js → Organization-kTfRxKqk.js} +4 -4
  46. package/src/assets/web-panel/assets/{Overflow-BnMBkttv.js → Overflow-CtuCAzwV.js} +1 -1
  47. package/src/assets/web-panel/assets/{P2P-Es1050f-.js → P2P-KfbciaP3.js} +2 -2
  48. package/src/assets/web-panel/assets/{PdhVaultBrowser-CKkRmyn9.js → PdhVaultBrowser-bqEUFhgC.js} +5 -5
  49. package/src/assets/web-panel/assets/{Permissions-zU9n9cAD.js → Permissions-BgMypz-z.js} +4 -4
  50. package/src/assets/web-panel/assets/{PersonalDataHub-BZi5Xwas.js → PersonalDataHub-C3zUE-1z.js} +2 -2
  51. package/src/assets/web-panel/assets/{Pipeline-CRfeGiFc.js → Pipeline-iX-pYHpC.js} +1 -1
  52. package/src/assets/web-panel/assets/{Privacy-CQA_IgLA.js → Privacy-B01uzeFM.js} +1 -1
  53. package/src/assets/web-panel/assets/{ProjectInit-C9hmEvoT.js → ProjectInit-TsfbzJp7.js} +2 -2
  54. package/src/assets/web-panel/assets/{ProjectSettings-yXA72ws4.js → ProjectSettings-iGvMp8sM.js} +2 -2
  55. package/src/assets/web-panel/assets/{Projects-BpWS-qam.js → Projects-Be9k29iQ.js} +1 -1
  56. package/src/assets/web-panel/assets/{Providers-Cxe55dRD.js → Providers-C9Pc8dqo.js} +1 -1
  57. package/src/assets/web-panel/assets/{QuickAsk-Do0aUTQr.js → QuickAsk-DN_yFiVO.js} +1 -1
  58. package/src/assets/web-panel/assets/{Recommend--ysZHjyA.js → Recommend-CvSNgl7H.js} +1 -1
  59. package/src/assets/web-panel/assets/{Reputation-BOBU8JrH.js → Reputation-S6BCz8xH.js} +1 -1
  60. package/src/assets/web-panel/assets/{Row-C6X7bRKE.js → Row-CTRYCaqP.js} +1 -1
  61. package/src/assets/web-panel/assets/{RssFeed-D8AwqlkQ.js → RssFeed-Cu8_P5ll.js} +3 -3
  62. package/src/assets/web-panel/assets/{Search-Bi3rCZD4.js → Search-rZ1Xza_U.js} +1 -1
  63. package/src/assets/web-panel/assets/{Security-DxUDVrtY.js → Security-CF43IJHX.js} +4 -4
  64. package/src/assets/web-panel/assets/{Services-BXXN7yC1.js → Services-BobNHzne.js} +2 -2
  65. package/src/assets/web-panel/assets/{Skeleton-B3BR34tZ.js → Skeleton-DWJ2kfuI.js} +1 -1
  66. package/src/assets/web-panel/assets/{Skills-BjYu8OQ1.js → Skills-AmEZgHYr.js} +1 -1
  67. package/src/assets/web-panel/assets/{Sla-DDkCtD8w.js → Sla-DTS-fBiY.js} +1 -1
  68. package/src/assets/web-panel/assets/{SpeechSettings-CGhYzP7V.js → SpeechSettings-DEr6MHRU.js} +1 -1
  69. package/src/assets/web-panel/assets/{SyncSettings-CYNKVAHA.js → SyncSettings-CVs9alv_.js} +2 -2
  70. package/src/assets/web-panel/assets/{Tasks-DavmlJpd.js → Tasks-BcVDAxdi.js} +1 -1
  71. package/src/assets/web-panel/assets/{Templates-CQuYFf2C.js → Templates-CTNjZRKA.js} +1 -1
  72. package/src/assets/web-panel/assets/{Tenant-DdzZh8vE.js → Tenant-DPbXg0Pg.js} +1 -1
  73. package/src/assets/web-panel/assets/Terminal-DhKXcPw2.js +3 -0
  74. package/src/assets/web-panel/assets/{TimelineRenderer-DKOARnc_.js → TimelineRenderer-B0DMZOpk.js} +1 -1
  75. package/src/assets/web-panel/assets/{Tokens-D7QRNG8y.js → Tokens-RvWuBXgg.js} +1 -1
  76. package/src/assets/web-panel/assets/{Trigger-BCsqLZl4.js → Trigger-2O-BaTQG.js} +1 -1
  77. package/src/assets/web-panel/assets/{Trust-BarGUa6p.js → Trust-6qY35L-C.js} +1 -1
  78. package/src/assets/web-panel/assets/{UkeySign-pHrg5a8E.js → UkeySign-DhV1wYtQ.js} +1 -1
  79. package/src/assets/web-panel/assets/{VideoEditing-Dug3m1py.js → VideoEditing-DgqA5UZm.js} +1 -1
  80. package/src/assets/web-panel/assets/{Wallet-BfK3Z_Ez.js → Wallet-DJRYdUAK.js} +4 -4
  81. package/src/assets/web-panel/assets/{WebAuthn-CYRdl9td.js → WebAuthn-C2W-x0cg.js} +5 -5
  82. package/src/assets/web-panel/assets/{WorkflowEditor-DTW5AcqM.js → WorkflowEditor-BP2tkDHe.js} +1 -1
  83. package/src/assets/web-panel/assets/{chat-CCXz4j38.js → chat-CGVfeoTn.js} +1 -1
  84. package/src/assets/web-panel/assets/{colors-BJBOhAqa.js → colors-BmjRolM1.js} +1 -1
  85. package/src/assets/web-panel/assets/{compact-item-E9M6BQcM.js → compact-item-BvJJkjZE.js} +1 -1
  86. package/src/assets/web-panel/assets/{createContext-Cg9CAws4.js → createContext-DyhlvRYs.js} +1 -1
  87. package/src/assets/web-panel/assets/devWarning-CetO0WH0.js +1 -0
  88. package/src/assets/web-panel/assets/{hasIn-DhVtqv5L.js → hasIn-BoBMR89s.js} +1 -1
  89. package/src/assets/web-panel/assets/{index--7o5YdL6.js → index-39VDXdn6.js} +1 -1
  90. package/src/assets/web-panel/assets/{index-CSiyjCYi.js → index-81tWFqfN.js} +1 -1
  91. package/src/assets/web-panel/assets/{index-CJ8nNT8h.js → index-BT1SQ9nj.js} +1 -1
  92. package/src/assets/web-panel/assets/index-BZVz-WfV.js +1 -0
  93. package/src/assets/web-panel/assets/{index-ComyTKz-.js → index-Beh7jDbS.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-Dwvewrul.js → index-Bm_MmdwP.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-D5yC2Ps8.js → index-BqGNmoKy.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-_PNqQ5mE.js → index-BuQrONgf.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-B8bjEHrQ.js → index-BvvNnWXe.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-CVR_s-pT.js → index-ByWpNjTj.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-CFp-wdrQ.js → index-BycpeGfj.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-wkt-o5q5.js → index-C0xn6hOr.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-B111fZ21.js → index-C1t-r7yV.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-B_SMPD4L.js → index-CDPMHKQi.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-BAB0nGP7.js → index-CIaGw7vl.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CFarAlXj.js → index-CQJVedQ3.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-DSQazU6J.js → index-CSgbOGaP.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-MdXEhfdJ.js → index-Cbh-lCxq.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DaFe1aqY.js → index-CzDVBBcg.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-ByazO4Q9.js → index-Czsbrn75.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-Cm1m7BJh.js → index-D-93XwJd.js} +1 -1
  110. package/src/assets/web-panel/assets/index-D0-bvFy3.js +1 -0
  111. package/src/assets/web-panel/assets/{index-BxSzyly9.js → index-D0YToIi_.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-CeRlLp3F.js → index-DIPZ6hbJ.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-CkTeBHI9.js → index-DeeLHcMY.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-kz1oXl1a.js → index-DgbWSwr5.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-Ca8BYV1g.js → index-DtKdCXHW.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-ChsSljaN.js → index-DwTgvhOL.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DdhnGez0.js → index-DyS4I4L-.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CUp_c8Le.js → index-FKFT-QTk.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-C-2dUIli.js → index-Te0ruvY_.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-DDcJO27F.js → index-VXVukhBA.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CznfPnOx.js → index-Y1b8i0NV.js} +3 -3
  122. package/src/assets/web-panel/assets/{index-BFZPRd0T.js → index-ZNIms1nA.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-B4NBF4Sa.js → index-n-N19np-.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-4N5lNXGP.js → index-vF1pR00A.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-6-04M2Nx.js → index-wLAjVpmJ.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-D7DXdf7x.js → index-xPSzUoWT.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-Di5LBXcE.js → index-xZdOioVg.js} +1 -1
  128. package/src/assets/web-panel/assets/{initDefaultProps-iyBaePF-.js → initDefaultProps-BLKSE8he.js} +1 -1
  129. package/src/assets/web-panel/assets/{motion-RWtj4rgu.js → motion-Bb59qqLK.js} +1 -1
  130. package/src/assets/web-panel/assets/{move-CqPRVzpH.js → move-CB3pYCk6.js} +1 -1
  131. package/src/assets/web-panel/assets/{omit-DsvJze25.js → omit-iImQWuU7.js} +1 -1
  132. package/src/assets/web-panel/assets/{pickAttrs-B4tfZBhc.js → pickAttrs-DRP2Chqo.js} +1 -1
  133. package/src/assets/web-panel/assets/{placementArrow-KvHUwXMA.js → placementArrow-BrlfD4tF.js} +1 -1
  134. package/src/assets/web-panel/assets/{responsiveObserve-DGdJ-b7W.js → responsiveObserve-Cqxkuh5H.js} +1 -1
  135. package/src/assets/web-panel/assets/{slide-Cd6ebRmw.js → slide-nxKEuLMj.js} +1 -1
  136. package/src/assets/web-panel/assets/{statusUtils-Bg9GcIAn.js → statusUtils-30E47KSk.js} +1 -1
  137. package/src/assets/web-panel/assets/{styleChecker-MQjKsG84.js → styleChecker-Dn2_-5bn.js} +1 -1
  138. package/src/assets/web-panel/assets/{useFlexGapSupport-C241WujP.js → useFlexGapSupport-DkZ00X6F.js} +1 -1
  139. package/src/assets/web-panel/assets/{useFs-CMpy7RS4.js → useFs-ByrwSCOr.js} +1 -1
  140. package/src/assets/web-panel/assets/{usePersonalDataHub-BLHtapKb.js → usePersonalDataHub-BDY6jtUD.js} +1 -1
  141. package/src/assets/web-panel/assets/{vnode-DmcTV67c.js → vnode-BL2q5BLv.js} +1 -1
  142. package/src/assets/web-panel/assets/{zoom-DHL8_0Y8.js → zoom-BSkPKE42.js} +1 -1
  143. package/src/assets/web-panel/index.html +1 -1
  144. package/src/commands/agent.js +31 -0
  145. package/src/commands/mcp.js +236 -6
  146. package/src/harness/mcp-client.js +70 -1
  147. package/src/lib/settings-hooks.cjs +1 -0
  148. package/src/repl/agent-repl.js +52 -20
  149. package/src/repl/mcp-prompt.js +122 -0
  150. package/src/runtime/agent-core.js +123 -17
  151. package/src/runtime/headless-runner.js +34 -9
  152. package/src/runtime/mcp-config.js +118 -9
  153. package/src/assets/web-panel/assets/OrderTableRenderer-BiLtg-LY.js +0 -1
  154. package/src/assets/web-panel/assets/Terminal-D75WeG9d.js +0 -3
  155. package/src/assets/web-panel/assets/devWarning-BrsbTJUv.js +0 -1
  156. package/src/assets/web-panel/assets/index-DSTQDO-Y.js +0 -1
  157. package/src/assets/web-panel/assets/index-c2U6LV3Q.js +0 -1
@@ -222,7 +222,10 @@ async function runSettingsPreToolUseHooks(name, args, context, cwd) {
222
222
  cwd,
223
223
  session_id: context.sessionId || null,
224
224
  };
225
- const outcome = runCommandHooks(matched, payload, { cwd, event: "PreToolUse" });
225
+ const outcome = runCommandHooks(matched, payload, {
226
+ cwd,
227
+ event: "PreToolUse",
228
+ });
226
229
  if (outcome.decision === "block") {
227
230
  return { blocked: true, reason: outcome.reason, hook: outcome.hook };
228
231
  }
@@ -234,8 +237,7 @@ async function runSettingsPreToolUseHooks(name, args, context, cwd) {
234
237
  tool: name,
235
238
  args,
236
239
  rule: `hook:${outcome.hook}`,
237
- reason:
238
- outcome.reason || "a PreToolUse hook requests confirmation",
240
+ reason: outcome.reason || "a PreToolUse hook requests confirmation",
239
241
  })
240
242
  : false;
241
243
  return ok
@@ -730,7 +732,11 @@ export async function executeTool(name, args, context = {}) {
730
732
  if (!ok) {
731
733
  return {
732
734
  error: `[Permission] Tool "${name}" requires confirmation (settings rule: ${settingsVerdict.rule}) — denied.`,
733
- policy: { decision: "ask", rule: settingsVerdict.rule, via: "settings" },
735
+ policy: {
736
+ decision: "ask",
737
+ rule: settingsVerdict.rule,
738
+ via: "settings",
739
+ },
734
740
  };
735
741
  }
736
742
  ruleAllowed = true; // confirmed → treat like allow downstream
@@ -889,6 +895,41 @@ export async function executeTool(name, args, context = {}) {
889
895
  }
890
896
  }
891
897
 
898
+ // settings.json SubagentStop hooks: fire when a `spawn_sub_agent` tool call
899
+ // finishes (Claude-Code SubagentStop parity). The subagent has already
900
+ // returned its summary, so this is observe + feedback rather than force-
901
+ // continue: a `block` reason is surfaced to the PARENT agent as hookFeedback
902
+ // so it can react (e.g. re-spawn or adjust), mirroring PostToolUse.
903
+ if (
904
+ name === "spawn_sub_agent" &&
905
+ context.settingsHooks &&
906
+ toolResult &&
907
+ typeof toolResult === "object"
908
+ ) {
909
+ try {
910
+ const outcome = runObserveHooks(
911
+ context.settingsHooks,
912
+ "SubagentStop",
913
+ {
914
+ stop_hook_active: false,
915
+ session_id: context.sessionId || null,
916
+ subagent_response:
917
+ typeof toolResult === "object"
918
+ ? JSON.stringify(toolResult).substring(0, 2000)
919
+ : String(toolResult).substring(0, 2000),
920
+ },
921
+ { cwd },
922
+ );
923
+ if (outcome.decision === "block" && outcome.reason) {
924
+ toolResult.hookFeedback = toolResult.hookFeedback
925
+ ? `${toolResult.hookFeedback}\n${outcome.reason}`
926
+ : outcome.reason;
927
+ }
928
+ } catch (_err) {
929
+ // SubagentStop hooks are best-effort
930
+ }
931
+ }
932
+
892
933
  return toolResult;
893
934
  }
894
935
 
@@ -1240,12 +1281,8 @@ async function executeToolInner(
1240
1281
  ...(task.error ? { error: task.error } : {}),
1241
1282
  stdout: out.text.substring(0, 30000),
1242
1283
  stderr: err.text.substring(0, 30000),
1243
- ...(out.droppedGap
1244
- ? { stdout_dropped_bytes: out.droppedGap }
1245
- : {}),
1246
- ...(err.droppedGap
1247
- ? { stderr_dropped_bytes: err.droppedGap }
1248
- : {}),
1284
+ ...(out.droppedGap ? { stdout_dropped_bytes: out.droppedGap } : {}),
1285
+ ...(err.droppedGap ? { stderr_dropped_bytes: err.droppedGap } : {}),
1249
1286
  ...(killed ? { killed: true } : {}),
1250
1287
  startedAt: task.startedAt,
1251
1288
  endedAt: task.endedAt,
@@ -1635,6 +1672,50 @@ async function executeToolInner(
1635
1672
  }
1636
1673
 
1637
1674
  default:
1675
+ if (localToolExecutor?.kind === "mcp-resource") {
1676
+ if (!mcpClient) {
1677
+ return attachDescriptor({
1678
+ error: `MCP client is unavailable for tool: ${name}`,
1679
+ });
1680
+ }
1681
+ try {
1682
+ if (localToolExecutor.op === "list") {
1683
+ const resources =
1684
+ typeof mcpClient.listResources === "function"
1685
+ ? mcpClient.listResources(args?.server || undefined)
1686
+ : [];
1687
+ return attachDescriptor({ count: resources.length, resources });
1688
+ }
1689
+ // op === "read"
1690
+ const uri = args?.uri;
1691
+ if (!uri || typeof uri !== "string") {
1692
+ return attachDescriptor({
1693
+ error: "read_mcp_resource requires a string 'uri' argument.",
1694
+ });
1695
+ }
1696
+ let server = args?.server;
1697
+ if (!server && typeof mcpClient.listResources === "function") {
1698
+ const match = mcpClient
1699
+ .listResources()
1700
+ .find((r) => r && r.uri === uri);
1701
+ server = match?.server;
1702
+ }
1703
+ if (!server) {
1704
+ return attachDescriptor({
1705
+ error: `Could not resolve which MCP server owns resource "${uri}". Pass 'server' explicitly.`,
1706
+ });
1707
+ }
1708
+ const result = await mcpClient.readResource(server, uri);
1709
+ return attachDescriptor(
1710
+ result && typeof result === "object" ? result : { result },
1711
+ );
1712
+ } catch (err) {
1713
+ return attachDescriptor({
1714
+ error: `MCP resource access failed: ${err.message}`,
1715
+ });
1716
+ }
1717
+ }
1718
+
1638
1719
  if (localToolExecutor?.kind === "mcp") {
1639
1720
  if (!mcpClient || typeof mcpClient.callTool !== "function") {
1640
1721
  return attachDescriptor({
@@ -2601,7 +2682,13 @@ export function _accumulateAnthropicStream(lines, onToken) {
2601
2682
  return _anthropicFinalize(state);
2602
2683
  }
2603
2684
 
2604
- async function _chatAnthropicStreaming(apiUrl, body, extraHeaders, onToken, signal) {
2685
+ async function _chatAnthropicStreaming(
2686
+ apiUrl,
2687
+ body,
2688
+ extraHeaders,
2689
+ onToken,
2690
+ signal,
2691
+ ) {
2605
2692
  const response = await fetch(apiUrl, {
2606
2693
  method: "POST",
2607
2694
  headers: { "Content-Type": "application/json", ...extraHeaders },
@@ -2663,10 +2750,12 @@ function _openaiReduceLine(state, raw, onToken) {
2663
2750
  if (Array.isArray(delta?.tool_calls)) {
2664
2751
  for (const tc of delta.tool_calls) {
2665
2752
  const idx = tc.index ?? 0;
2666
- if (!state.tools[idx]) state.tools[idx] = { id: undefined, name: "", args: "" };
2753
+ if (!state.tools[idx])
2754
+ state.tools[idx] = { id: undefined, name: "", args: "" };
2667
2755
  if (tc.id) state.tools[idx].id = tc.id;
2668
2756
  if (tc.function?.name) state.tools[idx].name = tc.function.name;
2669
- if (tc.function?.arguments) state.tools[idx].args += tc.function.arguments;
2757
+ if (tc.function?.arguments)
2758
+ state.tools[idx].args += tc.function.arguments;
2670
2759
  }
2671
2760
  }
2672
2761
  if (obj.usage) {
@@ -2702,7 +2791,14 @@ export function _accumulateOpenAIStream(lines, onToken) {
2702
2791
  return _openaiFinalize(state);
2703
2792
  }
2704
2793
 
2705
- async function _chatOpenAIStreaming(apiUrl, body, apiKey, onToken, signal, provider) {
2794
+ async function _chatOpenAIStreaming(
2795
+ apiUrl,
2796
+ body,
2797
+ apiKey,
2798
+ onToken,
2799
+ signal,
2800
+ provider,
2801
+ ) {
2706
2802
  const response = await fetch(apiUrl, {
2707
2803
  method: "POST",
2708
2804
  headers: {
@@ -2843,7 +2939,11 @@ function _intensityToEffort(want) {
2843
2939
  * RUNTIME-UNVERIFIED — no Anthropic key to validate the wire shape live.
2844
2940
  * Exported for tests.
2845
2941
  */
2846
- export function _anthropicThinkingParams(model, options = {}, maxTokens = 8192) {
2942
+ export function _anthropicThinkingParams(
2943
+ model,
2944
+ options = {},
2945
+ maxTokens = 8192,
2946
+ ) {
2847
2947
  const want = options?.thinking;
2848
2948
  if (!want) return null; // off by default → request unchanged
2849
2949
  const m = String(model || "").toLowerCase();
@@ -3181,7 +3281,11 @@ export async function* agentLoop(messages, options) {
3181
3281
  }
3182
3282
  }
3183
3283
  if (preCompactBlocked) {
3184
- yield { type: "compaction-skipped", runId, reason: preCompactReason };
3284
+ yield {
3285
+ type: "compaction-skipped",
3286
+ runId,
3287
+ reason: preCompactReason,
3288
+ };
3185
3289
  }
3186
3290
  const { messages: compacted, stats } = preCompactBlocked
3187
3291
  ? { messages, stats: { saved: 0 } }
@@ -3400,7 +3504,9 @@ export function formatToolArgs(name, args) {
3400
3504
  case "edit_file_hashed":
3401
3505
  return `${args.path} @${args.anchor_hash}`;
3402
3506
  case "run_shell":
3403
- return args.run_in_background ? `${args.command} (background)` : args.command;
3507
+ return args.run_in_background
3508
+ ? `${args.command} (background)`
3509
+ : args.command;
3404
3510
  case "check_shell":
3405
3511
  return args.task_id
3406
3512
  ? `${args.task_id}${args.kill ? " (kill)" : ""}`
@@ -176,6 +176,34 @@ export function resolveHeadlessSession(options = {}, store = {}, fallbackId) {
176
176
  return { sessionId: id, resumeId, persist, wantLatest };
177
177
  }
178
178
 
179
+ /**
180
+ * Apply `--fork-session`: when a session has been resolved (resume/continue) and
181
+ * a fork is requested, branch its JSONL transcript into a NEW id so the original
182
+ * stays untouched (Claude-Code `--fork-session` parity). The copy carries the
183
+ * full prior history, so a later `--resume <newId>` replays the whole branch.
184
+ *
185
+ * Returns the id to use downstream + the source (`forkedFrom`), or the original
186
+ * id unchanged with `missing:true` when there is no transcript to fork. Pure
187
+ * apart from the injected store's side effect; both `sessionExists`/`forkSession`
188
+ * are injection seams so this is unit-testable without disk.
189
+ *
190
+ * @param {{forkSession?:boolean, sessionId?:string|null}} opts
191
+ * @param {{sessionExists?:Function, forkSession?:Function}} store
192
+ * @returns {{ sessionId:string|null, forkedFrom:string|null, missing:boolean }}
193
+ */
194
+ export function applyForkSession(opts = {}, store = {}) {
195
+ const want = opts.forkSession === true;
196
+ const id = opts.sessionId || null;
197
+ if (!want || !id) return { sessionId: id, forkedFrom: null, missing: false };
198
+ if (typeof store.sessionExists === "function" && !store.sessionExists(id)) {
199
+ return { sessionId: id, forkedFrom: null, missing: true };
200
+ }
201
+ const newId =
202
+ typeof store.forkSession === "function" ? store.forkSession(id) : null;
203
+ if (!newId) return { sessionId: id, forkedFrom: null, missing: false };
204
+ return { sessionId: newId, forkedFrom: id, missing: false };
205
+ }
206
+
179
207
  /**
180
208
  * Run a single headless agentic turn.
181
209
  *
@@ -404,9 +432,8 @@ export async function runAgentHeadless(options = {}, deps = {}) {
404
432
  // settings.json UserPromptSubmit hooks. block → abort the run; context → inject.
405
433
  if (settingsHooks) {
406
434
  try {
407
- const { runUserPromptSubmitHooks } = await import(
408
- "../lib/settings-hook-events.cjs"
409
- );
435
+ const { runUserPromptSubmitHooks } =
436
+ await import("../lib/settings-hook-events.cjs");
410
437
  const ups = runUserPromptSubmitHooks(settingsHooks, {
411
438
  prompt: userContent,
412
439
  cwd,
@@ -434,9 +461,8 @@ export async function runAgentHeadless(options = {}, deps = {}) {
434
461
  let sessionStartContext = null;
435
462
  if (settingsHooks) {
436
463
  try {
437
- const { runSessionStartHooks } = await import(
438
- "../lib/settings-hook-events.cjs"
439
- );
464
+ const { runSessionStartHooks } =
465
+ await import("../lib/settings-hook-events.cjs");
440
466
  sessionStartContext = runSessionStartHooks(settingsHooks, {
441
467
  source: resumeId ? "resume" : "startup",
442
468
  cwd,
@@ -766,9 +792,8 @@ export async function runAgentHeadless(options = {}, deps = {}) {
766
792
  // settings.json SessionEnd hooks (observe-only) when the run finishes.
767
793
  if (settingsHooks) {
768
794
  try {
769
- const { runObserveHooks } = await import(
770
- "../lib/settings-hook-events.cjs"
771
- );
795
+ const { runObserveHooks } =
796
+ await import("../lib/settings-hook-events.cjs");
772
797
  runObserveHooks(
773
798
  settingsHooks,
774
799
  "SessionEnd",
@@ -41,7 +41,8 @@ export function parseMcpServers(raw) {
41
41
  env: cfg.env && typeof cfg.env === "object" ? cfg.env : {},
42
42
  url: cfg.url,
43
43
  transport: cfg.transport,
44
- headers: cfg.headers && typeof cfg.headers === "object" ? cfg.headers : {},
44
+ headers:
45
+ cfg.headers && typeof cfg.headers === "object" ? cfg.headers : {},
45
46
  };
46
47
  }
47
48
  return out;
@@ -75,7 +76,13 @@ export async function setupMcpFromConfig(servers, deps = {}) {
75
76
  externalToolExecutors: {},
76
77
  externalToolDescriptors: {},
77
78
  connected: [],
79
+ resources: [],
80
+ prompts: [],
78
81
  };
82
+ // Back-fill the resource/prompt accumulators when an older `deps.into` object
83
+ // (created before this field existed) is passed in.
84
+ if (!Array.isArray(result.resources)) result.resources = [];
85
+ if (!Array.isArray(result.prompts)) result.prompts = [];
79
86
  const {
80
87
  mcpClient,
81
88
  extraToolDefinitions,
@@ -92,11 +99,7 @@ export async function setupMcpFromConfig(servers, deps = {}) {
92
99
  // unless the config already supplies an Authorization header. Best-effort:
93
100
  // no token / a refresh failure just connects unauthenticated.
94
101
  let connectCfg = cfg;
95
- if (
96
- cfg.url &&
97
- !cfg.headers?.Authorization &&
98
- !cfg.headers?.authorization
99
- ) {
102
+ if (cfg.url && !cfg.headers?.Authorization && !cfg.headers?.authorization) {
100
103
  try {
101
104
  const { ensureValidToken } = await import("../lib/mcp-oauth.js");
102
105
  const token = await ensureValidToken(cfg.url);
@@ -118,7 +121,22 @@ export async function setupMcpFromConfig(servers, deps = {}) {
118
121
  continue;
119
122
  }
120
123
  const tools = Array.isArray(res?.tools) ? res.tools : [];
121
- connected.push({ server: name, tools: tools.length });
124
+ const resources = Array.isArray(res?.resources) ? res.resources : [];
125
+ const prompts = Array.isArray(res?.prompts) ? res.prompts : [];
126
+ connected.push({
127
+ server: name,
128
+ tools: tools.length,
129
+ resources: resources.length,
130
+ prompts: prompts.length,
131
+ });
132
+ for (const r of resources) {
133
+ if (!r || !r.uri) continue;
134
+ result.resources.push({ ...r, server: name });
135
+ }
136
+ for (const p of prompts) {
137
+ if (!p || !p.name) continue;
138
+ result.prompts.push({ ...p, server: name });
139
+ }
122
140
  for (const t of tools) {
123
141
  if (!t || !t.name) continue;
124
142
  const full = mcpToolName(name, t.name);
@@ -126,7 +144,8 @@ export async function setupMcpFromConfig(servers, deps = {}) {
126
144
  type: "function",
127
145
  function: {
128
146
  name: full,
129
- description: t.description || `MCP tool "${t.name}" on server "${name}"`,
147
+ description:
148
+ t.description || `MCP tool "${t.name}" on server "${name}"`,
130
149
  parameters: t.inputSchema || { type: "object", properties: {} },
131
150
  },
132
151
  });
@@ -144,9 +163,97 @@ export async function setupMcpFromConfig(servers, deps = {}) {
144
163
  }
145
164
  }
146
165
 
166
+ // Expose MCP resources to the LLM as two generic tools (Claude-Code parity:
167
+ // ListMcpResourcesTool / ReadMcpResourceTool). Registered once, only when at
168
+ // least one connected server advertises a resource, and re-entrant safe for
169
+ // accumulating `deps.into` batches.
170
+ if (result.resources.length > 0) {
171
+ registerMcpResourceTools(result);
172
+ }
173
+
147
174
  return result;
148
175
  }
149
176
 
177
+ /**
178
+ * Register the `list_mcp_resources` + `read_mcp_resource` generic tools on the
179
+ * agent wiring object, unless already present. Their executors are dispatched
180
+ * by agent-core via `kind: "mcp-resource"`.
181
+ */
182
+ export function registerMcpResourceTools(result) {
183
+ const {
184
+ extraToolDefinitions,
185
+ externalToolExecutors,
186
+ externalToolDescriptors,
187
+ } = result;
188
+ if (externalToolExecutors.read_mcp_resource) return; // already registered
189
+
190
+ extraToolDefinitions.push(
191
+ {
192
+ type: "function",
193
+ function: {
194
+ name: "list_mcp_resources",
195
+ description:
196
+ "List resources exposed by connected MCP servers (documents, files, " +
197
+ "or data the server makes available). Optionally filter by server.",
198
+ parameters: {
199
+ type: "object",
200
+ properties: {
201
+ server: {
202
+ type: "string",
203
+ description: "Optional MCP server name to filter by.",
204
+ },
205
+ },
206
+ },
207
+ },
208
+ },
209
+ {
210
+ type: "function",
211
+ function: {
212
+ name: "read_mcp_resource",
213
+ description:
214
+ "Read the contents of an MCP resource by its URI. Use " +
215
+ "list_mcp_resources first to discover available URIs.",
216
+ parameters: {
217
+ type: "object",
218
+ properties: {
219
+ server: {
220
+ type: "string",
221
+ description:
222
+ "MCP server name that owns the resource (from list_mcp_resources).",
223
+ },
224
+ uri: {
225
+ type: "string",
226
+ description: "Resource URI to read.",
227
+ },
228
+ },
229
+ required: ["uri"],
230
+ },
231
+ },
232
+ },
233
+ );
234
+
235
+ externalToolExecutors.list_mcp_resources = {
236
+ kind: "mcp-resource",
237
+ op: "list",
238
+ };
239
+ externalToolExecutors.read_mcp_resource = {
240
+ kind: "mcp-resource",
241
+ op: "read",
242
+ };
243
+ externalToolDescriptors.list_mcp_resources = {
244
+ name: "list_mcp_resources",
245
+ kind: "mcp-resource",
246
+ category: "mcp",
247
+ source: "mcp",
248
+ };
249
+ externalToolDescriptors.read_mcp_resource = {
250
+ name: "read_mcp_resource",
251
+ kind: "mcp-resource",
252
+ category: "mcp",
253
+ source: "mcp",
254
+ };
255
+ }
256
+
150
257
  /**
151
258
  * Read + parse a `--mcp-config` file and connect its servers.
152
259
  * Throws on an unreadable/empty config (fail fast — the user asked for MCP).
@@ -377,7 +484,9 @@ export function makePermissionPromptConfirmer({
377
484
  return allow;
378
485
  } catch (err) {
379
486
  if (isText) {
380
- writeErr(` permission(${ctx?.tool}): deny (tool error: ${err.message})\n`);
487
+ writeErr(
488
+ ` permission(${ctx?.tool}): deny (tool error: ${err.message})\n`,
489
+ );
381
490
  }
382
491
  return false; // fail-closed
383
492
  }
@@ -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 o}from"./vendor-BvqAck49.js";import{_ as S}from"./index-CznfPnOx.js";import"./icons-DP3uiYxy.js";const k={__name:"OrderTableRenderer",props:{event:{type:Object,required:!0}},setup(p,{expose:r}){r();const a=p,e=o(()=>a.event.content||{}),d=o(()=>a.event.extra||{}),m=o(()=>d.value.merchant||e.value.merchant||e.value.counterparty||"—"),c=o(()=>e.value.title||e.value.name||e.value.itemName||e.value.text||"—"),y=o(()=>{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=o(()=>d.value.orderNo||e.value.orderNo||e.value.orderId),f=o(()=>e.value.status||e.value.state),b=o(()=>{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=o(()=>{if(!a.event.occurredAt)return"";const t=new Date(a.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:a,c:e,e:d,merchantText:m,itemText:c,amountText:y,orderNo:T,statusText:f,statusColor:b,formattedTime:h,computed:o};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}},N={class:"order-card"},C={class:"head"},O={class:"time"},V={class:"row"},R={class:"val"},B={class:"row"},D={class:"val"},F={class:"row amount-row"},I={class:"val amount"},j={key:0,class:"row"},A={class:"val mono"},J={key:1,class:"row"};function K(p,r,a,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(a.event.source.adapter),1)]),_:1}),i(c,null,{default:v(()=>[_(n(a.event.subtype),1)]),_:1})]),s("div",V,[r[0]||(r[0]=s("span",{class:"key"},"商户",-1)),s("span",R,n(e.merchantText),1)]),s("div",B,[r[1]||(r[1]=s("span",{class:"key"},"商品/项目",-1)),s("span",D,n(e.itemText),1)]),s("div",F,[r[2]||(r[2]=s("span",{class:"key"},"金额",-1)),s("span",I,n(e.amountText),1)]),e.orderNo?(l(),u("div",j,[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",J,[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 H=S(k,[["render",K],["__scopeId","data-v-5ed5524d"],["__file","/tmp/cc-web-panel-JZFoWK/repo/packages/web-panel/src/components/pdh/renderers/OrderTableRenderer.vue"]]);export{H 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-CznfPnOx.js";import{I as z,J as x,U as _,Q as D,S as j,K as T,V as R,c as A,F as Q,Z as Y,R as E,o as G,f as H,w as $,n as q,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,F=new Set,N=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)),F.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)),N.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)}):(F.add(a),()=>F.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)}):(N.add(a),()=>N.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,M=null;async function I(){if(O)return{xtermMod:O,fitAddonMod:M};try{O=await U(()=>import("./xterm-BZcWGsqw.js").then(t=>t.x),__vite__mapDeps([0,1,2]),import.meta.url),M=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:M}}async function B(t){await q();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 Z of v)m.write(Z.data),t.lastSeq=Z.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 B(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,q(()=>{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 B(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,()=>{q(()=>{const t=h.value;try{t?.fitAddon?.fit()}catch{}})});const K={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 M},set fitAddonMod(t){M=t},loadXterm:I,mountXterm:B,onCreate:re,onClose:se,removeSession:W,activate:le,refreshList:J,ref:S,computed:ee,onMounted:G,onBeforeUnmount:H,nextTick:q,watch:$,get message(){return V},get PlusOutlined(){return ge},get CloseOutlined(){return pe},get ReloadOutlined(){return ye},get useTerminal(){return oe}};return Object.defineProperty(K,"__isScriptSetup",{enumerable:!1,value:!0}),K}},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"},Re={class:"session-id"},Me={key:0,class:"session-empty"},ze={class:"xterm-host"},Le=["data-session-id"],Pe={key:0,class:"xterm-placeholder"},De={key:1,class:"terminal-footer"},qe={key:0,class:"footer-exit"};function Be(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]=D(" 桌面端托管的 PTY 会话;Android 端可远程操控同一通道 ",-1)),e.warning?(y(),j(u,{key:0,color:"orange",style:{"margin-left":"8px"}},{default:T(()=>[D(E(e.warning),1)]),_:1})):R("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]=D(" 新会话 ",-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]=D(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),e.error?(y(),j(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"])):R("v-if",!0),_("div",Ae,[_("div",Ee,[(y(!0),x(Q,null,Y(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",Re,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",Me,' 点击 "新会话" 创建第一个终端 ')):R("v-if",!0)]),_("div",ze,[(y(!0),x(Q,null,Y(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)])])):R("v-if",!0)])]),e.active?(y(),x("div",De,[_("span",null,E(e.active.shell)+" · "+E(e.active.cwd||"(默认 cwd)")+" · seq "+E(e.active.lastSeq),1),e.active.alive?R("v-if",!0):(y(),x("span",qe,"已退出 (code="+E(e.active.exitCode??"-")+")",1))])):R("v-if",!0)])}const Ne=me(Se,[["render",Be],["__scopeId","data-v-65366a29"],["__file","/tmp/cc-web-panel-JZFoWK/repo/packages/web-panel/src/views/Terminal.vue"]]);export{Ne as default};
@@ -1 +0,0 @@
1
- import{O as r}from"./index-CznfPnOx.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-ojNrLQU7.js";import{U as t}from"./index-CznfPnOx.js";import"./vendor-BvqAck49.js";import"./index-Cm1m7BJh.js";import"./icons-DP3uiYxy.js";const s=t(o);export{s as default};
@@ -1 +0,0 @@
1
- import{A as o}from"./Row-C6X7bRKE.js";import{U as t}from"./index-CznfPnOx.js";import"./vendor-BvqAck49.js";import"./responsiveObserve-DGdJ-b7W.js";import"./useFlexGapSupport-C241WujP.js";import"./styleChecker-MQjKsG84.js";import"./index-Cm1m7BJh.js";import"./icons-DP3uiYxy.js";const l=t(o);export{l as default};