chainlesschain 0.162.44 → 0.162.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/src/assets/web-panel/assets/{AIOps-DKzTpK-Y.js → AIOps-QzHleqCS.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CMAlqdwe.js → ActionButton-CZ3F-KVY.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-QMe2cbkc.js → Analytics-CHml-drq.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DWSbQ4Li.js → AppLayout-a-fczvRH.js} +5 -5
- package/src/assets/web-panel/assets/{Audit-B2m5_PZ1.js → Audit-CtMWsXwm.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-CfTZgrj4.js → Backup-ErWTcS0A.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-DQMQQpXM.js → BaseInput-B4w2b2dA.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-XSNjF8Mp.js → Chat-CFPKVfmV.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-BjWwWSBW.js → ChatBubbleRenderer-WGpUTY92.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-DcHFXGYe.js → Checkbox-C4vasfJc.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CbGi3e7e.js → Codegen-DHmDAbSg.js} +1 -1
- package/src/assets/web-panel/assets/{Col-uRz8SHXE.js → Col-LhgveyhM.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CneB2EQd.js → Community-CB8gtudt.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-C9t4kI4u.js → Compact-CTndsUSy.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-BSgNNAgN.js → Compliance-CCpGUHPm.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BOJD_XKQ.js → Cowork-CQmJiOM_.js} +4 -4
- package/src/assets/web-panel/assets/{Cron-DBZVqJWg.js → Cron-TrTmpnSB.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BPBndx_n.js → Crosschain-DvaR1Xq4.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BFeOnAbj.js → DID-CdDdiRs3.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DR_krdui.js → Dashboard-S6gCBQDc.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DBFIX9zX.js → Dropdown-CWO-Kwzl.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-j7nUo0EN.js → EmailListRenderer-Crnrr1-p.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-BNrIZkRp.js → FamilyGuardDashboard-OpG9ZtfR.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-D1cPCDKh.js → Federation-B0sybW7G.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-C24JXiJZ.js → FormItemContext-DjHMvxwJ.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-g-EsfuMZ.js → GenericCardRenderer-DtU5cWwE.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BVEJZ29p.js → Git-BhOjZX2a.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-B-fAe2v1.js → Governance-D3_hjjA-.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-DBYa0ztr.js → Inference-DwxLXmgA.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-B0S0at2T.js → KnowledgeGraph-C8-FVs02.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BUHn58RG.js → Logs-CrHjnzfr.js} +2 -2
- package/src/assets/web-panel/assets/{Marketplace-DSYpWtgR.js → Marketplace-KW1Am18o.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-Cm_GD-uS.js → McpTools-ezYH1J8m.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-CB9uRtzi.js → Memory-Dcv8Gume.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-vgX_FQ74.js → MobileBridge-v18J0LN4.js} +2 -2
- package/src/assets/web-panel/assets/{MobileProjects-DCMhJceG.js → MobileProjects-kk6hAwkK.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-Atr0Zh0n.js → Mtc-Cm35-vh_.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-DxQjtoAG.js → MtcAudit-DyeKAlI_.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-DBc1IRY-.js → Multisig-Dy-imleB.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-C55Qg6EX.js → NLProgramming-DMVmWNAH.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CVRXn9dM.js → Notes-Dq6oHKbl.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-B8_Y2rYz.js → NotificationSettings-CCaSupDi.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-DOwptdNb.js +1 -0
- package/src/assets/web-panel/assets/{Organization-fmONrEpS.js → Organization-8TF96XtV.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-DtS9U-lj.js → Overflow-BnYnh84b.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BCp9IFsu.js → P2P-CZk3Qkec.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-FB03lQ_0.js → PdhVaultBrowser-D1HrzBx2.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-BD3VCCBY.js → Permissions-CwJ6hcaI.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-I_dIzQfI.js → PersonalDataHub-BGnPTj1G.js} +2 -2
- package/src/assets/web-panel/assets/{Pipeline-BfqiuVgI.js → Pipeline-BzXhXLBz.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-Dnm-Lxv0.js → Privacy-BaVQ3GwL.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-D12saZXQ.js → ProjectInit-Bik3h4R7.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-BHk78dtG.js → ProjectSettings-CIuC6Hpr.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-BQgMcz56.js → Projects-DLjnWEe6.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-Bs7dxjKE.js → Providers-mhxZrHiK.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CqhoJCPD.js → QuickAsk-Dk9mayL0.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-D-l-eJFr.js → Recommend-BHC2sBZY.js} +1 -1
- package/src/assets/web-panel/assets/{Reputation-CPrlP2Ux.js → Reputation-DV26B11J.js} +1 -1
- package/src/assets/web-panel/assets/{Row-C3Q9Dshq.js → Row-bJlVEnFC.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-DlLlpbtD.js → RssFeed-D_XucmWY.js} +2 -2
- package/src/assets/web-panel/assets/{Search-EIs5mUs2.js → Search-uKXcm_Kf.js} +1 -1
- package/src/assets/web-panel/assets/{Security-NJbvreOk.js → Security-DEzqsQLn.js} +3 -3
- package/src/assets/web-panel/assets/{Services-B-GS4dFT.js → Services-I8qKgcom.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-Bycye0oO.js → Skeleton-BmrglBMu.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-D9gOTB8D.js → Skills-CHN4ZDyP.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-hR2sLl6u.js → Sla-Ca6FsUS2.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-xNkqwlx_.js → SpeechSettings-CP8IikWb.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-C53VuHwk.js → SyncSettings-Bqp-kPAA.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-XIDFrKjD.js → Tasks-C7FvJjze.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-JA8aUZm3.js → Templates-Bq51Irli.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DjGO2SFi.js → Tenant-OTducEVg.js} +1 -1
- package/src/assets/web-panel/assets/Terminal-ywwPryM5.js +3 -0
- package/src/assets/web-panel/assets/{TimelineRenderer-Cfalxtc_.js → TimelineRenderer-kCmFL2wc.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-lvG8zW-n.js → Tokens-BUfD650M.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-G3EmMFkS.js → Trigger-CqpM6xE7.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BDXSbpLN.js → Trust--4gS7a0j.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-9GtCtwS7.js → UkeySign-B7wfki-b.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-DorUOflW.js → VideoEditing-FwDEX2S-.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-B1PSsoH7.js → Wallet-DS_c2rMk.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-BlawNPwk.js → WebAuthn-CdMhP-GP.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-DT5tXYHC.js → WorkflowEditor-DVvpoOmg.js} +1 -1
- package/src/assets/web-panel/assets/{chat-Db1ggy-d.js → chat-BQyTT2BS.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DvKRY65P.js → colors-DvylfUTx.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-ChJE-s12.js → compact-item-Budvh2nW.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-C_n8N7R0.js → createContext-DkNa84zG.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-CG_75MBJ.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-f5qrOyO8.js → hasIn-Dc1juUIf.js} +1 -1
- package/src/assets/web-panel/assets/{index-6-pawsDV.js → index-B0u5DW4Z.js} +1 -1
- package/src/assets/web-panel/assets/{index-C99Tx6W3.js → index-BC08UMEf.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cwx25An4.js → index-BCD2L2SI.js} +1 -1
- package/src/assets/web-panel/assets/{index-DBDuh9Q_.js → index-BCv_FUY5.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_Db3y-q.js → index-BEviVulf.js} +1 -1
- package/src/assets/web-panel/assets/{index-CZM-f_GP.js → index-BQJA__yH.js} +1 -1
- package/src/assets/web-panel/assets/{index-BlXvSz68.js → index-BTnZ44a_.js} +1 -1
- package/src/assets/web-panel/assets/{index-BRPjpA9x.js → index-BTzrvuB0.js} +1 -1
- package/src/assets/web-panel/assets/{index-cNZUziLU.js → index-BWcGURYh.js} +1 -1
- package/src/assets/web-panel/assets/{index-CgVhpbwl.js → index-BYuozZuh.js} +1 -1
- package/src/assets/web-panel/assets/index-Ba6DLEa1.js +1 -0
- package/src/assets/web-panel/assets/{index-DNcqoZEW.js → index-BgYKjtNP.js} +1 -1
- package/src/assets/web-panel/assets/{index-MW_Zh_HW.js → index-BgxdM7b_.js} +1 -1
- package/src/assets/web-panel/assets/{index-CBtvIJ1P.js → index-Bk_Uhu49.js} +1 -1
- package/src/assets/web-panel/assets/{index-DVWPEAS_.js → index-By8Bs_eN.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkSc1UD0.js → index-C1X5QpSy.js} +1 -1
- package/src/assets/web-panel/assets/{index-ru1UNElJ.js → index-C8he-Xo0.js} +1 -1
- package/src/assets/web-panel/assets/{index-CRpYACac.js → index-CFMS9PKh.js} +1 -1
- package/src/assets/web-panel/assets/{index-D2vRDPxa.js → index-CGHLsKyb.js} +1 -1
- package/src/assets/web-panel/assets/{index-D_ca6G9G.js → index-CKoWcis9.js} +1 -1
- package/src/assets/web-panel/assets/index-CLycnSs-.js +1 -0
- package/src/assets/web-panel/assets/{index-B889nFIK.js → index-CbCIBifY.js} +1 -1
- package/src/assets/web-panel/assets/{index-dbd8KVOi.js → index-Cz41iB_M.js} +1 -1
- package/src/assets/web-panel/assets/{index-ZIg1Yi8T.js → index-D2dcbmzD.js} +1 -1
- package/src/assets/web-panel/assets/{index-DLJldKpu.js → index-D74oTZL7.js} +1 -1
- package/src/assets/web-panel/assets/{index-bYgSwFp_.js → index-D7FYxxFT.js} +3 -3
- package/src/assets/web-panel/assets/{index-CnBPm5VW.js → index-DMCqz0wy.js} +1 -1
- package/src/assets/web-panel/assets/{index-LADrnz2q.js → index-DO9Lvv1w.js} +1 -1
- package/src/assets/web-panel/assets/{index-DDwTm4HW.js → index-DRNJnXik.js} +1 -1
- package/src/assets/web-panel/assets/{index-aRdl6HAc.js → index-DTcZkWJ7.js} +1 -1
- package/src/assets/web-panel/assets/{index-xytEYrmf.js → index-D_0nyIY9.js} +1 -1
- package/src/assets/web-panel/assets/{index-BmDr3_dh.js → index-DecFF9je.js} +1 -1
- package/src/assets/web-panel/assets/{index-zDFZeRny.js → index-DwJ0d_2Z.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bv3rnRcv.js → index-DxCPTrC-.js} +1 -1
- package/src/assets/web-panel/assets/{index-gEBZrC4a.js → index-TsPv8m1Z.js} +1 -1
- package/src/assets/web-panel/assets/{index-BzfpAd-L.js → index-YVdWdhK_.js} +1 -1
- package/src/assets/web-panel/assets/{index-BGcNc2FC.js → index-eD_MN29w.js} +1 -1
- package/src/assets/web-panel/assets/{index-DSn8UWj1.js → index-jTGSFnNF.js} +1 -1
- package/src/assets/web-panel/assets/{index-BLbUSjRl.js → index-yx5Y6xb7.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-BmuULb3C.js → initDefaultProps-gLjyJG0Q.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BPAdGPV0.js → motion-BtXv1r2p.js} +1 -1
- package/src/assets/web-panel/assets/{move-CfQuWRIA.js → move-BgFqW2gA.js} +1 -1
- package/src/assets/web-panel/assets/{omit-B4X1FaKf.js → omit-CeIwl-eJ.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CnNXE2Fs.js → pickAttrs-VlY4igbs.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-Bb5asP1f.js → placementArrow-B9Wjn3oR.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-CFYMBsLT.js → responsiveObserve-BBgHTvYX.js} +1 -1
- package/src/assets/web-panel/assets/{slide-Pf9K-RqE.js → slide-DWw81KAi.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DmGXqpMA.js → statusUtils-Bsho38w-.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-3ymOCpPp.js → styleChecker-BNvVEdm1.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-CiCbo3Hx.js → useFlexGapSupport-DG9bkwrT.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BbhWqkvH.js → useFs-DU7qrIrQ.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BNjAwFwx.js → usePersonalDataHub-DX-Bf7VJ.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-Dsmjnl6v.js → vnode-B1UcnNoK.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-Dx0p7V8W.js → zoom-BFgJuvLv.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agent.js +49 -30
- package/src/commands/hub.js +87 -0
- package/src/harness/mcp-client.js +86 -1
- package/src/lib/auto-checkpoint-default.js +49 -0
- package/src/lib/personal-data-hub-wiring.js +44 -2
- package/src/lib/repl-completer.js +6 -3
- package/src/lib/skill-loader.js +43 -7
- package/src/repl/agent-repl.js +27 -1
- package/src/runtime/headless-stream.js +77 -1
- package/src/runtime/mcp-config.js +19 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-BvbjrcIW.js +0 -1
- package/src/assets/web-panel/assets/Terminal-D_8L6tYA.js +0 -3
- package/src/assets/web-panel/assets/devWarning-8RHlZueh.js +0 -1
- package/src/assets/web-panel/assets/index-DiVQYFZe.js +0 -1
- package/src/assets/web-panel/assets/index-QQHpE5N6.js +0 -1
package/src/lib/skill-loader.js
CHANGED
|
@@ -1,24 +1,40 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Multi-layer skill loader for CLI
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* 0 (lowest) bundled
|
|
6
|
-
* 1 marketplace
|
|
7
|
-
* 2 managed
|
|
8
|
-
* 3
|
|
4
|
+
* 6-layer priority system (highest wins on name collision):
|
|
5
|
+
* 0 (lowest) bundled — desktop-app-vue/.../skills/builtin/
|
|
6
|
+
* 1 marketplace — <userData>/marketplace/skills/
|
|
7
|
+
* 2 managed — <userData>/skills/
|
|
8
|
+
* 3 claude-user — ~/.claude/skills/ (Claude-Code 可移植)
|
|
9
|
+
* 4 claude-project — <projectRoot>/.claude/skills/ (Claude-Code 可移植)
|
|
10
|
+
* 5 (highest) workspace — <projectRoot>/.chainlesschain/skills/
|
|
11
|
+
*
|
|
12
|
+
* The two `claude-*` layers are Claude-Code portability (its 2.1.157
|
|
13
|
+
* ".claude/skills auto-load" behavior): a repo carrying Claude-Code skills
|
|
14
|
+
* works in cc unchanged — same SKILL.md format — while native
|
|
15
|
+
* `.chainlesschain/skills` still wins on name collisions.
|
|
9
16
|
*/
|
|
10
17
|
|
|
11
18
|
import fs from "fs";
|
|
19
|
+
import os from "os";
|
|
12
20
|
import path from "path";
|
|
13
21
|
import { fileURLToPath } from "url";
|
|
14
22
|
import { getElectronUserDataDir } from "./paths.js";
|
|
15
23
|
import { findProjectRoot } from "./project-detector.js";
|
|
24
|
+
import { findProjectRoot as findGitRoot } from "./project-instructions.js";
|
|
16
25
|
import { parseSkillMcpServers } from "./skill-mcp.js";
|
|
17
26
|
|
|
18
27
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
19
28
|
|
|
20
29
|
/** Layer names in priority order (lowest → highest) */
|
|
21
|
-
export const LAYER_NAMES = [
|
|
30
|
+
export const LAYER_NAMES = [
|
|
31
|
+
"bundled",
|
|
32
|
+
"marketplace",
|
|
33
|
+
"managed",
|
|
34
|
+
"claude-user",
|
|
35
|
+
"claude-project",
|
|
36
|
+
"workspace",
|
|
37
|
+
];
|
|
22
38
|
|
|
23
39
|
/**
|
|
24
40
|
* Simple YAML frontmatter parser (no dependencies)
|
|
@@ -230,7 +246,27 @@ export class CLISkillLoader {
|
|
|
230
246
|
exists: fs.existsSync(managedPath),
|
|
231
247
|
});
|
|
232
248
|
|
|
233
|
-
//
|
|
249
|
+
// Layers 3+4: Claude-Code portability — ~/.claude/skills + <root>/.claude/skills
|
|
250
|
+
const home = os.homedir() || "";
|
|
251
|
+
const claudeUserPath = home ? path.join(home, ".claude", "skills") : null;
|
|
252
|
+
layers.push({
|
|
253
|
+
layer: "claude-user",
|
|
254
|
+
path: claudeUserPath,
|
|
255
|
+
exists: Boolean(claudeUserPath && fs.existsSync(claudeUserPath)),
|
|
256
|
+
});
|
|
257
|
+
// Project base: .chainlesschain marker first, git root as fallback so a
|
|
258
|
+
// pure Claude-Code repo (no .chainlesschain/) still gets its skills.
|
|
259
|
+
const claudeBase = findProjectRoot() || findGitRoot(process.cwd());
|
|
260
|
+
const claudeProjectPath = claudeBase
|
|
261
|
+
? path.join(claudeBase, ".claude", "skills")
|
|
262
|
+
: null;
|
|
263
|
+
layers.push({
|
|
264
|
+
layer: "claude-project",
|
|
265
|
+
path: claudeProjectPath,
|
|
266
|
+
exists: Boolean(claudeProjectPath && fs.existsSync(claudeProjectPath)),
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
// Layer 5 (highest): workspace — <projectRoot>/.chainlesschain/skills/
|
|
234
270
|
const projectRoot = findProjectRoot();
|
|
235
271
|
if (projectRoot) {
|
|
236
272
|
const workspacePath = path.join(projectRoot, ".chainlesschain", "skills");
|
package/src/repl/agent-repl.js
CHANGED
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
import readline from "readline";
|
|
21
21
|
import chalk from "chalk";
|
|
22
22
|
import fs from "fs";
|
|
23
|
+
import os from "os";
|
|
23
24
|
import path from "path";
|
|
24
25
|
import { logger } from "../lib/logger.js";
|
|
25
26
|
import { getPlanModeManager, PlanState } from "../lib/plan-mode.js";
|
|
@@ -748,10 +749,12 @@ export async function startAgentRepl(options = {}) {
|
|
|
748
749
|
// (when the IDE bridge is connected) the editor's open tabs ranked first.
|
|
749
750
|
const { makeAtCompleter } = await import("../lib/repl-completer.js");
|
|
750
751
|
const atCompleter = makeAtCompleter({
|
|
751
|
-
cwd: process.cwd()
|
|
752
|
+
// cwd left unset on purpose: the completer resolves process.cwd() lazily
|
|
753
|
+
// so it follows `/cd` mid-session.
|
|
752
754
|
// Keep in sync with the rl.on("line") handlers + /help below.
|
|
753
755
|
slashCommands: [
|
|
754
756
|
"/auto",
|
|
757
|
+
"/cd",
|
|
755
758
|
"/clear",
|
|
756
759
|
"/compact",
|
|
757
760
|
"/context",
|
|
@@ -1012,6 +1015,9 @@ export async function startAgentRepl(options = {}) {
|
|
|
1012
1015
|
logger.log(
|
|
1013
1016
|
` ${chalk.cyan("/rewind")} Rewind conversation to an earlier turn (double-Esc lists)`,
|
|
1014
1017
|
);
|
|
1018
|
+
logger.log(
|
|
1019
|
+
` ${chalk.cyan("/cd <dir>")} Change working directory mid-session (completion/memory follow)`,
|
|
1020
|
+
);
|
|
1015
1021
|
logger.log(
|
|
1016
1022
|
` ${chalk.cyan("/compact")} Smart compact (importance-based)`,
|
|
1017
1023
|
);
|
|
@@ -1250,6 +1256,26 @@ export async function startAgentRepl(options = {}) {
|
|
|
1250
1256
|
return;
|
|
1251
1257
|
}
|
|
1252
1258
|
|
|
1259
|
+
// `/cd` (Claude-Code 2.1.163 parity): relocate the session's working
|
|
1260
|
+
// directory mid-conversation. Everything that reads process.cwd() per
|
|
1261
|
+
// call follows automatically (agent cwd, @-completion, project memory).
|
|
1262
|
+
if (trimmed === "/cd" || trimmed.startsWith("/cd ")) {
|
|
1263
|
+
const target = trimmed.slice(3).trim();
|
|
1264
|
+
if (!target) {
|
|
1265
|
+
logger.info(`cwd: ${process.cwd()}`);
|
|
1266
|
+
} else {
|
|
1267
|
+
try {
|
|
1268
|
+
const expanded = target.replace(/^~(?=$|[\\/])/, os.homedir());
|
|
1269
|
+
process.chdir(path.resolve(process.cwd(), expanded));
|
|
1270
|
+
logger.log(chalk.green(`cwd → ${process.cwd()}`));
|
|
1271
|
+
} catch (err) {
|
|
1272
|
+
logger.error(`/cd failed: ${err.message}`);
|
|
1273
|
+
}
|
|
1274
|
+
}
|
|
1275
|
+
prompt();
|
|
1276
|
+
return;
|
|
1277
|
+
}
|
|
1278
|
+
|
|
1253
1279
|
if (trimmed === "/rewind" || trimmed.startsWith("/rewind ")) {
|
|
1254
1280
|
try {
|
|
1255
1281
|
const { listUserTurns, rewindToTurn, renderTurnList } = await import(
|
|
@@ -89,6 +89,12 @@ export function parseInputEvent(line) {
|
|
|
89
89
|
if (obj && typeof obj === "object" && obj.type === "interrupt") {
|
|
90
90
|
return { interrupt: true };
|
|
91
91
|
}
|
|
92
|
+
// Approval verdicts (panel Approve/Deny for --interactive-approvals):
|
|
93
|
+
// {"type":"approval","id":"appr-1","approve":true|false}
|
|
94
|
+
if (obj && typeof obj === "object" && obj.type === "approval") {
|
|
95
|
+
if (!obj.id) return null;
|
|
96
|
+
return { approval: { id: String(obj.id), approve: obj.approve === true } };
|
|
97
|
+
}
|
|
92
98
|
const msg = obj && typeof obj === "object" ? obj.message || obj : {};
|
|
93
99
|
let content = msg.content ?? obj.text ?? obj.prompt;
|
|
94
100
|
if (Array.isArray(content)) {
|
|
@@ -272,12 +278,64 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
272
278
|
};
|
|
273
279
|
const persist = Boolean(options.sessionId);
|
|
274
280
|
|
|
281
|
+
// ── Interactive approvals (--interactive-approvals; chat-panel UX) ────────
|
|
282
|
+
// CONFIRM-tier decisions (risky shell via the ApprovalGate, settings/hook
|
|
283
|
+
// `ask`) normally fail closed in headless. With this opt-in they become a
|
|
284
|
+
// structured round-trip instead: emit `approval_request`, BLOCK the tool
|
|
285
|
+
// until a {"type":"approval",id,approve} arrives on stdin (handled by the
|
|
286
|
+
// concurrent pump below, so the wait never deadlocks), fail closed on
|
|
287
|
+
// timeout (CC_APPROVAL_TIMEOUT_MS, default 120s) or stdin close. The
|
|
288
|
+
// resolution is echoed as `approval_resolved` so UIs can settle their cards.
|
|
289
|
+
const interactive = options.interactiveApprovals === true;
|
|
290
|
+
const pendingApprovals = new Map();
|
|
291
|
+
let approvalSeq = 0;
|
|
292
|
+
const approvalTimeoutMs =
|
|
293
|
+
Number(process.env.CC_APPROVAL_TIMEOUT_MS) > 0
|
|
294
|
+
? Number(process.env.CC_APPROVAL_TIMEOUT_MS)
|
|
295
|
+
: 120000;
|
|
296
|
+
const settleApproval = (id, approve, via) => {
|
|
297
|
+
const p = pendingApprovals.get(id);
|
|
298
|
+
if (!p) return;
|
|
299
|
+
pendingApprovals.delete(id);
|
|
300
|
+
clearTimeout(p.timer);
|
|
301
|
+
emit({
|
|
302
|
+
type: "approval_resolved",
|
|
303
|
+
id,
|
|
304
|
+
approved: approve === true,
|
|
305
|
+
via,
|
|
306
|
+
session_id: sessionId,
|
|
307
|
+
});
|
|
308
|
+
p.resolve(approve === true);
|
|
309
|
+
};
|
|
310
|
+
const interactiveConfirm = (ctx = {}) =>
|
|
311
|
+
new Promise((resolve) => {
|
|
312
|
+
const id = `appr-${++approvalSeq}`;
|
|
313
|
+
const timer = setTimeout(
|
|
314
|
+
() => settleApproval(id, false, "timeout"),
|
|
315
|
+
approvalTimeoutMs,
|
|
316
|
+
);
|
|
317
|
+
timer.unref?.();
|
|
318
|
+
pendingApprovals.set(id, { resolve, timer });
|
|
319
|
+
emit({
|
|
320
|
+
type: "approval_request",
|
|
321
|
+
id,
|
|
322
|
+
session_id: sessionId,
|
|
323
|
+
tool: ctx.tool || ctx.toolName || null,
|
|
324
|
+
command: ctx.command || ctx.args?.command || null,
|
|
325
|
+
risk: ctx.riskLevel || ctx.risk || null,
|
|
326
|
+
rule: ctx.rule || null,
|
|
327
|
+
reason: ctx.reason || null,
|
|
328
|
+
});
|
|
329
|
+
});
|
|
330
|
+
|
|
275
331
|
let approvalGate = null;
|
|
276
332
|
try {
|
|
277
333
|
approvalGate = await getApprovalGate();
|
|
278
334
|
if (approvalGate) {
|
|
279
335
|
approvalGate.setSessionPolicy?.(sessionId, perm.sessionPolicy);
|
|
280
|
-
approvalGate.setConfirmer?.(
|
|
336
|
+
approvalGate.setConfirmer?.(
|
|
337
|
+
interactive ? interactiveConfirm : perm.confirmer,
|
|
338
|
+
);
|
|
281
339
|
}
|
|
282
340
|
} catch {
|
|
283
341
|
approvalGate = null;
|
|
@@ -453,6 +511,10 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
453
511
|
settingsHooks,
|
|
454
512
|
enabledToolNames,
|
|
455
513
|
disabledTools,
|
|
514
|
+
// --interactive-approvals: settings/hook `ask` (and, with an IDE bridge,
|
|
515
|
+
// edit reviews via openDiff) route to the structured approval round-trip
|
|
516
|
+
// instead of failing closed. Absent in CI/pipes → unchanged fail-closed.
|
|
517
|
+
permissionConfirm: interactive ? interactiveConfirm : undefined,
|
|
456
518
|
prepareCall: goalPrepareCallFn,
|
|
457
519
|
// --mcp-config wiring (tool defs + dispatch map + live client).
|
|
458
520
|
mcpClient: mcp?.mcpClient || null,
|
|
@@ -498,6 +560,15 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
498
560
|
currentAbort?.abort();
|
|
499
561
|
continue;
|
|
500
562
|
}
|
|
563
|
+
if (parsed.approval) {
|
|
564
|
+
// Approval verdicts settle a BLOCKED tool — never queued.
|
|
565
|
+
settleApproval(
|
|
566
|
+
parsed.approval.id,
|
|
567
|
+
parsed.approval.approve,
|
|
568
|
+
parsed.approval.approve ? "user-approve" : "user-deny",
|
|
569
|
+
);
|
|
570
|
+
continue;
|
|
571
|
+
}
|
|
501
572
|
queue.push(parsed);
|
|
502
573
|
if (wakeQueue) wakeQueue();
|
|
503
574
|
}
|
|
@@ -505,6 +576,11 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
505
576
|
/* input stream error → treat as EOF */
|
|
506
577
|
}
|
|
507
578
|
inputDone = true;
|
|
579
|
+
// stdin closed while approvals were pending → fail closed so the blocked
|
|
580
|
+
// turn can finish and the process can exit.
|
|
581
|
+
for (const id of [...pendingApprovals.keys()]) {
|
|
582
|
+
settleApproval(id, false, "stdin-closed");
|
|
583
|
+
}
|
|
508
584
|
if (wakeQueue) wakeQueue();
|
|
509
585
|
})();
|
|
510
586
|
const nextEvent = async () => {
|
|
@@ -347,7 +347,25 @@ export async function loadIdeMcp(opts = {}, deps = {}) {
|
|
|
347
347
|
}
|
|
348
348
|
const cfg = toCfg(lock);
|
|
349
349
|
if (!cfg) return deps.into || null;
|
|
350
|
-
|
|
350
|
+
const out = await setupMcpFromConfig({ ide: cfg }, deps);
|
|
351
|
+
// Hot reconnect: a window reload / extension update restarts the editor's
|
|
352
|
+
// MCP server on a NEW port with a NEW token. Register a reconnector so a
|
|
353
|
+
// failed mcp__ide__* call re-scans the lockfiles mid-session and retries,
|
|
354
|
+
// instead of the IDE tools (and selection/diagnostics injection) silently
|
|
355
|
+
// dying for the rest of the run. Note the stale CHAINLESSCHAIN_IDE_PORT in
|
|
356
|
+
// our env no longer matches any live lock, so discovery falls through to
|
|
357
|
+
// the workspace scan — exactly the path that finds the restarted instance.
|
|
358
|
+
if (out?.mcpClient?.setReconnector) {
|
|
359
|
+
out.mcpClient.setReconnector("ide", () => {
|
|
360
|
+
const fresh = discover({
|
|
361
|
+
cwd: opts.cwd,
|
|
362
|
+
env: opts.env,
|
|
363
|
+
force: opts.force === true,
|
|
364
|
+
});
|
|
365
|
+
return fresh ? toCfg(fresh) : null;
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
return out;
|
|
351
369
|
}
|
|
352
370
|
|
|
353
371
|
/**
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as w,P as d,J as u,U as s,R as n,c as i,K as v,Q as _,V as g,b as a}from"./vendor-BvqAck49.js";import{_ as S}from"./index-bYgSwFp_.js";import"./icons-DP3uiYxy.js";const k={__name:"OrderTableRenderer",props:{event:{type:Object,required:!0}},setup(p,{expose:r}){r();const o=p,e=a(()=>o.event.content||{}),l=a(()=>o.event.extra||{}),m=a(()=>l.value.merchant||e.value.merchant||e.value.counterparty||"—"),c=a(()=>e.value.title||e.value.name||e.value.itemName||e.value.text||"—"),y=a(()=>{const t=e.value.amount??e.value.price??e.value.total;return t==null?"—":`${e.value.currency||"¥"} ${typeof t=="number"?t.toFixed(2):t}`}),T=a(()=>l.value.orderNo||e.value.orderNo||e.value.orderId),f=a(()=>e.value.status||e.value.state),b=a(()=>{const t=(f.value||"").toLowerCase();return t.includes("成功")||t.includes("succe")||t.includes("paid")?"green":t.includes("退")||t.includes("refund")?"orange":t.includes("失败")||t.includes("fail")?"red":"default"}),h=a(()=>{if(!o.event.occurredAt)return"";const t=new Date(o.event.occurredAt);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}),x={props:o,c:e,e:l,merchantText:m,itemText:c,amountText:y,orderNo:T,statusText:f,statusColor:b,formattedTime:h,computed:a};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}},N={class:"order-card"},C={class:"head"},V={class:"time"},O={class:"row"},R={class:"val"},B={class:"row"},D={class:"val"},I={class:"row amount-row"},j={class:"val amount"},A={key:0,class:"row"},F={class:"val mono"},M={key:1,class:"row"};function P(p,r,o,e,l,m){const c=w("a-tag");return d(),u("div",N,[s("div",C,[s("span",V,n(e.formattedTime),1),i(c,{color:"gold"},{default:v(()=>[_(n(o.event.source.adapter),1)]),_:1}),i(c,null,{default:v(()=>[_(n(o.event.subtype),1)]),_:1})]),s("div",O,[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",I,[r[2]||(r[2]=s("span",{class:"key"},"金额",-1)),s("span",j,n(e.amountText),1)]),e.orderNo?(d(),u("div",A,[r[3]||(r[3]=s("span",{class:"key"},"单号",-1)),s("span",F,n(e.orderNo),1)])):g("v-if",!0),e.statusText?(d(),u("div",M,[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 K=S(k,[["render",P],["__scopeId","data-v-5ed5524d"],["__file","/tmp/cc-web-panel-u83l7V/repo/packages/web-panel/src/components/pdh/renderers/OrderTableRenderer.vue"]]);export{K 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-bYgSwFp_.js";import{I as z,J as x,U as _,Q as D,S as Q,K as T,V as R,c as A,F as Y,Z,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,N=new Set,F=new Set;let te=!1;function xe(c){te||(te=!0,c.onMessage(o=>{if(!(!o||typeof o.type!="string")){if(o.type==="terminal.stdout"){const{sessionId:s,data:e,seq:i}=o.payload||{};if(!s)return;let w;try{const d=atob(e||""),f=new Uint8Array(d.length);for(let n=0;n<d.length;n++)f[n]=d.charCodeAt(n);w=new TextDecoder("utf-8").decode(f)}catch{w=""}const u={sessionId:s,data:w,seq:i};k.get(s)?.forEach(d=>d(u)),N.forEach(d=>d(u))}else if(o.type==="terminal.exit"){const{sessionId:s,exitCode:e,signal:i}=o.payload||{};if(!s)return;const w={sessionId:s,exitCode:e,signal:i};C.get(s)?.forEach(u=>u(w)),F.forEach(u=>u(w))}}}))}function ne(c){const o=new TextEncoder().encode(c);let s="";for(let e=0;e<o.length;e++)s+=String.fromCharCode(o[e]);return btoa(s)}function ae(c){const o=atob(c||""),s=new Uint8Array(o.length);for(let e=0;e<o.length;e++)s[e]=o.charCodeAt(e);return new TextDecoder("utf-8").decode(s)}function oe(){const c=fe();xe(c);async function o(n={}){const a=await c.sendRaw({type:"terminal.create",payload:{shell:n.shell,cwd:n.cwd,env:n.env,cols:n.cols,rows:n.rows}});if(a.ok===!1)throw new Error(a.error||"terminal_create_failed");return a.result??a}async function s(){const n=await c.sendRaw({type:"terminal.list",payload:{}});if(n.ok===!1)throw new Error(n.error||"terminal_list_failed");const a=n.result??n;return Array.isArray(a.sessions)?a.sessions:[]}async function e(n,a){const r=await c.sendRaw({type:"terminal.stdin",payload:{sessionId:n,data:ne(String(a))}});if(r.ok===!1)throw new Error(r.error||"terminal_stdin_failed");return r.result??r}async function i(n,a,r){const h=await c.sendRaw({type:"terminal.resize",payload:{sessionId:n,cols:a,rows:r}});if(h.ok===!1)throw new Error(h.error||"terminal_resize_failed");return h.result??h}async function w(n){const a=await c.sendRaw({type:"terminal.close",payload:{sessionId:n}});if(a.ok===!1)throw new Error(a.error||"terminal_close_failed");return a.result??a}async function u(n,a=0){const r=await c.sendRaw({type:"terminal.history",payload:{sessionId:n,fromSeq:a}});if(r.ok===!1)throw new Error(r.error||"terminal_history_failed");const h=r.result??r;return{truncated:!!h.truncated,chunks:(h.chunks||[]).map(L=>({seq:L.seq,data:ae(L.data)}))}}function d(n,a){return n?(k.has(n)||k.set(n,new Set),k.get(n).add(a),()=>{k.get(n)?.delete(a),k.get(n)?.size===0&&k.delete(n)}):(N.add(a),()=>N.delete(a))}function f(n,a){return n?(C.has(n)||C.set(n,new Set),C.get(n).add(a),()=>{C.get(n)?.delete(a),C.get(n)?.size===0&&C.delete(n)}):(F.add(a),()=>F.delete(a))}return{create:o,list:s,stdin:e,resize:i,close:w,history:u,onStdout:d,onExit:f,_internal:{stdoutSubs:k,exitSubs:C,toBase64Utf8:ne,fromBase64Utf8:ae}}}const Se={__name:"Terminal",setup(c,{expose:o}){o();const s=oe(),e=S([]),i=S(null),w=S("pwsh"),u=S(!1),d=S(!1),f=S(""),n=S(""),a=S([]),r=[{value:"pwsh",label:"PowerShell"},{value:"cmd",label:"CMD"},{value:"bash",label:"Bash"},{value:"wsl",label:"WSL"}],h=ee(()=>e.value.find(t=>t.id===i.value));function L(t){return t?t.slice(0,8):""}let O=null,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 K of v)m.write(K.data),t.lastSeq=K.seq}catch(v){m.writeln(`\x1B[31m[history fetch failed: ${v?.message||v}]\x1B[0m`)}const J=new ResizeObserver(()=>{try{P.fit(),s.resize(t.id,m.cols,m.rows).catch(()=>{})}catch{}});J.observe(b);const ue=t.offs;t.offs=()=>{try{J.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 X(){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 X()}),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 j={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:X,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(j,"__isScriptSetup",{enumerable:!1,value:!0}),j}},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(),Q(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(),Q(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(Y,null,Z(e.sessions,r=>(y(),x("div",{key:r.id,class:ve(["session-tab",{active:r.id===e.activeId,dead:!r.alive}]),onClick:h=>e.activate(r.id)},[_("span",Te,E(r.shell),1),_("span",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(Y,null,Z(e.sessions,r=>he((y(),x("div",{key:r.id,ref_for:!0,ref:"xtermContainers","data-session-id":r.id,class:"xterm-container"},null,8,Le)),[[_e,r.id===e.activeId]])),128)),e.sessions.length===0?(y(),x("div",Pe,[...o[6]||(o[6]=[_("span",null,"无活跃会话",-1)])])):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 Fe=me(Se,[["render",Be],["__scopeId","data-v-65366a29"],["__file","/tmp/cc-web-panel-u83l7V/repo/packages/web-panel/src/views/Terminal.vue"]]);export{Fe as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{O as r}from"./index-bYgSwFp_.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as o}from"./Row-C3Q9Dshq.js";import{U as t}from"./index-bYgSwFp_.js";import"./vendor-BvqAck49.js";import"./responsiveObserve-CFYMBsLT.js";import"./useFlexGapSupport-CiCbo3Hx.js";import"./styleChecker-3ymOCpPp.js";import"./index-cNZUziLU.js";import"./icons-DP3uiYxy.js";const l=t(o);export{l as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as o}from"./Col-uRz8SHXE.js";import{U as t}from"./index-bYgSwFp_.js";import"./vendor-BvqAck49.js";import"./index-cNZUziLU.js";import"./icons-DP3uiYxy.js";const s=t(o);export{s as default};
|