@lota-sdk/core 0.4.8 → 0.4.10

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 (272) hide show
  1. package/package.json +11 -12
  2. package/src/ai/embedding-cache.ts +96 -22
  3. package/src/ai-gateway/ai-gateway.ts +766 -223
  4. package/src/config/agent-defaults.ts +189 -75
  5. package/src/config/agent-types.ts +54 -4
  6. package/src/config/background-processing.ts +1 -1
  7. package/src/config/constants.ts +8 -2
  8. package/src/config/index.ts +0 -1
  9. package/src/config/logger.ts +299 -19
  10. package/src/config/thread-defaults.ts +40 -20
  11. package/src/create-runtime.ts +200 -449
  12. package/src/db/base.service.ts +52 -28
  13. package/src/db/cursor-pagination.ts +71 -30
  14. package/src/db/memory-query-builder.ts +2 -1
  15. package/src/db/memory-store.helpers.ts +4 -7
  16. package/src/db/memory-store.ts +868 -601
  17. package/src/db/memory.ts +396 -280
  18. package/src/db/record-id.ts +32 -10
  19. package/src/db/schema-fingerprint.ts +30 -12
  20. package/src/db/service-normalization.ts +288 -0
  21. package/src/db/service.ts +912 -779
  22. package/src/db/startup.ts +153 -68
  23. package/src/db/transaction-conflict.ts +15 -0
  24. package/src/effect/awaitable-effect.ts +96 -0
  25. package/src/effect/errors.ts +121 -0
  26. package/src/effect/helpers.ts +123 -0
  27. package/src/effect/index.ts +24 -0
  28. package/src/effect/layers.ts +238 -0
  29. package/src/effect/runtime-ref.ts +25 -0
  30. package/src/effect/runtime.ts +46 -0
  31. package/src/effect/services.ts +61 -0
  32. package/src/effect/zod.ts +43 -0
  33. package/src/embeddings/provider.ts +128 -83
  34. package/src/index.ts +48 -1
  35. package/src/openrouter/direct-provider.ts +11 -35
  36. package/src/queues/autonomous-job.queue.ts +117 -73
  37. package/src/queues/context-compaction.queue.ts +50 -17
  38. package/src/queues/delayed-node-promotion.queue.ts +46 -17
  39. package/src/queues/document-processor.queue.ts +52 -77
  40. package/src/queues/memory-consolidation.queue.ts +47 -32
  41. package/src/queues/organization-learning.queue.ts +26 -4
  42. package/src/queues/plan-agent-heartbeat.queue.ts +71 -24
  43. package/src/queues/plan-scheduler.queue.ts +97 -33
  44. package/src/queues/post-chat-memory.queue.ts +56 -26
  45. package/src/queues/queue-factory.ts +227 -59
  46. package/src/queues/standalone-worker.ts +39 -0
  47. package/src/queues/title-generation.queue.ts +45 -11
  48. package/src/redis/connection.ts +182 -113
  49. package/src/redis/index.ts +6 -8
  50. package/src/redis/org-memory-lock.ts +60 -27
  51. package/src/redis/redis-lease-lock.ts +200 -121
  52. package/src/redis/runtime-connection.ts +20 -0
  53. package/src/redis/stream-context.ts +92 -46
  54. package/src/runtime/agent-identity-overrides.ts +2 -2
  55. package/src/runtime/agent-runtime-policy.ts +5 -2
  56. package/src/runtime/agent-stream-helpers.ts +24 -9
  57. package/src/runtime/chat-run-orchestration.ts +102 -19
  58. package/src/runtime/chat-run-registry.ts +36 -2
  59. package/src/runtime/context-compaction/context-compaction-runtime.ts +107 -0
  60. package/src/runtime/{context-compaction.ts → context-compaction/context-compaction.ts} +161 -94
  61. package/src/runtime/domain-layer.ts +192 -0
  62. package/src/runtime/execution-plan-visibility.ts +2 -2
  63. package/src/runtime/execution-plan.ts +42 -15
  64. package/src/runtime/graph-designer.ts +16 -4
  65. package/src/runtime/helper-model.ts +139 -48
  66. package/src/runtime/index.ts +7 -8
  67. package/src/runtime/indexed-repositories-policy.ts +3 -3
  68. package/src/runtime/{memory-block.ts → memory/memory-block.ts} +50 -36
  69. package/src/runtime/{memory-digest-policy.ts → memory/memory-digest-policy.ts} +1 -1
  70. package/src/runtime/{memory-pipeline.ts → memory/memory-pipeline.ts} +54 -67
  71. package/src/runtime/{memory-prompts-fact.ts → memory/memory-prompts-fact.ts} +2 -2
  72. package/src/runtime/memory/memory-scope.ts +53 -0
  73. package/src/runtime/plugin-resolution.ts +124 -25
  74. package/src/runtime/plugin-types.ts +9 -1
  75. package/src/runtime/post-turn-side-effects.ts +177 -130
  76. package/src/runtime/retrieval-adapters.ts +40 -6
  77. package/src/runtime/runtime-accessors.ts +92 -0
  78. package/src/runtime/runtime-config.ts +150 -61
  79. package/src/runtime/runtime-extensions.ts +23 -25
  80. package/src/runtime/runtime-lifecycle.ts +124 -0
  81. package/src/runtime/runtime-services.ts +386 -0
  82. package/src/runtime/runtime-token.ts +47 -0
  83. package/src/runtime/social-chat/social-chat-agent-runner.ts +159 -0
  84. package/src/runtime/{social-chat-history.ts → social-chat/social-chat-history.ts} +51 -20
  85. package/src/runtime/social-chat/social-chat.ts +630 -0
  86. package/src/runtime/specialist-runner.ts +36 -10
  87. package/src/runtime/team-consultation/team-consultation-orchestrator.ts +433 -0
  88. package/src/runtime/{team-consultation-prompts.ts → team-consultation/team-consultation-prompts.ts} +6 -2
  89. package/src/runtime/thread-chat-helpers.ts +2 -2
  90. package/src/runtime/thread-plan-turn.ts +2 -1
  91. package/src/runtime/thread-turn-context.ts +183 -111
  92. package/src/runtime/turn-lifecycle.ts +93 -27
  93. package/src/services/agent-activity.service.ts +287 -203
  94. package/src/services/agent-executor.service.ts +253 -149
  95. package/src/services/artifact.service.ts +231 -149
  96. package/src/services/attachment.service.ts +171 -115
  97. package/src/services/autonomous-job.service.ts +890 -491
  98. package/src/services/background-work.service.ts +54 -0
  99. package/src/services/chat-run-registry.service.ts +13 -1
  100. package/src/services/context-compaction.service.ts +136 -86
  101. package/src/services/document-chunk.service.ts +151 -88
  102. package/src/services/execution-plan/execution-plan-approval.ts +26 -0
  103. package/src/services/execution-plan/execution-plan-context.ts +29 -0
  104. package/src/services/execution-plan/execution-plan-graph.ts +278 -0
  105. package/src/services/execution-plan/execution-plan-schedule.ts +84 -0
  106. package/src/services/execution-plan/execution-plan-spec.ts +75 -0
  107. package/src/services/execution-plan/execution-plan.service.ts +1041 -0
  108. package/src/services/feedback-loop.service.ts +132 -76
  109. package/src/services/global-orchestrator.service.ts +101 -168
  110. package/src/services/graph-full-routing.ts +193 -0
  111. package/src/services/index.ts +19 -21
  112. package/src/services/institutional-memory.service.ts +213 -125
  113. package/src/services/learned-skill.service.ts +368 -260
  114. package/src/services/memory/memory-conversation.ts +95 -0
  115. package/src/services/memory/memory-errors.ts +27 -0
  116. package/src/services/memory/memory-org-memory.ts +50 -0
  117. package/src/services/memory/memory-preseeded.ts +86 -0
  118. package/src/services/memory/memory-rerank.ts +297 -0
  119. package/src/services/{memory-utils.ts → memory/memory-utils.ts} +6 -5
  120. package/src/services/memory/memory.service.ts +674 -0
  121. package/src/services/memory/rerank.service.ts +201 -0
  122. package/src/services/monitoring-window.service.ts +92 -70
  123. package/src/services/mutating-approval.service.ts +62 -53
  124. package/src/services/node-workspace.service.ts +141 -98
  125. package/src/services/notification.service.ts +29 -16
  126. package/src/services/organization-member.service.ts +120 -66
  127. package/src/services/organization.service.ts +153 -77
  128. package/src/services/ownership-dispatcher.service.ts +456 -263
  129. package/src/services/plan/plan-agent-heartbeat.service.ts +234 -0
  130. package/src/services/plan/plan-agent-query.service.ts +322 -0
  131. package/src/services/{plan-approval.service.ts → plan/plan-approval.service.ts} +45 -22
  132. package/src/services/plan/plan-artifact.service.ts +60 -0
  133. package/src/services/plan/plan-builder.service.ts +76 -0
  134. package/src/services/plan/plan-checkpoint.service.ts +103 -0
  135. package/src/services/{plan-compiler.service.ts → plan/plan-compiler.service.ts} +26 -9
  136. package/src/services/plan/plan-completion-side-effects.ts +169 -0
  137. package/src/services/plan/plan-coordination.service.ts +181 -0
  138. package/src/services/plan/plan-cycle.service.ts +405 -0
  139. package/src/services/plan/plan-deadline.service.ts +533 -0
  140. package/src/services/plan/plan-event-delivery.service.ts +266 -0
  141. package/src/services/plan/plan-executor-context.ts +35 -0
  142. package/src/services/plan/plan-executor-graph.ts +522 -0
  143. package/src/services/plan/plan-executor-helpers.ts +307 -0
  144. package/src/services/plan/plan-executor-persistence.ts +209 -0
  145. package/src/services/plan/plan-executor.service.ts +1737 -0
  146. package/src/services/{plan-helpers.ts → plan/plan-helpers.ts} +1 -1
  147. package/src/services/{plan-run-data.ts → plan/plan-run-data.ts} +4 -4
  148. package/src/services/plan/plan-run-serialization.ts +15 -0
  149. package/src/services/plan/plan-run.service.ts +637 -0
  150. package/src/services/plan/plan-scheduler.service.ts +379 -0
  151. package/src/services/plan/plan-template.service.ts +224 -0
  152. package/src/services/plan/plan-transaction-events.ts +36 -0
  153. package/src/services/plan/plan-validator.service.ts +907 -0
  154. package/src/services/plan/plan-workspace.service.ts +131 -0
  155. package/src/services/plugin-executor.service.ts +102 -68
  156. package/src/services/quality-metrics.service.ts +112 -94
  157. package/src/services/queue-job.service.ts +288 -231
  158. package/src/services/recent-activity-title.service.ts +73 -36
  159. package/src/services/recent-activity.service.ts +274 -259
  160. package/src/services/skill-resolver.service.ts +38 -12
  161. package/src/services/social-chat-history.service.ts +190 -122
  162. package/src/services/system-executor.service.ts +96 -61
  163. package/src/services/thread/thread-active-run.ts +203 -0
  164. package/src/services/thread/thread-bootstrap.ts +385 -0
  165. package/src/services/thread/thread-listing.ts +199 -0
  166. package/src/services/thread/thread-memory-block.ts +130 -0
  167. package/src/services/thread/thread-message.service.ts +379 -0
  168. package/src/services/thread/thread-record-store.ts +155 -0
  169. package/src/services/thread/thread-title.service.ts +74 -0
  170. package/src/services/thread/thread-turn-execution.ts +280 -0
  171. package/src/services/thread/thread-turn-message-context.ts +73 -0
  172. package/src/services/thread/thread-turn-preparation.service.ts +1148 -0
  173. package/src/services/thread/thread-turn-streaming.ts +403 -0
  174. package/src/services/thread/thread-turn-tracing.ts +35 -0
  175. package/src/services/thread/thread-turn.ts +376 -0
  176. package/src/services/thread/thread.service.ts +344 -0
  177. package/src/services/user.service.ts +82 -32
  178. package/src/services/write-intent-validator.service.ts +63 -51
  179. package/src/storage/attachment-parser.ts +69 -27
  180. package/src/storage/attachment-storage.service.ts +334 -275
  181. package/src/storage/generated-document-storage.service.ts +66 -34
  182. package/src/system-agents/agent-result.ts +3 -1
  183. package/src/system-agents/context-compaction.agent.ts +3 -3
  184. package/src/system-agents/delegated-agent-factory.ts +159 -90
  185. package/src/system-agents/helper-agent-options.ts +1 -1
  186. package/src/system-agents/memory-reranker.agent.ts +3 -3
  187. package/src/system-agents/memory.agent.ts +3 -3
  188. package/src/system-agents/recent-activity-title-refiner.agent.ts +3 -3
  189. package/src/system-agents/regular-chat-memory-digest.agent.ts +3 -3
  190. package/src/system-agents/skill-extractor.agent.ts +3 -3
  191. package/src/system-agents/skill-manager.agent.ts +3 -3
  192. package/src/system-agents/thread-router.agent.ts +157 -113
  193. package/src/system-agents/title-generator.agent.ts +3 -3
  194. package/src/tools/execution-plan.tool.ts +241 -171
  195. package/src/tools/fetch-webpage.tool.ts +29 -18
  196. package/src/tools/firecrawl-client.ts +26 -6
  197. package/src/tools/index.ts +1 -0
  198. package/src/tools/memory-block.tool.ts +14 -6
  199. package/src/tools/plan-approval.tool.ts +57 -47
  200. package/src/tools/read-file-parts.tool.ts +44 -33
  201. package/src/tools/remember-memory.tool.ts +65 -45
  202. package/src/tools/search-web.tool.ts +33 -22
  203. package/src/tools/search.tool.ts +41 -29
  204. package/src/tools/team-think.tool.ts +125 -84
  205. package/src/tools/user-questions.tool.ts +4 -3
  206. package/src/tools/web-tool-shared.ts +6 -0
  207. package/src/utils/async.ts +25 -22
  208. package/src/utils/crypto.ts +21 -0
  209. package/src/utils/date-time.ts +40 -1
  210. package/src/utils/errors.ts +111 -20
  211. package/src/utils/hono-error-handler.ts +24 -39
  212. package/src/utils/index.ts +2 -1
  213. package/src/utils/null-proto-record.ts +41 -0
  214. package/src/utils/sse-keepalive.ts +124 -21
  215. package/src/workers/bootstrap.ts +164 -52
  216. package/src/workers/memory-consolidation.worker.ts +325 -237
  217. package/src/workers/organization-learning.worker.ts +50 -16
  218. package/src/workers/regular-chat-memory-digest.helpers.ts +28 -27
  219. package/src/workers/regular-chat-memory-digest.runner.ts +185 -114
  220. package/src/workers/skill-extraction.runner.ts +176 -93
  221. package/src/workers/utils/file-section-chunker.ts +8 -10
  222. package/src/workers/utils/repo-structure-extractor.ts +349 -260
  223. package/src/workers/utils/repomix-file-sections.ts +2 -2
  224. package/src/workers/utils/thread-message-query.ts +97 -38
  225. package/src/workers/worker-utils.ts +74 -31
  226. package/src/config/debug-logger.ts +0 -47
  227. package/src/config/search.ts +0 -3
  228. package/src/redis/connection-accessor.ts +0 -26
  229. package/src/runtime/agent-types.ts +0 -1
  230. package/src/runtime/context-compaction-runtime.ts +0 -87
  231. package/src/runtime/memory-scope.ts +0 -43
  232. package/src/runtime/social-chat-agent-runner.ts +0 -118
  233. package/src/runtime/social-chat.ts +0 -516
  234. package/src/runtime/team-consultation-orchestrator.ts +0 -272
  235. package/src/services/adaptive-playbook.service.ts +0 -152
  236. package/src/services/artifact-provenance.service.ts +0 -172
  237. package/src/services/chat-attachments.service.ts +0 -17
  238. package/src/services/context-compaction-runtime.singleton.ts +0 -13
  239. package/src/services/execution-plan.service.ts +0 -1118
  240. package/src/services/memory.service.ts +0 -914
  241. package/src/services/plan-agent-heartbeat.service.ts +0 -136
  242. package/src/services/plan-agent-query.service.ts +0 -267
  243. package/src/services/plan-artifact.service.ts +0 -50
  244. package/src/services/plan-builder.service.ts +0 -67
  245. package/src/services/plan-checkpoint.service.ts +0 -81
  246. package/src/services/plan-completion-side-effects.ts +0 -80
  247. package/src/services/plan-coordination.service.ts +0 -157
  248. package/src/services/plan-cycle.service.ts +0 -284
  249. package/src/services/plan-deadline.service.ts +0 -430
  250. package/src/services/plan-event-delivery.service.ts +0 -166
  251. package/src/services/plan-executor.service.ts +0 -1950
  252. package/src/services/plan-run.service.ts +0 -515
  253. package/src/services/plan-scheduler.service.ts +0 -240
  254. package/src/services/plan-template.service.ts +0 -177
  255. package/src/services/plan-validator.service.ts +0 -818
  256. package/src/services/plan-workspace.service.ts +0 -83
  257. package/src/services/rerank.service.ts +0 -156
  258. package/src/services/thread-message.service.ts +0 -275
  259. package/src/services/thread-plan-registry.service.ts +0 -22
  260. package/src/services/thread-title.service.ts +0 -39
  261. package/src/services/thread-turn-preparation.service.ts +0 -1147
  262. package/src/services/thread-turn.ts +0 -172
  263. package/src/services/thread.service.ts +0 -869
  264. package/src/utils/env.ts +0 -8
  265. /package/src/runtime/{context-compaction-constants.ts → context-compaction/context-compaction-constants.ts} +0 -0
  266. /package/src/runtime/{memory-format.ts → memory/memory-format.ts} +0 -0
  267. /package/src/runtime/{memory-prompts-parse.ts → memory/memory-prompts-parse.ts} +0 -0
  268. /package/src/runtime/{memory-prompts-update.ts → memory/memory-prompts-update.ts} +0 -0
  269. /package/src/runtime/{social-chat-prompts.ts → social-chat/social-chat-prompts.ts} +0 -0
  270. /package/src/services/{plan-node-spec.ts → plan/plan-node-spec.ts} +0 -0
  271. /package/src/services/{thread-constants.ts → thread/thread-constants.ts} +0 -0
  272. /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,12 +1,12 @@
1
+ import type { CreateHelperToolLoopAgentOptions } from '@lota-sdk/shared'
1
2
  import { ToolLoopAgent } from 'ai'
2
3
 
3
- import { aiGatewayModel } from '../ai-gateway/ai-gateway'
4
+ import { aiGatewayChatModel } from '../ai-gateway/ai-gateway'
4
5
  import { buildAiGatewayDirectCacheHeaders } from '../ai-gateway/cache-headers'
5
6
  import {
6
7
  OPENROUTER_FAST_REASONING_MODEL_ID,
7
8
  OPENROUTER_MINIMAL_REASONING_PROVIDER_OPTIONS,
8
9
  } from '../config/model-constants'
9
- import type { CreateHelperToolLoopAgentOptions } from '../runtime/agent-types'
10
10
  import { resolveHelperAgentOptions } from './helper-agent-options'
11
11
 
12
12
  const THREAD_TITLE_MAX_TOKENS = 512
@@ -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, {