@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,39 +1,72 @@
1
- import type { AgentFactory, AgentRuntimeConfigProvider, AgentToolBuilder } from './agent-types'
2
-
3
- function defaultBuildAgentTools(): Record<string, never> {
1
+ import type { ToolSet } from 'ai'
2
+
3
+ import { ConfigurationError } from '../effect/errors'
4
+ import { resolveLotaService } from '../effect/runtime'
5
+ import { AgentConfigServiceTag, AgentFactoryServiceTag } from '../effect/services'
6
+ import type {
7
+ AgentFactory,
8
+ AgentRuntimeConfigParams,
9
+ AgentRuntimeConfigProvider,
10
+ AgentToolBuilder,
11
+ } from './agent-types'
12
+
13
+ function defaultBuildAgentTools(): ToolSet {
4
14
  return {}
5
15
  }
6
16
 
7
- function defaultGetAgentRuntimeConfig(): Record<string, never> {
8
- return {}
17
+ function defaultGetAgentRuntimeConfig(params: AgentRuntimeConfigParams) {
18
+ return {
19
+ id: params.agentId,
20
+ displayName: params.agentId,
21
+ mode: params.mode ?? (params.threadType === 'default' ? 'fixedThreadMode' : 'threadMode'),
22
+ maxSteps: 15,
23
+ }
9
24
  }
10
25
 
11
- // Agent configuration these are defaults that consumers override via createLotaRuntime config
12
- export let agentDisplayNames: Record<string, string> = {}
13
- export let agentShortDisplayNames: Record<string, string> = {}
14
- export let agentDescriptions: Record<string, string> = {}
15
- export let routerModelId: string | undefined = undefined
16
- export let agentRoster: readonly string[] = []
17
- export let leadAgentId = ''
18
- export let teamConsultParticipants: readonly string[] = []
26
+ function defaultGetCoreThreadProfile(coreType: string): CoreThreadProfile {
27
+ return { config: { coreType, agentId: '', title: '' }, members: [], tools: [], skills: [], instructions: '' }
28
+ }
19
29
 
20
- export interface CoreThreadProfile {
21
- config: { coreType: string; agentId: string; title: string }
22
- members: readonly string[]
23
- tools: readonly string[]
24
- skills: readonly string[]
25
- instructions: string
30
+ function normalizeAgentLookupKey(value: string): string {
31
+ return value.trim().toLowerCase()
26
32
  }
27
33
 
28
- export let getCoreThreadProfile: (coreType: string) => CoreThreadProfile = (_coreType) => ({
29
- config: { coreType: _coreType, agentId: '', title: '' },
30
- members: [],
31
- tools: [],
32
- skills: [],
33
- instructions: '',
34
- })
34
+ export interface ResolvedAgentConfig {
35
+ readonly roster: readonly string[]
36
+ readonly leadAgentId: string
37
+ readonly displayNames: Record<string, string>
38
+ readonly shortDisplayNames: Record<string, string>
39
+ readonly descriptions: Record<string, string>
40
+ readonly routerModelId: string | undefined
41
+ readonly teamConsultParticipants: readonly string[]
42
+ readonly getCoreThreadProfile: (coreType: string) => CoreThreadProfile
43
+ readonly rosterSet: ReadonlySet<string>
44
+ readonly aliasMap: ReadonlyMap<string, string>
45
+ }
46
+
47
+ function buildAgentAliasMap(config: {
48
+ roster: readonly string[]
49
+ displayNames: Record<string, string>
50
+ shortDisplayNames: Record<string, string>
51
+ }): Map<string, string> {
52
+ const map = new Map<string, string>()
53
+
54
+ for (const agent of config.roster) {
55
+ map.set(normalizeAgentLookupKey(agent), agent)
56
+ const displayName = config.displayNames[agent]
57
+ if (displayName) {
58
+ map.set(normalizeAgentLookupKey(displayName), agent)
59
+ }
60
+ const shortName = config.shortDisplayNames[agent]
61
+ if (shortName) {
62
+ map.set(normalizeAgentLookupKey(shortName), agent)
63
+ }
64
+ }
65
+
66
+ return map
67
+ }
35
68
 
36
- export function configureAgents(config: {
69
+ export function resolveAgentConfig(config: {
37
70
  roster: readonly string[]
38
71
  leadAgentId: string
39
72
  displayNames: Record<string, string>
@@ -42,75 +75,155 @@ export function configureAgents(config: {
42
75
  routerModelId?: string
43
76
  teamConsultParticipants: readonly string[]
44
77
  getCoreThreadProfile?: (coreType: string) => CoreThreadProfile
45
- }): void {
78
+ }): ResolvedAgentConfig {
46
79
  if (!config.roster.includes(config.leadAgentId)) {
47
- throw new Error(`Lead agent "${config.leadAgentId}" must be present in the configured roster.`)
80
+ throw new ConfigurationError({
81
+ message: `Lead agent "${config.leadAgentId}" must be present in the configured roster.`,
82
+ key: 'agents.leadAgentId',
83
+ })
84
+ }
85
+
86
+ const shortDisplayNames = config.shortDisplayNames ?? {}
87
+ const descriptions = config.descriptions ?? {}
88
+ const resolved: ResolvedAgentConfig = {
89
+ roster: [...config.roster],
90
+ leadAgentId: config.leadAgentId,
91
+ displayNames: { ...config.displayNames },
92
+ shortDisplayNames: { ...shortDisplayNames },
93
+ descriptions: { ...descriptions },
94
+ routerModelId: config.routerModelId,
95
+ teamConsultParticipants: [...config.teamConsultParticipants],
96
+ getCoreThreadProfile: config.getCoreThreadProfile ?? defaultGetCoreThreadProfile,
97
+ rosterSet: new Set(config.roster),
98
+ aliasMap: buildAgentAliasMap({ roster: config.roster, displayNames: config.displayNames, shortDisplayNames }),
48
99
  }
49
100
 
50
- agentRoster = config.roster
51
- leadAgentId = config.leadAgentId
52
- agentDisplayNames = config.displayNames
53
- agentShortDisplayNames = config.shortDisplayNames ?? {}
54
- agentDescriptions = config.descriptions ?? {}
55
- routerModelId = config.routerModelId
56
- teamConsultParticipants = config.teamConsultParticipants
57
- if (config.getCoreThreadProfile) {
58
- getCoreThreadProfile = config.getCoreThreadProfile
101
+ return resolved
102
+ }
103
+
104
+ export interface ResolvedAgentFactoryConfig {
105
+ readonly createAgent: AgentFactory
106
+ readonly buildAgentTools: AgentToolBuilder
107
+ readonly getAgentRuntimeConfig: AgentRuntimeConfigProvider
108
+ readonly pluginRuntime?: Record<string, unknown>
109
+ }
110
+
111
+ export function resolveAgentFactoryConfig(config: {
112
+ createAgent?: AgentFactory
113
+ buildAgentTools?: AgentToolBuilder
114
+ getAgentRuntimeConfig?: AgentRuntimeConfigProvider
115
+ pluginRuntime?: Record<string, unknown>
116
+ }): ResolvedAgentFactoryConfig {
117
+ return {
118
+ createAgent: config.createAgent ?? {},
119
+ buildAgentTools: config.buildAgentTools ?? defaultBuildAgentTools,
120
+ getAgentRuntimeConfig: config.getAgentRuntimeConfig ?? defaultGetAgentRuntimeConfig,
121
+ pluginRuntime: config.pluginRuntime,
59
122
  }
60
- _agentRosterSet = null
61
- _aliasMap = null
62
123
  }
63
124
 
64
- let _agentRosterSet: Set<string> | null = null
125
+ export interface CoreThreadProfile {
126
+ config: { coreType: string; agentId: string; title: string }
127
+ members: readonly string[]
128
+ tools: readonly string[]
129
+ skills: readonly string[]
130
+ instructions: string
131
+ }
132
+
133
+ let currentResolvedAgentConfig: ResolvedAgentConfig | null = null
134
+ let currentResolvedAgentFactoryConfig: ResolvedAgentFactoryConfig | null = null
135
+
136
+ export function configureAgentRuntimeDefaults(params: {
137
+ agentConfig: ResolvedAgentConfig
138
+ agentFactoryConfig: ResolvedAgentFactoryConfig
139
+ }): void {
140
+ currentResolvedAgentConfig = params.agentConfig
141
+ currentResolvedAgentFactoryConfig = params.agentFactoryConfig
142
+ }
143
+
144
+ export function clearAgentRuntimeDefaults(): void {
145
+ currentResolvedAgentConfig = null
146
+ currentResolvedAgentFactoryConfig = null
147
+ }
148
+
149
+ function resolveAgentConfigFromRuntime(): ResolvedAgentConfig {
150
+ return currentResolvedAgentConfig ?? resolveLotaService(AgentConfigServiceTag)
151
+ }
152
+
153
+ function resolveAgentFactoryConfigFromRuntime(): ResolvedAgentFactoryConfig {
154
+ return currentResolvedAgentFactoryConfig ?? resolveLotaService(AgentFactoryServiceTag)
155
+ }
156
+
157
+ export function getResolvedAgentConfig(): ResolvedAgentConfig {
158
+ return resolveAgentConfigFromRuntime()
159
+ }
160
+
161
+ export function getResolvedAgentFactoryConfig(): ResolvedAgentFactoryConfig {
162
+ return resolveAgentFactoryConfigFromRuntime()
163
+ }
65
164
 
66
165
  export function isAgentName(value: unknown): value is string {
67
- _agentRosterSet ??= new Set(agentRoster)
68
- return typeof value === 'string' && _agentRosterSet.has(value)
166
+ return typeof value === 'string' && resolveAgentConfigFromRuntime().rosterSet.has(value)
167
+ }
168
+
169
+ export function getAgentRoster(): readonly string[] {
170
+ return resolveAgentConfigFromRuntime().roster
171
+ }
172
+
173
+ export function getAgentDisplayNames(): Record<string, string> {
174
+ return resolveAgentConfigFromRuntime().displayNames
175
+ }
176
+
177
+ export function getAgentShortDisplayNames(): Record<string, string> {
178
+ return resolveAgentConfigFromRuntime().shortDisplayNames
179
+ }
180
+
181
+ export function getAgentDescriptions(): Record<string, string> {
182
+ return resolveAgentConfigFromRuntime().descriptions
69
183
  }
70
184
 
71
185
  export function getLeadAgentId(): string {
72
- return leadAgentId
186
+ return resolveAgentConfigFromRuntime().leadAgentId
73
187
  }
74
188
 
75
189
  export function getLeadAgentDisplayName(): string {
76
- return agentDisplayNames[leadAgentId] ?? leadAgentId
190
+ const resolved = resolveAgentConfigFromRuntime()
191
+ return resolved.displayNames[resolved.leadAgentId] ?? resolved.leadAgentId
77
192
  }
78
193
 
79
- let _aliasMap: Map<string, string> | null = null
194
+ export function getRouterModelId(): string | undefined {
195
+ return resolveAgentConfigFromRuntime().routerModelId
196
+ }
197
+
198
+ export function getTeamConsultParticipants(): readonly string[] {
199
+ return resolveAgentConfigFromRuntime().teamConsultParticipants
200
+ }
201
+
202
+ export function getCoreThreadProfile(coreType: string): CoreThreadProfile {
203
+ return resolveAgentConfigFromRuntime().getCoreThreadProfile(coreType)
204
+ }
80
205
 
81
206
  export function resolveAgentNameAlias(value: unknown): string | undefined {
82
207
  if (typeof value !== 'string') return undefined
83
- const lowered = value.trim().toLowerCase()
84
- _aliasMap ??= (() => {
85
- const map = new Map<string, string>()
86
- for (const agent of agentRoster) {
87
- map.set(agent.toLowerCase(), agent)
88
- const displayName = agentDisplayNames[agent]
89
- if (displayName) map.set(displayName.toLowerCase(), agent)
90
- const shortName = agentShortDisplayNames[agent]
91
- if (shortName) map.set(shortName.toLowerCase(), agent)
92
- }
93
- return map
94
- })()
95
- return _aliasMap.get(lowered)
208
+ return resolveAgentConfigFromRuntime().aliasMap.get(normalizeAgentLookupKey(value))
96
209
  }
97
210
 
98
- export let createAgent: AgentFactory = {}
211
+ export function getCreateAgentRegistry(): AgentFactory {
212
+ return resolveAgentFactoryConfigFromRuntime().createAgent
213
+ }
99
214
 
100
- export let buildAgentTools: AgentToolBuilder = defaultBuildAgentTools
101
- export let getAgentRuntimeConfig: AgentRuntimeConfigProvider = defaultGetAgentRuntimeConfig
102
- export let pluginRuntime: Record<string, unknown> | undefined = undefined
215
+ export function buildAgentTools(...args: Parameters<AgentToolBuilder>): ReturnType<AgentToolBuilder> {
216
+ return resolveAgentFactoryConfigFromRuntime().buildAgentTools(...args)
217
+ }
103
218
 
104
- export function configureAgentFactory(config: {
105
- createAgent?: AgentFactory
106
- buildAgentTools?: AgentToolBuilder
107
- getAgentRuntimeConfig?: AgentRuntimeConfigProvider
108
- pluginRuntime?: Record<string, unknown>
109
- }): void {
110
- createAgent = config.createAgent ?? {}
111
- buildAgentTools = config.buildAgentTools ?? defaultBuildAgentTools
112
- getAgentRuntimeConfig = config.getAgentRuntimeConfig ?? defaultGetAgentRuntimeConfig
113
- pluginRuntime = config.pluginRuntime
219
+ export function getAgentRuntimeConfig(
220
+ ...args: Parameters<AgentRuntimeConfigProvider>
221
+ ): ReturnType<AgentRuntimeConfigProvider> {
222
+ return resolveAgentFactoryConfigFromRuntime().getAgentRuntimeConfig(...args)
223
+ }
224
+
225
+ export function getPluginRuntime(): Record<string, unknown> | undefined {
226
+ return resolveAgentFactoryConfigFromRuntime().pluginRuntime
114
227
  }
115
228
 
116
229
  const AGENT_MENTION_REGEX = /(^|[^\w])@([a-z][a-z0-9_-]*)\b/gi
@@ -122,15 +235,16 @@ export interface AgentMentionMatch {
122
235
  length: number
123
236
  }
124
237
 
125
- export function extractAgentMentions(message: string): AgentMentionMatch[] {
238
+ export function extractAgentMentions(message: string, agentConfig?: ResolvedAgentConfig): AgentMentionMatch[] {
126
239
  const matches: AgentMentionMatch[] = []
127
240
  if (!message.trim()) return matches
128
241
 
242
+ const resolvedConfig = agentConfig ?? resolveAgentConfigFromRuntime()
129
243
  const regex = new RegExp(AGENT_MENTION_REGEX)
130
244
  for (const rawMatch of message.matchAll(regex)) {
131
245
  const prefix = rawMatch[1]
132
246
  const rawAgent = rawMatch[2].toLowerCase()
133
- if (!isAgentName(rawAgent)) continue
247
+ if (!resolvedConfig.rosterSet.has(rawAgent)) continue
134
248
 
135
249
  const index = rawMatch.index + prefix.length
136
250
  matches.push({ agent: rawAgent, mention: `@${rawAgent}`, index, length: rawAgent.length + 1 })
@@ -1,11 +1,61 @@
1
+ import type { ChatMode, CreateRoutedAgentOptions } from '@lota-sdk/shared'
2
+ import type { ToolLoopAgent, ToolSet } from 'ai'
3
+
4
+ import type { RecordIdRef } from '../db/record-id'
5
+ import type { AgentRuntimeConfig, AgentRuntimeRuleOptions } from '../runtime/agent-runtime-policy'
6
+
7
+ export interface AgentToolBuilderParams {
8
+ agentId: string
9
+ orgId: RecordIdRef
10
+ userId: RecordIdRef
11
+ userName?: string
12
+ orgIdString: string
13
+ threadId: RecordIdRef
14
+ threadType?: string
15
+ mode?: ChatMode
16
+ linearInstalled?: boolean
17
+ onboardingActive?: boolean
18
+ githubInstalled?: boolean
19
+ provideRepoTool?: boolean
20
+ defaultRepoSections?: unknown
21
+ memoryBlock: string
22
+ onAppendMemoryBlock: (value: string) => void
23
+ availableUploads?: unknown[]
24
+ includeExecutionPlanTools?: boolean
25
+ extraMessages?: unknown[]
26
+ }
27
+
28
+ export interface AgentRuntimeConfigParams {
29
+ agentId: string
30
+ threadType: string
31
+ mode?: ChatMode
32
+ skills?: string[]
33
+ onboardingActive: boolean
34
+ linearInstalled: boolean
35
+ systemWorkspaceDetails?: string
36
+ preSeededMemoriesSection?: string
37
+ retrievedKnowledgeSection?: string
38
+ threadMemoryBlock?: string
39
+ responseGuardSection?: string
40
+ learnedSkillsSection?: string
41
+ userMessageText?: string
42
+ additionalInstructionSections?: string[]
43
+ ruleOptions?: AgentRuntimeRuleOptions
44
+ context?: unknown
45
+ }
46
+
47
+ export type AgentCreator = <TTools extends ToolSet>(
48
+ options: CreateRoutedAgentOptions<TTools>,
49
+ ) => ToolLoopAgent<never, TTools>
50
+
1
51
  /**
2
52
  * Registry of agent factory functions keyed by agent name.
3
- * Each factory receives runtime args and returns an agent instance.
53
+ * Each factory receives routed agent options and returns a typed tool-loop agent.
4
54
  */
5
- export type AgentFactory = Record<string, (...args: unknown[]) => unknown>
55
+ export type AgentFactory = Partial<Record<string, AgentCreator>>
6
56
 
7
57
  /** Builds the tool set for a given agent. */
8
- export type AgentToolBuilder = (...args: unknown[]) => unknown
58
+ export type AgentToolBuilder = (params: AgentToolBuilderParams) => ToolSet | Promise<ToolSet>
9
59
 
10
60
  /** Returns runtime configuration for a given agent. */
11
- export type AgentRuntimeConfigProvider = (...args: unknown[]) => unknown
61
+ export type AgentRuntimeConfigProvider = (params: AgentRuntimeConfigParams) => AgentRuntimeConfig<string>
@@ -12,7 +12,7 @@ const DEFAULT_CONFIG: BackgroundProcessingConfig = {
12
12
  memoryConsolidationFrequency: 10,
13
13
  }
14
14
 
15
- let resolvedConfig: BackgroundProcessingConfig = { ...DEFAULT_CONFIG }
15
+ const resolvedConfig: BackgroundProcessingConfig = { ...DEFAULT_CONFIG }
16
16
 
17
17
  export function getBackgroundProcessingConfig(): BackgroundProcessingConfig {
18
18
  return resolvedConfig
@@ -1,4 +1,4 @@
1
- import { z } from 'zod'
1
+ import { ValidationError } from '../effect/errors'
2
2
 
3
3
  export const MEMORY = {
4
4
  DEFAULT_CANDIDATE_LIMIT: 12,
@@ -6,7 +6,13 @@ export const MEMORY = {
6
6
  MAX_KNN_LIMIT: 100,
7
7
  } as const
8
8
 
9
+ export const DEFAULT_AI_GATEWAY_URL = 'https://ai-gateway.gobrainy.ai' as const
10
+
9
11
  /** Validates that a value is a safe integer for KNN queries. Throws if validation fails. */
10
12
  export function validateKnnLimit(limit: unknown): number {
11
- return z.number().int().positive().max(MEMORY.MAX_KNN_LIMIT).parse(limit)
13
+ if (typeof limit !== 'number' || !Number.isInteger(limit) || limit <= 0 || limit > MEMORY.MAX_KNN_LIMIT) {
14
+ throw new ValidationError({ message: `Memory KNN limit must be a positive integer <= ${MEMORY.MAX_KNN_LIMIT}.` })
15
+ }
16
+
17
+ return limit
12
18
  }
@@ -4,5 +4,4 @@ export * from './background-processing'
4
4
  export * from './constants'
5
5
  export * from './logger'
6
6
  export * from './model-constants'
7
- export * from './search'
8
7
  export * from './thread-defaults'