@vibe-forge/client 0.8.3 → 0.9.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 (59) hide show
  1. package/dist/assets/{arc-CZwEW7WR.js → arc-D9HxM0yv.js} +1 -1
  2. package/dist/assets/{blockDiagram-c4efeb88--ejJ1hay.js → blockDiagram-c4efeb88-C_pTeiD4.js} +1 -1
  3. package/dist/assets/{c4Diagram-c83219d4-D0N419di.js → c4Diagram-c83219d4-_oYrCrLr.js} +1 -1
  4. package/dist/assets/channel-Di8KkPU4.js +1 -0
  5. package/dist/assets/{classDiagram-beda092f-BRVsm_of.js → classDiagram-beda092f-9dnkgPhR.js} +1 -1
  6. package/dist/assets/{classDiagram-v2-2358418a-OShdAlFU.js → classDiagram-v2-2358418a-BUIeZpdO.js} +1 -1
  7. package/dist/assets/clone-B065n6L-.js +1 -0
  8. package/dist/assets/{createText-1719965b-psgY2hME.js → createText-1719965b-DuRFplcD.js} +1 -1
  9. package/dist/assets/{edges-96097737-BA56Qmd2.js → edges-96097737-CTpq6Ih_.js} +1 -1
  10. package/dist/assets/{erDiagram-0228fc6a-Dyrrgc5j.js → erDiagram-0228fc6a-CWFgdO1E.js} +1 -1
  11. package/dist/assets/{flowDb-c6c81e3f-CRgQ7Xd3.js → flowDb-c6c81e3f-8Vdx29oZ.js} +1 -1
  12. package/dist/assets/{flowDiagram-50d868cf-B73a9Glk.js → flowDiagram-50d868cf-6S9wOVNl.js} +1 -1
  13. package/dist/assets/flowDiagram-v2-4f6560a1-nj-oVLPK.js +1 -0
  14. package/dist/assets/{flowchart-elk-definition-6af322e1-DtsYC0Wf.js → flowchart-elk-definition-6af322e1-DVcZ-ZBQ.js} +1 -1
  15. package/dist/assets/{ganttDiagram-a2739b55-gzdnsQCV.js → ganttDiagram-a2739b55-DY1QSl-x.js} +1 -1
  16. package/dist/assets/{gitGraphDiagram-82fe8481-RHa92Mol.js → gitGraphDiagram-82fe8481-BP08OBKL.js} +1 -1
  17. package/dist/assets/{graph-Uj8iC7DB.js → graph-D8GCszcN.js} +1 -1
  18. package/dist/assets/{index-5325376f-B2Q_MiDU.js → index-5325376f-OOoAXU1u.js} +1 -1
  19. package/dist/assets/{index-DGEAe87I.css → index-BZe1Qtye.css} +1 -1
  20. package/dist/assets/{index-ADFje5Kc.js → index-DV3eI2aD.js} +77 -77
  21. package/dist/assets/{infoDiagram-8eee0895-BIrv_GjX.js → infoDiagram-8eee0895-BHgkXjhJ.js} +1 -1
  22. package/dist/assets/{journeyDiagram-c64418c1-DMZd-Mfh.js → journeyDiagram-c64418c1-BljInElp.js} +1 -1
  23. package/dist/assets/{layout-Bwa2VjOX.js → layout-Cw-SwAFD.js} +1 -1
  24. package/dist/assets/{line-BDn4wwV7.js → line-Q-uZLuUr.js} +1 -1
  25. package/dist/assets/{linear-DQPiAjW8.js → linear-BahOnNn3.js} +1 -1
  26. package/dist/assets/{mermaid.core-B5GfAmDT.js → mermaid.core-BR0Qh3Rd.js} +4 -4
  27. package/dist/assets/{mindmap-definition-8da855dc-BTOOR2ac.js → mindmap-definition-8da855dc-Brq2OJUZ.js} +1 -1
  28. package/dist/assets/{pieDiagram-a8764435-C3QNifd4.js → pieDiagram-a8764435-uhYdiXro.js} +1 -1
  29. package/dist/assets/{quadrantDiagram-1e28029f-Ds5ATncA.js → quadrantDiagram-1e28029f-TwqtEe7e.js} +1 -1
  30. package/dist/assets/{requirementDiagram-08caed73-CVdpqqVi.js → requirementDiagram-08caed73-DSXnPRDS.js} +1 -1
  31. package/dist/assets/{sankeyDiagram-a04cb91d-CxP85079.js → sankeyDiagram-a04cb91d-EADpJeAn.js} +1 -1
  32. package/dist/assets/{sequenceDiagram-c5b8d532-BeaQEYgt.js → sequenceDiagram-c5b8d532-C8qXvt9z.js} +1 -1
  33. package/dist/assets/{stateDiagram-1ecb1508-Bv-YlfIf.js → stateDiagram-1ecb1508-5W0ghy_S.js} +1 -1
  34. package/dist/assets/{stateDiagram-v2-c2b004d7-CWKsGrvN.js → stateDiagram-v2-c2b004d7-BfwOQJw4.js} +1 -1
  35. package/dist/assets/{styles-b4e223ce-DzdnfR-A.js → styles-b4e223ce-EkKH_ULb.js} +1 -1
  36. package/dist/assets/{styles-ca3715f6-BS5E4Xdv.js → styles-ca3715f6-DwhrtqlU.js} +1 -1
  37. package/dist/assets/{styles-d45a18b0-t7c5i-_-.js → styles-d45a18b0-yqL8KH6x.js} +1 -1
  38. package/dist/assets/{svgDrawCommon-b86b1483-CyA-VVES.js → svgDrawCommon-b86b1483--5VjnjhC.js} +1 -1
  39. package/dist/assets/{timeline-definition-faaaa080-BuFEjpzk.js → timeline-definition-faaaa080-CWOTwik9.js} +1 -1
  40. package/dist/assets/{xychartDiagram-f5964ef8-B4b4QqYX.js → xychartDiagram-f5964ef8-CZg47H1t.js} +1 -1
  41. package/dist/favicon.svg +5 -0
  42. package/dist/index.html +3 -2
  43. package/index.html +2 -1
  44. package/package.json +10 -10
  45. package/public/favicon.svg +5 -0
  46. package/src/components/chat/sender/Sender.scss +140 -0
  47. package/src/components/chat/sender/Sender.tsx +75 -33
  48. package/src/components/chat/sender/interaction-request.ts +5 -0
  49. package/src/components/config/ConfigSectionForm.tsx +0 -1
  50. package/src/components/config/configSchema.ts +2 -23
  51. package/src/hooks/chat/interaction-state.ts +37 -0
  52. package/src/hooks/chat/use-chat-session-messages.ts +11 -4
  53. package/src/hooks/use-session-subscription.ts +31 -8
  54. package/src/resources/locales/en.json +11 -0
  55. package/src/resources/locales/zh.json +11 -0
  56. package/src/runtime-config.ts +18 -9
  57. package/dist/assets/channel-dXWmEygA.js +0 -1
  58. package/dist/assets/clone-C4IafnWc.js +0 -1
  59. package/dist/assets/flowDiagram-v2-4f6560a1-Ccm4QuQe.js +0 -1
