@adminforth/agent 2.0.10 → 2.1.0

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 (187) hide show
  1. package/README.md +333 -10
  2. package/dist/application/ports.d.ts +66 -0
  3. package/dist/application/runTurnUseCase.d.ts +68 -0
  4. package/dist/application/runTurnUseCase.js +358 -0
  5. package/dist/{agentEvents.d.ts → domain/agentEvents.d.ts} +1 -1
  6. package/dist/{agent → domain}/systemPrompt.js +1 -1
  7. package/dist/{agent/turn → domain}/turnTypes.d.ts +41 -37
  8. package/dist/{agent/turn/VegaLiteStreamBuffer.d.ts → domain/vegaLiteStreamBuffer.d.ts} +1 -1
  9. package/dist/index.d.ts +3 -2
  10. package/dist/index.js +40 -35
  11. package/dist/{agent/runtime/AgentContext.d.ts → llm/agentContext.d.ts} +3 -3
  12. package/dist/{agent/simpleAgent.d.ts → llm/agentModels.d.ts} +18 -16
  13. package/dist/llm/agentModels.js +65 -0
  14. package/dist/{agent/runtime/AgentRuntime.d.ts → llm/agentRuntime.d.ts} +11 -2
  15. package/dist/{agent/runtime/AgentRuntime.js → llm/agentRuntime.js} +38 -6
  16. package/dist/llm/langGraphLlm.d.ts +25 -0
  17. package/dist/llm/langGraphLlm.js +54 -0
  18. package/dist/{agent/middleware/apiBasedTools.d.ts → llm/middleware/apiToolsMiddleware.d.ts} +1 -1
  19. package/dist/{agent/middleware/apiBasedTools.js → llm/middleware/apiToolsMiddleware.js} +8 -14
  20. package/dist/{agent → llm}/middleware/sequenceDebug.d.ts +1 -1
  21. package/dist/{agent/models/AgentModelFactory.d.ts → llm/modelFactory.d.ts} +1 -1
  22. package/dist/{agent/models/AgentModelFactory.js → llm/modelFactory.js} +1 -1
  23. package/dist/llm/streamAdapter.d.ts +18 -0
  24. package/dist/llm/streamAdapter.js +117 -0
  25. package/dist/{sessionStore.d.ts → persistence/sessionStore.d.ts} +12 -2
  26. package/dist/{sessionStore.js → persistence/sessionStore.js} +33 -0
  27. package/dist/{agent/tools/AgentToolProvider.d.ts → tools/agentToolProvider.d.ts} +1 -1
  28. package/dist/{agent/tools/AgentToolProvider.js → tools/agentToolProvider.js} +1 -1
  29. package/dist/{apiBasedTools.js → tools/apiBasedTools.js} +0 -3
  30. package/dist/{agent/tools → tools}/apiTool.d.ts +1 -1
  31. package/dist/{agent/tools → tools}/fetchSkill.js +1 -1
  32. package/dist/{agent/tools → tools}/fetchToolSchema.d.ts +1 -1
  33. package/dist/{agent/tools → tools}/index.d.ts +1 -1
  34. package/dist/{agent/tools → tools}/navigateUser.d.ts +3 -3
  35. package/dist/{endpoints → transport/http}/context.d.ts +2 -2
  36. package/dist/transport/http/context.js +1 -0
  37. package/dist/{endpoints/core.js → transport/http/coreEndpoints.js} +3 -3
  38. package/dist/{endpoints/sessions.js → transport/http/sessionEndpoints.js} +7 -1
  39. package/dist/transport/sse/sseWriter.d.ts +29 -0
  40. package/dist/{surfaces/web-sse/createSseEventEmitter.js → transport/sse/sseWriter.js} +15 -0
  41. package/dist/{chatSurfaceService.d.ts → transport/surfaces/chatSurfaceService.d.ts} +3 -3
  42. package/dist/{chatSurfaceService.js → transport/surfaces/chatSurfaceService.js} +7 -5
  43. package/dist/{agent/speech/SpeechTurnService.d.ts → transport/surfaces/speechTurnService.d.ts} +1 -1
  44. package/dist/{agent/speech/SpeechTurnService.js → transport/surfaces/speechTurnService.js} +2 -2
  45. package/dist/types.d.ts +10 -4
  46. package/package.json +11 -2
  47. package/.woodpecker/buildRelease.sh +0 -13
  48. package/.woodpecker/buildSlackNotify.sh +0 -46
  49. package/.woodpecker/release.yml +0 -57
  50. package/agent/checkpointer.ts +0 -329
  51. package/agent/languageDetect.ts +0 -92
  52. package/agent/middleware/apiBasedTools.ts +0 -174
  53. package/agent/middleware/openAiResponsesContinuation.ts +0 -92
  54. package/agent/middleware/sequenceDebug.ts +0 -429
  55. package/agent/models/AgentModeResolver.ts +0 -9
  56. package/agent/models/AgentModelFactory.ts +0 -28
  57. package/agent/runtime/AgentContext.ts +0 -30
  58. package/agent/runtime/AgentRuntime.ts +0 -89
  59. package/agent/simpleAgent.ts +0 -199
  60. package/agent/skills/registry.ts +0 -162
  61. package/agent/speech/SpeechTurnService.ts +0 -179
  62. package/agent/systemPrompt.ts +0 -133
  63. package/agent/toolCallEvents.ts +0 -135
  64. package/agent/tools/AgentToolProvider.ts +0 -28
  65. package/agent/tools/apiTool.ts +0 -66
  66. package/agent/tools/fetchSkill.ts +0 -68
  67. package/agent/tools/fetchToolSchema.ts +0 -47
  68. package/agent/tools/getUserLocation.ts +0 -45
  69. package/agent/tools/index.ts +0 -31
  70. package/agent/tools/navigateUser.ts +0 -210
  71. package/agent/turn/TurnContextBuilder.ts +0 -36
  72. package/agent/turn/TurnLifecycleService.ts +0 -47
  73. package/agent/turn/TurnPersistenceService.ts +0 -33
  74. package/agent/turn/TurnPromptBuilder.ts +0 -51
  75. package/agent/turn/TurnStreamConsumer.ts +0 -69
  76. package/agent/turn/VegaLiteStreamBuffer.ts +0 -90
  77. package/agent/turn/turnTypes.ts +0 -100
  78. package/agentEvents.ts +0 -75
  79. package/agentTurnService.ts +0 -314
  80. package/apiBasedTools.ts +0 -712
  81. package/build.log +0 -67
  82. package/chatSurfaceService.ts +0 -319
  83. package/custom/ChatFooter.vue +0 -173
  84. package/custom/ChatHeader.vue +0 -78
  85. package/custom/ChatSurface.vue +0 -160
  86. package/custom/CustomAutoScrollContainer.vue +0 -164
  87. package/custom/SessionsHistory.vue +0 -88
  88. package/custom/chat.ts +0 -82
  89. package/custom/composables/agentAudio/utils.ts +0 -220
  90. package/custom/composables/agentStore/constants.ts +0 -19
  91. package/custom/composables/agentStore/pageContext.ts +0 -8
  92. package/custom/composables/agentStore/useAgentChat.ts +0 -241
  93. package/custom/composables/agentStore/useAgentPlaceholder.ts +0 -142
  94. package/custom/composables/agentStore/useAgentSessions.ts +0 -350
  95. package/custom/composables/useAgentAudio.ts +0 -272
  96. package/custom/composables/useAgentStore.ts +0 -510
  97. package/custom/composables/useAgentTransitions.ts +0 -58
  98. package/custom/conversation_area/ConversationArea.vue +0 -301
  99. package/custom/conversation_area/MessageRenderer.vue +0 -49
  100. package/custom/conversation_area/ProcessingTimeline.vue +0 -286
  101. package/custom/conversation_area/ReasoningRenderer.vue +0 -79
  102. package/custom/conversation_area/SystemMessageRenderer.vue +0 -28
  103. package/custom/conversation_area/TextRenderer.vue +0 -182
  104. package/custom/conversation_area/ThreeDotsAnimation.vue +0 -35
  105. package/custom/conversation_area/ToolApprovalRenderer.vue +0 -98
  106. package/custom/conversation_area/ToolRenderer.vue +0 -178
  107. package/custom/conversation_area/ToolsGroup.vue +0 -59
  108. package/custom/env.d.ts +0 -7
  109. package/custom/incremark_code_renderers/IncremarkShikiCodeBlock.vue +0 -393
  110. package/custom/incremark_code_renderers/incremarkCodeHighlight.ts +0 -285
  111. package/custom/incremark_code_renderers/incremarkRenderer.ts +0 -653
  112. package/custom/incremark_code_renderers/renderIncremarkMarkdown.ts +0 -118
  113. package/custom/package.json +0 -30
  114. package/custom/pnpm-lock.yaml +0 -2394
  115. package/custom/public/agentAudio/agent-processing.mp3 +0 -0
  116. package/custom/skills/analyze_data/SKILL.md +0 -25
  117. package/custom/skills/charts/SKILL.md +0 -193
  118. package/custom/skills/fetch_data/SKILL.md +0 -31
  119. package/custom/skills/mutate_data/SKILL.md +0 -121
  120. package/custom/speech_recognition_frontend/AudioLines.vue +0 -43
  121. package/custom/speech_recognition_frontend/MicrophoneButon.vue +0 -185
  122. package/custom/speech_recognition_frontend/types/voice-activity-detection.d.ts +0 -22
  123. package/custom/speech_recognition_frontend/voiceActivityDetection.ts +0 -62
  124. package/custom/tsconfig.json +0 -15
  125. package/custom/types.ts +0 -108
  126. package/custom/utils.ts +0 -38
  127. package/dist/agent/middleware/openAiResponsesContinuation.d.ts +0 -1
  128. package/dist/agent/middleware/openAiResponsesContinuation.js +0 -66
  129. package/dist/agent/models/AgentModeResolver.d.ts +0 -9
  130. package/dist/agent/models/AgentModeResolver.js +0 -9
  131. package/dist/agent/simpleAgent.js +0 -118
  132. package/dist/agent/turn/TurnContextBuilder.d.ts +0 -14
  133. package/dist/agent/turn/TurnContextBuilder.js +0 -31
  134. package/dist/agent/turn/TurnLifecycleService.d.ts +0 -24
  135. package/dist/agent/turn/TurnLifecycleService.js +0 -47
  136. package/dist/agent/turn/TurnPersistenceService.d.ts +0 -13
  137. package/dist/agent/turn/TurnPersistenceService.js +0 -35
  138. package/dist/agent/turn/TurnPromptBuilder.d.ts +0 -19
  139. package/dist/agent/turn/TurnPromptBuilder.js +0 -43
  140. package/dist/agent/turn/TurnStreamConsumer.d.ts +0 -11
  141. package/dist/agent/turn/TurnStreamConsumer.js +0 -84
  142. package/dist/agentTurnService.d.ts +0 -24
  143. package/dist/agentTurnService.js +0 -269
  144. package/dist/surfaces/web-sse/createSseEventEmitter.d.ts +0 -14
  145. package/endpoints/chatSurfaces.ts +0 -66
  146. package/endpoints/context.ts +0 -52
  147. package/endpoints/core.ts +0 -181
  148. package/endpoints/sessions.ts +0 -183
  149. package/errors.ts +0 -10
  150. package/index.ts +0 -192
  151. package/pnpm-workspace.yaml +0 -4
  152. package/sanitizeSpeechText.ts +0 -32
  153. package/sessionStore.ts +0 -105
  154. package/surfaces/web-sse/createSseEventEmitter.ts +0 -311
  155. package/tsconfig.json +0 -14
  156. package/types.ts +0 -127
  157. /package/dist/{agent/turn/turnTypes.js → application/ports.js} +0 -0
  158. /package/dist/{agentEvents.js → domain/agentEvents.js} +0 -0
  159. /package/dist/{agent → domain}/languageDetect.d.ts +0 -0
  160. /package/dist/{agent → domain}/languageDetect.js +0 -0
  161. /package/dist/{agent → domain}/systemPrompt.d.ts +0 -0
  162. /package/dist/{agent → domain}/toolCallEvents.d.ts +0 -0
  163. /package/dist/{agent → domain}/toolCallEvents.js +0 -0
  164. /package/dist/{endpoints/context.js → domain/turnTypes.js} +0 -0
  165. /package/dist/{agent/turn/VegaLiteStreamBuffer.js → domain/vegaLiteStreamBuffer.js} +0 -0
  166. /package/dist/{agent/runtime/AgentContext.js → llm/agentContext.js} +0 -0
  167. /package/dist/{agent → llm}/middleware/sequenceDebug.js +0 -0
  168. /package/dist/{agent/checkpointer.d.ts → persistence/checkpointStore.d.ts} +0 -0
  169. /package/dist/{agent/checkpointer.js → persistence/checkpointStore.js} +0 -0
  170. /package/dist/{errors.d.ts → shared/errors.d.ts} +0 -0
  171. /package/dist/{errors.js → shared/errors.js} +0 -0
  172. /package/dist/{sanitizeSpeechText.d.ts → shared/sanitizeSpeechText.d.ts} +0 -0
  173. /package/dist/{sanitizeSpeechText.js → shared/sanitizeSpeechText.js} +0 -0
  174. /package/dist/{apiBasedTools.d.ts → tools/apiBasedTools.d.ts} +0 -0
  175. /package/dist/{agent/tools → tools}/apiTool.js +0 -0
  176. /package/dist/{agent/tools → tools}/fetchSkill.d.ts +0 -0
  177. /package/dist/{agent/tools → tools}/fetchToolSchema.js +0 -0
  178. /package/dist/{agent/tools → tools}/getUserLocation.d.ts +0 -0
  179. /package/dist/{agent/tools → tools}/getUserLocation.js +0 -0
  180. /package/dist/{agent/tools → tools}/index.js +0 -0
  181. /package/dist/{agent/tools → tools}/navigateUser.js +0 -0
  182. /package/dist/{agent → tools}/skills/registry.d.ts +0 -0
  183. /package/dist/{agent → tools}/skills/registry.js +0 -0
  184. /package/dist/{endpoints/chatSurfaces.d.ts → transport/http/chatSurfaceEndpoints.d.ts} +0 -0
  185. /package/dist/{endpoints/chatSurfaces.js → transport/http/chatSurfaceEndpoints.js} +0 -0
  186. /package/dist/{endpoints/core.d.ts → transport/http/coreEndpoints.d.ts} +0 -0
  187. /package/dist/{endpoints/sessions.d.ts → transport/http/sessionEndpoints.d.ts} +0 -0
