@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,39 +1,73 @@
1
- import type { AgentFactory, AgentRuntimeConfigProvider, AgentToolBuilder } from './agent-types'
2
-
3
- function defaultBuildAgentTools(): Record<string, never> {
1
+ import type { ToolSet } from 'ai'
2
+ import { Effect } from 'effect'
3
+
4
+ import { ConfigurationError } from '../effect/errors'
5
+ import { getCurrentRuntime } from '../effect/runtime-ref'
6
+ import { AgentConfigServiceTag, AgentFactoryServiceTag } from '../effect/services'
7
+ import type {
8
+ AgentFactory,
9
+ AgentRuntimeConfigParams,
10
+ AgentRuntimeConfigProvider,
11
+ AgentToolBuilder,
12
+ } from './agent-types'
13
+
14
+ function defaultBuildAgentTools(): ToolSet {
4
15
  return {}
5
16
  }
6
17
 
7
- function defaultGetAgentRuntimeConfig(): Record<string, never> {
8
- return {}
18
+ function defaultGetAgentRuntimeConfig(params: AgentRuntimeConfigParams) {
19
+ return {
20
+ id: params.agentId,
21
+ displayName: params.agentId,
22
+ mode: params.mode ?? (params.threadType === 'default' ? 'fixedThreadMode' : 'threadMode'),
23
+ maxSteps: 15,
24
+ }
9
25
  }
10
26
 
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[] = []
27
+ function defaultGetCoreThreadProfile(coreType: string): CoreThreadProfile {
28
+ return { config: { coreType, agentId: '', title: '' }, members: [], tools: [], skills: [], instructions: '' }
29
+ }
19
30
 
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
31
+ function normalizeAgentLookupKey(value: string): string {
32
+ return value.trim().toLowerCase()
26
33
  }
27
34
 
28
- export let getCoreThreadProfile: (coreType: string) => CoreThreadProfile = (_coreType) => ({
29
- config: { coreType: _coreType, agentId: '', title: '' },
30
- members: [],
31
- tools: [],
32
- skills: [],
33
- instructions: '',
34
- })
35
+ export interface ResolvedAgentConfig {
36
+ readonly roster: readonly string[]
37
+ readonly leadAgentId: string
38
+ readonly displayNames: Record<string, string>
39
+ readonly shortDisplayNames: Record<string, string>
40
+ readonly descriptions: Record<string, string>
41
+ readonly routerModelId: string | undefined
42
+ readonly teamConsultParticipants: readonly string[]
43
+ readonly getCoreThreadProfile: (coreType: string) => CoreThreadProfile
44
+ readonly rosterSet: ReadonlySet<string>
45
+ readonly aliasMap: ReadonlyMap<string, string>
46
+ }
35
47
 
36
- export function configureAgents(config: {
48
+ function buildAgentAliasMap(config: {
49
+ roster: readonly string[]
50
+ displayNames: Record<string, string>
51
+ shortDisplayNames: Record<string, string>
52
+ }): Map<string, string> {
53
+ const map = new Map<string, string>()
54
+
55
+ for (const agent of config.roster) {
56
+ map.set(normalizeAgentLookupKey(agent), agent)
57
+ const displayName = config.displayNames[agent]
58
+ if (displayName) {
59
+ map.set(normalizeAgentLookupKey(displayName), agent)
60
+ }
61
+ const shortName = config.shortDisplayNames[agent]
62
+ if (shortName) {
63
+ map.set(normalizeAgentLookupKey(shortName), agent)
64
+ }
65
+ }
66
+
67
+ return map
68
+ }
69
+
70
+ export function resolveAgentConfig(config: {
37
71
  roster: readonly string[]
38
72
  leadAgentId: string
39
73
  displayNames: Record<string, string>
@@ -42,75 +76,139 @@ export function configureAgents(config: {
42
76
  routerModelId?: string
43
77
  teamConsultParticipants: readonly string[]
44
78
  getCoreThreadProfile?: (coreType: string) => CoreThreadProfile
45
- }): void {
79
+ }): ResolvedAgentConfig {
46
80
  if (!config.roster.includes(config.leadAgentId)) {
47
- throw new Error(`Lead agent "${config.leadAgentId}" must be present in the configured roster.`)
81
+ throw new ConfigurationError({
82
+ message: `Lead agent "${config.leadAgentId}" must be present in the configured roster.`,
83
+ key: 'agents.leadAgentId',
84
+ })
85
+ }
86
+
87
+ const shortDisplayNames = config.shortDisplayNames ?? {}
88
+ const descriptions = config.descriptions ?? {}
89
+ const resolved: ResolvedAgentConfig = {
90
+ roster: [...config.roster],
91
+ leadAgentId: config.leadAgentId,
92
+ displayNames: { ...config.displayNames },
93
+ shortDisplayNames: { ...shortDisplayNames },
94
+ descriptions: { ...descriptions },
95
+ routerModelId: config.routerModelId,
96
+ teamConsultParticipants: [...config.teamConsultParticipants],
97
+ getCoreThreadProfile: config.getCoreThreadProfile ?? defaultGetCoreThreadProfile,
98
+ rosterSet: new Set(config.roster),
99
+ aliasMap: buildAgentAliasMap({ roster: config.roster, displayNames: config.displayNames, shortDisplayNames }),
48
100
  }
49
101
 
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
102
+ return resolved
103
+ }
104
+
105
+ export interface ResolvedAgentFactoryConfig {
106
+ readonly createAgent: AgentFactory
107
+ readonly buildAgentTools: AgentToolBuilder
108
+ readonly getAgentRuntimeConfig: AgentRuntimeConfigProvider
109
+ readonly pluginRuntime?: Record<string, unknown>
110
+ }
111
+
112
+ export function resolveAgentFactoryConfig(config: {
113
+ createAgent?: AgentFactory
114
+ buildAgentTools?: AgentToolBuilder
115
+ getAgentRuntimeConfig?: AgentRuntimeConfigProvider
116
+ pluginRuntime?: Record<string, unknown>
117
+ }): ResolvedAgentFactoryConfig {
118
+ return {
119
+ createAgent: config.createAgent ?? {},
120
+ buildAgentTools: config.buildAgentTools ?? defaultBuildAgentTools,
121
+ getAgentRuntimeConfig: config.getAgentRuntimeConfig ?? defaultGetAgentRuntimeConfig,
122
+ pluginRuntime: config.pluginRuntime,
59
123
  }
60
- _agentRosterSet = null
61
- _aliasMap = null
62
124
  }
63
125
 
64
- let _agentRosterSet: Set<string> | null = null
126
+ export interface CoreThreadProfile {
127
+ config: { coreType: string; agentId: string; title: string }
128
+ members: readonly string[]
129
+ tools: readonly string[]
130
+ skills: readonly string[]
131
+ instructions: string
132
+ }
133
+
134
+ function resolveAgentConfigFromRuntime(): ResolvedAgentConfig {
135
+ return getCurrentRuntime().runSync(Effect.service(AgentConfigServiceTag))
136
+ }
137
+
138
+ function resolveAgentFactoryConfigFromRuntime(): ResolvedAgentFactoryConfig {
139
+ return getCurrentRuntime().runSync(Effect.service(AgentFactoryServiceTag))
140
+ }
141
+
142
+ export function getResolvedAgentConfig(): ResolvedAgentConfig {
143
+ return resolveAgentConfigFromRuntime()
144
+ }
145
+
146
+ export function getResolvedAgentFactoryConfig(): ResolvedAgentFactoryConfig {
147
+ return resolveAgentFactoryConfigFromRuntime()
148
+ }
65
149
 
66
150
  export function isAgentName(value: unknown): value is string {
67
- _agentRosterSet ??= new Set(agentRoster)
68
- return typeof value === 'string' && _agentRosterSet.has(value)
151
+ return typeof value === 'string' && resolveAgentConfigFromRuntime().rosterSet.has(value)
152
+ }
153
+
154
+ export function getAgentRoster(): readonly string[] {
155
+ return resolveAgentConfigFromRuntime().roster
156
+ }
157
+
158
+ export function getAgentDisplayNames(): Record<string, string> {
159
+ return resolveAgentConfigFromRuntime().displayNames
160
+ }
161
+
162
+ export function getAgentShortDisplayNames(): Record<string, string> {
163
+ return resolveAgentConfigFromRuntime().shortDisplayNames
164
+ }
165
+
166
+ export function getAgentDescriptions(): Record<string, string> {
167
+ return resolveAgentConfigFromRuntime().descriptions
69
168
  }
70
169
 
71
170
  export function getLeadAgentId(): string {
72
- return leadAgentId
171
+ return resolveAgentConfigFromRuntime().leadAgentId
73
172
  }
74
173
 
75
174
  export function getLeadAgentDisplayName(): string {
76
- return agentDisplayNames[leadAgentId] ?? leadAgentId
175
+ const resolved = resolveAgentConfigFromRuntime()
176
+ return resolved.displayNames[resolved.leadAgentId] ?? resolved.leadAgentId
177
+ }
178
+
179
+ export function getRouterModelId(): string | undefined {
180
+ return resolveAgentConfigFromRuntime().routerModelId
77
181
  }
78
182
 
79
- let _aliasMap: Map<string, string> | null = null
183
+ export function getTeamConsultParticipants(): readonly string[] {
184
+ return resolveAgentConfigFromRuntime().teamConsultParticipants
185
+ }
186
+
187
+ export function getCoreThreadProfile(coreType: string): CoreThreadProfile {
188
+ return resolveAgentConfigFromRuntime().getCoreThreadProfile(coreType)
189
+ }
80
190
 
81
191
  export function resolveAgentNameAlias(value: unknown): string | undefined {
82
192
  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)
193
+ return resolveAgentConfigFromRuntime().aliasMap.get(normalizeAgentLookupKey(value))
96
194
  }
97
195
 
98
- export let createAgent: AgentFactory = {}
196
+ export function getCreateAgentRegistry(): AgentFactory {
197
+ return resolveAgentFactoryConfigFromRuntime().createAgent
198
+ }
99
199
 
100
- export let buildAgentTools: AgentToolBuilder = defaultBuildAgentTools
101
- export let getAgentRuntimeConfig: AgentRuntimeConfigProvider = defaultGetAgentRuntimeConfig
102
- export let pluginRuntime: Record<string, unknown> | undefined = undefined
200
+ export function buildAgentTools(...args: Parameters<AgentToolBuilder>): ReturnType<AgentToolBuilder> {
201
+ return resolveAgentFactoryConfigFromRuntime().buildAgentTools(...args)
202
+ }
103
203
 
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
204
+ export function getAgentRuntimeConfig(
205
+ ...args: Parameters<AgentRuntimeConfigProvider>
206
+ ): ReturnType<AgentRuntimeConfigProvider> {
207
+ return resolveAgentFactoryConfigFromRuntime().getAgentRuntimeConfig(...args)
208
+ }
209
+
210
+ export function getPluginRuntime(): Record<string, unknown> | undefined {
211
+ return resolveAgentFactoryConfigFromRuntime().pluginRuntime
114
212
  }
115
213
 
116
214
  const AGENT_MENTION_REGEX = /(^|[^\w])@([a-z][a-z0-9_-]*)\b/gi
@@ -122,7 +220,10 @@ export interface AgentMentionMatch {
122
220
  length: number
123
221
  }
124
222
 
125
- export function extractAgentMentions(message: string): AgentMentionMatch[] {
223
+ export function extractAgentMentions(
224
+ message: string,
225
+ agentConfig: ResolvedAgentConfig = resolveAgentConfigFromRuntime(),
226
+ ): AgentMentionMatch[] {
126
227
  const matches: AgentMentionMatch[] = []
127
228
  if (!message.trim()) return matches
128
229
 
@@ -130,7 +231,7 @@ export function extractAgentMentions(message: string): AgentMentionMatch[] {
130
231
  for (const rawMatch of message.matchAll(regex)) {
131
232
  const prefix = rawMatch[1]
132
233
  const rawAgent = rawMatch[2].toLowerCase()
133
- if (!isAgentName(rawAgent)) continue
234
+ if (!agentConfig.rosterSet.has(rawAgent)) continue
134
235
 
135
236
  const index = rawMatch.index + prefix.length
136
237
  matches.push({ agent: rawAgent, mention: `@${rawAgent}`, index, length: rawAgent.length + 1 })
@@ -1,11 +1,61 @@
1
+ import type { ToolLoopAgent, ToolSet } from 'ai'
2
+
3
+ import type { RecordIdRef } from '../db/record-id'
4
+ import type { AgentRuntimeConfig, AgentRuntimeRuleOptions } from '../runtime/agent-runtime-policy'
5
+ import type { ChatMode, CreateRoutedAgentOptions } from '../runtime/agent-types'
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>
@@ -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
  }