chainlesschain 0.162.153 → 0.162.154

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 (160) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/src/assets/web-panel/assets/{AIOps-CBilhs1R.js → AIOps-CIpoXyVI.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-Cf-RnC5Y.js → ActionButton-Ch_QXIPk.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-S8tkGhw0.js → Analytics-CvaBYShv.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-CNXI3Bw5.js → AppLayout-B6Q6olcr.js} +5 -5
  7. package/src/assets/web-panel/assets/{Audit-DF2zVFZ0.js → Audit-Bng8eHCW.js} +1 -1
  8. package/src/assets/web-panel/assets/{Backup-CMEiwQZL.js → Backup-DvBs8-lm.js} +1 -1
  9. package/src/assets/web-panel/assets/{BaseInput-rwLw4K70.js → BaseInput-DKwajm0g.js} +1 -1
  10. package/src/assets/web-panel/assets/{Chat-C478H8u9.js → Chat-BoGpZ3uO.js} +5 -5
  11. package/src/assets/web-panel/assets/ChatBubbleRenderer-mDQl_PXO.js +1 -0
  12. package/src/assets/web-panel/assets/{Checkbox-D-47X635.js → Checkbox-BMJEmxFQ.js} +1 -1
  13. package/src/assets/web-panel/assets/{Codegen-Cb9Ihed5.js → Codegen-Bsoag5CV.js} +1 -1
  14. package/src/assets/web-panel/assets/{Col-CQsdzczt.js → Col-CDjH9-sp.js} +1 -1
  15. package/src/assets/web-panel/assets/{Community-DiqzeAy-.js → Community-Cg2QHPQ6.js} +1 -1
  16. package/src/assets/web-panel/assets/{Compact-Bq-APyyF.js → Compact-BU2BaqP-.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compliance-Dnb1YxPr.js → Compliance-D6ZYMCqZ.js} +1 -1
  18. package/src/assets/web-panel/assets/{Cowork-CZljerdQ.js → Cowork-DaZ8VW-I.js} +3 -3
  19. package/src/assets/web-panel/assets/{Cron-gAdbZOq7.js → Cron-DQY1RH9v.js} +2 -2
  20. package/src/assets/web-panel/assets/{Crosschain-DMPGXttD.js → Crosschain-BVR28vk9.js} +1 -1
  21. package/src/assets/web-panel/assets/{DID-C7dBDAv8.js → DID-N44KvTP-.js} +2 -2
  22. package/src/assets/web-panel/assets/{Dashboard-ByR4VcF8.js → Dashboard-Bjhlx6wS.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dropdown-Bc4tbiQN.js → Dropdown-CpLYxpy1.js} +1 -1
  24. package/src/assets/web-panel/assets/{EmailListRenderer-BhUN2pDw.js → EmailListRenderer-srEITSPI.js} +1 -1
  25. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DpJuANCD.js → FamilyGuardDashboard-juOC_fX2.js} +1 -1
  26. package/src/assets/web-panel/assets/{Federation-BEm4TvcE.js → Federation-nRaQtaXW.js} +1 -1
  27. package/src/assets/web-panel/assets/{FormItemContext-JnkPkhiC.js → FormItemContext-DflhTj09.js} +1 -1
  28. package/src/assets/web-panel/assets/{GenericCardRenderer-BfCzFUIC.js → GenericCardRenderer-DulI_3NI.js} +1 -1
  29. package/src/assets/web-panel/assets/{Git-1c0MWpmD.js → Git-BxOPefXn.js} +2 -2
  30. package/src/assets/web-panel/assets/{Governance-C_j3EBpv.js → Governance-C6G_Wnwi.js} +1 -1
  31. package/src/assets/web-panel/assets/{Inference-Cb7XRgtY.js → Inference-BnFYa2BF.js} +1 -1
  32. package/src/assets/web-panel/assets/{KnowledgeGraph-DoHPvHyK.js → KnowledgeGraph-TqQLEabm.js} +1 -1
  33. package/src/assets/web-panel/assets/{Logs-CYriKpy-.js → Logs-BH4AVh7s.js} +2 -2
  34. package/src/assets/web-panel/assets/{Marketplace-BT56-GD0.js → Marketplace-DoWLTaEE.js} +1 -1
  35. package/src/assets/web-panel/assets/{McpTools-B6XX_wnZ.js → McpTools-D6yC7OG_.js} +5 -5
  36. package/src/assets/web-panel/assets/{Memory-DRgNuaQc.js → Memory-DLCeHj21.js} +2 -2
  37. package/src/assets/web-panel/assets/{MobileBridge-B0qgvBN2.js → MobileBridge-BZBE0GRl.js} +1 -1
  38. package/src/assets/web-panel/assets/MobileProjects-DJA15G1J.js +1 -0
  39. package/src/assets/web-panel/assets/{Mtc-DnSFj9jw.js → Mtc-CyTKJDHn.js} +5 -5
  40. package/src/assets/web-panel/assets/{MtcAudit-c0tuz1sm.js → MtcAudit-DZKjgEVc.js} +5 -5
  41. package/src/assets/web-panel/assets/{Multisig-CVLBGioX.js → Multisig-2rMPNhSO.js} +3 -3
  42. package/src/assets/web-panel/assets/{NLProgramming-CFaqmNbx.js → NLProgramming-VeMk4Fx-.js} +1 -1
  43. package/src/assets/web-panel/assets/{Notes-BM_mNwU_.js → Notes-jr2GHMhh.js} +3 -3
  44. package/src/assets/web-panel/assets/{NotificationSettings-Sa1k3ReS.js → NotificationSettings-WN9VZyFb.js} +1 -1
  45. package/src/assets/web-panel/assets/{OrderTableRenderer-lWzmtqBh.js → OrderTableRenderer-CjNO-e9T.js} +1 -1
  46. package/src/assets/web-panel/assets/{Organization-C2blcq-P.js → Organization-DdjVHuzT.js} +4 -4
  47. package/src/assets/web-panel/assets/{Overflow-B3PwOJnK.js → Overflow-l8vBsGGq.js} +1 -1
  48. package/src/assets/web-panel/assets/{P2P-DaB9T6tb.js → P2P-CVQDHHwq.js} +2 -2
  49. package/src/assets/web-panel/assets/{PdhVaultBrowser-BpEBZ72n.js → PdhVaultBrowser-CTsNh8qE.js} +5 -5
  50. package/src/assets/web-panel/assets/{Permissions-BTkWInyH.js → Permissions-DLW87uyK.js} +3 -3
  51. package/src/assets/web-panel/assets/{PersonalDataHub-LHEwNmyL.js → PersonalDataHub-N8OvASTx.js} +2 -2
  52. package/src/assets/web-panel/assets/{Pipeline-DvWIxqH-.js → Pipeline-BPZmdlz2.js} +1 -1
  53. package/src/assets/web-panel/assets/{Privacy-BDbpBagU.js → Privacy-MFZw_GNh.js} +1 -1
  54. package/src/assets/web-panel/assets/{ProjectInit-DLeMDWWv.js → ProjectInit-zW0pEsfU.js} +2 -2
  55. package/src/assets/web-panel/assets/{ProjectSettings-BK3NsxIz.js → ProjectSettings-CppVHr_o.js} +2 -2
  56. package/src/assets/web-panel/assets/Projects-BTglkJO2.js +1 -0
  57. package/src/assets/web-panel/assets/{Providers-D2EvmPAd.js → Providers-CPHZ6JKT.js} +1 -1
  58. package/src/assets/web-panel/assets/{QrScannerModal-DAcu2fNg.js → QrScannerModal-DO4klNZ2.js} +1 -1
  59. package/src/assets/web-panel/assets/{QuickAsk-B7U850Yt.js → QuickAsk-B37TTqUa.js} +1 -1
  60. package/src/assets/web-panel/assets/{Recommend-bxNXLzOR.js → Recommend-n7KIfK7y.js} +1 -1
  61. package/src/assets/web-panel/assets/{RemoteSession-BsCjAfSJ.js → RemoteSession-SjVoS9mm.js} +2 -2
  62. package/src/assets/web-panel/assets/{Reputation-DZ9LPu-R.js → Reputation-Dt6RTeHi.js} +1 -1
  63. package/src/assets/web-panel/assets/{Row-cIYkCB3Y.js → Row-Dty6jz5V.js} +1 -1
  64. package/src/assets/web-panel/assets/{RssFeed-BxTNTtTp.js → RssFeed-DDLhqw5j.js} +3 -3
  65. package/src/assets/web-panel/assets/{Search-DSar6GhE.js → Search-DrYbXi-W.js} +1 -1
  66. package/src/assets/web-panel/assets/{Security-oCbIGysL.js → Security-Fc9Z6fbB.js} +4 -4
  67. package/src/assets/web-panel/assets/{Services-D8yojrNv.js → Services-BAhPgjSM.js} +2 -2
  68. package/src/assets/web-panel/assets/{Skeleton-vTA6P1eL.js → Skeleton-8JF7EPfE.js} +1 -1
  69. package/src/assets/web-panel/assets/{Skills-BXLf_KgZ.js → Skills-DL39dY0t.js} +1 -1
  70. package/src/assets/web-panel/assets/{Sla-Cpwxzz__.js → Sla-CSvjcATc.js} +1 -1
  71. package/src/assets/web-panel/assets/{SpeechSettings-DcPN9kCb.js → SpeechSettings-Demx7Gnx.js} +1 -1
  72. package/src/assets/web-panel/assets/{SyncSettings-DY0U5Vuj.js → SyncSettings-CKLnRWJr.js} +2 -2
  73. package/src/assets/web-panel/assets/Tasks-mhITRxjv.js +1 -0
  74. package/src/assets/web-panel/assets/{Templates-MD3nfWGm.js → Templates-AjQI5rxD.js} +1 -1
  75. package/src/assets/web-panel/assets/{Tenant-DKVnyGXM.js → Tenant-dbtEh1yR.js} +1 -1
  76. package/src/assets/web-panel/assets/{Terminal-DQMIZfWf.js → Terminal-DX-9jjfk.js} +2 -2
  77. package/src/assets/web-panel/assets/TimelineRenderer-C11EDZRt.js +1 -0
  78. package/src/assets/web-panel/assets/{Tokens-Cjvlttu6.js → Tokens-GiA9fiZn.js} +1 -1
  79. package/src/assets/web-panel/assets/{Trigger-CzNOEcoI.js → Trigger-BPcnclJn.js} +1 -1
  80. package/src/assets/web-panel/assets/{Trust-D5jg9iPA.js → Trust-C-DVY8nq.js} +1 -1
  81. package/src/assets/web-panel/assets/{UkeySign-59bMlvxY.js → UkeySign-DxodSwME.js} +1 -1
  82. package/src/assets/web-panel/assets/{VideoEditing-DmCzSBqn.js → VideoEditing-D_WV0O8O.js} +1 -1
  83. package/src/assets/web-panel/assets/{Wallet-DoFe8V6W.js → Wallet-DSeNlVSU.js} +4 -4
  84. package/src/assets/web-panel/assets/{WebAuthn-9POLER-w.js → WebAuthn-Bwuuvpz1.js} +5 -5
  85. package/src/assets/web-panel/assets/{WorkflowEditor-cFQH0Og6.js → WorkflowEditor-8M96EU1N.js} +1 -1
  86. package/src/assets/web-panel/assets/{chat-D3fR2NkZ.js → chat-D5S6SmLm.js} +1 -1
  87. package/src/assets/web-panel/assets/{colors-DiLEwE_P.js → colors-5fbnGkAP.js} +1 -1
  88. package/src/assets/web-panel/assets/{compact-item-CGfFDdic.js → compact-item-DaSuuMlW.js} +1 -1
  89. package/src/assets/web-panel/assets/{createContext-BbIbOPL2.js → createContext-BNOHcXAF.js} +1 -1
  90. package/src/assets/web-panel/assets/devWarning-K_woVElh.js +1 -0
  91. package/src/assets/web-panel/assets/{hasIn-DqyWp63_.js → hasIn-DONwZUra.js} +1 -1
  92. package/src/assets/web-panel/assets/index-3ILvaBpo.js +1 -0
  93. package/src/assets/web-panel/assets/{index-C2lZXIEA.js → index-5_fj5gVd.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-CH8gSMSA.js → index-B4L3gsNA.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-D3vQv3Kq.js → index-BEO5f7Vf.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-CySlHabI.js → index-BJp4kRjw.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-xm1KHUEQ.js → index-BK2N5yVW.js} +3 -3
  98. package/src/assets/web-panel/assets/{index-BiLP6SNu.js → index-BLzMuz38.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BtcjYHgn.js → index-B_yDD9Lm.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-FFlp8Jx9.js → index-BcWMZqb4.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-CIleIMTT.js → index-BcqOK7Lv.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-ns6bNnGo.js → index-BrAJSu-v.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-D16FSRMW.js → index-CAYmc5Nh.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BKxvHCqz.js → index-CEzd5m5a.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-CweXQM71.js → index-CLXf-8ek.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-BKeRBUtO.js → index-CSfYJqXt.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-auI9fxYH.js → index-CTZeOnzO.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-Db9UJVjj.js → index-Cf2OCa8q.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-Km36XQ3z.js → index-ClGqO-2X.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-C1S30j-Z.js → index-CmUOjyL6.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CHpI6g_S.js → index-Cn5LtyIH.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-CToOzfR2.js → index-CrkCFohi.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-BCoDp6o_.js → index-CztESwB4.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-kL8f4MRS.js → index-D7gs_3Ck.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-ComvO4hy.js → index-DHx2lhHW.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DdLwxj-F.js → index-DM3Ug61e.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-qHvMk0U3.js → index-DP2-3A_j.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DdjXemK-.js → index-DbdQBn4n.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DH6qaU1a.js → index-Dd7xwGcD.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CZQshOyI.js → index-Dm5A-MN5.js} +1 -1
  121. package/src/assets/web-panel/assets/index-JpB-FoZq.js +1 -0
  122. package/src/assets/web-panel/assets/{index-DPxmTldu.js → index-KwV9g_cf.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-hVGbmc7y.js → index-LRIt-AFl.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DQH--Uw5.js → index-MOgO5Yvx.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BtwvOuvO.js → index-PsMErAB1.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-fCfaVIr7.js → index-RkInlwV0.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-tLaW5UzZ.js → index-_6S41ikV.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DzuGkFvy.js → index-uR5KTNZA.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-ByE5tKjP.js → index-vYtprlNs.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-rTrejDjk.js → index-xo2f4DZR.js} +1 -1
  131. package/src/assets/web-panel/assets/{initDefaultProps-pg_7pnd6.js → initDefaultProps-CxwLynp9.js} +1 -1
  132. package/src/assets/web-panel/assets/{motion-B5GoJSZL.js → motion-XbPvGJbW.js} +1 -1
  133. package/src/assets/web-panel/assets/{move-BaJoe2FW.js → move-D1u5pcgS.js} +1 -1
  134. package/src/assets/web-panel/assets/{mtc-parser-CiQGbqtr.js → mtc-parser-BDxhTBMH.js} +1 -1
  135. package/src/assets/web-panel/assets/{omit-BFNEsKvU.js → omit-EtIFGg5k.js} +1 -1
  136. package/src/assets/web-panel/assets/{pickAttrs-YbSoANHm.js → pickAttrs-D33sWb0l.js} +1 -1
  137. package/src/assets/web-panel/assets/{placementArrow-C40MJPIH.js → placementArrow-BwFRzaGo.js} +1 -1
  138. package/src/assets/web-panel/assets/{responsiveObserve-LaVz2zF6.js → responsiveObserve-CBk2WqvQ.js} +1 -1
  139. package/src/assets/web-panel/assets/{slide-BkSoAGxF.js → slide-B52HtrKn.js} +1 -1
  140. package/src/assets/web-panel/assets/{statusUtils-C4jWjohA.js → statusUtils-D4qxqWnH.js} +1 -1
  141. package/src/assets/web-panel/assets/{styleChecker-BGqeIh-m.js → styleChecker-BxaCFlOL.js} +1 -1
  142. package/src/assets/web-panel/assets/{useFlexGapSupport-JsR5NMrM.js → useFlexGapSupport-B1lWlqXN.js} +1 -1
  143. package/src/assets/web-panel/assets/{useFs-DOiP38RR.js → useFs-C6VAU1_6.js} +1 -1
  144. package/src/assets/web-panel/assets/{usePersonalDataHub-C-nC0ymt.js → usePersonalDataHub-rEG6oXG8.js} +1 -1
  145. package/src/assets/web-panel/assets/{vnode-BalilHOU.js → vnode-DOTafkEi.js} +1 -1
  146. package/src/assets/web-panel/assets/{zoom-DjUELqks.js → zoom-BuwwN5K2.js} +1 -1
  147. package/src/assets/web-panel/index.html +1 -1
  148. package/src/command-manifest.json +8 -1
  149. package/src/commands/ask.js +1 -1
  150. package/src/commands/complete.js +147 -0
  151. package/src/data/changelog.json +7 -2
  152. package/src/index.js +2 -0
  153. package/src/assets/web-panel/assets/ChatBubbleRenderer-DNQsKN61.js +0 -1
  154. package/src/assets/web-panel/assets/MobileProjects-CRRfswf7.js +0 -1
  155. package/src/assets/web-panel/assets/Projects-BPWPg9zA.js +0 -1
  156. package/src/assets/web-panel/assets/Tasks-DKu3-sZJ.js +0 -1
  157. package/src/assets/web-panel/assets/TimelineRenderer-CugmNZTs.js +0 -1
  158. package/src/assets/web-panel/assets/devWarning-B6FRgsmP.js +0 -1
  159. package/src/assets/web-panel/assets/index-Cq411qtc.js +0 -1
  160. package/src/assets/web-panel/assets/index-D1oX0DK3.js +0 -1
