Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
101 commits
Select commit Hold shift + click to select a range
e7123e5
refactor:
b1rdfree Jun 23, 2026
808eaf1
例子更新
b1rdfree Jun 23, 2026
5f1bb94
feat:调整部分方法逻辑和参数定义
b1rdfree Jun 24, 2026
ff96d5d
feat:chatipc移动到顶层;feat:历史对接新版;perf:ai删除本地粘贴的图片方法优化;del:删除信号onDelChats
luoluoTH Jun 24, 2026
c460279
perf:review相关的两个字段的新版热更新;del:删除信号:onRefreshHistoryAIEmbeddedSetting和o…
luoluoTH Jun 24, 2026
4606e98
del:删除没有使用的引用
luoluoTH Jun 24, 2026
048e676
feat:
b1rdfree Jun 25, 2026
ac10f57
perf:每个ai页面的来源改为从setting中获取
luoluoTH Jun 25, 2026
07deaeb
feat:ai执行过程中的顶部UI极其功能;feat:对接AIChatContent
luoluoTH Jun 25, 2026
5384ad7
feat:规划内容和自由对话
luoluoTH Jun 25, 2026
adf9a79
feat:旧版取值更换为新版,旧版发送消息改为新版
luoluoTH Jun 29, 2026
33a8d08
feat:修改aiPerfData相关
luoluoTH Jul 3, 2026
9289d58
feat:修改合master后的数据处理
luoluoTH Jul 3, 2026
619cf37
feat:
b1rdfree Jun 29, 2026
8b87251
预先解决合并冲突
b1rdfree Jun 29, 2026
e0f974c
refactor: 重新整合推送日志的调用逻辑
b1rdfree Jun 29, 2026
c031f84
doc:补充注释
luoluoTH Jul 3, 2026
e633462
feat:
b1rdfree Jul 3, 2026
2c86ae1
feat:
b1rdfree Jul 6, 2026
53065b8
feat:自由对话抽离header/content/footer
luoluoTH Jul 6, 2026
78fa479
feat:新版nodeitem;feat:自由对话抽离组件
luoluoTH Jul 7, 2026
9cff4ee
feat:
b1rdfree Jul 8, 2026
bddda21
feat: 将AIChatQSDataBase定义里taskIndex字段改为TaskID字段
b1rdfree Jul 8, 2026
f0eb905
feat:组相关的组件和逻辑
luoluoTH Jul 9, 2026
764cbea
feat:新增的旧版UI逻辑迁移新版
luoluoTH Jul 13, 2026
82ad167
1.feat:默认任务,TASK_DEFAULT_GROUP
luoluoTH Jul 13, 2026
1556a65
feat:
b1rdfree Jul 14, 2026
a9dcb8d
feat: 删除无效定义
b1rdfree Jul 14, 2026
9152033
解决老版的新增功能和新版的冲突
b1rdfree Jul 14, 2026
f8291a0
feat: 任务规划review的状态机支持数据更新触发UI渲染
b1rdfree Jul 14, 2026
9c71697
1.feat:对接review相关的部分数据;fix:修复一些小问题
luoluoTH Jul 14, 2026
c7c14dd
feat:侧边栏ai对接新版(主要是处理报错,withHistoryAIReActChat、HistroryAIReActChat)
luoluoTH Jul 15, 2026
ff35e2f
1.feat:子窗口的AIChildWindowTaskDefaultGroupCard、AIChildWindowConcurrentS…
luoluoTH Jul 15, 2026
9200101
fix:修复报错,暂时屏蔽ai历史的数据获取
luoluoTH Jul 16, 2026
cf941d3
1.feat:修改一些todo需求
luoluoTH Jul 16, 2026
fcf3204
fix: 修复 ChatMultiSessionController 多处逻辑与资源清理问题
b1rdfree Jul 16, 2026
b8a31a6
fix:修复发送消息后没有数据的问题;fix:修复已经卸载的会话没有被关闭的问题
luoluoTH Jul 16, 2026
bd60f2d
fix:aiagent顶部样式问题;fix:修复自由对话头部查询详情的taskid问题;fix:useChatIPC中seesionid为…
luoluoTH Jul 17, 2026
7c78550
fix:修复冲突后旧版报错代码
luoluoTH Jul 20, 2026
77c3d74
perf:流抽离Wrapper组件,定时获取数据,不通过renderNum更新;
luoluoTH Jul 20, 2026
c3409da
fix: 修复 review 流处理与任务树更新问题
b1rdfree Jul 21, 2026
1a5eb4c
fix: 修复 token 替换与 stream group 合并后 UI 不刷新
b1rdfree Jul 21, 2026
e14cabd
将旧逻辑调整代码更新到新逻辑中
b1rdfree Jul 19, 2026
51ccf54
perf:任务子窗口数据处理逻辑;子任务的一些优化
luoluoTH Jul 22, 2026
e5057ef
refactor: 移除冗余 useCasualChat/useTaskChat,收敛 CurrentExecTaskTree 与 Cha…
b1rdfree Jul 21, 2026
c723467
refactor: 以 route+pageId 归属 AI session,统一 useChatIPC 并支持换绑
b1rdfree Jul 22, 2026
6907937
del:删除onChatFromHistory
luoluoTH Jul 22, 2026
7e46d48
feta:HistoryAIReActChatProvider中改为source和pageid判断具体来源
luoluoTH Jul 23, 2026
af030cf
fix-style:修复流组遮罩层样式上的问题;perf:TASK_NODE_GROUP主窗口组件去掉isChildWindow;del:…
luoluoTH Jul 23, 2026
e413779
feat:重启会话;fix:修复openPopover关闭时数据先清空导致页面闪一下的问题;fix:修复删除历史时传的所有sessionid
luoluoTH Jul 24, 2026
3d3a09e
feat: 接入 AI 会话 IndexedDB 持久化与统一建连恢复
b1rdfree Jul 23, 2026
4d5c845
feat:将meta中的currentTaskPlanID相关逻辑移动到ChatStoreState中并与taskStatus融为一体;f…
luoluoTH Jul 24, 2026
814d01a
feat:参考资料该为从数据库中读取
luoluoTH Jul 27, 2026
83c7fa7
fix:解决冲突后的一些报错
luoluoTH Jul 27, 2026
aec60fb
迁移旧版逻辑到新版
b1rdfree Jul 27, 2026
ce11942
fix:解决报错
luoluoTH Jul 27, 2026
a78be71
feat: 任务规划运行态收敛为 TaskPlanStatus,并齐套 settle 终态
b1rdfree Jul 27, 2026
b8614ca
fix:修复一些问题
luoluoTH Jul 28, 2026
ca7e670
perf:子任务窗口所有对象数据都在窗口加载好后再向主渲染进程拿数据
luoluoTH Jul 28, 2026
a10626f
feat:配置更新后需要更新session对应的配置
luoluoTH Jul 28, 2026
25197a5
fix: 加固 AI 多会话建连/卸池与恢复落库逻辑
b1rdfree Jul 28, 2026
f8d56d9
feat: 上滑加载历史 + 视窗内存回收 + gRPC 兜底
hubin4826 Jul 29, 2026
ad2c0f6
fix:修复任务树定位列表问题;fix:修复侧边栏初始来源问题;feat:设置当前展示的seesion;fix:修复逻辑上的定时器清除的问题
luoluoTH Jul 29, 2026
290ae4f
feat:如果当前历史在aiagent页面中,直接切换会话;其余页面需要判断对话是否在执行,执行中需要先断开会话再设置新会话
luoluoTH Jul 29, 2026
bd6fe86
fix:handAIHistoryChatRemove方法中deleteSessionsParams>source改为sources
luoluoTH Jul 29, 2026
d57b025
fix: 恢复 AI 页面桥接事件消费
EmbraceAn Jul 29, 2026
2a0437f
feat: 恢复时间线与文件系统历史
hubin4826 Jul 29, 2026
11f7854
fix: 修复 timeline 历史与实时流数据重复/丢失问题
hubin4826 Jul 29, 2026
d4d97d7
fix: 加固 AI 会话持久化写队列与 structured 日志解析
b1rdfree Jul 29, 2026
75e72d0
fix: 修复工具卡片未上树与 grpc 事件分发漏处理
b1rdfree Jul 29, 2026
a6ba796
perf:子任务窗口的item中的renderNum从props传;
luoluoTH Jul 29, 2026
fc1572d
refactor: switchLoading 重命名为 initLoading
hubin4826 Jul 29, 2026
2f5789b
fix: 按 session 直接订阅 AI 页面桥接事件
EmbraceAn Jul 29, 2026
27c59b5
fix: 修复 timeline 上滑加载无限空查询 + 统一 state 取法
hubin4826 Jul 29, 2026
40cce20
refactor: 统一 dispatchStreamingNode 挂树逻辑
b1rdfree Jul 29, 2026
0ce5e6b
refactor: 收敛 Chat* 类型导出并补充 grpcLoadMoreLoading
b1rdfree Jul 30, 2026
bdf979e
fix:修复一些问题
luoluoTH Jul 30, 2026
d320a4a
fix:解决length报错;fix:窗口变化导致review数据被删除了;fix:任务点击定位高亮后边框动画消失问题
luoluoTH Jul 30, 2026
872cb67
fix: recovery 加载态与问题 uuid 替换查找
b1rdfree Jul 30, 2026
2fae87c
refactor: 向上加载改用 startReached + firstItemIndex 前插补偿机制
hubin4826 Jul 30, 2026
06474fd
fix: 修复历史会话-grpc请求里,问题呗放置在最下面的情况
b1rdfree Jul 30, 2026
f922f9c
fix: 暂时禁用 removeContentsFromMemory 的内存淘汰
b1rdfree Jul 30, 2026
8f8d2bd
fix:只有任务规划得task有继续执行按钮
luoluoTH Jul 30, 2026
4d2a02b
fix: 上滑加载与消息发送互斥
hubin4826 Jul 31, 2026
b975ec9
fix: 历史数据加载跳过打字机效果(shouldType 控制)
hubin4826 Jul 31, 2026
1d28ff6
fix: 恢复代码
hubin4826 Jul 31, 2026
c100fc4
feat:历史列表中增加执行状态
luoluoTH Jul 31, 2026
c4e6ed8
del:删除一些todo注释
luoluoTH Jul 31, 2026
e21d824
fix: remove all history data
EmbraceAn Jul 31, 2026
f63f046
fix: 会话执行态只读查询、写链清理与删除持久化路径
b1rdfree Jul 31, 2026
7b03151
chore: 清理旧 AI 消息 IndexedDB(aiChatMessageDB),已迁移到新库 aiChatPersistDB
hubin4826 Jul 31, 2026
11db43f
fix: remove history data
EmbraceAn Jul 31, 2026
6811fbb
fix: 补充handAIHistoryChatRemove 方法意外删除的try catch
EmbraceAn Jul 31, 2026
0f8e3e8
fix: AI 日志转发用 invoke 匹配主进程的 ipcMain.handle
hubin4826 Jul 31, 2026
8a9e669
fix:修复store问题
luoluoTH Jul 31, 2026
93292a4
Change skipLibCheck to true in tsconfig.json
b1rdfree Jul 31, 2026
8df6b9b
test: 为 ai-re-act hooks 补充 Vitest 用例并同步生产变更
b1rdfree Jul 31, 2026
f437b58
style: apply prettier formatting [skip ci]
github-actions[bot] Jul 31, 2026
1919033
fix: 规避 testing-library 对含 render 标识符的误报
b1rdfree Jul 31, 2026
9b5b3e7
style: apply prettier formatting [skip ci]
github-actions[bot] Jul 31, 2026
5578086
feat:历史列表切换会话关闭增加loading
luoluoTH Jul 31, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 8 additions & 14 deletions app/main/handlers/auxWindowManager/openAIConcurrentStream/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,13 @@ function register(manager, mainWindow) {
}
}

