@lota-sdk/core 0.4.7 → 0.4.9

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 (259) hide show
  1. package/package.json +11 -12
  2. package/src/ai/embedding-cache.ts +94 -22
  3. package/src/ai-gateway/ai-gateway.ts +738 -223
  4. package/src/config/agent-defaults.ts +176 -75
  5. package/src/config/agent-types.ts +54 -4
  6. package/src/config/constants.ts +8 -2
  7. package/src/config/logger.ts +286 -19
  8. package/src/config/model-constants.ts +1 -0
  9. package/src/config/thread-defaults.ts +33 -21
  10. package/src/create-runtime.ts +725 -383
  11. package/src/db/base.service.ts +52 -28
  12. package/src/db/cursor-pagination.ts +71 -30
  13. package/src/db/memory-store.helpers.ts +4 -7
  14. package/src/db/memory-store.ts +856 -598
  15. package/src/db/memory.ts +398 -275
  16. package/src/db/record-id.ts +32 -10
  17. package/src/db/schema-fingerprint.ts +30 -12
  18. package/src/db/service-normalization.ts +255 -0
  19. package/src/db/service.ts +726 -761
  20. package/src/db/startup.ts +140 -66
  21. package/src/db/transaction-conflict.ts +15 -0
  22. package/src/effect/awaitable-effect.ts +87 -0
  23. package/src/effect/errors.ts +121 -0
  24. package/src/effect/helpers.ts +98 -0
  25. package/src/effect/index.ts +22 -0
  26. package/src/effect/layers.ts +228 -0
  27. package/src/effect/runtime-ref.ts +25 -0
  28. package/src/effect/runtime.ts +31 -0
  29. package/src/effect/services.ts +57 -0
  30. package/src/effect/zod.ts +43 -0
  31. package/src/embeddings/provider.ts +122 -71
  32. package/src/index.ts +46 -1
  33. package/src/openrouter/direct-provider.ts +29 -0
  34. package/src/queues/autonomous-job.queue.ts +130 -74
  35. package/src/queues/context-compaction.queue.ts +60 -15
  36. package/src/queues/delayed-node-promotion.queue.ts +52 -15
  37. package/src/queues/document-processor.queue.ts +52 -77
  38. package/src/queues/memory-consolidation.queue.ts +47 -32
  39. package/src/queues/organization-learning.queue.ts +13 -4
  40. package/src/queues/plan-agent-heartbeat.queue.ts +65 -21
  41. package/src/queues/plan-scheduler.queue.ts +107 -31
  42. package/src/queues/post-chat-memory.queue.ts +66 -24
  43. package/src/queues/queue-factory.ts +142 -52
  44. package/src/queues/standalone-worker.ts +39 -0
  45. package/src/queues/title-generation.queue.ts +54 -9
  46. package/src/redis/connection.ts +84 -32
  47. package/src/redis/index.ts +6 -8
  48. package/src/redis/org-memory-lock.ts +60 -27
  49. package/src/redis/redis-lease-lock.ts +200 -121
  50. package/src/redis/runtime-connection.ts +10 -0
  51. package/src/redis/stream-context.ts +84 -46
  52. package/src/runtime/agent-identity-overrides.ts +2 -2
  53. package/src/runtime/agent-runtime-policy.ts +4 -1
  54. package/src/runtime/agent-stream-helpers.ts +20 -9
  55. package/src/runtime/chat-run-orchestration.ts +102 -19
  56. package/src/runtime/chat-run-registry.ts +36 -2
  57. package/src/runtime/context-compaction/context-compaction-runtime.ts +107 -0
  58. package/src/runtime/{context-compaction.ts → context-compaction/context-compaction.ts} +114 -91
  59. package/src/runtime/execution-plan-visibility.ts +2 -2
  60. package/src/runtime/execution-plan.ts +42 -15
  61. package/src/runtime/graph-designer.ts +11 -7
  62. package/src/runtime/helper-model.ts +135 -48
  63. package/src/runtime/index.ts +7 -7
  64. package/src/runtime/indexed-repositories-policy.ts +3 -3
  65. package/src/runtime/{memory-block.ts → memory/memory-block.ts} +40 -36
  66. package/src/runtime/{memory-digest-policy.ts → memory/memory-digest-policy.ts} +1 -1
  67. package/src/runtime/{memory-pipeline.ts → memory/memory-pipeline.ts} +1 -1
  68. package/src/runtime/{memory-prompts-fact.ts → memory/memory-prompts-fact.ts} +2 -2
  69. package/src/runtime/{memory-scope.ts → memory/memory-scope.ts} +12 -6
  70. package/src/runtime/plugin-resolution.ts +144 -24
  71. package/src/runtime/plugin-types.ts +9 -1
  72. package/src/runtime/post-turn-side-effects.ts +197 -130
  73. package/src/runtime/retrieval-adapters.ts +38 -4
  74. package/src/runtime/runtime-config.ts +165 -61
  75. package/src/runtime/runtime-extensions.ts +21 -34
  76. package/src/runtime/social-chat/social-chat-agent-runner.ts +157 -0
  77. package/src/runtime/{social-chat-history.ts → social-chat/social-chat-history.ts} +42 -20
  78. package/src/runtime/social-chat/social-chat.ts +594 -0
  79. package/src/runtime/specialist-runner.ts +36 -10
  80. package/src/runtime/team-consultation/team-consultation-orchestrator.ts +427 -0
  81. package/src/runtime/{team-consultation-prompts.ts → team-consultation/team-consultation-prompts.ts} +6 -2
  82. package/src/runtime/thread-chat-helpers.ts +2 -2
  83. package/src/runtime/thread-plan-turn.ts +2 -1
  84. package/src/runtime/thread-turn-context.ts +172 -94
  85. package/src/runtime/turn-lifecycle.ts +93 -27
  86. package/src/services/agent-activity.service.ts +287 -203
  87. package/src/services/agent-executor.service.ts +329 -217
  88. package/src/services/artifact.service.ts +225 -148
  89. package/src/services/attachment.service.ts +137 -115
  90. package/src/services/autonomous-job.service.ts +888 -491
  91. package/src/services/chat-run-registry.service.ts +11 -1
  92. package/src/services/context-compaction.service.ts +136 -86
  93. package/src/services/document-chunk.service.ts +162 -90
  94. package/src/services/execution-plan/execution-plan-approval.ts +26 -0
  95. package/src/services/execution-plan/execution-plan-context.ts +29 -0
  96. package/src/services/execution-plan/execution-plan-graph.ts +256 -0
  97. package/src/services/execution-plan/execution-plan-schedule.ts +84 -0
  98. package/src/services/execution-plan/execution-plan-spec.ts +75 -0
  99. package/src/services/execution-plan/execution-plan.service.ts +1041 -0
  100. package/src/services/feedback-loop.service.ts +132 -76
  101. package/src/services/global-orchestrator.service.ts +80 -170
  102. package/src/services/graph-full-routing.ts +182 -0
  103. package/src/services/index.ts +18 -20
  104. package/src/services/institutional-memory.service.ts +220 -123
  105. package/src/services/learned-skill.service.ts +364 -259
  106. package/src/services/memory/memory-conversation.ts +95 -0
  107. package/src/services/memory/memory-org-memory.ts +39 -0
  108. package/src/services/memory/memory-preseeded.ts +80 -0
  109. package/src/services/memory/memory-rerank.ts +297 -0
  110. package/src/services/{memory-utils.ts → memory/memory-utils.ts} +5 -5
  111. package/src/services/memory/memory.service.ts +692 -0
  112. package/src/services/memory/rerank.service.ts +209 -0
  113. package/src/services/monitoring-window.service.ts +92 -70
  114. package/src/services/mutating-approval.service.ts +62 -53
  115. package/src/services/node-workspace.service.ts +141 -98
  116. package/src/services/notification.service.ts +17 -16
  117. package/src/services/organization-member.service.ts +120 -66
  118. package/src/services/organization.service.ts +144 -51
  119. package/src/services/ownership-dispatcher.service.ts +415 -264
  120. package/src/services/plan/plan-agent-heartbeat.service.ts +234 -0
  121. package/src/services/plan/plan-agent-query.service.ts +322 -0
  122. package/src/services/plan/plan-approval.service.ts +102 -0
  123. package/src/services/plan/plan-artifact.service.ts +60 -0
  124. package/src/services/plan/plan-builder.service.ts +76 -0
  125. package/src/services/plan/plan-checkpoint.service.ts +103 -0
  126. package/src/services/{plan-compiler.service.ts → plan/plan-compiler.service.ts} +26 -9
  127. package/src/services/plan/plan-completion-side-effects.ts +175 -0
  128. package/src/services/plan/plan-coordination.service.ts +181 -0
  129. package/src/services/plan/plan-cycle.service.ts +398 -0
  130. package/src/services/plan/plan-deadline.service.ts +547 -0
  131. package/src/services/plan/plan-event-delivery.service.ts +261 -0
  132. package/src/services/plan/plan-executor-context.ts +35 -0
  133. package/src/services/plan/plan-executor-graph.ts +475 -0
  134. package/src/services/plan/plan-executor-helpers.ts +322 -0
  135. package/src/services/plan/plan-executor-persistence.ts +209 -0
  136. package/src/services/plan/plan-executor.service.ts +1654 -0
  137. package/src/services/{plan-helpers.ts → plan/plan-helpers.ts} +1 -1
  138. package/src/services/{plan-run-data.ts → plan/plan-run-data.ts} +4 -4
  139. package/src/services/plan/plan-run-serialization.ts +15 -0
  140. package/src/services/plan/plan-run.service.ts +644 -0
  141. package/src/services/plan/plan-scheduler.service.ts +385 -0
  142. package/src/services/plan/plan-template.service.ts +224 -0
  143. package/src/services/plan/plan-transaction-events.ts +33 -0
  144. package/src/services/plan/plan-validator.service.ts +907 -0
  145. package/src/services/plan/plan-workspace.service.ts +125 -0
  146. package/src/services/plugin-executor.service.ts +97 -68
  147. package/src/services/quality-metrics.service.ts +112 -94
  148. package/src/services/queue-job.service.ts +296 -230
  149. package/src/services/recent-activity-title.service.ts +65 -36
  150. package/src/services/recent-activity.service.ts +274 -259
  151. package/src/services/skill-resolver.service.ts +38 -12
  152. package/src/services/social-chat-history.service.ts +176 -125
  153. package/src/services/system-executor.service.ts +91 -61
  154. package/src/services/thread/thread-active-run.ts +203 -0
  155. package/src/services/thread/thread-bootstrap.ts +369 -0
  156. package/src/services/thread/thread-listing.ts +198 -0
  157. package/src/services/thread/thread-memory-block.ts +117 -0
  158. package/src/services/thread/thread-message.service.ts +363 -0
  159. package/src/services/thread/thread-record-store.ts +155 -0
  160. package/src/services/thread/thread-title.service.ts +74 -0
  161. package/src/services/thread/thread-turn-execution.ts +280 -0
  162. package/src/services/thread/thread-turn-message-context.ts +73 -0
  163. package/src/services/thread/thread-turn-preparation.service.ts +1146 -0
  164. package/src/services/thread/thread-turn-streaming.ts +402 -0
  165. package/src/services/thread/thread-turn-tracing.ts +35 -0
  166. package/src/services/thread/thread-turn.ts +343 -0
  167. package/src/services/thread/thread.service.ts +335 -0
  168. package/src/services/user.service.ts +82 -32
  169. package/src/services/write-intent-validator.service.ts +63 -51
  170. package/src/storage/attachment-parser.ts +69 -27
  171. package/src/storage/attachment-storage.service.ts +331 -275
  172. package/src/storage/generated-document-storage.service.ts +66 -34
  173. package/src/system-agents/agent-result.ts +3 -1
  174. package/src/system-agents/context-compaction.agent.ts +2 -2
  175. package/src/system-agents/delegated-agent-factory.ts +159 -90
  176. package/src/system-agents/memory-reranker.agent.ts +2 -2
  177. package/src/system-agents/memory.agent.ts +2 -2
  178. package/src/system-agents/recent-activity-title-refiner.agent.ts +2 -2
  179. package/src/system-agents/regular-chat-memory-digest.agent.ts +2 -2
  180. package/src/system-agents/skill-extractor.agent.ts +2 -2
  181. package/src/system-agents/skill-manager.agent.ts +2 -2
  182. package/src/system-agents/thread-router.agent.ts +157 -113
  183. package/src/system-agents/title-generator.agent.ts +2 -2
  184. package/src/tools/execution-plan.tool.ts +220 -161
  185. package/src/tools/fetch-webpage.tool.ts +21 -17
  186. package/src/tools/firecrawl-client.ts +16 -6
  187. package/src/tools/index.ts +1 -0
  188. package/src/tools/memory-block.tool.ts +14 -6
  189. package/src/tools/plan-approval.tool.ts +49 -47
  190. package/src/tools/read-file-parts.tool.ts +44 -33
  191. package/src/tools/remember-memory.tool.ts +65 -45
  192. package/src/tools/search-web.tool.ts +26 -22
  193. package/src/tools/search.tool.ts +41 -29
  194. package/src/tools/team-think.tool.ts +124 -83
  195. package/src/tools/user-questions.tool.ts +4 -3
  196. package/src/tools/web-tool-shared.ts +6 -0
  197. package/src/utils/async.ts +17 -23
  198. package/src/utils/crypto.ts +21 -0
  199. package/src/utils/date-time.ts +40 -1
  200. package/src/utils/errors.ts +95 -16
  201. package/src/utils/hono-error-handler.ts +24 -39
  202. package/src/utils/index.ts +2 -1
  203. package/src/utils/null-proto-record.ts +41 -0
  204. package/src/utils/sse-keepalive.ts +124 -21
  205. package/src/workers/bootstrap.ts +186 -51
  206. package/src/workers/memory-consolidation.worker.ts +325 -237
  207. package/src/workers/organization-learning.worker.ts +50 -16
  208. package/src/workers/regular-chat-memory-digest.helpers.ts +28 -27
  209. package/src/workers/regular-chat-memory-digest.runner.ts +175 -114
  210. package/src/workers/skill-extraction.runner.ts +176 -93
  211. package/src/workers/utils/file-section-chunker.ts +8 -10
  212. package/src/workers/utils/repo-structure-extractor.ts +349 -260
  213. package/src/workers/utils/repomix-file-sections.ts +2 -2
  214. package/src/workers/utils/thread-message-query.ts +97 -38
  215. package/src/workers/worker-utils.ts +56 -31
  216. package/src/config/debug-logger.ts +0 -47
  217. package/src/redis/connection-accessor.ts +0 -26
  218. package/src/runtime/context-compaction-runtime.ts +0 -87
  219. package/src/runtime/social-chat-agent-runner.ts +0 -118
  220. package/src/runtime/social-chat.ts +0 -516
  221. package/src/runtime/team-consultation-orchestrator.ts +0 -272
  222. package/src/services/adaptive-playbook.service.ts +0 -152
  223. package/src/services/artifact-provenance.service.ts +0 -172
  224. package/src/services/chat-attachments.service.ts +0 -17
  225. package/src/services/context-compaction-runtime.singleton.ts +0 -13
  226. package/src/services/execution-plan.service.ts +0 -1118
  227. package/src/services/memory.service.ts +0 -844
  228. package/src/services/plan-agent-heartbeat.service.ts +0 -136
  229. package/src/services/plan-agent-query.service.ts +0 -267
  230. package/src/services/plan-approval.service.ts +0 -83
  231. package/src/services/plan-artifact.service.ts +0 -50
  232. package/src/services/plan-builder.service.ts +0 -67
  233. package/src/services/plan-checkpoint.service.ts +0 -81
  234. package/src/services/plan-completion-side-effects.ts +0 -80
  235. package/src/services/plan-coordination.service.ts +0 -157
  236. package/src/services/plan-cycle.service.ts +0 -284
  237. package/src/services/plan-deadline.service.ts +0 -430
  238. package/src/services/plan-event-delivery.service.ts +0 -166
  239. package/src/services/plan-executor.service.ts +0 -1950
  240. package/src/services/plan-run.service.ts +0 -515
  241. package/src/services/plan-scheduler.service.ts +0 -240
  242. package/src/services/plan-template.service.ts +0 -177
  243. package/src/services/plan-validator.service.ts +0 -818
  244. package/src/services/plan-workspace.service.ts +0 -83
  245. package/src/services/thread-message.service.ts +0 -275
  246. package/src/services/thread-plan-registry.service.ts +0 -22
  247. package/src/services/thread-title.service.ts +0 -39
  248. package/src/services/thread-turn-preparation.service.ts +0 -1147
  249. package/src/services/thread-turn.ts +0 -172
  250. package/src/services/thread.service.ts +0 -869
  251. package/src/utils/env.ts +0 -8
  252. /package/src/runtime/{context-compaction-constants.ts → context-compaction/context-compaction-constants.ts} +0 -0
  253. /package/src/runtime/{memory-format.ts → memory/memory-format.ts} +0 -0
  254. /package/src/runtime/{memory-prompts-parse.ts → memory/memory-prompts-parse.ts} +0 -0
  255. /package/src/runtime/{memory-prompts-update.ts → memory/memory-prompts-update.ts} +0 -0
  256. /package/src/runtime/{social-chat-prompts.ts → social-chat/social-chat-prompts.ts} +0 -0
  257. /package/src/services/{plan-node-spec.ts → plan/plan-node-spec.ts} +0 -0
  258. /package/src/services/{thread-constants.ts → thread/thread-constants.ts} +0 -0
  259. /package/src/services/{thread.types.ts → thread/thread.types.ts} +0 -0
