@lota-sdk/core 0.1.37 → 0.1.39

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lota-sdk/core",
3
- "version": "0.1.37",
3
+ "version": "0.1.39",
4
4
  "type": "module",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
@@ -32,7 +32,7 @@
32
32
  "@chat-adapter/slack": "^4.23.0",
33
33
  "@chat-adapter/state-ioredis": "^4.23.0",
34
34
  "@logtape/logtape": "^2.0.5",
35
- "@lota-sdk/shared": "0.1.37",
35
+ "@lota-sdk/shared": "0.1.39",
36
36
  "@mendable/firecrawl-js": "^4.18.0",
37
37
  "@surrealdb/node": "^3.0.3",
38
38
  "ai": "^6.0.141",
@@ -12,7 +12,7 @@ function defaultGetAgentRuntimeConfig(): Record<string, never> {
12
12
  export let agentDisplayNames: Record<string, string> = {}
13
13
  export let agentShortDisplayNames: Record<string, string> = {}
14
14
  export let agentDescriptions: Record<string, string> = {}
15
- export let managerModelId: string | undefined = undefined
15
+ export let routerModelId: string | undefined = undefined
16
16
  export let agentRoster: readonly string[] = []
17
17
  export let leadAgentId = ''
18
18
  export let teamConsultParticipants: readonly string[] = []
@@ -39,7 +39,7 @@ export function configureAgents(config: {
39
39
  displayNames: Record<string, string>
40
40
  shortDisplayNames?: Record<string, string>
41
41
  descriptions?: Record<string, string>
42
- managerModelId?: string
42
+ routerModelId?: string
43
43
  teamConsultParticipants: readonly string[]
44
44
  getCoreWorkstreamProfile?: (coreType: string) => CoreWorkstreamProfile
45
45
  }): void {
@@ -52,7 +52,7 @@ export function configureAgents(config: {
52
52
  agentDisplayNames = config.displayNames
53
53
  agentShortDisplayNames = config.shortDisplayNames ?? {}
54
54
  agentDescriptions = config.descriptions ?? {}
55
- managerModelId = config.managerModelId
55
+ routerModelId = config.routerModelId
56
56
  teamConsultParticipants = config.teamConsultParticipants
57
57
  if (config.getCoreWorkstreamProfile) {
58
58
  getCoreWorkstreamProfile = config.getCoreWorkstreamProfile
@@ -251,7 +251,7 @@ export async function createLotaRuntime(config: LotaRuntimeConfig): Promise<Lota
251
251
  displayNames: agentDisplayNames,
252
252
  shortDisplayNames: runtimeConfig.agents.shortDisplayNames,
253
253
  descriptions: runtimeConfig.agents.descriptions,
254
- managerModelId: runtimeConfig.agents.managerModelId,
254
+ routerModelId: runtimeConfig.agents.routerModelId,
255
255
  teamConsultParticipants: runtimeConfig.agents.teamConsultParticipants,
256
256
  getCoreWorkstreamProfile: runtimeConfig.agents.getCoreWorkstreamProfile,
257
257
  })
@@ -176,7 +176,7 @@ const agentsConfigSchema = z
176
176
  descriptions: z
177
177
  .custom<Record<string, string>>(isStringRecord, { error: 'agents.descriptions must be a string record' })
178
178
  .optional(),
179
- managerModelId: z.string().trim().min(1).optional(),
179
+ routerModelId: z.string().trim().min(1).optional(),
180
180
  teamConsultParticipants: z.array(z.string().trim().min(1)),
181
181
  getCoreWorkstreamProfile: z
182
182
  .custom<(coreType: string) => CoreWorkstreamProfile>(isFunction, {
@@ -14,6 +14,7 @@ import type { PrepareStepFunction, StopCondition, ToolLoopAgent, ToolSet, UIMess
14
14
  import type { CoreWorkstreamProfile } from '../config/agent-defaults'
15
15
  import {
16
16
  agentDisplayNames,
17
+ agentRoster,
17
18
  buildAgentTools,
18
19
  createAgent,
19
20
  getLeadAgentId,
@@ -58,7 +59,7 @@ import type { WorkstreamState } from '../runtime/workstream-state'
58
59
  import { assembleWorkstreamTurnContext } from '../runtime/workstream-turn-context'
59
60
  import { chatRunRegistry } from '../services/chat-run-registry.service'
60
61
  import type { NormalizedWorkstream, WorkstreamRecord } from '../services/workstream.types'
61
- import { triageWorkstreamMessage, checkForNextAgent } from '../system-agents/workstream-manager.agent'
62
+ import { triageWorkstreamMessage, checkForNextAgent } from '../system-agents/workstream-router.agent'
62
63
  import { safeEnqueue } from '../utils/async'
63
64
  import { AppError } from '../utils/errors'
64
65
  import { attachmentService } from './attachment.service'
@@ -911,7 +912,7 @@ export async function prepareWorkstreamRunCore(params: WorkstreamRunCoreParams):
911
912
  } else {
912
913
  // Multi-agent orchestration for group workstreams
913
914
  const wsMembers = (workstream as { members?: string[] }).members ?? []
914
- const members = wsMembers.length > 0 ? wsMembers : [visibleWorkstreamAgentId ?? defaultLeadAgentId]
915
+ const members = wsMembers.length > 0 ? wsMembers : [...agentRoster]
915
916
  const fallbackAgentId = coreWorkstreamProfile?.config.agentId ?? defaultLeadAgentId
916
917
 
917
918
  const recentContext = currentMessages
@@ -10,4 +10,4 @@ export * from './researcher.agent'
10
10
  export * from './skill-extractor.agent'
11
11
  export * from './skill-manager.agent'
12
12
  export * from './title-generator.agent'
13
- export * from './workstream-manager.agent'
13
+ export * from './workstream-router.agent'
@@ -3,7 +3,7 @@ import { z } from 'zod'
3
3
 
4
4
  import { aiGatewayChatModel } from '../ai-gateway/ai-gateway'
5
5
  import { buildAiGatewayDirectCacheHeaders } from '../ai-gateway/cache-headers'
6
- import { agentDescriptions, agentDisplayNames, managerModelId } from '../config/agent-defaults'
6
+ import { agentDescriptions, agentDisplayNames, routerModelId } from '../config/agent-defaults'
7
7
  import {
8
8
  OPENROUTER_FAST_REASONING_MODEL_ID,
9
9
  OPENROUTER_XHIGH_REASONING_PROVIDER_OPTIONS,
@@ -22,8 +22,8 @@ const CheckResultSchema = z.object({
22
22
  routingContext: z.string().optional(),
23
23
  })
24
24
 
25
- export type ManagerTriageResult = z.infer<typeof TriageResultSchema>
26
- export type ManagerCheckResult = z.infer<typeof CheckResultSchema>
25
+ export type RouterTriageResult = z.infer<typeof TriageResultSchema>
26
+ export type RouterCheckResult = z.infer<typeof CheckResultSchema>
27
27
 
28
28
  // ---------------------------------------------------------------------------
29
29
  // Helpers
@@ -75,15 +75,20 @@ Format: {"done":true} or {"done":false,"agentId":"<id>","routingContext":"<1-sen
75
75
  // Agent functions
76
76
  // ---------------------------------------------------------------------------
77
77
 
78
- function createManagerAgent(systemPrompt: string) {
79
- const modelId = managerModelId ?? OPENROUTER_FAST_REASONING_MODEL_ID
80
- const providerOptions = managerModelId
81
- ? OPENROUTER_XHIGH_REASONING_PROVIDER_OPTIONS
78
+ function createRouterAgent(systemPrompt: string) {
79
+ const modelId = routerModelId ?? OPENROUTER_FAST_REASONING_MODEL_ID
80
+ const providerOptions = routerModelId
81
+ ? {
82
+ openai: {
83
+ ...OPENROUTER_XHIGH_REASONING_PROVIDER_OPTIONS.openai,
84
+ provider: { order: ['groq'], allow_fallbacks: true },
85
+ },
86
+ }
82
87
  : OPENROUTER_HIGH_REASONING_PROVIDER_OPTIONS
83
88
  return new ToolLoopAgent({
84
- id: 'workstream-manager',
89
+ id: 'workstream-router',
85
90
  model: aiGatewayChatModel(modelId),
86
- headers: buildAiGatewayDirectCacheHeaders('workstream-manager'),
91
+ headers: buildAiGatewayDirectCacheHeaders('workstream-router'),
87
92
  providerOptions,
88
93
  instructions: systemPrompt,
89
94
  maxOutputTokens: 256,
@@ -95,7 +100,7 @@ export async function triageWorkstreamMessage(params: {
95
100
  members: readonly string[]
96
101
  messageText: string
97
102
  recentContext?: string
98
- }): Promise<ManagerTriageResult | null> {
103
+ }): Promise<RouterTriageResult | null> {
99
104
  const membersDesc = buildMembersDescription(params.members)
100
105
  const prompt = [
101
106
  `Workstream: "${params.workstreamTitle}"`,
@@ -106,7 +111,7 @@ export async function triageWorkstreamMessage(params: {
106
111
  .filter(Boolean)
107
112
  .join('\n\n')
108
113
 
109
- const agent = createManagerAgent(TRIAGE_SYSTEM_PROMPT)
114
+ const agent = createRouterAgent(TRIAGE_SYSTEM_PROMPT)
110
115
  const result = await agent.generate({ messages: [{ role: 'user', content: prompt }], timeout: { totalMs: 30_000 } })
111
116
 
112
117
  const json = extractJson(typeof result.text === 'string' ? result.text : '')
@@ -124,7 +129,7 @@ export async function checkForNextAgent(params: {
124
129
  messageText: string
125
130
  respondedAgents: string[]
126
131
  lastResponseSummary: string
127
- }): Promise<ManagerCheckResult> {
132
+ }): Promise<RouterCheckResult> {
128
133
  const remainingMembers = params.members.filter((id) => !params.respondedAgents.includes(id))
129
134
  if (remainingMembers.length === 0) return { done: true }
130
135
 
@@ -139,7 +144,7 @@ export async function checkForNextAgent(params: {
139
144
  `Last response summary: "${params.lastResponseSummary}"`,
140
145
  ].join('\n\n')
141
146
 
142
- const agent = createManagerAgent(CHECK_SYSTEM_PROMPT)
147
+ const agent = createRouterAgent(CHECK_SYSTEM_PROMPT)
143
148
  const result = await agent.generate({ messages: [{ role: 'user', content: prompt }], timeout: { totalMs: 30_000 } })
144
149
 
145
150
  const json = extractJson(typeof result.text === 'string' ? result.text : '')