@vibe-forge/client 0.10.0 → 0.10.1

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 (66) hide show
  1. package/dist/assets/{arc-CCXV7u3V.js → arc-C1rWFTer.js} +1 -1
  2. package/dist/assets/{blockDiagram-c4efeb88-Bm52FmvT.js → blockDiagram-c4efeb88-DlZ9x70F.js} +1 -1
  3. package/dist/assets/{c4Diagram-c83219d4-C8tTEpcK.js → c4Diagram-c83219d4-BKKxi__y.js} +1 -1
  4. package/dist/assets/channel-F1aqMANO.js +1 -0
  5. package/dist/assets/{classDiagram-beda092f-CNAIBAH1.js → classDiagram-beda092f-CVGPySZq.js} +1 -1
  6. package/dist/assets/{classDiagram-v2-2358418a-BHeZAVdc.js → classDiagram-v2-2358418a-7kp8GVVj.js} +1 -1
  7. package/dist/assets/clone-B-GCuXNo.js +1 -0
  8. package/dist/assets/{createText-1719965b-BS2hLG8t.js → createText-1719965b-Dykv8kT9.js} +1 -1
  9. package/dist/assets/{cssMode-WHcTFAOU.js → cssMode-B59COYVW.js} +1 -1
  10. package/dist/assets/{edges-96097737-C07f4iWA.js → edges-96097737-CkZ1ZBro.js} +1 -1
  11. package/dist/assets/{erDiagram-0228fc6a-BytsAWUs.js → erDiagram-0228fc6a-281ADcRp.js} +1 -1
  12. package/dist/assets/{flowDb-c6c81e3f-CQJkOpAs.js → flowDb-c6c81e3f-BQjX_flP.js} +1 -1
  13. package/dist/assets/{flowDiagram-50d868cf-CD5Tng2S.js → flowDiagram-50d868cf-DMHZTjES.js} +1 -1
  14. package/dist/assets/flowDiagram-v2-4f6560a1-C5FzdVl1.js +1 -0
  15. package/dist/assets/{flowchart-elk-definition-6af322e1-ylso-GWH.js → flowchart-elk-definition-6af322e1-CI3yz4z8.js} +1 -1
  16. package/dist/assets/{freemarker2-U_9Jyyr3.js → freemarker2-DWnWjibn.js} +1 -1
  17. package/dist/assets/{ganttDiagram-a2739b55-Cg98bJx5.js → ganttDiagram-a2739b55-B3IING9L.js} +1 -1
  18. package/dist/assets/{gitGraphDiagram-82fe8481-7Yp4hz0N.js → gitGraphDiagram-82fe8481-CnArIr_T.js} +1 -1
  19. package/dist/assets/{graph-Ig3nvzvL.js → graph-BZ1F0Yve.js} +1 -1
  20. package/dist/assets/{handlebars-DQyCBwHe.js → handlebars-C1QH9qTz.js} +1 -1
  21. package/dist/assets/{html-CNC2AT5k.js → html-D1NkqHjC.js} +1 -1
  22. package/dist/assets/{htmlMode-DlATk4xW.js → htmlMode-DAZCE_rA.js} +1 -1
  23. package/dist/assets/{index-5325376f-C4zed9sb.js → index-5325376f-Da9zSHjA.js} +1 -1
  24. package/dist/assets/{index-Dbx0JG0p.js → index-C0vjF3D0.js} +248 -248
  25. package/dist/assets/{index-DRLsOoqb.css → index-vzEbM21t.css} +1 -1
  26. package/dist/assets/{infoDiagram-8eee0895-C8oSBaFs.js → infoDiagram-8eee0895-DYbFvRM7.js} +1 -1
  27. package/dist/assets/{javascript-9wv9uKW4.js → javascript-CoMjGRHa.js} +1 -1
  28. package/dist/assets/{journeyDiagram-c64418c1-D5kJldvy.js → journeyDiagram-c64418c1-Boebox0b.js} +1 -1
  29. package/dist/assets/{jsonMode-45dv39mU.js → jsonMode-D__gAvuz.js} +1 -1
  30. package/dist/assets/{layout-DYNFLnIl.js → layout-CTcHNbHp.js} +1 -1
  31. package/dist/assets/{line-1gvOYQYZ.js → line-4AwinCz2.js} +1 -1
  32. package/dist/assets/{linear-DHGm6Zdw.js → linear-CeSMLzJW.js} +1 -1
  33. package/dist/assets/{liquid-BGoxrdXO.js → liquid-DZF6egdE.js} +1 -1
  34. package/dist/assets/{lspLanguageFeatures-CpCCXhrd.js → lspLanguageFeatures-6K4lv5S2.js} +1 -1
  35. package/dist/assets/{mdx-Dc2iMbEw.js → mdx-Cnt4ka6w.js} +1 -1
  36. package/dist/assets/{mermaid.core-Cq2bBFF1.js → mermaid.core-B0yG5s4D.js} +4 -4
  37. package/dist/assets/{mindmap-definition-8da855dc-y5l6GRVh.js → mindmap-definition-8da855dc-KJEvXMKj.js} +1 -1
  38. package/dist/assets/{pieDiagram-a8764435-PNROcv9y.js → pieDiagram-a8764435-17nFAXPJ.js} +1 -1
  39. package/dist/assets/{python-DjYAge7h.js → python-DA3TtjDv.js} +1 -1
  40. package/dist/assets/{quadrantDiagram-1e28029f-CFJ3VPpp.js → quadrantDiagram-1e28029f-Dt4vubi-.js} +1 -1
  41. package/dist/assets/{razor-OIY8fx_i.js → razor-CWDJgvX_.js} +1 -1
  42. package/dist/assets/{requirementDiagram-08caed73-BpzDIINS.js → requirementDiagram-08caed73-H6aDyDK-.js} +1 -1
  43. package/dist/assets/{sankeyDiagram-a04cb91d-CH69-iIn.js → sankeyDiagram-a04cb91d-DxsVtbjI.js} +1 -1
  44. package/dist/assets/{sequenceDiagram-c5b8d532-yBBEeVFU.js → sequenceDiagram-c5b8d532-BHa148XJ.js} +1 -1
  45. package/dist/assets/{stateDiagram-1ecb1508-BvF4sign.js → stateDiagram-1ecb1508-DgwBm8LO.js} +1 -1
  46. package/dist/assets/{stateDiagram-v2-c2b004d7-BeyT7Ghx.js → stateDiagram-v2-c2b004d7-BK7IQLVc.js} +1 -1
  47. package/dist/assets/{styles-b4e223ce-C58zxmK6.js → styles-b4e223ce-DzW27Bc-.js} +1 -1
  48. package/dist/assets/{styles-ca3715f6-DCE5sFi5.js → styles-ca3715f6-Dex2GiLT.js} +1 -1
  49. package/dist/assets/{styles-d45a18b0-CG-C1aM8.js → styles-d45a18b0-B6fGtDKS.js} +1 -1
  50. package/dist/assets/{svgDrawCommon-b86b1483-F-K8GeDd.js → svgDrawCommon-b86b1483-B4HYgfV5.js} +1 -1
  51. package/dist/assets/{timeline-definition-faaaa080-DPv4uqVX.js → timeline-definition-faaaa080--QSbWb25.js} +1 -1
  52. package/dist/assets/{tsMode-BtU8ZELV.js → tsMode-ZM7ocZCH.js} +1 -1
  53. package/dist/assets/{typescript-CJHgISWo.js → typescript-CKWDmBCc.js} +1 -1
  54. package/dist/assets/{xml-C_TJw4Bi.js → xml-DuEUAzPi.js} +1 -1
  55. package/dist/assets/{xychartDiagram-f5964ef8-BmXlhBzX.js → xychartDiagram-f5964ef8-D09Zkv2K.js} +1 -1
  56. package/dist/assets/{yaml-BujeJOJ6.js → yaml-DL7QPRYk.js} +1 -1
  57. package/dist/index.html +2 -2
  58. package/package.json +8 -8
  59. package/src/components/chat/ChatHistoryView.tsx +72 -3
  60. package/src/components/chat/messages/MessageItem.scss +10 -0
  61. package/src/components/chat/messages/MessageItem.tsx +5 -1
  62. package/src/components/chat/tools/core/ToolGroup.tsx +32 -23
  63. package/src/routes/ChatRoute.tsx +29 -1
  64. package/dist/assets/channel-gq_WMRvv.js +0 -1
  65. package/dist/assets/clone-XxGY7A5N.js +0 -1
  66. package/dist/assets/flowDiagram-v2-4f6560a1-DIBOANLV.js +0 -1