@@ -0,0 +1,147 @@
1
+ /**
2
+ * `cc complete` — inline code completion (fill-in-the-middle) for IDE ghost-text.
3
+ *
4
+ * Reads a JSON request `{prefix, suffix, language, path}` on stdin and prints the
5
+ * raw code to insert at the cursor (or `--json` for a structured reply). The IDE
6
+ * side (VS Code InlineCompletionItemProvider / JetBrains InlineCompletionProvider)
7
+ * builds the request from the editor context and renders the reply as a ghost
8
+ * suggestion. Backend reuse: the SAME provider routing + config as `cc ask`
9
+ * (queryLLM), so it honors the user's configured LLM/provider/key with no new auth.
10
+ *
11
+ * Manual-trigger v1 (the IDE binds it to a keystroke), so a slow/expensive chat
12
+ * model is acceptable; a fast local FIM model (e.g. ollama qwen2.5-coder) just
13
+ * makes it snappier.
14
+ */
15
+ import { loadConfig } from "../lib/config-manager.js";
16
+ import { resolveOllamaBaseUrl, queryLLM } from "./ask.js";
17
+
18
+ /** Hard cap so a runaway model can't flood the editor with a whole file. */
19
+ export const MAX_COMPLETION_CHARS = 2000;
20
+
21
+ /**
22
+ * Build the chat prompt that asks the model to fill in code at the cursor.
23
+ * The cursor is marked with a sentinel between prefix and suffix so a plain
24
+ * chat model (no native FIM) still has the full bidirectional context.
25
+ */
26
+ export function buildFimPrompt(prefix, suffix, language) {
27
+ const lang = (language || "").trim() || "the given language";
28
+ const before = prefix == null ? "" : String(prefix);
29
+ const after = suffix == null ? "" : String(suffix);
30
+ return [
31
+ `You are an inline code-completion engine for ${lang}.`,
32
+ "Continue the code at the position marked <CURSOR>.",
33
+ "Output ONLY the raw code that should be inserted at the cursor —",
34
+ "no explanations, no markdown code fences, and do not repeat the",
35
+ "surrounding code. If nothing should be inserted, output nothing.",
36
+ "",
37
+ `${before}<CURSOR>${after}`,
38
+ ].join("\n");
39
+ }
40
+
41
+ /**
42
+ * Turn the model's raw reply into an insertion string: strip an accidental
43
+ * markdown fence, drop any echoed <CURSOR> sentinel, and hard-cap the length.
44
+ *
45
+ * We deliberately do NOT trim a suffix overlap here — a naive "completion ends
46
+ * with the suffix's first line" cut eats legitimate trailing tokens (e.g. an
47
+ * `if`-block's own `}`), so duplication is left to the prompt's "do not repeat
48
+ * the surrounding code" instruction instead.
49
+ */
50
+ export function cleanCompletion(raw) {
51
+ if (!raw) return "";
52
+ let s = String(raw);
53
+ // A model that ignored "no fences" wraps the code in ```lang … ```.
54
+ s = s.replace(/^\s*```[^\n]*\n?/, "").replace(/\n?```\s*$/, "");
55
+ s = s.replace(/<CURSOR>/g, "");
56
+ if (s.length > MAX_COMPLETION_CHARS) s = s.slice(0, MAX_COMPLETION_CHARS);
57
+ // Trim trailing whitespace only — leading indentation is meaningful.
58
+ return s.replace(/\s+$/, "");
59
+ }
60
+
61
+ /** Read a JSON request from stdin (empty string when nothing is piped in). */
62
+ function readStdin() {
63
+ return new Promise((resolve) => {
64
+ if (process.stdin.isTTY) {
65
+ resolve("");
66
+ return;
67
+ }
68
+ let data = "";
69
+ process.stdin.setEncoding("utf8");
70
+ process.stdin.on("data", (c) => (data += c));
71
+ process.stdin.on("end", () => resolve(data));
72
+ process.stdin.on("error", () => resolve(data));
73
+ });
74
+ }
75
+
76
+ export function registerCompleteCommand(program) {
77
+ program
78
+ .command("complete")
79
+ .description(
80
+ "Inline code completion (FIM) for IDE ghost-text: reads {prefix,suffix,language} JSON on stdin, prints the code to insert.",
81
+ )
82
+ .option("--provider <provider>", "override the LLM provider")
83
+ .option("--model <model>", "override the model")
84
+ .option("--base-url <url>", "override the provider base URL")
85
+ .option("--api-key <key>", "override the API key")
86
+ .option("--json", "output {completion,model,provider} as JSON")
87
+ .action(async (options) => {
88
+ const config = await loadConfig();
89
+ const rawIn = await readStdin();
90
+ let req = {};
91
+ try {
92
+ req = rawIn.trim() ? JSON.parse(rawIn) : {};
93
+ } catch {
94
+ req = {};
95
+ }
96
+ const prefix = typeof req.prefix === "string" ? req.prefix : "";
97
+ const suffix = typeof req.suffix === "string" ? req.suffix : "";
98
+ const language = req.language || "";
99
+
100
+ const emit = (completion, extra = {}) => {
101
+ if (options.json) {
102
+ process.stdout.write(JSON.stringify({ completion, ...extra }));
103
+ } else {
104
+ process.stdout.write(completion);
105
+ }
106
+ };
107
+
108
+ if (!prefix && !suffix) {
109
+ emit(""); // nothing to complete around
110
+ return;
111
+ }
112
+
113
+ const provider = options.provider || config.llm?.provider || "ollama";
114
+ const resolvedOptions = {
115
+ provider,
116
+ model:
117
+ options.model ||
118
+ config.llm?.model ||
119
+ (provider === "ollama" ? "qwen2.5-coder" : undefined),
120
+ apiKey: options.apiKey || config.llm?.apiKey,
121
+ };
122
+ resolvedOptions.baseUrl =
123
+ provider === "ollama"
124
+ ? resolveOllamaBaseUrl({ options, config })
125
+ : options.baseUrl || config.llm?.baseUrl;
126
+
127
+ try {
128
+ const reply = await queryLLM(
129
+ buildFimPrompt(prefix, suffix, language),
130
+ resolvedOptions,
131
+ );
132
+ emit(cleanCompletion(reply), {
133
+ model: resolvedOptions.model,
134
+ provider,
135
+ });
136
+ } catch (e) {
137
+ // Ghost-text must fail quiet: an empty suggestion, not an error dump in
138
+ // the editor. --json carries the reason for debugging.
139
+ if (options.json) {
140
+ emit("", { error: String(e?.message || e) });
141
+ } else {
142
+ process.stderr.write(String(e?.message || e) + "\n");
143
+ process.exitCode = 1;
144
+ }
145
+ }
146
+ });
147
+ }
@@ -3,18 +3,23 @@
3
3
  "releases": [
4
4
  {
5
5
  "productVersion": "Unreleased",
6
- "cliVersion": "0.162.153",
6
+ "cliVersion": "0.162.154",
7
7
  "cliVersions": [
8
8
  "0.4.46",
9
9
  "0.37.4",
10
10
  "0.162.150",
11
11
  "0.162.151",
12
12
  "0.162.152",
13
- "0.162.153"
13
+ "0.162.153",
14
+ "0.162.154"
14
15
  ],
15
16
  "date": null,
16
17
  "title": "",
17
18
  "sections": [
19
+ {
20
+ "heading": "Added — cc CLI 0.162.154:`cc complete` 内联补全后端(IDE ghost-text)+ 本地化残留清扫(CLI-only npm 发版)",
21
+ "body": "> `chainlesschain` 0.162.153 → **0.162.154** 已发 npm `latest`(经 `npm-publish.yml`,`--provenance --access public`)。纯 `packages/cli/src` 增量,未触 `pdh/lib` → 无 Android cc bundle rollover / 无 USR_VERSION 改动。发版动因:VS Code 0.37.7 + JetBrains 0.4.49 的内联 ghost-text 补全依赖 `cc complete`,此命令不在已发的 0.162.153 里 → 不发 npm 则两端补全功能对终端用户不可用。命令数 **164 → 165**(新增 `cc complete`,清单已重生)。发版前本机三层全绿(unit+integration+e2e)。\n\n- **`cc complete` — IDE 内联补全(fill-in-the-middle)后端**:读 stdin JSON `{prefix,suffix,language}` → 打印光标处应插入的代码(`--json` 输出 `{completion,model,provider}`)。复用 `cc ask` 的 provider 路由(`queryLLM`)——honor 用户已配置的 LLM/provider/key,零新鉴权(本地 FIM 模型如 `qwen2.5-coder` 更快,慢速 chat 模型也能用因为是手动触发)。纯可测 helper:`buildFimPrompt`(cursor-sentinel 提示让无原生 FIM 的 chat 模型也有双向上下文)+ `cleanCompletion`(剥 markdown fence / `<CURSOR>` / 硬上限 2000 字符;**故意不做 suffix-overlap 裁剪**——朴素「补全结尾等于 suffix 首行就切」会吃掉合法的结尾 token 如 `if` 块自己的 `}`,重复交给 prompt 的「勿重复周围代码」指令处理)。fail-quiet:后端故障返回空补全而非在编辑器里抛错。IDE 侧(VS Code `InlineCompletionItemProvider` / JetBrains `InlineCompletionProvider`)共享同一后端,两端行为一致。"
22
+ },
18
23
  {
19
24
  "heading": "Added — cc CLI 0.162.153:上游 Claude Code parity 封顶 2.1.191 → 2.1.204(6 项,CLI-only npm 发版)",
20
25
  "body": "> `chainlesschain` 0.162.152 → **0.162.153** 已发 npm `latest`(经 `npm-publish.yml`,`--provenance --access public`)。纯 `packages/cli/src` 增量,未触 `pdh/lib` → 无 Android cc bundle rollover / 无 USR_VERSION 改动。逐项经 Explore-agent grep 坐实上游 changelog(2.1.192→2.1.204)后落地,全部带回归测试(新增约 30 项);发版前本机三层全绿(unit+integration+e2e)。命令数不变(164;`cc team run --otlp` 只新增 option 非新命令)。判定明细 + N-A 清单见项目记忆 `cli-parity-gap-backlog`。\n\n- **`spawn_sub_agent` 后台模式(2.1.198)**:`background:true` 令子代理立即返回「running」句柄、父循环继续工作,结果在后续轮自动注水为 user-role 消息喂给模型;若模型想收尾但仍有后台子代理未决,循环**等待全部完成 + 注入结果 + 再给一轮**——后台成果永不静默丢失(迭代预算仍是兜底)。父 abort 信号前传防孤儿;settle-capture 包装永不 reject(未消费句柄不会变未处理 rejection);SubagentStop 钩子改在结果送达时 fire。opt-in 逐调用,省略 `background` 则阻塞路径字节不变。\n- **子代理中途失败/预算截断返回部分成果(2.1.199)**:被 API 错误(限流/掉线)或 token 预算截断的子代理此前丢弃已产出的一切(父级只见 `Sub-agent failed: <msg>` + 空 artifacts);现失败/强制完成结果把已产出内容摘要并入 summary(父模型唯一可见的通道)并保留截断前收集的 artifacts。\n- **交互权限询问 idle timeout(2.1.200)**:无人应答的权限询问此前永久阻塞整个 agent turn(`rl.question` 无超时);两个交互确认点(settings/hook `ask` + ApprovalGate)现把询问与可配置的空闲超时竞速,静默时**自动 DENY**(无人值守下 deny 是唯一安全答案)。默认关(行为字节不变),`CC_PERMISSION_ASK_TIMEOUT_MS` 环境变量或 config `permissions.askTimeoutMs` 开启;布尔/对象配置值按「非超时」拒绝。\n- **MCP roots 能力(2.1.203)**:roots 是**客户端**能力——服务器向客户端发 `roots/list` 请求索要工作区根、并订阅 `notifications/roots/list_changed`。此前**任何**服务器发起的请求都落进 `_handleMessage` 的通知分支、永不应答 → 服务器挂到自己超时。现客户端在 `initialize` 声明 `roots(listChanged)`、以会话工作目录(显式 `roots` 或 `process.cwd()`,`file://` URI)应答 `roots/list`、ack `ping`、未知服务器请求回 JSON-RPC `-32601` 而非静默;`setRoots()`/`notifyRootsListChanged()` 广播变更通知,REPL `/cd` 成功 chdir 后通知已连服务器。\n- **workflow 级 OTel 追踪属性 + `cc team run --otlp`(2.1.202)**:`TelemetryRecorder` 加 `defaultAttributes`(构造)+ `setDefaultAttribute()`——盖在每个 span 上,per-span 键优先;`agentLoop` 把 `workflow.run_id`(run id)+ 可选 `options.workflowName` 盖到本 run 全部 model/tool span。`TeamRunner` 接可选 recorder、每次执行发一个 `team.task` span(task key/holder/attempts;被丢弃的完成打标;失败记为 `task_failure` + error 状态)。新 `cc team run --otlp <file>` 写出以 team run id + 任务图文件名标记的 OTLP/JSON。真机验证:2 任务图 dry-run 产出 2 个共享同一 `workflow.run_id` 的 span。\n- **config.json 损坏先备份再降级(2.1.199)**:`loadConfig` 遇坏 config 此前已优雅降级(warn 一次 + 内存默认,读时不覆盖),但随后一跑 `cc config set` 的 load-modify-**save** 会原子替换坏文件为默认+新值,静默销毁用户仍留在坏 JSON 里的东西(API key / 自定义 baseUrl)。现首次失败加载把文件复制到 `config.json.corrupted`(固定同名、best-effort、每进程一次),警告指向它。"
package/src/index.js CHANGED
@@ -15,6 +15,7 @@ import { registerDbCommand } from "./commands/db.js";
15
15
  import { registerNoteCommand } from "./commands/note.js";
16
16
  import { registerChatCommand } from "./commands/chat.js";
17
17
  import { registerAskCommand } from "./commands/ask.js";
18
+ import { registerCompleteCommand } from "./commands/complete.js";
18
19
  import { registerLlmCommand } from "./commands/llm.js";
19
20
  import { registerHubCommand } from "./commands/hub.js";
20
21
  import { registerAndroidCommand } from "./commands/android.js";
@@ -429,6 +430,7 @@ export function createProgram(opts = {}) {
429
430
  registerNoteCommand(program);
430
431
  registerChatCommand(program);
431
432
  registerAskCommand(program);
433
+ registerCompleteCommand(program);
432
434
  registerLlmCommand(program);
433
435
  registerHubCommand(program);
434
436
  registerAndroidCommand(program);
@@ -1 +0,0 @@
1
- import{I as v,P as u,J as y,U as n,R as a,S,K as C,Q as x,V as w,_ as B,b as s}from"./vendor-BMxUs6UX.js";import{_ as k}from"./index-xm1KHUEQ.js";import"./icons-BsDmGpcT.js";const N={__name:"ChatBubbleRenderer",props:{event:{type:Object,required:!0}},setup(c,{expose:d}){d();const t=c,r=s(()=>{const e=t.event.content||{};return e.text||e.body||e.message||e.title||JSON.stringify(e).slice(0,200)}),i=s(()=>{const e=t.event.content||{};return e.from||e.sender||e.senderName||t.event.actor||"(unknown)"}),l=s(()=>{const e=(t.event.actor||"").toLowerCase();return e.includes("self")||e==="me"||e.endsWith("_self")}),o=s(()=>{const e=t.event.source.adapter||"";return e.startsWith("messaging-qq")?"magenta":e==="wechat"?"green":"blue"}),m=s(()=>{if(!t.event.occurredAt)return"";try{const e=new Date(t.event.occurredAt),p=e.getFullYear(),f=String(e.getMonth()+1).padStart(2,"0"),g=String(e.getDate()).padStart(2,"0"),b=String(e.getHours()).padStart(2,"0"),h=String(e.getMinutes()).padStart(2,"0");return`${p}-${f}-${g} ${b}:${h}`}catch{return""}}),_={props:t,messageText:r,actorLabel:i,isMine:l,adapterColor:o,formattedTime:m,computed:s};return Object.defineProperty(_,"__isScriptSetup",{enumerable:!1,value:!0}),_}},T={class:"bubble"},M={class:"meta"},R={class:"actor"},V={class:"time"},q={class:"body"};function A(c,d,t,r,i,l){const o=v("a-tag");return u(),y("div",{class:B(["chat-row",{mine:r.isMine}])},[n("div",T,[n("div",M,[n("span",R,a(r.actorLabel),1),n("span",V,a(r.formattedTime),1)]),n("div",q,a(r.messageText),1),t.event.source.adapter?(u(),S(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 P=k(N,[["render",A],["__scopeId","data-v-49238629"],["__file","/tmp/cc-web-panel-1UABPy/repo/packages/web-panel/src/components/pdh/renderers/ChatBubbleRenderer.vue"]]);export{P as default};
@@ -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 b}from"./vendor-BMxUs6UX.js";import{_ as v,b as m}from"./index-xm1KHUEQ.js";import{a7 as y,M as B}from"./icons-BsDmGpcT.js";const M={__name:"MobileProjects",setup(p,{expose:i}){i();const c=u(),{t:e}=m();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 m},get MobileOutlined(){return B},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),b(" "+t(e.t("mobileProjects.viewLocalProjects")),1)]),_:1}),l(d,{onClick:e.goToMobileBridge},{default:r(()=>[l(e.MobileOutlined),b(" "+t(e.t("mobileProjects.checkBridge")),1)]),_:1})]),_:1})]),_:1})]),_:1})])}const N=v(M,[["render",T],["__scopeId","data-v-9262cc45"],["__file","/tmp/cc-web-panel-1UABPy/repo/packages/web-panel/src/views/MobileProjects.vue"]]);export{N as default};
@@ -1 +0,0 @@
1
- import{I as i,J as U,U as I,R as s,Q as r,c as t,K as a,V as _,S as x,o as oe,b as ee,r as u,P as p,F as ne,a2 as ge}from"./vendor-BMxUs6UX.js";import{_ as we,b as re,u as ie,d}from"./index-xm1KHUEQ.js";import{u as de}from"./useShellMode-CgR0wCYM.js";import{aM as ke,aN as Fe,aO as be,f as je,a4 as Ce,a7 as xe,as as Oe,R as Se}from"./icons-BsDmGpcT.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 T=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"}],M=ee(()=>{const o={active:0,draft:0,completed:0,archived:0};for(const f of y.value)o[f.status]!==void 0&&(o[f.status]+=1);return o}),J=ee(()=>y.value.filter(o=>!(O.value&&o.status!==O.value||S.value&&!o.name.toLowerCase().includes(S.value.toLowerCase()))));function g(o){switch(o){case"active":return"green";case"draft":return"default";case"completed":return"cyan";case"archived":return"gold";default:return"default"}}function 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(){T.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{T.value=!1}}function G(o){return{onClick:()=>V(o)}}async function V(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 B(){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:T,projects:y,statusFilter:O,nameFilter:S,detailOpen:P,detail:v,files:h,filesLoading:k,createOpen:E,creating:L,newProject:F,columns:z,countByStatus:M,filteredProjects:J,statusColor:g,syncColor:K,formatTime:Q,loadAll:C,onRowClick:G,openDetail:V,onDelete:H,onShowCreate:X,onCreate:B,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"},Ue={class:"page-sub"},Ie={class:"filter-bar",style:{"margin-bottom":"12px",display:"flex",gap:"12px","align-items":"center"}},he={key:0,style:{"font-size":"12px",color:"#888"}},De={key:0,style:{color:"#888","font-size":"12px"}},Re={key:0},Be={key:1,style:{color:"#888"}},Te=["onClick"],Ee={key:0,style:{color:"#888","font-size":"12px"}};function Le(se,l,te,e,W,w){const T=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"),M=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"),V=i("a-list"),H=i("a-spin"),X=i("a-drawer"),B=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(),U("div",null,[I("div",ze,[I("div",null,[I("h2",Ae,s(e.t("projects.title")),1),I("p",Ue,[l[17]||(l[17]=r("桌面 / CLI / 手机 三端共享同一份项目数据,Phase 3d sync 自动同步 (",-1)),t(T,{to:"/project-init"},{default:a(()=>[...l[16]||(l[16]=[r("项目初始化 / 环境设置",-1)])]),_:1}),l[18]||(l[18]=r(")",-1))])]),t(O,null,{default:a(()=>[t(y,{loading:e.loading,onClick:e.loadAll},{icon:a(()=>[t(e.ReloadOutlined)]),default:a(()=>[l[19]||(l[19]=r(" 刷新 ",-1))]),_:1},8,["loading"]),t(y,{type:"primary",onClick:e.onShowCreate},{icon:a(()=>[t(e.PlusOutlined)]),default:a(()=>[l[20]||(l[20]=r(" 新建项目 ",-1))]),_:1})]),_:1})]),_(" Stats "),t(h,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"总项目",value:e.projects.length,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:a(()=>[t(e.FolderOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"活跃",value:e.countByStatus.active,"value-style":{color:"#52c41a",fontSize:"20px"}},{prefix:a(()=>[t(e.CheckCircleOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"草稿",value:e.countByStatus.draft,"value-style":{color:"#8c8c8c",fontSize:"20px"}},{prefix:a(()=>[t(e.FileTextOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"已完成",value:e.countByStatus.completed,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:a(()=>[t(e.CheckSquareOutlined)]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),_(" Filter "),I("div",Ie,[t(E,{value:e.statusFilter,"onUpdate:value":l[0]||(l[0]=n=>e.statusFilter=n),size:"small","button-style":"solid"},{default:a(()=>[t(k,{value:""},{default:a(()=>[...l[21]||(l[21]=[r("全部",-1)])]),_:1}),t(k,{value:"active"},{default:a(()=>[...l[22]||(l[22]=[r("活跃",-1)])]),_:1}),t(k,{value:"draft"},{default:a(()=>[...l[23]||(l[23]=[r("草稿",-1)])]),_:1}),t(k,{value:"completed"},{default:a(()=>[...l[24]||(l[24]=[r("已完成",-1)])]),_:1}),t(k,{value:"archived"},{default:a(()=>[...l[25]||(l[25]=[r("已归档",-1)])]),_:1})]),_:1},8,["value"]),t(L,{value:e.nameFilter,"onUpdate:value":l[1]||(l[1]=n=>e.nameFilter=n),placeholder:"按名称过滤",style:{"max-width":"260px"},"allow-clear":""},null,8,["value"])]),!e.projects.length&&!e.loading?(p(),x(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(),U("code",he,s(c.id.slice(0,8))+"…",1)):n.key==="name"?(p(),U(ne,{key:1},[I("strong",null,s(c.name),1),c.description?(p(),U("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(),U(ne,{key:5},[r(s(e.formatTime(c.updated_at)),1)],64)):n.key==="actions"?(p(),x(O,{key:6,onClick:l[2]||(l[2]=ge(()=>{},["stop"]))},{default:a(()=>[t(y,{size:"small",onClick:q=>e.openDetail(c)},{default:a(()=>[...l[26]||(l[26]=[r("详情",-1)])]),_:1},8,["onClick"]),t(M,{title:`删除项目 '${c.name}' ?`,"ok-text":"删除","ok-type":"danger","cancel-text":"取消",onConfirm:q=>e.onDelete(c)},{default:a(()=>[t(y,{size:"small",danger:""},{default:a(()=>[...l[27]||(l[27]=[r("删除",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)):_("v-if",!0)]),_:1},8,["data-source","loading"])):_("v-if",!0),_(" Detail drawer "),t(X,{open:e.detailOpen,"onUpdate:open":l[3]||(l[3]=n=>e.detailOpen=n),title:e.detail?.name||"项目详情",width:"640",placement:"right"},{default:a(()=>[e.detail?(p(),x(K,{key:0,column:1,bordered:"",size:"small"},{default:a(()=>[t(g,{label:"ID"},{default:a(()=>[I("code",null,s(e.detail.id),1)]),_:1}),t(g,{label:"名称"},{default:a(()=>[r(s(e.detail.name),1)]),_:1}),t(g,{label:"描述"},{default:a(()=>[r(s(e.detail.description||"-"),1)]),_:1}),t(g,{label:"类型"},{default:a(()=>[t(z,null,{default:a(()=>[r(s(e.detail.project_type),1)]),_:1})]),_:1}),t(g,{label:"状态"},{default:a(()=>[t(z,{color:e.statusColor(e.detail.status)},{default:a(()=>[r(s(e.detail.status),1)]),_:1},8,["color"])]),_:1}),t(g,{label:"同步状态"},{default:a(()=>[t(z,{color:e.syncColor(e.detail.sync_status)},{default:a(()=>[r(s(e.detail.sync_status||"unknown"),1)]),_:1},8,["color"])]),_:1}),t(g,{label:"用户"},{default:a(()=>[r(s(e.detail.user_id),1)]),_:1}),t(g,{label:"根路径"},{default:a(()=>[e.detail.root_path?(p(),U("code",Re,s(e.detail.root_path),1)):(p(),U("span",Be,"(无)"))]),_: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(V,{key:1,size:"small","data-source":e.files},{renderItem:a(({item:n})=>[t(G,null,{extra:a(()=>[t(O,null,{default:a(()=>[n.file_size?(p(),U("span",Ee,s(n.file_size)+" B",1)):_("v-if",!0),t(M,{title:`删除 ${n.is_folder?"文件夹":"文件"} '${n.file_name}' ?`,"ok-text":"删除","ok-type":"danger","cancel-text":"取消",onConfirm:c=>e.onDeleteFile(n)},{default:a(()=>[t(y,{size:"small",danger:""},{default:a(()=>[...l[31]||(l[31]=[r("×",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)]),default:a(()=>[I("span",{style:{cursor:"pointer"},onClick:c=>e.openEditFile(n)},s(n.is_folder?"📁":"📄")+" "+s(n.file_path),9,Te)]),_: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(B,{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(B,{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(B,{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(B,{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-1UABPy/repo/packages/web-panel/src/views/Projects.vue"]]);export{We as default};
@@ -1 +0,0 @@
1
- import{E as F,b as D,r as R,I as p,J as c,U as _,c as n,K as a,S as C,V as x,o as B,x as I,P as i,Q as k,R as r,F as T,Z as O}from"./vendor-BMxUs6UX.js";import{u as P,_ as U}from"./index-xm1KHUEQ.js";import{R as E}from"./icons-BsDmGpcT.js";const V=F("tasks",()=>{const y=R([]),l=R(!1);let u=null,t=null,d=null;const b=D(()=>y.value.filter(e=>e.status==="running")),v=D(()=>y.value.filter(e=>e.status==="pending")),w=D(()=>y.value.filter(e=>e.status==="completed"||e.status==="failed"||e.status==="timeout"));async function s(){const e=P();l.value=!0;try{const g=await e.sendRaw({type:"tasks-list"});g&&Array.isArray(g.tasks)&&(y.value=g.tasks)}catch{}finally{l.value=!1}}async function m(e){const g=P();try{await g.sendRaw({type:"tasks-stop",taskId:e})}catch{}finally{await s()}}const f=R(null);function h(e=5e3){N(),s(),u=setInterval(s,e),S()}function N(){u&&(clearInterval(u),u=null),t&&(t(),t=null),d&&(clearTimeout(d),d=null)}function S(){const e=P();if(t)return;const g=z=>{z.type==="task:notification"&&z.payload?.task&&(f.value=z.payload.task,s(),d&&clearTimeout(d),d=setTimeout(()=>{f.value=null,d=null},8e3))};t=e.onRuntimeEvent(g)}function A(e){return!e||e<0?"-":e<1e3?`${e}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${(e/6e4).toFixed(1)}m`}function o(e){switch(e){case"running":return"processing";case"pending":return"default";case"completed":return"success";case"failed":return"error";case"timeout":return"warning";default:return"default"}}return{tasks:y,loading:l,running:b,pending:v,completed:w,lastNotification:f,fetchTasks:s,stopTask:m,startPolling:h,stopPolling:N,formatDuration:A,getStatusColor:o}}),L={__name:"Tasks",setup(y,{expose:l}){l();const u=V(),t=[{title:"状态",key:"status",width:90},{title:"描述",key:"description",ellipsis:!0},{title:"类型",dataIndex:"type",width:100},{title:"耗时",key:"duration",width:90},{title:"创建时间",key:"createdAt",width:180},{title:"结果",key:"result",ellipsis:!0},{title:"操作",key:"action",width:80}];function d(s){return s.status==="running"&&s.startedAt?u.formatDuration(Date.now()-s.startedAt):s.completedAt&&s.startedAt?u.formatDuration(s.completedAt-s.startedAt):"-"}function b(s){return s?new Date(s).toLocaleString():"-"}function v(s,m){return s?s.length>m?`${s.slice(0,m)}...`:s:""}B(()=>u.startPolling(5e3)),I(()=>u.stopPolling());const w={store:u,columns:t,getDuration:d,formatTime:b,truncate:v,onMounted:B,onUnmounted:I,get ReloadOutlined(){return E},get useTasksStore(){return V}};return Object.defineProperty(w,"__isScriptSetup",{enumerable:!1,value:!0}),w}},j={class:"page-header"},J={key:0,class:"error-text"},K={key:1},M={class:"task-header"},Q={class:"task-desc"},W={class:"task-id"},Z={class:"task-meta"},q=["title"],G={key:0,class:"error-text"},H={key:1,class:"success-text"},X={key:2,class:"muted-text"};function Y(y,l,u,t,d,b){const v=p("a-button"),w=p("a-space"),s=p("a-alert"),m=p("a-statistic"),f=p("a-card"),h=p("a-col"),N=p("a-row"),S=p("a-tag"),A=p("a-table");return i(),c("div",null,[_("div",j,[l[3]||(l[3]=_("div",null,[_("h2",{class:"page-title"},"后台任务"),_("p",{class:"page-sub"},"查看后台任务队列、实时通知和任务执行结果。")],-1)),n(w,null,{default:a(()=>[n(v,{ghost:"",loading:t.store.loading,onClick:l[0]||(l[0]=o=>t.store.fetchTasks())},{icon:a(()=>[n(t.ReloadOutlined)]),default:a(()=>[l[2]||(l[2]=k(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),t.store.lastNotification?(i(),C(s,{key:0,type:t.store.lastNotification.status==="completed"?"success":"error","show-icon":"",closable:"",class:"banner",onClose:l[1]||(l[1]=o=>t.store.lastNotification=null)},{message:a(()=>[k(" 任务"+r(t.store.lastNotification.status==="completed"?"完成":"结束")+": "+r(t.store.lastNotification.description||t.store.lastNotification.id.slice(0,16)),1)]),description:a(()=>[t.store.lastNotification.error?(i(),c("span",J,r(t.store.lastNotification.error),1)):t.store.lastNotification.result?(i(),c("span",K,r(t.truncate(String(t.store.lastNotification.result),120)),1)):x("v-if",!0)]),_:1},8,["type"])):x("v-if",!0),n(N,{gutter:[16,16],class:"stats-row"},{default:a(()=>[n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"全部任务",value:t.store.tasks.length},null,8,["value"])]),_:1})]),_:1}),n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"运行中",value:t.store.running.length},null,8,["value"])]),_:1})]),_:1}),n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"等待中",value:t.store.pending.length},null,8,["value"])]),_:1})]),_:1}),n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"已完成",value:t.store.completed.length},null,8,["value"])]),_:1})]),_:1})]),_:1}),t.store.running.length>0?(i(),C(f,{key:1,title:"运行中的任务",class:"panel-card",size:"small"},{default:a(()=>[(i(!0),c(T,null,O(t.store.running,o=>(i(),c("div",{key:o.id,class:"task-item running"},[_("div",M,[n(S,{color:t.store.getStatusColor(o.status)},{default:a(()=>[k(r(o.status.toUpperCase()),1)]),_:2},1032,["color"]),_("span",Q,r(o.description),1),_("span",W,r(o.id.slice(0,16)),1)]),_("div",Z,[_("span",null,"类型: "+r(o.type||"-"),1),_("span",null,"已运行: "+r(t.store.formatDuration(Date.now()-o.startedAt)),1),n(v,{size:"small",danger:"",onClick:e=>t.store.stopTask(o.id)},{default:a(()=>[...l[4]||(l[4]=[k("停止",-1)])]),_:1},8,["onClick"])])]))),128))]),_:1})):x("v-if",!0),n(f,{class:"panel-card"},{default:a(()=>[n(A,{columns:t.columns,"data-source":t.store.tasks,pagination:{pageSize:15,size:"small"},loading:t.store.loading,"row-key":"id",size:"small"},{bodyCell:a(({column:o,record:e})=>[o.key==="status"?(i(),C(S,{key:0,color:t.store.getStatusColor(e.status)},{default:a(()=>[k(r(e.status),1)]),_:2},1032,["color"])):o.key==="description"?(i(),c("span",{key:1,title:e.command},r(e.description),9,q)):o.key==="duration"?(i(),c(T,{key:2},[k(r(t.getDuration(e)),1)],64)):o.key==="createdAt"?(i(),c(T,{key:3},[k(r(t.formatTime(e.createdAt)),1)],64)):o.key==="result"?(i(),c(T,{key:4},[e.error?(i(),c("span",G,r(t.truncate(e.error,60)),1)):e.result?(i(),c("span",H,r(t.truncate(String(e.result),60)),1)):(i(),c("span",X,"-"))],64)):o.key==="action"?(i(),c(T,{key:5},[e.status==="running"?(i(),C(v,{key:0,size:"small",danger:"",onClick:g=>t.store.stopTask(e.id)},{default:a(()=>[...l[5]||(l[5]=[k(" 停止 ",-1)])]),_:1},8,["onClick"])):x("v-if",!0)],64)):x("v-if",!0)]),_:1},8,["data-source","loading"])]),_:1})])}const st=U(L,[["render",Y],["__scopeId","data-v-da5ff6a2"],["__file","/tmp/cc-web-panel-1UABPy/repo/packages/web-panel/src/views/Tasks.vue"]]);export{st as default};
@@ -1 +0,0 @@
1
- import{I as S,P as n,J as i,U as l,S as h,R as o,c,K as d,Q as u,V as g,b as a}from"./vendor-BMxUs6UX.js";import{_ as b}from"./index-xm1KHUEQ.js";import{aD as O,aH as D}from"./icons-BsDmGpcT.js";const C={__name:"TimelineRenderer",props:{event:{type:Object,required:!0}},setup(v,{expose:_}){_();const r=v,e=a(()=>r.event.content||{}),p=a(()=>{const t=r.event.source.adapter||"";return t.startsWith("travel-12306")||t.startsWith("travel-ctrip")}),m=a(()=>e.value.from&&e.value.to?`${e.value.from} → ${e.value.to}`:e.value.origin&&e.value.destination?`${e.value.origin} → ${e.value.destination}`:null),s=a(()=>r.event.place||e.value.placeName||e.value.poi),N=a(()=>e.value.trainNo),y=a(()=>e.value.flightNo),T=a(()=>e.value.title||e.value.text||e.value.description||"—"),k=a(()=>{const t=[];return e.value.departureTime&&t.push(`出发 ${e.value.departureTime}`),e.value.arrivalTime&&t.push(`到达 ${e.value.arrivalTime}`),e.value.duration&&t.push(`${e.value.duration}`),e.value.distance&&t.push(`${e.value.distance}`),t.length?t.join(" · "):null}),x=a(()=>{if(!r.event.occurredAt)return"";const t=new Date(r.event.occurredAt);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}),f={props:r,c:e,isTravel:p,route:m,placeName:s,trainNo:N,flightNo:y,fallbackText:T,extraDetail:k,formattedTime:x,computed:a,get CarOutlined(){return D},get EnvironmentOutlined(){return O}};return Object.defineProperty(f,"__isScriptSetup",{enumerable:!1,value:!0}),f}},B={class:"timeline-event"},V={class:"dot"},w={class:"card"},E={class:"head"},R={class:"time"},j={class:"primary"},A={key:0},P={key:1},H={key:2},I={key:0,class:"trip-no"},M={key:1,class:"extra"};function U(v,_,r,e,p,m){const s=S("a-tag");return n(),i("div",B,[l("div",V,[e.isTravel?(n(),h(e.CarOutlined,{key:0})):(n(),h(e.EnvironmentOutlined,{key:1}))]),l("div",w,[l("div",E,[l("span",R,o(e.formattedTime),1),c(s,{color:"cyan"},{default:d(()=>[u(o(r.event.source.adapter),1)]),_:1}),c(s,null,{default:d(()=>[u(o(r.event.subtype),1)]),_:1})]),l("div",j,[e.route?(n(),i("span",A,o(e.route),1)):e.placeName?(n(),i("span",P,"📍 "+o(e.placeName),1)):(n(),i("span",H,o(e.fallbackText),1))]),e.trainNo||e.flightNo?(n(),i("div",I,[c(s,{color:"blue"},{default:d(()=>[u(o(e.trainNo||e.flightNo),1)]),_:1})])):g("v-if",!0),e.extraDetail?(n(),i("div",M,o(e.extraDetail),1)):g("v-if",!0)])])}const J=b(C,[["render",U],["__scopeId","data-v-18400280"],["__file","/tmp/cc-web-panel-1UABPy/repo/packages/web-panel/src/components/pdh/renderers/TimelineRenderer.vue"]]);export{J as default};
@@ -1 +0,0 @@
1
- import{Q as r}from"./index-xm1KHUEQ.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-CQsdzczt.js";import{a0 as t}from"./index-xm1KHUEQ.js";import"./vendor-BMxUs6UX.js";import"./index-C1S30j-Z.js";import"./icons-BsDmGpcT.js";const s=t(o);export{s as default};
@@ -1 +0,0 @@
1
- import{A as o}from"./Row-cIYkCB3Y.js";import{a0 as t}from"./index-xm1KHUEQ.js";import"./vendor-BMxUs6UX.js";import"./responsiveObserve-LaVz2zF6.js";import"./useFlexGapSupport-JsR5NMrM.js";import"./styleChecker-BGqeIh-m.js";import"./index-C1S30j-Z.js";import"./icons-BsDmGpcT.js";const l=t(o);export{l as default};