chainlesschain 0.162.41 → 0.162.43
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 +1 -1
- package/src/assets/web-panel/assets/{AIOps-Ut7EevnG.js → AIOps-B0VFIcg3.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-Dv6BlfJg.js → ActionButton-V20enLcA.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-TQVQuJ7u.js → Analytics-DndClUmA.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-MSqLm2WK.js → AppLayout-D2rOhyu6.js} +5 -5
- package/src/assets/web-panel/assets/{Audit-mw81HwVy.js → Audit-DqfIKxsM.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BQcPWDb1.js → Backup-Cuqlers6.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BYo_pwBH.js → BaseInput-C5hGNJ5N.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-zi3YUKx2.js → Chat-jbQSEg4t.js} +6 -6
- package/src/assets/web-panel/assets/ChatBubbleRenderer-43u4DJn6.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-BvC8Erjt.js → Checkbox-DbUBGgg0.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-C32vx0OP.js → Codegen-B99Mk_oQ.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DMBwmqyZ.js → Col-Uxc3P9FF.js} +1 -1
- package/src/assets/web-panel/assets/{Community-nDWncmKV.js → Community-CCCVsol2.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-lIc1HFn8.js → Compact-DpVZkM4n.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-D14I_gd2.js → Compliance-CZic_otw.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BiNI-_ZL.js → Cowork-mfrcXT5E.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-N13sFzHb.js → Cron-DZgYJquv.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-Dlnl0-v6.js → Crosschain-CsJE5KNs.js} +1 -1
- package/src/assets/web-panel/assets/{DID-CxtYS31I.js → DID-DhzhW9OD.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-G4UnHlTR.js → Dashboard-wRXP3tMC.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BazlxFGY.js → Dropdown-B-J3c7n7.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-BrpNdihm.js → EmailListRenderer-sNbeZPLo.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-HD7jbOOR.js → FamilyGuardDashboard-CzfFKArY.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-Bz8lzAGI.js → Federation-DYehIJb9.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CcyzGS00.js → FormItemContext-DpDqU3yC.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DRo9cwmp.js → GenericCardRenderer-MSm4ZBE2.js} +1 -1
- package/src/assets/web-panel/assets/{Git-B7bn333J.js → Git-CJJpll9b.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-DZX9CWAM.js → Governance-D93XtWte.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-B3XhsL6W.js → Inference-8fZkwWyg.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-CxFRTlQe.js → KnowledgeGraph-BbbI-D3L.js} +1 -1
- package/src/assets/web-panel/assets/Logs-B6n1Hcn8.js +2 -0
- package/src/assets/web-panel/assets/{Marketplace-CXyxv4WU.js → Marketplace-B92T5ZT1.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BzZLQVI3.js → McpTools-DKddzSA8.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-BANtaBa7.js → Memory-CAHamDmS.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BJIwjmxr.js → MobileBridge-BTPLGA6_.js} +3 -3
- package/src/assets/web-panel/assets/{MobileProjects-B857uSAZ.js → MobileProjects-DvGxl7Bd.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-Cn7ceFEz.js → Mtc-BGm92GtT.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-B0zE978G.js → MtcAudit-CL6I9XX4.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-CQFT0wXW.js → Multisig-BYQujNg6.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-DSxKdVY-.js → NLProgramming-x4DYENrx.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-DtlTfam8.js → Notes-DyW_mhF0.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-CHQwayAg.js → NotificationSettings-CgeAblV8.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-Brpmzh9n.js → OrderTableRenderer-COT7rmDe.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-nF_tzZDT.js → Organization-Pm-XRWB1.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-CgCSf_PH.js → Overflow-Batydsoy.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-Bvn46bLY.js → P2P-qwLlvxlM.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-Bzl9k7Gj.js → PdhVaultBrowser-CYvPhc0M.js} +5 -5
- package/src/assets/web-panel/assets/{Permissions-Dmezbuo8.js → Permissions-gRGKScdi.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-lCKRxwZr.js → PersonalDataHub-Bob9qL_z.js} +2 -2
- package/src/assets/web-panel/assets/{Pipeline-DDCGm9PA.js → Pipeline-DvP3SdFD.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-Cgu18Kjl.js → Privacy-B-c--IOb.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CkF1AeRY.js → ProjectInit-UYJYk1VO.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-D0Q-orz1.js → ProjectSettings--euwin_I.js} +2 -2
- package/src/assets/web-panel/assets/Projects-2xn0tfJt.js +1 -0
- package/src/assets/web-panel/assets/{Providers-BACLV0z8.js → Providers-Bgq2bGTl.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CPsZUqDl.js → QuickAsk-Ck0iiQiv.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-5jX0OI1-.js → Recommend-CuW6xeEE.js} +1 -1
- package/src/assets/web-panel/assets/{Reputation-5JKv54z0.js → Reputation-JiNIQHms.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DLiTF5LY.js → Row-BCudZU5T.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-CFdGmCKW.js → RssFeed-CH0VQaou.js} +3 -3
- package/src/assets/web-panel/assets/{Search-BjIOnmA7.js → Search-CJjlSa50.js} +1 -1
- package/src/assets/web-panel/assets/{Security-BujPqQSo.js → Security-B8Cf8rVb.js} +4 -4
- package/src/assets/web-panel/assets/{Services-ChciPnMu.js → Services-BocEJ7ad.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-Cwswp1Jv.js → Skeleton-DpI6YIya.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CtwR4vJV.js → Skills-C2lt0BNa.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-pRIevich.js → Sla-BxSG8zOp.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BRqB28Ai.js → SpeechSettings-DzOejchn.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-BYyj58_h.js → SyncSettings-CgKxL89k.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DTLpT48U.js → Tasks-CYDrs0ND.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-Bbz_h7oW.js → Templates-CRIQTXNH.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-D-H4E3cu.js → Tenant-DC4HO1F6.js} +1 -1
- package/src/assets/web-panel/assets/Terminal-CqMZJzEh.js +3 -0
- package/src/assets/web-panel/assets/{TimelineRenderer-BKI6eG0k.js → TimelineRenderer-D-TTq2sh.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-rsE_yDjM.js → Tokens-NUv03cX9.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-8TpwuTGk.js → Trigger-X-FBeIBO.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-sMtZkHPs.js → Trust-BFd9yV9d.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-BAy2bAdG.js → UkeySign-BVJ0bGzq.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-CBeR_DYK.js → VideoEditing-C3Q7lvPF.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BymDnBcq.js → Wallet-Doxo0C8S.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DQIjmqNz.js → WebAuthn-DveIKeGo.js} +5 -5
- package/src/assets/web-panel/assets/WorkflowEditor-CTzSNXfX.js +1 -0
- package/src/assets/web-panel/assets/{chat-DYnGj4vi.js → chat-eQ6OL2Nl.js} +1 -1
- package/src/assets/web-panel/assets/{colors-qOLKZNvN.js → colors-B7NzPMJ1.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BpjCLPcW.js → compact-item-DA8_yifp.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-CfakUZVQ.js → createContext-CAdn_TqD.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-UBrKMao4.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-C9RW1s7t.js → hasIn-ko4B6kih.js} +1 -1
- package/src/assets/web-panel/assets/{index-DQvVYNoJ.js → index-B0I9Q9uH.js} +1 -1
- package/src/assets/web-panel/assets/{index-D-RzTqlR.js → index-B6M0zm0k.js} +1 -1
- package/src/assets/web-panel/assets/{index-BFOSDeeo.js → index-BBIQJRlz.js} +1 -1
- package/src/assets/web-panel/assets/{index-DzXYG5YJ.js → index-BBq7mqhI.js} +1 -1
- package/src/assets/web-panel/assets/{index-BlxRICmz.js → index-BKAgTgeT.js} +1 -1
- package/src/assets/web-panel/assets/{index-CEHyZ77C.js → index-BNt9GIgX.js} +1 -1
- package/src/assets/web-panel/assets/{index-DkmLJFE_.js → index-BX1VHvqW.js} +1 -1
- package/src/assets/web-panel/assets/{index-COYEuArt.js → index-B_sjoYmu.js} +1 -1
- package/src/assets/web-panel/assets/{index-DAjszh8P.js → index-Bb6JBiCG.js} +1 -1
- package/src/assets/web-panel/assets/index-BcOtgvfX.js +1 -0
- package/src/assets/web-panel/assets/{index-T3bIqK_p.js → index-C2qPPvCv.js} +3 -3
- package/src/assets/web-panel/assets/{index-BfyRXPyV.js → index-CDweqnrF.js} +1 -1
- package/src/assets/web-panel/assets/{index-VYIJmPvJ.js → index-CJY-yrWh.js} +1 -1
- package/src/assets/web-panel/assets/{index-qf0fAus7.js → index-CgcRhqah.js} +1 -1
- package/src/assets/web-panel/assets/{index-BIz-pX0k.js → index-CloqX2ad.js} +1 -1
- package/src/assets/web-panel/assets/{index-8Ia91vNV.js → index-Co5moC1M.js} +1 -1
- package/src/assets/web-panel/assets/{index-C2S1hUWG.js → index-CqNS5nZH.js} +1 -1
- package/src/assets/web-panel/assets/{index-lPc7EzUi.js → index-CzerRnMr.js} +1 -1
- package/src/assets/web-panel/assets/{index-CVZTLSL1.js → index-D38_8grM.js} +1 -1
- package/src/assets/web-panel/assets/{index-BdR8XRyF.js → index-D4yrKz8e.js} +1 -1
- package/src/assets/web-panel/assets/{index-BxiHBsfU.js → index-DGCgSG2a.js} +1 -1
- package/src/assets/web-panel/assets/{index-DgMJagCq.js → index-DLn-aR4t.js} +1 -1
- package/src/assets/web-panel/assets/{index-m9JeDv6B.js → index-DMGbCVXZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DA80prWe.js → index-DQ-4d9yy.js} +1 -1
- package/src/assets/web-panel/assets/{index-CvWFTG56.js → index-DZ0Dd5mp.js} +1 -1
- package/src/assets/web-panel/assets/{index-BE67I0SW.js → index-DmEcUTX3.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_K0YtG2.js → index-Dnz_7pqU.js} +1 -1
- package/src/assets/web-panel/assets/index-DogBvgW2.js +1 -0
- package/src/assets/web-panel/assets/{index-UiiqS5k2.js → index-Dq_DwzU4.js} +1 -1
- package/src/assets/web-panel/assets/{index-BJoWi1aR.js → index-DyfLqass.js} +1 -1
- package/src/assets/web-panel/assets/{index-CJZ2noI2.js → index-N7_jPRVy.js} +1 -1
- package/src/assets/web-panel/assets/{index-CbnJ6FsO.js → index-aClwSoZt.js} +1 -1
- package/src/assets/web-panel/assets/{index-DadPmrxI.js → index-b2I5q4bm.js} +1 -1
- package/src/assets/web-panel/assets/{index-B4kS312z.js → index-dMx6z8Kk.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bl5LBZJM.js → index-dhQxLUnV.js} +1 -1
- package/src/assets/web-panel/assets/{index-ZCtDWP2C.js → index-ku6l6unx.js} +1 -1
- package/src/assets/web-panel/assets/{index-JkOMWGMX.js → index-llKEnU9Q.js} +1 -1
- package/src/assets/web-panel/assets/{index-f9yoj84i.js → index-snb01c99.js} +1 -1
- package/src/assets/web-panel/assets/{index-DSWdpR3c.js → index-v8QteGiY.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DgsgQr1H.js → initDefaultProps-BE1YKWp0.js} +1 -1
- package/src/assets/web-panel/assets/{motion-TeUH7wzx.js → motion-B4Pkg4rs.js} +1 -1
- package/src/assets/web-panel/assets/{move-DdkIeWQx.js → move-DbLtadAv.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BH_PH6HT.js → omit-Dn52nvgx.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CllCh-Nl.js → pickAttrs-D4B5N6WV.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BCjE2AzM.js → placementArrow-CKSjiqCc.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BAVGAvRQ.js → responsiveObserve-g5NpHuRh.js} +1 -1
- package/src/assets/web-panel/assets/{slide-D4ZW-Inn.js → slide-WYVY3fl7.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-j4pxhmKV.js → statusUtils-YAkHF6HM.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-DH2SLtPg.js → styleChecker-Cv_nVk4H.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-CYMMs-_Q.js → useFlexGapSupport-D1JaeNmU.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BOX2ddKh.js → useFs-DYfXeCVm.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BwcnN5z_.js → usePersonalDataHub-DdtPxV0b.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-Cwalh7Hj.js → vnode-nFZXhzTF.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-B2_q_nbu.js → zoom-CmyXMc6s.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agent.js +66 -51
- package/src/lib/llm-config-defaults.js +31 -0
- package/src/runtime/headless-stream.js +169 -0
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DWSm1XJJ.js +0 -1
- package/src/assets/web-panel/assets/Logs-xuys6mKH.js +0 -2
- package/src/assets/web-panel/assets/Projects-KfGELrSY.js +0 -1
- package/src/assets/web-panel/assets/Terminal-CLLi0-lV.js +0 -3
- package/src/assets/web-panel/assets/WorkflowEditor-Cj7PB73f.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DgtRXlrj.js +0 -1
- package/src/assets/web-panel/assets/index-DIGTMmnW.js +0 -1
- package/src/assets/web-panel/assets/index-Ef5jERRW.js +0 -1
package/src/commands/agent.js
CHANGED
|
@@ -385,6 +385,22 @@ export function registerAgentCommand(program) {
|
|
|
385
385
|
llm: loadConfig().llm || {},
|
|
386
386
|
});
|
|
387
387
|
|
|
388
|
+
// Config-default LLM (parity with cc ask/chat): a bare `cc agent` honors
|
|
389
|
+
// config.json `llm` (provider/model/baseUrl/apiKey) instead of silently
|
|
390
|
+
// assuming local ollama — this is what makes the editor chat panel work
|
|
391
|
+
// against a cloud-configured setup. Explicit --provider wins outright;
|
|
392
|
+
// the vision resolution above still overrides for --image runs. Applied
|
|
393
|
+
// AFTER resolveVisionLlm so config defaults don't masquerade as explicit
|
|
394
|
+
// flags there, and BEFORE every dispatch (headless/stream/REPL) since
|
|
395
|
+
// they all read options.provider/model/baseUrl/apiKey.
|
|
396
|
+
{
|
|
397
|
+
const { applyConfigLlmDefaults } =
|
|
398
|
+
await import("../lib/llm-config-defaults.js");
|
|
399
|
+
applyConfigLlmDefaults(options, loadConfig().llm || {}, {
|
|
400
|
+
explicitModel: explicitCliModel, // settings-file model must not ride
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
|
|
388
404
|
// --think / --ultrathink → options.thinking for the agent loop (Anthropic
|
|
389
405
|
// extended thinking; ignored by other providers). --think with no value →
|
|
390
406
|
// true; --think <level> → that level; --ultrathink wins as "ultra".
|
|
@@ -510,55 +526,55 @@ export function registerAgentCommand(program) {
|
|
|
510
526
|
? parseInt(options.maxTurns, 10)
|
|
511
527
|
: undefined;
|
|
512
528
|
const headlessOptions = {
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
cwd: process.cwd(),
|
|
538
|
-
}),
|
|
539
|
-
appendSystemPrompt: resolvePromptText(options.appendSystemPrompt, {
|
|
540
|
-
cwd: process.cwd(),
|
|
541
|
-
}),
|
|
542
|
-
// --include-partial-messages: live token deltas as stream_event lines
|
|
543
|
-
includePartialMessages: options.includePartialMessages === true,
|
|
544
|
-
// --goal [id]: bind a cc goal into the run (Phase 1)
|
|
545
|
-
goal: options.goal,
|
|
546
|
-
// --goal-assess: run-end LLM progress assessment (Phase 2)
|
|
547
|
-
goalAssess: options.goalAssess === true,
|
|
548
|
-
// --mcp-config: connect ad-hoc MCP servers + expose their tools
|
|
549
|
-
mcpConfig: options.mcpConfig || null,
|
|
550
|
-
// --no-mcp: skip registered (cc mcp add) auto-connect servers
|
|
551
|
-
useRegisteredMcp: options.mcp !== false,
|
|
552
|
-
// --ide / --no-ide: auto-connect a running editor's MCP bridge
|
|
553
|
-
ide: options.ide,
|
|
529
|
+
prompt,
|
|
530
|
+
images,
|
|
531
|
+
model: visionLlm.model || options.model,
|
|
532
|
+
thinking,
|
|
533
|
+
thinkingBudget,
|
|
534
|
+
provider: visionLlm.provider || options.provider,
|
|
535
|
+
baseUrl: visionLlm.baseUrl || options.baseUrl,
|
|
536
|
+
apiKey: visionLlm.apiKey || options.apiKey,
|
|
537
|
+
sessionId: options.session,
|
|
538
|
+
// A resolved --session/--continue/--resume id means "replay this
|
|
539
|
+
// conversation and persist the new turns"; the runner loads prior
|
|
540
|
+
// history when the id already exists and creates it otherwise.
|
|
541
|
+
resume: options.session,
|
|
542
|
+
outputFormat: options.outputFormat,
|
|
543
|
+
permissionMode: options.permissionMode,
|
|
544
|
+
allowedTools: parseToolList(options.allowedTools),
|
|
545
|
+
disallowedTools: parseToolList(options.disallowedTools),
|
|
546
|
+
additionalDirectories,
|
|
547
|
+
autoCheckpoint: options.checkpoint === true,
|
|
548
|
+
maxTurns,
|
|
549
|
+
// commander maps --no-file-refs → options.fileRefs === false
|
|
550
|
+
expandFileRefs: options.fileRefs !== false,
|
|
551
|
+
// --system-prompt / --append-system-prompt (literal or @file)
|
|
552
|
+
systemPrompt: resolvePromptText(options.systemPrompt, {
|
|
554
553
|
cwd: process.cwd(),
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
554
|
+
}),
|
|
555
|
+
appendSystemPrompt: resolvePromptText(options.appendSystemPrompt, {
|
|
556
|
+
cwd: process.cwd(),
|
|
557
|
+
}),
|
|
558
|
+
// --include-partial-messages: live token deltas as stream_event lines
|
|
559
|
+
includePartialMessages: options.includePartialMessages === true,
|
|
560
|
+
// --goal [id]: bind a cc goal into the run (Phase 1)
|
|
561
|
+
goal: options.goal,
|
|
562
|
+
// --goal-assess: run-end LLM progress assessment (Phase 2)
|
|
563
|
+
goalAssess: options.goalAssess === true,
|
|
564
|
+
// --mcp-config: connect ad-hoc MCP servers + expose their tools
|
|
565
|
+
mcpConfig: options.mcpConfig || null,
|
|
566
|
+
// --no-mcp: skip registered (cc mcp add) auto-connect servers
|
|
567
|
+
useRegisteredMcp: options.mcp !== false,
|
|
568
|
+
// --ide / --no-ide: auto-connect a running editor's MCP bridge
|
|
569
|
+
ide: options.ide,
|
|
570
|
+
cwd: process.cwd(),
|
|
571
|
+
// --permission-prompt-tool: defer approvals to an MCP tool
|
|
572
|
+
permissionPromptTool: options.permissionPromptTool || null,
|
|
573
|
+
// --settings: extra .claude/settings.json permission rules
|
|
574
|
+
settingsFile: options.settings || null,
|
|
575
|
+
outputStyle: options.outputStyle || null,
|
|
576
|
+
// --fallback-model: retry once on a backup model on transient errors
|
|
577
|
+
chatFn: fallbackChatFn,
|
|
562
578
|
};
|
|
563
579
|
|
|
564
580
|
// --json-schema: structured output — wrap the runner with capture +
|
|
@@ -573,9 +589,8 @@ export function registerAgentCommand(program) {
|
|
|
573
589
|
process.exit(1);
|
|
574
590
|
}
|
|
575
591
|
try {
|
|
576
|
-
const { runJsonSchemaConstrained } =
|
|
577
|
-
"../lib/json-schema-output.js"
|
|
578
|
-
);
|
|
592
|
+
const { runJsonSchemaConstrained } =
|
|
593
|
+
await import("../lib/json-schema-output.js");
|
|
579
594
|
const code = await runJsonSchemaConstrained({
|
|
580
595
|
schemaFile: options.jsonSchema,
|
|
581
596
|
baseOptions: headlessOptions,
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config-default LLM resolution for `cc agent` (parity with `cc ask`/`chat`):
|
|
3
|
+
* a bare run honors `~/.chainlesschain/config.json` `llm` —
|
|
4
|
+
* provider/model/baseUrl/apiKey — instead of silently assuming local ollama
|
|
5
|
+
* (the historical default that broke every cloud-configured setup the moment
|
|
6
|
+
* no --provider flag was passed, e.g. the editor chat panel's spawn).
|
|
7
|
+
*
|
|
8
|
+
* Rules (pure; mutates and returns `options` for call-site convenience):
|
|
9
|
+
* - An explicit --provider wins outright: config is NOT consulted at all
|
|
10
|
+
* (mixing config's model/key into a different provider would be wrong).
|
|
11
|
+
* - With no --provider but a configured one: provider + any of
|
|
12
|
+
* model/baseUrl/apiKey the user did not explicitly set come from config.
|
|
13
|
+
* - Model pairing: when the provider is adopted from config, the model must
|
|
14
|
+
* pair with it — only an EXPLICIT --model (opts.explicitModel) survives;
|
|
15
|
+
* a model that leaked in from .claude/settings.json (meant for whatever
|
|
16
|
+
* provider that file assumed) is replaced by config's own model. Same
|
|
17
|
+
* lesson as the --settings "opus"→404 vision trap.
|
|
18
|
+
* - No configured provider → unchanged (runner defaults apply: ollama).
|
|
19
|
+
*/
|
|
20
|
+
export function applyConfigLlmDefaults(options = {}, cfgLlm = {}, opts = {}) {
|
|
21
|
+
if (options.provider || !cfgLlm.provider) return options;
|
|
22
|
+
options.provider = cfgLlm.provider;
|
|
23
|
+
if (opts.explicitModel) {
|
|
24
|
+
options.model = opts.explicitModel;
|
|
25
|
+
} else if (cfgLlm.model) {
|
|
26
|
+
options.model = cfgLlm.model;
|
|
27
|
+
}
|
|
28
|
+
if (!options.baseUrl && cfgLlm.baseUrl) options.baseUrl = cfgLlm.baseUrl;
|
|
29
|
+
if (!options.apiKey && cfgLlm.apiKey) options.apiKey = cfgLlm.apiKey;
|
|
30
|
+
return options;
|
|
31
|
+
}
|
|
@@ -30,6 +30,40 @@ import {
|
|
|
30
30
|
resolvePermissionMode,
|
|
31
31
|
resolveEnabledTools,
|
|
32
32
|
} from "./headless-runner.js";
|
|
33
|
+
import {
|
|
34
|
+
startSession as jsonlStartSession,
|
|
35
|
+
appendUserMessage as jsonlAppendUserMessage,
|
|
36
|
+
appendAssistantMessage as jsonlAppendAssistantMessage,
|
|
37
|
+
rebuildMessages as jsonlRebuildMessages,
|
|
38
|
+
sessionExists as jsonlSessionExists,
|
|
39
|
+
} from "../harness/jsonl-session-store.js";
|
|
40
|
+
import { getPlanModeManager } from "../lib/plan-mode.js";
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Structured view of the global plan-mode state for `plan_update` events
|
|
44
|
+
* (the chat panel renders its plan card from this). Pure read; never throws.
|
|
45
|
+
*/
|
|
46
|
+
export function planSnapshot(pm) {
|
|
47
|
+
let items = [];
|
|
48
|
+
let risk = null;
|
|
49
|
+
try {
|
|
50
|
+
const plan = pm.currentPlan;
|
|
51
|
+
items = (plan?.items || []).map((i) => ({
|
|
52
|
+
id: i.id,
|
|
53
|
+
title: i.title,
|
|
54
|
+
tool: i.tool,
|
|
55
|
+
impact: i.estimatedImpact || "low",
|
|
56
|
+
status: i.status,
|
|
57
|
+
}));
|
|
58
|
+
if (items.length > 0) {
|
|
59
|
+
const r = pm.getRiskAssessment();
|
|
60
|
+
if (r) risk = { level: r.level, totalScore: r.totalScore };
|
|
61
|
+
}
|
|
62
|
+
} catch {
|
|
63
|
+
/* snapshot is best-effort */
|
|
64
|
+
}
|
|
65
|
+
return { active: pm.isActive(), state: pm.state || null, items, risk };
|
|
66
|
+
}
|
|
33
67
|
import { withQuietStdout } from "./quiet-stdout.js";
|
|
34
68
|
|
|
35
69
|
/**
|
|
@@ -44,6 +78,12 @@ export function parseInputEvent(line) {
|
|
|
44
78
|
} catch {
|
|
45
79
|
return { error: `invalid JSON line: ${trimmed.slice(0, 80)}` };
|
|
46
80
|
}
|
|
81
|
+
// Plan-mode control events (chat-panel plan UI):
|
|
82
|
+
// {"type":"plan","action":"enter"|"approve"|"reject"}
|
|
83
|
+
if (obj && typeof obj === "object" && obj.type === "plan") {
|
|
84
|
+
const action = String(obj.action || "").toLowerCase();
|
|
85
|
+
return action ? { plan: action } : null;
|
|
86
|
+
}
|
|
47
87
|
const msg = obj && typeof obj === "object" ? obj.message || obj : {};
|
|
48
88
|
let content = msg.content ?? obj.text ?? obj.prompt;
|
|
49
89
|
if (Array.isArray(content)) {
|
|
@@ -212,6 +252,21 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
212
252
|
const sessionId =
|
|
213
253
|
options.sessionId || `headless-stream-${Date.now()}-${process.pid}`;
|
|
214
254
|
|
|
255
|
+
// Session persistence + resume (chat-panel "session resume" / --resume):
|
|
256
|
+
// an EXPLICIT session id (--session / --resume) opts into JSONL persistence —
|
|
257
|
+
// prior history is rebuilt into the conversation and every new turn is
|
|
258
|
+
// appended, so a later run with the same id picks up where this one left
|
|
259
|
+
// off. Anonymous runs (no id) stay persistence-free, exactly as before.
|
|
260
|
+
const store = {
|
|
261
|
+
sessionExists: deps.sessionExists || jsonlSessionExists,
|
|
262
|
+
startSession: deps.startSession || jsonlStartSession,
|
|
263
|
+
appendUserMessage: deps.appendUserMessage || jsonlAppendUserMessage,
|
|
264
|
+
appendAssistantMessage:
|
|
265
|
+
deps.appendAssistantMessage || jsonlAppendAssistantMessage,
|
|
266
|
+
rebuildMessages: deps.rebuildMessages || jsonlRebuildMessages,
|
|
267
|
+
};
|
|
268
|
+
const persist = Boolean(options.sessionId);
|
|
269
|
+
|
|
215
270
|
let approvalGate = null;
|
|
216
271
|
try {
|
|
217
272
|
approvalGate = await getApprovalGate();
|
|
@@ -258,6 +313,29 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
258
313
|
}
|
|
259
314
|
}
|
|
260
315
|
|
|
316
|
+
// Resume: replay the persisted conversation (fresh system prompt always
|
|
317
|
+
// leads; persisted system turns are dropped, mirroring runAgentHeadless).
|
|
318
|
+
let resumedMessages = 0;
|
|
319
|
+
if (persist) {
|
|
320
|
+
try {
|
|
321
|
+
if (store.sessionExists(sessionId)) {
|
|
322
|
+
const history = (store.rebuildMessages(sessionId) || []).filter(
|
|
323
|
+
(m) => m && m.role !== "system",
|
|
324
|
+
);
|
|
325
|
+
messages.push(...history);
|
|
326
|
+
resumedMessages = history.length;
|
|
327
|
+
} else {
|
|
328
|
+
store.startSession(sessionId, {
|
|
329
|
+
title: "stream session",
|
|
330
|
+
provider,
|
|
331
|
+
model,
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
} catch {
|
|
335
|
+
// persistence is best-effort — never fail the stream over it
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
261
339
|
emit({
|
|
262
340
|
type: "system",
|
|
263
341
|
subtype: "init",
|
|
@@ -268,6 +346,7 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
268
346
|
tools: enabledToolNames,
|
|
269
347
|
input_format: "stream-json",
|
|
270
348
|
additional_directories: additionalDirectories,
|
|
349
|
+
resumed_messages: resumedMessages,
|
|
271
350
|
});
|
|
272
351
|
|
|
273
352
|
// Goal binding (cc goal, Phase 1) — resolved once and injected on every turn.
|
|
@@ -409,6 +488,69 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
409
488
|
continue;
|
|
410
489
|
}
|
|
411
490
|
|
|
491
|
+
// Plan-mode control events (chat-panel plan UI). Mirrors the REPL's
|
|
492
|
+
// /plan verbs: enter blocks write tools (blocked calls become plan items),
|
|
493
|
+
// approve unlocks them and IMMEDIATELY runs a continuation turn, reject
|
|
494
|
+
// exits plan mode. Every control answers with a `plan_update` event.
|
|
495
|
+
if (parsed.plan) {
|
|
496
|
+
const pm = getPlanModeManager();
|
|
497
|
+
if (parsed.plan === "enter") {
|
|
498
|
+
if (!pm.isActive()) {
|
|
499
|
+
pm.enterPlanMode({ title: "Agent Plan" });
|
|
500
|
+
messages.push({
|
|
501
|
+
role: "system",
|
|
502
|
+
content:
|
|
503
|
+
"[PLAN MODE ACTIVE] You are now in plan mode. You can read " +
|
|
504
|
+
"files, search, and analyze — but write/execute tools are " +
|
|
505
|
+
"blocked. Any blocked tool calls will be recorded as plan " +
|
|
506
|
+
"items. Analyze the task thoroughly, then the user will " +
|
|
507
|
+
"approve your plan.",
|
|
508
|
+
});
|
|
509
|
+
}
|
|
510
|
+
emit({
|
|
511
|
+
type: "plan_update",
|
|
512
|
+
...planSnapshot(pm),
|
|
513
|
+
session_id: sessionId,
|
|
514
|
+
});
|
|
515
|
+
continue;
|
|
516
|
+
}
|
|
517
|
+
if (parsed.plan === "reject") {
|
|
518
|
+
if (pm.isActive()) pm.rejectPlan("User rejected");
|
|
519
|
+
emit({
|
|
520
|
+
type: "plan_update",
|
|
521
|
+
...planSnapshot(pm),
|
|
522
|
+
session_id: sessionId,
|
|
523
|
+
});
|
|
524
|
+
continue;
|
|
525
|
+
}
|
|
526
|
+
if (parsed.plan === "approve") {
|
|
527
|
+
if (!pm.isActive() || !(pm.currentPlan?.items?.length > 0)) {
|
|
528
|
+
emit({
|
|
529
|
+
type: "plan_update",
|
|
530
|
+
...planSnapshot(pm),
|
|
531
|
+
session_id: sessionId,
|
|
532
|
+
note: "nothing to approve",
|
|
533
|
+
});
|
|
534
|
+
continue;
|
|
535
|
+
}
|
|
536
|
+
pm.approvePlan();
|
|
537
|
+
messages.push({
|
|
538
|
+
role: "system",
|
|
539
|
+
content: `[PLAN APPROVED] The user has approved your plan with ${pm.currentPlan.items.length} items. You can now use all tools including write_file, edit_file, run_shell, and run_skill. Execute the plan items in order.`,
|
|
540
|
+
});
|
|
541
|
+
emit({
|
|
542
|
+
type: "plan_update",
|
|
543
|
+
...planSnapshot(pm),
|
|
544
|
+
session_id: sessionId,
|
|
545
|
+
});
|
|
546
|
+
// Fall through into the normal turn machinery with a continuation
|
|
547
|
+
// prompt — the agent starts executing without an extra user message.
|
|
548
|
+
parsed.text = "Proceed with the approved plan.";
|
|
549
|
+
} else if (!parsed.text) {
|
|
550
|
+
continue; // unknown plan action — ignored
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
|
|
412
554
|
// Per-turn iteration budget so one turn can't starve the rest.
|
|
413
555
|
const budget = Number.isFinite(options.maxTurns)
|
|
414
556
|
? new IterationBudget({
|
|
@@ -466,6 +608,13 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
466
608
|
}
|
|
467
609
|
|
|
468
610
|
messages.push({ role: "user", content: userContent });
|
|
611
|
+
if (persist) {
|
|
612
|
+
try {
|
|
613
|
+
store.appendUserMessage(sessionId, userContent);
|
|
614
|
+
} catch {
|
|
615
|
+
/* best-effort */
|
|
616
|
+
}
|
|
617
|
+
}
|
|
469
618
|
turns += 1;
|
|
470
619
|
|
|
471
620
|
let outcome;
|
|
@@ -489,6 +638,13 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
489
638
|
|
|
490
639
|
// Grow the conversation so the next turn has context.
|
|
491
640
|
messages.push({ role: "assistant", content: outcome.finalText });
|
|
641
|
+
if (persist) {
|
|
642
|
+
try {
|
|
643
|
+
store.appendAssistantMessage(sessionId, outcome.finalText);
|
|
644
|
+
} catch {
|
|
645
|
+
/* best-effort */
|
|
646
|
+
}
|
|
647
|
+
}
|
|
492
648
|
|
|
493
649
|
const exhausted =
|
|
494
650
|
outcome.endReason === "budget-exhausted" ||
|
|
@@ -505,6 +661,19 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
505
661
|
turn: turns,
|
|
506
662
|
usage: outcome.usage,
|
|
507
663
|
});
|
|
664
|
+
|
|
665
|
+
// While planning, blocked tool calls grew the plan during this turn —
|
|
666
|
+
// push the fresh snapshot so the panel's plan card stays live.
|
|
667
|
+
{
|
|
668
|
+
const pm = getPlanModeManager();
|
|
669
|
+
if (pm.isActive()) {
|
|
670
|
+
emit({
|
|
671
|
+
type: "plan_update",
|
|
672
|
+
...planSnapshot(pm),
|
|
673
|
+
session_id: sessionId,
|
|
674
|
+
});
|
|
675
|
+
}
|
|
676
|
+
}
|
|
508
677
|
}
|
|
509
678
|
|
|
510
679
|
// Tear down ad-hoc MCP servers (--mcp-config) when stdin closes.
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as v,P as u,J as S,U as n,R as a,S as y,K as C,Q as x,V as w,_ as B,b as s}from"./vendor-BvqAck49.js";import{_ as k}from"./index-T3bIqK_p.js";import"./icons-DP3uiYxy.js";const D={__name:"ChatBubbleRenderer",props:{event:{type:Object,required:!0}},setup(c,{expose:d}){d();const t=c,r=s(()=>{const e=t.event.content||{};return e.text||e.body||e.message||e.title||JSON.stringify(e).slice(0,200)}),i=s(()=>{const e=t.event.content||{};return e.from||e.sender||e.senderName||t.event.actor||"(unknown)"}),l=s(()=>{const e=(t.event.actor||"").toLowerCase();return e.includes("self")||e==="me"||e.endsWith("_self")}),o=s(()=>{const e=t.event.source.adapter||"";return e.startsWith("messaging-qq")?"magenta":e==="wechat"?"green":"blue"}),m=s(()=>{if(!t.event.occurredAt)return"";try{const e=new Date(t.event.occurredAt),p=e.getFullYear(),f=String(e.getMonth()+1).padStart(2,"0"),g=String(e.getDate()).padStart(2,"0"),b=String(e.getHours()).padStart(2,"0"),h=String(e.getMinutes()).padStart(2,"0");return`${p}-${f}-${g} ${b}:${h}`}catch{return""}}),_={props:t,messageText:r,actorLabel:i,isMine:l,adapterColor:o,formattedTime:m,computed:s};return Object.defineProperty(_,"__isScriptSetup",{enumerable:!1,value:!0}),_}},N={class:"bubble"},T={class:"meta"},L={class:"actor"},M={class:"time"},R={class:"body"};function V(c,d,t,r,i,l){const o=v("a-tag");return u(),S("div",{class:B(["chat-row",{mine:r.isMine}])},[n("div",N,[n("div",T,[n("span",L,a(r.actorLabel),1),n("span",M,a(r.formattedTime),1)]),n("div",R,a(r.messageText),1),t.event.source.adapter?(u(),y(o,{key:0,class:"src",color:r.adapterColor},{default:C(()=>[x(a(t.event.source.adapter),1)]),_:1},8,["color"])):w("v-if",!0)])],2)}const j=k(D,[["render",V],["__scopeId","data-v-49238629"],["__file","/tmp/cc-web-panel-LhDQDP/repo/packages/web-panel/src/components/pdh/renderers/ChatBubbleRenderer.vue"]]);export{j as default};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{I as s,J as g,U as d,c as n,K as _,V as k,S as V,R as S,F as W,Z as D,w as M,n as C,o as R,b as T,r,P as p,Q as O,_ as K}from"./vendor-BvqAck49.js";import{_ as U,u as N}from"./index-T3bIqK_p.js";import{R as E}from"./icons-DP3uiYxy.js";const P={__name:"Logs",setup(Q,{expose:a}){a();const x=N(),e=r("status"),y=r(!1),v=r(""),i=r(""),c=r(""),f=r(!0),o=r(null),h={status:"status",doctor:"doctor","skill-sources":"skill sources","llm-providers":"llm providers"},m=T(()=>i.value.split(`
|
|
2
|
-
`)),b=T(()=>{if(!c.value)return m.value;const t=c.value.toLowerCase();return m.value.filter(u=>u.toLowerCase().includes(t))});function L(t){return t.includes("✖")||t.includes("error")||t.includes("Error")||t.includes("failed")?"line-error":t.includes("✔")||t.includes("✓")||t.includes("success")||t.includes("running")?"line-success":t.includes("warn")||t.includes("Warn")||t.includes("○")?"line-warn":t.startsWith(" ")||t.startsWith(" ")?"line-indent":""}function l(t){return t.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function w(t){if(!c.value)return t;const u=c.value.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return t.replace(new RegExp(`(${u})`,"gi"),"<mark>$1</mark>")}async function B(){y.value=!0,v.value="",i.value="";const t=h[e.value]||"status";try{const{output:u}=await x.execute(t,3e4);i.value=u,f.value&&(await C(),o.value&&(o.value.scrollTop=o.value.scrollHeight))}catch(u){v.value=`执行失败: ${u.message}`,i.value=v.value}finally{y.value=!1}}M(b,async()=>{f.value&&(await C(),o.value&&(o.value.scrollTop=o.value.scrollHeight))}),R(B);const H={ws:x,activeTab:e,loading:y,error:v,rawOutput:i,searchQuery:c,autoScroll:f,logContainer:o,TAB_COMMANDS:h,allLines:m,filteredLines:b,lineClass:L,escapeHtml:l,highlightSearch:w,loadLog:B,ref:r,computed:T,watch:M,nextTick:C,onMounted:R,get ReloadOutlined(){return E},get useWsStore(){return N}};return Object.defineProperty(H,"__isScriptSetup",{enumerable:!1,value:!0}),H}},j={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},q={style:{display:"flex",gap:"10px",margin:"12px 0"}},z={ref:"logContainer",class:"log-box"},A={key:0,style:{"text-align":"center",padding:"40px",color:"var(--text-muted)"}},F={key:1,style:{"text-align":"center",padding:"40px",color:"var(--text-muted)"}},I={key:2},J=["innerHTML"];function Z(Q,a,x,e,y,v){const i=s("a-checkbox"),c=s("a-button"),f=s("a-space"),o=s("a-tab-pane"),h=s("a-tabs"),m=s("a-input-search"),b=s("a-tag"),L=s("a-spin");return p(),g("div",null,[d("div",j,[a[5]||(a[5]=d("div",null,[d("h2",{class:"page-title"},"日志查看"),d("p",{class:"page-sub"},"系统运行日志与诊断输出")],-1)),n(f,null,{default:_(()=>[n(i,{checked:e.autoScroll,"onUpdate:checked":a[0]||(a[0]=l=>e.autoScroll=l)},{default:_(()=>[...a[3]||(a[3]=[O("自动滚动",-1)])]),_:1},8,["checked"]),n(c,{type:"primary",ghost:"",loading:e.loading,onClick:e.loadLog},{icon:_(()=>[n(e.ReloadOutlined)]),default:_(()=>[a[4]||(a[4]=O(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),k(" Tab Selector "),n(h,{activeKey:e.activeTab,"onUpdate:activeKey":a[1]||(a[1]=l=>e.activeTab=l),onChange:e.loadLog,style:{"margin-bottom":"0"}},{default:_(()=>[n(o,{key:"status",tab:"系统状态"}),n(o,{key:"doctor",tab:"环境诊断"}),n(o,{key:"skill-sources",tab:"技能来源"}),n(o,{key:"llm-providers",tab:"LLM 提供商"})]),_:1},8,["activeKey"]),k(" Search Bar "),d("div",q,[n(m,{value:e.searchQuery,"onUpdate:value":a[2]||(a[2]=l=>e.searchQuery=l),placeholder:"搜索日志内容...","allow-clear":"",style:{flex:"1"}},null,8,["value"]),e.filteredLines.length!==e.allLines.length?(p(),V(b,{key:0,color:"blue"},{default:_(()=>[O(S(e.filteredLines.length)+" / "+S(e.allLines.length)+" 行 ",1)]),_:1})):k("v-if",!0)]),k(" Log Output "),d("div",z,[e.loading?(p(),g("div",A,[n(L,{size:"large"}),a[6]||(a[6]=d("div",{style:{"margin-top":"10px"}},"加载中...",-1))])):e.filteredLines.length?(p(),g("div",I,[(p(!0),g(W,null,D(e.filteredLines,(l,w)=>(p(),g("div",{key:w,class:K(["log-line",e.lineClass(l)]),innerHTML:e.highlightSearch(e.escapeHtml(l))},null,10,J))),128))])):(p(),g("div",F,S(e.error||"暂无日志内容,点击刷新加载"),1))],512)])}const $=U(P,[["render",Z],["__scopeId","data-v-8c2906e0"],["__file","/tmp/cc-web-panel-LhDQDP/repo/packages/web-panel/src/views/Logs.vue"]]);export{$ as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as i,J as A,U as I,R as s,Q as r,c as t,K as a,V as _,S as x,o as oe,b as ee,r as u,P as p,F as ne,a2 as ge}from"./vendor-BvqAck49.js";import{_ as we,b as re,u as ie,d}from"./index-T3bIqK_p.js";import{u as de}from"./useShellMode-CgR0wCYM.js";import{aM as ke,aN as Fe,aO as be,f as je,a4 as Ce,a7 as xe,as as Oe,R as Se}from"./icons-DP3uiYxy.js";const Pe={__name:"Projects",setup(se,{expose:l}){l();const{t:te}=re(),e=ie(),{isEmbedded:W}=de();async function w(o,f,ye,ae=8e3){if(W){const Z=await e.sendRaw({...f,type:o},ae);if(!Z?.ok){const $=Z?.error;throw new Error(typeof $=="string"?$:$?.message||`${o} failed`)}return Z.result}return e.executeJson(ye,ae)}const B=u(!1),y=u([]),O=u(""),S=u(""),P=u(!1),v=u(null),U=u([]),k=u(!1),L=u(!1),E=u(!1),F=u({name:"",description:"",type:"document",rootPath:""}),z=[{title:"ID",key:"id",width:110},{title:"名称",key:"name"},{title:"类型",key:"project_type",width:120},{title:"状态",key:"status",width:100},{title:"同步",key:"sync_status",width:100},{title:"更新",key:"updated_at",width:160},{title:"操作",key:"actions",width:180,fixed:"right"}],M=ee(()=>{const o={active:0,draft:0,completed:0,archived:0};for(const f of y.value)o[f.status]!==void 0&&(o[f.status]+=1);return o}),J=ee(()=>y.value.filter(o=>!(O.value&&o.status!==O.value||S.value&&!o.name.toLowerCase().includes(S.value.toLowerCase()))));function g(o){switch(o){case"active":return"green";case"draft":return"default";case"completed":return"cyan";case"archived":return"gold";default:return"default"}}function Q(o){switch(o){case"synced":return"green";case"pending":return"orange";case"conflict":return"red";case"error":return"red";default:return"default"}}function K(o){return!o&&o!==0?"-":new Date(typeof o=="number"?o:parseInt(o,10)).toLocaleString("zh-CN",{hour12:!1})}async function C(){B.value=!0;try{const o=await w("project.list",{limit:500},"project list --limit 500 --json",1e4);y.value=Array.isArray(o?.projects)?o.projects:Array.isArray(o)?o:[]}catch(o){d.error("加载失败: "+(o.message||o)),y.value=[]}finally{B.value=!1}}function G(o){return{onClick:()=>V(o)}}async function V(o){v.value=o,P.value=!0,k.value=!0,U.value=[];try{const f=await w("project.listFiles",{projectId:o.id,limit:200},`project list-files ${o.id} --json`,8e3);U.value=Array.isArray(f?.files)?f.files:[]}catch{U.value=[]}finally{k.value=!1}}async function H(o){try{(await w("project.delete",{id:o.id},`project delete ${o.id} --json`,8e3))?.ok?(d.success(`已删除项目 '${o.name}'`),P.value=!1,await C()):d.error("删除失败")}catch(f){d.error(f.message||String(f))}}function X(){F.value={name:"",description:"",type:"document",rootPath:""},L.value=!0}async function T(){if(!F.value.name.trim()){d.warning("请输入项目名称");return}E.value=!0;try{const o=await w("project.init",{name:F.value.name.trim(),description:F.value.description||null,projectType:F.value.type,rootPath:F.value.rootPath||null},`project init "${F.value.name.trim()}" --type ${F.value.type} --json`,8e3);o?.id?(d.success(`已创建项目 '${o.name}'`),L.value=!1,await C()):d.error("创建失败")}catch(o){d.error(o.message||String(o))}finally{E.value=!1}}const b=u(!1),D=u(!1),j=u({path:"",content:""}),h=u(!1),m=u(!1),R=u({path:""}),n=u(!1),c=u(null),q=u(""),Y=u(!1);function ue(){j.value={path:"",content:""},b.value=!0}function ce(){R.value={path:""},h.value=!0}async function N(){if(v.value){k.value=!0;try{const o=await w("project.listFiles",{projectId:v.value.id,limit:200},`project list-files ${v.value.id} --json`,8e3);U.value=Array.isArray(o?.files)?o.files:[]}catch(o){d.error("刷新文件失败: "+(o.message||o))}finally{k.value=!1}}}async function fe(){if(!j.value.path.trim()){d.warning("请输入文件路径");return}if(v.value){D.value=!0;try{const o=await w("project.createFile",{projectId:v.value.id,filePath:j.value.path.trim(),content:j.value.content||""},`project create-file ${v.value.id} "${j.value.path.trim()}" --json`,8e3);o?.id?(d.success(`已创建文件 '${o.file_name}'`),b.value=!1,await N(),await C()):d.error("创建文件失败")}catch(o){d.error(o.message||String(o))}finally{D.value=!1}}}async function pe(){if(!R.value.path.trim()){d.warning("请输入文件夹路径");return}if(v.value){m.value=!0;try{const o=await w("project.createFolder",{projectId:v.value.id,folderPath:R.value.path.trim()},`project create-folder ${v.value.id} "${R.value.path.trim()}" --json`,8e3);o?.id?(d.success(`已创建文件夹 '${o.file_name}'`),h.value=!1,await N(),await C()):d.error("创建文件夹失败")}catch(o){d.error(o.message||String(o))}finally{m.value=!1}}}async function ve(o){try{(await w("project.deleteFile",{fileId:o.id},`project delete-file ${o.id} --json`,8e3))?.deleted?(d.success(`已删除 '${o.file_name}'`),await N(),await C()):d.error("删除失败")}catch(f){d.error(f.message||String(f))}}async function me(o){if(o.is_folder){d.info("文件夹无内容可编辑");return}try{const f=await w("project.getFile",{fileId:o.id},`project get-file ${o.id} --json`,8e3);c.value=o,q.value=f?.content||"",n.value=!0}catch(f){d.error("读取文件失败: "+(f.message||f))}}async function _e(){if(c.value){Y.value=!0;try{(await w("project.writeFile",{fileId:c.value.id,content:q.value},`project write-file ${c.value.id} --json`,8e3))?.id?(d.success("已保存"),n.value=!1,await N()):d.error("保存失败")}catch(o){d.error(o.message||String(o))}finally{Y.value=!1}}}oe(()=>{C()});const le={t:te,ws:e,isEmbedded:W,callProjectTopic:w,loading:B,projects:y,statusFilter:O,nameFilter:S,detailOpen:P,detail:v,files:U,filesLoading:k,createOpen:L,creating:E,newProject:F,columns:z,countByStatus:M,filteredProjects:J,statusColor:g,syncColor:Q,formatTime:K,loadAll:C,onRowClick:G,openDetail:V,onDelete:H,onShowCreate:X,onCreate:T,createFileOpen:b,creatingFile:D,newFile:j,createFolderOpen:h,creatingFolder:m,newFolder:R,editFileOpen:n,editingFile:c,editFileContent:q,savingFile:Y,openCreateFile:ue,openCreateFolder:ce,refreshFiles:N,onCreateFile:fe,onCreateFolder:pe,onDeleteFile:ve,openEditFile:me,onSaveFile:_e,ref:u,computed:ee,onMounted:oe,get ReloadOutlined(){return Se},get PlusOutlined(){return Oe},get FolderOutlined(){return xe},get FileTextOutlined(){return Ce},get CheckCircleOutlined(){return je},get CheckSquareOutlined(){return be},get FileAddOutlined(){return Fe},get FolderAddOutlined(){return ke},get message(){return d},get useI18n(){return re},get useWsStore(){return ie},get useShellMode(){return de}};return Object.defineProperty(le,"__isScriptSetup",{enumerable:!1,value:!0}),le}},ze={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},he={class:"page-title"},Ae={class:"page-sub"},Ie={class:"filter-bar",style:{"margin-bottom":"12px",display:"flex",gap:"12px","align-items":"center"}},Ue={key:0,style:{"font-size":"12px",color:"#888"}},De={key:0,style:{color:"#888","font-size":"12px"}},Re={key:0},Te={key:1,style:{color:"#888"}},Be=["onClick"],Le={key:0,style:{color:"#888","font-size":"12px"}};function Ee(se,l,te,e,W,w){const B=i("router-link"),y=i("a-button"),O=i("a-space"),S=i("a-statistic"),P=i("a-card"),v=i("a-col"),U=i("a-row"),k=i("a-radio-button"),L=i("a-radio-group"),E=i("a-input-search"),F=i("a-alert"),z=i("a-tag"),M=i("a-popconfirm"),J=i("a-table"),g=i("a-descriptions-item"),Q=i("a-descriptions"),K=i("a-divider"),C=i("a-empty"),G=i("a-list-item"),V=i("a-list"),H=i("a-spin"),X=i("a-drawer"),T=i("a-input"),b=i("a-form-item"),D=i("a-textarea"),j=i("a-form"),h=i("a-modal"),m=i("a-select-option"),R=i("a-select");return p(),A("div",null,[I("div",ze,[I("div",null,[I("h2",he,s(e.t("projects.title")),1),I("p",Ae,[l[17]||(l[17]=r("桌面 / CLI / 手机 三端共享同一份项目数据,Phase 3d sync 自动同步 (",-1)),t(B,{to:"/project-init"},{default:a(()=>[...l[16]||(l[16]=[r("项目初始化 / 环境设置",-1)])]),_:1}),l[18]||(l[18]=r(")",-1))])]),t(O,null,{default:a(()=>[t(y,{loading:e.loading,onClick:e.loadAll},{icon:a(()=>[t(e.ReloadOutlined)]),default:a(()=>[l[19]||(l[19]=r(" 刷新 ",-1))]),_:1},8,["loading"]),t(y,{type:"primary",onClick:e.onShowCreate},{icon:a(()=>[t(e.PlusOutlined)]),default:a(()=>[l[20]||(l[20]=r(" 新建项目 ",-1))]),_:1})]),_:1})]),_(" Stats "),t(U,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"总项目",value:e.projects.length,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:a(()=>[t(e.FolderOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"活跃",value:e.countByStatus.active,"value-style":{color:"#52c41a",fontSize:"20px"}},{prefix:a(()=>[t(e.CheckCircleOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"草稿",value:e.countByStatus.draft,"value-style":{color:"#8c8c8c",fontSize:"20px"}},{prefix:a(()=>[t(e.FileTextOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"已完成",value:e.countByStatus.completed,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:a(()=>[t(e.CheckSquareOutlined)]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),_(" Filter "),I("div",Ie,[t(L,{value:e.statusFilter,"onUpdate:value":l[0]||(l[0]=n=>e.statusFilter=n),size:"small","button-style":"solid"},{default:a(()=>[t(k,{value:""},{default:a(()=>[...l[21]||(l[21]=[r("全部",-1)])]),_:1}),t(k,{value:"active"},{default:a(()=>[...l[22]||(l[22]=[r("活跃",-1)])]),_:1}),t(k,{value:"draft"},{default:a(()=>[...l[23]||(l[23]=[r("草稿",-1)])]),_:1}),t(k,{value:"completed"},{default:a(()=>[...l[24]||(l[24]=[r("已完成",-1)])]),_:1}),t(k,{value:"archived"},{default:a(()=>[...l[25]||(l[25]=[r("已归档",-1)])]),_:1})]),_:1},8,["value"]),t(E,{value:e.nameFilter,"onUpdate:value":l[1]||(l[1]=n=>e.nameFilter=n),placeholder:"按名称过滤",style:{"max-width":"260px"},"allow-clear":""},null,8,["value"])]),!e.projects.length&&!e.loading?(p(),x(F,{key:0,type:"info",message:"还没有项目",description:'运行 `cc project init <name>` 或点击右上角"新建项目"按钮创建。桌面 / CLI / 手机三端共享同一份数据。',"show-icon":"",style:{"margin-bottom":"16px"}})):_("v-if",!0),e.projects.length||e.loading?(p(),x(J,{key:1,columns:e.columns,"data-source":e.filteredProjects,loading:e.loading,pagination:{pageSize:20,showSizeChanger:!0},"row-key":"id","custom-row":e.onRowClick},{bodyCell:a(({column:n,record:c})=>[n.key==="id"?(p(),A("code",Ue,s(c.id.slice(0,8))+"…",1)):n.key==="name"?(p(),A(ne,{key:1},[I("strong",null,s(c.name),1),c.description?(p(),A("div",De,s(c.description),1)):_("v-if",!0)],64)):n.key==="project_type"?(p(),x(z,{key:2},{default:a(()=>[r(s(c.project_type),1)]),_:2},1024)):n.key==="status"?(p(),x(z,{key:3,color:e.statusColor(c.status)},{default:a(()=>[r(s(c.status),1)]),_:2},1032,["color"])):n.key==="sync_status"?(p(),x(z,{key:4,color:e.syncColor(c.sync_status)},{default:a(()=>[r(s(c.sync_status||"unknown"),1)]),_:2},1032,["color"])):n.key==="updated_at"?(p(),A(ne,{key:5},[r(s(e.formatTime(c.updated_at)),1)],64)):n.key==="actions"?(p(),x(O,{key:6,onClick:l[2]||(l[2]=ge(()=>{},["stop"]))},{default:a(()=>[t(y,{size:"small",onClick:q=>e.openDetail(c)},{default:a(()=>[...l[26]||(l[26]=[r("详情",-1)])]),_:1},8,["onClick"]),t(M,{title:`删除项目 '${c.name}' ?`,"ok-text":"删除","ok-type":"danger","cancel-text":"取消",onConfirm:q=>e.onDelete(c)},{default:a(()=>[t(y,{size:"small",danger:""},{default:a(()=>[...l[27]||(l[27]=[r("删除",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)):_("v-if",!0)]),_:1},8,["data-source","loading"])):_("v-if",!0),_(" Detail drawer "),t(X,{open:e.detailOpen,"onUpdate:open":l[3]||(l[3]=n=>e.detailOpen=n),title:e.detail?.name||"项目详情",width:"640",placement:"right"},{default:a(()=>[e.detail?(p(),x(Q,{key:0,column:1,bordered:"",size:"small"},{default:a(()=>[t(g,{label:"ID"},{default:a(()=>[I("code",null,s(e.detail.id),1)]),_:1}),t(g,{label:"名称"},{default:a(()=>[r(s(e.detail.name),1)]),_:1}),t(g,{label:"描述"},{default:a(()=>[r(s(e.detail.description||"-"),1)]),_:1}),t(g,{label:"类型"},{default:a(()=>[t(z,null,{default:a(()=>[r(s(e.detail.project_type),1)]),_:1})]),_:1}),t(g,{label:"状态"},{default:a(()=>[t(z,{color:e.statusColor(e.detail.status)},{default:a(()=>[r(s(e.detail.status),1)]),_:1},8,["color"])]),_:1}),t(g,{label:"同步状态"},{default:a(()=>[t(z,{color:e.syncColor(e.detail.sync_status)},{default:a(()=>[r(s(e.detail.sync_status||"unknown"),1)]),_:1},8,["color"])]),_:1}),t(g,{label:"用户"},{default:a(()=>[r(s(e.detail.user_id),1)]),_:1}),t(g,{label:"根路径"},{default:a(()=>[e.detail.root_path?(p(),A("code",Re,s(e.detail.root_path),1)):(p(),A("span",Te,"(无)"))]),_:1}),t(g,{label:"文件数"},{default:a(()=>[r(s(e.detail.file_count||0),1)]),_:1}),t(g,{label:"创建"},{default:a(()=>[r(s(e.formatTime(e.detail.created_at)),1)]),_:1}),t(g,{label:"更新"},{default:a(()=>[r(s(e.formatTime(e.detail.updated_at)),1)]),_:1})]),_:1})):_("v-if",!0),t(K,null,{default:a(()=>[...l[28]||(l[28]=[r("文件",-1)])]),_:1}),_(" Sub-phase 7.3 (2026-05-17): 文件 CRUD toolbar "),t(O,{style:{"margin-bottom":"12px"}},{default:a(()=>[t(y,{size:"small",type:"primary",disabled:!e.detail,onClick:e.openCreateFile},{default:a(()=>[t(e.FileAddOutlined),l[29]||(l[29]=r(" 新建文件 ",-1))]),_:1},8,["disabled"]),t(y,{size:"small",disabled:!e.detail,onClick:e.openCreateFolder},{default:a(()=>[t(e.FolderAddOutlined),l[30]||(l[30]=r(" 新建文件夹 ",-1))]),_:1},8,["disabled"])]),_:1}),t(H,{spinning:e.filesLoading},{default:a(()=>[!e.files.length&&!e.filesLoading?(p(),x(C,{key:0,description:"无文件 (点上方按钮新建)"})):(p(),x(V,{key:1,size:"small","data-source":e.files},{renderItem:a(({item:n})=>[t(G,null,{extra:a(()=>[t(O,null,{default:a(()=>[n.file_size?(p(),A("span",Le,s(n.file_size)+" B",1)):_("v-if",!0),t(M,{title:`删除 ${n.is_folder?"文件夹":"文件"} '${n.file_name}' ?`,"ok-text":"删除","ok-type":"danger","cancel-text":"取消",onConfirm:c=>e.onDeleteFile(n)},{default:a(()=>[t(y,{size:"small",danger:""},{default:a(()=>[...l[31]||(l[31]=[r("×",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)]),default:a(()=>[I("span",{style:{cursor:"pointer"},onClick:c=>e.openEditFile(n)},s(n.is_folder?"📁":"📄")+" "+s(n.file_path),9,Be)]),_:2},1024)]),_:1},8,["data-source"]))]),_:1},8,["spinning"])]),_:1},8,["open","title"]),_(" Sub-phase 7.3: Create file modal "),t(h,{open:e.createFileOpen,"onUpdate:open":l[6]||(l[6]=n=>e.createFileOpen=n),title:"新建文件","confirm-loading":e.creatingFile,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreateFile},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(b,{label:"文件路径(项目内)",required:""},{default:a(()=>[t(T,{value:e.newFile.path,"onUpdate:value":l[4]||(l[4]=n=>e.newFile.path=n),placeholder:"例如 README.md 或 src/main.kt"},null,8,["value"])]),_:1}),t(b,{label:"初始内容(可选)"},{default:a(()=>[t(D,{value:e.newFile.content,"onUpdate:value":l[5]||(l[5]=n=>e.newFile.content=n),rows:6,placeholder:"留空创建空文件"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),_(" Sub-phase 7.3: Create folder modal "),t(h,{open:e.createFolderOpen,"onUpdate:open":l[8]||(l[8]=n=>e.createFolderOpen=n),title:"新建文件夹","confirm-loading":e.creatingFolder,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreateFolder},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(b,{label:"文件夹路径(项目内)",required:""},{default:a(()=>[t(T,{value:e.newFolder.path,"onUpdate:value":l[7]||(l[7]=n=>e.newFolder.path=n),placeholder:"例如 src/utils"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),_(" Sub-phase 7.3: Edit file content modal "),t(h,{open:e.editFileOpen,"onUpdate:open":l[10]||(l[10]=n=>e.editFileOpen=n),title:`编辑 ${e.editingFile?.file_name||""}`,"confirm-loading":e.savingFile,"ok-text":"保存","cancel-text":"取消",onOk:e.onSaveFile,width:"720"},{default:a(()=>[t(D,{value:e.editFileContent,"onUpdate:value":l[9]||(l[9]=n=>e.editFileContent=n),rows:18,"auto-size":{minRows:12,maxRows:24},style:{"font-family":"monospace"}},null,8,["value"])]),_:1},8,["open","title","confirm-loading"]),_(" Create modal "),t(h,{open:e.createOpen,"onUpdate:open":l[15]||(l[15]=n=>e.createOpen=n),title:"新建项目","confirm-loading":e.creating,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreate},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(b,{label:"项目名称",required:""},{default:a(()=>[t(T,{value:e.newProject.name,"onUpdate:value":l[11]||(l[11]=n=>e.newProject.name=n),placeholder:"例如:旅行计划-上海"},null,8,["value"])]),_:1}),t(b,{label:"描述"},{default:a(()=>[t(D,{value:e.newProject.description,"onUpdate:value":l[12]||(l[12]=n=>e.newProject.description=n),rows:2},null,8,["value"])]),_:1}),t(b,{label:"类型"},{default:a(()=>[t(R,{value:e.newProject.type,"onUpdate:value":l[13]||(l[13]=n=>e.newProject.type=n)},{default:a(()=>[t(m,{value:"document"},{default:a(()=>[...l[32]||(l[32]=[r("文档 (document)",-1)])]),_:1}),t(m,{value:"data"},{default:a(()=>[...l[33]||(l[33]=[r("数据 (data)",-1)])]),_:1}),t(m,{value:"web"},{default:a(()=>[...l[34]||(l[34]=[r("Web",-1)])]),_:1}),t(m,{value:"app"},{default:a(()=>[...l[35]||(l[35]=[r("应用 (app)",-1)])]),_:1}),t(m,{value:"presentation"},{default:a(()=>[...l[36]||(l[36]=[r("演示文稿",-1)])]),_:1}),t(m,{value:"spreadsheet"},{default:a(()=>[...l[37]||(l[37]=[r("表格",-1)])]),_:1}),t(m,{value:"design"},{default:a(()=>[...l[38]||(l[38]=[r("设计",-1)])]),_:1}),t(m,{value:"code"},{default:a(()=>[...l[39]||(l[39]=[r("代码",-1)])]),_:1}),t(m,{value:"workflow"},{default:a(()=>[...l[40]||(l[40]=[r("工作流",-1)])]),_:1}),t(m,{value:"knowledge"},{default:a(()=>[...l[41]||(l[41]=[r("知识库",-1)])]),_:1})]),_:1},8,["value"])]),_:1}),t(b,{label:"根路径 (可选)"},{default:a(()=>[t(T,{value:e.newProject.rootPath,"onUpdate:value":l[14]||(l[14]=n=>e.newProject.rootPath=n),placeholder:"留空则仅元数据"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"])])}const We=we(Pe,[["render",Ee],["__scopeId","data-v-019ac5aa"],["__file","/tmp/cc-web-panel-LhDQDP/repo/packages/web-panel/src/views/Projects.vue"]]);export{We 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-T3bIqK_p.js";import{I as z,J as x,U as _,Q as P,S as K,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(D=>({seq:D.seq,data:ae(D.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 D(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}),L=new p.FitAddon;m.loadAddon(L),m.open(b);try{L.fit()}catch{}t.xterm=m,t.fitAddon=L;const ie=m.onData(v=>{s.stdin(t.id,v).catch(g=>{String(g?.message||"").includes("dangerous_keyword_blocked")?V.warning("该命令被桌面端拦截(高危关键字)"):V.error("stdin 失败: "+(g?.message||g))})}),ce=s.onStdout(t.id,({data:v,seq:g})=>{t.lastSeq=g,m.write(v)}),de=s.onExit(t.id,({exitCode:v,signal:g})=>{t.alive=!1,t.exitCode=v,t.signal=g,m.writeln(`\r
|
|
3
|
-
\x1B[33m[session exited, code=${v}, signal=${g??"-"}]\x1B[0m`)});t.offs=()=>{try{ie.dispose?.()}catch{}ce(),de()};try{const{chunks:v,truncated:g}=await s.history(t.id,0);g&&m.writeln("\x1B[2m[history truncated — earlier output was evicted]\x1B[0m");for(const J of v)m.write(J.data),t.lastSeq=J.seq}catch(v){m.writeln(`\x1B[31m[history fetch failed: ${v?.message||v}]\x1B[0m`)}const j=new ResizeObserver(()=>{try{L.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 Q(){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 Q()}),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 X={term:s,sessions:e,activeId:i,newShell:w,creating:u,loadingList:d,error:f,warning:n,xtermContainers:a,shellOptions:r,active:h,shortId:D,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:Q,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(X,"__isScriptSetup",{enumerable:!1,value:!0}),X}},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"},De=["data-session-id"],Le={key:0,class:"xterm-placeholder"},Pe={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]=P(" 桌面端托管的 PTY 会话;Android 端可远程操控同一通道 ",-1)),e.warning?(y(),K(u,{key:0,color:"orange",style:{"margin-left":"8px"}},{default:T(()=>[P(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]=P(" 新会话 ",-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]=P(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),e.error?(y(),K(a,{key:0,message:e.error,type:"error","show-icon":"",closable:"",style:{"margin-bottom":"12px"},onClose:o[1]||(o[1]=r=>e.error="")},null,8,["message"])):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,De)),[[_e,r.id===e.activeId]])),128)),e.sessions.length===0?(y(),x("div",Le,[...o[6]||(o[6]=[_("span",null,"无活跃会话",-1)])])):R("v-if",!0)])]),e.active?(y(),x("div",Pe,[_("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-LhDQDP/repo/packages/web-panel/src/views/Terminal.vue"]]);export{Fe as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{E as H,r as S,I as v,J as k,U as C,R as u,c as r,K as n,o as B,b as D,P as f,Q as g,S as L,_ as K,a2 as Q,F as $,Z as A,V as F}from"./vendor-BvqAck49.js";import{u as T,_ as x,b as M,d as y}from"./index-T3bIqK_p.js";import{u as V}from"./useFs-BOX2ddKh.js";import{R as G,as as Y}from"./icons-DP3uiYxy.js";import"./useShellMode-CgR0wCYM.js";const q=H("workflow",()=>{const t=T(),c=S([]),p=S(null),e=S([]),i=S("idle"),O=S(!1),w=S(null);async function P(){O.value=!0,w.value=null;try{await t.waitConnected();const l=await t.sendRaw({type:"workflow-list"});return c.value=Array.isArray(l.workflows)?l.workflows:[],c.value}catch(l){throw w.value=l.message,l}finally{O.value=!1}}async function U(l){await t.waitConnected();const d=await t.sendRaw({type:"workflow-get",id:l});return p.value=d.workflow||null,p.value}async function J(l){await t.waitConnected();const d=await t.sendRaw({type:"workflow-save",workflow:l});if(d.saved){const m=c.value.findIndex(o=>o.id===l.id);m>=0?c.value.splice(m,1,l):c.value.push(l)}return d}async function R(l){await t.waitConnected();const d=await t.sendRaw({type:"workflow-remove",id:l});return d.removed&&(c.value=c.value.filter(m=>m.id!==l)),d}async function z(l,{onEvent:d}={}){await t.waitConnected(),e.value=[],i.value="running";const m=t.onMessage(o=>{!o||typeof o.type!="string"||o.type.startsWith("workflow:")&&(e.value.push(o),d&&d(o),o.type==="workflow:done"&&(i.value=o.status||"completed"))});try{return await t.sendRaw({type:"workflow-run",id:l},12e4)}catch(o){throw i.value="failed",w.value=o.message,o}finally{m()}}function W(l){const d=[];if(!l||typeof l!="object")return{valid:!1,errors:["workflow must be an object"]};if(l.id||d.push("id required"),l.name||d.push("name required"),!Array.isArray(l.steps)||l.steps.length===0)d.push("steps required");else{let h=function(s){a.set(s,E);for(const I of o.get(s)||[]){if(!o.has(I)){d.push(`unknown dependency: ${I}`);continue}const j=a.get(I);if(j===E){d.push(`cycle via ${s} -> ${I}`);return}j===_&&h(I)}a.set(s,N)};const m=new Set;for(const s of l.steps)s.id||d.push("step.id required"),m.has(s.id)&&d.push(`duplicate step id: ${s.id}`),m.add(s.id);const o=new Map;for(const s of l.steps)o.set(s.id,s.dependsOn||[]);const _=0,E=1,N=2,a=new Map([...o.keys()].map(s=>[s,_]));for(const s of o.keys())a.get(s)===_&&h(s)}return{valid:d.length===0,errors:d}}function b(l){return JSON.stringify(l,null,2)}return{workflows:c,current:p,runEvents:e,runStatus:i,loading:O,error:w,list:P,get:U,save:J,remove:R,run:z,validateLocal:W,exportJson:b}}),Z={__name:"WorkflowEditor",setup(t,{expose:c}){c();const{t:p}=M(),e=q(),i=S(null),O=S(!1),w=D(()=>i.value?e.validateLocal(i.value):null);B(()=>e.list().catch(()=>{}));function P(){i.value={id:"",name:"",description:"",steps:[{id:"step1",message:"",dependsOn:[]}]}}async function U(o){try{const _=await e.get(o);_&&(i.value=JSON.parse(JSON.stringify(_)),i.value.steps||(i.value.steps=[]))}catch(_){y.error(p("workflow.msg.loadFailed",{err:_.message}))}}function J(){i.value.steps||(i.value.steps=[]),i.value.steps.push({id:`step${i.value.steps.length+1}`,message:"",dependsOn:[]})}function R(o){i.value.steps.splice(o,1)}async function z(){const o=e.validateLocal(i.value);if(!o.valid){y.error(o.errors[0]);return}try{await e.save(i.value),y.success(p("workflow.msg.saveSuccess"))}catch(_){y.error(p("workflow.msg.saveFailed",{err:_.message}))}}async function W(o){try{await e.remove(o),i.value?.id===o&&(i.value=null),y.success(p("workflow.msg.deleteSuccess"))}catch(_){y.error(p("workflow.msg.deleteFailed",{err:_.message}))}}async function b(){O.value=!0;try{await e.run(i.value.id),y.success(p("workflow.msg.runSuccess",{status:e.runStatus}))}catch(o){y.error(p("workflow.msg.runFailed",{err:o.message}))}finally{O.value=!1}}const l=V();async function d(){try{const o=await l.saveJson(JSON.parse(e.exportJson(i.value)),{defaultPath:`${i.value.id||"workflow"}.json`});if(o.canceled)return;o.path&&y.success(p("workflow.msg.exportSuccess",{path:o.path}))}catch(o){y.error(p("workflow.msg.exportFailed",{err:o.message}))}}const m={t:p,store:e,current:i,running:O,validation:w,newWorkflow:P,selectWorkflow:U,addStep:J,removeStep:R,saveCurrent:z,removeOne:W,runCurrent:b,fs:l,exportJson:d,ref:S,computed:D,onMounted:B,get useWorkflowStore(){return q},get useFs(){return V},get PlusOutlined(){return Y},get ReloadOutlined(){return G},get message(){return y},get useI18n(){return M}};return Object.defineProperty(m,"__isScriptSetup",{enumerable:!1,value:!0}),m}},X={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},ee={class:"page-title"},te={class:"page-sub"},oe={style:{flex:"1"}},ae={style:{"font-weight":"500"}},le={style:{color:"#888","font-size":"12px"}},re={style:{color:"#888","font-size":"12px"}},ne={key:0,style:{"margin-top":"12px",color:"#d32f2f"}},se={style:{color:"#1976d2"}},ie={key:0},de={key:1},ue={key:2,style:{color:"#555"}};function ce(t,c,p,e,i,O){const w=v("a-button"),P=v("a-space"),U=v("a-empty"),J=v("a-list-item"),R=v("a-list"),z=v("a-card"),W=v("a-col"),b=v("a-input"),l=v("a-form-item"),d=v("a-divider"),m=v("a-select"),o=v("a-input-group"),_=v("a-textarea"),E=v("a-form"),N=v("a-row");return f(),k("div",null,[C("div",X,[C("div",null,[C("h2",ee,u(t.$t("workflow.title")),1),C("p",te,u(t.$t("workflow.subtitle")),1)]),r(P,null,{default:n(()=>[r(w,{onClick:e.newWorkflow,type:"primary"},{icon:n(()=>[r(e.PlusOutlined)]),default:n(()=>[g(" "+u(t.$t("workflow.new")),1)]),_:1}),r(w,{ghost:"",loading:e.store.loading,onClick:c[0]||(c[0]=a=>e.store.list())},{icon:n(()=>[r(e.ReloadOutlined)]),default:n(()=>[g(" "+u(t.$t("workflow.refresh")),1)]),_:1},8,["loading"])]),_:1})]),r(N,{gutter:16},{default:n(()=>[r(W,{span:8},{default:n(()=>[r(z,{title:t.$t("workflow.list.title"),size:"small"},{default:n(()=>[e.store.workflows.length?(f(),L(R,{key:1,"data-source":e.store.workflows,size:"small"},{renderItem:n(({item:a})=>[r(J,{class:K({active:e.current?.id===a.id}),style:{cursor:"pointer"},onClick:h=>e.selectWorkflow(a.id)},{default:n(()=>[C("div",oe,[C("div",ae,u(a.name||a.id),1),C("div",le,u(t.$t("workflow.list.stepCount",{n:(a.steps||[]).length})),1)]),r(w,{size:"small",danger:"",type:"text",onClick:Q(h=>e.removeOne(a.id),["stop"])},{default:n(()=>[g(u(t.$t("workflow.list.delete")),1)]),_:1},8,["onClick"])]),_:2},1032,["class","onClick"])]),_:1},8,["data-source"])):(f(),L(U,{key:0,description:t.$t("workflow.list.empty")},null,8,["description"]))]),_:1},8,["title"])]),_:1}),r(W,{span:16},{default:n(()=>[e.current?(f(),L(z,{key:0,size:"small"},{title:n(()=>[g(u(t.$t("workflow.editor.headerPrefix"))+" "+u(e.current.name||e.current.id),1)]),extra:n(()=>[r(P,null,{default:n(()=>[r(w,{size:"small",onClick:e.exportJson},{default:n(()=>[g(u(t.$t("workflow.editor.exportJson")),1)]),_:1}),r(w,{size:"small",loading:e.running,onClick:e.runCurrent,disabled:!e.current.id},{default:n(()=>[g(u(t.$t("workflow.editor.run")),1)]),_:1},8,["loading","disabled"]),r(w,{size:"small",type:"primary",onClick:e.saveCurrent},{default:n(()=>[g(u(t.$t("workflow.editor.save")),1)]),_:1})]),_:1})]),default:n(()=>[r(E,{layout:"vertical",model:e.current},{default:n(()=>[r(l,{label:t.$t("workflow.editor.idLabel")},{default:n(()=>[r(b,{value:e.current.id,"onUpdate:value":c[1]||(c[1]=a=>e.current.id=a),placeholder:t.$t("workflow.editor.idPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),r(l,{label:t.$t("workflow.editor.nameLabel")},{default:n(()=>[r(b,{value:e.current.name,"onUpdate:value":c[2]||(c[2]=a=>e.current.name=a),placeholder:t.$t("workflow.editor.namePlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),r(l,{label:t.$t("workflow.editor.descLabel")},{default:n(()=>[r(b,{value:e.current.description,"onUpdate:value":c[3]||(c[3]=a=>e.current.description=a),placeholder:t.$t("workflow.editor.descPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),r(d,null,{default:n(()=>[g(u(t.$t("workflow.editor.stepsDivider")),1)]),_:1}),(f(!0),k($,null,A(e.current.steps,(a,h)=>(f(),k("div",{key:h,class:"step-card"},[r(P,{style:{width:"100%","margin-bottom":"8px"},direction:"vertical"},{default:n(()=>[r(o,{compact:""},{default:n(()=>[r(b,{value:a.id,"onUpdate:value":s=>a.id=s,placeholder:t.$t("workflow.editor.stepIdPlaceholder"),style:{width:"30%"}},null,8,["value","onUpdate:value","placeholder"]),r(m,{value:a.dependsOn,"onUpdate:value":s=>a.dependsOn=s,mode:"tags",placeholder:t.$t("workflow.editor.dependsOnPlaceholder"),style:{width:"70%"}},null,8,["value","onUpdate:value","placeholder"])]),_:2},1024),r(_,{value:a.message,"onUpdate:value":s=>a.message=s,rows:2,placeholder:t.$t("workflow.editor.messagePlaceholder")},null,8,["value","onUpdate:value","placeholder"]),r(b,{value:a.when,"onUpdate:value":s=>a.when=s,placeholder:t.$t("workflow.editor.whenPlaceholder")},null,8,["value","onUpdate:value","placeholder"]),r(P,null,{default:n(()=>[r(w,{size:"small",danger:"",onClick:s=>e.removeStep(h)},{default:n(()=>[g(u(t.$t("workflow.editor.stepDelete")),1)]),_:1},8,["onClick"]),C("span",re,u(t.$t("workflow.editor.stepCounter",{idx:h+1,total:e.current.steps.length})),1)]),_:2},1024)]),_:2},1024)]))),128)),r(w,{block:"",onClick:e.addStep},{default:n(()=>[g(u(t.$t("workflow.editor.addStep")),1)]),_:1})]),_:1},8,["model"]),e.validation&&!e.validation.valid?(f(),k("div",ne,[(f(!0),k($,null,A(e.validation.errors,a=>(f(),k("div",{key:a},"• "+u(a),1))),128))])):F("v-if",!0)]),_:1})):(f(),L(z,{key:1,size:"small"},{default:n(()=>[r(U,{description:t.$t("workflow.editor.emptyHint")},null,8,["description"])]),_:1})),e.store.runEvents.length?(f(),L(z,{key:2,size:"small",title:t.$t("workflow.runLog.title"),style:{"margin-top":"12px"}},{default:n(()=>[(f(!0),k($,null,A(e.store.runEvents,(a,h)=>(f(),k("div",{key:h,style:{"font-family":"monospace","font-size":"12px","margin-bottom":"4px"}},[C("span",se,u(a.type),1),a.stepId?(f(),k("span",ie," ["+u(a.stepId)+"]",1)):F("v-if",!0),a.status?(f(),k("span",de," → "+u(a.status),1)):F("v-if",!0),a.summary?(f(),k("span",ue," — "+u(a.summary),1)):F("v-if",!0)]))),128))]),_:1},8,["title"])):F("v-if",!0)]),_:1})]),_:1})])}const _e=x(Z,[["render",ce],["__scopeId","data-v-93cd2fd3"],["__file","/tmp/cc-web-panel-LhDQDP/repo/packages/web-panel/src/views/WorkflowEditor.vue"]]);export{_e as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{O as r}from"./index-T3bIqK_p.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-DLiTF5LY.js";import{U as t}from"./index-T3bIqK_p.js";import"./vendor-BvqAck49.js";import"./responsiveObserve-BAVGAvRQ.js";import"./useFlexGapSupport-CYMMs-_Q.js";import"./styleChecker-DH2SLtPg.js";import"./index-DadPmrxI.js";import"./icons-DP3uiYxy.js";const l=t(o);export{l as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as o}from"./Col-DMBwmqyZ.js";import{U as t}from"./index-T3bIqK_p.js";import"./vendor-BvqAck49.js";import"./index-DadPmrxI.js";import"./icons-DP3uiYxy.js";const s=t(o);export{s as default};
|