@vibe-forge/client 2.0.1 → 3.0.0-alpha.0

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 (85) hide show
  1. package/dist/assets/{arc-CqviK3HX.js → arc-1JbypnRY.js} +1 -1
  2. package/dist/assets/{blockDiagram-c4efeb88-BEp50UHp.js → blockDiagram-c4efeb88-jT5b9nId.js} +1 -1
  3. package/dist/assets/{c4Diagram-c83219d4-C5w55JzM.js → c4Diagram-c83219d4-KNPh-1ta.js} +1 -1
  4. package/dist/assets/channel-pzvjJnfd.js +1 -0
  5. package/dist/assets/{classDiagram-beda092f-CQJVtHEy.js → classDiagram-beda092f-vvXuOT3F.js} +1 -1
  6. package/dist/assets/{classDiagram-v2-2358418a-B37Xl9jB.js → classDiagram-v2-2358418a-vH4j7skr.js} +1 -1
  7. package/dist/assets/clone-CtWwIeUb.js +1 -0
  8. package/dist/assets/{createText-1719965b-9YwvWMdV.js → createText-1719965b-COeSYnf3.js} +1 -1
  9. package/dist/assets/{cssMode-BX88r5f4.js → cssMode-Doc7QRKn.js} +1 -1
  10. package/dist/assets/{edges-96097737-CNHoXVrD.js → edges-96097737-D09v6R_r.js} +1 -1
  11. package/dist/assets/{erDiagram-0228fc6a-BoYldy0g.js → erDiagram-0228fc6a-CbZ6rfxl.js} +1 -1
  12. package/dist/assets/{flowDb-c6c81e3f-CoPw_R-Q.js → flowDb-c6c81e3f-CnZOzhdk.js} +1 -1
  13. package/dist/assets/{flowDiagram-50d868cf-nCqbSXd-.js → flowDiagram-50d868cf-jv-xWM2p.js} +1 -1
  14. package/dist/assets/flowDiagram-v2-4f6560a1-BiyrkIKs.js +1 -0
  15. package/dist/assets/{flowchart-elk-definition-6af322e1-BwMuPTrV.js → flowchart-elk-definition-6af322e1-D8pf677G.js} +1 -1
  16. package/dist/assets/{freemarker2-DUFDSvgj.js → freemarker2-CL0o23Gj.js} +1 -1
  17. package/dist/assets/{ganttDiagram-a2739b55-CLNH3S_C.js → ganttDiagram-a2739b55-BAPQzC4u.js} +1 -1
  18. package/dist/assets/{gitGraphDiagram-82fe8481-uDu1ectX.js → gitGraphDiagram-82fe8481-BI2x71m0.js} +1 -1
  19. package/dist/assets/{graph-DuC4kt4I.js → graph-CZK4Bjpq.js} +1 -1
  20. package/dist/assets/{handlebars-BSd4a6l9.js → handlebars-CCG38Pg6.js} +1 -1
  21. package/dist/assets/{html-H48gEjQd.js → html-BddshTWG.js} +1 -1
  22. package/dist/assets/{htmlMode-Nqw7-Nqh.js → htmlMode-xKXiYcDz.js} +1 -1
  23. package/dist/assets/{index-5325376f-rnz0GXAT.js → index-5325376f-BWMTD8RU.js} +1 -1
  24. package/dist/assets/{index-DeQLT67a.js → index-CBe7kDkV.js} +322 -322
  25. package/dist/assets/{index-DiOCtPLP.css → index-MWOwVzqE.css} +1 -1
  26. package/dist/assets/{infoDiagram-8eee0895-BsGB550b.js → infoDiagram-8eee0895-CR78btIF.js} +1 -1
  27. package/dist/assets/{javascript-0g2herYV.js → javascript-BPlRHPjg.js} +1 -1
  28. package/dist/assets/{journeyDiagram-c64418c1-DLldlz0H.js → journeyDiagram-c64418c1-DZRv6FKz.js} +1 -1
  29. package/dist/assets/{jsonMode-CN5ZURMh.js → jsonMode-BYLVfdkf.js} +1 -1
  30. package/dist/assets/{layout-QKUiDNJK.js → layout-BtudyPU2.js} +1 -1
  31. package/dist/assets/{line-CeP3XWjD.js → line-DgHXrIhS.js} +1 -1
  32. package/dist/assets/{linear-74cQVgWT.js → linear-DtBoKICx.js} +1 -1
  33. package/dist/assets/{liquid-B6cRrfrb.js → liquid-DxBlJk0W.js} +1 -1
  34. package/dist/assets/{lspLanguageFeatures-C5ogOh5E.js → lspLanguageFeatures-DmKVpmeH.js} +1 -1
  35. package/dist/assets/{mdx-BBIy-KRj.js → mdx-DrScsd-w.js} +1 -1
  36. package/dist/assets/{mermaid.core-BhdbV0mr.js → mermaid.core-Cj_NJ_lZ.js} +4 -4
  37. package/dist/assets/{mindmap-definition-8da855dc-B67VKJuD.js → mindmap-definition-8da855dc-CMXbwtsc.js} +1 -1
  38. package/dist/assets/{pieDiagram-a8764435-Cxv9WY_E.js → pieDiagram-a8764435-Bd6rfpJv.js} +1 -1
  39. package/dist/assets/{python-CBdGo8__.js → python-Crbi7B7n.js} +1 -1
  40. package/dist/assets/{quadrantDiagram-1e28029f-BTkj65P_.js → quadrantDiagram-1e28029f-H-FdBQn6.js} +1 -1
  41. package/dist/assets/{razor-azKH0Dwj.js → razor-DHyrzIfE.js} +1 -1
  42. package/dist/assets/{requirementDiagram-08caed73-D4jVXpOT.js → requirementDiagram-08caed73-BSyCVDSG.js} +1 -1
  43. package/dist/assets/{sankeyDiagram-a04cb91d-CXhutIA1.js → sankeyDiagram-a04cb91d-S6E6BReg.js} +1 -1
  44. package/dist/assets/{sequenceDiagram-c5b8d532-B56TTZlx.js → sequenceDiagram-c5b8d532-BMHY4KMj.js} +1 -1
  45. package/dist/assets/{stateDiagram-1ecb1508-Cs0plMcS.js → stateDiagram-1ecb1508-BMrMw6XR.js} +1 -1
  46. package/dist/assets/{stateDiagram-v2-c2b004d7-LSJaXPJN.js → stateDiagram-v2-c2b004d7-B5SIFUb_.js} +1 -1
  47. package/dist/assets/{styles-b4e223ce-UdXfHMuu.js → styles-b4e223ce-DqiXwnx3.js} +1 -1
  48. package/dist/assets/{styles-ca3715f6-EuRy_hTu.js → styles-ca3715f6-jNxW2Db8.js} +1 -1
  49. package/dist/assets/{styles-d45a18b0-B24zVoK3.js → styles-d45a18b0-C4nlfLcZ.js} +1 -1
  50. package/dist/assets/{svgDrawCommon-b86b1483-B2S0NW3K.js → svgDrawCommon-b86b1483-FIWFuZfb.js} +1 -1
  51. package/dist/assets/{timeline-definition-faaaa080-DFWKh9mU.js → timeline-definition-faaaa080-CEQDoqdf.js} +1 -1
  52. package/dist/assets/{tsMode-FZsHWiOn.js → tsMode-DnNy3rE9.js} +1 -1
  53. package/dist/assets/{typescript-CYdJ3s3D.js → typescript-YBZ4vw5B.js} +1 -1
  54. package/dist/assets/{xml-C16X_hpZ.js → xml-BJGGYD70.js} +1 -1
  55. package/dist/assets/{xychartDiagram-f5964ef8-DyBiBYci.js → xychartDiagram-f5964ef8-DUNOFOk0.js} +1 -1
  56. package/dist/assets/{yaml-CRjA4-Rj.js → yaml-BMY4mu5s.js} +1 -1
  57. package/dist/index.html +2 -2
  58. package/package.json +13 -13
  59. package/src/components/ConfigView.scss +7 -6
  60. package/src/components/ConfigView.tsx +2 -1
  61. package/src/components/Sidebar.tsx +1 -0
  62. package/src/components/automation-view/@components/AutomationTaskComposer.tsx +10 -8
  63. package/src/components/automation-view/AutomationEmptyLanding.tsx +12 -0
  64. package/src/components/automation-view/TaskList.scss +5 -1
  65. package/src/components/chat/ChatHistoryView.tsx +5 -3
  66. package/src/components/chat/NewSessionGuide.tsx +16 -10
  67. package/src/components/chat/NewSessionGuideStarterList.tsx +4 -1
  68. package/src/components/chat/NewSessionGuideStarterSection.tsx +2 -1
  69. package/src/components/chat/messages/MessageItem.tsx +19 -5
  70. package/src/components/chat/messages/message-action-utils.ts +11 -0
  71. package/src/components/chat/sender/Sender.scss +12 -0
  72. package/src/components/config/AppSettingsPanel.tsx +84 -30
  73. package/src/components/knowledge-base/components/@hooks/use-skills-cli-modal-controller.ts +157 -0
  74. package/src/components/knowledge-base/components/@hooks/use-skills-tab-actions.ts +63 -0
  75. package/src/components/knowledge-base/components/SkillsTab.tsx +40 -193
  76. package/src/components/sidebar/SidebarHeader.tsx +44 -26
  77. package/src/components/sidebar/sidebar-search-visibility.ts +18 -0
  78. package/src/hooks/useQueryParams.ts +91 -23
  79. package/src/resources/locales/en.json +12 -0
  80. package/src/resources/locales/zh.json +12 -0
  81. package/src/routes/ChatRoute.scss +50 -45
  82. package/src/store/index.ts +111 -3
  83. package/dist/assets/channel-C6LTxxLg.js +0 -1
  84. package/dist/assets/clone-CG6ZcokX.js +0 -1
  85. package/dist/assets/flowDiagram-v2-4f6560a1-CSZTI7GQ.js +0 -1