@@ -1,11 +1,19 @@
1
1
  import { generateObject } from 'ai'
2
+ import { Effect } from 'effect'
2
3
  import { z } from 'zod'
3
4
 
4
5
  import { aiGatewayChatModel } from '../ai-gateway/ai-gateway'
5
6
  import { buildAiGatewayDirectCacheHeaders } from '../ai-gateway/cache-headers'
6
- import { agentDescriptions, agentDisplayNames, agentShortDisplayNames, routerModelId } from '../config/agent-defaults'
7
+ import {
8
+ getAgentDescriptions,
9
+ getAgentDisplayNames,
10
+ getAgentShortDisplayNames,
11
+ getRouterModelId,
12
+ } from '../config/agent-defaults'
7
13
  import { chatLogger } from '../config/logger'
8
- import { withTimeout } from '../utils/async'
14
+ import type { ValidationError } from '../effect/errors'
15
+ import { AiGenerationError } from '../effect/errors'
16
+ import { zodParse } from '../effect/zod'
9
17
 
10
18
  const TriageResultSchema = z.object({ agentId: z.string(), routingContext: z.string() })
11
19
 
@@ -42,7 +50,7 @@ function readDisplayName(agentId: string, options?: RouterDisplayOptions): strin
42
50
  return override
43
51
  }
