@lota-sdk/core 0.4.9 → 0.4.11

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 (182) hide show
  1. package/package.json +2 -2
  2. package/src/ai/embedding-cache.ts +3 -1
  3. package/src/ai-gateway/ai-gateway.ts +164 -82
  4. package/src/ai-gateway/index.ts +16 -1
  5. package/src/config/agent-defaults.ts +4 -107
  6. package/src/config/agent-types.ts +1 -1
  7. package/src/config/background-processing.ts +1 -1
  8. package/src/config/index.ts +0 -1
  9. package/src/config/logger.ts +22 -25
  10. package/src/config/thread-defaults.ts +1 -10
  11. package/src/create-runtime.ts +145 -670
  12. package/src/db/base.service.ts +30 -38
  13. package/src/db/memory-query-builder.ts +2 -1
  14. package/src/db/memory-store.ts +29 -20
  15. package/src/db/memory.ts +188 -195
  16. package/src/db/service-normalization.ts +97 -64
  17. package/src/db/service.ts +496 -384
  18. package/src/db/startup.ts +30 -19
  19. package/src/effect/helpers.ts +30 -5
  20. package/src/effect/index.ts +7 -7
  21. package/src/effect/layers.ts +75 -72
  22. package/src/effect/services.ts +15 -11
  23. package/src/embeddings/provider.ts +65 -71
  24. package/src/index.ts +13 -12
  25. package/src/queues/autonomous-job.queue.ts +177 -143
  26. package/src/queues/context-compaction.queue.ts +41 -39
  27. package/src/queues/delayed-node-promotion.queue.ts +61 -42
  28. package/src/queues/document-processor.queue.ts +5 -3
  29. package/src/queues/index.ts +1 -0
  30. package/src/queues/memory-consolidation.queue.ts +79 -53
  31. package/src/queues/organization-learning.queue.ts +70 -33
  32. package/src/queues/plan-agent-heartbeat.queue.ts +111 -83
  33. package/src/queues/plan-scheduler.queue.ts +101 -97
  34. package/src/queues/post-chat-memory.queue.ts +56 -46
  35. package/src/queues/queue-factory.ts +146 -69
  36. package/src/queues/queues.service.ts +61 -0
  37. package/src/queues/title-generation.queue.ts +44 -44
  38. package/src/redis/connection.ts +181 -164
  39. package/src/redis/org-memory-lock.ts +24 -9
  40. package/src/redis/redis-lease-lock.ts +8 -1
  41. package/src/redis/stream-context.ts +17 -9
  42. package/src/runtime/agent-identity-overrides.ts +7 -3
  43. package/src/runtime/agent-runtime-policy.ts +10 -5
  44. package/src/runtime/agent-stream-helpers.ts +24 -15
  45. package/src/runtime/chat-run-orchestration.ts +1 -1
  46. package/src/runtime/context-compaction/context-compaction-runtime.ts +28 -32
  47. package/src/runtime/context-compaction/context-compaction.ts +131 -85
  48. package/src/runtime/domain-layer.ts +203 -0
  49. package/src/runtime/execution-plan-visibility.ts +5 -2
  50. package/src/runtime/graph-designer.ts +0 -14
  51. package/src/runtime/helper-model.ts +8 -4
  52. package/src/runtime/index.ts +1 -1
  53. package/src/runtime/indexed-repositories-policy.ts +2 -6
  54. package/src/runtime/memory/memory-block.ts +19 -9
  55. package/src/runtime/memory/memory-pipeline.ts +53 -66
  56. package/src/runtime/memory/memory-scope.ts +33 -29
  57. package/src/runtime/plugin-resolution.ts +58 -62
  58. package/src/runtime/post-turn-side-effects.ts +139 -161
  59. package/src/runtime/retrieval-adapters.ts +4 -4
  60. package/src/runtime/runtime-config.ts +3 -9
  61. package/src/runtime/runtime-extensions.ts +0 -43
  62. package/src/runtime/runtime-lifecycle.ts +124 -0
  63. package/src/runtime/runtime-services.ts +455 -0
  64. package/src/runtime/runtime-worker-registry.ts +113 -30
  65. package/src/runtime/social-chat/social-chat-agent-runner.ts +13 -8
  66. package/src/runtime/social-chat/social-chat-history.ts +24 -13
  67. package/src/runtime/social-chat/social-chat.ts +420 -369
  68. package/src/runtime/team-consultation/team-consultation-orchestrator.ts +64 -57
  69. package/src/runtime/team-consultation/team-consultation-prompts.ts +11 -6
  70. package/src/runtime/thread-chat-helpers.ts +18 -9
  71. package/src/runtime/thread-turn-context.ts +28 -74
  72. package/src/runtime/turn-lifecycle.ts +6 -14
  73. package/src/services/agent-activity.service.ts +169 -176
  74. package/src/services/agent-executor.service.ts +207 -196
  75. package/src/services/artifact.service.ts +10 -5
  76. package/src/services/attachment.service.ts +16 -48
  77. package/src/services/autonomous-job.service.ts +81 -87
  78. package/src/services/background-work.service.ts +54 -0
  79. package/src/services/chat-run-registry.service.ts +3 -1
  80. package/src/services/context-compaction.service.ts +8 -10
  81. package/src/services/document-chunk.service.ts +8 -17
  82. package/src/services/execution-plan/execution-plan-graph.ts +122 -109
  83. package/src/services/execution-plan/execution-plan-schedule.ts +1 -15
  84. package/src/services/execution-plan/execution-plan.service.ts +68 -51
  85. package/src/services/feedback-loop.service.ts +1 -1
  86. package/src/services/global-orchestrator.service.ts +49 -15
  87. package/src/services/graph-full-routing.ts +49 -37
  88. package/src/services/index.ts +1 -0
  89. package/src/services/institutional-memory.service.ts +8 -17
  90. package/src/services/learned-skill.service.ts +38 -35
  91. package/src/services/memory/memory-conversation.ts +10 -5
  92. package/src/services/memory/memory-errors.ts +27 -0
  93. package/src/services/memory/memory-org-memory.ts +14 -3
  94. package/src/services/memory/memory-preseeded.ts +10 -4
  95. package/src/services/memory/memory-utils.ts +2 -1
  96. package/src/services/memory/memory.service.ts +37 -52
  97. package/src/services/memory/rerank.service.ts +3 -11
  98. package/src/services/monitoring-window.service.ts +1 -1
  99. package/src/services/mutating-approval.service.ts +1 -1
  100. package/src/services/node-workspace.service.ts +2 -2
  101. package/src/services/notification.service.ts +16 -4
  102. package/src/services/organization-member.service.ts +1 -1
  103. package/src/services/organization.service.ts +34 -51
  104. package/src/services/ownership-dispatcher.service.ts +148 -95
  105. package/src/services/plan/plan-agent-heartbeat.service.ts +30 -16
  106. package/src/services/plan/plan-agent-query.service.ts +13 -9
  107. package/src/services/plan/plan-approval.service.ts +52 -48
  108. package/src/services/plan/plan-artifact.service.ts +2 -2
  109. package/src/services/plan/plan-builder.service.ts +2 -2
  110. package/src/services/plan/plan-checkpoint.service.ts +1 -1
  111. package/src/services/plan/plan-compiler.service.ts +1 -1
  112. package/src/services/plan/plan-completion-side-effects.ts +99 -113
  113. package/src/services/plan/plan-coordination.service.ts +1 -1
  114. package/src/services/plan/plan-cycle.service.ts +171 -202
  115. package/src/services/plan/plan-deadline.service.ts +304 -307
  116. package/src/services/plan/plan-event-delivery.service.ts +84 -72
  117. package/src/services/plan/plan-executor-context.ts +2 -0
  118. package/src/services/plan/plan-executor-graph.ts +375 -353
  119. package/src/services/plan/plan-executor-helpers.ts +60 -75
  120. package/src/services/plan/plan-executor.service.ts +494 -489
  121. package/src/services/plan/plan-run.service.ts +12 -19
  122. package/src/services/plan/plan-scheduler.service.ts +89 -82
  123. package/src/services/plan/plan-template.service.ts +1 -1
  124. package/src/services/plan/plan-transaction-events.ts +8 -5
  125. package/src/services/plan/plan-validator.service.ts +1 -1
  126. package/src/services/plan/plan-workspace.service.ts +17 -11
  127. package/src/services/plugin-executor.service.ts +26 -21
  128. package/src/services/quality-metrics.service.ts +1 -1
  129. package/src/services/queue-job.service.ts +8 -17
  130. package/src/services/recent-activity-title.service.ts +22 -10
  131. package/src/services/recent-activity.service.ts +1 -1
  132. package/src/services/skill-resolver.service.ts +1 -1
  133. package/src/services/social-chat-history.service.ts +37 -20
  134. package/src/services/system-executor.service.ts +25 -20
  135. package/src/services/thread/thread-bootstrap.ts +37 -19
  136. package/src/services/thread/thread-listing.ts +2 -1
  137. package/src/services/thread/thread-memory-block.ts +18 -5
  138. package/src/services/thread/thread-message.service.ts +30 -13
  139. package/src/services/thread/thread-title.service.ts +1 -1
  140. package/src/services/thread/thread-turn-execution.ts +87 -83
  141. package/src/services/thread/thread-turn-preparation.service.ts +65 -40
  142. package/src/services/thread/thread-turn-streaming.ts +32 -36
  143. package/src/services/thread/thread-turn.ts +43 -29
  144. package/src/services/thread/thread.service.ts +32 -8
  145. package/src/services/user.service.ts +1 -1
  146. package/src/services/write-intent-validator.service.ts +1 -1
  147. package/src/storage/attachment-storage.service.ts +7 -4
  148. package/src/storage/generated-document-storage.service.ts +1 -1
  149. package/src/system-agents/context-compaction.agent.ts +1 -1
  150. package/src/system-agents/helper-agent-options.ts +1 -1
  151. package/src/system-agents/memory-reranker.agent.ts +1 -1
  152. package/src/system-agents/memory.agent.ts +1 -1
  153. package/src/system-agents/recent-activity-title-refiner.agent.ts +9 -6
  154. package/src/system-agents/regular-chat-memory-digest.agent.ts +1 -1
  155. package/src/system-agents/skill-extractor.agent.ts +1 -1
  156. package/src/system-agents/skill-manager.agent.ts +1 -1
  157. package/src/system-agents/thread-router.agent.ts +23 -20
  158. package/src/system-agents/title-generator.agent.ts +1 -1
  159. package/src/tools/execution-plan.tool.ts +36 -20
  160. package/src/tools/fetch-webpage.tool.ts +30 -22
  161. package/src/tools/firecrawl-client.ts +1 -6
  162. package/src/tools/plan-approval.tool.ts +9 -1
  163. package/src/tools/remember-memory.tool.ts +3 -6
  164. package/src/tools/research-topic.tool.ts +12 -3
  165. package/src/tools/search-web.tool.ts +26 -18
  166. package/src/tools/search.tool.ts +4 -5
  167. package/src/tools/team-think.tool.ts +139 -121
  168. package/src/utils/async.ts +15 -6
  169. package/src/utils/errors.ts +27 -15
  170. package/src/workers/bootstrap.ts +34 -58
  171. package/src/workers/memory-consolidation.worker.ts +4 -1
  172. package/src/workers/organization-learning.worker.ts +16 -3
  173. package/src/workers/regular-chat-memory-digest.helpers.ts +3 -4
  174. package/src/workers/regular-chat-memory-digest.runner.ts +46 -29
  175. package/src/workers/skill-extraction.runner.ts +13 -15
  176. package/src/workers/worker-utils.ts +14 -8
  177. package/src/config/search.ts +0 -3
  178. package/src/effect/awaitable-effect.ts +0 -87
  179. package/src/effect/runtime-ref.ts +0 -25
  180. package/src/effect/runtime.ts +0 -31
  181. package/src/redis/runtime-connection.ts +0 -10
  182. package/src/runtime/agent-types.ts +0 -1
