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.
- package/package.json +3 -2
- package/src/assets/web-panel/assets/{AIOps-_oxz4VHy.js → AIOps-DV0Q9zKL.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-uaeqFuDj.js → ActionButton-C6vH8rhL.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BPVV0OUf.js → Analytics-BvPDc2ui.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-ppCYKm3I.js → AppLayout-CWnyqTqY.js} +5 -5
- package/src/assets/web-panel/assets/{Audit-DFAY6umk.js → Audit-BzenidV4.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-pAPBFDyP.js → Backup-CSl7bNwK.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BbBl0uT2.js → BaseInput-DAY3iHIq.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-Ct22JUnT.js → Chat-Jyhm9fgk.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-DPlsLl22.js → ChatBubbleRenderer-CwlAnVjy.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-DEkCollc.js → Checkbox-D4rwURAi.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-Tor-de39.js → Codegen-DYdjTEfC.js} +1 -1
- package/src/assets/web-panel/assets/{Col-ojNrLQU7.js → Col-DsVyZ_fS.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CLOGhqMF.js → Community-CjCpl27Q.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-CYKNlSZ4.js → Compact-kt18dsjm.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-C5E6ABuA.js → Compliance-BV5urquU.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-CHeEsZ3W.js → Cowork-C4SovPWC.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-B4e1n2e7.js → Cron-uuNs_xzA.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-DbNV8P9R.js → Crosschain-DR5a65tR.js} +1 -1
- package/src/assets/web-panel/assets/{DID-C5_Tk3nC.js → DID-B1KTf2-5.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-BhdV_c4N.js → Dashboard-Dkj7XgED.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-CEi5AMtM.js → Dropdown-BhXCuJ19.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-DOhPiYng.js → EmailListRenderer-DG8365Iv.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-fu4NRP3X.js → FamilyGuardDashboard-BdHGPu39.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-B7BtIWKL.js → Federation-Dwvxl0zR.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BmPWZVLP.js → FormItemContext-BVmhCVWU.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-hsOPNJq8.js → GenericCardRenderer-DDPjvF2s.js} +1 -1
- package/src/assets/web-panel/assets/{Git-Bi_EFBUH.js → Git-foK6WTSr.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-emf2ubDK.js → Governance-CfqMdu6Y.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-B7KjKzkI.js → Inference-BKrLO4GO.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-uAaBK0F3.js → KnowledgeGraph-6o6Q-mmF.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-utK7hNpj.js → Logs-L5ZIW0Dz.js} +2 -2
- package/src/assets/web-panel/assets/{Marketplace-CzQe6n3z.js → Marketplace-BWkfEocP.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CuAaJr51.js → McpTools-BPebQbWU.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-CRuZZJ75.js → Memory-C0Dq-X3C.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-Cp06wunh.js → MobileBridge-DRBoutTY.js} +2 -2
- package/src/assets/web-panel/assets/{MobileProjects-DJEdUwhr.js → MobileProjects-BMP6eLp1.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-8YY4dR7g.js → Mtc-Cj3QPM9p.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-BmPJYHar.js → MtcAudit-rBQYbfQR.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-d-ydyVdq.js → Multisig-Dbuy4OY4.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-DA_ikw_n.js → NLProgramming-CMnt1se-.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-DIyF-fRe.js → Notes-BX9tSCiF.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-CzPZXEtK.js → NotificationSettings-BFeirVRq.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-ybiMlKQW.js +1 -0
- package/src/assets/web-panel/assets/{Organization-DdDZ_Ap6.js → Organization-kTfRxKqk.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-BnMBkttv.js → Overflow-CtuCAzwV.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-Es1050f-.js → P2P-KfbciaP3.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-CKkRmyn9.js → PdhVaultBrowser-bqEUFhgC.js} +5 -5
- package/src/assets/web-panel/assets/{Permissions-zU9n9cAD.js → Permissions-BgMypz-z.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-BZi5Xwas.js → PersonalDataHub-C3zUE-1z.js} +2 -2
- package/src/assets/web-panel/assets/{Pipeline-CRfeGiFc.js → Pipeline-iX-pYHpC.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-CQA_IgLA.js → Privacy-B01uzeFM.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-C9hmEvoT.js → ProjectInit-TsfbzJp7.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-yXA72ws4.js → ProjectSettings-iGvMp8sM.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-BpWS-qam.js → Projects-Be9k29iQ.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-Cxe55dRD.js → Providers-C9Pc8dqo.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-Do0aUTQr.js → QuickAsk-DN_yFiVO.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend--ysZHjyA.js → Recommend-CvSNgl7H.js} +1 -1
- package/src/assets/web-panel/assets/{Reputation-BOBU8JrH.js → Reputation-S6BCz8xH.js} +1 -1
- package/src/assets/web-panel/assets/{Row-C6X7bRKE.js → Row-CTRYCaqP.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-D8AwqlkQ.js → RssFeed-Cu8_P5ll.js} +3 -3
- package/src/assets/web-panel/assets/{Search-Bi3rCZD4.js → Search-rZ1Xza_U.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DxUDVrtY.js → Security-CF43IJHX.js} +4 -4
- package/src/assets/web-panel/assets/{Services-BXXN7yC1.js → Services-BobNHzne.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-B3BR34tZ.js → Skeleton-DWJ2kfuI.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-BjYu8OQ1.js → Skills-AmEZgHYr.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DDkCtD8w.js → Sla-DTS-fBiY.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-CGhYzP7V.js → SpeechSettings-DEr6MHRU.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CYNKVAHA.js → SyncSettings-CVs9alv_.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DavmlJpd.js → Tasks-BcVDAxdi.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-CQuYFf2C.js → Templates-CTNjZRKA.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DdzZh8vE.js → Tenant-DPbXg0Pg.js} +1 -1
- package/src/assets/web-panel/assets/Terminal-DhKXcPw2.js +3 -0
- package/src/assets/web-panel/assets/{TimelineRenderer-DKOARnc_.js → TimelineRenderer-B0DMZOpk.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-D7QRNG8y.js → Tokens-RvWuBXgg.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BCsqLZl4.js → Trigger-2O-BaTQG.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BarGUa6p.js → Trust-6qY35L-C.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-pHrg5a8E.js → UkeySign-DhV1wYtQ.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-Dug3m1py.js → VideoEditing-DgqA5UZm.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BfK3Z_Ez.js → Wallet-DJRYdUAK.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-CYRdl9td.js → WebAuthn-C2W-x0cg.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-DTW5AcqM.js → WorkflowEditor-BP2tkDHe.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CCXz4j38.js → chat-CGVfeoTn.js} +1 -1
- package/src/assets/web-panel/assets/{colors-BJBOhAqa.js → colors-BmjRolM1.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-E9M6BQcM.js → compact-item-BvJJkjZE.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-Cg9CAws4.js → createContext-DyhlvRYs.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-CetO0WH0.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DhVtqv5L.js → hasIn-BoBMR89s.js} +1 -1
- package/src/assets/web-panel/assets/{index--7o5YdL6.js → index-39VDXdn6.js} +1 -1
- package/src/assets/web-panel/assets/{index-CSiyjCYi.js → index-81tWFqfN.js} +1 -1
- package/src/assets/web-panel/assets/{index-CJ8nNT8h.js → index-BT1SQ9nj.js} +1 -1
- package/src/assets/web-panel/assets/index-BZVz-WfV.js +1 -0
- package/src/assets/web-panel/assets/{index-ComyTKz-.js → index-Beh7jDbS.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dwvewrul.js → index-Bm_MmdwP.js} +1 -1
- package/src/assets/web-panel/assets/{index-D5yC2Ps8.js → index-BqGNmoKy.js} +1 -1
- package/src/assets/web-panel/assets/{index-_PNqQ5mE.js → index-BuQrONgf.js} +1 -1
- package/src/assets/web-panel/assets/{index-B8bjEHrQ.js → index-BvvNnWXe.js} +1 -1
- package/src/assets/web-panel/assets/{index-CVR_s-pT.js → index-ByWpNjTj.js} +1 -1
- package/src/assets/web-panel/assets/{index-CFp-wdrQ.js → index-BycpeGfj.js} +1 -1
- package/src/assets/web-panel/assets/{index-wkt-o5q5.js → index-C0xn6hOr.js} +1 -1
- package/src/assets/web-panel/assets/{index-B111fZ21.js → index-C1t-r7yV.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_SMPD4L.js → index-CDPMHKQi.js} +1 -1
- package/src/assets/web-panel/assets/{index-BAB0nGP7.js → index-CIaGw7vl.js} +1 -1
- package/src/assets/web-panel/assets/{index-CFarAlXj.js → index-CQJVedQ3.js} +1 -1
- package/src/assets/web-panel/assets/{index-DSQazU6J.js → index-CSgbOGaP.js} +1 -1
- package/src/assets/web-panel/assets/{index-MdXEhfdJ.js → index-Cbh-lCxq.js} +1 -1
- package/src/assets/web-panel/assets/{index-DaFe1aqY.js → index-CzDVBBcg.js} +1 -1
- package/src/assets/web-panel/assets/{index-ByazO4Q9.js → index-Czsbrn75.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cm1m7BJh.js → index-D-93XwJd.js} +1 -1
- package/src/assets/web-panel/assets/index-D0-bvFy3.js +1 -0
- package/src/assets/web-panel/assets/{index-BxSzyly9.js → index-D0YToIi_.js} +1 -1
- package/src/assets/web-panel/assets/{index-CeRlLp3F.js → index-DIPZ6hbJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkTeBHI9.js → index-DeeLHcMY.js} +1 -1
- package/src/assets/web-panel/assets/{index-kz1oXl1a.js → index-DgbWSwr5.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ca8BYV1g.js → index-DtKdCXHW.js} +1 -1
- package/src/assets/web-panel/assets/{index-ChsSljaN.js → index-DwTgvhOL.js} +1 -1
- package/src/assets/web-panel/assets/{index-DdhnGez0.js → index-DyS4I4L-.js} +1 -1
- package/src/assets/web-panel/assets/{index-CUp_c8Le.js → index-FKFT-QTk.js} +1 -1
- package/src/assets/web-panel/assets/{index-C-2dUIli.js → index-Te0ruvY_.js} +1 -1
- package/src/assets/web-panel/assets/{index-DDcJO27F.js → index-VXVukhBA.js} +1 -1
- package/src/assets/web-panel/assets/{index-CznfPnOx.js → index-Y1b8i0NV.js} +3 -3
- package/src/assets/web-panel/assets/{index-BFZPRd0T.js → index-ZNIms1nA.js} +1 -1
- package/src/assets/web-panel/assets/{index-B4NBF4Sa.js → index-n-N19np-.js} +1 -1
- package/src/assets/web-panel/assets/{index-4N5lNXGP.js → index-vF1pR00A.js} +1 -1
- package/src/assets/web-panel/assets/{index-6-04M2Nx.js → index-wLAjVpmJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-D7DXdf7x.js → index-xPSzUoWT.js} +1 -1
- package/src/assets/web-panel/assets/{index-Di5LBXcE.js → index-xZdOioVg.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-iyBaePF-.js → initDefaultProps-BLKSE8he.js} +1 -1
- package/src/assets/web-panel/assets/{motion-RWtj4rgu.js → motion-Bb59qqLK.js} +1 -1
- package/src/assets/web-panel/assets/{move-CqPRVzpH.js → move-CB3pYCk6.js} +1 -1
- package/src/assets/web-panel/assets/{omit-DsvJze25.js → omit-iImQWuU7.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-B4tfZBhc.js → pickAttrs-DRP2Chqo.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-KvHUwXMA.js → placementArrow-BrlfD4tF.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DGdJ-b7W.js → responsiveObserve-Cqxkuh5H.js} +1 -1
- package/src/assets/web-panel/assets/{slide-Cd6ebRmw.js → slide-nxKEuLMj.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-Bg9GcIAn.js → statusUtils-30E47KSk.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-MQjKsG84.js → styleChecker-Dn2_-5bn.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-C241WujP.js → useFlexGapSupport-DkZ00X6F.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CMpy7RS4.js → useFs-ByrwSCOr.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BLHtapKb.js → usePersonalDataHub-BDY6jtUD.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DmcTV67c.js → vnode-BL2q5BLv.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-DHL8_0Y8.js → zoom-BSkPKE42.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agent.js +31 -0
- package/src/commands/mcp.js +236 -6
- package/src/harness/mcp-client.js +70 -1
- package/src/lib/settings-hooks.cjs +1 -0
- package/src/repl/agent-repl.js +52 -20
- package/src/repl/mcp-prompt.js +122 -0
- package/src/runtime/agent-core.js +123 -17
- package/src/runtime/headless-runner.js +34 -9
- package/src/runtime/mcp-config.js +118 -9
- package/src/assets/web-panel/assets/OrderTableRenderer-BiLtg-LY.js +0 -1
- package/src/assets/web-panel/assets/Terminal-D75WeG9d.js +0 -3
- package/src/assets/web-panel/assets/devWarning-BrsbTJUv.js +0 -1
- package/src/assets/web-panel/assets/index-DSTQDO-Y.js +0 -1
- 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, {
|
|
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: {
|
|
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
|
-
|
|
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(
|
|
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])
|
|
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)
|
|
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(
|
|
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(
|
|
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 {
|
|
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
|
|
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 } =
|
|
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 } =
|
|
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 } =
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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(
|
|
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};
|