44
52
 
45
- return agentDisplayNames[agentId] ?? agentId
53
+ return getAgentDisplayNames()[agentId] ?? agentId
46
54
  }
47
55
 
48
56
  function readShortDisplayName(agentId: string, options?: RouterDisplayOptions): string {
@@ -51,10 +59,11 @@ function readShortDisplayName(agentId: string, options?: RouterDisplayOptions):
51
59
  return override
52
60
  }
53
61
 
54
- return agentShortDisplayNames[agentId] ?? readDisplayName(agentId, options)
62
+ return getAgentShortDisplayNames()[agentId] ?? readDisplayName(agentId, options)
55
63
  }
56
64
 
57
65
  function buildMembersDescription(members: readonly string[], options?: RouterDisplayOptions): string {
66
+ const agentDescriptions = getAgentDescriptions()
58
67
  return members
59
68
  .map((id) => {
60
69
  const display = readDisplayName(id, options)
@@ -83,12 +92,15 @@ function extractExplicitAgentTargets(
83
92
 
84
93
  const memberSet = new Set(members)
85
94
  const aliases = new Map<string, string>()
95
+ const defaultDisplayNames = options?.displayNamesById === undefined ? getAgentDisplayNames() : undefined
96
+ const defaultShortDisplayNames =
97
+ options?.shortDisplayNamesById === undefined ? getAgentShortDisplayNames() : undefined
86
98
 
87
99
  for (const member of members) {
88
100
  for (const rawAlias of [
89
101
  member,
90
- agentDisplayNames[member],
91
- agentShortDisplayNames[member],
102
+ defaultDisplayNames?.[member],
103
+ defaultShortDisplayNames?.[member],
92
104
  readDisplayName(member, options),
93
105
  readShortDisplayName(member, options),
94
106
  ...(readStringArrayOverride(options?.routingAliasesByAgentId, member) ?? []),
@@ -153,16 +165,23 @@ Rules:
153
165
 
154
166
  const THREAD_ROUTER_TIMEOUT_MS = 30_000
155
167
 
156
- async function generateRouterObject<TSchema extends z.ZodTypeAny>(params: {
168
+ function toRouterGenerationError(label: 'triage' | 'check', error: unknown): AiGenerationError {
169
+ return new AiGenerationError({
170
+ source: `thread-router:${label}`,
171
+ message: error instanceof Error ? error.message : String(error),
172
+ })
173
+ }
174
+
175
+ function generateRouterObjectEffect<TSchema extends z.ZodTypeAny>(params: {
157
176
  schema: TSchema
158
177
  system: string
159
178
  prompt: string
160
179
  label: 'triage' | 'check'
161
- }): Promise<z.infer<TSchema> | null> {
162
- const modelId = routerModelId ?? 'openai/gpt-5.4-nano'
180
+ }): Effect.Effect<z.infer<TSchema> | null, never> {
181
+ const modelId = getRouterModelId() ?? 'openrouter/openai/gpt-5.4-nano'
163
182
 
164
- try {
165
- const { object } = await withTimeout(
183
+ return Effect.tryPromise({
184
+ try: () =>
166
185
  generateObject({
167
186
  model: aiGatewayChatModel(modelId),
168
187
  headers: buildAiGatewayDirectCacheHeaders('lota-sdk'),
@@ -172,17 +191,34 @@ async function generateRouterObject<TSchema extends z.ZodTypeAny>(params: {
172
191
  prompt: params.prompt,
173
192
  maxOutputTokens: 256,
174
193
  }),
175
- THREAD_ROUTER_TIMEOUT_MS,
176
- `thread-router ${params.label}`,
177
- )
178
- return params.schema.parse(object)
179
- } catch (error) {
180
- chatLogger.error`[thread-router] ${params.label} failed: ${error instanceof Error ? error.message : String(error)}`
181
- return null
182
- }
194
+ catch: (error) => toRouterGenerationError(params.label, error),
195
+ }).pipe(
196
+ Effect.timeout(THREAD_ROUTER_TIMEOUT_MS),
197
+ Effect.catchTag('TimeoutError', () =>
198
+ Effect.fail(
199
+ new AiGenerationError({
200
+ source: `thread-router:${params.label}`,
201
+ message: `Timed out after ${THREAD_ROUTER_TIMEOUT_MS}ms`,
202
+ }),
203
+ ),
204
+ ),
205
+ Effect.flatMap(({ object }) => zodParse(params.schema, object)),
206
+ Effect.catchTags({
207
+ AiGenerationError: (error: AiGenerationError) =>
208
+ Effect.sync(() => {
209
+ chatLogger.error`[thread-router] ${params.label} failed: ${error.message}`
210
+ return null
211
+ }),
212
+ ValidationError: (error: ValidationError) =>
213
+ Effect.sync(() => {
214
+ chatLogger.error`[thread-router] ${params.label} failed: ${error.message}`
215
+ return null
216
+ }),
217
+ }),
218
+ )
183
219
  }
184
220
 
185
- export async function triageThreadMessage(params: {
221
+ export function triageThreadMessage(params: {
186
222
  threadTitle: string
187
223
  members: readonly string[]
188
224
  messageText: string
@@ -191,54 +227,58 @@ export async function triageThreadMessage(params: {
191
227
  shortDisplayNamesById?: Partial<Record<string, string>>
192
228
  routingAliasesByAgentId?: Partial<Record<string, string[]>>
193
229
  }): Promise<RouterTriageResult | null> {
194
- const displayOptions: RouterDisplayOptions = {
195
- displayNamesById: params.displayNamesById,
196
- shortDisplayNamesById: params.shortDisplayNamesById,
197
- routingAliasesByAgentId: params.routingAliasesByAgentId,
198
- }
199
- const explicitTargets = extractExplicitAgentTargets(params.messageText, params.members, displayOptions)
200
- const firstExplicitTarget = explicitTargets[0]
201
- if (firstExplicitTarget) {
202
- return {
203
- agentId: firstExplicitTarget,
204
- routingContext: buildExplicitAgentRoutingContext(firstExplicitTarget, displayOptions),
205
- }
206
- }
207
-
208
- const membersDesc = buildMembersDescription(params.members, displayOptions)
209
- const prompt = [
210
- `Thread: "${params.threadTitle}"`,
211
- `Members:\n${membersDesc}`,
212
- params.recentContext ? `Recent context:\n${params.recentContext}` : '',
213
- `User message: "${params.messageText}"`,
214
- ]
215
- .filter(Boolean)
216
- .join('\n\n')
217
-
218
- const parsed = await generateRouterObject({
219
- schema: TriageResultSchema,
220
- system: TRIAGE_SYSTEM_PROMPT,
221
- prompt,
222
- label: 'triage',
223
- })
224
-
225
- if (!parsed) {
226
- return null
227
- }
228
- if (!parsed.agentId) {
229
- chatLogger.debug`[thread-router] triage returned empty agentId`
230
- return null
231
- }
232
- if (!params.members.includes(parsed.agentId)) {
233
- chatLogger.warn`[thread-router] triage returned unknown agent: ${parsed.agentId}`
234
- return null
235
- }
236
-
237
- chatLogger.debug`[thread-router] triage routed to ${parsed.agentId}`
238
- return parsed
230
+ return Effect.runPromise(
231
+ Effect.gen(function* () {
232
+ const displayOptions: RouterDisplayOptions = {
233
+ displayNamesById: params.displayNamesById,
234
+ shortDisplayNamesById: params.shortDisplayNamesById,
235
+ routingAliasesByAgentId: params.routingAliasesByAgentId,
236
+ }
237
+ const explicitTargets = extractExplicitAgentTargets(params.messageText, params.members, displayOptions)
238
+ const firstExplicitTarget = explicitTargets[0]
239
+ if (firstExplicitTarget) {
240
+ return {
241
+ agentId: firstExplicitTarget,
242
+ routingContext: buildExplicitAgentRoutingContext(firstExplicitTarget, displayOptions),
243
+ }
244
+ }
245
+
246
+ const membersDesc = buildMembersDescription(params.members, displayOptions)
247
+ const prompt = [
248
+ `Thread: "${params.threadTitle}"`,
249
+ `Members:\n${membersDesc}`,
250
+ params.recentContext ? `Recent context:\n${params.recentContext}` : '',
251
+ `User message: "${params.messageText}"`,
252
+ ]
253
+ .filter(Boolean)
254
+ .join('\n\n')
255
+
256
+ const parsed = yield* generateRouterObjectEffect({
257
+ schema: TriageResultSchema,
258
+ system: TRIAGE_SYSTEM_PROMPT,
259
+ prompt,
260
+ label: 'triage',
261
+ })
262
+
263
+ if (!parsed) {
264
+ return null
265
+ }
266
+ if (!parsed.agentId) {
267
+ chatLogger.debug`[thread-router] triage returned empty agentId`
268
+ return null
269
+ }
270
+ if (!params.members.includes(parsed.agentId)) {
271
+ chatLogger.warn`[thread-router] triage returned unknown agent: ${parsed.agentId}`
272
+ return null
273
+ }
274
+
275
+ chatLogger.debug`[thread-router] triage routed to ${parsed.agentId}`
276
+ return parsed
277
+ }),
278
+ )
239
279
  }
240
280
 
241
- export async function checkForNextAgent(params: {
281
+ export function checkForNextAgent(params: {
242
282
  threadTitle: string
243
283
  members: readonly string[]
244
284
  messageText: string
@@ -248,51 +288,55 @@ export async function checkForNextAgent(params: {
248
288
  shortDisplayNamesById?: Partial<Record<string, string>>
249
289
  routingAliasesByAgentId?: Partial<Record<string, string[]>>
250
290
  }): Promise<RouterCheckResult> {
251
- const displayOptions: RouterDisplayOptions = {
252
- displayNamesById: params.displayNamesById,
253
- shortDisplayNamesById: params.shortDisplayNamesById,
254
- routingAliasesByAgentId: params.routingAliasesByAgentId,
255
- }
256
- const explicitTargets = extractExplicitAgentTargets(params.messageText, params.members, displayOptions)
257
- const nextExplicitTarget = explicitTargets.find((agentId) => !params.respondedAgents.includes(agentId))
258
- if (nextExplicitTarget) {
259
- return {
260
- done: false,
261
- agentId: nextExplicitTarget,
262
- routingContext: buildExplicitAgentRoutingContext(nextExplicitTarget, displayOptions),
263
- }
264
- }
265
-
266
- const remainingMembers = params.members.filter((id) => !params.respondedAgents.includes(id))
267
- if (remainingMembers.length === 0) return { done: true }
268
-
269
- const membersDesc = buildMembersDescription(remainingMembers, displayOptions)
270
- const respondedList = params.respondedAgents.map((id) => readDisplayName(id, displayOptions)).join(', ')
271
-
272
- const prompt = [
273
- `Thread: "${params.threadTitle}"`,
274
- `Remaining members:\n${membersDesc}`,
275
- `Already responded: ${respondedList}`,
276
- `User message: "${params.messageText}"`,
277
- `Last agent response:\n"${params.lastResponseSummary}"`,
278
- ].join('\n\n')
279
-
280
- const parsed = await generateRouterObject({
281
- schema: CheckResultObjectSchema,
282
- system: CHECK_SYSTEM_PROMPT,
283
- prompt,
284
- label: 'check',
285
- })
286
-
287
- if (!parsed || parsed.done) {
288
- chatLogger.debug`[thread-router] check finished without another agent`
289
- return { done: true }
290
- }
291
- if (!parsed.agentId || !remainingMembers.includes(parsed.agentId)) {
292
- chatLogger.warn`[thread-router] check returned invalid agent: ${parsed.agentId ?? 'missing'}`
293
- return { done: true }
294
- }
295
-
296
- chatLogger.debug`[thread-router] check selected ${parsed.agentId}`
297
- return { done: false, agentId: parsed.agentId, routingContext: parsed.routingContext ?? null }
291
+ return Effect.runPromise(
292
+ Effect.gen(function* () {
293
+ const displayOptions: RouterDisplayOptions = {
294
+ displayNamesById: params.displayNamesById,
295
+ shortDisplayNamesById: params.shortDisplayNamesById,
296
+ routingAliasesByAgentId: params.routingAliasesByAgentId,
297
+ }
298
+ const explicitTargets = extractExplicitAgentTargets(params.messageText, params.members, displayOptions)
299
+ const nextExplicitTarget = explicitTargets.find((agentId) => !params.respondedAgents.includes(agentId))
300
+ if (nextExplicitTarget) {
301
+ return {
302
+ done: false,
303
+ agentId: nextExplicitTarget,
304
+ routingContext: buildExplicitAgentRoutingContext(nextExplicitTarget, displayOptions),
305
+ }
306
+ }
307
+
308
+ const remainingMembers = params.members.filter((id) => !params.respondedAgents.includes(id))
309
+ if (remainingMembers.length === 0) return { done: true }
310
+
311
+ const membersDesc = buildMembersDescription(remainingMembers, displayOptions)
312
+ const respondedList = params.respondedAgents.map((id) => readDisplayName(id, displayOptions)).join(', ')
313
+
314
+ const prompt = [
315
+ `Thread: "${params.threadTitle}"`,
316
+ `Remaining members:\n${membersDesc}`,
317
+ `Already responded: ${respondedList}`,
318
+ `User message: "${params.messageText}"`,
319
+ `Last agent response:\n"${params.lastResponseSummary}"`,
320
+ ].join('\n\n')
321
+
322
+ const parsed = yield* generateRouterObjectEffect({
323
+ schema: CheckResultObjectSchema,
324
+ system: CHECK_SYSTEM_PROMPT,
325
+ prompt,
326
+ label: 'check',
327
+ })
328
+
329
+ if (!parsed || parsed.done) {
330
+ chatLogger.debug`[thread-router] check finished without another agent`
331
+ return { done: true }
332
+ }
333
+ if (!parsed.agentId || !remainingMembers.includes(parsed.agentId)) {
334
+ chatLogger.warn`[thread-router] check returned invalid agent: ${parsed.agentId ?? 'missing'}`
335
+ return { done: true }
336
+ }
337
+
338
+ chatLogger.debug`[thread-router] check selected ${parsed.agentId}`
339
+ return { done: false, agentId: parsed.agentId, routingContext: parsed.routingContext ?? null }
340
+ }),
341
+ )
298
342
  }
@@ -1,6 +1,6 @@
1
1
  import { ToolLoopAgent } from 'ai'
2
2
 
3
- import { aiGatewayModel } from '../ai-gateway/ai-gateway'
3
+ import { aiGatewayChatModel } from '../ai-gateway/ai-gateway'
4
4
  import { buildAiGatewayDirectCacheHeaders } from '../ai-gateway/cache-headers'
5
5
  import {
6
6
  OPENROUTER_FAST_REASONING_MODEL_ID,
@@ -33,7 +33,7 @@ Return only the title text. No quotes, no labels, no explanation.
33
33
  export function createThreadTitleGeneratorAgent(options: CreateHelperToolLoopAgentOptions) {
34
34
  return new ToolLoopAgent({
35
35
  id: 'thread-title-generator',
36
- model: aiGatewayModel(OPENROUTER_FAST_REASONING_MODEL_ID),
36
+ model: aiGatewayChatModel(OPENROUTER_FAST_REASONING_MODEL_ID),
37
37
  headers: buildAiGatewayDirectCacheHeaders('lota-sdk'),
38
38
  providerOptions: OPENROUTER_MINIMAL_REASONING_PROVIDER_OPTIONS,
39
39
  ...resolveHelperAgentOptions(options, {