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.
Files changed (170) hide show
  1. package/README.md +7 -8
  2. package/package.json +1 -1
  3. package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
  4. package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
  5. package/src/assets/web-panel/assets/{AIOps-BUgaCgVU.js → AIOps-Cd4iUOPt.js} +1 -1
  6. package/src/assets/web-panel/assets/{ActionButton-b0MpUSSZ.js → ActionButton--ucr-zko.js} +1 -1
  7. package/src/assets/web-panel/assets/{Analytics-hbXTvHqO.js → Analytics-DbejYMWk.js} +3 -3
  8. package/src/assets/web-panel/assets/{AppLayout-CLQoAVu4.js → AppLayout-CLgKxeGw.js} +5 -5
  9. package/src/assets/web-panel/assets/{Artifacts-ytHzl2L2.js → Artifacts-CTT5BIL5.js} +1 -1
  10. package/src/assets/web-panel/assets/{Audit-BuhkLm0C.js → Audit-DP-WBWe9.js} +1 -1
  11. package/src/assets/web-panel/assets/{BackgroundAgents-CS81hxZV.js → BackgroundAgents-B6VqheJk.js} +1 -1
  12. package/src/assets/web-panel/assets/{Backup-DzR-_Qvi.js → Backup-VWJK5zim.js} +1 -1
  13. package/src/assets/web-panel/assets/{BaseInput-r8Ku_lYw.js → BaseInput-YGFO9RHd.js} +1 -1
  14. package/src/assets/web-panel/assets/{Chat-C3Uxtoaa.js → Chat-CVfydnCd.js} +5 -5
  15. package/src/assets/web-panel/assets/ChatBubbleRenderer-BICpB-qU.js +1 -0
  16. package/src/assets/web-panel/assets/{Checkbox-BnG2P5yc.js → Checkbox-Bd5vKRMk.js} +1 -1
  17. package/src/assets/web-panel/assets/{Codegen-BdgU6HZy.js → Codegen-DHNgPHvg.js} +1 -1
  18. package/src/assets/web-panel/assets/{Col-DT8t9wmf.js → Col-CA2BYQ8T.js} +1 -1
  19. package/src/assets/web-panel/assets/{Community-ChkxR5oe.js → Community-DnKJ-qpI.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compact-DIwLeTk3.js → Compact-C9BZ8t4r.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compliance-CAqzGLvW.js → Compliance-ByyQ2FOl.js} +1 -1
  22. package/src/assets/web-panel/assets/{Cowork-Bb3jejMG.js → Cowork-rXTwXE_c.js} +2 -2
  23. package/src/assets/web-panel/assets/{Cron-BYRkZLta.js → Cron-BuW-HODy.js} +2 -2
  24. package/src/assets/web-panel/assets/{Crosschain-BD6z227t.js → Crosschain-OudNtbYW.js} +1 -1
  25. package/src/assets/web-panel/assets/{DID-DA3G5Wgo.js → DID-BQ6BxYNN.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dashboard-yaZePHOu.js → Dashboard-Cz5HG8tz.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dropdown-BqY5MBx2.js → Dropdown-BzclHOVv.js} +1 -1
  28. package/src/assets/web-panel/assets/{EmailListRenderer-cIWwOgHm.js → EmailListRenderer-CbJETFdy.js} +1 -1
  29. package/src/assets/web-panel/assets/{EvolutionSettings-zvV6ymca.js → EvolutionSettings-Dx_pJG3d.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-CAmh1U2b.js → FamilyGuardDashboard-6JCS1MNg.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-5qd2LCg8.js → Federation-BrPkMYaf.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-Bdkj1sRJ.js → FormItemContext-Bhc9pobs.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-B-gWN2P3.js → GenericCardRenderer-BxOh07uQ.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-BEMh_NGd.js → Git-D_idoujr.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-qLGvA2Hw.js → Governance-ZGfIRE-x.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-DblBwYuW.js → Inference-DpAmcwbw.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-BISegVD_.js → KnowledgeGraph-D1S1UTgP.js} +1 -1
  38. package/src/assets/web-panel/assets/Logs-2sc8V5XV.js +2 -0
  39. package/src/assets/web-panel/assets/MarkdownRenderer-575jjYE6.js +1 -0
  40. package/src/assets/web-panel/assets/{Marketplace-CHKXMOkH.js → Marketplace-0xlFUKbe.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-B5G1elqd.js → McpTools-D25eJLGm.js} +3 -3
  42. package/src/assets/web-panel/assets/{Memory-O5Ib0uTR.js → Memory-BLRGd9hM.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-BaGYL7rT.js → MobileBridge-zpFINGzn.js} +1 -1
  44. package/src/assets/web-panel/assets/MobileProjects-Cbyd-8kx.js +1 -0
  45. package/src/assets/web-panel/assets/{Mtc-CNjJ97jg.js → Mtc-DgXgUlHc.js} +2 -2
  46. package/src/assets/web-panel/assets/{MtcAudit-DjBN-Wqz.js → MtcAudit-DzcL-dKH.js} +2 -2
  47. package/src/assets/web-panel/assets/{Multisig-B850R9lO.js → Multisig-C3OrZ6VN.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-Bn8sbFfV.js → NLProgramming-Bqp_vWA7.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-BpLmMp3Q.js → Notes-Dyn45-Ht.js} +3 -3
  50. package/src/assets/web-panel/assets/{NotificationSettings-Dbk97rjb.js → NotificationSettings-CLjafGZr.js} +1 -1
  51. package/src/assets/web-panel/assets/{OrderTableRenderer-BOBX_I72.js → OrderTableRenderer-Bx8wMauC.js} +1 -1
  52. package/src/assets/web-panel/assets/{Organization-B45DpOuE.js → Organization-5gr9hyLm.js} +4 -4
  53. package/src/assets/web-panel/assets/{Overflow-DmKH7eer.js → Overflow-BRdU02hT.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-CC4FaXTl.js → P2P-DIi7fzh6.js} +2 -2
  55. package/src/assets/web-panel/assets/{PdhVaultBrowser-C2SgP4PI.js → PdhVaultBrowser-BCbS1KpA.js} +3 -3
  56. package/src/assets/web-panel/assets/{Permissions-BQB4QFj_.js → Permissions-BjeP9VtA.js} +4 -4
  57. package/src/assets/web-panel/assets/{PersonalDataHub-Dy6GGpn4.js → PersonalDataHub-y8PXOQUc.js} +4 -4
  58. package/src/assets/web-panel/assets/{Pipeline-B9HB5pRc.js → Pipeline-B0fL5uxY.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-D7pOmg-p.js → Privacy-C8jCDn8Z.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-DglBqvec.js → ProjectInit-B_L6Dc6V.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-Bho22znM.js → ProjectSettings-Bb1CYbZh.js} +2 -2
  62. package/src/assets/web-panel/assets/Projects-CUSV10Cn.js +1 -0
  63. package/src/assets/web-panel/assets/{Providers-BgAgo1Yr.js → Providers-mBSTDJ0E.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-C2fBjCC8.js → QrScannerModal-CHxgalvt.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-C8MiF-rk.js → QuickAsk-DI9KIMEV.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-D_TzHdQf.js → Recommend-B5_zW1JH.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-BHO7b6xE.js → RemoteSession-BkH4bmM5.js} +2 -2
  68. package/src/assets/web-panel/assets/{Reputation-BPxNmNhD.js → Reputation-DJrAqwAq.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-fwhot5Bk.js → Row-xZ3MAM34.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-CZbD1B-5.js → RssFeed-CCsrLLiu.js} +3 -3
  71. package/src/assets/web-panel/assets/{Search-BRs6YpAE.js → Search-CTCRKvaP.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-CB344tKC.js → Security-D7joyfp2.js} +4 -4
  73. package/src/assets/web-panel/assets/{Services-Beo-7fEl.js → Services-oqHPmTG4.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-CDXx96vD.js → Skeleton-BR_32bTG.js} +1 -1
  75. package/src/assets/web-panel/assets/{Skills-b-mQTJK4.js → Skills-BoRz9mln.js} +1 -1
  76. package/src/assets/web-panel/assets/{Sla-BvjP-IS9.js → Sla-UAGUHZ9b.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-C6wsV-cO.js → SpeechSettings-DeP_rMgv.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-BQZoko-e.js → SyncSettings-CSzzMmeA.js} +2 -2
  79. package/src/assets/web-panel/assets/{Tasks-6Z0rJJVO.js → Tasks-CcqOLsLB.js} +1 -1
  80. package/src/assets/web-panel/assets/{Templates-Cc9IXtEQ.js → Templates-cDbkGSDG.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-BLc7AjOI.js → Tenant-DmOy58cq.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-CUN49v85.js → Terminal-CsRZH5vr.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-CX-SksHN.js → TimelineRenderer-BgJrk6HG.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-Btrm0-rK.js → Tokens-CCQglKDE.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-CIboUvKe.js → Trigger-t-Gt3oBY.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-Rv9jEs5v.js → Trust-DQgu2kI0.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-B_xomdD5.js → UkeySign-Cod2WUGj.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-CrvWeMow.js → VideoEditing-SGN5zaVK.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-BjvWgk_7.js → Wallet-CnLEL-LD.js} +4 -4
  90. package/src/assets/web-panel/assets/{WebAuthn-CwfpFw92.js → WebAuthn-C2keUpD6.js} +5 -5
  91. package/src/assets/web-panel/assets/{WorkflowEditor-Dkk2QsOe.js → WorkflowEditor-B1GvrwWJ.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-Dah1DVes.js → chat-1E9_P_qY.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-JEpgQ10k.js → colors-DuU6Os4q.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item--DuG_cxf.js → compact-item-C5NfOAcM.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-BJ_GZvon.js → createContext-D4Fxz9qQ.js} +1 -1
  96. package/src/assets/web-panel/assets/devWarning-zDWbYMr7.js +1 -0
  97. package/src/assets/web-panel/assets/{hasIn-yZRLDmWK.js → hasIn-C6C49iFk.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-rkvSOceQ.js → index-AO6iDCSL.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-DemMuw7n.js → index-B-bb-R99.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CjuD8smQ.js → index-B5lzRoHp.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DxnkldGo.js → index-BBVqlelF.js} +1 -1
  102. package/src/assets/web-panel/assets/index-BPBsZZnT.js +1 -0
  103. package/src/assets/web-panel/assets/{index-C56b8e9s.js → index-BU5mPkNX.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-DddwZCT9.js → index-BULggEX6.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-1QZASeW1.js → index-BVE2wCeb.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-kZE-K3ZO.js → index-BYg1dtne.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DFJbJ8rs.js → index-BZKRZYTX.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BM7xJKGD.js → index-B_ON9La1.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-D6Le2m3d.js → index-Bk-paNL3.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-o2qO_dYf.js → index-BlHkc48f.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-9L3Pg2tc.js → index-BmvU4Tp_.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-BKl40wrO.js → index-BsH8mFp4.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-Dq-8PFhL.js → index-Bu6qMjf4.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-VIgVth92.js → index-C2nO02uW.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DZBesaCN.js → index-C7mh6xlu.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CJLz3SpM.js → index-CDVwN9Sv.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DaDLWIWo.js → index-CJS6GTpv.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-C8nXkCMf.js → index-CQJoh5rw.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-asia_JPc.js → index-CXb8gEWh.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-IjOa5lYn.js → index-CXn-e3ki.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CFj7ylAJ.js → index-CpiOzt7U.js} +1 -1
  122. package/src/assets/web-panel/assets/index-CtGQDg7m.js +1 -0
  123. package/src/assets/web-panel/assets/{index-C6ohEAEV.js → index-D1TXgNPA.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-vdTrEOj7.js → index-DFK6PTGJ.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-DQ4Fch3e.js → index-DP2DCKD-.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-L9CFyRIi.js → index-DPzunJER.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-cHx5KzUt.js → index-DSypQU1h.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DbMGGcpZ.js → index-DZgT7pH-.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-Cmr0AzcK.js → index-Dh-vezHe.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-BWkKE8Oj.js → index-DpaGe-dr.js} +3 -3
  131. package/src/assets/web-panel/assets/{index-DhX48E81.js → index-HQXFl8fh.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-BUjyj7qR.js → index-bW6vfpLH.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-Bdg_nWD1.js → index-cnDfwWU5.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-CxB49Mow.js → index-gh11zJ9h.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-DroaQypF.js → index-jFg3CPlQ.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-CQedFuDw.js → index-lNmDaf3J.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-anKyyjGc.js → initDefaultProps-3DSfnIpD.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-Cqp0nx5A.js → motion-DxGLmgA0.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-Ca3mgkM2.js → move-DrlLG6m5.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-BmwuhJ3z.js → mtc-parser-BITbrJSb.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-C9Mf05WJ.js → omit-D7k5vIbk.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-2PbxB9Ds.js → pickAttrs-BJSvYFWo.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-CTVbOFHt.js → placementArrow-Bf4to1jA.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-Nrm8Vbmr.js → responsiveObserve-BXzeyzTa.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-Dh4r1zqR.js → slide-DLzNUNdj.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-vzNoQL-r.js → statusUtils-wBBnrRm_.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-BXpGfNkI.js → styleChecker-BnmJzXNr.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-CVWBRdhs.js → useFlexGapSupport-DrN8MrJb.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-BJWMLffI.js → useFs-dnkYGkjY.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-CWCe5VHG.js → usePersonalDataHub-k_xkv7-k.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-D-NBEb8m.js → vnode-B-v8PXpK.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-C0mnhfGf.js → zoom-Coue8wAK.js} +1 -1
  153. package/src/assets/web-panel/index.html +1 -1
  154. package/src/data/changelog.json +13 -0
  155. package/src/harness/worktree-isolator.js +20 -8
  156. package/src/lib/chat-core.js +57 -25
  157. package/src/lib/eval/verify01-execution-window.js +70 -0
  158. package/src/lib/eval/verify01-execution.js +9 -1
  159. package/src/lib/eval/verify01-host-capture.js +6 -2
  160. package/src/lib/provider-http-error.js +16 -0
  161. package/src/lib/stream-retry.js +195 -1
  162. package/src/runtime/agent-core.js +97 -20
  163. package/src/assets/web-panel/assets/ChatBubbleRenderer-RvblDu77.js +0 -1
  164. package/src/assets/web-panel/assets/Logs-BD2UR7kE.js +0 -2
  165. package/src/assets/web-panel/assets/MarkdownRenderer-B-TlDCmr.js +0 -1
  166. package/src/assets/web-panel/assets/MobileProjects-Dsctbob8.js +0 -1
  167. package/src/assets/web-panel/assets/Projects-C0bSuM8U.js +0 -1
  168. package/src/assets/web-panel/assets/devWarning-B6kQEceX.js +0 -1
  169. package/src/assets/web-panel/assets/index-CSeiH6HA.js +0 -1
  170. package/src/assets/web-panel/assets/index-CayGTz6d.js +0 -1
@@ -12,11 +12,196 @@
12
12
  * agent runtime.
13
13
  */
14
14
 
15
- import { isAbortError } from "./abort-utils.js";
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
- formatProviderResponseError,
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 new Error(await formatProviderResponseError("ollama", response));
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 new Error(await formatProviderResponseError("anthropic", response));
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 new Error(await formatProviderResponseError(provider, response));
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 new Error(await formatProviderResponseError(provider, response));
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(err, signal, partialText) {
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.trim()) return "preserve";
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, now() - attemptStartedAt),
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 sleep(base * Math.pow(2, attempt - 1));
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 new Error(await formatProviderResponseError("ollama", response));
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
- if (_streamErrorDisposition(err, signal, state.content) === "rethrow")
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 new Error(await formatProviderResponseError("anthropic", response));
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
- if (_streamErrorDisposition(err, signal, state.text) === "rethrow")
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 new Error(await formatProviderResponseError(provider, response));
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
- if (_streamErrorDisposition(err, signal, state.text) === "rethrow")
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 new Error(await formatProviderResponseError("openai", response));
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 (_streamErrorDisposition(error, signal, state.text) === "rethrow") {
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
- const out = _finalizeTruncatedStream(finalizeOpenAIResponsesStream, state);
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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}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};