File size: 4,969 Bytes
abcf568
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
import type { CustomApiConfig } from '../../../../types'
import type { StudioRunProcessor } from '../run-processor'
import type { StudioTurnPlanResolver } from '../../planning/turn-plan-resolver'
import type {
  StudioResolvedSkill,
  StudioSkillDiscoveryEntry,
  StudioSkillUsageSummary,
  StudioSubagentRunRequest,
  StudioSubagentRunResult
} from '../../tools/tool-runtime-context'
import type {
  StudioAssistantMessage,
  StudioEventBus,
  StudioMessageStore,
  StudioPartStore,
  StudioProcessorStreamEvent,
  StudioRun,
  StudioRunStore,
  StudioSession,
  StudioSessionEventStore,
  StudioSessionStore,
  StudioTaskStore,
  StudioToolChoice,
  StudioWorkContext,
  StudioWorkResultStore,
  StudioWorkStore
} from '../../../domain/types'
import type { StudioToolRegistry } from '../../../tools/registry'

export interface StudioSessionRunnerOptions {
  registry: StudioToolRegistry
  messageStore: StudioMessageStore
  partStore: StudioPartStore
  runStore?: StudioRunStore
  sessionStore?: StudioSessionStore
  sessionEventStore?: StudioSessionEventStore
  taskStore?: StudioTaskStore
  workStore?: StudioWorkStore
  workResultStore?: StudioWorkResultStore
  eventBus?: StudioEventBus
  resolveSkill?: (name: string, session: StudioSession) => Promise<StudioResolvedSkill>
  listSkills?: (session: StudioSession) => Promise<StudioSkillDiscoveryEntry[]>
  listSkillSummaries?: (session: StudioSession) => Promise<StudioSkillUsageSummary[]>
  recordSkillUsage?: (input: {
    session: StudioSession
    skillName: string
    reason?: string
    takeaway?: string
    stillRelevant?: boolean
  }) => Promise<void>
  resolveTurnPlan: StudioTurnPlanResolver
}

export interface StudioRunRequestInput {
  projectId: string
  session: StudioSession
  inputText: string
  customApiConfig?: CustomApiConfig
  toolChoice?: StudioToolChoice
  runMetadata?: Record<string, unknown>
}

export interface StudioPreparedRunContext {
  input: StudioRunRequestInput
  workContext: StudioWorkContext
  run: StudioRun
  assistantMessage: StudioAssistantMessage
  eventBus: StudioEventBus
}

export interface StudioPreparedRunExecution {
  events: AsyncGenerator<StudioProcessorStreamEvent>
  startLog?: {
    event: string
    payload: Record<string, unknown>
  }
}

export interface StudioBackgroundRunHandle {
  run: StudioRun
  assistantMessage: StudioAssistantMessage
  abort: (reason?: string) => void
  completion: Promise<StudioSubagentRunResult & { run: StudioRun; assistantMessage: StudioAssistantMessage }>
}

export interface StudioSessionRunnerDependencies {
  registry: StudioToolRegistry
  processor: StudioRunProcessor
  messageStore: StudioMessageStore
  partStore: StudioPartStore
  runStore?: StudioRunStore
  sessionStore?: StudioSessionStore
  sessionEventStore?: StudioSessionEventStore
  taskStore?: StudioTaskStore
  workStore?: StudioWorkStore
  workResultStore?: StudioWorkResultStore
  sharedEventBus?: StudioEventBus
  resolveSkill?: (name: string, session: StudioSession) => Promise<StudioResolvedSkill>
  listSkills?: (session: StudioSession) => Promise<StudioSkillDiscoveryEntry[]>
  listSkillSummaries?: (session: StudioSession) => Promise<StudioSkillUsageSummary[]>
  recordSkillUsage?: StudioSessionRunnerOptions['recordSkillUsage']
  resolveTurnPlan: StudioTurnPlanResolver
  createRun: (session: StudioSession, inputText: string, metadata?: Record<string, unknown>) => StudioRun
  createAssistantMessage: (session: StudioSession, runId?: string) => Promise<StudioAssistantMessage>
  buildWorkContext: (input: { session: StudioSession; inputText: string }) => Promise<StudioWorkContext>
  runSubagent: (input: StudioSubagentRunRequest) => Promise<StudioSubagentRunResult>
}

export function createDependencyCenter(
  options: StudioSessionRunnerOptions,
  input: {
    processor: StudioRunProcessor
    createRun: StudioSessionRunnerDependencies['createRun']
    createAssistantMessage: StudioSessionRunnerDependencies['createAssistantMessage']
    buildWorkContext: StudioSessionRunnerDependencies['buildWorkContext']
    runSubagent: StudioSessionRunnerDependencies['runSubagent']
  },
): StudioSessionRunnerDependencies {
  return {
    registry: options.registry,
    processor: input.processor,
    messageStore: options.messageStore,
    partStore: options.partStore,
    runStore: options.runStore,
    sessionStore: options.sessionStore,
    sessionEventStore: options.sessionEventStore,
    taskStore: options.taskStore,
    workStore: options.workStore,
    workResultStore: options.workResultStore,
    sharedEventBus: options.eventBus,
    resolveSkill: options.resolveSkill,
    listSkills: options.listSkills,
    listSkillSummaries: options.listSkillSummaries,
    recordSkillUsage: options.recordSkillUsage,
    resolveTurnPlan: options.resolveTurnPlan,
    createRun: input.createRun,
    createAssistantMessage: input.createAssistantMessage,
    buildWorkContext: input.buildWorkContext,
    runSubagent: input.runSubagent
  }
}