@@ -267,71 +267,80 @@
267
267
  }
268
268
  }
269
269
 
270
+ .sender-container {
271
+ flex: 0;
272
+ display: flex;
273
+ flex-direction: column;
274
+ gap: 8px;
275
+ min-width: 0;
276
+ justify-content: flex-end;
277
+ transition:
278
+ flex .4s cubic-bezier(.4, 0, .2, 1),
279
+ padding-bottom .4s cubic-bezier(.4, 0, .2, 1);
280
+ }
281
+
270
282
  .chat-thinking-indicator {
271
- align-self: stretch;
272
283
  display: flex;
273
- justify-content: center;
274
- padding: 4px 0 2px;
284
+ justify-content: flex-start;
285
+ padding: 0;
275
286
  min-width: 0;
287
+ width: 100%;
276
288
  }
277
289
 
278
290
  .chat-thinking-indicator__text {
279
291
  display: inline-flex;
280
292
  align-items: center;
281
- max-width: 100%;
282
- font-size: 13px;
283
- line-height: 1.45;
284
- font-weight: 500;
285
- letter-spacing: .02em;
293
+ justify-content: flex-start;
294
+ position: relative;
295
+ isolation: isolate;
296
+ overflow: hidden;
297
+ max-width: min(90%, 100%);
298
+ font-size: 14px;
299
+ line-height: 1.6;
300
+ font-weight: 400;
286
301
  white-space: nowrap;
287
- color: color-mix(in srgb, var(--sub-text-color) 88%, var(--text-color) 12%);
288
- background-image: linear-gradient(
289
- 90deg,
290
- color-mix(in srgb, var(--sub-text-color) 88%, var(--text-color) 12%) 0%,
291
- color-mix(in srgb, var(--sub-text-color) 88%, var(--text-color) 12%) 34%,
292
- color-mix(in srgb, var(--text-color) 88%, white 12%) 50%,
293
- color-mix(in srgb, var(--sub-text-color) 88%, var(--text-color) 12%) 66%,
294
- color-mix(in srgb, var(--sub-text-color) 88%, var(--text-color) 12%) 100%
302
+ text-align: left;
303
+ color: var(--text-color);
304
+ }
305
+
306
+ .chat-thinking-indicator__text::after {
307
+ content: '';
308
+ position: absolute;
309
+ inset: -1px -20%;
310
+ border-radius: 999px;
311
+ pointer-events: none;
312
+ background: linear-gradient(
313
+ 100deg,
314
+ transparent 18%,
315
+ rgba(255, 255, 255, 0) 34%,
316
+ rgba(255, 255, 255, .08) 42%,
317
+ rgba(255, 255, 255, .82) 50%,
318
+ rgba(255, 255, 255, .08) 58%,
319
+ rgba(255, 255, 255, 0) 66%,
320
+ transparent 82%
295
321
  );
296
- background-size: 220% 100%;
297
- background-position: 120% 50%;
298
- background-repeat: no-repeat;
299
- -webkit-background-clip: text;
300
- background-clip: text;
301
- color: transparent;
302
- -webkit-text-fill-color: transparent;
303
- animation: chat-thinking-indicator-shimmer 1.7s linear infinite;
322
+ mix-blend-mode: screen;
323
+ transform: translate3d(-180%, 0, 0);
324
+ animation: chat-thinking-indicator-scan 2s ease-in-out infinite;
304
325
  }
305
326
 
306
- @keyframes chat-thinking-indicator-shimmer {
327
+ @keyframes chat-thinking-indicator-scan {
307
328
  from {
308
- background-position: 120% 50%;
329
+ transform: translate3d(-180%, 0, 0);
309
330
  }
310
331
 
311
332
  to {
312
- background-position: -120% 50%;
333
+ transform: translate3d(180%, 0, 0);
313
334
  }
314
335
  }
315
336
 
316
337
  @media (prefers-reduced-motion: reduce) {
317
- .chat-thinking-indicator__text {
338
+ .chat-thinking-indicator__text::after {
318
339
  animation: none;
319
- background-position: 50% 50%;
340
+ opacity: 0;
320
341
  }
321
342
  }
322
343
 
323
- .sender-container {
324
- flex: 0;
325
- display: flex;
326
- flex-direction: column;
327
- gap: 8px;
328
- min-width: 0;
329
- justify-content: flex-end;
330
- transition:
331
- flex .4s cubic-bezier(.4, 0, .2, 1),
332
- padding-bottom .4s cubic-bezier(.4, 0, .2, 1);
333
- }
334
-
335
344
  .chat-composer-stack {
336
345
  flex: 0;
337
346
  min-width: 0;
@@ -498,10 +507,6 @@
498
507
  border-radius: 8px;
499
508
  }
500
509
 
501
- .chat-thinking-indicator__text {
502
- font-size: 12px;
503
- }
504
-
505
510
  .chat-composer-stack {
506
511
  padding: 0 max(12px, env(safe-area-inset-right))
507
512
  calc(
@@ -18,10 +18,100 @@ export const activeSessionIdAtom = atom<string | undefined>(undefined)
18
18
 
19
19
  // 主题模式: 'light' | 'dark' | 'system'
20
20
  export type ThemeMode = 'light' | 'dark' | 'system'
21
- export const themeAtom = atom<ThemeMode>(
22
- (localStorage.getItem('theme') as ThemeMode) || 'system'
21
+
22
+ const THEME_STORAGE_KEY = 'theme'
23
+
24
+ const isThemeMode = (value: string): value is ThemeMode => {
25
+ return value === 'light' || value === 'dark' || value === 'system'
26
+ }
27
+
28
+ const getStoredThemeMode = (): ThemeMode => {
29
+ try {
30
+ const raw = localStorage.getItem(THEME_STORAGE_KEY)
31
+ if (raw != null && isThemeMode(raw)) {
32
+ return raw
33
+ }
34
+ } catch {}
35
+
36
+ return 'system'
37
+ }
38
+
39
+ const themeBaseAtom = atom<ThemeMode>(getStoredThemeMode())
40
+
41
+ export const themeAtom = atom(
42
+ get => get(themeBaseAtom),
43
+ (_get, set, value: ThemeMode) => {
44
+ const nextValue = isThemeMode(value)
45
+ ? value
46
+ : 'system'
47
+
48
+ set(themeBaseAtom, nextValue)
49
+
50
+ try {
51
+ localStorage.setItem(THEME_STORAGE_KEY, nextValue)
52
+ } catch {}
53
+ }
23
54
  )
24
55
 
56
+ const getStoredBoolean = (key: string, defaultValue: boolean) => {
57
+ try {
58
+ const raw = localStorage.getItem(key)
59
+ if (raw === 'true') return true
60
+ if (raw === 'false') return false
61
+ } catch {}
62
+
63
+ return defaultValue
64
+ }
65
+
66
+ const createStoredBooleanAtom = (storageKey: string, defaultValue: boolean) => {
67
+ const baseAtom = atom<boolean>(getStoredBoolean(storageKey, defaultValue))
68
+
69
+ return atom(
70
+ get => get(baseAtom),
71
+ (_get, set, value: boolean) => {
72
+ const nextValue = value === true
73
+ set(baseAtom, nextValue)
74
+
75
+ try {
76
+ localStorage.setItem(storageKey, String(nextValue))
77
+ } catch {}
78
+ }
79
+ )
80
+ }
81
+
82
+ const getStoredNonNegativeInteger = (key: string, defaultValue: number) => {
83
+ try {
84
+ const raw = localStorage.getItem(key)
85
+ if (raw == null || raw.trim() === '') return defaultValue
86
+
87
+ const parsed = Number(raw)
88
+ if (Number.isInteger(parsed) && parsed >= 0) {
89
+ return parsed
90
+ }
91
+ } catch {}
92
+
93
+ return defaultValue
94
+ }
95
+
96
+ const createStoredNonNegativeIntegerAtom = (storageKey: string, defaultValue: number) => {
97
+ const baseAtom = atom<number>(getStoredNonNegativeInteger(storageKey, defaultValue))
98
+
99
+ return atom(
100
+ get => get(baseAtom),
101
+ (_get, set, value: number) => {
102
+ const nextValue = Number.isInteger(value) && value >= 0
103
+ ? value
104
+ : defaultValue
105
+
106
+ set(baseAtom, nextValue)
107
+
108
+ try {
109
+ localStorage.setItem(storageKey, String(nextValue))
110
+ } catch {}
111
+ }
112
+ )
113
+ }
114
+
25
115
  export type SenderHeaderDisplayMode = 'expanded' | 'collapsed'
26
116
 
27
117
  const SENDER_HEADER_DISPLAY_STORAGE_KEY = 'vf_sender_header_default_display'
@@ -62,4 +152,22 @@ export const senderHeaderDisplayAtom = atom(
62
152
  }
63
153
  )
64
154
 
65
- export const showAnnouncementsAtom = atom(true)
155
+ const SHOW_ANNOUNCEMENTS_STORAGE_KEY = 'vf_show_announcements'
156
+ const SHOW_NEW_SESSION_STARTER_LIST_STORAGE_KEY = 'vf_show_new_session_starter_list'
157
+ const SESSION_LIST_SEARCH_THRESHOLD_STORAGE_KEY = 'vf_session_list_search_threshold'
158
+ const DEFAULT_SESSION_LIST_SEARCH_THRESHOLD = 5
159
+
160
+ export const showAnnouncementsAtom = createStoredBooleanAtom(
161
+ SHOW_ANNOUNCEMENTS_STORAGE_KEY,
162
+ true
163
+ )
164
+
165
+ export const showNewSessionStarterListAtom = createStoredBooleanAtom(
166
+ SHOW_NEW_SESSION_STARTER_LIST_STORAGE_KEY,
167
+ true
168
+ )
169
+
170
+ export const sessionListSearchThresholdAtom = createStoredNonNegativeIntegerAtom(
171
+ SESSION_LIST_SEARCH_THRESHOLD_STORAGE_KEY,
172
+ DEFAULT_SESSION_LIST_SEARCH_THRESHOLD
173
+ )
@@ -1 +0,0 @@
1
- import{al as o,am as n}from"./mermaid.core-BhdbV0mr.js";const l=(a,r)=>o.lang.round(n.parse(a)[r]);export{l as c};
@@ -1 +0,0 @@
1
- import{a as r}from"./graph-DuC4kt4I.js";var a=4;function n(o){return r(o,a)}export{n as c};
@@ -1 +0,0 @@
1
- import{f as o,p as e}from"./flowDb-c6c81e3f-CoPw_R-Q.js";import{f as a,g as t}from"./styles-d45a18b0-B24zVoK3.js";import{ar as i}from"./mermaid.core-BhdbV0mr.js";import"./graph-DuC4kt4I.js";import"./layout-QKUiDNJK.js";import"./index-DeQLT67a.js";import"./index-5325376f-rnz0GXAT.js";import"./clone-CG6ZcokX.js";import"./edges-96097737-CNHoXVrD.js";import"./createText-1719965b-9YwvWMdV.js";import"./line-CeP3XWjD.js";import"./array-BKyUJesY.js";import"./path-CbwjOpE9.js";import"./channel-C6LTxxLg.js";const n={parser:e,db:o,renderer:t,styles:a,init:r=>{r.flowchart||(r.flowchart={}),r.flowchart.arrowMarkerAbsolute=r.arrowMarkerAbsolute,i({flowchart:{arrowMarkerAbsolute:r.arrowMarkerAbsolute}}),t.setConf(r.flowchart),o.clear(),o.setGen("gen-2")}};export{n as diagram};