@vibe-forge/client 0.11.1 → 0.11.3

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 (112) hide show
  1. package/cli.cjs +6 -1
  2. package/dist/assets/{arc-CSepokz3.js → arc-h39NrT24.js} +1 -1
  3. package/dist/assets/{blockDiagram-c4efeb88-D0ARcoNf.js → blockDiagram-c4efeb88-CaDg46I6.js} +1 -1
  4. package/dist/assets/{c4Diagram-c83219d4-BysYF9kP.js → c4Diagram-c83219d4-CDqjcF9U.js} +1 -1
  5. package/dist/assets/channel-CBULQbJz.js +1 -0
  6. package/dist/assets/{classDiagram-beda092f-BG1GhIOL.js → classDiagram-beda092f-BDnZm8nO.js} +1 -1
  7. package/dist/assets/{classDiagram-v2-2358418a-Dd08uGSH.js → classDiagram-v2-2358418a-BUi85KJW.js} +1 -1
  8. package/dist/assets/clone-dkS7LczW.js +1 -0
  9. package/dist/assets/{createText-1719965b-CigPEIEn.js → createText-1719965b-Ca5dEwfo.js} +1 -1
  10. package/dist/assets/{cssMode-MjflyEfm.js → cssMode-Ysz7NfYo.js} +1 -1
  11. package/dist/assets/{edges-96097737-DuTBJJRv.js → edges-96097737-CdSKqxZt.js} +1 -1
  12. package/dist/assets/{erDiagram-0228fc6a-Cp1bL7Y7.js → erDiagram-0228fc6a-B-veAUv_.js} +1 -1
  13. package/dist/assets/{flowDb-c6c81e3f-BfKbhiq5.js → flowDb-c6c81e3f-DD8Cx7_9.js} +1 -1
  14. package/dist/assets/{flowDiagram-50d868cf-m7gGc3PK.js → flowDiagram-50d868cf-9f-_x1ET.js} +1 -1
  15. package/dist/assets/flowDiagram-v2-4f6560a1-1miffU4x.js +1 -0
  16. package/dist/assets/{flowchart-elk-definition-6af322e1-EVeTDRRK.js → flowchart-elk-definition-6af322e1-5RhpQM4M.js} +1 -1
  17. package/dist/assets/{freemarker2-Bb3-QAIN.js → freemarker2-SgMdIXw4.js} +1 -1
  18. package/dist/assets/{ganttDiagram-a2739b55-DslB2U0R.js → ganttDiagram-a2739b55-DnxNghZA.js} +1 -1
  19. package/dist/assets/{gitGraphDiagram-82fe8481-C-KFWMXL.js → gitGraphDiagram-82fe8481-CBvS3Tf9.js} +1 -1
  20. package/dist/assets/{graph-CukaUc0o.js → graph-CkHF299-.js} +1 -1
  21. package/dist/assets/{handlebars-C4le-2Y6.js → handlebars-C57IyLUe.js} +1 -1
  22. package/dist/assets/{html-CjNiRs5S.js → html-YsDy5wvW.js} +1 -1
  23. package/dist/assets/{htmlMode-B73_3-We.js → htmlMode-7o_VDODD.js} +1 -1
  24. package/dist/assets/{index-5325376f-CVISZFPw.js → index-5325376f-BzOVQPu-.js} +1 -1
  25. package/dist/assets/{index-BZosmb5_.js → index-BHFpctk6.js} +320 -319
  26. package/dist/assets/index-D_XqxIvp.css +32 -0
  27. package/dist/assets/{infoDiagram-8eee0895-DoirLE1K.js → infoDiagram-8eee0895-DJ-UI1h4.js} +1 -1
  28. package/dist/assets/{javascript-BDjnqJFP.js → javascript-BHQ9NEZr.js} +1 -1
  29. package/dist/assets/{journeyDiagram-c64418c1-Ckn-p2CM.js → journeyDiagram-c64418c1-DwfykcG9.js} +1 -1
  30. package/dist/assets/{jsonMode-C-ftOc5j.js → jsonMode-3QjftkMM.js} +1 -1
  31. package/dist/assets/{layout-Z7yUG7hB.js → layout-CbViRb_b.js} +1 -1
  32. package/dist/assets/{line-DPG_cfAy.js → line-DBdBvv9D.js} +1 -1
  33. package/dist/assets/{linear--GSeVfMi.js → linear-BDAfhcjn.js} +1 -1
  34. package/dist/assets/{liquid-COiLZ9py.js → liquid-B0cPPzIR.js} +1 -1
  35. package/dist/assets/{lspLanguageFeatures-DGmhryFq.js → lspLanguageFeatures-IOxbobOz.js} +1 -1
  36. package/dist/assets/{mdx-BpL87Gej.js → mdx-Dma_RA8P.js} +1 -1
  37. package/dist/assets/{mermaid.core-Cg1CCDo6.js → mermaid.core-Cvn8Go4x.js} +4 -4
  38. package/dist/assets/{mindmap-definition-8da855dc-CKDof1lD.js → mindmap-definition-8da855dc-DEnYq0Lc.js} +1 -1
  39. package/dist/assets/{pieDiagram-a8764435-DwvCaZVE.js → pieDiagram-a8764435-ZC4j8sHU.js} +1 -1
  40. package/dist/assets/{python-63dBmWV_.js → python-Be0WX4q5.js} +1 -1
  41. package/dist/assets/{quadrantDiagram-1e28029f-CkzYBQpy.js → quadrantDiagram-1e28029f-DUaqHlIB.js} +1 -1
  42. package/dist/assets/{razor-C50tBqEZ.js → razor-Tjhny-uT.js} +1 -1
  43. package/dist/assets/{requirementDiagram-08caed73-Brgdjqf4.js → requirementDiagram-08caed73-DjSal3es.js} +1 -1
  44. package/dist/assets/{sankeyDiagram-a04cb91d-CGkYexrs.js → sankeyDiagram-a04cb91d-BMDXMrMz.js} +1 -1
  45. package/dist/assets/{sequenceDiagram-c5b8d532-D0wE-_J8.js → sequenceDiagram-c5b8d532-CQl9YUlH.js} +1 -1
  46. package/dist/assets/{stateDiagram-1ecb1508-BYb3NCXZ.js → stateDiagram-1ecb1508-DG7mU9jD.js} +1 -1
  47. package/dist/assets/{stateDiagram-v2-c2b004d7-DrPqi4Pt.js → stateDiagram-v2-c2b004d7-DTbR_azy.js} +1 -1
  48. package/dist/assets/{styles-b4e223ce-DD66TIO4.js → styles-b4e223ce-C9aS3zb8.js} +1 -1
  49. package/dist/assets/{styles-ca3715f6-iy02LHIV.js → styles-ca3715f6-Bh3keVTZ.js} +1 -1
  50. package/dist/assets/{styles-d45a18b0-BgqAgJyW.js → styles-d45a18b0-BDcLLa65.js} +1 -1
  51. package/dist/assets/{svgDrawCommon-b86b1483-CDq7ugnw.js → svgDrawCommon-b86b1483-B9H5ZS_9.js} +1 -1
  52. package/dist/assets/{timeline-definition-faaaa080-DzcLLjK0.js → timeline-definition-faaaa080-DCMYCBhK.js} +1 -1
  53. package/dist/assets/{tsMode-BFRFI4ct.js → tsMode-DVqLsn98.js} +1 -1
  54. package/dist/assets/{typescript-CBZQRAPv.js → typescript-wMVyXw7G.js} +1 -1
  55. package/dist/assets/{xml-BpWm6upt.js → xml-w0gzmn0c.js} +1 -1
  56. package/dist/assets/{xychartDiagram-f5964ef8-zBN8FmLQ.js → xychartDiagram-f5964ef8-CdxyD3K5.js} +1 -1
  57. package/dist/assets/{yaml-CqbJPiIP.js → yaml-C29TL1ed.js} +1 -1
  58. package/dist/index.html +2 -2
  59. package/package.json +9 -9
  60. package/src/api/sessions.ts +70 -1
  61. package/src/api/types.ts +2 -1
  62. package/src/api.ts +5 -0
  63. package/src/components/chat/AGENTS.md +14 -2
  64. package/src/components/chat/ChatComposerCard.scss +73 -0
  65. package/src/components/chat/ChatComposerCard.tsx +59 -0
  66. package/src/components/chat/ChatHeader.tsx +3 -1
  67. package/src/components/chat/ChatHistoryView.tsx +215 -49
  68. package/src/components/chat/CurrentTodoList.scss +210 -200
  69. package/src/components/chat/CurrentTodoList.tsx +116 -48
  70. package/src/components/chat/QueuedMessagesCard.scss +195 -0
  71. package/src/components/chat/QueuedMessagesCard.tsx +170 -0
  72. package/src/components/chat/sender/@components/adapter-select/AdapterSelectControl.scss +8 -0
  73. package/src/components/chat/sender/@components/sender-attachments/SenderAttachments.scss +152 -28
  74. package/src/components/chat/sender/@components/sender-attachments/SenderAttachments.tsx +95 -23
  75. package/src/components/chat/sender/@components/sender-body/SenderBody.tsx +7 -0
  76. package/src/components/chat/sender/@components/sender-interaction-panel/SenderInteractionPanel.scss +161 -45
  77. package/src/components/chat/sender/@components/sender-interaction-panel/SenderInteractionPanel.tsx +310 -71
  78. package/src/components/chat/sender/@components/sender-monaco-editor/SenderMonacoEditor.tsx +18 -0
  79. package/src/components/chat/sender/@components/sender-monaco-editor/use-sender-monaco-editor.ts +86 -9
  80. package/src/components/chat/sender/@components/sender-submit-action/SenderSubmitAction.scss +98 -1
  81. package/src/components/chat/sender/@components/sender-submit-action/SenderSubmitAction.tsx +137 -17
  82. package/src/components/chat/sender/@components/sender-toolbar/SenderToolbar.tsx +12 -6
  83. package/src/components/chat/sender/@core/build-sender-controller-result.ts +6 -0
  84. package/src/components/chat/sender/@core/build-sender-toolbar.ts +25 -2
  85. package/src/components/chat/sender/@core/create-sender-toolbar-handlers.ts +9 -2
  86. package/src/components/chat/sender/@core/interaction-request.ts +2 -2
  87. package/src/components/chat/sender/@core/sender-toolbar-bindings.ts +28 -4
  88. package/src/components/chat/sender/@hooks/use-sender-controller.ts +56 -11
  89. package/src/components/chat/sender/@hooks/use-sender-keydown.ts +64 -0
  90. package/src/components/chat/sender/@hooks/use-sender-shortcuts.ts +16 -1
  91. package/src/components/chat/sender/@hooks/use-sender-submit.ts +16 -8
  92. package/src/components/chat/sender/@types/sender-props.ts +19 -3
  93. package/src/components/chat/sender/@types/sender-toolbar-types.ts +12 -1
  94. package/src/components/chat/sender/Sender.scss +3 -0
  95. package/src/components/chat/sender/Sender.tsx +2 -12
  96. package/src/hooks/chat/session-view-cache.ts +4 -1
  97. package/src/hooks/chat/use-chat-adapter.ts +5 -1
  98. package/src/hooks/chat/use-chat-model-adapter-selection.tsx +5 -1
  99. package/src/hooks/chat/use-chat-session-actions.ts +99 -4
  100. package/src/hooks/chat/use-chat-session-messages.ts +20 -1
  101. package/src/hooks/chat/use-chat-session.ts +2 -0
  102. package/src/main.tsx +8 -0
  103. package/src/resources/locales/en.json +36 -5
  104. package/src/resources/locales/zh.json +36 -5
  105. package/src/routes/ChatRoute.scss +45 -1
  106. package/src/routes/ChatRoute.tsx +3 -0
  107. package/dist/assets/channel-CeKPk6Nd.js +0 -1
  108. package/dist/assets/clone-CrkD2PuD.js +0 -1
  109. package/dist/assets/flowDiagram-v2-4f6560a1-4ZU4bdp1.js +0 -1
  110. package/dist/assets/index-C1oh0w9H.css +0 -32
  111. package/src/components/chat/ThinkingStatus.scss +0 -70
  112. package/src/components/chat/ThinkingStatus.tsx +0 -13