/**
* 子窗口打开后通过 fetch-concurrent-stream-contents 主动向主窗口拉取 rawData。
* 这里做 requestId 中转:转发请求到主窗口,等待响应后再 resolve 子窗口的 invoke。
*/
ipcMain.handle(FETCH_CONTENTS, async (_event, frame) => {
if (!frame?.session || !frame?.token || !mainWindow || mainWindow.isDestroyed()) {
return { contentEntries: [] }
return { rawData: [], execFileRecord: [], childrenTokens: [] }
}

const requestId = crypto.randomUUID()
Expand All @@ -40,20 +44,20 @@ function register(manager, mainWindow) {
return new Promise((resolve) => {
const timeout = setTimeout(() => {
ipcMain.removeAllListeners(responseChannel)
resolve({ contentEntries: [] })
resolve({ rawData: [], execFileRecord: [], childrenTokens: [] })
}, 15000)

ipcMain.once(responseChannel, (_responseEvent, data) => {
clearTimeout(timeout)
resolve(data ?? { contentEntries: [] })
resolve(data ?? { rawData: [], execFileRecord: [], childrenTokens: [] })
})

safeSendMain('fetch-concurrent-stream-contents-request', { requestId, ...frame })
})
})

ipcMain.handle('open-ai-concurrent-stream-window', async (_event, data) => {
if (!data || typeof data !== 'object' || !Array.isArray(data.elements)) return
if (!data || typeof data !== 'object') return
const singletonKey = buildSingletonKey(data)
const title = typeof data.taskName === 'string' && data.taskName ? data.taskName : 'Concurrent Stream'
return manager.create({
Expand All @@ -65,16 +69,6 @@ function register(manager, mainWindow) {
height: 800,
})
})

ipcMain.on('request-ai-concurrent-stream-refresh', (event, params) => {
for (const entry of manager.windows.values()) {
if (entry.win.isDestroyed()) continue
if (entry.meta.route !== ROUTE) continue
if (entry.win.webContents !== event.sender) continue
safeSendMain('refresh-ai-concurrent-stream', params)
return
}
})
}

module.exports = { register, ROUTE }
Original file line number Diff line number Diff line change
@@ -1,43 +1,64 @@
import React, { Suspense, lazy, startTransition, useEffect, useMemo, useState } from 'react'
import React, { lazy, memo, startTransition, Suspense, useEffect, useMemo, useRef, useState } from 'react'
import { yakitAuxWindow } from '@/services/electronBridge'
import ChatIPCContext from '@/pages/ai-agent/useContext/ChatIPCContent/ChatIPCContent'
import ConcurrentStreamSkeleton from '@/auxWindow/components/ConcurrentStreamSkeleton/ConcurrentStreamSkeleton'
import {
type ConcurrentStreamFramePayload,
isConcurrentStreamFrame,
} from '@/pages/ai-agent/components/ConcurrentStreamCard/concurrentStreamFrame'
import { AIChatQSDataTypeEnum, type AIChatQSData } from '@/pages/ai-re-act/hooks/aiRender'
import { buildConcurrentStreamContext } from './buildConcurrentStreamContext'
import { AIChatQSDataTypeEnum, AIYakExecFileRecord, type AIChatQSData } from '@/pages/ai-re-act/hooks/aiRender'
import { fetchConcurrentStreamContents } from './fetchConcurrentStreamContents'
import styles from './AIConcurrentStream.module.scss'
import AIConcurrentStreamContent, {
AIConcurrentStreamDispatcher,
AIConcurrentStreamStore,
} from './useContext/AIConcurrentStreamContent'
import useMemoizedFn from 'ahooks/lib/useMemoizedFn'
import { useDebounceFn } from 'ahooks'
import ConcurrentStreamSkeleton from '@/auxWindow/components/ConcurrentStreamSkeleton/ConcurrentStreamSkeleton'

const ConcurrentStreamCard = lazy(() => import('@/pages/ai-agent/components/ConcurrentStreamCard/ConcurrentStreamCard'))
const AITaskDefaultGroupCard = lazy(
() => import('@/pages/ai-agent/components/AITaskDefaultGroupCard/AITaskDefaultGroupCard'),
// 子卡片按需加载,避免重型卡片(AINodeItem 及其下游 review/report/fuzz 等子卡)
// 全量进入 aux bundle,拉长 did-finish-load 与首次开窗耗时。
const AIChildWindowTaskDefaultGroupCard = lazy(
() =>
import('@/pages/ai-agent/components/aiChildWindowItem/aiChildWindowTaskDefaultGroupCard/AIChildWindowTaskDefaultGroupCard'),
)
const AIChildWindowConcurrentStreamCard = lazy(
() =>
import('@/pages/ai-agent/components/ConcurrentStreamCard/aiChildWindowConcurrentStreamCard/AIChildWindowConcurrentStreamCard'),
)

const { ipcRenderer } = window.require('electron')

interface AIConcurrentStreamProps {
windowId: string
}

const AIConcurrentStream: React.FC<AIConcurrentStreamProps> = ({ windowId }) => {
const AIConcurrentStream: React.FC<AIConcurrentStreamProps> = memo(({ windowId }) => {
const [frame, setFrame] = useState<ConcurrentStreamFramePayload | null>(null)
const [contentVersion, setContentVersion] = useState(0)
const [contentEntries, setContentEntries] = useState<Array<[string, AIChatQSData]> | null>(null)
const [loadingContents, setLoadingContents] = useState(false)
const [loading, setLoading] = useState<boolean>(true)

// rawData/execFileRecord/childrenTokens 用 ref 存储,更新不触发渲染;
// 组件及子组件的重渲染由 contentVersion(renderNum)驱动
const rawDataRef = useRef<Map<string, AIChatQSData>>(new Map())
const execFileRecordRef = useRef<Map<string, AIYakExecFileRecord[]>>(new Map())
const childrenTokensRef = useRef<string[]>([])

useEffect(() => {
if (!windowId) return

const applyFrame = (payload: Record<string, unknown>) => {
const applyFrame = (payload: ConcurrentStreamFramePayload) => {
if (!isConcurrentStreamFrame(payload)) return
const newFrame: ConcurrentStreamFramePayload = {
...payload,
}
// 开窗时 frame 只携带轻量元数据
startTransition(() => {
setFrame(payload)
setContentEntries(null)
setContentVersion((v) => v + 1)
setFrame((v) => ({
...v,
...newFrame,
renderNum: (v?.renderNum || newFrame.renderNum || 0) + 1,
}))
})
// 收到 frame 后,主动向主窗口拉取本次需要渲染的 rawData。
fetchContents(newFrame)
}

const offInit = yakitAuxWindow.onInit((msg) => {
Expand All @@ -56,91 +77,83 @@
offInit()
offPush()
}
}, [windowId])

Check warning on line 80 in app/renderer/src/main/src/auxWindow/pages/AIConcurrentStream/AIConcurrentStream.tsx

View workflow job for this annotation

GitHub Actions / ESLint(renderer src/main) / check

React Hook useEffect has a missing dependency: 'fetchContents'. Either include it or remove the dependency array

useEffect(() => {
if (!frame || contentVersion === 0) return

let cancelled = false
setLoadingContents(true)

const fetchContents = useMemoizedFn((frame) => {
setLoading(true)
fetchConcurrentStreamContents(frame)
.then((entries) => {
if (!cancelled) setContentEntries(entries)
})
.catch(() => {
if (!cancelled) setContentEntries([])
rawDataRef.current = entries.rawData
execFileRecordRef.current = entries.execFileRecord
childrenTokensRef.current = entries.childrenTokens
})
.finally(() => {
if (!cancelled) setLoadingContents(false)
setTimeout(() => {
setContentVersion((v) => v + 1)
setLoading(false)
}, 200)
})
})

return () => {
cancelled = true
}
}, [frame, contentVersion])

const contextValue = useMemo(() => {
if (!frame || !contentEntries) return null
return buildConcurrentStreamContext({ ...frame, contentEntries })
}, [contentEntries, frame])
// 首次拉取立即执行;后续刷新走 500ms 去抖,合并短时间内的多次推送
const getRawDataDebounced = useDebounceFn((frame) => fetchContents(frame), {
wait: 500,
leading: true,
}).run
const getRawData = useMemoizedFn((frame) => {
getRawDataDebounced(frame)
})

const isTaskDefaultGroup = useMemo(() => {
if (!frame || !contentEntries) return false
const root = contentEntries.find(([key]) => key === frame.token)?.[1]
if (!frame) return false
// 优先用 frame 随身携带的 rootType,无需等待 rawData 拉取完成
if (frame.rootType != null) return frame.rootType === AIChatQSDataTypeEnum.TASK_DEFAULT_GROUP
const root = rawDataRef.current.get(frame.token)
return root?.type === AIChatQSDataTypeEnum.TASK_DEFAULT_GROUP
}, [contentEntries, frame])

const cardKey = `${frame?.session}:${frame?.token}:${frame?.chatType}`
}, [frame, contentVersion])

Check warning on line 113 in app/renderer/src/main/src/auxWindow/pages/AIConcurrentStream/AIConcurrentStream.tsx

View workflow job for this annotation

GitHub Actions / ESLint(renderer src/main) / check

React Hook useMemo has an unnecessary dependency: 'contentVersion'. Either exclude it or remove the dependency array

const requestRefresh = () => {
// 刷新:通过 IPC 通知主窗口重新构建并推送最新 frame(含最新 rawData)
const requestRefresh = useMemoizedFn(() => {
if (!frame) return
ipcRenderer.send('request-ai-concurrent-stream-refresh', {
type: 'openAIConcurrentStream',
data: {
session: frame.session,
token: frame.token,
chatType: frame.chatType,
},
})
}

if (!frame || loadingContents || !contextValue) {
getRawData(frame)
})
const store: AIConcurrentStreamStore = useMemo(() => {
return {
session: frame?.session ?? '',
token: frame?.token ?? '',
chatType: frame?.chatType ?? 'task',
childrenTokens: [...childrenTokensRef.current],
rawData: rawDataRef.current,
execFileRecord: execFileRecordRef.current,
renderNum: contentVersion,
}
}, [contentVersion])

Check warning on line 130 in app/renderer/src/main/src/auxWindow/pages/AIConcurrentStream/AIConcurrentStream.tsx

View workflow job for this annotation

GitHub Actions / ESLint(renderer src/main) / check

React Hook useMemo has missing dependencies: 'frame?.chatType', 'frame?.session', and 'frame?.token'. Either include them or remove the dependency array
const dispatcher: AIConcurrentStreamDispatcher = useMemo(() => {
return {
requestRefresh,
}
}, [])

Check warning on line 135 in app/renderer/src/main/src/auxWindow/pages/AIConcurrentStream/AIConcurrentStream.tsx

View workflow job for this annotation

GitHub Actions / ESLint(renderer src/main) / check

React Hook useMemo has a missing dependency: 'requestRefresh'. Either include it or remove the dependency array
// frame 到达即可渲染卡片:rootType 已随 frame 下发,懒加载 chunk 与 rawData 拉取并行解析
if (!frame || loading) {
return <ConcurrentStreamSkeleton variant="page" />
}

return (
<ChatIPCContext.Provider value={contextValue}>
<AIConcurrentStreamContent.Provider value={{ store, dispatcher }}>
<div className={styles.page}>
<div className={styles.divider} />
<div className={styles.wrapper}>
<Suspense fallback={<ConcurrentStreamSkeleton variant="card" />}>
{isTaskDefaultGroup ? (
<AITaskDefaultGroupCard
key={cardKey}
isChildWindow
onRefresh={requestRefresh}
session={frame.session}
token={frame.token}
chatType={frame.chatType}
elements={frame.elements}
/>
<AIChildWindowTaskDefaultGroupCard token={frame.token} />
) : (
<ConcurrentStreamCard
key={cardKey}
isChildWindow
onRefresh={requestRefresh}
session={frame.session}
token={frame.token}
chatType={frame.chatType}
elements={frame.elements}
/>
<AIChildWindowConcurrentStreamCard token={frame.token} />
)}
</Suspense>
</div>
</div>
</ChatIPCContext.Provider>
</AIConcurrentStreamContent.Provider>
)
}
})

export default AIConcurrentStream

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,11 +1,32 @@
import type { AIChatQSData } from '@/pages/ai-re-act/hooks/aiRender'
import type { ConcurrentStreamFramePayload } from '@/pages/ai-agent/components/ConcurrentStreamCard/concurrentStreamFrame'
import type { AIChatQSData, AIYakExecFileRecord } from '@/pages/ai-re-act/hooks/aiRender'
import type {
ConcurrentStreamFramePayload,
FramePayload,
} from '@/pages/ai-agent/components/ConcurrentStreamCard/concurrentStreamFrame'

const { ipcRenderer } = window.require('electron')

export interface FetchConcurrentStreamContentsResponse extends Omit<FramePayload, 'renderNum'> {}
/**
* 子窗口通过 IPC 向主窗口拉取 task 相关的全部 content 数据。
*/
export async function fetchConcurrentStreamContents(
frame: ConcurrentStreamFramePayload,
): Promise<Array<[string, AIChatQSData]>> {
const result = await ipcRenderer.invoke('fetch-concurrent-stream-contents', frame)
return result?.contentEntries ?? []
): Promise<FetchConcurrentStreamContentsResponse> {
try {
const result = await ipcRenderer.invoke('fetch-concurrent-stream-contents', frame)
const rawData: Array<[string, AIChatQSData]> = result?.rawData ?? []
const execFileRecord: Array<[string, AIYakExecFileRecord[]]> = result?.execFileRecord ?? []
return {
rawData: new Map(rawData),
execFileRecord: new Map(execFileRecord),
childrenTokens: result?.childrenTokens ?? [],
}
} catch (error) {
return {
rawData: new Map(),
execFileRecord: new Map(),
childrenTokens: [],
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import {
ConcurrentStreamFramePayload,
FramePayload,
} from '@/pages/ai-agent/components/ConcurrentStreamCard/concurrentStreamFrame'
import { createContext } from 'react'

export interface AIConcurrentStreamStore extends ConcurrentStreamFramePayload, FramePayload {}

export interface AIConcurrentStreamDispatcher {
requestRefresh: () => void
}

export interface AIConcurrentStreamValue {
store: AIConcurrentStreamStore
dispatcher: AIConcurrentStreamDispatcher
}

export default createContext<AIConcurrentStreamValue>({
store: {
session: '',
token: '',
chatType: 'reAct',
childrenTokens: [],
rawData: new Map(),
renderNum: 0,
execFileRecord: new Map(),
},
dispatcher: {
requestRefresh: () => {},
},
})
Loading
Loading