@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.
- package/package.json +2 -2
- package/src/ai/embedding-cache.ts +3 -1
- package/src/ai-gateway/ai-gateway.ts +164 -82
- package/src/ai-gateway/index.ts +16 -1
- package/src/config/agent-defaults.ts +4 -107
- package/src/config/agent-types.ts +1 -1
- package/src/config/background-processing.ts +1 -1
- package/src/config/index.ts +0 -1
- package/src/config/logger.ts +22 -25
- package/src/config/thread-defaults.ts +1 -10
- package/src/create-runtime.ts +145 -670
- package/src/db/base.service.ts +30 -38
- package/src/db/memory-query-builder.ts +2 -1
- package/src/db/memory-store.ts +29 -20
- package/src/db/memory.ts +188 -195
- package/src/db/service-normalization.ts +97 -64
- package/src/db/service.ts +496 -384
- package/src/db/startup.ts +30 -19
- package/src/effect/helpers.ts +30 -5
- package/src/effect/index.ts +7 -7
- package/src/effect/layers.ts +75 -72
- package/src/effect/services.ts +15 -11
- package/src/embeddings/provider.ts +65 -71
- package/src/index.ts +13 -12
- package/src/queues/autonomous-job.queue.ts +177 -143
- package/src/queues/context-compaction.queue.ts +41 -39
- package/src/queues/delayed-node-promotion.queue.ts +61 -42
- package/src/queues/document-processor.queue.ts +5 -3
- package/src/queues/index.ts +1 -0
- package/src/queues/memory-consolidation.queue.ts +79 -53
- package/src/queues/organization-learning.queue.ts +70 -33
- package/src/queues/plan-agent-heartbeat.queue.ts +111 -83
- package/src/queues/plan-scheduler.queue.ts +101 -97
- package/src/queues/post-chat-memory.queue.ts +56 -46
- package/src/queues/queue-factory.ts +146 -69
- package/src/queues/queues.service.ts +61 -0
- package/src/queues/title-generation.queue.ts +44 -44
- package/src/redis/connection.ts +181 -164
- package/src/redis/org-memory-lock.ts +24 -9
- package/src/redis/redis-lease-lock.ts +8 -1
- package/src/redis/stream-context.ts +17 -9
- package/src/runtime/agent-identity-overrides.ts +7 -3
- package/src/runtime/agent-runtime-policy.ts +10 -5
- package/src/runtime/agent-stream-helpers.ts +24 -15
- package/src/runtime/chat-run-orchestration.ts +1 -1
- package/src/runtime/context-compaction/context-compaction-runtime.ts +28 -32
- package/src/runtime/context-compaction/context-compaction.ts +131 -85
- package/src/runtime/domain-layer.ts +203 -0
- package/src/runtime/execution-plan-visibility.ts +5 -2
- package/src/runtime/graph-designer.ts +0 -14
- package/src/runtime/helper-model.ts +8 -4
- package/src/runtime/index.ts +1 -1
- package/src/runtime/indexed-repositories-policy.ts +2 -6
- package/src/runtime/memory/memory-block.ts +19 -9
- package/src/runtime/memory/memory-pipeline.ts +53 -66
- package/src/runtime/memory/memory-scope.ts +33 -29
- package/src/runtime/plugin-resolution.ts +58 -62
- package/src/runtime/post-turn-side-effects.ts +139 -161
- package/src/runtime/retrieval-adapters.ts +4 -4
- package/src/runtime/runtime-config.ts +3 -9
- package/src/runtime/runtime-extensions.ts +0 -43
- package/src/runtime/runtime-lifecycle.ts +124 -0
- package/src/runtime/runtime-services.ts +455 -0
- package/src/runtime/runtime-worker-registry.ts +113 -30
- package/src/runtime/social-chat/social-chat-agent-runner.ts +13 -8
- package/src/runtime/social-chat/social-chat-history.ts +24 -13
- package/src/runtime/social-chat/social-chat.ts +420 -369
- package/src/runtime/team-consultation/team-consultation-orchestrator.ts +64 -57
- package/src/runtime/team-consultation/team-consultation-prompts.ts +11 -6
- package/src/runtime/thread-chat-helpers.ts +18 -9
- package/src/runtime/thread-turn-context.ts +28 -74
- package/src/runtime/turn-lifecycle.ts +6 -14
- package/src/services/agent-activity.service.ts +169 -176
- package/src/services/agent-executor.service.ts +207 -196
- package/src/services/artifact.service.ts +10 -5
- package/src/services/attachment.service.ts +16 -48
- package/src/services/autonomous-job.service.ts +81 -87
- package/src/services/background-work.service.ts +54 -0
- package/src/services/chat-run-registry.service.ts +3 -1
- package/src/services/context-compaction.service.ts +8 -10
- package/src/services/document-chunk.service.ts +8 -17
- package/src/services/execution-plan/execution-plan-graph.ts +122 -109
- package/src/services/execution-plan/execution-plan-schedule.ts +1 -15
- package/src/services/execution-plan/execution-plan.service.ts +68 -51
- package/src/services/feedback-loop.service.ts +1 -1
- package/src/services/global-orchestrator.service.ts +49 -15
- package/src/services/graph-full-routing.ts +49 -37
- package/src/services/index.ts +1 -0
- package/src/services/institutional-memory.service.ts +8 -17
- package/src/services/learned-skill.service.ts +38 -35
- package/src/services/memory/memory-conversation.ts +10 -5
- package/src/services/memory/memory-errors.ts +27 -0
- package/src/services/memory/memory-org-memory.ts +14 -3
- package/src/services/memory/memory-preseeded.ts +10 -4
- package/src/services/memory/memory-utils.ts +2 -1
- package/src/services/memory/memory.service.ts +37 -52
- package/src/services/memory/rerank.service.ts +3 -11
- package/src/services/monitoring-window.service.ts +1 -1
- package/src/services/mutating-approval.service.ts +1 -1
- package/src/services/node-workspace.service.ts +2 -2
- package/src/services/notification.service.ts +16 -4
- package/src/services/organization-member.service.ts +1 -1
- package/src/services/organization.service.ts +34 -51
- package/src/services/ownership-dispatcher.service.ts +148 -95
- package/src/services/plan/plan-agent-heartbeat.service.ts +30 -16
- package/src/services/plan/plan-agent-query.service.ts +13 -9
- package/src/services/plan/plan-approval.service.ts +52 -48
- package/src/services/plan/plan-artifact.service.ts +2 -2
- package/src/services/plan/plan-builder.service.ts +2 -2
- package/src/services/plan/plan-checkpoint.service.ts +1 -1
- package/src/services/plan/plan-compiler.service.ts +1 -1
- package/src/services/plan/plan-completion-side-effects.ts +99 -113
- package/src/services/plan/plan-coordination.service.ts +1 -1
- package/src/services/plan/plan-cycle.service.ts +171 -202
- package/src/services/plan/plan-deadline.service.ts +304 -307
- package/src/services/plan/plan-event-delivery.service.ts +84 -72
- package/src/services/plan/plan-executor-context.ts +2 -0
- package/src/services/plan/plan-executor-graph.ts +375 -353
- package/src/services/plan/plan-executor-helpers.ts +60 -75
- package/src/services/plan/plan-executor.service.ts +494 -489
- package/src/services/plan/plan-run.service.ts +12 -19
- package/src/services/plan/plan-scheduler.service.ts +89 -82
- package/src/services/plan/plan-template.service.ts +1 -1
- package/src/services/plan/plan-transaction-events.ts +8 -5
- package/src/services/plan/plan-validator.service.ts +1 -1
- package/src/services/plan/plan-workspace.service.ts +17 -11
- package/src/services/plugin-executor.service.ts +26 -21
- package/src/services/quality-metrics.service.ts +1 -1
- package/src/services/queue-job.service.ts +8 -17
- package/src/services/recent-activity-title.service.ts +22 -10
- package/src/services/recent-activity.service.ts +1 -1
- package/src/services/skill-resolver.service.ts +1 -1
- package/src/services/social-chat-history.service.ts +37 -20
- package/src/services/system-executor.service.ts +25 -20
- package/src/services/thread/thread-bootstrap.ts +37 -19
- package/src/services/thread/thread-listing.ts +2 -1
- package/src/services/thread/thread-memory-block.ts +18 -5
- package/src/services/thread/thread-message.service.ts +30 -13
- package/src/services/thread/thread-title.service.ts +1 -1
- package/src/services/thread/thread-turn-execution.ts +87 -83
- package/src/services/thread/thread-turn-preparation.service.ts +65 -40
- package/src/services/thread/thread-turn-streaming.ts +32 -36
- package/src/services/thread/thread-turn.ts +43 -29
- package/src/services/thread/thread.service.ts +32 -8
- package/src/services/user.service.ts +1 -1
- package/src/services/write-intent-validator.service.ts +1 -1
- package/src/storage/attachment-storage.service.ts +7 -4
- package/src/storage/generated-document-storage.service.ts +1 -1
- package/src/system-agents/context-compaction.agent.ts +1 -1
- package/src/system-agents/helper-agent-options.ts +1 -1
- package/src/system-agents/memory-reranker.agent.ts +1 -1
- package/src/system-agents/memory.agent.ts +1 -1
- package/src/system-agents/recent-activity-title-refiner.agent.ts +9 -6
- package/src/system-agents/regular-chat-memory-digest.agent.ts +1 -1
- package/src/system-agents/skill-extractor.agent.ts +1 -1
- package/src/system-agents/skill-manager.agent.ts +1 -1
- package/src/system-agents/thread-router.agent.ts +23 -20
- package/src/system-agents/title-generator.agent.ts +1 -1
- package/src/tools/execution-plan.tool.ts +36 -20
- package/src/tools/fetch-webpage.tool.ts +30 -22
- package/src/tools/firecrawl-client.ts +1 -6
- package/src/tools/plan-approval.tool.ts +9 -1
- package/src/tools/remember-memory.tool.ts +3 -6
- package/src/tools/research-topic.tool.ts +12 -3
- package/src/tools/search-web.tool.ts +26 -18
- package/src/tools/search.tool.ts +4 -5
- package/src/tools/team-think.tool.ts +139 -121
- package/src/utils/async.ts +15 -6
- package/src/utils/errors.ts +27 -15
- package/src/workers/bootstrap.ts +34 -58
- package/src/workers/memory-consolidation.worker.ts +4 -1
- package/src/workers/organization-learning.worker.ts +16 -3
- package/src/workers/regular-chat-memory-digest.helpers.ts +3 -4
- package/src/workers/regular-chat-memory-digest.runner.ts +46 -29
- package/src/workers/skill-extraction.runner.ts +13 -15
- package/src/workers/worker-utils.ts +14 -8
- package/src/config/search.ts +0 -3
- package/src/effect/awaitable-effect.ts +0 -87
- package/src/effect/runtime-ref.ts +0 -25
- package/src/effect/runtime.ts +0 -31
- package/src/redis/runtime-connection.ts +0 -10
- 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
|
-
|
|
114
|
-
return db.findOne(
|
|
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
|
-
|
|
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
|
-
|
|
127
|
-
const now = nowDate()
|
|
128
|
+
const now = nowDate()
|
|
128
129
|
|
|
129
|
-
|
|
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
|
-
|
|
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
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
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
|
-
|
|
186
|
+
return updated ?? cycle
|
|
187
|
+
})
|
|
165
188
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
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
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
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
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
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
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
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
|
-
|
|
291
|
-
|
|
292
|
-
|
|
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
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
PlanCycleRecordSchema,
|
|
300
|
-
)
|
|
301
|
-
})
|
|
302
|
-
}
|
|
291
|
+
const scheduleId = cycle.scheduleId
|
|
292
|
+
if (scheduleId !== undefined) {
|
|
293
|
+
yield* planSchedulerService.pauseSchedule(scheduleId)
|
|
294
|
+
}
|
|
303
295
|
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
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
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
313
|
+
const scheduleId = cycle.scheduleId
|
|
314
|
+
if (scheduleId !== undefined) {
|
|
315
|
+
yield* planSchedulerService.resumeSchedule(scheduleId)
|
|
316
|
+
}
|
|
318
317
|
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
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
|
-
|
|
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
|
|
340
|
-
|
|
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
|
-
|
|
364
|
-
|
|
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,
|