@@ -3,7 +3,7 @@ import type { SetStateAction } from 'react'
3
3
  import { useTranslation } from 'react-i18next'
4
4
  import { useSWRConfig } from 'swr'
5
5
 
6
- import type { AskUserQuestionParams, ChatMessage, Session, WSEvent } from '@vibe-forge/core'
6
+ import type { AskUserQuestionParams, ChatMessage, Session, SessionMessageQueueState, WSEvent } from '@vibe-forge/core'
7
7
  import type { SessionInfo } from '@vibe-forge/types'
8
8
 
9
9
  import { getSessionMessages } from '#~/api.js'
@@ -25,6 +25,8 @@ import type { ChatSessionViewSnapshot } from './session-view-cache'
25
25
  import type { ChatEffort } from './use-chat-effort'
26
26
  import type { PermissionMode } from './use-chat-permission-mode'
27
27
 
28
+ const EMPTY_QUEUED_MESSAGES: SessionMessageQueueState = { steer: [], next: [] }
29
+
28
30
  const applyMessageEvent = (currentMessages: ChatMessage[], data: WSEvent) => {
29
31
  if (data.type !== 'message') return currentMessages
30
32
  const exists = currentMessages.find((msg) => msg.id === data.message.id)
@@ -71,6 +73,7 @@ export function useChatSessionMessages({
71
73
  const { mutate } = useSWRConfig()
72
74
  const [messagesState, setMessagesState] = useState<ChatMessage[]>([])
73
75
  const [sessionInfo, setSessionInfo] = useState<SessionInfo | null>(null)
76
+ const [queuedMessages, setQueuedMessages] = useState<SessionMessageQueueState>({ steer: [], next: [] })
74
77
  const [isReady, setIsReady] = useState(false)
75
78
  const [errorState, setErrorState] = useState<ChatErrorState | null>(null)
76
79
  const [retryCount, setRetryCount] = useState(0)
@@ -94,6 +97,7 @@ export function useChatSessionMessages({
94
97
  patch: Partial<{
95
98
  messages: ChatMessage[]
96
99
  sessionInfo: SessionInfo | null
100
+ queuedMessages: SessionMessageQueueState
97
101
  errorState: ChatErrorState | null
98
102
  interactionRequest: InteractionRequestState | null
99
103
  isHydrated: boolean
@@ -174,9 +178,11 @@ export function useChatSessionMessages({
174
178
  code: latestFatalError.code
175
179
  }
176
180
  : null
181
+ const nextQueuedMessages = res.queuedMessages ?? EMPTY_QUEUED_MESSAGES
177
182
 
178
183
  interactionRequestRef.current = restoredInteraction
179
184
  setInteractionRequest(restoredInteraction)
185
+ setQueuedMessages(nextQueuedMessages)
180
186
  setErrorState(nextErrorState)
181
187
 
182
188
  for (const data of events) {
@@ -192,6 +198,7 @@ export function useChatSessionMessages({
192
198
  updateSessionViewCache(sessionId, {
193
199
  messages: currentMessages,
194
200
  sessionInfo: currentSessionInfo,
201
+ queuedMessages: nextQueuedMessages,
195
202
  errorState: nextErrorState,
196
203
  interactionRequest: restoredInteraction,
197
204
  isHydrated: true
@@ -238,6 +245,7 @@ export function useChatSessionMessages({
238
245
  if (session?.id == null || session.id === '') {
239
246
  setMessagesState([])
240
247
  setSessionInfo(null)
248
+ setQueuedMessages(EMPTY_QUEUED_MESSAGES)
241
249
  setIsReady(true)
242
250
  setErrorState(null)
243
251
  setInteractionRequest(null)
@@ -255,12 +263,14 @@ export function useChatSessionMessages({
255
263
 
256
264
  setMessagesState(restoredState.messages)
257
265
  setSessionInfo(restoredState.sessionInfo)
266
+ setQueuedMessages(restoredState.queuedMessages)
258
267
  setErrorState(restoredState.errorState)
259
268
  setInteractionRequest(restoredState.interactionRequest)
260
269
  interactionRequestRef.current = restoredState.interactionRequest
261
270
  setIsReady(restoredState.isReady)
262
271
  isInitialLoadRef.current = !restoredState.isReady
263
272
 
273
+ void refreshHistory()
264
274
  void refreshHistory()
265
275
 
266
276
  return () => {
@@ -414,6 +424,14 @@ export function useChatSessionMessages({
414
424
  return
415
425
  }
416
426
 
427
+ if (data.type === 'session_queue_updated') {
428
+ setQueuedMessages(data.queue)
429
+ updateSessionViewCache(session.id, {
430
+ queuedMessages: data.queue
431
+ })
432
+ return
433
+ }
434
+
417
435
  if (data.type === 'message') {
418
436
  setMessages((current) => applyMessageEvent(current, data))
419
437
  return
@@ -513,6 +531,7 @@ export function useChatSessionMessages({
513
531
  messages: messagesState,
514
532
  setMessages,
515
533
  sessionInfo,
534
+ queuedMessages,
516
535
  isReady,
517
536
  errorState,
518
537
  retryConnection,
@@ -44,6 +44,7 @@ export function useChatSession({
44
44
  messages,
45
45
  setMessages,
46
46
  sessionInfo,
47
+ queuedMessages,
47
48
  isReady,
48
49
  errorState,
49
50
  retryConnection,
@@ -110,6 +111,7 @@ export function useChatSession({
110
111
  return {
111
112
  messages,
112
113
  sessionInfo,
114
+ queuedMessages,
113
115
  interactionRequest,
114
116
  isReady,
115
117
  errorState,
package/src/main.tsx CHANGED
@@ -16,6 +16,14 @@ import { getClientBase, resolveDevDocumentTitle } from '#~/runtime-config.js'
16
16
 
17
17
  import App from './App'
18
18
 
19
+ const gitRefLabel = import.meta.env.__VF_PROJECT_AI_GIT_REF_LABEL__ ?? ''
20
+
21
+ const appTitle = import.meta.env.DEV && gitRefLabel !== ''
22
+ ? `Vibe Forge Web [${gitRefLabel}]`
23
+ : 'Vibe Forge Web'
24
+
25
+ document.title = appTitle
26
+
19
27
  const root = createRoot(document.getElementById('root')!)
20
28
 
21
29
  const clientBase = getClientBase()
@@ -289,8 +289,8 @@
289
289
  "desc": "Manage roles, components, and domain entities for the project.",
290
290
  "empty": "No entities found.",
291
291
  "create": "Create Entity",
292
- "createHint": "Create an entity definition under .ai/entities, then refresh the page.",
293
- "importHint": "Import entity files into .ai/entities, then refresh the page."
292
+ "createHint": "Create an entity definition file, then refresh the page.",
293
+ "importHint": "Import entity definition files, then refresh the page."
294
294
  },
295
295
  "flows": {
296
296
  "title": "Flow Library",
@@ -351,6 +351,13 @@
351
351
  "permissionReasons": "Reasons",
352
352
  "permissionExpandOptions": "Show more options",
353
353
  "permissionCollapseOptions": "Show fewer options",
354
+ "permissionConfirmOption": "Confirm option",
355
+ "permissionConfirmOptionTooltip": "Confirm the currently highlighted permission option",
356
+ "permissionSendBlockedTooltip": "A permission choice is still pending. Confirm the option above first.",
357
+ "permissionSendBlockedError": "A permission choice is still pending, so sending is temporarily disabled.",
358
+ "interactionOptionNavigation": "Quick option navigation",
359
+ "interactionOptionPrevious": "Previous option",
360
+ "interactionOptionNext": "Next option",
354
361
  "tooltipSlashCommands": "Slash commands",
355
362
  "tooltipMentionAgents": "Mention agents",
356
363
  "tooltipInjectContext": "Inject context",
@@ -363,6 +370,24 @@
363
370
  "modelRemoveRecommendation": "Remove from recommended models",
364
371
  "effortShortcutTooltip": "Switch reasoning effort",
365
372
  "sendShortcutTooltip": "Send message",
373
+ "queue": {
374
+ "steerTitle": "Send After Current Turn",
375
+ "nextTitle": "Send At Next Safe Point",
376
+ "count": "{{count}} queued",
377
+ "sendAfterTurn": "After turn",
378
+ "sendNext": "Next safe point",
379
+ "steerShortcutTooltip": "Queue the message until the current turn finishes",
380
+ "nextShortcutTooltip": "Queue the message and send it at the next safe point",
381
+ "attachmentsOnly": "Contains queued images or references",
382
+ "hasImage": "Contains images",
383
+ "hasReference": "Contains references",
384
+ "moveToSteer": "Move to send after current turn",
385
+ "moveToNext": "Move to send at next safe point",
386
+ "requeueMessage": "Re-queue message",
387
+ "stopCurrentRun": "Stop current run",
388
+ "stopShortcutTooltip": "Press Esc twice to stop the current run",
389
+ "stopShortcutConfirm": "Press Esc again to stop the current run"
390
+ },
366
391
  "adapterLockedTooltip": "Adapters are locked after a session is created",
367
392
  "referenceActionsShort": "More",
368
393
  "referenceActionsTitle": "More",
@@ -595,9 +620,9 @@
595
620
  },
596
621
  "entities": {
597
622
  "title": "Existing Entities",
598
- "empty": "No entities found. Add them under .ai/entities to show here.",
623
+ "empty": "No entities found. Add entity definition files to show them here.",
599
624
  "create": "Quick Create Entity",
600
- "createToast": "Create an entity definition under .ai/entities, then refresh the page."
625
+ "createToast": "Create an entity definition file, then refresh the page."
601
626
  },
602
627
  "help": {
603
628
  "title": "Help",
@@ -607,9 +632,15 @@
607
632
  "footer": "Add usage guidance to flow descriptions when needed"
608
633
  }
609
634
  },
635
+ "attachments": {
636
+ "pastedImage": "Pasted image"
637
+ },
610
638
  "todo": {
611
639
  "noTasks": "No tasks planned",
612
- "progress": "Progress: {{completed}}/{{total}} completed"
640
+ "progress": "Progress: {{completed}}/{{total}} completed",
641
+ "pendingCount": "{{count}} todo",
642
+ "inProgressCount": "{{count}} doing",
643
+ "completedCount": "{{count}} done"
613
644
  },
614
645
  "tools": {
615
646
  "read": "Read File",
@@ -290,8 +290,8 @@
290
290
  "desc": "管理项目内的角色、组件或领域实体。",
291
291
  "empty": "暂未发现实体。",
292
292
  "create": "新建实体",
293
- "createHint": "请在 .ai/entities 中创建实体定义文件,保存后刷新页面。",
294
- "importHint": "请将实体文件导入至 .ai/entities,保存后刷新页面。"
293
+ "createHint": "请创建实体定义文件,保存后刷新页面。",
294
+ "importHint": "请导入实体定义文件,保存后刷新页面。"
295
295
  },
296
296
  "flows": {
297
297
  "title": "流程库",
@@ -352,6 +352,13 @@
352
352
  "permissionReasons": "原因",
353
353
  "permissionExpandOptions": "展开更多选项",
354
354
  "permissionCollapseOptions": "收起更多选项",
355
+ "permissionConfirmOption": "确认选项",
356
+ "permissionConfirmOptionTooltip": "确认当前高亮的权限选项",
357
+ "permissionSendBlockedTooltip": "当前正在等待权限选项确认,请先确认上方选项",
358
+ "permissionSendBlockedError": "当前正在等待权限选项确认,暂时不能发送消息",
359
+ "interactionOptionNavigation": "选项快速切换",
360
+ "interactionOptionPrevious": "上一个选项",
361
+ "interactionOptionNext": "下一个选项",
355
362
  "tooltipSlashCommands": "快捷指令",
356
363
  "tooltipMentionAgents": "提及代理",
357
364
  "tooltipInjectContext": "注入上下文",
@@ -364,6 +371,24 @@
364
371
  "modelRemoveRecommendation": "从推荐模型中移除",
365
372
  "effortShortcutTooltip": "切换推理强度",
366
373
  "sendShortcutTooltip": "发送消息",
374
+ "queue": {
375
+ "steerTitle": "等待当前轮结束后发送",
376
+ "nextTitle": "合适时机发送",
377
+ "count": "{{count}} 条待发送",
378
+ "sendAfterTurn": "等待结束后发",
379
+ "sendNext": "下一轮发",
380
+ "steerShortcutTooltip": "等待当前轮结束后发送",
381
+ "nextShortcutTooltip": "在下一个合适时机发送",
382
+ "attachmentsOnly": "包含待发送的图片或引用",
383
+ "hasImage": "包含图片",
384
+ "hasReference": "包含引用",
385
+ "moveToSteer": "移动到等待当前轮结束后发送",
386
+ "moveToNext": "移动到合适时机发送",
387
+ "requeueMessage": "重新入队",
388
+ "stopCurrentRun": "停止当前执行",
389
+ "stopShortcutTooltip": "按两次 Esc 停止当前执行",
390
+ "stopShortcutConfirm": "再按一次 Esc 停止当前执行"
391
+ },
367
392
  "adapterLockedTooltip": "创建会话后适配器会锁定",
368
393
  "referenceActionsShort": "更多",
369
394
  "referenceActionsTitle": "更多",
@@ -596,9 +621,9 @@
596
621
  },
597
622
  "entities": {
598
623
  "title": "已有实体",
599
- "empty": "暂未发现实体,放入 .ai/entities 即可展示。",
624
+ "empty": "暂未发现实体,加入实体定义文件后即可展示。",
600
625
  "create": "快速创建实体",
601
- "createToast": "请在 .ai/entities 下创建实体定义文件,保存后刷新页面。"
626
+ "createToast": "请创建实体定义文件,保存后刷新页面。"
602
627
  },
603
628
  "help": {
604
629
  "title": "一些帮助",
@@ -608,9 +633,15 @@
608
633
  "footer": "需要更多引导时,可在流程描述中写明使用方式"
609
634
  }
610
635
  },
636
+ "attachments": {
637
+ "pastedImage": "粘贴图片"
638
+ },
611
639
  "todo": {
612
640
  "noTasks": "未规划任务",
613
- "progress": "任务进度: {{completed}}/{{total}} 已完成"
641
+ "progress": "任务进度: {{completed}}/{{total}} 已完成",
642
+ "pendingCount": "{{count}} 待办",
643
+ "inProgressCount": "{{count}} 进行中",
644
+ "completedCount": "{{count}} 已完成"
614
645
  },
615
646
  "tools": {
616
647
  "read": "读取文件",
@@ -1,4 +1,6 @@
1
1
  .chat-container {
2
+ --chat-content-max-width: 1040px;
3
+
2
4
  display: flex;
3
5
  flex-direction: column;
4
6
  flex: 1;
@@ -231,12 +233,48 @@
231
233
  display: flex;
232
234
  flex-direction: column;
233
235
  justify-content: flex-end;
234
- padding: 0 12px 12px;
235
236
  transition:
236
237
  flex .4s cubic-bezier(.4, 0, .2, 1),
237
238
  padding-bottom .4s cubic-bezier(.4, 0, .2, 1);
238
239
  }
239
240
 
241
+ .chat-composer-stack {
242
+ flex: 0;
243
+ padding: 0 24px 24px;
244
+ }
245
+
246
+ .chat-composer-stack__inner {
247
+ width: min(100%, var(--chat-content-max-width));
248
+ margin: 0 auto;
249
+ display: flex;
250
+ flex-direction: column;
251
+ }
252
+
253
+ .chat-composer-stack__inner > * {
254
+ width: 100%;
255
+ }
256
+
257
+ .chat-composer-stack__inner > :not(:first-child).chat-composer-card,
258
+ .chat-composer-stack__inner > :not(:first-child) .chat-composer-card {
259
+ border-top-left-radius: 0;
260
+ border-top-right-radius: 0;
261
+ }
262
+
263
+ .chat-composer-stack__inner > :not(:last-child).chat-composer-card,
264
+ .chat-composer-stack__inner > :not(:last-child) .chat-composer-card {
265
+ margin-bottom: -1px;
266
+ border-bottom-left-radius: 0;
267
+ border-bottom-right-radius: 0;
268
+ }
269
+
270
+ .chat-composer-stack__inner
271
+ > :not(:first-child):not(:last-child).chat-composer-card,
272
+ .chat-composer-stack__inner
273
+ > :not(:first-child):not(:last-child)
274
+ .chat-composer-card {
275
+ border-radius: 0;
276
+ }
277
+
240
278
  .scroll-bottom-btn {
241
279
  position: sticky;
242
280
  bottom: 24px;
@@ -281,3 +319,9 @@
281
319
  align-content: center;
282
320
  gap: 16px;
283
321
  }
322
+
323
+ @media (max-width: 768px) {
324
+ .chat-composer-stack {
325
+ padding: 0 16px 16px;
326
+ }
327
+ }
@@ -48,6 +48,7 @@ function ChatRouteView({ session }: { session?: Session }) {
48
48
  const {
49
49
  messages,
50
50
  sessionInfo,
51
+ queuedMessages,
51
52
  interactionRequest,
52
53
  isReady,
53
54
  errorState,
@@ -123,6 +124,7 @@ function ChatRouteView({ session }: { session?: Session }) {
123
124
  sessionInfo={sessionInfo}
124
125
  sessionId={session.id}
125
126
  sessionTitle={session.title}
127
+ sessionStatus={session.status}
126
128
  isStarred={session.isStarred}
127
129
  isArchived={session.isArchived}
128
130
  tags={session.tags}
@@ -144,6 +146,7 @@ function ChatRouteView({ session }: { session?: Session }) {
144
146
  targetToolUseId={targetToolUseId}
145
147
  sessionInfo={sessionInfo}
146
148
  historyStatusNotices={historyStatusNotices}
149
+ queuedMessages={queuedMessages}
147
150
  onRetryConnection={retryConnection}
148
151
  interactionRequest={interactionRequest}
149
152
  onInteractionResponse={handleInteractionResponse}
@@ -1 +0,0 @@
1
- import{al as o,am as n}from"./mermaid.core-Cg1CCDo6.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-CukaUc0o.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-BfKbhiq5.js";import{f as a,g as t}from"./styles-d45a18b0-BgqAgJyW.js";import{ar as i}from"./mermaid.core-Cg1CCDo6.js";import"./graph-CukaUc0o.js";import"./layout-Z7yUG7hB.js";import"./index-BZosmb5_.js";import"./index-5325376f-CVISZFPw.js";import"./clone-CrkD2PuD.js";import"./edges-96097737-DuTBJJRv.js";import"./createText-1719965b-CigPEIEn.js";import"./line-DPG_cfAy.js";import"./array-BKyUJesY.js";import"./path-CbwjOpE9.js";import"./channel-CeKPk6Nd.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};