返回 oh-my-ppt
context.ts
根目录 / src / main / ipc / runtime / context.ts
1 import type { BrowserWindow } from 'electron'
2 import type { GenerateChunkEvent } from '@shared/generation'
3 import type { AppLocale } from '@shared/progress'
4 import type { PPTDatabase } from '../../db/database'
5 import type { AgentManager } from '../../agent-runtime/agent'
6 import { TypedEventBus, type RuntimeDomain } from '../../agent-runtime'
7 import type { ModelRuntimeConfig } from '../../agent-runtime/model'
8 import { createRuntimeCredentials, type RuntimeCredentials } from './credentials'
9 import { createRuntimeLocalFiles, type RuntimeLocalFiles } from './local-files'
10 import { createPageExport, type PageExport, type SessionPageFile } from './page-export'
11 import {
12 createRuntimeEmitters,
13 getDeckProgressStageBounds,
14 shouldEmitLlmStatusUpdate,
15 type LlmStatusEmissionSnapshot,
16 type RuntimeEmitters
17 } from './runtime-emitters'
18 import {
19 createSessionProjectResolver,
20 type SessionGenerationSnapshot,
21 type SessionProjectResolver
22 } from './session-project'
23 import { createSessionScaffold, type SessionScaffold } from './session-scaffold'
24 import {
25 createSessionRunStateStore,
26 getSessionRunPageCounts,
27 type BeginSessionRunStateArgs,
28 type SessionRunState,
29 type SessionRunStateStore
30 } from './session-run-state'
31
32 export {
33 getDeckProgressStageBounds,
34 getSessionRunPageCounts,
35 shouldEmitLlmStatusUpdate
36 }
37 export type {
38 BeginSessionRunStateArgs,
39 LlmStatusEmissionSnapshot,
40 SessionGenerationSnapshot,
41 SessionPageFile,
42 SessionRunState
43 }
44
45 /**
46 * Compatibility facade for existing handlers. Its members are assembled from
47 * focused runtime capabilities; new domains should depend on their narrow
48 * capability rather than growing this interface.
49 */
50 export interface IpcContext
51 extends SessionProjectResolver,
52 RuntimeLocalFiles,
53 RuntimeCredentials,
54 SessionScaffold,
55 PageExport {
56 mainWindow: BrowserWindow
57 db: PPTDatabase
58 agentManager: AgentManager
59 modelRuntime: ModelRuntimeConfig
60 sessionRuns: SessionRunStateStore
61 runtimeEmitters: RuntimeEmitters
62 sessionProject: SessionProjectResolver
63 localFiles: RuntimeLocalFiles
64 credentials: RuntimeCredentials
65 sessionScaffold: SessionScaffold
66 sessionRunStates: Map<string, SessionRunState>
67 pruneFinishedSessionRunStates(now?: number): void
68 beginSessionRunState(args: BeginSessionRunStateArgs): void
69 trackSessionRunChunk(sessionId: string, chunk: GenerateChunkEvent): void
70 emitGenerateChunk(sessionId: string, chunk: GenerateChunkEvent): void
71 emitRuntimeJobStarted(args: {
72 sessionId: string
73 jobId: string
74 domain?: RuntimeDomain
75 }): void
76 emitRuntimeJobTerminal(args: {
77 sessionId: string
78 jobId: string
79 domain?: RuntimeDomain
80 status: 'completed' | 'failed' | 'cancelled'
81 errorCode?: string
82 errorMessage?: string
83 cancellationReason?: 'user' | 'timeout' | 'shutdown'
84 }): void
85 createDeckProgressEmitter(
86 sessionId: string,
87 appLocale?: AppLocale
88 ): (chunk: GenerateChunkEvent) => void
89 PLANNER_TEMPERATURE: number
90 DESIGN_CONTRACT_TEMPERATURE: number
91 PAGE_GENERATION_TEMPERATURE: number
92 PAGE_EDIT_WITH_SELECTOR_TEMPERATURE: number
93 PAGE_EDIT_DEFAULT_TEMPERATURE: number
94 }
95
96 const PLANNER_TEMPERATURE = 0.1
97 const DESIGN_CONTRACT_TEMPERATURE = 0.25
98 const PAGE_GENERATION_TEMPERATURE = 0.65
99 const PAGE_EDIT_WITH_SELECTOR_TEMPERATURE = 0.15
100 const PAGE_EDIT_DEFAULT_TEMPERATURE = 0.45
101
102 export function createIpcContext(
103 mainWindow: BrowserWindow,
104 db: PPTDatabase,
105 agentManager: AgentManager,
106 runtimeEvents = new TypedEventBus(),
107 modelRuntime: ModelRuntimeConfig = { recorder: null }
108 ): IpcContext {
109 const sessionProject = createSessionProjectResolver({ db })
110 const localFiles = createRuntimeLocalFiles({ db, sessionProject })
111 const sessionRuns = createSessionRunStateStore()
112 const runtimeEmitters = createRuntimeEmitters({ mainWindow, runtimeEvents, sessionRuns })
113 const credentials = createRuntimeCredentials()
114 const scaffold = createSessionScaffold()
115 const pageExport = createPageExport({ db, localFiles, sessionProject })
116
117 const beginSessionRunState = (args: BeginSessionRunStateArgs): void => {
118 const state = sessionRuns.beginSessionRunState(args)
119 runtimeEmitters.emitSessionRunLifecycle(state)
120 }
121
122 return {
123 mainWindow,
124 db,
125 agentManager,
126 modelRuntime,
127 sessionRuns,
128 runtimeEmitters,
129 sessionProject,
130 localFiles,
131 credentials,
132 sessionScaffold: scaffold,
133 ...sessionProject,
134 ...localFiles,
135 ...credentials,
136 ...scaffold,
137 ...pageExport,
138 sessionRunStates: sessionRuns.sessionRunStates,
139 pruneFinishedSessionRunStates: sessionRuns.pruneFinishedSessionRunStates,
140 beginSessionRunState,
141 trackSessionRunChunk: sessionRuns.trackSessionRunChunk,
142 emitGenerateChunk: runtimeEmitters.emitGenerateChunk,
143 emitRuntimeJobStarted: runtimeEmitters.emitRuntimeJobStarted,
144 emitRuntimeJobTerminal: runtimeEmitters.emitRuntimeJobTerminal,
145 createDeckProgressEmitter: runtimeEmitters.createDeckProgressEmitter,
146 PLANNER_TEMPERATURE,
147 DESIGN_CONTRACT_TEMPERATURE,
148 PAGE_GENERATION_TEMPERATURE,
149 PAGE_EDIT_WITH_SELECTOR_TEMPERATURE,
150 PAGE_EDIT_DEFAULT_TEMPERATURE
151 }
152 }
153
153 lines TYPESCRIPT