@@ -16,6 +16,7 @@ interface ToolGroupProps {
16
16
  }[]
17
17
  originalMessage: ChatMessage
18
18
  sessionId?: string
19
+ targetToolUseId?: string
19
20
  footer?: {
20
21
  model?: string
21
22
  usage?: ChatMessage['usage']
@@ -29,6 +30,7 @@ function ToolGroupComponent({
29
30
  items,
30
31
  originalMessage,
31
32
  sessionId,
33
+ targetToolUseId,
32
34
  footer
33
35
  }: ToolGroupProps) {
34
36
  const { t } = useTranslation()
@@ -36,6 +38,13 @@ function ToolGroupComponent({
36
38
  const isDebugMode = searchParams.get('debug') === 'true'
37
39
  const [expanded, setExpanded] = useState(false)
38
40
 
41
+ const lastItem = items[items.length - 1]
42
+ const otherItems = items.slice(0, -1)
43
+ const shouldForceExpand = targetToolUseId != null &&
44
+ targetToolUseId !== '' &&
45
+ otherItems.some(item => item.item.id === targetToolUseId)
46
+ const isExpanded = expanded || shouldForceExpand
47
+
39
48
  if (items.length === 0) return null
40
49
 
41
50
  // If only one item, just render it directly (wrapped in container for footer)
@@ -55,7 +64,7 @@ function ToolGroupComponent({
55
64
  onStartEditing={() => {}}
56
65
  >
57
66
  <div id={anchorId} className='tool-group-container'>
58
- <div className='tool-group-wrapper single-item'>
67
+ <div className='tool-group-wrapper single-item' data-tool-use-id={items[0].item.id}>
59
68
  <ToolRenderer
60
69
  item={items[0].item}
61
70
  resultItem={items[0].resultItem}
@@ -71,9 +80,6 @@ function ToolGroupComponent({
71
80
  )
72
81
  }
73
82
 
74
- const lastItem = items[items.length - 1]
75
- const otherItems = items.slice(0, -1)
76
-
77
83
  return (
78
84
  <MessageContextMenu
79
85
  anchorId={anchorId}
@@ -90,30 +96,31 @@ function ToolGroupComponent({
90
96
  >
91
97
  <div id={anchorId} className='tool-group-container'>
92
98
  <div className='tool-group-wrapper card-style'>
93
- <div
94
- className='tool-group-header'
95
- onClick={() => setExpanded(!expanded)}
96
- >
97
- <div className='header-left'>
98
- <span className='material-symbols-rounded'>dataset</span>
99
- <span>{t('chat.usedTools', { count: items.length })}</span>
100
- </div>
101
- <span className='material-symbols-rounded expand-icon'>
102
- {expanded ? 'expand_less' : 'expand_more'}
103
- </span>
99
+ <div
100
+ className='tool-group-header'
101
+ onClick={() => setExpanded(!expanded)}
102
+ >
103
+ <div className='header-left'>
104
+ <span className='material-symbols-rounded'>dataset</span>
105
+ <span>{t('chat.usedTools', { count: items.length })}</span>
104
106
  </div>
107
+ <span className='material-symbols-rounded expand-icon'>
108
+ {isExpanded ? 'expand_less' : 'expand_more'}
109
+ </span>
110
+ </div>
105
111
 
106
- {expanded && (
107
- <div className='tool-group-list'>
108
- {otherItems.map((it, idx) => (
112
+ {isExpanded && (
113
+ <div className='tool-group-list'>
114
+ {otherItems.map((it, idx) => (
115
+ <div key={it.item.id || idx} data-tool-use-id={it.item.id}>
109
116
  <ToolRenderer
110
- key={it.item.id || idx}
111
117
  item={it.item}
112
118
  resultItem={it.resultItem}
113
119
  />
114
- ))}
115
- </div>
116
- )}
120
+ </div>
121
+ ))}
122
+ </div>
123
+ )}
117
124
 
118
125
  {
119
126
  /* Always show the last item, but if expanded, it's just part of the list visually.
@@ -124,12 +131,13 @@ function ToolGroupComponent({
124
131
  When expanded: Header + Other Items + Last Item
125
132
  */
126
133
  }
127
- <div className='tool-group-last-item'>
134
+ <div className='tool-group-last-item' data-tool-use-id={lastItem.item.id}>
128
135
  <ToolRenderer
129
136
  item={lastItem.item}
130
137
  resultItem={lastItem.resultItem}
131
138
  />
132
139
  </div>
140
+
133
141
  </div>
134
142
 
135
143
  {footer && isDebugMode && (
@@ -145,6 +153,7 @@ function ToolGroupComponent({
145
153
  const areToolGroupPropsEqual = (prev: ToolGroupProps, next: ToolGroupProps) => {
146
154
  if (prev.anchorId !== next.anchorId) return false
147
155
  if (prev.items.length !== next.items.length) return false
156
+ if (prev.targetToolUseId !== next.targetToolUseId) return false
148
157
  for (let i = 0; i < prev.items.length; i++) {
149
158
  if (prev.items[i].item !== next.items[i].item) return false
150
159
  if (prev.items[i].resultItem !== next.items[i].resultItem) return false
@@ -1,8 +1,9 @@
1
1
  import './ChatRoute.scss'
2
2
 
3
3
  import { Button, Empty } from 'antd'
4
+ import { useEffect, useRef } from 'react'
4
5
  import { useTranslation } from 'react-i18next'
5
- import { useNavigate, useParams } from 'react-router-dom'
6
+ import { useNavigate, useParams, useSearchParams } from 'react-router-dom'
6
7
  import useSWR from 'swr'
7
8
 
8
9
  import type { Session } from '@vibe-forge/core'
@@ -47,6 +48,7 @@ function ChatRouteView({
47
48
  }: {
48
49
  session?: Session
49
50
  }) {
51
+ const [searchParams] = useSearchParams()
50
52
  const {
51
53
  messages,
52
54
  sessionInfo,
@@ -82,10 +84,34 @@ function ChatRouteView({
82
84
  hasAvailableModels,
83
85
  modelUnavailable
84
86
  } = useChatSession({ session })
87
+ const targetMessageId = searchParams.get('messageId') ?? undefined
88
+ const targetToolUseId = searchParams.get('toolUseId') ?? undefined
89
+ const deepLinkTargetKey = targetToolUseId?.trim()
90
+ ? `tool:${targetToolUseId.trim()}`
91
+ : targetMessageId?.trim()
92
+ ? `message:${targetMessageId.trim()}`
93
+ : ''
85
94
  const isEmptyNewSession = !session?.id && messages.length === 0
86
95
  const resolvedActiveView = session?.id != null ? activeView : 'history'
87
96
  const shouldShowTerminal = session?.id != null && isTerminalOpen
88
97
  const { isRendered: isTerminalRendered, isVisible: isTerminalVisible } = useTerminalDockVisibility(shouldShowTerminal)
98
+ const handledDeepLinkTargetRef = useRef('')
99
+
100
+ useEffect(() => {
101
+ if (deepLinkTargetKey === '') {
102
+ handledDeepLinkTargetRef.current = ''
103
+ return
104
+ }
105
+
106
+ if (handledDeepLinkTargetRef.current === deepLinkTargetKey) {
107
+ return
108
+ }
109
+
110
+ handledDeepLinkTargetRef.current = deepLinkTargetKey
111
+ if (activeView !== 'history') {
112
+ setActiveView('history')
113
+ }
114
+ }, [activeView, deepLinkTargetKey, setActiveView])
89
115
 
90
116
  return (
91
117
  <div
@@ -117,6 +143,8 @@ function ChatRouteView({
117
143
  isReady={isReady}
118
144
  messages={messages}
119
145
  session={session}
146
+ targetMessageId={targetMessageId}
147
+ targetToolUseId={targetToolUseId}
120
148
  sessionInfo={sessionInfo}
121
149
  errorBanner={errorBanner}
122
150
  onRetryConnection={retryConnection}
@@ -1 +0,0 @@
1
- import{al as o,am as n}from"./mermaid.core-Cq2bBFF1.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-Ig3nvzvL.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-CQJkOpAs.js";import{f as a,g as t}from"./styles-d45a18b0-CG-C1aM8.js";import{ar as i}from"./mermaid.core-Cq2bBFF1.js";import"./graph-Ig3nvzvL.js";import"./layout-DYNFLnIl.js";import"./index-Dbx0JG0p.js";import"./index-5325376f-C4zed9sb.js";import"./clone-XxGY7A5N.js";import"./edges-96097737-C07f4iWA.js";import"./createText-1719965b-BS2hLG8t.js";import"./line-1gvOYQYZ.js";import"./array-BKyUJesY.js";import"./path-CbwjOpE9.js";import"./channel-gq_WMRvv.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};