@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.
Files changed (153) hide show
  1. package/infrastructure/schema/00_workstream.surql +55 -0
  2. package/infrastructure/schema/01_memory.surql +47 -0
  3. package/infrastructure/schema/02_execution_plan.surql +62 -0
  4. package/infrastructure/schema/03_learned_skill.surql +32 -0
  5. package/infrastructure/schema/04_runtime_bootstrap.surql +8 -0
  6. package/package.json +128 -0
  7. package/src/ai/definitions.ts +308 -0
  8. package/src/bifrost/bifrost.ts +256 -0
  9. package/src/config/agent-defaults.ts +99 -0
  10. package/src/config/constants.ts +33 -0
  11. package/src/config/env-shapes.ts +122 -0
  12. package/src/config/logger.ts +29 -0
  13. package/src/config/model-constants.ts +31 -0
  14. package/src/config/search.ts +17 -0
  15. package/src/config/workstream-defaults.ts +68 -0
  16. package/src/db/base.service.ts +55 -0
  17. package/src/db/cursor-pagination.ts +73 -0
  18. package/src/db/memory-query-builder.ts +207 -0
  19. package/src/db/memory-store.helpers.ts +118 -0
  20. package/src/db/memory-store.rows.ts +29 -0
  21. package/src/db/memory-store.ts +974 -0
  22. package/src/db/memory-types.ts +193 -0
  23. package/src/db/memory.ts +505 -0
  24. package/src/db/record-id.ts +78 -0
  25. package/src/db/service.ts +932 -0
  26. package/src/db/startup.ts +152 -0
  27. package/src/db/tables.ts +20 -0
  28. package/src/document/org-document-chunking.ts +224 -0
  29. package/src/document/parsing.ts +40 -0
  30. package/src/embeddings/provider.ts +76 -0
  31. package/src/index.ts +302 -0
  32. package/src/queues/context-compaction.queue.ts +82 -0
  33. package/src/queues/document-processor.queue.ts +118 -0
  34. package/src/queues/memory-consolidation.queue.ts +65 -0
  35. package/src/queues/post-chat-memory.queue.ts +128 -0
  36. package/src/queues/recent-activity-title-refinement.queue.ts +69 -0
  37. package/src/queues/regular-chat-memory-digest.config.ts +12 -0
  38. package/src/queues/regular-chat-memory-digest.queue.ts +73 -0
  39. package/src/queues/skill-extraction.config.ts +9 -0
  40. package/src/queues/skill-extraction.queue.ts +62 -0
  41. package/src/redis/connection.ts +176 -0
  42. package/src/redis/index.ts +30 -0
  43. package/src/redis/org-memory-lock.ts +43 -0
  44. package/src/redis/redis-lease-lock.ts +158 -0
  45. package/src/runtime/agent-contract.ts +1 -0
  46. package/src/runtime/agent-prompt-context.ts +119 -0
  47. package/src/runtime/agent-runtime-policy.ts +192 -0
  48. package/src/runtime/agent-stream-helpers.ts +117 -0
  49. package/src/runtime/agent-types.ts +22 -0
  50. package/src/runtime/approval-continuation.ts +16 -0
  51. package/src/runtime/chat-attachments.ts +46 -0
  52. package/src/runtime/chat-message.ts +10 -0
  53. package/src/runtime/chat-request-routing.ts +21 -0
  54. package/src/runtime/chat-run-orchestration.ts +25 -0
  55. package/src/runtime/chat-run-registry.ts +20 -0
  56. package/src/runtime/chat-types.ts +18 -0
  57. package/src/runtime/context-compaction-constants.ts +11 -0
  58. package/src/runtime/context-compaction-runtime.ts +86 -0
  59. package/src/runtime/context-compaction.ts +909 -0
  60. package/src/runtime/execution-plan.ts +59 -0
  61. package/src/runtime/helper-model.ts +405 -0
  62. package/src/runtime/indexed-repositories-policy.ts +28 -0
  63. package/src/runtime/instruction-sections.ts +8 -0
  64. package/src/runtime/llm-content.ts +71 -0
  65. package/src/runtime/memory-block.ts +264 -0
  66. package/src/runtime/memory-digest-policy.ts +14 -0
  67. package/src/runtime/memory-format.ts +8 -0
  68. package/src/runtime/memory-pipeline.ts +570 -0
  69. package/src/runtime/memory-prompts-fact.ts +47 -0
  70. package/src/runtime/memory-prompts-parse.ts +3 -0
  71. package/src/runtime/memory-prompts-update.ts +37 -0
  72. package/src/runtime/memory-scope.ts +43 -0
  73. package/src/runtime/plugin-types.ts +10 -0
  74. package/src/runtime/retrieval-adapters.ts +25 -0
  75. package/src/runtime/retrieval-pipeline.ts +3 -0
  76. package/src/runtime/runtime-extensions.ts +154 -0
  77. package/src/runtime/skill-extraction-policy.ts +3 -0
  78. package/src/runtime/team-consultation-orchestrator.ts +245 -0
  79. package/src/runtime/team-consultation-prompts.ts +32 -0
  80. package/src/runtime/title-helpers.ts +12 -0
  81. package/src/runtime/turn-lifecycle.ts +28 -0
  82. package/src/runtime/workstream-chat-helpers.ts +187 -0
  83. package/src/runtime/workstream-routing-policy.ts +301 -0
  84. package/src/runtime/workstream-state.ts +261 -0
  85. package/src/services/attachment.service.ts +159 -0
  86. package/src/services/chat-attachments.service.ts +17 -0
  87. package/src/services/chat-run-registry.service.ts +3 -0
  88. package/src/services/context-compaction-runtime.ts +13 -0
  89. package/src/services/context-compaction.service.ts +115 -0
  90. package/src/services/document-chunk.service.ts +141 -0
  91. package/src/services/execution-plan.service.ts +890 -0
  92. package/src/services/learned-skill.service.ts +328 -0
  93. package/src/services/memory-assessment.service.ts +43 -0
  94. package/src/services/memory.service.ts +807 -0
  95. package/src/services/memory.utils.ts +84 -0
  96. package/src/services/mutating-approval.service.ts +110 -0
  97. package/src/services/recent-activity-title.service.ts +74 -0
  98. package/src/services/recent-activity.service.ts +397 -0
  99. package/src/services/workstream-change-tracker.service.ts +313 -0
  100. package/src/services/workstream-message.service.ts +283 -0
  101. package/src/services/workstream-title.service.ts +58 -0
  102. package/src/services/workstream-turn-preparation.ts +1340 -0
  103. package/src/services/workstream-turn.ts +37 -0
  104. package/src/services/workstream.service.ts +854 -0
  105. package/src/services/workstream.types.ts +118 -0
  106. package/src/storage/attachment-parser.ts +101 -0
  107. package/src/storage/attachment-storage.service.ts +391 -0
  108. package/src/storage/attachments.types.ts +11 -0
  109. package/src/storage/attachments.utils.ts +58 -0
  110. package/src/storage/generated-document-storage.service.ts +55 -0
  111. package/src/system-agents/agent-result.ts +27 -0
  112. package/src/system-agents/context-compacter.agent.ts +46 -0
  113. package/src/system-agents/delegated-agent-factory.ts +177 -0
  114. package/src/system-agents/helper-agent-options.ts +20 -0
  115. package/src/system-agents/memory-reranker.agent.ts +38 -0
  116. package/src/system-agents/memory.agent.ts +58 -0
  117. package/src/system-agents/recent-activity-title-refiner.agent.ts +53 -0
  118. package/src/system-agents/regular-chat-memory-digest.agent.ts +75 -0
  119. package/src/system-agents/researcher.agent.ts +34 -0
  120. package/src/system-agents/skill-extractor.agent.ts +88 -0
  121. package/src/system-agents/skill-manager.agent.ts +80 -0
  122. package/src/system-agents/title-generator.agent.ts +42 -0
  123. package/src/system-agents/workstream-tracker.agent.ts +58 -0
  124. package/src/tools/execution-plan.tool.ts +163 -0
  125. package/src/tools/fetch-webpage.tool.ts +132 -0
  126. package/src/tools/firecrawl-client.ts +12 -0
  127. package/src/tools/memory-block.tool.ts +55 -0
  128. package/src/tools/read-file-parts.tool.ts +80 -0
  129. package/src/tools/remember-memory.tool.ts +85 -0
  130. package/src/tools/research-topic.tool.ts +15 -0
  131. package/src/tools/search-tools.ts +55 -0
  132. package/src/tools/search-web.tool.ts +175 -0
  133. package/src/tools/team-think.tool.ts +125 -0
  134. package/src/tools/tool-contract.ts +21 -0
  135. package/src/tools/user-questions.tool.ts +18 -0
  136. package/src/utils/async.ts +50 -0
  137. package/src/utils/date-time.ts +34 -0
  138. package/src/utils/error.ts +10 -0
  139. package/src/utils/errors.ts +28 -0
  140. package/src/utils/hono-error-handler.ts +71 -0
  141. package/src/utils/string.ts +51 -0
  142. package/src/workers/bootstrap.ts +44 -0
  143. package/src/workers/memory-consolidation.worker.ts +318 -0
  144. package/src/workers/regular-chat-memory-digest.helpers.ts +100 -0
  145. package/src/workers/regular-chat-memory-digest.runner.ts +363 -0
  146. package/src/workers/regular-chat-memory-digest.worker.ts +22 -0
  147. package/src/workers/skill-extraction.runner.ts +331 -0
  148. package/src/workers/skill-extraction.worker.ts +22 -0
  149. package/src/workers/utils/repo-indexer-chunker.ts +331 -0
  150. package/src/workers/utils/repo-structure-extractor.ts +645 -0
  151. package/src/workers/utils/repomix-process-concurrency.ts +65 -0
  152. package/src/workers/utils/sandbox-error.ts +5 -0
  153. package/src/workers/worker-utils.ts +182 -0
@@ -0,0 +1,5 @@
1
+ export function toSandboxedWorkerError(error: unknown, context?: string): Error {
2
+ const base = error instanceof Error ? error : new Error(String(error))
3
+ if (context) base.message = `${context}: ${base.message}`
4
+ return base
5
+ }
@@ -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
+ }