@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.
- package/package.json +11 -12
- package/src/ai/embedding-cache.ts +96 -22
- package/src/ai-gateway/ai-gateway.ts +766 -223
- package/src/config/agent-defaults.ts +189 -75
- package/src/config/agent-types.ts +54 -4
- package/src/config/background-processing.ts +1 -1
- package/src/config/constants.ts +8 -2
- package/src/config/index.ts +0 -1
- package/src/config/logger.ts +299 -19
- package/src/config/thread-defaults.ts +40 -20
- package/src/create-runtime.ts +200 -449
- package/src/db/base.service.ts +52 -28
- package/src/db/cursor-pagination.ts +71 -30
- package/src/db/memory-query-builder.ts +2 -1
- package/src/db/memory-store.helpers.ts +4 -7
- package/src/db/memory-store.ts +868 -601
- package/src/db/memory.ts +396 -280
- package/src/db/record-id.ts +32 -10
- package/src/db/schema-fingerprint.ts +30 -12
- package/src/db/service-normalization.ts +288 -0
- package/src/db/service.ts +912 -779
- package/src/db/startup.ts +153 -68
- package/src/db/transaction-conflict.ts +15 -0
- package/src/effect/awaitable-effect.ts +96 -0
- package/src/effect/errors.ts +121 -0
- package/src/effect/helpers.ts +123 -0
- package/src/effect/index.ts +24 -0
- package/src/effect/layers.ts +238 -0
- package/src/effect/runtime-ref.ts +25 -0
- package/src/effect/runtime.ts +46 -0
- package/src/effect/services.ts +61 -0
- package/src/effect/zod.ts +43 -0
- package/src/embeddings/provider.ts +128 -83
- package/src/index.ts +48 -1
- package/src/openrouter/direct-provider.ts +11 -35
- package/src/queues/autonomous-job.queue.ts +117 -73
- package/src/queues/context-compaction.queue.ts +50 -17
- package/src/queues/delayed-node-promotion.queue.ts +46 -17
- package/src/queues/document-processor.queue.ts +52 -77
- package/src/queues/memory-consolidation.queue.ts +47 -32
- package/src/queues/organization-learning.queue.ts +26 -4
- package/src/queues/plan-agent-heartbeat.queue.ts +71 -24
- package/src/queues/plan-scheduler.queue.ts +97 -33
- package/src/queues/post-chat-memory.queue.ts +56 -26
- package/src/queues/queue-factory.ts +227 -59
- package/src/queues/standalone-worker.ts +39 -0
- package/src/queues/title-generation.queue.ts +45 -11
- package/src/redis/connection.ts +182 -113
- package/src/redis/index.ts +6 -8
- package/src/redis/org-memory-lock.ts +60 -27
- package/src/redis/redis-lease-lock.ts +200 -121
- package/src/redis/runtime-connection.ts +20 -0
- package/src/redis/stream-context.ts +92 -46
- package/src/runtime/agent-identity-overrides.ts +2 -2
- package/src/runtime/agent-runtime-policy.ts +5 -2
- package/src/runtime/agent-stream-helpers.ts +24 -9
- package/src/runtime/chat-run-orchestration.ts +102 -19
- package/src/runtime/chat-run-registry.ts +36 -2
- package/src/runtime/context-compaction/context-compaction-runtime.ts +107 -0
- package/src/runtime/{context-compaction.ts → context-compaction/context-compaction.ts} +161 -94
- package/src/runtime/domain-layer.ts +192 -0
- package/src/runtime/execution-plan-visibility.ts +2 -2
- package/src/runtime/execution-plan.ts +42 -15
- package/src/runtime/graph-designer.ts +16 -4
- package/src/runtime/helper-model.ts +139 -48
- package/src/runtime/index.ts +7 -8
- package/src/runtime/indexed-repositories-policy.ts +3 -3
- package/src/runtime/{memory-block.ts → memory/memory-block.ts} +50 -36
- package/src/runtime/{memory-digest-policy.ts → memory/memory-digest-policy.ts} +1 -1
- package/src/runtime/{memory-pipeline.ts → memory/memory-pipeline.ts} +54 -67
- package/src/runtime/{memory-prompts-fact.ts → memory/memory-prompts-fact.ts} +2 -2
- package/src/runtime/memory/memory-scope.ts +53 -0
- package/src/runtime/plugin-resolution.ts +124 -25
- package/src/runtime/plugin-types.ts +9 -1
- package/src/runtime/post-turn-side-effects.ts +177 -130
- package/src/runtime/retrieval-adapters.ts +40 -6
- package/src/runtime/runtime-accessors.ts +92 -0
- package/src/runtime/runtime-config.ts +150 -61
- package/src/runtime/runtime-extensions.ts +23 -25
- package/src/runtime/runtime-lifecycle.ts +124 -0
- package/src/runtime/runtime-services.ts +386 -0
- package/src/runtime/runtime-token.ts +47 -0
- package/src/runtime/social-chat/social-chat-agent-runner.ts +159 -0
- package/src/runtime/{social-chat-history.ts → social-chat/social-chat-history.ts} +51 -20
- package/src/runtime/social-chat/social-chat.ts +630 -0
- package/src/runtime/specialist-runner.ts +36 -10
- package/src/runtime/team-consultation/team-consultation-orchestrator.ts +433 -0
- package/src/runtime/{team-consultation-prompts.ts → team-consultation/team-consultation-prompts.ts} +6 -2
- package/src/runtime/thread-chat-helpers.ts +2 -2
- package/src/runtime/thread-plan-turn.ts +2 -1
- package/src/runtime/thread-turn-context.ts +183 -111
- package/src/runtime/turn-lifecycle.ts +93 -27
- package/src/services/agent-activity.service.ts +287 -203
- package/src/services/agent-executor.service.ts +253 -149
- package/src/services/artifact.service.ts +231 -149
- package/src/services/attachment.service.ts +171 -115
- package/src/services/autonomous-job.service.ts +890 -491
- package/src/services/background-work.service.ts +54 -0
- package/src/services/chat-run-registry.service.ts +13 -1
- package/src/services/context-compaction.service.ts +136 -86
- package/src/services/document-chunk.service.ts +151 -88
- package/src/services/execution-plan/execution-plan-approval.ts +26 -0
- package/src/services/execution-plan/execution-plan-context.ts +29 -0
- package/src/services/execution-plan/execution-plan-graph.ts +278 -0
- package/src/services/execution-plan/execution-plan-schedule.ts +84 -0
- package/src/services/execution-plan/execution-plan-spec.ts +75 -0
- package/src/services/execution-plan/execution-plan.service.ts +1041 -0
- package/src/services/feedback-loop.service.ts +132 -76
- package/src/services/global-orchestrator.service.ts +101 -168
- package/src/services/graph-full-routing.ts +193 -0
- package/src/services/index.ts +19 -21
- package/src/services/institutional-memory.service.ts +213 -125
- package/src/services/learned-skill.service.ts +368 -260
- package/src/services/memory/memory-conversation.ts +95 -0
- package/src/services/memory/memory-errors.ts +27 -0
- package/src/services/memory/memory-org-memory.ts +50 -0
- package/src/services/memory/memory-preseeded.ts +86 -0
- package/src/services/memory/memory-rerank.ts +297 -0
- package/src/services/{memory-utils.ts → memory/memory-utils.ts} +6 -5
- package/src/services/memory/memory.service.ts +674 -0
- package/src/services/memory/rerank.service.ts +201 -0
- package/src/services/monitoring-window.service.ts +92 -70
- package/src/services/mutating-approval.service.ts +62 -53
- package/src/services/node-workspace.service.ts +141 -98
- package/src/services/notification.service.ts +29 -16
- package/src/services/organization-member.service.ts +120 -66
- package/src/services/organization.service.ts +153 -77
- package/src/services/ownership-dispatcher.service.ts +456 -263
- package/src/services/plan/plan-agent-heartbeat.service.ts +234 -0
- package/src/services/plan/plan-agent-query.service.ts +322 -0
- package/src/services/{plan-approval.service.ts → plan/plan-approval.service.ts} +45 -22
- package/src/services/plan/plan-artifact.service.ts +60 -0
- package/src/services/plan/plan-builder.service.ts +76 -0
- package/src/services/plan/plan-checkpoint.service.ts +103 -0
- package/src/services/{plan-compiler.service.ts → plan/plan-compiler.service.ts} +26 -9
- package/src/services/plan/plan-completion-side-effects.ts +169 -0
- package/src/services/plan/plan-coordination.service.ts +181 -0
- package/src/services/plan/plan-cycle.service.ts +405 -0
- package/src/services/plan/plan-deadline.service.ts +533 -0
- package/src/services/plan/plan-event-delivery.service.ts +266 -0
- package/src/services/plan/plan-executor-context.ts +35 -0
- package/src/services/plan/plan-executor-graph.ts +522 -0
- package/src/services/plan/plan-executor-helpers.ts +307 -0
- package/src/services/plan/plan-executor-persistence.ts +209 -0
- package/src/services/plan/plan-executor.service.ts +1737 -0
- package/src/services/{plan-helpers.ts → plan/plan-helpers.ts} +1 -1
- package/src/services/{plan-run-data.ts → plan/plan-run-data.ts} +4 -4
- package/src/services/plan/plan-run-serialization.ts +15 -0
- package/src/services/plan/plan-run.service.ts +637 -0
- package/src/services/plan/plan-scheduler.service.ts +379 -0
- package/src/services/plan/plan-template.service.ts +224 -0
- package/src/services/plan/plan-transaction-events.ts +36 -0
- package/src/services/plan/plan-validator.service.ts +907 -0
- package/src/services/plan/plan-workspace.service.ts +131 -0
- package/src/services/plugin-executor.service.ts +102 -68
- package/src/services/quality-metrics.service.ts +112 -94
- package/src/services/queue-job.service.ts +288 -231
- package/src/services/recent-activity-title.service.ts +73 -36
- package/src/services/recent-activity.service.ts +274 -259
- package/src/services/skill-resolver.service.ts +38 -12
- package/src/services/social-chat-history.service.ts +190 -122
- package/src/services/system-executor.service.ts +96 -61
- package/src/services/thread/thread-active-run.ts +203 -0
- package/src/services/thread/thread-bootstrap.ts +385 -0
- package/src/services/thread/thread-listing.ts +199 -0
- package/src/services/thread/thread-memory-block.ts +130 -0
- package/src/services/thread/thread-message.service.ts +379 -0
- package/src/services/thread/thread-record-store.ts +155 -0
- package/src/services/thread/thread-title.service.ts +74 -0
- package/src/services/thread/thread-turn-execution.ts +280 -0
- package/src/services/thread/thread-turn-message-context.ts +73 -0
- package/src/services/thread/thread-turn-preparation.service.ts +1148 -0
- package/src/services/thread/thread-turn-streaming.ts +403 -0
- package/src/services/thread/thread-turn-tracing.ts +35 -0
- package/src/services/thread/thread-turn.ts +376 -0
- package/src/services/thread/thread.service.ts +344 -0
- package/src/services/user.service.ts +82 -32
- package/src/services/write-intent-validator.service.ts +63 -51
- package/src/storage/attachment-parser.ts +69 -27
- package/src/storage/attachment-storage.service.ts +334 -275
- package/src/storage/generated-document-storage.service.ts +66 -34
- package/src/system-agents/agent-result.ts +3 -1
- package/src/system-agents/context-compaction.agent.ts +3 -3
- package/src/system-agents/delegated-agent-factory.ts +159 -90
- package/src/system-agents/helper-agent-options.ts +1 -1
- package/src/system-agents/memory-reranker.agent.ts +3 -3
- package/src/system-agents/memory.agent.ts +3 -3
- package/src/system-agents/recent-activity-title-refiner.agent.ts +3 -3
- package/src/system-agents/regular-chat-memory-digest.agent.ts +3 -3
- package/src/system-agents/skill-extractor.agent.ts +3 -3
- package/src/system-agents/skill-manager.agent.ts +3 -3
- package/src/system-agents/thread-router.agent.ts +157 -113
- package/src/system-agents/title-generator.agent.ts +3 -3
- package/src/tools/execution-plan.tool.ts +241 -171
- package/src/tools/fetch-webpage.tool.ts +29 -18
- package/src/tools/firecrawl-client.ts +26 -6
- package/src/tools/index.ts +1 -0
- package/src/tools/memory-block.tool.ts +14 -6
- package/src/tools/plan-approval.tool.ts +57 -47
- package/src/tools/read-file-parts.tool.ts +44 -33
- package/src/tools/remember-memory.tool.ts +65 -45
- package/src/tools/search-web.tool.ts +33 -22
- package/src/tools/search.tool.ts +41 -29
- package/src/tools/team-think.tool.ts +125 -84
- package/src/tools/user-questions.tool.ts +4 -3
- package/src/tools/web-tool-shared.ts +6 -0
- package/src/utils/async.ts +25 -22
- package/src/utils/crypto.ts +21 -0
- package/src/utils/date-time.ts +40 -1
- package/src/utils/errors.ts +111 -20
- package/src/utils/hono-error-handler.ts +24 -39
- package/src/utils/index.ts +2 -1
- package/src/utils/null-proto-record.ts +41 -0
- package/src/utils/sse-keepalive.ts +124 -21
- package/src/workers/bootstrap.ts +164 -52
- package/src/workers/memory-consolidation.worker.ts +325 -237
- package/src/workers/organization-learning.worker.ts +50 -16
- package/src/workers/regular-chat-memory-digest.helpers.ts +28 -27
- package/src/workers/regular-chat-memory-digest.runner.ts +185 -114
- package/src/workers/skill-extraction.runner.ts +176 -93
- package/src/workers/utils/file-section-chunker.ts +8 -10
- package/src/workers/utils/repo-structure-extractor.ts +349 -260
- package/src/workers/utils/repomix-file-sections.ts +2 -2
- package/src/workers/utils/thread-message-query.ts +97 -38
- package/src/workers/worker-utils.ts +74 -31
- package/src/config/debug-logger.ts +0 -47
- package/src/config/search.ts +0 -3
- package/src/redis/connection-accessor.ts +0 -26
- package/src/runtime/agent-types.ts +0 -1
- package/src/runtime/context-compaction-runtime.ts +0 -87
- package/src/runtime/memory-scope.ts +0 -43
- package/src/runtime/social-chat-agent-runner.ts +0 -118
- package/src/runtime/social-chat.ts +0 -516
- package/src/runtime/team-consultation-orchestrator.ts +0 -272
- package/src/services/adaptive-playbook.service.ts +0 -152
- package/src/services/artifact-provenance.service.ts +0 -172
- package/src/services/chat-attachments.service.ts +0 -17
- package/src/services/context-compaction-runtime.singleton.ts +0 -13
- package/src/services/execution-plan.service.ts +0 -1118
- package/src/services/memory.service.ts +0 -914
- package/src/services/plan-agent-heartbeat.service.ts +0 -136
- package/src/services/plan-agent-query.service.ts +0 -267
- package/src/services/plan-artifact.service.ts +0 -50
- package/src/services/plan-builder.service.ts +0 -67
- package/src/services/plan-checkpoint.service.ts +0 -81
- package/src/services/plan-completion-side-effects.ts +0 -80
- package/src/services/plan-coordination.service.ts +0 -157
- package/src/services/plan-cycle.service.ts +0 -284
- package/src/services/plan-deadline.service.ts +0 -430
- package/src/services/plan-event-delivery.service.ts +0 -166
- package/src/services/plan-executor.service.ts +0 -1950
- package/src/services/plan-run.service.ts +0 -515
- package/src/services/plan-scheduler.service.ts +0 -240
- package/src/services/plan-template.service.ts +0 -177
- package/src/services/plan-validator.service.ts +0 -818
- package/src/services/plan-workspace.service.ts +0 -83
- package/src/services/rerank.service.ts +0 -156
- package/src/services/thread-message.service.ts +0 -275
- package/src/services/thread-plan-registry.service.ts +0 -22
- package/src/services/thread-title.service.ts +0 -39
- package/src/services/thread-turn-preparation.service.ts +0 -1147
- package/src/services/thread-turn.ts +0 -172
- package/src/services/thread.service.ts +0 -869
- package/src/utils/env.ts +0 -8
- /package/src/runtime/{context-compaction-constants.ts → context-compaction/context-compaction-constants.ts} +0 -0
- /package/src/runtime/{memory-format.ts → memory/memory-format.ts} +0 -0
- /package/src/runtime/{memory-prompts-parse.ts → memory/memory-prompts-parse.ts} +0 -0
- /package/src/runtime/{memory-prompts-update.ts → memory/memory-prompts-update.ts} +0 -0
- /package/src/runtime/{social-chat-prompts.ts → social-chat/social-chat-prompts.ts} +0 -0
- /package/src/services/{plan-node-spec.ts → plan/plan-node-spec.ts} +0 -0
- /package/src/services/{thread-constants.ts → thread/thread-constants.ts} +0 -0
- /package/src/services/{thread.types.ts → thread/thread.types.ts} +0 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import type { ToolSet } from 'ai'
|
|
2
|
+
import { Effect, Layer, Logger, References } from 'effect'
|
|
3
|
+
import { DevTools } from 'effect/unstable/devtools'
|
|
4
|
+
import { FetchHttpClient } from 'effect/unstable/http'
|
|
5
|
+
import { Otlp } from 'effect/unstable/observability'
|
|
6
|
+
|
|
7
|
+
import type { CoreThreadProfile } from '../config/agent-defaults'
|
|
8
|
+
import { resolveAgentConfig, resolveAgentFactoryConfig } from '../config/agent-defaults'
|
|
9
|
+
import type { AgentFactory, AgentRuntimeConfigProvider, AgentToolBuilder } from '../config/agent-types'
|
|
10
|
+
import { configureLotaLogger, getLotaLoggers, toEffectLogLevel } from '../config/logger'
|
|
11
|
+
import type { LotaLogLevel } from '../config/logger'
|
|
12
|
+
import { resolveThreadConfig } from '../config/thread-defaults'
|
|
13
|
+
import type { LotaThreadConfig } from '../config/thread-defaults'
|
|
14
|
+
import { LOTA_SDK_DATABASE_NAME } from '../db/sdk-database'
|
|
15
|
+
import type { SurrealDatabaseConfig } from '../db/service'
|
|
16
|
+
import { SurrealDBService } from '../db/service'
|
|
17
|
+
import type { CreateRedisConnectionManagerOptions } from '../redis/connection'
|
|
18
|
+
import { makeRedisConnectionManager } from '../redis/connection'
|
|
19
|
+
import type { ResolvedLotaRuntimeConfig } from '../runtime/runtime-config'
|
|
20
|
+
import type { LotaRuntimeAdapters, LotaRuntimeTurnHooks } from '../runtime/runtime-extensions'
|
|
21
|
+
import type { LotaRuntimeWorkerExtensions } from '../runtime/runtime-worker-registry'
|
|
22
|
+
import { QueueJobServiceLive } from '../services/queue-job.service'
|
|
23
|
+
import { getErrorMessage } from '../utils/errors'
|
|
24
|
+
import { DatabaseError } from './errors'
|
|
25
|
+
import {
|
|
26
|
+
AppLoggerTag,
|
|
27
|
+
AgentConfigServiceTag,
|
|
28
|
+
AgentFactoryServiceTag,
|
|
29
|
+
DatabaseServiceTag,
|
|
30
|
+
RedisServiceTag,
|
|
31
|
+
RuntimeAdaptersServiceTag,
|
|
32
|
+
RuntimeConfigServiceTag,
|
|
33
|
+
RuntimeWorkerExtensionsServiceTag,
|
|
34
|
+
ThreadConfigServiceTag,
|
|
35
|
+
ToolProvidersServiceTag,
|
|
36
|
+
TurnHooksServiceTag,
|
|
37
|
+
} from './services'
|
|
38
|
+
|
|
39
|
+
const EMPTY_TOOLS = {} as ToolSet
|
|
40
|
+
const EMPTY_WORKERS: LotaRuntimeWorkerExtensions = {}
|
|
41
|
+
|
|
42
|
+
export function DatabaseLive(config: SurrealDatabaseConfig) {
|
|
43
|
+
return Layer.effect(
|
|
44
|
+
DatabaseServiceTag,
|
|
45
|
+
Effect.acquireRelease(
|
|
46
|
+
Effect.try({
|
|
47
|
+
try: () => new SurrealDBService(config),
|
|
48
|
+
catch: (error) =>
|
|
49
|
+
new DatabaseError({ message: `Failed to create database service: ${getErrorMessage(error)}`, cause: error }),
|
|
50
|
+
}),
|
|
51
|
+
(databaseService) =>
|
|
52
|
+
Effect.ignore(
|
|
53
|
+
databaseService
|
|
54
|
+
.disconnect()
|
|
55
|
+
.pipe(
|
|
56
|
+
Effect.tapError((error) =>
|
|
57
|
+
Effect.logWarning(`Failed to clean up database service: ${getErrorMessage(error)}`),
|
|
58
|
+
),
|
|
59
|
+
),
|
|
60
|
+
),
|
|
61
|
+
),
|
|
62
|
+
)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function RedisLive(config: CreateRedisConnectionManagerOptions) {
|
|
66
|
+
return Layer.effect(RedisServiceTag, makeRedisConnectionManager(config))
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function AppLoggerLive(level: LotaLogLevel = 'info') {
|
|
70
|
+
// Sequence `configureLotaLogger(level)` before `getLotaLoggers()` inside a
|
|
71
|
+
// single Effect.sync so the log-level mutation is observed when the loggers
|
|
72
|
+
// are assembled. `Layer.mergeAll` builds in parallel, so splitting these
|
|
73
|
+
// across two sub-layers is an ordering hazard.
|
|
74
|
+
const AppLoggersLayer = Layer.effect(
|
|
75
|
+
AppLoggerTag,
|
|
76
|
+
Effect.sync(() => {
|
|
77
|
+
configureLotaLogger(level)
|
|
78
|
+
return getLotaLoggers()
|
|
79
|
+
}),
|
|
80
|
+
)
|
|
81
|
+
return Layer.mergeAll(
|
|
82
|
+
AppLoggersLayer,
|
|
83
|
+
Logger.layer([Logger.consolePretty()]),
|
|
84
|
+
Layer.succeed(References.MinimumLogLevel, toEffectLogLevel(level)),
|
|
85
|
+
)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export function RuntimeConfigLive(config: ResolvedLotaRuntimeConfig) {
|
|
89
|
+
return Layer.succeed(RuntimeConfigServiceTag, config)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export function AgentConfigLive(config: {
|
|
93
|
+
roster: readonly string[]
|
|
94
|
+
leadAgentId: string
|
|
95
|
+
displayNames: Record<string, string>
|
|
96
|
+
shortDisplayNames?: Record<string, string>
|
|
97
|
+
descriptions?: Record<string, string>
|
|
98
|
+
routerModelId?: string
|
|
99
|
+
teamConsultParticipants: readonly string[]
|
|
100
|
+
getCoreThreadProfile?: (coreType: string) => CoreThreadProfile
|
|
101
|
+
}) {
|
|
102
|
+
return Layer.succeed(AgentConfigServiceTag, resolveAgentConfig(config))
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export function AgentFactoryLive(config: {
|
|
106
|
+
createAgent?: AgentFactory
|
|
107
|
+
buildAgentTools?: AgentToolBuilder
|
|
108
|
+
getAgentRuntimeConfig?: AgentRuntimeConfigProvider
|
|
109
|
+
pluginRuntime?: Record<string, unknown>
|
|
110
|
+
}) {
|
|
111
|
+
return Layer.succeed(AgentFactoryServiceTag, resolveAgentFactoryConfig(config))
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export function ThreadConfigLive(params: { agentRoster: readonly string[]; config?: LotaThreadConfig }) {
|
|
115
|
+
return Layer.succeed(ThreadConfigServiceTag, resolveThreadConfig(params))
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export function RuntimeExtensionsLive(params: {
|
|
119
|
+
adapters?: LotaRuntimeAdapters
|
|
120
|
+
turnHooks?: LotaRuntimeTurnHooks
|
|
121
|
+
toolProviders?: ToolSet
|
|
122
|
+
extraWorkers?: LotaRuntimeWorkerExtensions
|
|
123
|
+
}) {
|
|
124
|
+
return Layer.mergeAll(
|
|
125
|
+
Layer.succeed(RuntimeAdaptersServiceTag, params.adapters ?? {}),
|
|
126
|
+
Layer.succeed(TurnHooksServiceTag, params.turnHooks ?? {}),
|
|
127
|
+
Layer.succeed(ToolProvidersServiceTag, params.toolProviders ?? EMPTY_TOOLS),
|
|
128
|
+
Layer.succeed(RuntimeWorkerExtensionsServiceTag, params.extraWorkers ?? EMPTY_WORKERS),
|
|
129
|
+
)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// ── Shared Infrastructure Layer Builders ─────────────────────────────
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Common config-to-Layer conversions shared by the runtime and sandboxed
|
|
136
|
+
* worker infrastructure builders. Covers logging, runtime config, agents,
|
|
137
|
+
* threads, database, and redis. Agent display names are overridable for
|
|
138
|
+
* the socialChat agent injection flow.
|
|
139
|
+
*/
|
|
140
|
+
function buildBaseConfigLayers(
|
|
141
|
+
runtimeConfig: ResolvedLotaRuntimeConfig,
|
|
142
|
+
options: {
|
|
143
|
+
resolvedAgentDisplayNames?: Record<string, string>
|
|
144
|
+
runtimeExtensions: Parameters<typeof RuntimeExtensionsLive>[0]
|
|
145
|
+
},
|
|
146
|
+
) {
|
|
147
|
+
return Layer.mergeAll(
|
|
148
|
+
AppLoggerLive(runtimeConfig.logging.level),
|
|
149
|
+
RuntimeConfigLive(runtimeConfig),
|
|
150
|
+
AgentConfigLive({
|
|
151
|
+
roster: runtimeConfig.agents.roster,
|
|
152
|
+
leadAgentId: runtimeConfig.agents.leadAgentId,
|
|
153
|
+
displayNames: options.resolvedAgentDisplayNames ?? runtimeConfig.agents.displayNames,
|
|
154
|
+
shortDisplayNames: runtimeConfig.agents.shortDisplayNames,
|
|
155
|
+
descriptions: runtimeConfig.agents.descriptions,
|
|
156
|
+
routerModelId: runtimeConfig.agents.routerModelId,
|
|
157
|
+
teamConsultParticipants: runtimeConfig.agents.teamConsultParticipants,
|
|
158
|
+
getCoreThreadProfile: runtimeConfig.agents.getCoreThreadProfile,
|
|
159
|
+
}),
|
|
160
|
+
AgentFactoryLive({
|
|
161
|
+
createAgent: runtimeConfig.agents.createAgent,
|
|
162
|
+
buildAgentTools: runtimeConfig.agents.buildAgentTools,
|
|
163
|
+
getAgentRuntimeConfig: runtimeConfig.agents.getAgentRuntimeConfig,
|
|
164
|
+
pluginRuntime: runtimeConfig.pluginRuntime,
|
|
165
|
+
}),
|
|
166
|
+
ThreadConfigLive({ agentRoster: runtimeConfig.agents.roster, config: runtimeConfig.threads }),
|
|
167
|
+
RuntimeExtensionsLive(options.runtimeExtensions),
|
|
168
|
+
DatabaseLive({
|
|
169
|
+
url: runtimeConfig.database.url,
|
|
170
|
+
namespace: runtimeConfig.database.namespace,
|
|
171
|
+
database: LOTA_SDK_DATABASE_NAME,
|
|
172
|
+
username: runtimeConfig.database.username,
|
|
173
|
+
password: runtimeConfig.database.password,
|
|
174
|
+
}),
|
|
175
|
+
RedisLive({ url: runtimeConfig.redis.url }),
|
|
176
|
+
)
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Builds the observability layer (OTLP + DevTools) from a runtime config.
|
|
181
|
+
* Returns an empty layer when no observability endpoints are configured.
|
|
182
|
+
*/
|
|
183
|
+
function buildObservabilityLayer(runtimeConfig: ResolvedLotaRuntimeConfig): Layer.Layer<never> {
|
|
184
|
+
let layer: Layer.Layer<never> = Layer.empty
|
|
185
|
+
const observability = runtimeConfig.observability
|
|
186
|
+
|
|
187
|
+
if (observability.otlpBaseUrl) {
|
|
188
|
+
layer = Layer.merge(
|
|
189
|
+
layer,
|
|
190
|
+
Otlp.layerJson({
|
|
191
|
+
baseUrl: observability.otlpBaseUrl,
|
|
192
|
+
resource: {
|
|
193
|
+
serviceName: observability.serviceName,
|
|
194
|
+
...(observability.serviceVersion ? { serviceVersion: observability.serviceVersion } : {}),
|
|
195
|
+
},
|
|
196
|
+
...(observability.otlpHeaders ? { headers: observability.otlpHeaders } : {}),
|
|
197
|
+
}).pipe(Layer.provide(FetchHttpClient.layer)),
|
|
198
|
+
)
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
if (observability.devToolsUrl && Bun.env.NODE_ENV !== 'production') {
|
|
202
|
+
layer = Layer.merge(layer, DevTools.layer(observability.devToolsUrl))
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
return layer
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Builds the full infrastructure layer used by `createLotaRuntime`. Combines
|
|
210
|
+
* all config, database, redis, agent, thread, and extension layers with the
|
|
211
|
+
* observability layer computed from the runtime config.
|
|
212
|
+
*/
|
|
213
|
+
export function buildInfrastructureLayer(
|
|
214
|
+
runtimeConfig: ResolvedLotaRuntimeConfig,
|
|
215
|
+
options: { resolvedAgentDisplayNames: Record<string, string> },
|
|
216
|
+
) {
|
|
217
|
+
return Layer.mergeAll(
|
|
218
|
+
buildBaseConfigLayers(runtimeConfig, {
|
|
219
|
+
resolvedAgentDisplayNames: options.resolvedAgentDisplayNames,
|
|
220
|
+
runtimeExtensions: {
|
|
221
|
+
adapters: runtimeConfig.runtimeAdapters,
|
|
222
|
+
turnHooks: runtimeConfig.turnHooks,
|
|
223
|
+
toolProviders: runtimeConfig.toolProviders ?? {},
|
|
224
|
+
extraWorkers: runtimeConfig.extraWorkers,
|
|
225
|
+
},
|
|
226
|
+
}),
|
|
227
|
+
buildObservabilityLayer(runtimeConfig),
|
|
228
|
+
)
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Builds the minimal infrastructure layer used by sandboxed workers.
|
|
233
|
+
* Omits observability and uses empty runtime extensions.
|
|
234
|
+
*/
|
|
235
|
+
export function buildWorkerInfrastructureLayer(runtimeConfig: ResolvedLotaRuntimeConfig) {
|
|
236
|
+
const infrastructureLayer = buildBaseConfigLayers(runtimeConfig, { runtimeExtensions: {} })
|
|
237
|
+
return QueueJobServiceLive.pipe(Layer.provideMerge(infrastructureLayer))
|
|
238
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ManagedRuntime } from 'effect'
|
|
2
|
+
|
|
3
|
+
// eslint-disable-next-line typescript-eslint/no-explicit-any -- ManagedRuntime is contravariant in R; `any` is the only valid wildcard
|
|
4
|
+
type SdkManagedRuntime = ManagedRuntime.ManagedRuntime<any, any>
|
|
5
|
+
|
|
6
|
+
let currentRuntime: SdkManagedRuntime | null = null
|
|
7
|
+
|
|
8
|
+
export function setCurrentRuntime<R, E>(runtime: ManagedRuntime.ManagedRuntime<R, E>): void {
|
|
9
|
+
currentRuntime = runtime as SdkManagedRuntime
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function clearCurrentRuntime(): void {
|
|
13
|
+
currentRuntime = null
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function getCurrentRuntime(): SdkManagedRuntime {
|
|
17
|
+
if (!currentRuntime) {
|
|
18
|
+
throw new Error('Lota Effect runtime is not configured. Call createLotaRuntime() first.')
|
|
19
|
+
}
|
|
20
|
+
return currentRuntime
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function getOptionalCurrentRuntime(): SdkManagedRuntime | null {
|
|
24
|
+
return currentRuntime
|
|
25
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Effect } from 'effect'
|
|
2
|
+
import type { Context, ManagedRuntime } from 'effect'
|
|
3
|
+
|
|
4
|
+
import { clearCurrentRuntime, getCurrentRuntime, getOptionalCurrentRuntime, setCurrentRuntime } from './runtime-ref'
|
|
5
|
+
|
|
6
|
+
export function setLotaSdkRuntime<R, E>(runtime: ManagedRuntime.ManagedRuntime<R, E>): void {
|
|
7
|
+
setCurrentRuntime(runtime)
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function clearLotaSdkRuntime(): void {
|
|
11
|
+
clearCurrentRuntime()
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function getOptionalLotaSdkRuntime() {
|
|
15
|
+
return getOptionalCurrentRuntime()
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** Returns the current managed runtime or throws. */
|
|
19
|
+
export function getLotaSdkRuntime() {
|
|
20
|
+
return getCurrentRuntime()
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function resolveLotaService<I, T>(tag: Context.Key<I, T>): T {
|
|
24
|
+
return getCurrentRuntime().runSync(Effect.service(tag))
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function resolveOptionalLotaService<I, T>(tag: Context.Key<I, T>): T | null {
|
|
28
|
+
const runtime = getOptionalCurrentRuntime()
|
|
29
|
+
return runtime ? runtime.runSync(Effect.service(tag)) : null
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function runPromiseWithOptionalLotaRuntime<A, E>(effect: Effect.Effect<A, E, never>): Promise<A> {
|
|
33
|
+
const runtime = getOptionalCurrentRuntime()
|
|
34
|
+
return runtime ? runtime.runPromise(effect) : Effect.runPromise(effect)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Run an effect as a Promise using the current managed runtime's context.
|
|
39
|
+
* The runtime must be initialized via `createLotaRuntime()` before any call.
|
|
40
|
+
*/
|
|
41
|
+
export function runPromise<A, E, R>(
|
|
42
|
+
effect: Effect.Effect<A, E, R>,
|
|
43
|
+
options?: { readonly signal?: AbortSignal },
|
|
44
|
+
): Promise<A> {
|
|
45
|
+
return getCurrentRuntime().runPromise(effect, options)
|
|
46
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { ToolSet } from 'ai'
|
|
2
|
+
import { Context } from 'effect'
|
|
3
|
+
|
|
4
|
+
import type { ResolvedAgentConfig } from '../config/agent-defaults'
|
|
5
|
+
import type { AgentFactory, AgentRuntimeConfigProvider, AgentToolBuilder } from '../config/agent-types'
|
|
6
|
+
import type { LotaLoggerSet } from '../config/logger'
|
|
7
|
+
import type { ResolvedThreadBootstrapConfig } from '../config/thread-defaults'
|
|
8
|
+
import type { SurrealDBService } from '../db/service'
|
|
9
|
+
import type { RedisConnectionManager } from '../redis/connection'
|
|
10
|
+
import type { ResolvedLotaRuntimeConfig } from '../runtime/runtime-config'
|
|
11
|
+
import type { LotaRuntimeAdapters, LotaRuntimeTurnHooks } from '../runtime/runtime-extensions'
|
|
12
|
+
import type { LotaRuntimeWorkerExtensions } from '../runtime/runtime-worker-registry'
|
|
13
|
+
|
|
14
|
+
export class DatabaseServiceTag extends Context.Service<DatabaseServiceTag, SurrealDBService>()(
|
|
15
|
+
'@lota-sdk/core/DatabaseService',
|
|
16
|
+
) {}
|
|
17
|
+
|
|
18
|
+
export class RedisServiceTag extends Context.Service<RedisServiceTag, RedisConnectionManager>()(
|
|
19
|
+
'@lota-sdk/core/RedisService',
|
|
20
|
+
) {}
|
|
21
|
+
|
|
22
|
+
export class AppLoggerTag extends Context.Service<AppLoggerTag, LotaLoggerSet>()('@lota-sdk/core/AppLogger') {}
|
|
23
|
+
|
|
24
|
+
export class RuntimeConfigServiceTag extends Context.Service<RuntimeConfigServiceTag, ResolvedLotaRuntimeConfig>()(
|
|
25
|
+
'@lota-sdk/core/RuntimeConfigService',
|
|
26
|
+
) {}
|
|
27
|
+
|
|
28
|
+
export class AgentConfigServiceTag extends Context.Service<AgentConfigServiceTag, ResolvedAgentConfig>()(
|
|
29
|
+
'@lota-sdk/core/AgentConfigService',
|
|
30
|
+
) {}
|
|
31
|
+
|
|
32
|
+
export class AgentFactoryServiceTag extends Context.Service<
|
|
33
|
+
AgentFactoryServiceTag,
|
|
34
|
+
{
|
|
35
|
+
readonly createAgent: AgentFactory
|
|
36
|
+
readonly buildAgentTools: AgentToolBuilder
|
|
37
|
+
readonly getAgentRuntimeConfig: AgentRuntimeConfigProvider
|
|
38
|
+
readonly pluginRuntime?: Record<string, unknown>
|
|
39
|
+
}
|
|
40
|
+
>()('@lota-sdk/core/AgentFactoryService') {}
|
|
41
|
+
|
|
42
|
+
export class ThreadConfigServiceTag extends Context.Service<ThreadConfigServiceTag, ResolvedThreadBootstrapConfig>()(
|
|
43
|
+
'@lota-sdk/core/ThreadConfigService',
|
|
44
|
+
) {}
|
|
45
|
+
|
|
46
|
+
export class RuntimeAdaptersServiceTag extends Context.Service<RuntimeAdaptersServiceTag, LotaRuntimeAdapters>()(
|
|
47
|
+
'@lota-sdk/core/RuntimeAdaptersService',
|
|
48
|
+
) {}
|
|
49
|
+
|
|
50
|
+
export class TurnHooksServiceTag extends Context.Service<TurnHooksServiceTag, LotaRuntimeTurnHooks>()(
|
|
51
|
+
'@lota-sdk/core/TurnHooksService',
|
|
52
|
+
) {}
|
|
53
|
+
|
|
54
|
+
export class ToolProvidersServiceTag extends Context.Service<ToolProvidersServiceTag, ToolSet>()(
|
|
55
|
+
'@lota-sdk/core/ToolProvidersService',
|
|
56
|
+
) {}
|
|
57
|
+
|
|
58
|
+
export class RuntimeWorkerExtensionsServiceTag extends Context.Service<
|
|
59
|
+
RuntimeWorkerExtensionsServiceTag,
|
|
60
|
+
LotaRuntimeWorkerExtensions
|
|
61
|
+
>()('@lota-sdk/core/RuntimeWorkerExtensionsService') {}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Effect } from 'effect'
|
|
2
|
+
import { ZodError } from 'zod'
|
|
3
|
+
import type { z } from 'zod'
|
|
4
|
+
|
|
5
|
+
import { ValidationError } from './errors'
|
|
6
|
+
import type { ValidationIssue } from './errors'
|
|
7
|
+
|
|
8
|
+
type ZodIssueLike = { readonly path: ReadonlyArray<PropertyKey>; readonly message: string }
|
|
9
|
+
|
|
10
|
+
function toValidationIssuePath(path: ReadonlyArray<PropertyKey>): string {
|
|
11
|
+
return path.map((segment) => String(segment)).join('.') || 'root'
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function getZodIssues(error: Pick<ZodError, 'issues'> | ReadonlyArray<ZodIssueLike>): ReadonlyArray<ZodIssueLike> {
|
|
15
|
+
return 'issues' in error ? error.issues : error
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function toValidationIssues(
|
|
19
|
+
error: Pick<ZodError, 'issues'> | ReadonlyArray<ZodIssueLike>,
|
|
20
|
+
): ReadonlyArray<ValidationIssue> {
|
|
21
|
+
return getZodIssues(error).map((issue) => ({ path: toValidationIssuePath(issue.path), message: issue.message }))
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function summarizeZodIssues(issues: ReadonlyArray<ZodIssueLike>, maxIssues = 5): string {
|
|
25
|
+
return issues
|
|
26
|
+
.slice(0, maxIssues)
|
|
27
|
+
.map((issue) => `${toValidationIssuePath(issue.path)}: ${issue.message}`)
|
|
28
|
+
.join('; ')
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function toValidationError(error: unknown, message?: string): ValidationError {
|
|
32
|
+
return new ValidationError({
|
|
33
|
+
message: message ?? (error instanceof ZodError ? 'Schema validation failed' : 'Validation failed'),
|
|
34
|
+
issues: error instanceof ZodError ? toValidationIssues(error) : undefined,
|
|
35
|
+
})
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function zodParse<TSchema extends z.ZodTypeAny>(
|
|
39
|
+
schema: TSchema,
|
|
40
|
+
value: unknown,
|
|
41
|
+
): Effect.Effect<z.infer<TSchema>, ValidationError> {
|
|
42
|
+
return Effect.try({ try: () => schema.parse(value), catch: toValidationError })
|
|
43
|
+
}
|