chainlesschain 0.166.40 → 0.166.42
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-BK9J9OWp.js → AIOps-CdsAAOAu.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-LPNZQqBA.js → ActionButton-B8x5S-3u.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-Bc4GSjWD.js → Analytics-C1eOGwSM.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DvOI0V4E.js → AppLayout-CdnpAzuo.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-Dk84hXbN.js → Artifacts-B0tiKn2i.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-q1LFnus7.js → Audit-DzGqTUvG.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-CwalUYLs.js → BackgroundAgents-CMXYcy56.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DklgvW1G.js → Backup-DrN3N1_7.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BUwoeDOX.js → BaseInput-BC9aoifZ.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-DbHcDB_8.js → Chat-F3Z9p0vk.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-vEtAN7ar.js → ChatBubbleRenderer-LMGrVg9Z.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-BhshLHuh.js → Checkbox-CDXlouzl.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CrqH-uBK.js → Codegen-9c0RpaYc.js} +1 -1
- package/src/assets/web-panel/assets/{Col-CTHhv3KN.js → Col-C-60iGia.js} +1 -1
- package/src/assets/web-panel/assets/{Community-BXTvtMJe.js → Community-DXE04H2M.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BpvJtxF1.js → Compact-B4jEuBmH.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CpMouPia.js → Compliance-uf13-dcK.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-C7yp3_hW.js → Cowork-D6hpxLI4.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-C-XxPYai.js → Cron-CSJobmkN.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CMdyqfrL.js → Crosschain-B0_rTlsi.js} +1 -1
- package/src/assets/web-panel/assets/{DID-kuaHK2dq.js → DID-D49FQsiZ.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DH2-ms5o.js → Dashboard-BvjvIYfC.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DXLZ0jjH.js → Dropdown-BYe1gODU.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-DK86nfd5.js → EmailListRenderer-CJ6znfiH.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-CRKmGOug.js → FamilyGuardDashboard-BnoKDllh.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DKK3wIGA.js → Federation-AqhVFmd4.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CUGNKN_D.js → FormItemContext-CNVYBpNg.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-CA0GwYSK.js → GenericCardRenderer-BbdYCfjH.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CFm46B43.js → Git-B_xClOR0.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CfOa3K-_.js → Governance-CIKCDF9F.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-C4C6jHDC.js → Inference-BdRSc0oa.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-D5IhrCDs.js → KnowledgeGraph-DknpIQPx.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BNeyeUIr.js → Logs-BcCPhMaZ.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-H_GkKEp-.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-0pLshxdU.js → Marketplace-DEMNuvwO.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DK4FG-4k.js → McpTools-D-tg9wfq.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-CQfkhP-b.js → Memory-BqCLu-X9.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-pbinAwCm.js → MobileBridge-bN6vwbZc.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-CWqK_5p8.js → MobileProjects-BTM0-1MZ.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-B-OQ9yid.js → Mtc-CcGXXyEn.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-Cp6iZgrT.js → MtcAudit-B2Z5wPnM.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-D9cQONHI.js → Multisig-DNW7dKam.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-BUY0rZvc.js → NLProgramming-Ciz-g5G3.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CsXIIMCf.js → Notes-CeiEA6yF.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-C6qIk1ej.js → NotificationSettings-DgeiEPwB.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-Cz3qay2q.js → OrderTableRenderer-D9DjubGK.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-Cs0gsc4U.js → Organization-CeA2EC_G.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-C3ZfbqPx.js → Overflow-DT40ig7t.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-D1lxB22Z.js → P2P-K4H13K3M.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-SNHvZvv_.js → PdhVaultBrowser-CF7TzZmx.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-CFSk6KJV.js → Permissions-DYQogL6r.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-puvpUUGe.js → PersonalDataHub-DXhXVHar.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-BMqYweJm.js → Pipeline-DQMdn5Ij.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-C0sXA71u.js → Privacy-BiF1thop.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-ClaKClvs.js → ProjectInit-C2ptWEn7.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CtHJp6_9.js → ProjectSettings-B5WCiDZD.js} +2 -2
- package/src/assets/web-panel/assets/Projects-BNH6LKU6.js +1 -0
- package/src/assets/web-panel/assets/{Providers-crByRu10.js → Providers-CgRJ8ZT1.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-BKO9i7Sy.js → QrScannerModal-B3tuNJ3V.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-1IdXt4pm.js → QuickAsk-D9CO1SNI.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DiQwZD6r.js → Recommend-BGmwHY_U.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DesjH6lx.js → RemoteSession-CliYaolm.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-b-nY3pul.js → Reputation-sCiX2kmm.js} +1 -1
- package/src/assets/web-panel/assets/{Row-Bt7nCF5s.js → Row-DXHx_bk0.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-CcTg4JEQ.js → RssFeed-Bg79mIxI.js} +3 -3
- package/src/assets/web-panel/assets/{Search-C2uI3GFe.js → Search-CnKDYqyS.js} +1 -1
- package/src/assets/web-panel/assets/{Security-3NrvV4g1.js → Security-c-0QOrC2.js} +3 -3
- package/src/assets/web-panel/assets/{Services-B1cKHgYr.js → Services-BBBTb4YA.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-BTZdEKX3.js → Skeleton-CtL_5fJe.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-Bi_Zy8Ru.js → Skills-DvqrC2_v.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-CR2gW1OA.js → Sla-C5LGNImz.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-Bphe-fh1.js → SpeechSettings-Btx0KgwX.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-C64DsCjZ.js → SyncSettings-DFLNSWuu.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-Btkyo0G7.js +1 -0
- package/src/assets/web-panel/assets/{Templates-DGfS0ZAF.js → Templates-CIIt_k5J.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-D6ank4rT.js → Tenant-Nqo1PA2a.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-MBMZ_5Gz.js → Terminal-CGwV9hW9.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-C_u6JjZi.js → TimelineRenderer-Bu3xrXyf.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-CqmhScSK.js → Tokens-3bC3zrYj.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-D1B9cX1b.js → Trigger-DG84V7Xf.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-D_P3Mfbl.js → Trust-rPhNXoYJ.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CUASyjWb.js → UkeySign-CamNxeAp.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-eGLhjeJX.js → VideoEditing-CkIuH4Gm.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-Dba_6QCL.js → Wallet-SD5W5uHT.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-CiAEtYZZ.js → WebAuthn--A4Sddxn.js} +2 -2
- package/src/assets/web-panel/assets/{WorkflowEditor-D-zW3rph.js → WorkflowEditor-Ca7qvch8.js} +1 -1
- package/src/assets/web-panel/assets/{chat-DEzJInHX.js → chat-i8OBdjCB.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DM6Ke3hD.js → colors-BeYbJKQ8.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-CAMIx_cM.js → compact-item-BqpF-Sya.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BrbtMPOW.js → createContext-qXTb29t3.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DATyiD_X.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-tnV_CKFU.js → hasIn-DOfL0KSW.js} +1 -1
- package/src/assets/web-panel/assets/{index-A3azg5vi.js → index--TQi5102.js} +1 -1
- package/src/assets/web-panel/assets/{index-Oi0LTcjV.js → index-0OxY_Nsh.js} +1 -1
- package/src/assets/web-panel/assets/{index-DH6MvJcX.js → index-B00rNoIx.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cx3S7Z4l.js → index-B177TAO-.js} +1 -1
- package/src/assets/web-panel/assets/{index-QhkpDqBl.js → index-BD386d6M.js} +1 -1
- package/src/assets/web-panel/assets/{index-BJ8Yd5W8.js → index-BKd03Rn4.js} +1 -1
- package/src/assets/web-panel/assets/{index-CaCQEvVe.js → index-BOwR6mHU.js} +1 -1
- package/src/assets/web-panel/assets/{index-BeC4Jmxn.js → index-BYzQaGnV.js} +1 -1
- package/src/assets/web-panel/assets/{index-BzuFmNOf.js → index-BdbrE-hz.js} +1 -1
- package/src/assets/web-panel/assets/{index-CVJ67rg0.js → index-BmzmjSGb.js} +1 -1
- package/src/assets/web-panel/assets/{index-DBYM7wpW.js → index-Bt7Ua7EC.js} +1 -1
- package/src/assets/web-panel/assets/{index-cJQlyKYg.js → index-BuzGZOAK.js} +1 -1
- package/src/assets/web-panel/assets/{index-xqyMxX6r.js → index-ByHZkqj5.js} +1 -1
- package/src/assets/web-panel/assets/{index-D57Rt85L.js → index-Byn_IHXR.js} +1 -1
- package/src/assets/web-panel/assets/{index-DJPjCj-L.js → index-C-P0NHi4.js} +1 -1
- package/src/assets/web-panel/assets/{index-MxrGcqPa.js → index-C13IM9lj.js} +1 -1
- package/src/assets/web-panel/assets/{index-B5glieXV.js → index-C4_8KnUt.js} +1 -1
- package/src/assets/web-panel/assets/{index-BZVDnMvs.js → index-CH7mHJoh.js} +1 -1
- package/src/assets/web-panel/assets/{index-DI1yJrlv.js → index-CLrDyxeZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-D1SsqpBQ.js → index-CXXeOim8.js} +1 -1
- package/src/assets/web-panel/assets/{index-Br1t2LsA.js → index-CebShwk1.js} +1 -1
- package/src/assets/web-panel/assets/{index-BIkQL-F7.js → index-Cvig0IjN.js} +1 -1
- package/src/assets/web-panel/assets/{index-mtzwU2IE.js → index-Cy8WApMp.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_aGo7Y_.js → index-D8c3Ctj4.js} +1 -1
- package/src/assets/web-panel/assets/{index-nDxVFSLd.js → index-DCcXU9HN.js} +3 -3
- package/src/assets/web-panel/assets/{index-BbdSgz4e.js → index-DIikgsI1.js} +1 -1
- package/src/assets/web-panel/assets/{index-BfGYDWyS.js → index-DWLxMPZ_.js} +1 -1
- package/src/assets/web-panel/assets/{index-CVij36sN.js → index-Dio2mTWq.js} +1 -1
- package/src/assets/web-panel/assets/index-DmzMCELP.js +1 -0
- package/src/assets/web-panel/assets/{index-D2X5hC5X.js → index-GGEsF-NA.js} +1 -1
- package/src/assets/web-panel/assets/{index-D4-jekkQ.js → index-JxyF4KNw.js} +1 -1
- package/src/assets/web-panel/assets/{index-B6KWb2WQ.js → index-TAvlGp5l.js} +1 -1
- package/src/assets/web-panel/assets/index-TlPg2Jz6.js +1 -0
- package/src/assets/web-panel/assets/{index-gOfw5W--.js → index-X8TXf9Bb.js} +1 -1
- package/src/assets/web-panel/assets/{index-yi_liTJn.js → index-czHvbhS0.js} +1 -1
- package/src/assets/web-panel/assets/{index-9o6JlqCH.js → index-nl9IxLfv.js} +1 -1
- package/src/assets/web-panel/assets/{index-BuSXesCq.js → index-rdW8KX_7.js} +1 -1
- package/src/assets/web-panel/assets/{index-TiClDP9o.js → index-vNYrAXO6.js} +1 -1
- package/src/assets/web-panel/assets/{index-mxqufmW1.js → index-zmvw3Ptl.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-CVHDph1O.js → initDefaultProps-BKpYiODg.js} +1 -1
- package/src/assets/web-panel/assets/{motion-CElqp9xA.js → motion-DJ2p-V-R.js} +1 -1
- package/src/assets/web-panel/assets/{move-XZw1bQmy.js → move-CmA2ejm5.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-SGviFxRK.js → mtc-parser-CAIGxQzN.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BGKRrIHI.js → omit-DJlnhA7K.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BuJYHAWJ.js → pickAttrs-CZPrJyhF.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-TVa4r_EM.js → placementArrow-CXy74okE.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DVPWQMuO.js → responsiveObserve-DexkLtci.js} +1 -1
- package/src/assets/web-panel/assets/{slide-BeOL-UpA.js → slide-BzjBJbPV.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DNYqZCQQ.js → statusUtils-gnHIXw2X.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-DRx9GRig.js → styleChecker-DHBjT1Gk.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-Daqz3PDA.js → useFlexGapSupport-BmMStW87.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-C6A7nr7V.js → useFs-BcV5VGA2.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-D5hwRSvC.js → usePersonalDataHub-DBxxRRY2.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CHXMdIU3.js → vnode-Bt5yp9hj.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-sl0JxyZz.js → zoom-CMdUkOfw.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/data/changelog.json +26 -0
- package/src/lib/pr-close-intent.js +64 -0
- package/src/lib/pr-investigation-policy.js +42 -0
- package/src/lib/read-file-loop-guard.js +20 -0
- package/src/lib/remote-read-loop-guard.js +53 -7
- package/src/lib/task-progress-tracker.js +62 -3
- package/src/runtime/agent-core.js +218 -27
- package/src/assets/web-panel/assets/MarkdownRenderer-XsLyxgz8.js +0 -1
- package/src/assets/web-panel/assets/Projects-HuPL4QZa.js +0 -1
- package/src/assets/web-panel/assets/Tasks-D18Px4aF.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DQGZAYxC.js +0 -1
- package/src/assets/web-panel/assets/index-C9a56Oco.js +0 -1
- package/src/assets/web-panel/assets/index-CU5eDYYp.js +0 -1
|
@@ -22,6 +22,16 @@ import {
|
|
|
22
22
|
} from "../lib/read-file-page.js";
|
|
23
23
|
import { ReadFileLoopGuard } from "../lib/read-file-loop-guard.js";
|
|
24
24
|
import { RemoteReadLoopGuard } from "../lib/remote-read-loop-guard.js";
|
|
25
|
+
import {
|
|
26
|
+
isPrActionRequest,
|
|
27
|
+
PR_ACTION_GUIDANCE,
|
|
28
|
+
PR_INVESTIGATION_LIMIT,
|
|
29
|
+
PR_INVESTIGATION_EXIT_GUIDANCE,
|
|
30
|
+
} from "../lib/pr-investigation-policy.js";
|
|
31
|
+
import {
|
|
32
|
+
findExplicitPrCloseIntent,
|
|
33
|
+
prCloseActionDirective,
|
|
34
|
+
} from "../lib/pr-close-intent.js";
|
|
25
35
|
import {
|
|
26
36
|
TaskProgressTracker,
|
|
27
37
|
TASK_RECOVERY_TOOLS,
|
|
@@ -13412,6 +13422,75 @@ function extractInitialPromptText(messages) {
|
|
|
13412
13422
|
return "";
|
|
13413
13423
|
}
|
|
13414
13424
|
|
|
13425
|
+
function isPrClosureReadCommand(name, args) {
|
|
13426
|
+
if (name !== "run_shell" || typeof args?.command !== "string") return false;
|
|
13427
|
+
const command = args.command;
|
|
13428
|
+
if (/(?:^|[\s;&|])gh(?:\.exe)?\s+pr\s+(?:list|view|diff)\b/iu.test(command))
|
|
13429
|
+
return true;
|
|
13430
|
+
return (
|
|
13431
|
+
/(?:^|[\s;&|])gh(?:\.exe)?\s+api\b/iu.test(command) &&
|
|
13432
|
+
/(?:\/|\b)repos\/[\w.-]+\/[\w.-]+\/(?:pulls(?:\/|\?|\s|$)|compare\/|releases(?:\?|\s|$))/iu.test(
|
|
13433
|
+
command,
|
|
13434
|
+
)
|
|
13435
|
+
);
|
|
13436
|
+
}
|
|
13437
|
+
|
|
13438
|
+
function isPrCloseCommand(name, args) {
|
|
13439
|
+
return (
|
|
13440
|
+
name === "run_shell" &&
|
|
13441
|
+
typeof args?.command === "string" &&
|
|
13442
|
+
/(?:^|[\s;&|])gh(?:\.exe)?\s+pr\s+close\b/iu.test(args.command)
|
|
13443
|
+
);
|
|
13444
|
+
}
|
|
13445
|
+
|
|
13446
|
+
function didSucceed(result) {
|
|
13447
|
+
return !(
|
|
13448
|
+
!result ||
|
|
13449
|
+
result.error ||
|
|
13450
|
+
result.success === false ||
|
|
13451
|
+
result.isError === true ||
|
|
13452
|
+
(Number.isInteger(result.exitCode) && result.exitCode !== 0) ||
|
|
13453
|
+
(Number.isInteger(result.exit_code) && result.exit_code !== 0) ||
|
|
13454
|
+
result.status === "running"
|
|
13455
|
+
);
|
|
13456
|
+
}
|
|
13457
|
+
|
|
13458
|
+
class ExplicitPrCloseActionGuard {
|
|
13459
|
+
constructor(enabled) {
|
|
13460
|
+
this.enabled = enabled;
|
|
13461
|
+
this.readsBeforeClose = 0;
|
|
13462
|
+
this.closeSucceeded = false;
|
|
13463
|
+
}
|
|
13464
|
+
|
|
13465
|
+
admission(name, args) {
|
|
13466
|
+
if (
|
|
13467
|
+
!this.enabled ||
|
|
13468
|
+
this.closeSucceeded ||
|
|
13469
|
+
!isPrClosureReadCommand(name, args)
|
|
13470
|
+
)
|
|
13471
|
+
return null;
|
|
13472
|
+
// One list plus one focused state lookup can establish a candidate and
|
|
13473
|
+
// current state. More comparison/release archaeology is not a prerequisite
|
|
13474
|
+
// for the user's explicit close instruction.
|
|
13475
|
+
if (this.readsBeforeClose++ < 2) return null;
|
|
13476
|
+
return {
|
|
13477
|
+
error:
|
|
13478
|
+
"[PR closure action required] The user explicitly requested closure, but repeated PR reads are continuing before any successful gh pr close. This read was not run.",
|
|
13479
|
+
code: "CC_PR_CLOSE_ACTION_REQUIRED",
|
|
13480
|
+
hint: "Use gh pr close <number> --repo <owner/repo> for an already-established target, then verify state with gh pr view <number> --repo <owner/repo> --json number,state,closedAt. Do not resume gh api compare/release investigation.",
|
|
13481
|
+
policy: {
|
|
13482
|
+
decision: "blocked",
|
|
13483
|
+
via: "explicit-pr-close-action-guard",
|
|
13484
|
+
},
|
|
13485
|
+
};
|
|
13486
|
+
}
|
|
13487
|
+
|
|
13488
|
+
record(name, args, result) {
|
|
13489
|
+
if (isPrCloseCommand(name, args) && didSucceed(result))
|
|
13490
|
+
this.closeSucceeded = true;
|
|
13491
|
+
}
|
|
13492
|
+
}
|
|
13493
|
+
|
|
13415
13494
|
/**
|
|
13416
13495
|
* Stable id for a permission GATE decision, so a denied/gated tool span can be
|
|
13417
13496
|
* correlated with the decision that blocked it. Only gated results carry a
|
|
@@ -13863,6 +13942,16 @@ export async function* agentLoop(messages, options) {
|
|
|
13863
13942
|
let emptyThinkingReprompted = false;
|
|
13864
13943
|
const readFileLoopGuard = new ReadFileLoopGuard();
|
|
13865
13944
|
const remoteReadLoopGuard = new RemoteReadLoopGuard();
|
|
13945
|
+
const prActionTask = isPrActionRequest(messages);
|
|
13946
|
+
// Keep an explicit user-requested PR close action alive even if the
|
|
13947
|
+
// conversation is compacted down to tool evidence. It is guidance only;
|
|
13948
|
+
// the ordinary execution approval remains mandatory for every close.
|
|
13949
|
+
const prCloseDirective = prCloseActionDirective(
|
|
13950
|
+
findExplicitPrCloseIntent(messages),
|
|
13951
|
+
);
|
|
13952
|
+
const explicitPrCloseActionGuard = new ExplicitPrCloseActionGuard(
|
|
13953
|
+
Boolean(prCloseDirective),
|
|
13954
|
+
);
|
|
13866
13955
|
toolContext.readFileLoopGuard = readFileLoopGuard;
|
|
13867
13956
|
let lastTaskProgressIntervention = null;
|
|
13868
13957
|
|
|
@@ -14468,8 +14557,15 @@ export async function* agentLoop(messages, options) {
|
|
|
14468
14557
|
const newProgressIntervention =
|
|
14469
14558
|
progressIntervention &&
|
|
14470
14559
|
progressIntervention.key !== lastTaskProgressIntervention;
|
|
14471
|
-
|
|
14472
|
-
|
|
14560
|
+
// Warnings are deduplicated, recovery is not. A search or failed command
|
|
14561
|
+
// must not restore broad discovery on the very next model request.
|
|
14562
|
+
const taskRecoveryTurn = progressIntervention?.recovery === true;
|
|
14563
|
+
const prInvestigationExhausted =
|
|
14564
|
+
prActionTask &&
|
|
14565
|
+
taskProgressTracker.explorationCalls >= PR_INVESTIGATION_LIMIT;
|
|
14566
|
+
const taskRecoveryTools = TASK_RECOVERY_TOOLS.filter(
|
|
14567
|
+
(tool) => tool !== "read_file" || !readFileLoopGuard.hasUnreadPages,
|
|
14568
|
+
);
|
|
14473
14569
|
if (newProgressIntervention) {
|
|
14474
14570
|
lastTaskProgressIntervention = progressIntervention.key;
|
|
14475
14571
|
// Reuse the existing warning event so CLI, REPL and IDE clients all show
|
|
@@ -14479,24 +14575,31 @@ export async function* agentLoop(messages, options) {
|
|
|
14479
14575
|
message:
|
|
14480
14576
|
progressIntervention.message +
|
|
14481
14577
|
(taskRecoveryTurn
|
|
14482
|
-
? " Broad reading and new delegation
|
|
14578
|
+
? " Broad reading, web discovery and new delegation remain paused until an actionable tool outcome."
|
|
14483
14579
|
: ""),
|
|
14484
14580
|
};
|
|
14485
14581
|
}
|
|
14486
|
-
const
|
|
14487
|
-
readRecoveryTurn
|
|
14488
|
-
|
|
14489
|
-
|
|
14490
|
-
|
|
14491
|
-
|
|
14492
|
-
|
|
14493
|
-
|
|
14494
|
-
|
|
14495
|
-
|
|
14496
|
-
|
|
14497
|
-
|
|
14498
|
-
|
|
14499
|
-
|
|
14582
|
+
const pausedTools = new Set([
|
|
14583
|
+
...(readRecoveryTurn ? ["read_file"] : []),
|
|
14584
|
+
...(taskRecoveryTurn ? taskRecoveryTools : []),
|
|
14585
|
+
...remoteRecoveryTools,
|
|
14586
|
+
...(prInvestigationExhausted
|
|
14587
|
+
? getEffectiveToolDefinitions(effectiveToolOptions).map(
|
|
14588
|
+
(tool) => tool.function.name,
|
|
14589
|
+
)
|
|
14590
|
+
: []),
|
|
14591
|
+
]);
|
|
14592
|
+
const iterationToolOptions = pausedTools.size
|
|
14593
|
+
? {
|
|
14594
|
+
...effectiveToolOptions,
|
|
14595
|
+
disabledTools: [
|
|
14596
|
+
...new Set([
|
|
14597
|
+
...(effectiveToolOptions.disabledTools || []),
|
|
14598
|
+
...pausedTools,
|
|
14599
|
+
]),
|
|
14600
|
+
],
|
|
14601
|
+
}
|
|
14602
|
+
: effectiveToolOptions;
|
|
14500
14603
|
const readContext = [
|
|
14501
14604
|
readFileLoopGuard.findingsHint,
|
|
14502
14605
|
readFileLoopGuard.progressHint,
|
|
@@ -14546,7 +14649,20 @@ export async function* agentLoop(messages, options) {
|
|
|
14546
14649
|
}
|
|
14547
14650
|
}
|
|
14548
14651
|
const contextMemoryTrustedSystemIndexes = [];
|
|
14549
|
-
if (
|
|
14652
|
+
if (prActionTask && !prInvestigationExhausted) {
|
|
14653
|
+
callMessages = [
|
|
14654
|
+
...callMessages,
|
|
14655
|
+
{
|
|
14656
|
+
role: "system",
|
|
14657
|
+
content: PR_ACTION_GUIDANCE,
|
|
14658
|
+
},
|
|
14659
|
+
];
|
|
14660
|
+
contextMemoryTrustedSystemIndexes.push(callMessages.length - 1);
|
|
14661
|
+
}
|
|
14662
|
+
if (
|
|
14663
|
+
!prInvestigationExhausted &&
|
|
14664
|
+
(remoteReadLoopGuard.recoveryHint || remoteReadLoopGuard.workflowHint)
|
|
14665
|
+
) {
|
|
14550
14666
|
callMessages = [
|
|
14551
14667
|
...callMessages,
|
|
14552
14668
|
{
|
|
@@ -14561,7 +14677,14 @@ export async function* agentLoop(messages, options) {
|
|
|
14561
14677
|
];
|
|
14562
14678
|
contextMemoryTrustedSystemIndexes.push(callMessages.length - 1);
|
|
14563
14679
|
}
|
|
14564
|
-
if (
|
|
14680
|
+
if (prCloseDirective && !prInvestigationExhausted) {
|
|
14681
|
+
callMessages = [
|
|
14682
|
+
...callMessages,
|
|
14683
|
+
{ role: "system", content: prCloseDirective },
|
|
14684
|
+
];
|
|
14685
|
+
contextMemoryTrustedSystemIndexes.push(callMessages.length - 1);
|
|
14686
|
+
}
|
|
14687
|
+
if (progressIntervention && !prInvestigationExhausted) {
|
|
14565
14688
|
callMessages = [
|
|
14566
14689
|
...callMessages,
|
|
14567
14690
|
{
|
|
@@ -14569,13 +14692,13 @@ export async function* agentLoop(messages, options) {
|
|
|
14569
14692
|
content:
|
|
14570
14693
|
progressIntervention.guidance +
|
|
14571
14694
|
(taskRecoveryTurn
|
|
14572
|
-
?
|
|
14695
|
+
? ` Recovery remains active: ${taskRecoveryTools.join(", ")} are omitted until an actionable tool outcome. Only unfinished, already-started file scans may continue; new whole-file discovery is paused. Focused search, authorized changes and verification remain available.`
|
|
14573
14696
|
: ""),
|
|
14574
14697
|
},
|
|
14575
14698
|
];
|
|
14576
14699
|
contextMemoryTrustedSystemIndexes.push(callMessages.length - 1);
|
|
14577
14700
|
}
|
|
14578
|
-
if (readRecoveryTurn) {
|
|
14701
|
+
if (readRecoveryTurn && !prInvestigationExhausted) {
|
|
14579
14702
|
callMessages = [
|
|
14580
14703
|
...callMessages,
|
|
14581
14704
|
{
|
|
@@ -14586,7 +14709,7 @@ export async function* agentLoop(messages, options) {
|
|
|
14586
14709
|
];
|
|
14587
14710
|
contextMemoryTrustedSystemIndexes.push(callMessages.length - 1);
|
|
14588
14711
|
}
|
|
14589
|
-
if (readFileLoopGuard.recoveryHint) {
|
|
14712
|
+
if (readFileLoopGuard.recoveryHint && !prInvestigationExhausted) {
|
|
14590
14713
|
callMessages = [
|
|
14591
14714
|
...callMessages,
|
|
14592
14715
|
{ role: "system", content: readFileLoopGuard.recoveryHint },
|
|
@@ -14616,6 +14739,14 @@ export async function* agentLoop(messages, options) {
|
|
|
14616
14739
|
}
|
|
14617
14740
|
}
|
|
14618
14741
|
|
|
14742
|
+
if (prInvestigationExhausted) {
|
|
14743
|
+
callMessages = [
|
|
14744
|
+
...callMessages,
|
|
14745
|
+
{ role: "system", content: PR_INVESTIGATION_EXIT_GUIDANCE },
|
|
14746
|
+
];
|
|
14747
|
+
contextMemoryTrustedSystemIndexes.push(callMessages.length - 1);
|
|
14748
|
+
}
|
|
14749
|
+
|
|
14619
14750
|
// Per-span unified ids (P2 observability): the run-level default attributes
|
|
14620
14751
|
// stamp session/agent/workflow ids on every span, but turn/prompt ids are
|
|
14621
14752
|
// per-iteration. A "turn" is one model iteration of the run; "prompt" is the
|
|
@@ -14841,6 +14972,38 @@ export async function* agentLoop(messages, options) {
|
|
|
14841
14972
|
}
|
|
14842
14973
|
|
|
14843
14974
|
const toolCalls = msg.tool_calls;
|
|
14975
|
+
if (prInvestigationExhausted) {
|
|
14976
|
+
// Exactly one synthesis request, even if the provider ignores the empty
|
|
14977
|
+
// tool set or a Stop hook normally asks to continue. Settle usage first;
|
|
14978
|
+
// do not insert unexecuted calls or turn a safety stop into completion.
|
|
14979
|
+
await _awaitBackgroundUsageSettlement(
|
|
14980
|
+
backgroundSubAgents,
|
|
14981
|
+
backgroundUsageFailureState,
|
|
14982
|
+
);
|
|
14983
|
+
yield* _drainSubAgentUsage(subAgentUsageSink);
|
|
14984
|
+
if (toolCalls?.length) {
|
|
14985
|
+
const error = new Error(
|
|
14986
|
+
"PR investigation stopped after repeated exploration without an actionable outcome; the task is incomplete. " +
|
|
14987
|
+
"The model requested more tools after the final synthesis instruction. Retained evidence: " +
|
|
14988
|
+
(
|
|
14989
|
+
taskProgressTracker.checkpointFor(runId) ||
|
|
14990
|
+
remoteReadLoopGuard.findingsHint ||
|
|
14991
|
+
"No verified findings."
|
|
14992
|
+
).slice(0, 2000),
|
|
14993
|
+
);
|
|
14994
|
+
error.code = "CC_AGENT_PR_INVESTIGATION_STALLED";
|
|
14995
|
+
throw error;
|
|
14996
|
+
}
|
|
14997
|
+
yield {
|
|
14998
|
+
type: "response-complete",
|
|
14999
|
+
content:
|
|
15000
|
+
"PR investigation stopped without completing the task.\n\n" +
|
|
15001
|
+
(msg.content ||
|
|
15002
|
+
"No actionable outcome was produced; use the retained findings to identify the missing prerequisite."),
|
|
15003
|
+
};
|
|
15004
|
+
yield { type: "run-ended", runId, reason: "pr-investigation-stalled" };
|
|
15005
|
+
return;
|
|
15006
|
+
}
|
|
14844
15007
|
if (Array.isArray(toolCalls) && toolCalls.length > 0) {
|
|
14845
15008
|
// Allocate missing provider IDs once, before transcript insertion and
|
|
14846
15009
|
// any evidence or execution boundary. This is only local correlation,
|
|
@@ -15043,11 +15206,13 @@ export async function* agentLoop(messages, options) {
|
|
|
15043
15206
|
// falls through to the strictly sequential loop below.
|
|
15044
15207
|
const parallelReads =
|
|
15045
15208
|
options.parallelReadOnlyTools !== false &&
|
|
15209
|
+
!taskRecoveryTurn &&
|
|
15046
15210
|
toolCalls.length > 1 &&
|
|
15047
15211
|
!toolContext.permissionConfirm &&
|
|
15048
15212
|
toolCalls.every(
|
|
15049
15213
|
(c) =>
|
|
15050
15214
|
typeof c?.function?.name === "string" &&
|
|
15215
|
+
!pausedTools.has(c.function.name) &&
|
|
15051
15216
|
_CHECKPOINT_READ_ONLY.has(c.function.name),
|
|
15052
15217
|
);
|
|
15053
15218
|
if (parallelReads) {
|
|
@@ -15273,12 +15438,37 @@ export async function* agentLoop(messages, options) {
|
|
|
15273
15438
|
// Capability and exact-path authority must settle before any checkpoint,
|
|
15274
15439
|
// hook, or observationally stronger `tool-executing` event. The same
|
|
15275
15440
|
// preflight runs again inside executeTool to prevent call-site drift.
|
|
15276
|
-
const earlyAuthorityDenial =
|
|
15277
|
-
toolName
|
|
15278
|
-
|
|
15279
|
-
|
|
15280
|
-
|
|
15441
|
+
const earlyAuthorityDenial =
|
|
15442
|
+
(pausedTools.has(toolName) ||
|
|
15443
|
+
(taskRecoveryTurn &&
|
|
15444
|
+
toolName === "read_file" &&
|
|
15445
|
+
!(
|
|
15446
|
+
typeof toolArgs?.path === "string" &&
|
|
15447
|
+
readFileLoopGuard.canContinue(
|
|
15448
|
+
path.resolve(toolContext.cwd || process.cwd(), toolArgs.path),
|
|
15449
|
+
toolArgs,
|
|
15450
|
+
)
|
|
15451
|
+
))
|
|
15452
|
+
? {
|
|
15453
|
+
success: false,
|
|
15454
|
+
code: "CC_TOOL_RECOVERY_PAUSED",
|
|
15455
|
+
error: `${toolName} is paused for loop recovery and was not executed. Use retained findings for an authorized action or report the specific blocker; do not repeat or disguise this call.`,
|
|
15456
|
+
}
|
|
15457
|
+
: null) ||
|
|
15458
|
+
explicitPrCloseActionGuard.admission(toolName, toolArgs) ||
|
|
15459
|
+
preflightToolExecutionAuthority(toolName, toolArgs, toolContext);
|
|
15281
15460
|
if (earlyAuthorityDenial) {
|
|
15461
|
+
remoteReadLoopGuard.record(toolName, earlyAuthorityDenial, toolArgs);
|
|
15462
|
+
readFileLoopGuard.record(
|
|
15463
|
+
toolName,
|
|
15464
|
+
earlyAuthorityDenial,
|
|
15465
|
+
taskProgressTracker.record(
|
|
15466
|
+
toolName,
|
|
15467
|
+
earlyAuthorityDenial,
|
|
15468
|
+
toolArgs,
|
|
15469
|
+
runId,
|
|
15470
|
+
),
|
|
15471
|
+
);
|
|
15282
15472
|
const resultStr = capToolResultString(
|
|
15283
15473
|
safeStringifyToolResult(earlyAuthorityDenial),
|
|
15284
15474
|
);
|
|
@@ -15623,6 +15813,7 @@ export async function* agentLoop(messages, options) {
|
|
|
15623
15813
|
// mid-content slice). See MAX_TOOL_RESULT_CHARS / capToolResultString.
|
|
15624
15814
|
const resultStr = toolResultForModel(toolName, toolResult, messages);
|
|
15625
15815
|
remoteReadLoopGuard.record(toolName, toolResult, toolArgs);
|
|
15816
|
+
explicitPrCloseActionGuard.record(toolName, toolArgs, toolResult);
|
|
15626
15817
|
readFileLoopGuard.record(
|
|
15627
15818
|
toolName,
|
|
15628
15819
|
toolResult,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{P as c,J as p,b as s}from"./vendor-Bn1JzzAn.js";import{r as a}from"./markdown-Yo_c6Krv.js";import{_ as d}from"./index-nDxVFSLd.js";const _={__name:"MarkdownRenderer",props:{content:{type:String,default:""}},setup(t,{expose:o}){o();const e=t,r=s(()=>a(e.content||"")),n={props:e,rendered:r,computed:s,get renderMarkdown(){return a}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}},i=["innerHTML"];function m(t,o,e,r,n,u){return c(),p("div",{class:"markdown-content",innerHTML:r.rendered},null,8,i)}const b=d(_,[["render",m],["__scopeId","data-v-0b0b9f63"],["__file","/tmp/cc-web-panel-JH3JUb/repo/packages/web-panel/src/components/MarkdownRenderer.vue"]]);export{b as M};
|
|
@@ -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-Bn1JzzAn.js";import{_ as we,b as re,u as ie,d}from"./index-nDxVFSLd.js";import{u as de}from"./useShellMode-CgR0wCYM.js";import{aN as ke,aO as be,aP as Fe,f as je,a5 as Ce,a8 as xe,at as Oe,R as Se}from"./icons-DG5UD-6K.js";const Pe={__name:"Projects",setup(se,{expose:l}){l();const{t:te}=re(),e=ie(),{isEmbedded:M}=de();async function w(o,f,ye,ae=8e3){if(M){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),h=u([]),k=u(!1),E=u(!1),L=u(!1),b=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"}],V=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}),W=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 H(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 Q(o){return{onClick:()=>J(o)}}async function J(o){v.value=o,P.value=!0,k.value=!0,h.value=[];try{const f=await w("project.listFiles",{projectId:o.id,limit:200},`project list-files ${o.id} --json`,8e3);h.value=Array.isArray(f?.files)?f.files:[]}catch{h.value=[]}finally{k.value=!1}}async function G(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(){b.value={name:"",description:"",type:"document",rootPath:""},E.value=!0}async function T(){if(!b.value.name.trim()){d.warning("请输入项目名称");return}L.value=!0;try{const o=await w("project.init",{name:b.value.name.trim(),description:b.value.description||null,projectType:b.value.type,rootPath:b.value.rootPath||null},`project init "${b.value.name.trim()}" --type ${b.value.type} --json`,8e3);o?.id?(d.success(`已创建项目 '${o.name}'`),E.value=!1,await C()):d.error("创建失败")}catch(o){d.error(o.message||String(o))}finally{L.value=!1}}const F=u(!1),D=u(!1),j=u({path:"",content:""}),U=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:""},F.value=!0}function ce(){R.value={path:""},U.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);h.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}'`),F.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}'`),U.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:M,callProjectTopic:w,loading:B,projects:y,statusFilter:O,nameFilter:S,detailOpen:P,detail:v,files:h,filesLoading:k,createOpen:E,creating:L,newProject:b,columns:z,countByStatus:V,filteredProjects:W,statusColor:g,syncColor:H,formatTime:K,loadAll:C,onRowClick:Q,openDetail:J,onDelete:G,onShowCreate:X,onCreate:T,createFileOpen:F,creatingFile:D,newFile:j,createFolderOpen:U,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 Fe},get FileAddOutlined(){return be},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"}},Ue={class:"page-title"},Ae={class:"page-sub"},Ie={class:"filter-bar",style:{"margin-bottom":"12px",display:"flex",gap:"12px","align-items":"center"}},he={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"],Ee={key:0,style:{color:"#888","font-size":"12px"}};function Le(se,l,te,e,M,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"),h=i("a-row"),k=i("a-radio-button"),E=i("a-radio-group"),L=i("a-input-search"),b=i("a-alert"),z=i("a-tag"),V=i("a-popconfirm"),W=i("a-table"),g=i("a-descriptions-item"),H=i("a-descriptions"),K=i("a-divider"),C=i("a-empty"),Q=i("a-list-item"),J=i("a-list"),G=i("a-spin"),X=i("a-drawer"),T=i("a-input"),F=i("a-form-item"),D=i("a-textarea"),j=i("a-form"),U=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",Ue,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(h,{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(E,{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(L,{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(b,{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(W,{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",he,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(V,{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(H,{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(G,{spinning:e.filesLoading},{default:a(()=>[!e.files.length&&!e.filesLoading?(p(),x(C,{key:0,description:"无文件 (点上方按钮新建)"})):(p(),x(J,{key:1,size:"small","data-source":e.files},{renderItem:a(({item:n})=>[t(Q,null,{extra:a(()=>[t(O,null,{default:a(()=>[n.file_size?(p(),A("span",Ee,s(n.file_size)+" B",1)):_("v-if",!0),t(V,{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(U,{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(F,{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(F,{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(U,{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(F,{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(U,{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(U,{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(F,{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(F,{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(F,{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(F,{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 Me=we(Pe,[["render",Le],["__scopeId","data-v-019ac5aa"],["__file","/tmp/cc-web-panel-JH3JUb/repo/packages/web-panel/src/views/Projects.vue"]]);export{Me as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{E as F,b as D,r as R,I as p,J as c,U as _,c as n,K as a,S as C,V as b,o as I,x as V,P as i,Q as k,R as r,F as x,Z as O}from"./vendor-Bn1JzzAn.js";import{u as P,_ as U}from"./index-nDxVFSLd.js";import{R as E}from"./icons-DG5UD-6K.js";const B=F("tasks",()=>{const y=R([]),l=R(!1);let u=null,t=null,d=null;const T=D(()=>y.value.filter(e=>e.status==="running")),v=D(()=>y.value.filter(e=>e.status==="pending")),w=D(()=>y.value.filter(e=>e.status==="completed"||e.status==="failed"||e.status==="timeout"));async function s(){const e=P();l.value=!0;try{const g=await e.sendRaw({type:"tasks-list"});g&&Array.isArray(g.tasks)&&(y.value=g.tasks)}catch{}finally{l.value=!1}}async function m(e){const g=P();try{await g.sendRaw({type:"tasks-stop",taskId:e})}catch{}finally{await s()}}const f=R(null);function h(e=5e3){N(),s(),u=setInterval(s,e),S()}function N(){u&&(clearInterval(u),u=null),t&&(t(),t=null),d&&(clearTimeout(d),d=null)}function S(){const e=P();if(t)return;const g=z=>{z.type==="task:notification"&&z.payload?.task&&(f.value=z.payload.task,s(),d&&clearTimeout(d),d=setTimeout(()=>{f.value=null,d=null},8e3))};t=e.onRuntimeEvent(g)}function A(e){return!e||e<0?"-":e<1e3?`${e}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${(e/6e4).toFixed(1)}m`}function o(e){switch(e){case"running":return"processing";case"pending":return"default";case"completed":return"success";case"failed":return"error";case"timeout":return"warning";default:return"default"}}return{tasks:y,loading:l,running:T,pending:v,completed:w,lastNotification:f,fetchTasks:s,stopTask:m,startPolling:h,stopPolling:N,formatDuration:A,getStatusColor:o}}),J={__name:"Tasks",setup(y,{expose:l}){l();const u=B(),t=[{title:"状态",key:"status",width:90},{title:"描述",key:"description",ellipsis:!0},{title:"类型",dataIndex:"type",width:100},{title:"耗时",key:"duration",width:90},{title:"创建时间",key:"createdAt",width:180},{title:"结果",key:"result",ellipsis:!0},{title:"操作",key:"action",width:80}];function d(s){return s.status==="running"&&s.startedAt?u.formatDuration(Date.now()-s.startedAt):s.completedAt&&s.startedAt?u.formatDuration(s.completedAt-s.startedAt):"-"}function T(s){return s?new Date(s).toLocaleString():"-"}function v(s,m){return s?s.length>m?`${s.slice(0,m)}...`:s:""}I(()=>u.startPolling(5e3)),V(()=>u.stopPolling());const w={store:u,columns:t,getDuration:d,formatTime:T,truncate:v,onMounted:I,onUnmounted:V,get ReloadOutlined(){return E},get useTasksStore(){return B}};return Object.defineProperty(w,"__isScriptSetup",{enumerable:!1,value:!0}),w}},L={class:"page-header"},j={key:0,class:"error-text"},H={key:1},K={class:"task-header"},M={class:"task-desc"},Q={class:"task-id"},W={class:"task-meta"},Z=["title"],q={key:0,class:"error-text"},G={key:1,class:"success-text"},X={key:2,class:"muted-text"};function Y(y,l,u,t,d,T){const v=p("a-button"),w=p("a-space"),s=p("a-alert"),m=p("a-statistic"),f=p("a-card"),h=p("a-col"),N=p("a-row"),S=p("a-tag"),A=p("a-table");return i(),c("div",null,[_("div",L,[l[3]||(l[3]=_("div",null,[_("h2",{class:"page-title"},"后台任务"),_("p",{class:"page-sub"},"查看后台任务队列、实时通知和任务执行结果。")],-1)),n(w,null,{default:a(()=>[n(v,{ghost:"",loading:t.store.loading,onClick:l[0]||(l[0]=o=>t.store.fetchTasks())},{icon:a(()=>[n(t.ReloadOutlined)]),default:a(()=>[l[2]||(l[2]=k(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),t.store.lastNotification?(i(),C(s,{key:0,type:t.store.lastNotification.status==="completed"?"success":"error","show-icon":"",closable:"",class:"banner",onClose:l[1]||(l[1]=o=>t.store.lastNotification=null)},{message:a(()=>[k(" 任务"+r(t.store.lastNotification.status==="completed"?"完成":"结束")+": "+r(t.store.lastNotification.description||t.store.lastNotification.id.slice(0,16)),1)]),description:a(()=>[t.store.lastNotification.error?(i(),c("span",j,r(t.store.lastNotification.error),1)):t.store.lastNotification.result?(i(),c("span",H,r(t.truncate(String(t.store.lastNotification.result),120)),1)):b("v-if",!0)]),_:1},8,["type"])):b("v-if",!0),n(N,{gutter:[16,16],class:"stats-row"},{default:a(()=>[n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"全部任务",value:t.store.tasks.length},null,8,["value"])]),_:1})]),_:1}),n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"运行中",value:t.store.running.length},null,8,["value"])]),_:1})]),_:1}),n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"等待中",value:t.store.pending.length},null,8,["value"])]),_:1})]),_:1}),n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"已完成",value:t.store.completed.length},null,8,["value"])]),_:1})]),_:1})]),_:1}),t.store.running.length>0?(i(),C(f,{key:1,title:"运行中的任务",class:"panel-card",size:"small"},{default:a(()=>[(i(!0),c(x,null,O(t.store.running,o=>(i(),c("div",{key:o.id,class:"task-item running"},[_("div",K,[n(S,{color:t.store.getStatusColor(o.status)},{default:a(()=>[k(r(o.status.toUpperCase()),1)]),_:2},1032,["color"]),_("span",M,r(o.description),1),_("span",Q,r(o.id.slice(0,16)),1)]),_("div",W,[_("span",null,"类型: "+r(o.type||"-"),1),_("span",null,"已运行: "+r(t.store.formatDuration(Date.now()-o.startedAt)),1),n(v,{size:"small",danger:"",onClick:e=>t.store.stopTask(o.id)},{default:a(()=>[...l[4]||(l[4]=[k("停止",-1)])]),_:1},8,["onClick"])])]))),128))]),_:1})):b("v-if",!0),n(f,{class:"panel-card"},{default:a(()=>[n(A,{columns:t.columns,"data-source":t.store.tasks,pagination:{pageSize:15,size:"small"},loading:t.store.loading,"row-key":"id",size:"small"},{bodyCell:a(({column:o,record:e})=>[o.key==="status"?(i(),C(S,{key:0,color:t.store.getStatusColor(e.status)},{default:a(()=>[k(r(e.status),1)]),_:2},1032,["color"])):o.key==="description"?(i(),c("span",{key:1,title:e.command},r(e.description),9,Z)):o.key==="duration"?(i(),c(x,{key:2},[k(r(t.getDuration(e)),1)],64)):o.key==="createdAt"?(i(),c(x,{key:3},[k(r(t.formatTime(e.createdAt)),1)],64)):o.key==="result"?(i(),c(x,{key:4},[e.error?(i(),c("span",q,r(t.truncate(e.error,60)),1)):e.result?(i(),c("span",G,r(t.truncate(String(e.result),60)),1)):(i(),c("span",X,"-"))],64)):o.key==="action"?(i(),c(x,{key:5},[e.status==="running"?(i(),C(v,{key:0,size:"small",danger:"",onClick:g=>t.store.stopTask(e.id)},{default:a(()=>[...l[5]||(l[5]=[k(" 停止 ",-1)])]),_:1},8,["onClick"])):b("v-if",!0)],64)):b("v-if",!0)]),_:1},8,["data-source","loading"])]),_:1})])}const st=U(J,[["render",Y],["__scopeId","data-v-da5ff6a2"],["__file","/tmp/cc-web-panel-JH3JUb/repo/packages/web-panel/src/views/Tasks.vue"]]);export{st as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Q as r}from"./index-nDxVFSLd.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-Bt7nCF5s.js";import{a0 as t}from"./index-nDxVFSLd.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-DVPWQMuO.js";import"./useFlexGapSupport-Daqz3PDA.js";import"./styleChecker-DRx9GRig.js";import"./index-BbdSgz4e.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as o}from"./Col-CTHhv3KN.js";import{a0 as t}from"./index-nDxVFSLd.js";import"./vendor-Bn1JzzAn.js";import"./index-BbdSgz4e.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};
|