@@ -1,314 +0,0 @@
1
- import { logger } from "adminforth";
2
- import { randomUUID } from "crypto";
3
- import { Command } from "@langchain/langgraph";
4
- import { AgentModelFactory } from "./agent/models/AgentModelFactory.js";
5
- import { AgentModeResolver } from "./agent/models/AgentModeResolver.js";
6
- import { createSequenceDebugCollector } from "./agent/middleware/sequenceDebug.js";
7
- import { AgentRuntime } from "./agent/runtime/AgentRuntime.js";
8
- import { TurnContextBuilder } from "./agent/turn/TurnContextBuilder.js";
9
- import { TurnLifecycleService } from "./agent/turn/TurnLifecycleService.js";
10
- import { TurnPromptBuilder } from "./agent/turn/TurnPromptBuilder.js";
11
- import { TurnStreamConsumer } from "./agent/turn/TurnStreamConsumer.js";
12
- import type {
13
- BaseAgentTurnInput,
14
- HandleTurnInput,
15
- PreparedAgentTurn,
16
- RunAndPersistAgentResponseInput,
17
- RunAndPersistAgentResponseResult,
18
- } from "./agent/turn/turnTypes.js";
19
- import { getErrorMessage, isAbortError } from "./errors.js";
20
-
21
- export type {
22
- BaseAgentTurnInput,
23
- HandleSpeechTurnInput,
24
- HandleTurnInput,
25
- RunAndPersistAgentResponseInput,
26
- RunAndPersistAgentResponseResult,
27
- } from "./agent/turn/turnTypes.js";
28
-
29
- function getApprovalDecision(input: BaseAgentTurnInput) {
30
- return "approvalDecision" in input
31
- && (input.approvalDecision === "approve" || input.approvalDecision === "reject")
32
- ? input.approvalDecision
33
- : undefined;
34
- }
35
-
36
- function getInterruptItems(interrupt: unknown): unknown[] {
37
- return Array.isArray(interrupt) ? interrupt : [interrupt];
38
- }
39
-
40
- function getHitlInterrupts(interrupt: unknown): { id: string; count: number }[] {
41
- return getInterruptItems(interrupt).flatMap((item) => {
42
- const value = item && typeof item === "object" && "value" in item
43
- ? (item as { value: unknown }).value
44
- : item;
45
- const actionRequests = value && typeof value === "object"
46
- ? (value as { actionRequests?: unknown }).actionRequests
47
- : undefined;
48
- const interruptId = item && typeof item === "object"
49
- ? (item as { id?: unknown }).id
50
- : undefined;
51
-
52
- return typeof interruptId === "string" && Array.isArray(actionRequests)
53
- ? [{ id: interruptId, count: actionRequests.length }]
54
- : [];
55
- });
56
- }
57
-
58
- function buildHitlDecision(decision: "approve" | "reject", prompt?: string) {
59
- if (decision === "approve") {
60
- return { type: "approve" as const };
61
- }
62
-
63
- return {
64
- type: "reject" as const,
65
- message: prompt
66
- ? `User rejected the pending tool execution and sent a new instruction instead: ${prompt}`
67
- : "User rejected executing this tool",
68
- };
69
- }
70
-
71
- function buildHitlResumeValue(input: {
72
- decision: "approve" | "reject";
73
- count: number;
74
- prompt?: string;
75
- }) {
76
- return {
77
- decisions: Array.from({ length: input.count }, () => (
78
- buildHitlDecision(input.decision, input.prompt)
79
- )),
80
- };
81
- }
82
-
83
- function buildLangGraphResume(input: {
84
- decision: "approve" | "reject";
85
- interrupts?: { id: string; count: number }[];
86
- prompt?: string;
87
- }) {
88
- const interrupts = input.interrupts ?? [];
89
-
90
- if (interrupts.length === 0) {
91
- throw new Error("No pending approval interrupt found for resume.");
92
- }
93
-
94
- if (interrupts.length === 1) {
95
- return buildHitlResumeValue({
96
- decision: input.decision,
97
- count: interrupts[0].count,
98
- prompt: input.prompt,
99
- });
100
- }
101
-
102
- return Object.fromEntries(
103
- interrupts.map((interrupt) => [
104
- interrupt.id,
105
- buildHitlResumeValue({
106
- decision: input.decision,
107
- count: interrupt.count,
108
- prompt: input.prompt,
109
- }),
110
- ]),
111
- );
112
- }
113
-
114
- export class AgentTurnService {
115
- private readonly pendingInterrupts = new Map<string, { id: string; count: number }[]>();
116
-
117
- constructor(
118
- private readonly lifecycle: TurnLifecycleService,
119
- private readonly contextBuilder: TurnContextBuilder,
120
- private readonly modeResolver: AgentModeResolver,
121
- private readonly modelFactory: AgentModelFactory,
122
- private readonly promptBuilder: TurnPromptBuilder,
123
- private readonly runtime: AgentRuntime,
124
- private readonly streamConsumer: TurnStreamConsumer,
125
- ) {}
126
-
127
- private async prepareTurn(input: BaseAgentTurnInput): Promise<PreparedAgentTurn> {
128
- const sequenceDebugCollector = createSequenceDebugCollector();
129
- const approvalDecision = getApprovalDecision(input);
130
- const shouldResume = Boolean(approvalDecision);
131
- const pendingInterrupts = this.pendingInterrupts.get(input.sessionId);
132
- if (shouldResume && (!pendingInterrupts || pendingInterrupts.length === 0)) {
133
- throw new Error(`No pending approval interrupt found for session "${input.sessionId}".`);
134
- }
135
- const lifecycleTurn = shouldResume
136
- ? await this.lifecycle.resume(input)
137
- : await this.lifecycle.start(input);
138
- const context = await this.contextBuilder.build({
139
- base: input,
140
- turnId: lifecycleTurn.turnId,
141
- });
142
-
143
- return {
144
- prompt: input.prompt,
145
- sessionId: input.sessionId,
146
- turnId: lifecycleTurn.turnId,
147
- previousUserMessages: lifecycleTurn.previousUserMessages,
148
- modeName: input.modeName,
149
- context,
150
- observability: {
151
- emit: undefined,
152
- sequenceDebugSink: sequenceDebugCollector,
153
- },
154
- resume: shouldResume
155
- ? {
156
- decision: approvalDecision!,
157
- interrupts: pendingInterrupts,
158
- }
159
- : undefined,
160
- initialResponse: shouldResume && "initialResponse" in lifecycleTurn
161
- ? (lifecycleTurn as { initialResponse?: string }).initialResponse
162
- : undefined,
163
- };
164
- }
165
-
166
- private async runAgentTurn(input: PreparedAgentTurn) {
167
- const selectedMode = this.modeResolver.resolve(input.modeName);
168
- const [models, messages] = await Promise.all([
169
- this.modelFactory.create(selectedMode.completionAdapter),
170
- this.promptBuilder.build({
171
- prompt: input.prompt,
172
- previousUserMessages: input.previousUserMessages,
173
- adminUser: input.context.adminUser,
174
- completionAdapter: selectedMode.completionAdapter,
175
- chatSurface: input.context.chatSurface,
176
- abortSignal: input.context.abortSignal,
177
- }),
178
- ]);
179
- const stream = await this.runtime.stream({
180
- models,
181
- input: input.resume
182
- ? new Command({
183
- resume: buildLangGraphResume({
184
- decision: input.resume.decision,
185
- interrupts: input.resume.interrupts,
186
- prompt: input.prompt,
187
- }),
188
- })
189
- : { messages },
190
- context: input.context,
191
- observability: input.observability,
192
- });
193
-
194
- let interrupted = false;
195
- try {
196
- return await this.streamConsumer.consume({
197
- stream: stream as AsyncIterable<["messages", [any, any]] | ["updates", Record<string, any>]>,
198
- abortSignal: input.context.abortSignal,
199
- emit: input.observability.emit,
200
- onInterrupt: async (interrupt) => {
201
- interrupted = true;
202
- const interrupts = getHitlInterrupts(interrupt);
203
- const pendingInterrupts = this.pendingInterrupts.get(input.sessionId) ?? [];
204
- const mergedInterrupts = new Map(
205
- pendingInterrupts.map((pendingInterrupt) => [
206
- pendingInterrupt.id,
207
- pendingInterrupt.count,
208
- ]),
209
- );
210
-
211
- for (const pendingInterrupt of interrupts) {
212
- mergedInterrupts.set(pendingInterrupt.id, pendingInterrupt.count);
213
- }
214
-
215
- this.pendingInterrupts.set(
216
- input.sessionId,
217
- [...mergedInterrupts.entries()].map(([id, count]) => ({ id, count })),
218
- );
219
- await input.observability.emit?.({
220
- type: "interrupt",
221
- sessionId: input.sessionId,
222
- interrupt,
223
- });
224
- },
225
- });
226
- } finally {
227
- if (!interrupted) {
228
- this.pendingInterrupts.delete(input.sessionId);
229
- }
230
- }
231
- }
232
-
233
- async runAndPersistAgentResponse(
234
- input: RunAndPersistAgentResponseInput,
235
- ): Promise<RunAndPersistAgentResponseResult> {
236
- const preparedTurn = await this.prepareTurn(input);
237
- preparedTurn.observability.emit = input.emit;
238
-
239
- let fullResponse = preparedTurn.initialResponse ?? "";
240
- let aborted = false;
241
- let failed = false;
242
-
243
- try {
244
- const agentResponse = await this.runAgentTurn(preparedTurn);
245
- fullResponse += agentResponse.text;
246
- } catch (error) {
247
- if (input.abortSignal?.aborted || isAbortError(error)) {
248
- aborted = true;
249
- logger.info(input.abortLogMessage);
250
- } else {
251
- failed = true;
252
- fullResponse = getErrorMessage(error);
253
- logger.error(`${input.failureLogMessage}:\n${fullResponse}`);
254
- }
255
- }
256
-
257
- preparedTurn.observability.sequenceDebugSink.flush();
258
- await this.lifecycle.finish({
259
- turnId: preparedTurn.turnId,
260
- responseText: fullResponse,
261
- debugHistory: preparedTurn.observability.sequenceDebugSink.getHistory(),
262
- });
263
-
264
- return {
265
- text: fullResponse,
266
- turnId: preparedTurn.turnId,
267
- aborted,
268
- failed,
269
- };
270
- }
271
-
272
- async handleTurn(input: HandleTurnInput) {
273
- await input.emit({
274
- type: "turn-started",
275
- messageId: randomUUID(),
276
- });
277
-
278
- const agentResponse = await this.runAndPersistAgentResponse({
279
- prompt: input.prompt,
280
- sessionId: input.sessionId,
281
- modeName: input.modeName,
282
- userTimeZone: input.userTimeZone,
283
- currentPage: input.currentPage,
284
- chatSurface: input.chatSurface,
285
- adminPublicOrigin: input.adminPublicOrigin,
286
- approvalDecision: input.approvalDecision,
287
- abortSignal: input.abortSignal,
288
- adminUser: input.adminUser,
289
- emit: input.emit,
290
- failureLogMessage: input.failureLogMessage ?? "Agent response failed",
291
- abortLogMessage: input.abortLogMessage ?? "Agent response aborted",
292
- });
293
-
294
- if (agentResponse.failed) {
295
- await input.emit({
296
- type: "error",
297
- error: agentResponse.text,
298
- });
299
- } else if (!agentResponse.aborted) {
300
- await input.emit({
301
- type: "response",
302
- text: agentResponse.text,
303
- sessionId: input.sessionId,
304
- turnId: agentResponse.turnId,
305
- });
306
- }
307
-
308
- await input.emit({
309
- type: "finish",
310
- });
311
-
312
- return agentResponse;
313
- }
314
- }