@@ -3,7 +3,6 @@ import type {
3
3
  CarryForwardPolicy,
4
4
  CycleSchedule,
5
5
  PlanArtifactRecord,
6
- PlanCycleRecord,
7
6
  PlanDraft,
8
7
  PlanRunStatus,
9
8
  PlanScheduleSpec,
@@ -15,7 +14,6 @@ import type { RecordIdInput } from '../../db/record-id'
15
14
  import { ensureRecordId, recordIdToString } from '../../db/record-id'
16
15
  import type { SurrealDBService } from '../../db/service'
17
16
  import { TABLES } from '../../db/tables'
18
- import { runPromise } from '../../effect/runtime'
19
17
  import { DatabaseServiceTag } from '../../effect/services'
20
18
  import { nowDate, nowEpochMillis, unsafeDateFrom } from '../../utils/date-time'
21
19
  import type { makePlanSchedulerService } from './plan-scheduler.service'
@@ -110,11 +108,15 @@ interface PlanCycleDeps {
110
108
  export function makePlanCycleService(deps: PlanCycleDeps) {
111
109
  const { db, planSchedulerService, planTemplateService } = deps
112
110
 
113
- function getCycleEffect(cycleId: RecordIdInput) {
114
- return db.findOne(TABLES.PLAN_CYCLE, { id: ensureRecordId(cycleId, TABLES.PLAN_CYCLE) }, PlanCycleRecordSchema)
115
- }
111
+ const getCycleEffect = Effect.fn('PlanCycle.getCycle')(function* (cycleId: RecordIdInput) {
112
+ return yield* db.findOne(
113
+ TABLES.PLAN_CYCLE,
114
+ { id: ensureRecordId(cycleId, TABLES.PLAN_CYCLE) },
115
+ PlanCycleRecordSchema,
116
+ )
117
+ })
116
118
 
117
- function createCycleEffect(params: {
119
+ const createCycleEffect = Effect.fn('PlanCycle.createCycle')(function* (params: {
118
120
  organizationId: RecordIdInput
119
121
  threadId: RecordIdInput
120
122
  templateId: RecordIdInput
@@ -123,10 +125,10 @@ export function makePlanCycleService(deps: PlanCycleDeps) {
123
125
  carryForwardPolicy?: CarryForwardPolicy
124
126
  leadAgentId: string
125
127
  }) {
126
- return Effect.gen(function* () {
127
- const now = nowDate()
128
+ const now = nowDate()
128
129
 
129
- const cycle = yield* db.create(
130
+ const cycle = yield* db
131
+ .create(
130
132
  TABLES.PLAN_CYCLE,
131
133
  {
132
134
  organizationId: ensureRecordId(params.organizationId, TABLES.ORGANIZATION),
@@ -141,217 +143,199 @@ export function makePlanCycleService(deps: PlanCycleDeps) {
141
143
  },
142
144
  PlanCycleRecordSchema,
143
145
  )
146
+ .pipe(Effect.withSpan('PlanCycle.persistCycle'))
144
147
 
145
- const createResult = yield* planTemplateService.instantiate({
148
+ const createResult = yield* planTemplateService
149
+ .instantiate({
146
150
  templateId: params.templateId,
147
151
  organizationId: params.organizationId,
148
152
  threadId: params.threadId,
149
153
  leadAgentId: params.leadAgentId,
150
154
  })
155
+ .pipe(Effect.withSpan('PlanCycle.instantiateTemplate'))
151
156
 
152
- const createdRunId = createResult.plan?.runId
153
- const scheduleSpec = cycleScheduleToSpec(params.schedule)
154
- const scheduleParams: {
155
- organizationId: RecordIdInput
156
- threadId: RecordIdInput
157
- scheduleSpec: PlanScheduleSpec
158
- runId?: RecordIdInput
159
- } = { organizationId: params.organizationId, threadId: params.threadId, scheduleSpec }
160
- if (createdRunId !== undefined) {
161
- scheduleParams.runId = ensureRecordId(createdRunId, TABLES.PLAN_RUN)
162
- }
157
+ const createdRunId = createResult.plan?.runId
158
+ const scheduleSpec = cycleScheduleToSpec(params.schedule)
159
+ const scheduleParams: {
160
+ organizationId: RecordIdInput
161
+ threadId: RecordIdInput
162
+ scheduleSpec: PlanScheduleSpec
163
+ runId?: RecordIdInput
164
+ } = { organizationId: params.organizationId, threadId: params.threadId, scheduleSpec }
165
+ if (createdRunId !== undefined) {
166
+ scheduleParams.runId = ensureRecordId(createdRunId, TABLES.PLAN_RUN)
167
+ }
168
+
169
+ const scheduleRecord = yield* planSchedulerService.createSchedule(scheduleParams)
170
+
171
+ const updatedPayload: { scheduleId: RecordIdInput; currentRunId?: RecordIdInput; currentIteration: number } = {
172
+ scheduleId: ensureRecordId(scheduleRecord.id, TABLES.PLAN_SCHEDULE),
173
+ currentIteration: 1,
174
+ }
175
+ if (createdRunId !== undefined) {
176
+ updatedPayload.currentRunId = ensureRecordId(createdRunId, TABLES.PLAN_RUN)
177
+ }
178
+
179
+ const updated = yield* db.update(
180
+ TABLES.PLAN_CYCLE,
181
+ ensureRecordId(cycle.id, TABLES.PLAN_CYCLE),
182
+ updatedPayload,
183
+ PlanCycleRecordSchema,
184
+ )
163
185
 
164
- const scheduleRecord = yield* planSchedulerService.createSchedule(scheduleParams)
186
+ return updated ?? cycle
187
+ })
165
188
 
166
- const updatedPayload: { scheduleId: RecordIdInput; currentRunId?: RecordIdInput; currentIteration: number } = {
167
- scheduleId: ensureRecordId(scheduleRecord.id, TABLES.PLAN_SCHEDULE),
168
- currentIteration: 1,
169
- }
170
- if (createdRunId !== undefined) {
171
- updatedPayload.currentRunId = ensureRecordId(createdRunId, TABLES.PLAN_RUN)
172
- }
173
-
174
- const updated = yield* db.update(
175
- TABLES.PLAN_CYCLE,
176
- ensureRecordId(cycle.id, TABLES.PLAN_CYCLE),
177
- updatedPayload,
178
- PlanCycleRecordSchema,
189
+ const advanceCycleEffect = Effect.fn('PlanCycle.advanceCycle')(function* (cycleId: RecordIdInput) {
190
+ const cycle = yield* getCycleEffect(cycleId)
191
+ if (!cycle) {
192
+ return yield* new PlanCycleNotFoundError({
193
+ cycleId: recordIdToString(cycleId, TABLES.PLAN_CYCLE),
194
+ message: `Cycle not found: ${recordIdToString(cycleId, TABLES.PLAN_CYCLE)}`,
195
+ })
196
+ }
197
+
198
+ if (cycle.status !== 'active') {
199
+ return
200
+ }
201
+
202
+ const currentRunId = cycle.currentRunId
203
+ if (currentRunId !== undefined) {
204
+ const runRecord = yield* db.findOne(
205
+ TABLES.PLAN_RUN,
206
+ { id: ensureRecordId(currentRunId, TABLES.PLAN_RUN) },
207
+ PlanRunSchema,
179
208
  )
180
-
181
- return updated ?? cycle
182
- })
183
- }
184
-
185
- function advanceCycleEffect(cycleId: RecordIdInput) {
186
- return Effect.gen(function* () {
187
- const cycle = yield* getCycleEffect(cycleId)
188
- if (!cycle) {
189
- return yield* new PlanCycleNotFoundError({
190
- cycleId: recordIdToString(cycleId, TABLES.PLAN_CYCLE),
191
- message: `Cycle not found: ${recordIdToString(cycleId, TABLES.PLAN_CYCLE)}`,
192
- })
193
- }
194
-
195
- if (cycle.status !== 'active') {
209
+ if (runRecord && !TERMINAL_RUN_STATUSES.has(runRecord.status)) {
196
210
  return
197
211
  }
212
+ }
198
213
 
199
- const currentRunId = cycle.currentRunId
200
- if (currentRunId !== undefined) {
201
- const runRecord = yield* db.findOne(
202
- TABLES.PLAN_RUN,
203
- { id: ensureRecordId(currentRunId, TABLES.PLAN_RUN) },
204
- PlanRunSchema,
205
- )
206
- if (runRecord && !TERMINAL_RUN_STATUSES.has(runRecord.status)) {
207
- return
208
- }
209
- }
210
-
211
- const template = yield* planTemplateService.getTemplate(cycle.templateId)
212
- if (!template) {
213
- return yield* new PlanTemplateNotFoundForCycleError({
214
- templateId: recordIdToString(cycle.templateId, TABLES.PLAN_TEMPLATE),
215
- message: `Template not found for cycle: ${recordIdToString(cycle.templateId, TABLES.PLAN_TEMPLATE)}`,
214
+ const template = yield* planTemplateService.getTemplate(cycle.templateId)
215
+ if (!template) {
216
+ return yield* new PlanTemplateNotFoundForCycleError({
217
+ templateId: recordIdToString(cycle.templateId, TABLES.PLAN_TEMPLATE),
218
+ message: `Template not found for cycle: ${recordIdToString(cycle.templateId, TABLES.PLAN_TEMPLATE)}`,
219
+ })
220
+ }
221
+
222
+ let previousRunArtifacts: PlanArtifactRecord[] = []
223
+ if (currentRunId !== undefined) {
224
+ previousRunArtifacts = yield* db
225
+ .findMany(TABLES.PLAN_ARTIFACT, { runId: ensureRecordId(currentRunId, TABLES.PLAN_RUN) }, PlanArtifactSchema, {
226
+ orderBy: 'createdAt',
227
+ orderDir: 'ASC',
216
228
  })
217
- }
229
+ .pipe(Effect.withSpan('PlanCycle.loadPreviousRunArtifacts'))
230
+ }
218
231
 
219
- let previousRunArtifacts: PlanArtifactRecord[] = []
220
- if (currentRunId !== undefined) {
221
- previousRunArtifacts = yield* db.findMany(
222
- TABLES.PLAN_ARTIFACT,
223
- { runId: ensureRecordId(currentRunId, TABLES.PLAN_RUN) },
224
- PlanArtifactSchema,
225
- { orderBy: 'createdAt', orderDir: 'ASC' },
226
- )
227
- }
228
-
229
- const draft = buildCarryForwardDraft({ template, previousRunArtifacts, policy: cycle.carryForwardPolicy })
232
+ const draft = buildCarryForwardDraft({ template, previousRunArtifacts, policy: cycle.carryForwardPolicy })
230
233
 
231
- const result = yield* planTemplateService.instantiate({
234
+ const result = yield* planTemplateService
235
+ .instantiate({
232
236
  templateId: cycle.templateId,
233
237
  organizationId: cycle.organizationId,
234
238
  threadId: cycle.threadId,
235
239
  leadAgentId: 'system',
236
240
  overrides: draft,
237
241
  })
242
+ .pipe(Effect.withSpan('PlanCycle.instantiateTemplate'))
238
243
 
239
- const newRunId = result.plan?.runId
240
- const updatePayload: { currentRunId?: RecordIdInput; currentIteration: number } = {
241
- currentIteration: cycle.currentIteration + 1,
242
- }
243
- if (newRunId !== undefined) {
244
- updatePayload.currentRunId = ensureRecordId(newRunId, TABLES.PLAN_RUN)
245
- }
246
-
247
- yield* db.update(
248
- TABLES.PLAN_CYCLE,
249
- ensureRecordId(cycleId, TABLES.PLAN_CYCLE),
250
- updatePayload,
251
- PlanCycleRecordSchema,
252
- )
253
- })
254
- }
255
-
256
- function cancelCycleEffect(cycleId: RecordIdInput) {
257
- return Effect.gen(function* () {
258
- const cycle = yield* getCycleEffect(cycleId)
259
- if (!cycle) {
260
- return yield* new PlanCycleNotFoundError({
261
- cycleId: recordIdToString(cycleId, TABLES.PLAN_CYCLE),
262
- message: `Cycle not found: ${recordIdToString(cycleId, TABLES.PLAN_CYCLE)}`,
263
- })
264
- }
265
-
266
- const scheduleId = cycle.scheduleId
267
- if (scheduleId !== undefined) {
268
- yield* planSchedulerService.cancelSchedule(scheduleId)
269
- }
244
+ const newRunId = result.plan?.runId
245
+ const updatePayload: { currentRunId?: RecordIdInput; currentIteration: number } = {
246
+ currentIteration: cycle.currentIteration + 1,
247
+ }
248
+ if (newRunId !== undefined) {
249
+ updatePayload.currentRunId = ensureRecordId(newRunId, TABLES.PLAN_RUN)
250
+ }
270
251
 
271
- yield* db.update(
272
- TABLES.PLAN_CYCLE,
273
- ensureRecordId(cycleId, TABLES.PLAN_CYCLE),
274
- { status: 'cancelled' },
275
- PlanCycleRecordSchema,
276
- )
277
- })
278
- }
252
+ yield* db.update(
253
+ TABLES.PLAN_CYCLE,
254
+ ensureRecordId(cycleId, TABLES.PLAN_CYCLE),
255
+ updatePayload,
256
+ PlanCycleRecordSchema,
257
+ )
258
+ })
259
+
260
+ const cancelCycleEffect = Effect.fn('PlanCycle.cancelCycle')(function* (cycleId: RecordIdInput) {
261
+ const cycle = yield* getCycleEffect(cycleId)
262
+ if (!cycle) {
263
+ return yield* new PlanCycleNotFoundError({
264
+ cycleId: recordIdToString(cycleId, TABLES.PLAN_CYCLE),
265
+ message: `Cycle not found: ${recordIdToString(cycleId, TABLES.PLAN_CYCLE)}`,
266
+ })
267
+ }
279
268
 
280
- function pauseCycleEffect(cycleId: RecordIdInput) {
281
- return Effect.gen(function* () {
282
- const cycle = yield* getCycleEffect(cycleId)
283
- if (!cycle) {
284
- return yield* new PlanCycleNotFoundError({
285
- cycleId: recordIdToString(cycleId, TABLES.PLAN_CYCLE),
286
- message: `Cycle not found: ${recordIdToString(cycleId, TABLES.PLAN_CYCLE)}`,
287
- })
288
- }
269
+ const scheduleId = cycle.scheduleId
270
+ if (scheduleId !== undefined) {
271
+ yield* planSchedulerService.cancelSchedule(scheduleId)
272
+ }
289
273
 
290
- const scheduleId = cycle.scheduleId
291
- if (scheduleId !== undefined) {
292
- yield* planSchedulerService.pauseSchedule(scheduleId)
293
- }
274
+ yield* db.update(
275
+ TABLES.PLAN_CYCLE,
276
+ ensureRecordId(cycleId, TABLES.PLAN_CYCLE),
277
+ { status: 'cancelled' },
278
+ PlanCycleRecordSchema,
279
+ )
280
+ })
281
+
282
+ const pauseCycleEffect = Effect.fn('PlanCycle.pauseCycle')(function* (cycleId: RecordIdInput) {
283
+ const cycle = yield* getCycleEffect(cycleId)
284
+ if (!cycle) {
285
+ return yield* new PlanCycleNotFoundError({
286
+ cycleId: recordIdToString(cycleId, TABLES.PLAN_CYCLE),
287
+ message: `Cycle not found: ${recordIdToString(cycleId, TABLES.PLAN_CYCLE)}`,
288
+ })
289
+ }
294
290
 
295
- yield* db.update(
296
- TABLES.PLAN_CYCLE,
297
- ensureRecordId(cycleId, TABLES.PLAN_CYCLE),
298
- { status: 'paused' },
299
- PlanCycleRecordSchema,
300
- )
301
- })
302
- }
291
+ const scheduleId = cycle.scheduleId
292
+ if (scheduleId !== undefined) {
293
+ yield* planSchedulerService.pauseSchedule(scheduleId)
294
+ }
303
295
 
304
- function resumeCycleEffect(cycleId: RecordIdInput) {
305
- return Effect.gen(function* () {
306
- const cycle = yield* getCycleEffect(cycleId)
307
- if (!cycle) {
308
- return yield* new PlanCycleNotFoundError({
309
- cycleId: recordIdToString(cycleId, TABLES.PLAN_CYCLE),
310
- message: `Cycle not found: ${recordIdToString(cycleId, TABLES.PLAN_CYCLE)}`,
311
- })
312
- }
296
+ yield* db.update(
297
+ TABLES.PLAN_CYCLE,
298
+ ensureRecordId(cycleId, TABLES.PLAN_CYCLE),
299
+ { status: 'paused' },
300
+ PlanCycleRecordSchema,
301
+ )
302
+ })
303
+
304
+ const resumeCycleEffect = Effect.fn('PlanCycle.resumeCycle')(function* (cycleId: RecordIdInput) {
305
+ const cycle = yield* getCycleEffect(cycleId)
306
+ if (!cycle) {
307
+ return yield* new PlanCycleNotFoundError({
308
+ cycleId: recordIdToString(cycleId, TABLES.PLAN_CYCLE),
309
+ message: `Cycle not found: ${recordIdToString(cycleId, TABLES.PLAN_CYCLE)}`,
310
+ })
311
+ }
313
312
 
314
- const scheduleId = cycle.scheduleId
315
- if (scheduleId !== undefined) {
316
- yield* planSchedulerService.resumeSchedule(scheduleId)
317
- }
313
+ const scheduleId = cycle.scheduleId
314
+ if (scheduleId !== undefined) {
315
+ yield* planSchedulerService.resumeSchedule(scheduleId)
316
+ }
318
317
 
319
- yield* db.update(
320
- TABLES.PLAN_CYCLE,
321
- ensureRecordId(cycleId, TABLES.PLAN_CYCLE),
322
- { status: 'active' },
323
- PlanCycleRecordSchema,
324
- )
325
- })
326
- }
318
+ yield* db.update(
319
+ TABLES.PLAN_CYCLE,
320
+ ensureRecordId(cycleId, TABLES.PLAN_CYCLE),
321
+ { status: 'active' },
322
+ PlanCycleRecordSchema,
323
+ )
324
+ })
327
325
 
328
- function listCyclesEffect(threadId: RecordIdInput) {
329
- return db.findMany(
326
+ const listCyclesEffect = Effect.fn('PlanCycle.listCycles')(function* (threadId: RecordIdInput) {
327
+ return yield* db.findMany(
330
328
  TABLES.PLAN_CYCLE,
331
329
  { threadId: ensureRecordId(threadId, TABLES.THREAD) },
332
330
  PlanCycleRecordSchema,
333
331
  { orderBy: 'createdAt', orderDir: 'ASC' },
334
332
  )
335
- }
333
+ })
336
334
 
337
335
  return {
338
336
  cycleScheduleToSpec,
339
- createCycle(params: {
340
- organizationId: RecordIdInput
341
- threadId: RecordIdInput
342
- templateId: RecordIdInput
343
- name: string
344
- schedule: CycleSchedule
345
- carryForwardPolicy?: CarryForwardPolicy
346
- leadAgentId: string
347
- }): Promise<PlanCycleRecord> {
348
- return runPromise(createCycleEffect(params))
349
- },
350
-
351
- advanceCycle(cycleId: RecordIdInput): Promise<void> {
352
- return runPromise(advanceCycleEffect(cycleId))
353
- },
354
-
337
+ createCycle: createCycleEffect,
338
+ advanceCycle: advanceCycleEffect,
355
339
  buildCarryForwardDraft(params: {
356
340
  template: PlanTemplateRecord
357
341
  previousRunArtifacts: PlanArtifactRecord[]
@@ -359,33 +343,18 @@ export function makePlanCycleService(deps: PlanCycleDeps) {
359
343
  }): PlanDraft {
360
344
  return buildCarryForwardDraft(params)
361
345
  },
362
-
363
- cancelCycle(cycleId: RecordIdInput): Promise<void> {
364
- return runPromise(cancelCycleEffect(cycleId))
365
- },
366
-
367
- pauseCycle(cycleId: RecordIdInput): Promise<void> {
368
- return runPromise(pauseCycleEffect(cycleId))
369
- },
370
-
371
- resumeCycle(cycleId: RecordIdInput): Promise<void> {
372
- return runPromise(resumeCycleEffect(cycleId))
373
- },
374
-
375
- listCycles(threadId: RecordIdInput): Promise<PlanCycleRecord[]> {
376
- return runPromise(listCyclesEffect(threadId))
377
- },
378
-
379
- getCycle(cycleId: RecordIdInput): Promise<PlanCycleRecord | null> {
380
- return runPromise(getCycleEffect(cycleId))
381
- },
346
+ cancelCycle: cancelCycleEffect,
347
+ pauseCycle: pauseCycleEffect,
348
+ resumeCycle: resumeCycleEffect,
349
+ listCycles: listCyclesEffect,
350
+ getCycle: getCycleEffect,
382
351
  }
383
352
  }
384
353
 
385
354
  export class PlanCycleServiceTag extends Context.Service<
386
355
  PlanCycleServiceTag,
387
356
  ReturnType<typeof makePlanCycleService>
388
- >()('PlanCycleService') {}
357
+ >()('@lota-sdk/core/PlanCycleService') {}
389
358
 
390
359
  export const PlanCycleServiceLive = Layer.effect(
391
360
  PlanCycleServiceTag,