@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.
Files changed (272) hide show
  1. package/package.json +11 -12
  2. package/src/ai/embedding-cache.ts +96 -22
  3. package/src/ai-gateway/ai-gateway.ts +766 -223
  4. package/src/config/agent-defaults.ts +189 -75
  5. package/src/config/agent-types.ts +54 -4
  6. package/src/config/background-processing.ts +1 -1
  7. package/src/config/constants.ts +8 -2
  8. package/src/config/index.ts +0 -1
  9. package/src/config/logger.ts +299 -19
  10. package/src/config/thread-defaults.ts +40 -20
  11. package/src/create-runtime.ts +200 -449
  12. package/src/db/base.service.ts +52 -28
  13. package/src/db/cursor-pagination.ts +71 -30
  14. package/src/db/memory-query-builder.ts +2 -1
  15. package/src/db/memory-store.helpers.ts +4 -7
  16. package/src/db/memory-store.ts +868 -601
  17. package/src/db/memory.ts +396 -280
  18. package/src/db/record-id.ts +32 -10
  19. package/src/db/schema-fingerprint.ts +30 -12
  20. package/src/db/service-normalization.ts +288 -0
  21. package/src/db/service.ts +912 -779
  22. package/src/db/startup.ts +153 -68
  23. package/src/db/transaction-conflict.ts +15 -0
  24. package/src/effect/awaitable-effect.ts +96 -0
  25. package/src/effect/errors.ts +121 -0
  26. package/src/effect/helpers.ts +123 -0
  27. package/src/effect/index.ts +24 -0
  28. package/src/effect/layers.ts +238 -0
  29. package/src/effect/runtime-ref.ts +25 -0
  30. package/src/effect/runtime.ts +46 -0
  31. package/src/effect/services.ts +61 -0
  32. package/src/effect/zod.ts +43 -0
  33. package/src/embeddings/provider.ts +128 -83
  34. package/src/index.ts +48 -1
  35. package/src/openrouter/direct-provider.ts +11 -35
  36. package/src/queues/autonomous-job.queue.ts +117 -73
  37. package/src/queues/context-compaction.queue.ts +50 -17
  38. package/src/queues/delayed-node-promotion.queue.ts +46 -17
  39. package/src/queues/document-processor.queue.ts +52 -77
  40. package/src/queues/memory-consolidation.queue.ts +47 -32
  41. package/src/queues/organization-learning.queue.ts +26 -4
  42. package/src/queues/plan-agent-heartbeat.queue.ts +71 -24
  43. package/src/queues/plan-scheduler.queue.ts +97 -33
  44. package/src/queues/post-chat-memory.queue.ts +56 -26
  45. package/src/queues/queue-factory.ts +227 -59
  46. package/src/queues/standalone-worker.ts +39 -0
  47. package/src/queues/title-generation.queue.ts +45 -11
  48. package/src/redis/connection.ts +182 -113
  49. package/src/redis/index.ts +6 -8
  50. package/src/redis/org-memory-lock.ts +60 -27
  51. package/src/redis/redis-lease-lock.ts +200 -121
  52. package/src/redis/runtime-connection.ts +20 -0
  53. package/src/redis/stream-context.ts +92 -46
  54. package/src/runtime/agent-identity-overrides.ts +2 -2
  55. package/src/runtime/agent-runtime-policy.ts +5 -2
  56. package/src/runtime/agent-stream-helpers.ts +24 -9
  57. package/src/runtime/chat-run-orchestration.ts +102 -19
  58. package/src/runtime/chat-run-registry.ts +36 -2
  59. package/src/runtime/context-compaction/context-compaction-runtime.ts +107 -0
  60. package/src/runtime/{context-compaction.ts → context-compaction/context-compaction.ts} +161 -94
  61. package/src/runtime/domain-layer.ts +192 -0
  62. package/src/runtime/execution-plan-visibility.ts +2 -2
  63. package/src/runtime/execution-plan.ts +42 -15
  64. package/src/runtime/graph-designer.ts +16 -4
  65. package/src/runtime/helper-model.ts +139 -48
  66. package/src/runtime/index.ts +7 -8
  67. package/src/runtime/indexed-repositories-policy.ts +3 -3
  68. package/src/runtime/{memory-block.ts → memory/memory-block.ts} +50 -36
  69. package/src/runtime/{memory-digest-policy.ts → memory/memory-digest-policy.ts} +1 -1
  70. package/src/runtime/{memory-pipeline.ts → memory/memory-pipeline.ts} +54 -67
  71. package/src/runtime/{memory-prompts-fact.ts → memory/memory-prompts-fact.ts} +2 -2
  72. package/src/runtime/memory/memory-scope.ts +53 -0
  73. package/src/runtime/plugin-resolution.ts +124 -25
  74. package/src/runtime/plugin-types.ts +9 -1
  75. package/src/runtime/post-turn-side-effects.ts +177 -130
  76. package/src/runtime/retrieval-adapters.ts +40 -6
  77. package/src/runtime/runtime-accessors.ts +92 -0
  78. package/src/runtime/runtime-config.ts +150 -61
  79. package/src/runtime/runtime-extensions.ts +23 -25
  80. package/src/runtime/runtime-lifecycle.ts +124 -0
  81. package/src/runtime/runtime-services.ts +386 -0
  82. package/src/runtime/runtime-token.ts +47 -0
  83. package/src/runtime/social-chat/social-chat-agent-runner.ts +159 -0
  84. package/src/runtime/{social-chat-history.ts → social-chat/social-chat-history.ts} +51 -20
  85. package/src/runtime/social-chat/social-chat.ts +630 -0
  86. package/src/runtime/specialist-runner.ts +36 -10
  87. package/src/runtime/team-consultation/team-consultation-orchestrator.ts +433 -0
  88. package/src/runtime/{team-consultation-prompts.ts → team-consultation/team-consultation-prompts.ts} +6 -2
  89. package/src/runtime/thread-chat-helpers.ts +2 -2
  90. package/src/runtime/thread-plan-turn.ts +2 -1
  91. package/src/runtime/thread-turn-context.ts +183 -111
  92. package/src/runtime/turn-lifecycle.ts +93 -27
  93. package/src/services/agent-activity.service.ts +287 -203
  94. package/src/services/agent-executor.service.ts +253 -149
  95. package/src/services/artifact.service.ts +231 -149
  96. package/src/services/attachment.service.ts +171 -115
  97. package/src/services/autonomous-job.service.ts +890 -491
  98. package/src/services/background-work.service.ts +54 -0
  99. package/src/services/chat-run-registry.service.ts +13 -1
  100. package/src/services/context-compaction.service.ts +136 -86
  101. package/src/services/document-chunk.service.ts +151 -88
  102. package/src/services/execution-plan/execution-plan-approval.ts +26 -0
  103. package/src/services/execution-plan/execution-plan-context.ts +29 -0
  104. package/src/services/execution-plan/execution-plan-graph.ts +278 -0
  105. package/src/services/execution-plan/execution-plan-schedule.ts +84 -0
  106. package/src/services/execution-plan/execution-plan-spec.ts +75 -0
  107. package/src/services/execution-plan/execution-plan.service.ts +1041 -0
  108. package/src/services/feedback-loop.service.ts +132 -76
  109. package/src/services/global-orchestrator.service.ts +101 -168
  110. package/src/services/graph-full-routing.ts +193 -0
  111. package/src/services/index.ts +19 -21
  112. package/src/services/institutional-memory.service.ts +213 -125
  113. package/src/services/learned-skill.service.ts +368 -260
  114. package/src/services/memory/memory-conversation.ts +95 -0
  115. package/src/services/memory/memory-errors.ts +27 -0
  116. package/src/services/memory/memory-org-memory.ts +50 -0
  117. package/src/services/memory/memory-preseeded.ts +86 -0
  118. package/src/services/memory/memory-rerank.ts +297 -0
  119. package/src/services/{memory-utils.ts → memory/memory-utils.ts} +6 -5
  120. package/src/services/memory/memory.service.ts +674 -0
  121. package/src/services/memory/rerank.service.ts +201 -0
  122. package/src/services/monitoring-window.service.ts +92 -70
  123. package/src/services/mutating-approval.service.ts +62 -53
  124. package/src/services/node-workspace.service.ts +141 -98
  125. package/src/services/notification.service.ts +29 -16
  126. package/src/services/organization-member.service.ts +120 -66
  127. package/src/services/organization.service.ts +153 -77
  128. package/src/services/ownership-dispatcher.service.ts +456 -263
  129. package/src/services/plan/plan-agent-heartbeat.service.ts +234 -0
  130. package/src/services/plan/plan-agent-query.service.ts +322 -0
  131. package/src/services/{plan-approval.service.ts → plan/plan-approval.service.ts} +45 -22
  132. package/src/services/plan/plan-artifact.service.ts +60 -0
  133. package/src/services/plan/plan-builder.service.ts +76 -0
  134. package/src/services/plan/plan-checkpoint.service.ts +103 -0
  135. package/src/services/{plan-compiler.service.ts → plan/plan-compiler.service.ts} +26 -9
  136. package/src/services/plan/plan-completion-side-effects.ts +169 -0
  137. package/src/services/plan/plan-coordination.service.ts +181 -0
  138. package/src/services/plan/plan-cycle.service.ts +405 -0
  139. package/src/services/plan/plan-deadline.service.ts +533 -0
  140. package/src/services/plan/plan-event-delivery.service.ts +266 -0
  141. package/src/services/plan/plan-executor-context.ts +35 -0
  142. package/src/services/plan/plan-executor-graph.ts +522 -0
  143. package/src/services/plan/plan-executor-helpers.ts +307 -0
  144. package/src/services/plan/plan-executor-persistence.ts +209 -0
  145. package/src/services/plan/plan-executor.service.ts +1737 -0
  146. package/src/services/{plan-helpers.ts → plan/plan-helpers.ts} +1 -1
  147. package/src/services/{plan-run-data.ts → plan/plan-run-data.ts} +4 -4
  148. package/src/services/plan/plan-run-serialization.ts +15 -0
  149. package/src/services/plan/plan-run.service.ts +637 -0
  150. package/src/services/plan/plan-scheduler.service.ts +379 -0
  151. package/src/services/plan/plan-template.service.ts +224 -0
  152. package/src/services/plan/plan-transaction-events.ts +36 -0
  153. package/src/services/plan/plan-validator.service.ts +907 -0
  154. package/src/services/plan/plan-workspace.service.ts +131 -0
  155. package/src/services/plugin-executor.service.ts +102 -68
  156. package/src/services/quality-metrics.service.ts +112 -94
  157. package/src/services/queue-job.service.ts +288 -231
  158. package/src/services/recent-activity-title.service.ts +73 -36
  159. package/src/services/recent-activity.service.ts +274 -259
  160. package/src/services/skill-resolver.service.ts +38 -12
  161. package/src/services/social-chat-history.service.ts +190 -122
  162. package/src/services/system-executor.service.ts +96 -61
  163. package/src/services/thread/thread-active-run.ts +203 -0
  164. package/src/services/thread/thread-bootstrap.ts +385 -0
  165. package/src/services/thread/thread-listing.ts +199 -0
  166. package/src/services/thread/thread-memory-block.ts +130 -0
  167. package/src/services/thread/thread-message.service.ts +379 -0
  168. package/src/services/thread/thread-record-store.ts +155 -0
  169. package/src/services/thread/thread-title.service.ts +74 -0
  170. package/src/services/thread/thread-turn-execution.ts +280 -0
  171. package/src/services/thread/thread-turn-message-context.ts +73 -0
  172. package/src/services/thread/thread-turn-preparation.service.ts +1148 -0
  173. package/src/services/thread/thread-turn-streaming.ts +403 -0
  174. package/src/services/thread/thread-turn-tracing.ts +35 -0
  175. package/src/services/thread/thread-turn.ts +376 -0
  176. package/src/services/thread/thread.service.ts +344 -0
  177. package/src/services/user.service.ts +82 -32
  178. package/src/services/write-intent-validator.service.ts +63 -51
  179. package/src/storage/attachment-parser.ts +69 -27
  180. package/src/storage/attachment-storage.service.ts +334 -275
  181. package/src/storage/generated-document-storage.service.ts +66 -34
  182. package/src/system-agents/agent-result.ts +3 -1
  183. package/src/system-agents/context-compaction.agent.ts +3 -3
  184. package/src/system-agents/delegated-agent-factory.ts +159 -90
  185. package/src/system-agents/helper-agent-options.ts +1 -1
  186. package/src/system-agents/memory-reranker.agent.ts +3 -3
  187. package/src/system-agents/memory.agent.ts +3 -3
  188. package/src/system-agents/recent-activity-title-refiner.agent.ts +3 -3
  189. package/src/system-agents/regular-chat-memory-digest.agent.ts +3 -3
  190. package/src/system-agents/skill-extractor.agent.ts +3 -3
  191. package/src/system-agents/skill-manager.agent.ts +3 -3
  192. package/src/system-agents/thread-router.agent.ts +157 -113
  193. package/src/system-agents/title-generator.agent.ts +3 -3
  194. package/src/tools/execution-plan.tool.ts +241 -171
  195. package/src/tools/fetch-webpage.tool.ts +29 -18
  196. package/src/tools/firecrawl-client.ts +26 -6
  197. package/src/tools/index.ts +1 -0
  198. package/src/tools/memory-block.tool.ts +14 -6
  199. package/src/tools/plan-approval.tool.ts +57 -47
  200. package/src/tools/read-file-parts.tool.ts +44 -33
  201. package/src/tools/remember-memory.tool.ts +65 -45
  202. package/src/tools/search-web.tool.ts +33 -22
  203. package/src/tools/search.tool.ts +41 -29
  204. package/src/tools/team-think.tool.ts +125 -84
  205. package/src/tools/user-questions.tool.ts +4 -3
  206. package/src/tools/web-tool-shared.ts +6 -0
  207. package/src/utils/async.ts +25 -22
  208. package/src/utils/crypto.ts +21 -0
  209. package/src/utils/date-time.ts +40 -1
  210. package/src/utils/errors.ts +111 -20
  211. package/src/utils/hono-error-handler.ts +24 -39
  212. package/src/utils/index.ts +2 -1
  213. package/src/utils/null-proto-record.ts +41 -0
  214. package/src/utils/sse-keepalive.ts +124 -21
  215. package/src/workers/bootstrap.ts +164 -52
  216. package/src/workers/memory-consolidation.worker.ts +325 -237
  217. package/src/workers/organization-learning.worker.ts +50 -16
  218. package/src/workers/regular-chat-memory-digest.helpers.ts +28 -27
  219. package/src/workers/regular-chat-memory-digest.runner.ts +185 -114
  220. package/src/workers/skill-extraction.runner.ts +176 -93
  221. package/src/workers/utils/file-section-chunker.ts +8 -10
  222. package/src/workers/utils/repo-structure-extractor.ts +349 -260
  223. package/src/workers/utils/repomix-file-sections.ts +2 -2
  224. package/src/workers/utils/thread-message-query.ts +97 -38
  225. package/src/workers/worker-utils.ts +74 -31
  226. package/src/config/debug-logger.ts +0 -47
  227. package/src/config/search.ts +0 -3
  228. package/src/redis/connection-accessor.ts +0 -26
  229. package/src/runtime/agent-types.ts +0 -1
  230. package/src/runtime/context-compaction-runtime.ts +0 -87
  231. package/src/runtime/memory-scope.ts +0 -43
  232. package/src/runtime/social-chat-agent-runner.ts +0 -118
  233. package/src/runtime/social-chat.ts +0 -516
  234. package/src/runtime/team-consultation-orchestrator.ts +0 -272
  235. package/src/services/adaptive-playbook.service.ts +0 -152
  236. package/src/services/artifact-provenance.service.ts +0 -172
  237. package/src/services/chat-attachments.service.ts +0 -17
  238. package/src/services/context-compaction-runtime.singleton.ts +0 -13
  239. package/src/services/execution-plan.service.ts +0 -1118
  240. package/src/services/memory.service.ts +0 -914
  241. package/src/services/plan-agent-heartbeat.service.ts +0 -136
  242. package/src/services/plan-agent-query.service.ts +0 -267
  243. package/src/services/plan-artifact.service.ts +0 -50
  244. package/src/services/plan-builder.service.ts +0 -67
  245. package/src/services/plan-checkpoint.service.ts +0 -81
  246. package/src/services/plan-completion-side-effects.ts +0 -80
  247. package/src/services/plan-coordination.service.ts +0 -157
  248. package/src/services/plan-cycle.service.ts +0 -284
  249. package/src/services/plan-deadline.service.ts +0 -430
  250. package/src/services/plan-event-delivery.service.ts +0 -166
  251. package/src/services/plan-executor.service.ts +0 -1950
  252. package/src/services/plan-run.service.ts +0 -515
  253. package/src/services/plan-scheduler.service.ts +0 -240
  254. package/src/services/plan-template.service.ts +0 -177
  255. package/src/services/plan-validator.service.ts +0 -818
  256. package/src/services/plan-workspace.service.ts +0 -83
  257. package/src/services/rerank.service.ts +0 -156
  258. package/src/services/thread-message.service.ts +0 -275
  259. package/src/services/thread-plan-registry.service.ts +0 -22
  260. package/src/services/thread-title.service.ts +0 -39
  261. package/src/services/thread-turn-preparation.service.ts +0 -1147
  262. package/src/services/thread-turn.ts +0 -172
  263. package/src/services/thread.service.ts +0 -869
  264. package/src/utils/env.ts +0 -8
  265. /package/src/runtime/{context-compaction-constants.ts → context-compaction/context-compaction-constants.ts} +0 -0
  266. /package/src/runtime/{memory-format.ts → memory/memory-format.ts} +0 -0
  267. /package/src/runtime/{memory-prompts-parse.ts → memory/memory-prompts-parse.ts} +0 -0
  268. /package/src/runtime/{memory-prompts-update.ts → memory/memory-prompts-update.ts} +0 -0
  269. /package/src/runtime/{social-chat-prompts.ts → social-chat/social-chat-prompts.ts} +0 -0
  270. /package/src/services/{plan-node-spec.ts → plan/plan-node-spec.ts} +0 -0
  271. /package/src/services/{thread-constants.ts → thread/thread-constants.ts} +0 -0
  272. /package/src/services/{thread.types.ts → thread/thread.types.ts} +0 -0
