@lota-sdk/core 0.1.5
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/infrastructure/schema/00_workstream.surql +55 -0
- package/infrastructure/schema/01_memory.surql +47 -0
- package/infrastructure/schema/02_execution_plan.surql +62 -0
- package/infrastructure/schema/03_learned_skill.surql +32 -0
- package/infrastructure/schema/04_runtime_bootstrap.surql +8 -0
- package/package.json +128 -0
- package/src/ai/definitions.ts +308 -0
- package/src/bifrost/bifrost.ts +256 -0
- package/src/config/agent-defaults.ts +99 -0
- package/src/config/constants.ts +33 -0
- package/src/config/env-shapes.ts +122 -0
- package/src/config/logger.ts +29 -0
- package/src/config/model-constants.ts +31 -0
- package/src/config/search.ts +17 -0
- package/src/config/workstream-defaults.ts +68 -0
- package/src/db/base.service.ts +55 -0
- package/src/db/cursor-pagination.ts +73 -0
- package/src/db/memory-query-builder.ts +207 -0
- package/src/db/memory-store.helpers.ts +118 -0
- package/src/db/memory-store.rows.ts +29 -0
- package/src/db/memory-store.ts +974 -0
- package/src/db/memory-types.ts +193 -0
- package/src/db/memory.ts +505 -0
- package/src/db/record-id.ts +78 -0
- package/src/db/service.ts +932 -0
- package/src/db/startup.ts +152 -0
- package/src/db/tables.ts +20 -0
- package/src/document/org-document-chunking.ts +224 -0
- package/src/document/parsing.ts +40 -0
- package/src/embeddings/provider.ts +76 -0
- package/src/index.ts +302 -0
- package/src/queues/context-compaction.queue.ts +82 -0
- package/src/queues/document-processor.queue.ts +118 -0
- package/src/queues/memory-consolidation.queue.ts +65 -0
- package/src/queues/post-chat-memory.queue.ts +128 -0
- package/src/queues/recent-activity-title-refinement.queue.ts +69 -0
- package/src/queues/regular-chat-memory-digest.config.ts +12 -0
- package/src/queues/regular-chat-memory-digest.queue.ts +73 -0
- package/src/queues/skill-extraction.config.ts +9 -0
- package/src/queues/skill-extraction.queue.ts +62 -0
- package/src/redis/connection.ts +176 -0
- package/src/redis/index.ts +30 -0
- package/src/redis/org-memory-lock.ts +43 -0
- package/src/redis/redis-lease-lock.ts +158 -0
- package/src/runtime/agent-contract.ts +1 -0
- package/src/runtime/agent-prompt-context.ts +119 -0
- package/src/runtime/agent-runtime-policy.ts +192 -0
- package/src/runtime/agent-stream-helpers.ts +117 -0
- package/src/runtime/agent-types.ts +22 -0
- package/src/runtime/approval-continuation.ts +16 -0
- package/src/runtime/chat-attachments.ts +46 -0
- package/src/runtime/chat-message.ts +10 -0
- package/src/runtime/chat-request-routing.ts +21 -0
- package/src/runtime/chat-run-orchestration.ts +25 -0
- package/src/runtime/chat-run-registry.ts +20 -0
- package/src/runtime/chat-types.ts +18 -0
- package/src/runtime/context-compaction-constants.ts +11 -0
- package/src/runtime/context-compaction-runtime.ts +86 -0
- package/src/runtime/context-compaction.ts +909 -0
- package/src/runtime/execution-plan.ts +59 -0
- package/src/runtime/helper-model.ts +405 -0
- package/src/runtime/indexed-repositories-policy.ts +28 -0
- package/src/runtime/instruction-sections.ts +8 -0
- package/src/runtime/llm-content.ts +71 -0
- package/src/runtime/memory-block.ts +264 -0
- package/src/runtime/memory-digest-policy.ts +14 -0
- package/src/runtime/memory-format.ts +8 -0
- package/src/runtime/memory-pipeline.ts +570 -0
- package/src/runtime/memory-prompts-fact.ts +47 -0
- package/src/runtime/memory-prompts-parse.ts +3 -0
- package/src/runtime/memory-prompts-update.ts +37 -0
- package/src/runtime/memory-scope.ts +43 -0
- package/src/runtime/plugin-types.ts +10 -0
- package/src/runtime/retrieval-adapters.ts +25 -0
- package/src/runtime/retrieval-pipeline.ts +3 -0
- package/src/runtime/runtime-extensions.ts +154 -0
- package/src/runtime/skill-extraction-policy.ts +3 -0
- package/src/runtime/team-consultation-orchestrator.ts +245 -0
- package/src/runtime/team-consultation-prompts.ts +32 -0
- package/src/runtime/title-helpers.ts +12 -0
- package/src/runtime/turn-lifecycle.ts +28 -0
- package/src/runtime/workstream-chat-helpers.ts +187 -0
- package/src/runtime/workstream-routing-policy.ts +301 -0
- package/src/runtime/workstream-state.ts +261 -0
- package/src/services/attachment.service.ts +159 -0
- package/src/services/chat-attachments.service.ts +17 -0
- package/src/services/chat-run-registry.service.ts +3 -0
- package/src/services/context-compaction-runtime.ts +13 -0
- package/src/services/context-compaction.service.ts +115 -0
- package/src/services/document-chunk.service.ts +141 -0
- package/src/services/execution-plan.service.ts +890 -0
- package/src/services/learned-skill.service.ts +328 -0
- package/src/services/memory-assessment.service.ts +43 -0
- package/src/services/memory.service.ts +807 -0
- package/src/services/memory.utils.ts +84 -0
- package/src/services/mutating-approval.service.ts +110 -0
- package/src/services/recent-activity-title.service.ts +74 -0
- package/src/services/recent-activity.service.ts +397 -0
- package/src/services/workstream-change-tracker.service.ts +313 -0
- package/src/services/workstream-message.service.ts +283 -0
- package/src/services/workstream-title.service.ts +58 -0
- package/src/services/workstream-turn-preparation.ts +1340 -0
- package/src/services/workstream-turn.ts +37 -0
- package/src/services/workstream.service.ts +854 -0
- package/src/services/workstream.types.ts +118 -0
- package/src/storage/attachment-parser.ts +101 -0
- package/src/storage/attachment-storage.service.ts +391 -0
- package/src/storage/attachments.types.ts +11 -0
- package/src/storage/attachments.utils.ts +58 -0
- package/src/storage/generated-document-storage.service.ts +55 -0
- package/src/system-agents/agent-result.ts +27 -0
- package/src/system-agents/context-compacter.agent.ts +46 -0
- package/src/system-agents/delegated-agent-factory.ts +177 -0
- package/src/system-agents/helper-agent-options.ts +20 -0
- package/src/system-agents/memory-reranker.agent.ts +38 -0
- package/src/system-agents/memory.agent.ts +58 -0
- package/src/system-agents/recent-activity-title-refiner.agent.ts +53 -0
- package/src/system-agents/regular-chat-memory-digest.agent.ts +75 -0
- package/src/system-agents/researcher.agent.ts +34 -0
- package/src/system-agents/skill-extractor.agent.ts +88 -0
- package/src/system-agents/skill-manager.agent.ts +80 -0
- package/src/system-agents/title-generator.agent.ts +42 -0
- package/src/system-agents/workstream-tracker.agent.ts +58 -0
- package/src/tools/execution-plan.tool.ts +163 -0
- package/src/tools/fetch-webpage.tool.ts +132 -0
- package/src/tools/firecrawl-client.ts +12 -0
- package/src/tools/memory-block.tool.ts +55 -0
- package/src/tools/read-file-parts.tool.ts +80 -0
- package/src/tools/remember-memory.tool.ts +85 -0
- package/src/tools/research-topic.tool.ts +15 -0
- package/src/tools/search-tools.ts +55 -0
- package/src/tools/search-web.tool.ts +175 -0
- package/src/tools/team-think.tool.ts +125 -0
- package/src/tools/tool-contract.ts +21 -0
- package/src/tools/user-questions.tool.ts +18 -0
- package/src/utils/async.ts +50 -0
- package/src/utils/date-time.ts +34 -0
- package/src/utils/error.ts +10 -0
- package/src/utils/errors.ts +28 -0
- package/src/utils/hono-error-handler.ts +71 -0
- package/src/utils/string.ts +51 -0
- package/src/workers/bootstrap.ts +44 -0
- package/src/workers/memory-consolidation.worker.ts +318 -0
- package/src/workers/regular-chat-memory-digest.helpers.ts +100 -0
- package/src/workers/regular-chat-memory-digest.runner.ts +363 -0
- package/src/workers/regular-chat-memory-digest.worker.ts +22 -0
- package/src/workers/skill-extraction.runner.ts +331 -0
- package/src/workers/skill-extraction.worker.ts +22 -0
- package/src/workers/utils/repo-indexer-chunker.ts +331 -0
- package/src/workers/utils/repo-structure-extractor.ts +645 -0
- package/src/workers/utils/repomix-process-concurrency.ts +65 -0
- package/src/workers/utils/sandbox-error.ts +5 -0
- package/src/workers/worker-utils.ts +182 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import path from 'node:path'
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
|
|
4
|
+
import type { Job, Worker } from 'bullmq'
|
|
5
|
+
|
|
6
|
+
import { chatLogger } from '../config/logger'
|
|
7
|
+
|
|
8
|
+
const DEFAULT_SHUTDOWN_TIMEOUT_MS = 10_000
|
|
9
|
+
const MAX_TRACE_STRING_CHARS = 2_000
|
|
10
|
+
const MAX_TRACE_ARRAY_ITEMS = 12
|
|
11
|
+
const MAX_TRACE_OBJECT_KEYS = 24
|
|
12
|
+
const MAX_TRACE_DEPTH = 4
|
|
13
|
+
|
|
14
|
+
export function getWorkerPath(workerName: string): string {
|
|
15
|
+
return fileURLToPath(new URL(path.join('.', workerName), import.meta.url))
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface WorkerHandle {
|
|
19
|
+
worker: Worker
|
|
20
|
+
shutdown: () => Promise<void>
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
interface TracedWorkerJobLike {
|
|
24
|
+
id?: unknown
|
|
25
|
+
name: string
|
|
26
|
+
attemptsMade: number | null | undefined
|
|
27
|
+
data?: unknown
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function truncateTraceString(value: string, maxChars = MAX_TRACE_STRING_CHARS): string {
|
|
31
|
+
if (value.length <= maxChars) return value
|
|
32
|
+
return `${value.slice(0, maxChars - 3)}...`
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function normalizeTraceValue(value: unknown, depth = 0): unknown {
|
|
36
|
+
if (value === null || value === undefined) return value
|
|
37
|
+
if (typeof value === 'string') return truncateTraceString(value)
|
|
38
|
+
if (typeof value === 'number' || typeof value === 'boolean') return value
|
|
39
|
+
if (typeof value === 'bigint') return value.toString()
|
|
40
|
+
if (typeof value === 'symbol') return value.description ? `Symbol(${value.description})` : 'Symbol()'
|
|
41
|
+
if (typeof value === 'function') return value.name ? `[function ${value.name}]` : '[function anonymous]'
|
|
42
|
+
if (value instanceof Date) return value.toISOString()
|
|
43
|
+
|
|
44
|
+
if (depth >= MAX_TRACE_DEPTH) {
|
|
45
|
+
if (Array.isArray(value)) return `[array(${value.length})]`
|
|
46
|
+
return '[object]'
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (Array.isArray(value)) {
|
|
50
|
+
return value.slice(0, MAX_TRACE_ARRAY_ITEMS).map((item) => normalizeTraceValue(item, depth + 1))
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (!(value instanceof Date) && typeof value === 'object') {
|
|
54
|
+
const record = value as Record<string, unknown>
|
|
55
|
+
return Object.fromEntries(
|
|
56
|
+
Object.entries(record)
|
|
57
|
+
.slice(0, MAX_TRACE_OBJECT_KEYS)
|
|
58
|
+
.map(([key, entryValue]) => [key, normalizeTraceValue(entryValue, depth + 1)]),
|
|
59
|
+
)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return '[unknown]'
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function serializeTraceValue(value: unknown): string {
|
|
66
|
+
const serialized = JSON.stringify(normalizeTraceValue(value))
|
|
67
|
+
return truncateTraceString(serialized || 'null')
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function traceTextValue(value: unknown): string {
|
|
71
|
+
if (typeof value === 'string') return truncateTraceString(value)
|
|
72
|
+
if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') {
|
|
73
|
+
return truncateTraceString(String(value))
|
|
74
|
+
}
|
|
75
|
+
if (value instanceof Date) return value.toISOString()
|
|
76
|
+
return serializeTraceValue(value)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function buildWorkerObservationMetadata(
|
|
80
|
+
queueName: string,
|
|
81
|
+
job: { id?: unknown; name: string; attemptsMade: number | null | undefined },
|
|
82
|
+
): Record<string, string> {
|
|
83
|
+
return {
|
|
84
|
+
queue: traceTextValue(queueName),
|
|
85
|
+
job_name: traceTextValue(job.name),
|
|
86
|
+
...(job.id !== undefined ? { job_id: traceTextValue(job.id) } : {}),
|
|
87
|
+
...(job.attemptsMade !== null && job.attemptsMade !== undefined
|
|
88
|
+
? { attempts_made: traceTextValue(job.attemptsMade) }
|
|
89
|
+
: {}),
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export const attachWorkerEvents = (worker: Worker, name: string, logger: typeof chatLogger = chatLogger) => {
|
|
94
|
+
worker.on('ready', () => {
|
|
95
|
+
logger.info`${name} worker ready`
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
worker.on('active', (job) => {
|
|
99
|
+
logger.debug`${name} job active (${job.id})`
|
|
100
|
+
})
|
|
101
|
+
|
|
102
|
+
worker.on('completed', (job) => {
|
|
103
|
+
logger.debug`${name} job completed (${job.id})`
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
worker.on('failed', (job: Job | undefined, error) => {
|
|
107
|
+
const attemptsMade = job?.attemptsMade
|
|
108
|
+
const attempts = job?.opts.attempts
|
|
109
|
+
const failedReason = job?.failedReason
|
|
110
|
+
const stacktrace = job?.stacktrace
|
|
111
|
+
|
|
112
|
+
const attemptInfo =
|
|
113
|
+
typeof attemptsMade === 'number' || typeof attempts === 'number'
|
|
114
|
+
? ` attempt=${attemptsMade ?? '?'}${attempts ? `/${attempts}` : ''}`
|
|
115
|
+
: ''
|
|
116
|
+
|
|
117
|
+
const reasonInfo = typeof failedReason === 'string' && failedReason.length > 0 ? ` reason="${failedReason}"` : ''
|
|
118
|
+
|
|
119
|
+
const latestStack =
|
|
120
|
+
Array.isArray(stacktrace) && stacktrace.length > 0 ? stacktrace.at(-1)?.trim() || undefined : undefined
|
|
121
|
+
const stackInfo = latestStack ? ` stacktrace="${latestStack}"` : ''
|
|
122
|
+
|
|
123
|
+
logger.error`${name} job failed (${job?.id})${attemptInfo}:${reasonInfo}${stackInfo} ${error}`
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
worker.on('error', (error) => {
|
|
127
|
+
logger.error`${name} worker error: ${error}`
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
worker.on('stalled', (jobId) => {
|
|
131
|
+
logger.warn`${name} job stalled (${jobId})`
|
|
132
|
+
})
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export const createWorkerShutdown = (worker: Worker, name: string, logger: typeof chatLogger = chatLogger) => {
|
|
136
|
+
return async () => {
|
|
137
|
+
logger.info`Shutting down ${name} worker`
|
|
138
|
+
await worker.close()
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export function createTracedWorkerProcessor<TJob extends TracedWorkerJobLike>(
|
|
143
|
+
_queueName: string,
|
|
144
|
+
processor: (job: TJob) => Promise<void>,
|
|
145
|
+
): (job: TJob) => Promise<void> {
|
|
146
|
+
return async (job: TJob) => processor(job)
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export const registerShutdownSignals = ({
|
|
150
|
+
name,
|
|
151
|
+
shutdown,
|
|
152
|
+
logger = chatLogger,
|
|
153
|
+
timeoutMs = DEFAULT_SHUTDOWN_TIMEOUT_MS,
|
|
154
|
+
}: {
|
|
155
|
+
name: string
|
|
156
|
+
shutdown: () => Promise<void>
|
|
157
|
+
logger?: typeof chatLogger
|
|
158
|
+
timeoutMs?: number
|
|
159
|
+
}) => {
|
|
160
|
+
let shuttingDown = false
|
|
161
|
+
|
|
162
|
+
const handleSignal = () => {
|
|
163
|
+
if (shuttingDown) return
|
|
164
|
+
shuttingDown = true
|
|
165
|
+
const timeout = setTimeout(() => {
|
|
166
|
+
logger.warn`Forced shutdown after ${timeoutMs}ms`
|
|
167
|
+
process.exit(0)
|
|
168
|
+
}, timeoutMs)
|
|
169
|
+
|
|
170
|
+
shutdown()
|
|
171
|
+
.catch((err: unknown) => {
|
|
172
|
+
logger.error`Failed to shutdown ${name} worker: ${err}`
|
|
173
|
+
})
|
|
174
|
+
.finally(() => {
|
|
175
|
+
clearTimeout(timeout)
|
|
176
|
+
process.exit(0)
|
|
177
|
+
})
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
process.once('SIGINT', () => handleSignal())
|
|
181
|
+
process.once('SIGTERM', () => handleSignal())
|
|
182
|
+
}
|