chainlesschain 0.166.99 → 0.166.100
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/README.md +7 -8
- package/package.json +1 -1
- package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
- package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-BUgaCgVU.js → AIOps-Cd4iUOPt.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-b0MpUSSZ.js → ActionButton--ucr-zko.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-hbXTvHqO.js → Analytics-DbejYMWk.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-CLQoAVu4.js → AppLayout-CLgKxeGw.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-ytHzl2L2.js → Artifacts-CTT5BIL5.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-BuhkLm0C.js → Audit-DP-WBWe9.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-CS81hxZV.js → BackgroundAgents-B6VqheJk.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DzR-_Qvi.js → Backup-VWJK5zim.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-r8Ku_lYw.js → BaseInput-YGFO9RHd.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-C3Uxtoaa.js → Chat-CVfydnCd.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-BICpB-qU.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-BnG2P5yc.js → Checkbox-Bd5vKRMk.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-BdgU6HZy.js → Codegen-DHNgPHvg.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DT8t9wmf.js → Col-CA2BYQ8T.js} +1 -1
- package/src/assets/web-panel/assets/{Community-ChkxR5oe.js → Community-DnKJ-qpI.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DIwLeTk3.js → Compact-C9BZ8t4r.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CAqzGLvW.js → Compliance-ByyQ2FOl.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-Bb3jejMG.js → Cowork-rXTwXE_c.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-BYRkZLta.js → Cron-BuW-HODy.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BD6z227t.js → Crosschain-OudNtbYW.js} +1 -1
- package/src/assets/web-panel/assets/{DID-DA3G5Wgo.js → DID-BQ6BxYNN.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-yaZePHOu.js → Dashboard-Cz5HG8tz.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BqY5MBx2.js → Dropdown-BzclHOVv.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-cIWwOgHm.js → EmailListRenderer-CbJETFdy.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-zvV6ymca.js → EvolutionSettings-Dx_pJG3d.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-CAmh1U2b.js → FamilyGuardDashboard-6JCS1MNg.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-5qd2LCg8.js → Federation-BrPkMYaf.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-Bdkj1sRJ.js → FormItemContext-Bhc9pobs.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-B-gWN2P3.js → GenericCardRenderer-BxOh07uQ.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BEMh_NGd.js → Git-D_idoujr.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-qLGvA2Hw.js → Governance-ZGfIRE-x.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-DblBwYuW.js → Inference-DpAmcwbw.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-BISegVD_.js → KnowledgeGraph-D1S1UTgP.js} +1 -1
- package/src/assets/web-panel/assets/Logs-2sc8V5XV.js +2 -0
- package/src/assets/web-panel/assets/MarkdownRenderer-575jjYE6.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-CHKXMOkH.js → Marketplace-0xlFUKbe.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-B5G1elqd.js → McpTools-D25eJLGm.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-O5Ib0uTR.js → Memory-BLRGd9hM.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BaGYL7rT.js → MobileBridge-zpFINGzn.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-Cbyd-8kx.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-CNjJ97jg.js → Mtc-DgXgUlHc.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-DjBN-Wqz.js → MtcAudit-DzcL-dKH.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-B850R9lO.js → Multisig-C3OrZ6VN.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Bn8sbFfV.js → NLProgramming-Bqp_vWA7.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-BpLmMp3Q.js → Notes-Dyn45-Ht.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-Dbk97rjb.js → NotificationSettings-CLjafGZr.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-BOBX_I72.js → OrderTableRenderer-Bx8wMauC.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-B45DpOuE.js → Organization-5gr9hyLm.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-DmKH7eer.js → Overflow-BRdU02hT.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CC4FaXTl.js → P2P-DIi7fzh6.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-C2SgP4PI.js → PdhVaultBrowser-BCbS1KpA.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-BQB4QFj_.js → Permissions-BjeP9VtA.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-Dy6GGpn4.js → PersonalDataHub-y8PXOQUc.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-B9HB5pRc.js → Pipeline-B0fL5uxY.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-D7pOmg-p.js → Privacy-C8jCDn8Z.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-DglBqvec.js → ProjectInit-B_L6Dc6V.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-Bho22znM.js → ProjectSettings-Bb1CYbZh.js} +2 -2
- package/src/assets/web-panel/assets/Projects-CUSV10Cn.js +1 -0
- package/src/assets/web-panel/assets/{Providers-BgAgo1Yr.js → Providers-mBSTDJ0E.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-C2fBjCC8.js → QrScannerModal-CHxgalvt.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-C8MiF-rk.js → QuickAsk-DI9KIMEV.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-D_TzHdQf.js → Recommend-B5_zW1JH.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-BHO7b6xE.js → RemoteSession-BkH4bmM5.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-BPxNmNhD.js → Reputation-DJrAqwAq.js} +1 -1
- package/src/assets/web-panel/assets/{Row-fwhot5Bk.js → Row-xZ3MAM34.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-CZbD1B-5.js → RssFeed-CCsrLLiu.js} +3 -3
- package/src/assets/web-panel/assets/{Search-BRs6YpAE.js → Search-CTCRKvaP.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CB344tKC.js → Security-D7joyfp2.js} +4 -4
- package/src/assets/web-panel/assets/{Services-Beo-7fEl.js → Services-oqHPmTG4.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CDXx96vD.js → Skeleton-BR_32bTG.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-b-mQTJK4.js → Skills-BoRz9mln.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-BvjP-IS9.js → Sla-UAGUHZ9b.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-C6wsV-cO.js → SpeechSettings-DeP_rMgv.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-BQZoko-e.js → SyncSettings-CSzzMmeA.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-6Z0rJJVO.js → Tasks-CcqOLsLB.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-Cc9IXtEQ.js → Templates-cDbkGSDG.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-BLc7AjOI.js → Tenant-DmOy58cq.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-CUN49v85.js → Terminal-CsRZH5vr.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-CX-SksHN.js → TimelineRenderer-BgJrk6HG.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-Btrm0-rK.js → Tokens-CCQglKDE.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-CIboUvKe.js → Trigger-t-Gt3oBY.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-Rv9jEs5v.js → Trust-DQgu2kI0.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-B_xomdD5.js → UkeySign-Cod2WUGj.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-CrvWeMow.js → VideoEditing-SGN5zaVK.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BjvWgk_7.js → Wallet-CnLEL-LD.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-CwfpFw92.js → WebAuthn-C2keUpD6.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-Dkk2QsOe.js → WorkflowEditor-B1GvrwWJ.js} +1 -1
- package/src/assets/web-panel/assets/{chat-Dah1DVes.js → chat-1E9_P_qY.js} +1 -1
- package/src/assets/web-panel/assets/{colors-JEpgQ10k.js → colors-DuU6Os4q.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item--DuG_cxf.js → compact-item-C5NfOAcM.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BJ_GZvon.js → createContext-D4Fxz9qQ.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-zDWbYMr7.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-yZRLDmWK.js → hasIn-C6C49iFk.js} +1 -1
- package/src/assets/web-panel/assets/{index-rkvSOceQ.js → index-AO6iDCSL.js} +1 -1
- package/src/assets/web-panel/assets/{index-DemMuw7n.js → index-B-bb-R99.js} +1 -1
- package/src/assets/web-panel/assets/{index-CjuD8smQ.js → index-B5lzRoHp.js} +1 -1
- package/src/assets/web-panel/assets/{index-DxnkldGo.js → index-BBVqlelF.js} +1 -1
- package/src/assets/web-panel/assets/index-BPBsZZnT.js +1 -0
- package/src/assets/web-panel/assets/{index-C56b8e9s.js → index-BU5mPkNX.js} +1 -1
- package/src/assets/web-panel/assets/{index-DddwZCT9.js → index-BULggEX6.js} +1 -1
- package/src/assets/web-panel/assets/{index-1QZASeW1.js → index-BVE2wCeb.js} +1 -1
- package/src/assets/web-panel/assets/{index-kZE-K3ZO.js → index-BYg1dtne.js} +1 -1
- package/src/assets/web-panel/assets/{index-DFJbJ8rs.js → index-BZKRZYTX.js} +1 -1
- package/src/assets/web-panel/assets/{index-BM7xJKGD.js → index-B_ON9La1.js} +1 -1
- package/src/assets/web-panel/assets/{index-D6Le2m3d.js → index-Bk-paNL3.js} +1 -1
- package/src/assets/web-panel/assets/{index-o2qO_dYf.js → index-BlHkc48f.js} +1 -1
- package/src/assets/web-panel/assets/{index-9L3Pg2tc.js → index-BmvU4Tp_.js} +1 -1
- package/src/assets/web-panel/assets/{index-BKl40wrO.js → index-BsH8mFp4.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dq-8PFhL.js → index-Bu6qMjf4.js} +1 -1
- package/src/assets/web-panel/assets/{index-VIgVth92.js → index-C2nO02uW.js} +1 -1
- package/src/assets/web-panel/assets/{index-DZBesaCN.js → index-C7mh6xlu.js} +1 -1
- package/src/assets/web-panel/assets/{index-CJLz3SpM.js → index-CDVwN9Sv.js} +1 -1
- package/src/assets/web-panel/assets/{index-DaDLWIWo.js → index-CJS6GTpv.js} +1 -1
- package/src/assets/web-panel/assets/{index-C8nXkCMf.js → index-CQJoh5rw.js} +1 -1
- package/src/assets/web-panel/assets/{index-asia_JPc.js → index-CXb8gEWh.js} +1 -1
- package/src/assets/web-panel/assets/{index-IjOa5lYn.js → index-CXn-e3ki.js} +1 -1
- package/src/assets/web-panel/assets/{index-CFj7ylAJ.js → index-CpiOzt7U.js} +1 -1
- package/src/assets/web-panel/assets/index-CtGQDg7m.js +1 -0
- package/src/assets/web-panel/assets/{index-C6ohEAEV.js → index-D1TXgNPA.js} +1 -1
- package/src/assets/web-panel/assets/{index-vdTrEOj7.js → index-DFK6PTGJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DQ4Fch3e.js → index-DP2DCKD-.js} +1 -1
- package/src/assets/web-panel/assets/{index-L9CFyRIi.js → index-DPzunJER.js} +1 -1
- package/src/assets/web-panel/assets/{index-cHx5KzUt.js → index-DSypQU1h.js} +1 -1
- package/src/assets/web-panel/assets/{index-DbMGGcpZ.js → index-DZgT7pH-.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cmr0AzcK.js → index-Dh-vezHe.js} +1 -1
- package/src/assets/web-panel/assets/{index-BWkKE8Oj.js → index-DpaGe-dr.js} +3 -3
- package/src/assets/web-panel/assets/{index-DhX48E81.js → index-HQXFl8fh.js} +1 -1
- package/src/assets/web-panel/assets/{index-BUjyj7qR.js → index-bW6vfpLH.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bdg_nWD1.js → index-cnDfwWU5.js} +1 -1
- package/src/assets/web-panel/assets/{index-CxB49Mow.js → index-gh11zJ9h.js} +1 -1
- package/src/assets/web-panel/assets/{index-DroaQypF.js → index-jFg3CPlQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQedFuDw.js → index-lNmDaf3J.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-anKyyjGc.js → initDefaultProps-3DSfnIpD.js} +1 -1
- package/src/assets/web-panel/assets/{motion-Cqp0nx5A.js → motion-DxGLmgA0.js} +1 -1
- package/src/assets/web-panel/assets/{move-Ca3mgkM2.js → move-DrlLG6m5.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BmwuhJ3z.js → mtc-parser-BITbrJSb.js} +1 -1
- package/src/assets/web-panel/assets/{omit-C9Mf05WJ.js → omit-D7k5vIbk.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-2PbxB9Ds.js → pickAttrs-BJSvYFWo.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-CTVbOFHt.js → placementArrow-Bf4to1jA.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-Nrm8Vbmr.js → responsiveObserve-BXzeyzTa.js} +1 -1
- package/src/assets/web-panel/assets/{slide-Dh4r1zqR.js → slide-DLzNUNdj.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-vzNoQL-r.js → statusUtils-wBBnrRm_.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-BXpGfNkI.js → styleChecker-BnmJzXNr.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-CVWBRdhs.js → useFlexGapSupport-DrN8MrJb.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BJWMLffI.js → useFs-dnkYGkjY.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-CWCe5VHG.js → usePersonalDataHub-k_xkv7-k.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-D-NBEb8m.js → vnode-B-v8PXpK.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-C0mnhfGf.js → zoom-Coue8wAK.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/data/changelog.json +13 -0
- package/src/harness/worktree-isolator.js +20 -8
- package/src/lib/chat-core.js +57 -25
- package/src/lib/eval/verify01-execution-window.js +70 -0
- package/src/lib/eval/verify01-execution.js +9 -1
- package/src/lib/eval/verify01-host-capture.js +6 -2
- package/src/lib/provider-http-error.js +16 -0
- package/src/lib/stream-retry.js +195 -1
- package/src/runtime/agent-core.js +97 -20
- package/src/assets/web-panel/assets/ChatBubbleRenderer-RvblDu77.js +0 -1
- package/src/assets/web-panel/assets/Logs-BD2UR7kE.js +0 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-B-TlDCmr.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-Dsctbob8.js +0 -1
- package/src/assets/web-panel/assets/Projects-C0bSuM8U.js +0 -1
- package/src/assets/web-panel/assets/devWarning-B6kQEceX.js +0 -1
- package/src/assets/web-panel/assets/index-CSeiH6HA.js +0 -1
- package/src/assets/web-panel/assets/index-CayGTz6d.js +0 -1
package/src/lib/stream-retry.js
CHANGED
|
@@ -12,11 +12,196 @@
|
|
|
12
12
|
* agent runtime.
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
|
-
import {
|
|
15
|
+
import {
|
|
16
|
+
createAbortError,
|
|
17
|
+
isAbortError,
|
|
18
|
+
raceWithAbort,
|
|
19
|
+
throwIfAborted,
|
|
20
|
+
} from "./abort-utils.js";
|
|
16
21
|
|
|
17
22
|
/** Bounded auto-retry budget for streaming connection drops (Claude-Code 2.1.181). */
|
|
18
23
|
export const STREAM_RETRY_MAX = 2;
|
|
19
24
|
export const STREAM_RETRY_BASE_MS = 400;
|
|
25
|
+
export const STREAM_RETRY_MAX_DELAY_MS = 60_000;
|
|
26
|
+
|
|
27
|
+
function isFailureStatus(status) {
|
|
28
|
+
return Number.isInteger(status) && status >= 400 && status <= 599;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function retryAfterHeader(headers) {
|
|
32
|
+
if (!headers) return undefined;
|
|
33
|
+
if (typeof headers.get === "function") return headers.get("retry-after");
|
|
34
|
+
const entries = Object.entries(headers).filter(
|
|
35
|
+
([name]) => name.toLowerCase() === "retry-after",
|
|
36
|
+
);
|
|
37
|
+
// Multiple spellings or a list of values are ambiguous, not a delay.
|
|
38
|
+
return entries.length === 1 ? entries[0][1] : undefined;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function httpDate(value, now) {
|
|
42
|
+
// Accept the three HTTP-date wire formats, not Date.parse's permissive
|
|
43
|
+
// numeric/local-date syntax (e.g. "-1", "1.5", or "2026-10-12").
|
|
44
|
+
const weekday = "(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)";
|
|
45
|
+
const month = "(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)";
|
|
46
|
+
let match = new RegExp(
|
|
47
|
+
`^(${weekday}), (\\d{2}) ${month} (\\d{4}) (\\d{2}):(\\d{2}):(\\d{2}) GMT$`,
|
|
48
|
+
).exec(value);
|
|
49
|
+
let day, monthName, year, hour, minute, second, dayName;
|
|
50
|
+
if (match) {
|
|
51
|
+
[, dayName, day, monthName, year, hour, minute, second] = match;
|
|
52
|
+
} else {
|
|
53
|
+
match = new RegExp(
|
|
54
|
+
`^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\\d{2})-${month}-(\\d{2}) (\\d{2}):(\\d{2}):(\\d{2}) GMT$`,
|
|
55
|
+
).exec(value);
|
|
56
|
+
if (match) {
|
|
57
|
+
[, dayName, day, monthName, year, hour, minute, second] = match;
|
|
58
|
+
const currentYear = new Date(now).getUTCFullYear();
|
|
59
|
+
year = Math.floor(currentYear / 100) * 100 + Number(year);
|
|
60
|
+
if (year > currentYear + 50) year -= 100;
|
|
61
|
+
} else {
|
|
62
|
+
match = new RegExp(
|
|
63
|
+
`^(${weekday}) ${month} ( [1-9]|[12]\\d|3[01]) (\\d{2}):(\\d{2}):(\\d{2}) (\\d{4})$`,
|
|
64
|
+
).exec(value);
|
|
65
|
+
if (!match) return undefined;
|
|
66
|
+
[, dayName, monthName, day, hour, minute, second, year] = match;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const months = "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" ");
|
|
70
|
+
const monthIndex = months.indexOf(monthName);
|
|
71
|
+
const date = new Date(0);
|
|
72
|
+
date.setUTCFullYear(Number(year), monthIndex, Number(day));
|
|
73
|
+
date.setUTCHours(Number(hour), Number(minute), Number(second), 0);
|
|
74
|
+
// Reject normalized invalid calendar dates/times and mismatched weekdays.
|
|
75
|
+
if (
|
|
76
|
+
date.getUTCFullYear() !== Number(year) ||
|
|
77
|
+
date.getUTCMonth() !== monthIndex ||
|
|
78
|
+
date.getUTCDate() !== Number(day) ||
|
|
79
|
+
date.getUTCHours() !== Number(hour) ||
|
|
80
|
+
date.getUTCMinutes() !== Number(minute) ||
|
|
81
|
+
date.getUTCSeconds() !== Number(second) ||
|
|
82
|
+
date.toUTCString().slice(0, 3) !== dayName.slice(0, 3)
|
|
83
|
+
) {
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
return date.getTime();
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** Capture a deadline when headers arrive, before reading a slow response body.
|
|
90
|
+
* No metadata here grants permission to retry an HTTP/provider verdict.
|
|
91
|
+
*/
|
|
92
|
+
export function captureStreamRetryMetadata(response, now = Date.now()) {
|
|
93
|
+
const metadata = {};
|
|
94
|
+
if (Number.isInteger(response?.status)) metadata.status = response.status;
|
|
95
|
+
const raw = retryAfterHeader(response?.headers);
|
|
96
|
+
if (typeof raw !== "string" || !Number.isFinite(now)) return metadata;
|
|
97
|
+
const value = raw.trim();
|
|
98
|
+
if (/^\d+$/.test(value)) {
|
|
99
|
+
const seconds = Number(value);
|
|
100
|
+
const deadline = now + seconds * 1000;
|
|
101
|
+
// A valid but unrepresentably large delay is a refusal to retry within our
|
|
102
|
+
// budget, NOT a missing header. Infinity is an internal fail-closed sentinel.
|
|
103
|
+
metadata.retryAfterAt = Number.isSafeInteger(deadline)
|
|
104
|
+
? deadline
|
|
105
|
+
: Infinity;
|
|
106
|
+
} else {
|
|
107
|
+
const deadline = httpDate(value, now);
|
|
108
|
+
if (deadline !== undefined) metadata.retryAfterAt = deadline;
|
|
109
|
+
}
|
|
110
|
+
return metadata;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** Preserve the original Error identity/code and the strongest known verdict. */
|
|
114
|
+
export function attachStreamRetryMetadata(error, metadata = {}) {
|
|
115
|
+
if (!error || (typeof error !== "object" && typeof error !== "function"))
|
|
116
|
+
return error;
|
|
117
|
+
const hasFailureStatus = [
|
|
118
|
+
error.status,
|
|
119
|
+
error.statusCode,
|
|
120
|
+
error.cause?.status,
|
|
121
|
+
error.cause?.statusCode,
|
|
122
|
+
].some(isFailureStatus);
|
|
123
|
+
if (!hasFailureStatus && Number.isInteger(metadata.status)) {
|
|
124
|
+
error.status = metadata.status;
|
|
125
|
+
}
|
|
126
|
+
if (
|
|
127
|
+
typeof metadata.retryAfterAt === "number" &&
|
|
128
|
+
!Number.isNaN(metadata.retryAfterAt) &&
|
|
129
|
+
metadata.retryAfterAt !== -Infinity
|
|
130
|
+
) {
|
|
131
|
+
const previous = [error.retryAfterAt, error.cause?.retryAfterAt].filter(
|
|
132
|
+
(value) => typeof value === "number" && !Number.isNaN(value),
|
|
133
|
+
);
|
|
134
|
+
error.retryAfterAt = Math.max(metadata.retryAfterAt, ...previous);
|
|
135
|
+
}
|
|
136
|
+
return error;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** Resolve the wait AFTER retry eligibility is checked; null means give up.
|
|
140
|
+
* Never clamp a server deadline to a shorter wait or authorize an HTTP replay.
|
|
141
|
+
* Attempt 1 is the first retry, matching the existing retry observer contract.
|
|
142
|
+
*/
|
|
143
|
+
export function resolveStreamRetryDelay(error, attempt, options = {}) {
|
|
144
|
+
const base = options.baseDelayMs ?? STREAM_RETRY_BASE_MS;
|
|
145
|
+
const now = options.now ?? Date.now();
|
|
146
|
+
const max = options.maxDelayMs ?? STREAM_RETRY_MAX_DELAY_MS;
|
|
147
|
+
if (
|
|
148
|
+
!Number.isInteger(attempt) ||
|
|
149
|
+
attempt < 1 ||
|
|
150
|
+
!Number.isFinite(base) ||
|
|
151
|
+
base < 0 ||
|
|
152
|
+
!Number.isFinite(now) ||
|
|
153
|
+
!Number.isFinite(max) ||
|
|
154
|
+
max < 0
|
|
155
|
+
)
|
|
156
|
+
return null;
|
|
157
|
+
const deadlines = [error?.retryAfterAt, error?.cause?.retryAfterAt].filter(
|
|
158
|
+
(value) => typeof value === "number" && !Number.isNaN(value),
|
|
159
|
+
);
|
|
160
|
+
const delay = Math.ceil(
|
|
161
|
+
Math.max(base * 2 ** (attempt - 1), 0, ...deadlines.map((at) => at - now)),
|
|
162
|
+
);
|
|
163
|
+
// Node clamps overflowing setTimeout delays to 1ms. Reject rather than
|
|
164
|
+
// accidentally turning a requested long delay into an immediate replay.
|
|
165
|
+
return Number.isFinite(delay) && delay <= max && delay <= 2_147_483_647
|
|
166
|
+
? delay
|
|
167
|
+
: null;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/** Wait without keeping an obsolete backoff alive after user cancellation. */
|
|
171
|
+
export async function waitForStreamRetry(ms, signal, { sleep } = {}) {
|
|
172
|
+
throwIfAborted(signal);
|
|
173
|
+
if (!Number.isFinite(ms) || ms < 0 || ms > 2_147_483_647)
|
|
174
|
+
throw new RangeError("Invalid streaming retry delay");
|
|
175
|
+
if (sleep) {
|
|
176
|
+
await raceWithAbort(
|
|
177
|
+
Promise.resolve().then(() => {
|
|
178
|
+
throwIfAborted(signal);
|
|
179
|
+
return sleep(ms);
|
|
180
|
+
}),
|
|
181
|
+
signal,
|
|
182
|
+
);
|
|
183
|
+
throwIfAborted(signal);
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
await new Promise((resolve, reject) => {
|
|
187
|
+
let timer;
|
|
188
|
+
const cleanup = () => {
|
|
189
|
+
clearTimeout(timer);
|
|
190
|
+
signal?.removeEventListener?.("abort", onAbort);
|
|
191
|
+
};
|
|
192
|
+
const onAbort = () => {
|
|
193
|
+
cleanup();
|
|
194
|
+
reject(signal.reason || createAbortError());
|
|
195
|
+
};
|
|
196
|
+
timer = setTimeout(() => {
|
|
197
|
+
cleanup();
|
|
198
|
+
resolve();
|
|
199
|
+
}, ms);
|
|
200
|
+
signal?.addEventListener?.("abort", onAbort, { once: true });
|
|
201
|
+
if (signal?.aborted) onAbort();
|
|
202
|
+
});
|
|
203
|
+
throwIfAborted(signal);
|
|
204
|
+
}
|
|
20
205
|
|
|
21
206
|
/**
|
|
22
207
|
* Hard ceiling on the *configurable* retry budget (Claude-Code 2.1.186:
|
|
@@ -61,6 +246,15 @@ export function isRetryableStreamError(err, signal) {
|
|
|
61
246
|
if (isAbortError(err)) return false;
|
|
62
247
|
if (signal && signal.aborted) return false;
|
|
63
248
|
if (!err) return false;
|
|
249
|
+
if (
|
|
250
|
+
[err, err.cause].some(
|
|
251
|
+
(error) =>
|
|
252
|
+
error?.noReplay === true ||
|
|
253
|
+
error?.streamOutputVisible === true ||
|
|
254
|
+
error?.isOutputBackpressureFailure === true,
|
|
255
|
+
)
|
|
256
|
+
)
|
|
257
|
+
return false;
|
|
64
258
|
const msg = String(err.message || err).toLowerCase();
|
|
65
259
|
// A provider verdict stays terminal even when its detail mentions a timeout,
|
|
66
260
|
// reset or network failure. Inspect it before transport codes and wording so
|
|
@@ -156,6 +156,10 @@ import {
|
|
|
156
156
|
isRetryableStreamError,
|
|
157
157
|
STREAM_RETRY_BASE_MS,
|
|
158
158
|
resolveStreamRetryMax,
|
|
159
|
+
captureStreamRetryMetadata,
|
|
160
|
+
attachStreamRetryMetadata,
|
|
161
|
+
resolveStreamRetryDelay,
|
|
162
|
+
waitForStreamRetry,
|
|
159
163
|
} from "../lib/stream-retry.js";
|
|
160
164
|
import {
|
|
161
165
|
annotateLines,
|
|
@@ -184,7 +188,7 @@ import {
|
|
|
184
188
|
} from "../lib/unattended-action-policy.js";
|
|
185
189
|
import {
|
|
186
190
|
formatProviderHttpError,
|
|
187
|
-
|
|
191
|
+
createProviderResponseError,
|
|
188
192
|
} from "../lib/provider-http-error.js";
|
|
189
193
|
import { buildPermissionDecision } from "../lib/permission-decision.js";
|
|
190
194
|
import { resolveSandboxPolicyPath } from "../lib/agent-sandbox.js";
|
|
@@ -11920,7 +11924,7 @@ export async function chatWithTools(rawMessages, options) {
|
|
|
11920
11924
|
}),
|
|
11921
11925
|
});
|
|
11922
11926
|
if (!response.ok) {
|
|
11923
|
-
throw
|
|
11927
|
+
throw await createProviderResponseError("ollama", response);
|
|
11924
11928
|
}
|
|
11925
11929
|
const data = await response.json();
|
|
11926
11930
|
if (
|
|
@@ -12073,7 +12077,7 @@ export async function chatWithTools(rawMessages, options) {
|
|
|
12073
12077
|
});
|
|
12074
12078
|
|
|
12075
12079
|
if (!response.ok) {
|
|
12076
|
-
throw
|
|
12080
|
+
throw await createProviderResponseError("anthropic", response);
|
|
12077
12081
|
}
|
|
12078
12082
|
|
|
12079
12083
|
const data = await response.json();
|
|
@@ -12229,7 +12233,7 @@ export async function chatWithTools(rawMessages, options) {
|
|
|
12229
12233
|
body: JSON.stringify(responseBody),
|
|
12230
12234
|
});
|
|
12231
12235
|
if (!response.ok) {
|
|
12232
|
-
throw
|
|
12236
|
+
throw await createProviderResponseError(provider, response);
|
|
12233
12237
|
}
|
|
12234
12238
|
const data = await response.json();
|
|
12235
12239
|
const out = normalizeOpenAIResponsesResponse(data);
|
|
@@ -12310,7 +12314,7 @@ export async function chatWithTools(rawMessages, options) {
|
|
|
12310
12314
|
});
|
|
12311
12315
|
|
|
12312
12316
|
if (!response.ok) {
|
|
12313
|
-
throw
|
|
12317
|
+
throw await createProviderResponseError(provider, response);
|
|
12314
12318
|
}
|
|
12315
12319
|
|
|
12316
12320
|
const data = await response.json();
|
|
@@ -12397,9 +12401,11 @@ function _ollamaInitState() {
|
|
|
12397
12401
|
|
|
12398
12402
|
function _streamUiCallbacks(onToken, onThinking) {
|
|
12399
12403
|
let pending = [];
|
|
12404
|
+
let visible = false;
|
|
12400
12405
|
const capture = (callback) =>
|
|
12401
12406
|
typeof callback === "function"
|
|
12402
12407
|
? (value) => {
|
|
12408
|
+
if (typeof value === "string" && value.length > 0) visible = true;
|
|
12403
12409
|
try {
|
|
12404
12410
|
const result = callback(value);
|
|
12405
12411
|
if (result && typeof result.then === "function") {
|
|
@@ -12413,6 +12419,7 @@ function _streamUiCallbacks(onToken, onThinking) {
|
|
|
12413
12419
|
return {
|
|
12414
12420
|
onToken: capture(onToken),
|
|
12415
12421
|
onThinking: capture(onThinking),
|
|
12422
|
+
hasVisibleOutput: () => visible,
|
|
12416
12423
|
async settle() {
|
|
12417
12424
|
if (pending.length === 0) return;
|
|
12418
12425
|
const current = pending;
|
|
@@ -12516,11 +12523,17 @@ export function _accumulateOllamaStream(lines, onToken) {
|
|
|
12516
12523
|
* Parity with Claude-Code 2.1.179 ("preserving partial responses instead of
|
|
12517
12524
|
* showing raw errors"). Pure + exported for unit tests.
|
|
12518
12525
|
*/
|
|
12519
|
-
export function _streamErrorDisposition(
|
|
12526
|
+
export function _streamErrorDisposition(
|
|
12527
|
+
err,
|
|
12528
|
+
signal,
|
|
12529
|
+
partialText,
|
|
12530
|
+
visible = false,
|
|
12531
|
+
) {
|
|
12520
12532
|
if (err?.isOutputBackpressureFailure === true) return "rethrow";
|
|
12521
12533
|
if (isAbortError(err)) return "rethrow";
|
|
12522
12534
|
if (signal && signal.aborted) return "rethrow";
|
|
12523
|
-
if (typeof partialText === "string" && partialText.
|
|
12535
|
+
if (visible || (typeof partialText === "string" && partialText.length > 0))
|
|
12536
|
+
return "preserve";
|
|
12524
12537
|
return "rethrow";
|
|
12525
12538
|
}
|
|
12526
12539
|
|
|
@@ -12585,16 +12598,22 @@ export async function _retryStreamingChat(streamFn, opts = {}) {
|
|
|
12585
12598
|
const retries = opts.retries ?? resolveStreamRetryMax();
|
|
12586
12599
|
const base = opts.baseDelayMs ?? STREAM_RETRY_BASE_MS;
|
|
12587
12600
|
const signal = opts.signal;
|
|
12588
|
-
const sleep = opts.sleep || ((ms) => new Promise((r) => setTimeout(r, ms)));
|
|
12589
12601
|
const now = typeof opts.now === "function" ? opts.now : Date.now;
|
|
12590
12602
|
let attempt = 0;
|
|
12591
12603
|
for (;;) {
|
|
12604
|
+
throwIfAborted(signal);
|
|
12592
12605
|
const attemptStartedAt = now();
|
|
12593
12606
|
try {
|
|
12594
12607
|
return await streamFn(attempt);
|
|
12595
12608
|
} catch (err) {
|
|
12596
12609
|
if (attempt >= retries || !_isRetryableStreamError(err, signal))
|
|
12597
12610
|
throw err;
|
|
12611
|
+
const attemptEndedAt = now();
|
|
12612
|
+
const delayMs = resolveStreamRetryDelay(err, attempt + 1, {
|
|
12613
|
+
baseDelayMs: base,
|
|
12614
|
+
now: attemptEndedAt,
|
|
12615
|
+
});
|
|
12616
|
+
if (delayMs === null) throw err;
|
|
12598
12617
|
attempt++;
|
|
12599
12618
|
if (
|
|
12600
12619
|
opts.strictRetryObserver === true &&
|
|
@@ -12609,7 +12628,7 @@ export async function _retryStreamingChat(streamFn, opts = {}) {
|
|
|
12609
12628
|
if (typeof opts.onRetry === "function") {
|
|
12610
12629
|
try {
|
|
12611
12630
|
const observation = opts.onRetry(attempt, err, {
|
|
12612
|
-
durationMs: Math.max(0,
|
|
12631
|
+
durationMs: Math.max(0, attemptEndedAt - attemptStartedAt),
|
|
12613
12632
|
});
|
|
12614
12633
|
if (observation && typeof observation.then === "function") {
|
|
12615
12634
|
void Promise.resolve(observation).catch(() => {});
|
|
@@ -12638,8 +12657,7 @@ export async function _retryStreamingChat(streamFn, opts = {}) {
|
|
|
12638
12657
|
}
|
|
12639
12658
|
}
|
|
12640
12659
|
}
|
|
12641
|
-
await
|
|
12642
|
-
if (signal && signal.aborted) throw err; // user bailed during backoff
|
|
12660
|
+
await waitForStreamRetry(delayMs, signal, { sleep: opts.sleep });
|
|
12643
12661
|
}
|
|
12644
12662
|
}
|
|
12645
12663
|
}
|
|
@@ -12762,8 +12780,9 @@ async function _chatOllamaStreaming(
|
|
|
12762
12780
|
body: JSON.stringify({ ...body, stream: true }),
|
|
12763
12781
|
});
|
|
12764
12782
|
if (!response.ok) {
|
|
12765
|
-
throw
|
|
12783
|
+
throw await createProviderResponseError("ollama", response);
|
|
12766
12784
|
}
|
|
12785
|
+
const retryMetadata = captureStreamRetryMetadata(response);
|
|
12767
12786
|
const state = _ollamaInitState();
|
|
12768
12787
|
const ui = _streamUiCallbacks(onToken);
|
|
12769
12788
|
const reader = response.body.getReader();
|
|
@@ -12788,7 +12807,17 @@ async function _chatOllamaStreaming(
|
|
|
12788
12807
|
await ui.settle();
|
|
12789
12808
|
}
|
|
12790
12809
|
} catch (err) {
|
|
12791
|
-
|
|
12810
|
+
attachStreamRetryMetadata(err, retryMetadata);
|
|
12811
|
+
if (!ui.hasVisibleOutput() && !state.content && state.toolCalls?.length)
|
|
12812
|
+
err.noReplay = true;
|
|
12813
|
+
if (
|
|
12814
|
+
_streamErrorDisposition(
|
|
12815
|
+
err,
|
|
12816
|
+
signal,
|
|
12817
|
+
state.content,
|
|
12818
|
+
ui.hasVisibleOutput(),
|
|
12819
|
+
) === "rethrow"
|
|
12820
|
+
)
|
|
12792
12821
|
throw err;
|
|
12793
12822
|
return _finalizeTruncatedStream(_ollamaFinalize, state);
|
|
12794
12823
|
}
|
|
@@ -12813,8 +12842,9 @@ async function _chatAnthropicStreaming(
|
|
|
12813
12842
|
body: JSON.stringify(body),
|
|
12814
12843
|
});
|
|
12815
12844
|
if (!response.ok) {
|
|
12816
|
-
throw
|
|
12845
|
+
throw await createProviderResponseError("anthropic", response);
|
|
12817
12846
|
}
|
|
12847
|
+
const retryMetadata = captureStreamRetryMetadata(response);
|
|
12818
12848
|
const state = _anthropicInitState();
|
|
12819
12849
|
const ui = _streamUiCallbacks(onToken, onThinking);
|
|
12820
12850
|
const reader = response.body.getReader();
|
|
@@ -12839,7 +12869,21 @@ async function _chatAnthropicStreaming(
|
|
|
12839
12869
|
await ui.settle();
|
|
12840
12870
|
}
|
|
12841
12871
|
} catch (err) {
|
|
12842
|
-
|
|
12872
|
+
attachStreamRetryMetadata(err, retryMetadata);
|
|
12873
|
+
if (
|
|
12874
|
+
!ui.hasVisibleOutput() &&
|
|
12875
|
+
!state.text &&
|
|
12876
|
+
Object.values(state.blocks).some((block) => block.type === "tool_use")
|
|
12877
|
+
)
|
|
12878
|
+
err.noReplay = true;
|
|
12879
|
+
if (
|
|
12880
|
+
_streamErrorDisposition(
|
|
12881
|
+
err,
|
|
12882
|
+
signal,
|
|
12883
|
+
state.text,
|
|
12884
|
+
ui.hasVisibleOutput(),
|
|
12885
|
+
) === "rethrow"
|
|
12886
|
+
)
|
|
12843
12887
|
throw err;
|
|
12844
12888
|
return _finalizeTruncatedStream(_anthropicFinalize, state);
|
|
12845
12889
|
}
|
|
@@ -12871,8 +12915,9 @@ async function _chatOpenAIStreaming(
|
|
|
12871
12915
|
body: JSON.stringify(body),
|
|
12872
12916
|
});
|
|
12873
12917
|
if (!response.ok) {
|
|
12874
|
-
throw
|
|
12918
|
+
throw await createProviderResponseError(provider, response);
|
|
12875
12919
|
}
|
|
12920
|
+
const retryMetadata = captureStreamRetryMetadata(response);
|
|
12876
12921
|
const state = _openaiInitState();
|
|
12877
12922
|
const ui = _streamUiCallbacks(onToken);
|
|
12878
12923
|
const reader = response.body.getReader();
|
|
@@ -12897,7 +12942,17 @@ async function _chatOpenAIStreaming(
|
|
|
12897
12942
|
await ui.settle();
|
|
12898
12943
|
}
|
|
12899
12944
|
} catch (err) {
|
|
12900
|
-
|
|
12945
|
+
attachStreamRetryMetadata(err, retryMetadata);
|
|
12946
|
+
if (!ui.hasVisibleOutput() && !state.text && state.tools.length)
|
|
12947
|
+
err.noReplay = true;
|
|
12948
|
+
if (
|
|
12949
|
+
_streamErrorDisposition(
|
|
12950
|
+
err,
|
|
12951
|
+
signal,
|
|
12952
|
+
state.text,
|
|
12953
|
+
ui.hasVisibleOutput(),
|
|
12954
|
+
) === "rethrow"
|
|
12955
|
+
)
|
|
12901
12956
|
throw err;
|
|
12902
12957
|
const out = _finalizeTruncatedStream(_openaiFinalize, state);
|
|
12903
12958
|
const providerReceipt = _openAIProviderRequestReceipt(
|
|
@@ -12943,8 +12998,9 @@ async function _chatOpenAIResponsesStreaming(
|
|
|
12943
12998
|
body: JSON.stringify(body),
|
|
12944
12999
|
});
|
|
12945
13000
|
if (!response.ok) {
|
|
12946
|
-
throw
|
|
13001
|
+
throw await createProviderResponseError("openai", response);
|
|
12947
13002
|
}
|
|
13003
|
+
const retryMetadata = captureStreamRetryMetadata(response);
|
|
12948
13004
|
const state = createOpenAIResponsesStreamState();
|
|
12949
13005
|
const ui = _streamUiCallbacks(onToken, onThinking);
|
|
12950
13006
|
const reader = response.body.getReader();
|
|
@@ -12969,10 +13025,31 @@ async function _chatOpenAIResponsesStreaming(
|
|
|
12969
13025
|
await ui.settle();
|
|
12970
13026
|
}
|
|
12971
13027
|
} catch (error) {
|
|
12972
|
-
if (
|
|
13028
|
+
if (state.terminalError) throw state.terminalError;
|
|
13029
|
+
attachStreamRetryMetadata(error, retryMetadata);
|
|
13030
|
+
if (
|
|
13031
|
+
!ui.hasVisibleOutput() &&
|
|
13032
|
+
!state.text &&
|
|
13033
|
+
state.outputItems.some((item) => item?.type === "function_call")
|
|
13034
|
+
)
|
|
13035
|
+
error.noReplay = true;
|
|
13036
|
+
if (
|
|
13037
|
+
!state.normalized &&
|
|
13038
|
+
_streamErrorDisposition(
|
|
13039
|
+
error,
|
|
13040
|
+
signal,
|
|
13041
|
+
state.text,
|
|
13042
|
+
ui.hasVisibleOutput(),
|
|
13043
|
+
) === "rethrow"
|
|
13044
|
+
) {
|
|
12973
13045
|
throw error;
|
|
12974
13046
|
}
|
|
12975
|
-
|
|
13047
|
+
throwIfAborted(signal);
|
|
13048
|
+
if (isAbortError(error) || error?.isOutputBackpressureFailure === true)
|
|
13049
|
+
throw error;
|
|
13050
|
+
const out = state.normalized
|
|
13051
|
+
? finalizeOpenAIResponsesStream(state)
|
|
13052
|
+
: _finalizeTruncatedStream(finalizeOpenAIResponsesStream, state);
|
|
12976
13053
|
const responseId = out.responseId || state.responseId;
|
|
12977
13054
|
delete out.responseId;
|
|
12978
13055
|
const providerReceipt = _openAIProviderRequestReceipt(
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as v,P as m,J as S,U as s,R as a,S as y,K as C,Q as x,V as w,_ as B,b as n}from"./vendor-Bn1JzzAn.js";import{_ as k}from"./index-BWkKE8Oj.js";import"./icons-DG5UD-6K.js";const N={__name:"ChatBubbleRenderer",props:{event:{type:Object,required:!0}},setup(c,{expose:d}){d();const t=c,r=n(()=>{const e=t.event.content||{};return e.text||e.body||e.message||e.title||JSON.stringify(e).slice(0,200)}),i=n(()=>{const e=t.event.content||{};return e.from||e.sender||e.senderName||t.event.actor||"(unknown)"}),l=n(()=>{const e=(t.event.actor||"").toLowerCase();return e.includes("self")||e==="me"||e.endsWith("_self")}),o=n(()=>{const e=t.event.source.adapter||"";return e.startsWith("messaging-qq")?"magenta":e==="wechat"?"green":"blue"}),u=n(()=>{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:u,computed:n};return Object.defineProperty(_,"__isScriptSetup",{enumerable:!1,value:!0}),_}},T={class:"bubble"},M={class:"meta"},R={class:"actor"},V={class:"time"},q={class:"body"};function D(c,d,t,r,i,l){const o=v("a-tag");return m(),S("div",{class:B(["chat-row",{mine:r.isMine}])},[s("div",T,[s("div",M,[s("span",R,a(r.actorLabel),1),s("span",V,a(r.formattedTime),1)]),s("div",q,a(r.messageText),1),t.event.source.adapter?(m(),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(N,[["render",D],["__scopeId","data-v-49238629"],["__file","/tmp/cc-web-panel-mnKWcd/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 o,K as _,V as k,S as N,R as S,F as V,Z as Q,w as M,n as C,o as R,b as T,r,P as p,Q as O,_ as U}from"./vendor-Bn1JzzAn.js";import{_ as E,u as W}from"./index-BWkKE8Oj.js";import{R as j}from"./icons-DG5UD-6K.js";const q={__name:"Logs",setup(K,{expose:a}){a();const x=W(),e=r("status"),y=r(!1),v=r(""),c=r(""),i=r(""),f=r(!0),n=r(null),h={status:"status",doctor:"doctor","skill-sources":"skill sources","llm-providers":"llm providers"},m=T(()=>c.value.split(`
|
|
2
|
-
`)),b=T(()=>{if(!i.value)return m.value;const t=i.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(!i.value)return t;const u=i.value.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return t.replace(new RegExp(`(${u})`,"gi"),"<mark>$1</mark>")}async function B(){y.value=!0,v.value="",c.value="";const t=h[e.value]||"status";try{const{output:u}=await x.execute(t,3e4);c.value=u,f.value&&(await C(),n.value&&(n.value.scrollTop=n.value.scrollHeight))}catch(u){v.value=`执行失败: ${u.message}`,c.value=v.value}finally{y.value=!1}}M(b,async()=>{f.value&&(await C(),n.value&&(n.value.scrollTop=n.value.scrollHeight))}),R(B);const H={ws:x,activeTab:e,loading:y,error:v,rawOutput:c,searchQuery:i,autoScroll:f,logContainer:n,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 j},get useWsStore(){return W}};return Object.defineProperty(H,"__isScriptSetup",{enumerable:!1,value:!0}),H}},z={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},A={style:{display:"flex",gap:"10px",margin:"12px 0"}},D={ref:"logContainer",class:"log-box"},F={key:0,style:{"text-align":"center",padding:"40px",color:"var(--text-muted)"}},I={key:1,style:{"text-align":"center",padding:"40px",color:"var(--text-muted)"}},P={key:2},J=["innerHTML"];function Z(K,a,x,e,y,v){const c=s("a-checkbox"),i=s("a-button"),f=s("a-space"),n=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",z,[a[5]||(a[5]=d("div",null,[d("h2",{class:"page-title"},"日志查看"),d("p",{class:"page-sub"},"系统运行日志与诊断输出")],-1)),o(f,null,{default:_(()=>[o(c,{checked:e.autoScroll,"onUpdate:checked":a[0]||(a[0]=l=>e.autoScroll=l)},{default:_(()=>[...a[3]||(a[3]=[O("自动滚动",-1)])]),_:1},8,["checked"]),o(i,{type:"primary",ghost:"",loading:e.loading,onClick:e.loadLog},{icon:_(()=>[o(e.ReloadOutlined)]),default:_(()=>[a[4]||(a[4]=O(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),k(" Tab Selector "),o(h,{activeKey:e.activeTab,"onUpdate:activeKey":a[1]||(a[1]=l=>e.activeTab=l),onChange:e.loadLog,style:{"margin-bottom":"0"}},{default:_(()=>[o(n,{key:"status",tab:"系统状态"}),o(n,{key:"doctor",tab:"环境诊断"}),o(n,{key:"skill-sources",tab:"技能来源"}),o(n,{key:"llm-providers",tab:"LLM 提供商"})]),_:1},8,["activeKey"]),k(" Search Bar "),d("div",A,[o(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(),N(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",D,[e.loading?(p(),g("div",F,[o(L,{size:"large"}),a[6]||(a[6]=d("div",{style:{"margin-top":"10px"}},"加载中...",-1))])):e.filteredLines.length?(p(),g("div",P,[(p(!0),g(V,null,Q(e.filteredLines,(l,w)=>(p(),g("div",{key:w,class:U(["log-line",e.lineClass(l)]),innerHTML:e.highlightSearch(e.escapeHtml(l))},null,10,J))),128))])):(p(),g("div",I,S(e.error||"暂无日志内容,点击刷新加载"),1))],512)])}const $=E(q,[["render",Z],["__scopeId","data-v-8c2906e0"],["__file","/tmp/cc-web-panel-mnKWcd/repo/packages/web-panel/src/views/Logs.vue"]]);export{$ as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{P as a,J as d,b as c}from"./vendor-Bn1JzzAn.js";import{r as s}from"./markdown-Yo_c6Krv.js";import{_ as p}from"./index-BWkKE8Oj.js";const _={__name:"MarkdownRenderer",props:{content:{type:String,default:""}},setup(t,{expose:o}){o();const e=t,r=c(()=>s(e.content||"")),n={props:e,rendered:r,computed:c,get renderMarkdown(){return s}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}},i=["innerHTML"];function m(t,o,e,r,n,u){return a(),d("div",{class:"markdown-content",innerHTML:r.rendered},null,8,i)}const w=p(_,[["render",m],["__scopeId","data-v-0b0b9f63"],["__file","/tmp/cc-web-panel-mnKWcd/repo/packages/web-panel/src/components/MarkdownRenderer.vue"]]);export{w as M};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as n,J as g,c as l,K as r,N as u,P as h,U as o,R as t,Q as m}from"./vendor-Bn1JzzAn.js";import{_ as v,b}from"./index-BWkKE8Oj.js";import{a8 as y,M}from"./icons-DG5UD-6K.js";const B={__name:"MobileProjects",setup(p,{expose:i}){i();const c=u(),{t:e}=b();function a(){c.push("/projects")}function _(){c.push("/mobile-bridge")}const s={router:c,t:e,goToProjects:a,goToMobileBridge:_,get useRouter(){return u},get useI18n(){return b},get MobileOutlined(){return M},get FolderOutlined(){return y}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}},x={class:"mobile-projects-placeholder"},O={class:"title"},k={class:"subtitle"},w={class:"explainer"};function T(p,i,c,e,a,_){const s=n("a-alert"),d=n("a-button"),f=n("a-space"),P=n("a-empty"),j=n("a-card");return h(),g("div",x,[l(j,null,{default:r(()=>[l(P,{description:!1},{image:r(()=>[l(e.MobileOutlined,{style:{fontSize:"64px",color:"#bfbfbf"}})]),default:r(()=>[o("h2",O,t(e.t("mobileProjects.title")),1),o("p",k,t(e.t("mobileProjects.subtitle")),1),l(s,{message:e.t("mobileProjects.v02Banner"),type:"info","show-icon":"",class:"banner"},null,8,["message"]),o("div",w,[o("h3",null,t(e.t("mobileProjects.currentDirection")),1),o("p",null,t(e.t("mobileProjects.currentDirectionBody")),1),o("ul",null,[o("li",null,t(e.t("mobileProjects.stepPhone")),1),o("li",null,t(e.t("mobileProjects.stepTap")),1),o("li",null,t(e.t("mobileProjects.stepPull")),1)]),o("h3",null,t(e.t("mobileProjects.reverseDirection")),1),o("p",null,t(e.t("mobileProjects.reverseDirectionBody")),1)]),l(f,{class:"actions"},{default:r(()=>[l(d,{type:"primary",onClick:e.goToProjects},{default:r(()=>[l(e.FolderOutlined),m(" "+t(e.t("mobileProjects.viewLocalProjects")),1)]),_:1}),l(d,{onClick:e.goToMobileBridge},{default:r(()=>[l(e.MobileOutlined),m(" "+t(e.t("mobileProjects.checkBridge")),1)]),_:1})]),_:1})]),_:1})]),_:1})])}const N=v(B,[["render",T],["__scopeId","data-v-9262cc45"],["__file","/tmp/cc-web-panel-mnKWcd/repo/packages/web-panel/src/views/MobileProjects.vue"]]);export{N as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as i,J as I,U,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-BWkKE8Oj.js";import{u as de}from"./useShellMode-CgR0wCYM.js";import{aN as ke,aO as Fe,aP as be,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: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),h=u([]),k=u(!1),E=u(!1),L=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"}],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}),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 K(o){switch(o){case"synced":return"green";case"pending":return"orange";case"conflict":return"red";case"error":return"red";default:return"default"}}function Q(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:()=>M(o)}}async function M(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 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:""},E.value=!0}async function T(){if(!F.value.name.trim()){d.warning("请输入项目名称");return}L.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}'`),E.value=!1,await C()):d.error("创建失败")}catch(o){d.error(o.message||String(o))}finally{L.value=!1}}const b=u(!1),D=u(!1),j=u({path:"",content:""}),A=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:""},A.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}'`),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}'`),A.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:h,filesLoading:k,createOpen:E,creating:L,newProject:F,columns:z,countByStatus:V,filteredProjects:J,statusColor:g,syncColor:K,formatTime:Q,loadAll:C,onRowClick:G,openDetail:M,onDelete:H,onShowCreate:X,onCreate:T,createFileOpen:b,creatingFile:D,newFile:j,createFolderOpen:A,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"}},Ae={class:"page-title"},Ie={class:"page-sub"},Ue={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,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"),h=i("a-row"),k=i("a-radio-button"),E=i("a-radio-group"),L=i("a-input-search"),F=i("a-alert"),z=i("a-tag"),V=i("a-popconfirm"),J=i("a-table"),g=i("a-descriptions-item"),K=i("a-descriptions"),Q=i("a-divider"),C=i("a-empty"),G=i("a-list-item"),M=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"),A=i("a-modal"),m=i("a-select-option"),R=i("a-select");return p(),I("div",null,[U("div",ze,[U("div",null,[U("h2",Ae,s(e.t("projects.title")),1),U("p",Ie,[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 "),U("div",Ue,[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(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(),I("code",he,s(c.id.slice(0,8))+"…",1)):n.key==="name"?(p(),I(ne,{key:1},[U("strong",null,s(c.name),1),c.description?(p(),I("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(),I(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(K,{key:0,column:1,bordered:"",size:"small"},{default:a(()=>[t(g,{label:"ID"},{default:a(()=>[U("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(),I("code",Re,s(e.detail.root_path),1)):(p(),I("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(Q,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(M,{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(),I("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(()=>[U("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(A,{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(A,{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(A,{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(A,{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",Le],["__scopeId","data-v-019ac5aa"],["__file","/tmp/cc-web-panel-mnKWcd/repo/packages/web-panel/src/views/Projects.vue"]]);export{We as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Q as r}from"./index-BWkKE8Oj.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as o}from"./Col-DT8t9wmf.js";import{a0 as t}from"./index-BWkKE8Oj.js";import"./vendor-Bn1JzzAn.js";import"./index-DemMuw7n.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as o}from"./Row-fwhot5Bk.js";import{a0 as t}from"./index-BWkKE8Oj.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-Nrm8Vbmr.js";import"./useFlexGapSupport-CVWBRdhs.js";import"./styleChecker-BXpGfNkI.js";import"./index-DemMuw7n.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
|