@@ -1,117 +1,193 @@
1
- import { recordIdSchema, recordIdStringSchema } from '@lota-sdk/shared'
2
- import { z } from 'zod'
1
+ import { sdkOrganizationRecordSchema, sdkOrganizationSchema } from '@lota-sdk/shared'
2
+ import type { SdkOrganization, SdkOrganizationRecord } from '@lota-sdk/shared'
3
+ import { Context, Schema, Effect, Layer } from 'effect'
3
4
 
4
- import { BaseService } from '../db/base.service'
5
5
  import { ensureRecordId, recordIdToString } from '../db/record-id'
6
6
  import type { RecordIdInput, RecordIdRef } from '../db/record-id'
7
- import { databaseService } from '../db/service'
7
+ import type { SurrealDBService } from '../db/service'
8
8
  import { TABLES } from '../db/tables'
9
+ import { NotFoundError } from '../effect/errors'
10
+ import { DatabaseServiceTag } from '../effect/services'
9
11
  import { toIsoDateTimeString, toOptionalIsoDateTimeString } from '../utils/date-time'
10
12
 
11
- const organizationRecordSchema = z.object({
12
- id: recordIdSchema,
13
- name: z.string(),
14
- regularChatDigestLastThreadCursorCreatedAt: z.coerce.date().optional(),
15
- regularChatDigestLastThreadCursorId: z.string().optional(),
16
- skillExtractionLastCursorId: z.string().optional(),
17
- skillExtractionLastCursorCreatedAt: z.coerce.date().optional(),
18
- createdAt: z.coerce.date(),
19
- updatedAt: z.coerce.date(),
20
- })
21
-
22
- const sdkOrganizationSchema = z.object({
23
- id: recordIdStringSchema,
24
- name: z.string(),
25
- regularChatDigestLastThreadCursorCreatedAt: z.iso.datetime().nullable().optional(),
26
- regularChatDigestLastThreadCursorId: z.string().nullable().optional(),
27
- skillExtractionLastCursorId: z.string().nullable().optional(),
28
- skillExtractionLastCursorCreatedAt: z.iso.datetime().nullable().optional(),
29
- createdAt: z.iso.datetime(),
30
- updatedAt: z.iso.datetime(),
31
- })
32
-
33
- export type SdkOrganizationRecord = z.infer<typeof organizationRecordSchema>
34
- export type SdkOrganization = z.infer<typeof sdkOrganizationSchema>
13
+ export type { SdkOrganization, SdkOrganizationRecord }
35
14
 
