preload.cjs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. const { contextBridge, ipcRenderer } = require('electron');
  2. let streamRequestId = 0;
  3. const bridge = {
  4. appName: '易标投标工具箱',
  5. platform: process.platform,
  6. getVersion: () => ipcRenderer.invoke('app:get-version'),
  7. getLatestVersion: () => ipcRenderer.invoke('app:get-latest-version'),
  8. openExternal: (url) => ipcRenderer.invoke('app:open-external', url),
  9. checkUpdate: () => ipcRenderer.invoke('app:check-update'),
  10. startUpdate: () => ipcRenderer.invoke('app:start-update'),
  11. quitAndInstall: () => ipcRenderer.invoke('app:quit-and-install'),
  12. onUpdateProgress: (callback) => {
  13. const listener = (_event, payload) => callback(payload);
  14. ipcRenderer.on('app:update-progress', listener);
  15. return () => ipcRenderer.removeListener('app:update-progress', listener);
  16. },
  17. onUpdateDownloaded: (callback) => {
  18. const listener = (_event, payload) => callback(payload);
  19. ipcRenderer.on('app:update-downloaded', listener);
  20. return () => ipcRenderer.removeListener('app:update-downloaded', listener);
  21. },
  22. onUpdateError: (callback) => {
  23. const listener = (_event, payload) => callback(payload);
  24. ipcRenderer.on('app:update-error', listener);
  25. return () => ipcRenderer.removeListener('app:update-error', listener);
  26. },
  27. config: {
  28. load: () => ipcRenderer.invoke('config:load'),
  29. save: (config) => ipcRenderer.invoke('config:save', config),
  30. listModels: (config) => ipcRenderer.invoke('config:list-models', config),
  31. openConfigFolder: () => ipcRenderer.invoke('config:open-config-folder'),
  32. },
  33. ai: {
  34. chat: (request) => ipcRenderer.invoke('ai:chat', request),
  35. requestJson: (request) => ipcRenderer.invoke('ai:request-json', request),
  36. testImageModel: (config) => ipcRenderer.invoke('ai:test-image-model', config),
  37. streamChat: (request, onEvent) => {
  38. const requestId = ++streamRequestId;
  39. const channel = `ai:stream-chat:event:${requestId}`;
  40. const listener = (_event, payload) => onEvent(payload);
  41. ipcRenderer.on(channel, listener);
  42. ipcRenderer.send('ai:stream-chat', requestId, request);
  43. return () => {
  44. ipcRenderer.removeListener(channel, listener);
  45. };
  46. },
  47. },
  48. file: {
  49. importDocument: () => ipcRenderer.invoke('file:import-document'),
  50. selectDuplicateCheckFiles: (options) => ipcRenderer.invoke('file:select-duplicate-check-files', options),
  51. },
  52. knowledgeBase: {
  53. list: () => ipcRenderer.invoke('knowledge-base:list'),
  54. createFolder: (name) => ipcRenderer.invoke('knowledge-base:create-folder', name),
  55. renameFolder: (folderId, name) => ipcRenderer.invoke('knowledge-base:rename-folder', folderId, name),
  56. deleteFolder: (folderId) => ipcRenderer.invoke('knowledge-base:delete-folder', folderId),
  57. deleteDocument: (documentId) => ipcRenderer.invoke('knowledge-base:delete-document', documentId),
  58. uploadDocuments: (folderId) => ipcRenderer.invoke('knowledge-base:upload-documents', folderId),
  59. startMatching: (documentId, batchSize) => ipcRenderer.invoke('knowledge-base:start-matching', documentId, batchSize),
  60. readMarkdown: (documentId) => ipcRenderer.invoke('knowledge-base:read-markdown', documentId),
  61. readItems: (documentId) => ipcRenderer.invoke('knowledge-base:read-items', documentId),
  62. readAnalysis: (documentId) => ipcRenderer.invoke('knowledge-base:read-analysis', documentId),
  63. onEvent: (callback) => {
  64. const listener = (_event, payload) => callback(payload);
  65. ipcRenderer.on('knowledge-base:event', listener);
  66. return () => ipcRenderer.removeListener('knowledge-base:event', listener);
  67. },
  68. },
  69. duplicateCheck: {
  70. startMetadataAnalysis: (payload) => ipcRenderer.invoke('duplicate-check:start-metadata-analysis', payload),
  71. onEvent: (callback) => {
  72. const listener = (_event, payload) => callback(payload);
  73. ipcRenderer.on('duplicate-check:event', listener);
  74. return () => ipcRenderer.removeListener('duplicate-check:event', listener);
  75. },
  76. },
  77. workspace: {
  78. loadTechnicalPlan: () => ipcRenderer.invoke('workspace:load-technical-plan'),
  79. saveTechnicalPlan: (state) => ipcRenderer.invoke('workspace:save-technical-plan', state),
  80. updateTechnicalPlan: (partial) => ipcRenderer.invoke('workspace:update-technical-plan', partial),
  81. clearTechnicalPlan: () => ipcRenderer.invoke('workspace:clear-technical-plan'),
  82. loadDuplicateCheck: () => ipcRenderer.invoke('workspace:load-duplicate-check'),
  83. saveDuplicateCheck: (state) => ipcRenderer.invoke('workspace:save-duplicate-check', state),
  84. clearDuplicateCheck: () => ipcRenderer.invoke('workspace:clear-duplicate-check'),
  85. },
  86. tasks: {
  87. startBidAnalysis: (payload) => ipcRenderer.invoke('tasks:start-bid-analysis', payload),
  88. startOutlineGeneration: (payload) => ipcRenderer.invoke('tasks:start-outline-generation', payload),
  89. startContentGeneration: (payload) => ipcRenderer.invoke('tasks:start-content-generation', payload),
  90. getActiveTasks: () => ipcRenderer.invoke('tasks:get-active'),
  91. onTaskEvent: (callback) => {
  92. ipcRenderer.send('tasks:subscribe');
  93. const listener = (_event, payload) => callback(payload);
  94. ipcRenderer.on('tasks:event', listener);
  95. return () => ipcRenderer.removeListener('tasks:event', listener);
  96. },
  97. },
  98. export: {
  99. exportWord: (payload) => ipcRenderer.invoke('export:word', payload),
  100. onWordExportProgress: (callback) => {
  101. const listener = (_event, payload) => callback(payload);
  102. ipcRenderer.on('export:word-progress', listener);
  103. return () => ipcRenderer.removeListener('export:word-progress', listener);
  104. },
  105. },
  106. };
  107. contextBridge.exposeInMainWorld('yibiao', bridge);
  108. contextBridge.exposeInMainWorld('yibiaoClient', {
  109. appName: bridge.appName,
  110. platform: bridge.platform,
  111. });