@@ -71,14 +71,37 @@ export function useSessionSubscription() {
71
71
  useEffect(() => {
72
72
  let disposed = false
73
73
  let socket: WebSocket | undefined
74
- let reconnectTimer: ReturnType<typeof setTimeout> | undefined
74
+ let connectTimer: ReturnType<typeof setTimeout> | undefined
75
+
76
+ const closeSocket = (target: WebSocket | undefined) => {
77
+ if (!target) return
78
+ if (target.readyState === WebSocket.CLOSED || target.readyState === WebSocket.CLOSING) {
79
+ return
80
+ }
81
+ if (target.readyState === WebSocket.CONNECTING) {
82
+ target.addEventListener('open', () => target.close(), { once: true })
83
+ return
84
+ }
85
+ target.close()
86
+ }
87
+
88
+ const scheduleConnect = (delay = 0) => {
89
+ if (disposed) return
90
+ if (connectTimer) {
91
+ clearTimeout(connectTimer)
92
+ }
93
+ connectTimer = setTimeout(() => {
94
+ connectTimer = undefined
95
+ connect()
96
+ }, delay)
97
+ }
75
98
 
76
99
  const connect = () => {
77
100
  if (disposed) return
78
101
 
79
102
  socket = createSocket({
80
103
  onMessage: (data: WSEvent) => {
81
- if (data.type !== 'session_updated') return
104
+ if (disposed || data.type !== 'session_updated') return
82
105
  const updatedSession = data.session as SessionUpdate
83
106
 
84
107
  void mutate('/api/sessions', (prev: SessionListResponse | undefined) => {
@@ -91,22 +114,22 @@ export function useSessionSubscription() {
91
114
  },
92
115
  onClose: () => {
93
116
  if (disposed) return
94
- reconnectTimer = setTimeout(connect, 1000)
117
+ scheduleConnect(1000)
95
118
  },
96
119
  onError: () => {
97
- socket?.close()
120
+ closeSocket(socket)
98
121
  }
99
122
  }, { subscribe: 'sessions' })
100
123
  }
101
124
 
102
- connect()
125
+ scheduleConnect()
103
126
 
104
127
  return () => {
105
128
  disposed = true
106
- if (reconnectTimer) {
107
- clearTimeout(reconnectTimer)
129
+ if (connectTimer) {
130
+ clearTimeout(connectTimer)
108
131
  }
109
- socket?.close()
132
+ closeSocket(socket)
110
133
  }
111
134
  }, [mutate])
112
135
  }
@@ -310,6 +310,17 @@
310
310
  "connectionError": "WebSocket connection failed. Check the server and try again.",
311
311
  "connectionClosed": "WebSocket connection closed. Try reconnecting.",
312
312
  "retryConnection": "Retry",
313
+ "permissionRequestBadge": "Permission request",
314
+ "permissionCurrentMode": "Current mode",
315
+ "permissionSuggestedMode": "Suggested mode",
316
+ "permissionDeniedTools": "Restricted tools",
317
+ "permissionReasons": "Reasons",
318
+ "tooltipSlashCommands": "Slash commands",
319
+ "tooltipMentionAgents": "Mention agents",
320
+ "tooltipInjectContext": "Inject context",
321
+ "tooltipUploadImages": "Upload images",
322
+ "effortSelectPlaceholder": "Effort",
323
+ "permissionModeSelectPlaceholder": "Permission mode",
313
324
  "assetWarningsTitle": "Compatibility notes",
314
325
  "assetWarningsCount": "{{count}} asset warnings",
315
326
  "assetWarningsMore": "+{{count}} more",
@@ -311,6 +311,17 @@
311
311
  "connectionError": "WebSocket 连接失败,请检查服务状态后重试",
312
312
  "connectionClosed": "WebSocket 连接已关闭,请重试",
313
313
  "retryConnection": "重试连接",
314
+ "permissionRequestBadge": "权限请求",
315
+ "permissionCurrentMode": "当前模式",
316
+ "permissionSuggestedMode": "建议模式",
317
+ "permissionDeniedTools": "受限工具",
318
+ "permissionReasons": "原因",
319
+ "tooltipSlashCommands": "快捷指令",
320
+ "tooltipMentionAgents": "提及代理",
321
+ "tooltipInjectContext": "注入上下文",
322
+ "tooltipUploadImages": "上传图片",
323
+ "effortSelectPlaceholder": "推理强度",
324
+ "permissionModeSelectPlaceholder": "权限模式",
314
325
  "assetWarningsTitle": "兼容性提示",
315
326
  "assetWarningsCount": "{{count}} 个资产告警",
316
327
  "assetWarningsMore": "还有 {{count}} 条",
@@ -10,16 +10,17 @@ const getGlobalRuntimeEnv = () => {
10
10
  return globalScope.__VF_PROJECT_AI_RUNTIME_ENV__
11
11
  }
12
12
 
13
+ const pickNonEmptyValue = (...values: Array<string | undefined>) => (
14
+ values.find((value) => typeof value === 'string' && value.trim() !== '')
15
+ )
16
+
13
17
  const normalizeBase = (value?: string) => {
14
- let base = value?.trim() ?? ''
15
- if (!base) {
16
- return '/ui/'
17
- }
18
+ let base = value?.trim() ?? '/ui'
18
19
  if (!base.startsWith('/')) {
19
20
  base = `/${base}`
20
21
  }
21
- if (!base.endsWith('/')) {
22
- base += '/'
22
+ if (base.length > 1 && base.endsWith('/')) {
23
+ base = base.slice(0, -1)
23
24
  }
24
25
  return base
25
26
  }
@@ -37,10 +38,18 @@ const normalizePath = (value?: string) => {
37
38
 
38
39
  export const getRuntimeEnv = (): RuntimeEnv => getGlobalRuntimeEnv() ?? {}
39
40
 
40
- export const getClientBase = () =>
41
- normalizeBase(
42
- getRuntimeEnv().__VF_PROJECT_AI_CLIENT_BASE__ ?? import.meta.env.__VF_PROJECT_AI_CLIENT_BASE__
41
+ export const resolveClientBase = (...values: Array<string | undefined>) => (
42
+ normalizeBase(pickNonEmptyValue(...values))
43
+ )
44
+
45
+ export const getClientBase = () => (
46
+ resolveClientBase(
47
+ getRuntimeEnv().__VF_PROJECT_AI_CLIENT_BASE__,
48
+ import.meta.env.__VF_PROJECT_AI_CLIENT_BASE__,
49
+ import.meta.env.BASE_URL,
50
+ '/ui'
43
51
  )
52
+ )
44
53
 
45
54
  export const getServerHostEnv = () =>
46
55
  getRuntimeEnv().__VF_PROJECT_AI_SERVER_HOST__ ??
@@ -1 +0,0 @@
1
- import{al as o,am as n}from"./mermaid.core-B5GfAmDT.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-Uj8iC7DB.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-CRgQ7Xd3.js";import{f as a,g as t}from"./styles-d45a18b0-t7c5i-_-.js";import{ar as i}from"./mermaid.core-B5GfAmDT.js";import"./graph-Uj8iC7DB.js";import"./layout-Bwa2VjOX.js";import"./index-ADFje5Kc.js";import"./index-5325376f-B2Q_MiDU.js";import"./clone-C4IafnWc.js";import"./edges-96097737-BA56Qmd2.js";import"./createText-1719965b-psgY2hME.js";import"./line-BDn4wwV7.js";import"./array-BKyUJesY.js";import"./path-CbwjOpE9.js";import"./channel-dXWmEygA.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};