36
15
  interface BackgroundCursor {
37
16
  createdAt: Date
38
17
  id: string
39
18
  }
40
19
 
20
+ class OrganizationServiceError extends Schema.TaggedErrorClass<OrganizationServiceError>()('OrganizationServiceError', {
21
+ operation: Schema.String,
22
+ cause: Schema.Defect,
23
+ }) {}
24
+
41
25
  function toOptionalCursorTimestamp(value: unknown): string | null {
42
26
  return toOptionalIsoDateTimeString(value) ?? null
43
27
  }
44
28
 
45
- class OrganizationService extends BaseService<typeof organizationRecordSchema> {
46
- constructor() {
47
- super(TABLES.ORGANIZATION, organizationRecordSchema)
48
- }
29
+ function toPublicEffect(record: SdkOrganizationRecord): Effect.Effect<SdkOrganization, OrganizationServiceError> {
30
+ return Effect.try({
31
+ try: () =>
32
+ sdkOrganizationSchema.parse({
33
+ id: recordIdToString(ensureRecordId(record.id as RecordIdInput, TABLES.ORGANIZATION), TABLES.ORGANIZATION),
34
+ name: record.name,
35
+ regularChatDigestLastThreadCursorCreatedAt: toOptionalCursorTimestamp(
36
+ record.regularChatDigestLastThreadCursorCreatedAt,
37
+ ),
38
+ regularChatDigestLastThreadCursorId: record.regularChatDigestLastThreadCursorId ?? null,
39
+ skillExtractionLastCursorId: record.skillExtractionLastCursorId ?? null,
40
+ skillExtractionLastCursorCreatedAt: toOptionalCursorTimestamp(record.skillExtractionLastCursorCreatedAt),
41
+ createdAt: toIsoDateTimeString(record.createdAt),
42
+ updatedAt: toIsoDateTimeString(record.updatedAt),
43
+ }),
44
+ catch: (cause) => toOrganizationServiceError('toPublic', cause),
45
+ })
46
+ }
49
47
 
50
- toPublic(record: SdkOrganizationRecord): SdkOrganization {
51
- return sdkOrganizationSchema.parse({
52
- id: recordIdToString(ensureRecordId(record.id as RecordIdInput, TABLES.ORGANIZATION), TABLES.ORGANIZATION),
53
- name: record.name,
54
- regularChatDigestLastThreadCursorCreatedAt: toOptionalCursorTimestamp(
55
- record.regularChatDigestLastThreadCursorCreatedAt,
56
- ),
57
- regularChatDigestLastThreadCursorId: record.regularChatDigestLastThreadCursorId ?? null,
58
- skillExtractionLastCursorId: record.skillExtractionLastCursorId ?? null,
59
- skillExtractionLastCursorCreatedAt: toOptionalCursorTimestamp(record.skillExtractionLastCursorCreatedAt),
60
- createdAt: toIsoDateTimeString(record.createdAt),
61
- updatedAt: toIsoDateTimeString(record.updatedAt),
62
- })
63
- }
48
+ function organizationNotFoundError(organizationId: RecordIdInput): NotFoundError {
49
+ return new NotFoundError({
50
+ resource: TABLES.ORGANIZATION,
51
+ id: recordIdToString(organizationId, TABLES.ORGANIZATION),
52
+ message: `Record not found in ${TABLES.ORGANIZATION}: ${recordIdToString(organizationId, TABLES.ORGANIZATION)}`,
53
+ })
54
+ }
55
+
56
+ function toOrganizationServiceError(operation: string, cause: unknown): OrganizationServiceError {
57
+ return new OrganizationServiceError({ operation, cause })
58
+ }
64
59
 
65
- async createOrganization(params: { name: string }): Promise<SdkOrganization> {
66
- return this.toPublic(await this.create({ name: params.name }))
60
+ export function makeOrganizationService(db: SurrealDBService) {
61
+ function createOrganization(params: { name: string }) {
62
+ return db.create(TABLES.ORGANIZATION, { name: params.name }, sdkOrganizationRecordSchema).pipe(
63
+ Effect.mapError((cause) => toOrganizationServiceError('createOrganization', cause)),
64
+ Effect.flatMap(toPublicEffect),
65
+ )
67
66
  }
68
67
 
69
- async upsertOrganization(params: { id: RecordIdInput; name: string }): Promise<SdkOrganization> {
68
+ function upsertOrganization(params: { id: RecordIdInput; name: string }) {
70
69
  const organizationRef = ensureRecordId(params.id, TABLES.ORGANIZATION)
71
- const record = await databaseService.upsert(
72
- TABLES.ORGANIZATION,
73
- organizationRef,
74
- { name: params.name },
75
- organizationRecordSchema,
70
+ return db.upsert(TABLES.ORGANIZATION, organizationRef, { name: params.name }, sdkOrganizationRecordSchema).pipe(
71
+ Effect.mapError((cause) => toOrganizationServiceError('upsertOrganization', cause)),
72
+ Effect.flatMap(toPublicEffect),
76
73
  )
77
- return this.toPublic(record)
78
74
  }
79
75
 
80
- async listOrganizations(): Promise<SdkOrganization[]> {
81
- return (await this.findAll({}, { orderBy: 'createdAt', orderDir: 'ASC' })).map((record) => this.toPublic(record))
76
+ function listOrganizations() {
77
+ return db
78
+ .findMany(TABLES.ORGANIZATION, {}, sdkOrganizationRecordSchema, { orderBy: 'createdAt', orderDir: 'ASC' })
79
+ .pipe(
80
+ Effect.mapError((cause) => toOrganizationServiceError('listOrganizations', cause)),
81
+ Effect.flatMap((records) => Effect.forEach(records, toPublicEffect)),
82
+ )
82
83
  }
83
84
 
84
- async getOrganization(organizationId: RecordIdInput): Promise<SdkOrganization> {
85
- return this.toPublic(await this.getById(ensureRecordId(organizationId, TABLES.ORGANIZATION)))
85
+ function getOrganizationRecord(organizationId: RecordIdRef) {
86
+ return db
87
+ .findOne(
88
+ TABLES.ORGANIZATION,
89
+ { id: ensureRecordId(organizationId, TABLES.ORGANIZATION) },
90
+ sdkOrganizationRecordSchema,
91
+ )
92
+ .pipe(
93
+ Effect.mapError((cause) => toOrganizationServiceError('getOrganizationRecord', cause)),
94
+ Effect.flatMap((record) =>
95
+ record ? Effect.succeed(record) : Effect.fail(organizationNotFoundError(organizationId)),
96
+ ),
97
+ )
86
98
  }
87
99
 
88
- async getOrganizationRecord(organizationId: RecordIdRef): Promise<SdkOrganizationRecord> {
89
- return this.getById(ensureRecordId(organizationId, TABLES.ORGANIZATION))
100
+ function getOrganization(organizationId: RecordIdInput) {
101
+ return getOrganizationRecord(ensureRecordId(organizationId, TABLES.ORGANIZATION)).pipe(
102
+ Effect.flatMap(toPublicEffect),
103
+ )
90
104
  }
91
105
 
92
- async updateOrganization(organizationId: RecordIdInput, params: { name: string }): Promise<SdkOrganization> {
93
- return this.toPublic(await this.update(ensureRecordId(organizationId, TABLES.ORGANIZATION), { name: params.name }))
106
+ function updateOrganization(organizationId: RecordIdInput, params: { name: string }) {
107
+ return db
108
+ .update(
109
+ TABLES.ORGANIZATION,
110
+ ensureRecordId(organizationId, TABLES.ORGANIZATION),
111
+ { name: params.name },
112
+ sdkOrganizationRecordSchema,
113
+ )
114
+ .pipe(
115
+ Effect.mapError((cause) => toOrganizationServiceError('updateOrganization', cause)),
116
+ Effect.flatMap((updated) =>
117
+ updated ? Effect.succeed(updated) : Effect.fail(organizationNotFoundError(organizationId)),
118
+ ),
119
+ Effect.flatMap(toPublicEffect),
120
+ )
94
121
  }
95
122
 
96
- async deleteOrganization(organizationId: RecordIdInput): Promise<void> {
123
+ function deleteOrganization(organizationId: RecordIdInput) {
97
124
  const organizationRef = ensureRecordId(organizationId, TABLES.ORGANIZATION)
98
- await databaseService.deleteWhere(TABLES.ORGANIZATION_MEMBER, { out: organizationRef })
99
- await this.delete(organizationRef)
125
+ return Effect.gen(function* () {
126
+ yield* db
127
+ .deleteWhere(TABLES.ORGANIZATION_MEMBER, { out: organizationRef })
128
+ .pipe(Effect.mapError((cause) => toOrganizationServiceError('deleteOrganization.deleteMembers', cause)))
129
+ const deleted = yield* db
130
+ .deleteById(TABLES.ORGANIZATION, organizationRef)
131
+ .pipe(Effect.mapError((cause) => toOrganizationServiceError('deleteOrganization.deleteOrganization', cause)))
132
+ if (!deleted) {
133
+ return yield* organizationNotFoundError(organizationId)
134
+ }
135
+ })
100
136
  }
101
137
 
102
- async updateRegularChatDigestCursor(organizationId: RecordIdRef, cursor: BackgroundCursor): Promise<void> {
103
- await this.update(organizationId, {
104
- regularChatDigestLastThreadCursorCreatedAt: cursor.createdAt,
105
- regularChatDigestLastThreadCursorId: cursor.id,
106
- })
138
+ function updateRegularChatDigestCursor(organizationId: RecordIdRef, cursor: BackgroundCursor) {
139
+ return db
140
+ .update(
141
+ TABLES.ORGANIZATION,
142
+ ensureRecordId(organizationId, TABLES.ORGANIZATION),
143
+ {
144
+ regularChatDigestLastThreadCursorCreatedAt: cursor.createdAt,
145
+ regularChatDigestLastThreadCursorId: cursor.id,
146
+ },
147
+ sdkOrganizationRecordSchema,
148
+ )
149
+ .pipe(
150
+ Effect.mapError((cause) => toOrganizationServiceError('updateRegularChatDigestCursor', cause)),
151
+ Effect.flatMap((updated) => (updated ? Effect.void : Effect.fail(organizationNotFoundError(organizationId)))),
152
+ )
107
153
  }
108
154
 
109
- async updateSkillExtractionCursor(organizationId: RecordIdRef, cursor: BackgroundCursor): Promise<void> {
110
- await this.update(organizationId, {
111
- skillExtractionLastCursorCreatedAt: cursor.createdAt,
112
- skillExtractionLastCursorId: cursor.id,
113
- })
155
+ function updateSkillExtractionCursor(organizationId: RecordIdRef, cursor: BackgroundCursor) {
156
+ return db
157
+ .update(
158
+ TABLES.ORGANIZATION,
159
+ ensureRecordId(organizationId, TABLES.ORGANIZATION),
160
+ { skillExtractionLastCursorCreatedAt: cursor.createdAt, skillExtractionLastCursorId: cursor.id },
161
+ sdkOrganizationRecordSchema,
162
+ )
163
+ .pipe(
164
+ Effect.mapError((cause) => toOrganizationServiceError('updateSkillExtractionCursor', cause)),
165
+ Effect.flatMap((updated) => (updated ? Effect.void : Effect.fail(organizationNotFoundError(organizationId)))),
166
+ )
167
+ }
168
+
169
+ return {
170
+ createOrganization,
171
+ upsertOrganization,
172
+ listOrganizations,
173
+ getOrganization,
174
+ getOrganizationRecord,
175
+ updateOrganization,
176
+ deleteOrganization,
177
+ updateRegularChatDigestCursor,
178
+ updateSkillExtractionCursor,
114
179
  }
115
180
  }
116
181
 
117
- export const organizationService = new OrganizationService()
182
+ export class OrganizationServiceTag extends Context.Service<
183
+ OrganizationServiceTag,
184
+ ReturnType<typeof makeOrganizationService>
185
+ >()('@lota-sdk/core/OrganizationService') {}
186
+
187
+ export const OrganizationServiceLive = Layer.effect(
188
+ OrganizationServiceTag,
189
+ Effect.gen(function* () {
190
+ const db = yield* DatabaseServiceTag
191
+ return makeOrganizationService(db)
192
+ }),
193
+ )