@lota-sdk/core 0.2.3 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/infrastructure/schema/00_identity.surql +2 -2
- package/infrastructure/schema/00_thread.surql +73 -0
- package/infrastructure/schema/02_execution_plan.surql +10 -11
- package/infrastructure/schema/04_runtime_bootstrap.surql +1 -0
- package/infrastructure/schema/10_autonomous_job.surql +3 -3
- package/package.json +2 -2
- package/src/ai/definitions.ts +1 -1
- package/src/config/agent-defaults.ts +5 -5
- package/src/config/index.ts +1 -1
- package/src/config/thread-defaults.ts +72 -0
- package/src/create-runtime.ts +90 -94
- package/src/db/record-id.ts +21 -21
- package/src/db/service.ts +44 -40
- package/src/db/tables.ts +3 -3
- package/src/db/{workstream-message-row.ts → thread-message-row.ts} +3 -3
- package/src/queues/context-compaction.queue.ts +6 -6
- package/src/queues/plan-agent-heartbeat.queue.ts +3 -3
- package/src/queues/post-chat-memory.queue.ts +1 -1
- package/src/queues/title-generation.queue.ts +10 -13
- package/src/redis/index.ts +1 -1
- package/src/redis/stream-context.ts +1 -1
- package/src/runtime/agent-identity-overrides.ts +1 -1
- package/src/runtime/agent-runtime-policy.ts +19 -21
- package/src/runtime/chat-request-routing.ts +1 -1
- package/src/runtime/context-compaction-constants.ts +1 -1
- package/src/runtime/context-compaction.ts +1 -1
- package/src/runtime/execution-plan.ts +1 -1
- package/src/runtime/index.ts +1 -1
- package/src/runtime/memory-digest-policy.ts +1 -1
- package/src/runtime/plugin-types.ts +1 -1
- package/src/runtime/post-turn-side-effects.ts +35 -35
- package/src/runtime/runtime-config.ts +24 -21
- package/src/runtime/runtime-extensions.ts +11 -11
- package/src/runtime/social-chat-agent-runner.ts +3 -3
- package/src/runtime/social-chat-history.ts +1 -1
- package/src/runtime/social-chat.ts +6 -6
- package/src/runtime/team-consultation-orchestrator.ts +1 -1
- package/src/runtime/{workstream-chat-helpers.ts → thread-chat-helpers.ts} +7 -7
- package/src/runtime/{workstream-plan-turn.ts → thread-plan-turn.ts} +11 -17
- package/src/runtime/{workstream-turn-context.ts → thread-turn-context.ts} +10 -10
- package/src/services/agent-activity.service.ts +39 -44
- package/src/services/agent-executor.service.ts +17 -19
- package/src/services/attachment.service.ts +4 -8
- package/src/services/autonomous-job.service.ts +29 -28
- package/src/services/context-compaction.service.ts +19 -29
- package/src/services/execution-plan.service.ts +58 -70
- package/src/services/global-orchestrator.service.ts +5 -5
- package/src/services/index.ts +6 -6
- package/src/services/memory.service.ts +1 -1
- package/src/services/monitoring-window.service.ts +2 -2
- package/src/services/mutating-approval.service.ts +7 -10
- package/src/services/node-workspace.service.ts +8 -7
- package/src/services/notification.service.ts +1 -1
- package/src/services/organization.service.ts +9 -9
- package/src/services/ownership-dispatcher.service.ts +13 -19
- package/src/services/plan-agent-heartbeat.service.ts +13 -13
- package/src/services/plan-agent-query.service.ts +7 -7
- package/src/services/plan-artifact.service.ts +1 -2
- package/src/services/plan-coordination.service.ts +4 -4
- package/src/services/plan-cycle.service.ts +7 -7
- package/src/services/plan-deadline.service.ts +4 -4
- package/src/services/plan-event-delivery.service.ts +8 -12
- package/src/services/plan-executor.service.ts +25 -39
- package/src/services/plan-run-data.ts +27 -8
- package/src/services/plan-run.service.ts +7 -9
- package/src/services/plan-scheduler.service.ts +4 -4
- package/src/services/plan-template.service.ts +2 -2
- package/src/services/plan-validator.service.ts +0 -11
- package/src/services/plugin-executor.service.ts +1 -1
- package/src/services/queue-job.service.ts +1 -1
- package/src/services/recent-activity-title.service.ts +1 -1
- package/src/services/recent-activity.service.ts +4 -4
- package/src/services/system-executor.service.ts +2 -2
- package/src/services/{workstream-message.service.ts → thread-message.service.ts} +72 -76
- package/src/services/thread-plan-registry.service.ts +22 -0
- package/src/services/thread-title.service.ts +39 -0
- package/src/services/{workstream-turn-preparation.service.ts → thread-turn-preparation.service.ts} +148 -171
- package/src/services/{workstream-turn.ts → thread-turn.ts} +27 -31
- package/src/services/thread.service.ts +853 -0
- package/src/services/thread.types.ts +17 -0
- package/src/storage/attachment-storage.service.ts +4 -4
- package/src/system-agents/index.ts +1 -1
- package/src/system-agents/memory.agent.ts +1 -1
- package/src/system-agents/recent-activity-title-refiner.agent.ts +2 -2
- package/src/system-agents/regular-chat-memory-digest.agent.ts +1 -1
- package/src/system-agents/researcher.agent.ts +3 -3
- package/src/system-agents/{workstream-router.agent.ts → thread-router.agent.ts} +68 -135
- package/src/system-agents/title-generator.agent.ts +8 -8
- package/src/tools/execution-plan.tool.ts +39 -40
- package/src/tools/memory-block.tool.ts +4 -4
- package/src/tools/research-topic.tool.ts +1 -0
- package/src/tools/search-web.tool.ts +1 -1
- package/src/tools/search.tool.ts +4 -4
- package/src/tools/team-think.tool.ts +9 -9
- package/src/utils/async.ts +6 -7
- package/src/workers/regular-chat-memory-digest.helpers.ts +1 -1
- package/src/workers/regular-chat-memory-digest.runner.ts +43 -43
- package/src/workers/skill-extraction.runner.ts +9 -13
- package/src/workers/utils/{workstream-message-query.ts → thread-message-query.ts} +21 -21
- package/infrastructure/schema/00_workstream.surql +0 -64
- package/src/config/workstream-defaults.ts +0 -72
- package/src/services/workstream-plan-registry.service.ts +0 -22
- package/src/services/workstream-title.service.ts +0 -42
- package/src/services/workstream.service.ts +0 -803
- package/src/services/workstream.types.ts +0 -17
- /package/src/services/{workstream-constants.ts → thread-constants.ts} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
DEFINE TABLE IF NOT EXISTS organization SCHEMAFULL;
|
|
2
2
|
DEFINE FIELD IF NOT EXISTS name ON TABLE organization TYPE string;
|
|
3
|
-
DEFINE FIELD IF NOT EXISTS
|
|
4
|
-
DEFINE FIELD IF NOT EXISTS
|
|
3
|
+
DEFINE FIELD IF NOT EXISTS regularChatDigestLastThreadCursorCreatedAt ON TABLE organization TYPE option<datetime>;
|
|
4
|
+
DEFINE FIELD IF NOT EXISTS regularChatDigestLastThreadCursorId ON TABLE organization TYPE option<string>;
|
|
5
5
|
DEFINE FIELD IF NOT EXISTS skillExtractionLastCursorId ON TABLE organization TYPE option<string>;
|
|
6
6
|
DEFINE FIELD IF NOT EXISTS skillExtractionLastCursorCreatedAt ON TABLE organization TYPE option<datetime>;
|
|
7
7
|
DEFINE FIELD IF NOT EXISTS createdAt ON TABLE organization TYPE datetime DEFAULT time::now() READONLY;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
DEFINE TABLE IF NOT EXISTS thread SCHEMAFULL;
|
|
2
|
+
|
|
3
|
+
DEFINE FIELD IF NOT EXISTS organizationId ON thread TYPE record<organization>;
|
|
4
|
+
DEFINE FIELD IF NOT EXISTS userId ON thread TYPE record<user>;
|
|
5
|
+
DEFINE FIELD IF NOT EXISTS type ON thread TYPE string
|
|
6
|
+
ASSERT $value IN ['default', 'topic', 'thread', 'group']
|
|
7
|
+
DEFAULT 'group';
|
|
8
|
+
DEFINE FIELD IF NOT EXISTS agentId ON thread TYPE option<string>;
|
|
9
|
+
DEFINE FIELD IF NOT EXISTS threadType ON thread TYPE option<string>;
|
|
10
|
+
DEFINE FIELD IF NOT EXISTS members ON thread TYPE option<array<string>> DEFAULT [];
|
|
11
|
+
DEFINE FIELD IF NOT EXISTS title ON thread TYPE option<string>;
|
|
12
|
+
DEFINE FIELD IF NOT EXISTS nameGenerated ON thread TYPE bool DEFAULT false;
|
|
13
|
+
DEFINE FIELD IF NOT EXISTS status ON thread TYPE string
|
|
14
|
+
ASSERT $value IN ['active', 'archived']
|
|
15
|
+
DEFAULT 'active';
|
|
16
|
+
DEFINE FIELD IF NOT EXISTS activeRunId ON thread TYPE option<string>;
|
|
17
|
+
DEFINE FIELD IF NOT EXISTS activeStreamId ON thread TYPE option<string>;
|
|
18
|
+
DEFINE FIELD IF NOT EXISTS memoryBlock ON thread TYPE option<string>;
|
|
19
|
+
DEFINE FIELD IF NOT EXISTS memoryBlockSummary ON thread TYPE option<string>;
|
|
20
|
+
DEFINE FIELD IF NOT EXISTS compactionSummary ON thread TYPE option<string>;
|
|
21
|
+
DEFINE FIELD IF NOT EXISTS lastCompactedMessageId ON thread TYPE option<string>;
|
|
22
|
+
DEFINE FIELD IF NOT EXISTS isCompacting ON thread TYPE bool DEFAULT false;
|
|
23
|
+
DEFINE FIELD IF NOT EXISTS turnCount ON thread TYPE int DEFAULT 0;
|
|
24
|
+
DEFINE FIELD IF NOT EXISTS createdAt ON thread TYPE datetime DEFAULT time::now() READONLY;
|
|
25
|
+
DEFINE FIELD IF NOT EXISTS updatedAt ON thread TYPE datetime DEFAULT time::now() VALUE time::now();
|
|
26
|
+
|
|
27
|
+
DEFINE INDEX IF NOT EXISTS threadDefaultLookupIdx ON thread
|
|
28
|
+
FIELDS type, userId, organizationId, agentId UNIQUE;
|
|
29
|
+
|
|
30
|
+
DEFINE INDEX IF NOT EXISTS threadThreadLookupIdx ON thread
|
|
31
|
+
FIELDS type, userId, organizationId, threadType UNIQUE;
|
|
32
|
+
|
|
33
|
+
DEFINE INDEX IF NOT EXISTS threadOrgIdx ON thread FIELDS organizationId;
|
|
34
|
+
DEFINE INDEX IF NOT EXISTS threadUserIdx ON thread FIELDS userId;
|
|
35
|
+
DEFINE INDEX IF NOT EXISTS threadUserOrgTypeUpdatedIdx ON thread
|
|
36
|
+
FIELDS userId, organizationId, type, updatedAt;
|
|
37
|
+
DEFINE INDEX IF NOT EXISTS threadUserOrgStatusTypeUpdatedIdx ON thread
|
|
38
|
+
FIELDS userId, organizationId, status, type, updatedAt;
|
|
39
|
+
|
|
40
|
+
# Thread Message table (AI SDK UIMessage persistence).
|
|
41
|
+
# parts uses OVERWRITE on the wildcard to override the implicit non-FLEXIBLE
|
|
42
|
+
# definition that array<object> creates — this is the only way to allow
|
|
43
|
+
# arbitrary nested object shapes inside the array on SCHEMAFULL tables.
|
|
44
|
+
DEFINE TABLE IF NOT EXISTS threadMessage SCHEMAFULL;
|
|
45
|
+
DEFINE FIELD IF NOT EXISTS threadId ON TABLE threadMessage TYPE record<thread> REFERENCE ON DELETE CASCADE;
|
|
46
|
+
DEFINE FIELD IF NOT EXISTS messageId ON TABLE threadMessage TYPE string;
|
|
47
|
+
DEFINE FIELD IF NOT EXISTS role ON TABLE threadMessage TYPE string;
|
|
48
|
+
DEFINE FIELD IF NOT EXISTS parts ON TABLE threadMessage TYPE array<object> FLEXIBLE;
|
|
49
|
+
DEFINE FIELD OVERWRITE parts.* ON TABLE threadMessage TYPE object FLEXIBLE;
|
|
50
|
+
DEFINE FIELD IF NOT EXISTS metadata ON TABLE threadMessage TYPE option<object> FLEXIBLE;
|
|
51
|
+
DEFINE FIELD IF NOT EXISTS createdAt ON TABLE threadMessage TYPE datetime DEFAULT time::now() READONLY;
|
|
52
|
+
DEFINE FIELD IF NOT EXISTS updatedAt ON TABLE threadMessage TYPE datetime VALUE time::now();
|
|
53
|
+
|
|
54
|
+
DEFINE INDEX IF NOT EXISTS threadMessageThreadIdx ON TABLE threadMessage COLUMNS threadId;
|
|
55
|
+
DEFINE INDEX IF NOT EXISTS threadMessageThreadCreatedIdx ON TABLE threadMessage COLUMNS threadId, createdAt;
|
|
56
|
+
DEFINE INDEX IF NOT EXISTS threadMessageThreadMessageUniqueIdx ON TABLE threadMessage COLUMNS threadId, messageId UNIQUE;
|
|
57
|
+
|
|
58
|
+
# Thread attachments.
|
|
59
|
+
DEFINE TABLE IF NOT EXISTS threadAttachment SCHEMAFULL;
|
|
60
|
+
DEFINE FIELD IF NOT EXISTS threadId ON TABLE threadAttachment TYPE record<thread> REFERENCE ON DELETE CASCADE;
|
|
61
|
+
DEFINE FIELD IF NOT EXISTS messageId ON TABLE threadAttachment TYPE record<threadMessage> REFERENCE ON DELETE CASCADE;
|
|
62
|
+
DEFINE FIELD IF NOT EXISTS attachmentType ON TABLE threadAttachment TYPE string;
|
|
63
|
+
DEFINE FIELD IF NOT EXISTS name ON TABLE threadAttachment TYPE string;
|
|
64
|
+
DEFINE FIELD IF NOT EXISTS contentType ON TABLE threadAttachment TYPE string;
|
|
65
|
+
DEFINE FIELD IF NOT EXISTS storageKey ON TABLE threadAttachment TYPE option<string>;
|
|
66
|
+
DEFINE FIELD IF NOT EXISTS sizeBytes ON TABLE threadAttachment TYPE option<int>;
|
|
67
|
+
DEFINE FIELD IF NOT EXISTS url ON TABLE threadAttachment TYPE option<string>;
|
|
68
|
+
DEFINE FIELD IF NOT EXISTS createdAt ON TABLE threadAttachment TYPE datetime DEFAULT time::now() READONLY;
|
|
69
|
+
DEFINE FIELD IF NOT EXISTS updatedAt ON TABLE threadAttachment TYPE datetime VALUE time::now();
|
|
70
|
+
|
|
71
|
+
DEFINE INDEX IF NOT EXISTS threadAttachmentThreadIdx ON TABLE threadAttachment COLUMNS threadId;
|
|
72
|
+
DEFINE INDEX IF NOT EXISTS threadAttachmentMessageIdx ON TABLE threadAttachment COLUMNS messageId;
|
|
73
|
+
DEFINE INDEX IF NOT EXISTS threadAttachmentThreadMessageIdx ON TABLE threadAttachment COLUMNS threadId, messageId;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
DEFINE TABLE IF NOT EXISTS planSpec SCHEMAFULL;
|
|
4
4
|
DEFINE FIELD IF NOT EXISTS organizationId ON TABLE planSpec TYPE record<organization>;
|
|
5
|
-
DEFINE FIELD IF NOT EXISTS
|
|
5
|
+
DEFINE FIELD IF NOT EXISTS threadId ON TABLE planSpec TYPE record<thread> REFERENCE ON DELETE CASCADE;
|
|
6
6
|
DEFINE FIELD IF NOT EXISTS title ON TABLE planSpec TYPE string;
|
|
7
7
|
DEFINE FIELD IF NOT EXISTS objective ON TABLE planSpec TYPE string;
|
|
8
8
|
DEFINE FIELD IF NOT EXISTS version ON TABLE planSpec TYPE int;
|
|
@@ -29,8 +29,8 @@ DEFINE FIELD IF NOT EXISTS updatedAt ON TABLE planSpec TYPE datetime VALUE time:
|
|
|
29
29
|
DEFINE FIELD IF NOT EXISTS compiledAt ON TABLE planSpec TYPE option<datetime>;
|
|
30
30
|
|
|
31
31
|
DEFINE INDEX IF NOT EXISTS planSpecOrgIdx ON TABLE planSpec COLUMNS organizationId;
|
|
32
|
-
DEFINE INDEX IF NOT EXISTS
|
|
33
|
-
DEFINE INDEX IF NOT EXISTS
|
|
32
|
+
DEFINE INDEX IF NOT EXISTS planSpecThreadIdx ON TABLE planSpec COLUMNS threadId;
|
|
33
|
+
DEFINE INDEX IF NOT EXISTS planSpecThreadStatusIdx ON TABLE planSpec COLUMNS threadId, status;
|
|
34
34
|
|
|
35
35
|
DEFINE TABLE IF NOT EXISTS planNodeSpec SCHEMAFULL;
|
|
36
36
|
DEFINE FIELD IF NOT EXISTS planSpecId ON TABLE planNodeSpec TYPE record<planSpec> REFERENCE ON DELETE CASCADE;
|
|
@@ -85,7 +85,7 @@ DEFINE INDEX IF NOT EXISTS planNodeSpecPlanPositionIdx ON TABLE planNodeSpec COL
|
|
|
85
85
|
DEFINE TABLE IF NOT EXISTS planRun SCHEMAFULL;
|
|
86
86
|
DEFINE FIELD IF NOT EXISTS planSpecId ON TABLE planRun TYPE record<planSpec> REFERENCE ON DELETE CASCADE;
|
|
87
87
|
DEFINE FIELD IF NOT EXISTS organizationId ON TABLE planRun TYPE record<organization>;
|
|
88
|
-
DEFINE FIELD IF NOT EXISTS
|
|
88
|
+
DEFINE FIELD IF NOT EXISTS threadId ON TABLE planRun TYPE record<thread> REFERENCE ON DELETE CASCADE;
|
|
89
89
|
DEFINE FIELD IF NOT EXISTS leadAgentId ON TABLE planRun TYPE string;
|
|
90
90
|
DEFINE FIELD IF NOT EXISTS status ON TABLE planRun TYPE string;
|
|
91
91
|
DEFINE FIELD IF NOT EXISTS currentNodeId ON TABLE planRun TYPE option<string>;
|
|
@@ -102,8 +102,8 @@ DEFINE FIELD IF NOT EXISTS startedAt ON TABLE planRun TYPE option<datetime>;
|
|
|
102
102
|
DEFINE FIELD IF NOT EXISTS completedAt ON TABLE planRun TYPE option<datetime>;
|
|
103
103
|
|
|
104
104
|
DEFINE INDEX IF NOT EXISTS planRunOrgIdx ON TABLE planRun COLUMNS organizationId;
|
|
105
|
-
DEFINE INDEX IF NOT EXISTS
|
|
106
|
-
DEFINE INDEX IF NOT EXISTS
|
|
105
|
+
DEFINE INDEX IF NOT EXISTS planRunThreadIdx ON TABLE planRun COLUMNS threadId;
|
|
106
|
+
DEFINE INDEX IF NOT EXISTS planRunThreadStatusIdx ON TABLE planRun COLUMNS threadId, status;
|
|
107
107
|
DEFINE INDEX IF NOT EXISTS planRunSpecIdx ON TABLE planRun COLUMNS planSpecId;
|
|
108
108
|
|
|
109
109
|
DEFINE TABLE IF NOT EXISTS planNodeRun SCHEMAFULL;
|
|
@@ -116,7 +116,6 @@ DEFINE FIELD IF NOT EXISTS retryCount ON TABLE planNodeRun TYPE int DEFAULT 0;
|
|
|
116
116
|
DEFINE FIELD IF NOT EXISTS resolvedInput ON TABLE planNodeRun TYPE option<object> FLEXIBLE;
|
|
117
117
|
DEFINE FIELD IF NOT EXISTS latestStructuredOutput ON TABLE planNodeRun TYPE option<object> FLEXIBLE;
|
|
118
118
|
DEFINE FIELD IF NOT EXISTS latestNotes ON TABLE planNodeRun TYPE option<string>;
|
|
119
|
-
DEFINE FIELD IF NOT EXISTS handoffContext ON TABLE planNodeRun TYPE option<object> FLEXIBLE;
|
|
120
119
|
DEFINE FIELD IF NOT EXISTS latestAttemptId ON TABLE planNodeRun TYPE option<record<planNodeAttempt>>;
|
|
121
120
|
DEFINE FIELD IF NOT EXISTS blockedReason ON TABLE planNodeRun TYPE option<string>;
|
|
122
121
|
DEFINE FIELD IF NOT EXISTS failureClass ON TABLE planNodeRun TYPE option<string>;
|
|
@@ -232,7 +231,7 @@ DEFINE INDEX IF NOT EXISTS planEventRunTimeIdx ON TABLE planEvent COLUMNS runId,
|
|
|
232
231
|
|
|
233
232
|
DEFINE TABLE IF NOT EXISTS planSchedule SCHEMAFULL;
|
|
234
233
|
DEFINE FIELD IF NOT EXISTS organizationId ON TABLE planSchedule TYPE record<organization>;
|
|
235
|
-
DEFINE FIELD IF NOT EXISTS
|
|
234
|
+
DEFINE FIELD IF NOT EXISTS threadId ON TABLE planSchedule TYPE record<thread> REFERENCE ON DELETE CASCADE;
|
|
236
235
|
DEFINE FIELD IF NOT EXISTS planSpecId ON TABLE planSchedule TYPE option<record<planSpec>>;
|
|
237
236
|
DEFINE FIELD IF NOT EXISTS runId ON TABLE planSchedule TYPE option<record<planRun>>;
|
|
238
237
|
DEFINE FIELD IF NOT EXISTS nodeId ON TABLE planSchedule TYPE option<string>;
|
|
@@ -245,7 +244,7 @@ DEFINE FIELD IF NOT EXISTS createdAt ON TABLE planSchedule TYPE datetime DEFAULT
|
|
|
245
244
|
DEFINE FIELD IF NOT EXISTS updatedAt ON TABLE planSchedule TYPE datetime VALUE time::now();
|
|
246
245
|
DEFINE INDEX IF NOT EXISTS planScheduleStatusIdx ON TABLE planSchedule COLUMNS status;
|
|
247
246
|
DEFINE INDEX IF NOT EXISTS planScheduleNextFireIdx ON TABLE planSchedule COLUMNS status, nextFireAt;
|
|
248
|
-
DEFINE INDEX IF NOT EXISTS
|
|
247
|
+
DEFINE INDEX IF NOT EXISTS planScheduleThreadIdx ON TABLE planSchedule COLUMNS threadId;
|
|
249
248
|
|
|
250
249
|
DEFINE TABLE IF NOT EXISTS planTemplate SCHEMAFULL;
|
|
251
250
|
DEFINE FIELD IF NOT EXISTS organizationId ON TABLE planTemplate TYPE record<organization>;
|
|
@@ -262,7 +261,7 @@ DEFINE INDEX IF NOT EXISTS planTemplateOrgNameIdx ON TABLE planTemplate COLUMNS
|
|
|
262
261
|
|
|
263
262
|
DEFINE TABLE IF NOT EXISTS planCycle SCHEMAFULL;
|
|
264
263
|
DEFINE FIELD IF NOT EXISTS organizationId ON TABLE planCycle TYPE record<organization>;
|
|
265
|
-
DEFINE FIELD IF NOT EXISTS
|
|
264
|
+
DEFINE FIELD IF NOT EXISTS threadId ON TABLE planCycle TYPE record<thread> REFERENCE ON DELETE CASCADE;
|
|
266
265
|
DEFINE FIELD IF NOT EXISTS templateId ON TABLE planCycle TYPE record<planTemplate>;
|
|
267
266
|
DEFINE FIELD IF NOT EXISTS name ON TABLE planCycle TYPE string;
|
|
268
267
|
DEFINE FIELD IF NOT EXISTS schedule ON TABLE planCycle TYPE object FLEXIBLE;
|
|
@@ -273,5 +272,5 @@ DEFINE FIELD IF NOT EXISTS currentRunId ON TABLE planCycle TYPE option<record<pl
|
|
|
273
272
|
DEFINE FIELD IF NOT EXISTS scheduleId ON TABLE planCycle TYPE option<record<planSchedule>>;
|
|
274
273
|
DEFINE FIELD IF NOT EXISTS createdAt ON TABLE planCycle TYPE datetime DEFAULT time::now() READONLY;
|
|
275
274
|
DEFINE FIELD IF NOT EXISTS updatedAt ON TABLE planCycle TYPE datetime VALUE time::now();
|
|
276
|
-
DEFINE INDEX IF NOT EXISTS
|
|
275
|
+
DEFINE INDEX IF NOT EXISTS planCycleThreadIdx ON TABLE planCycle COLUMNS threadId;
|
|
277
276
|
DEFINE INDEX IF NOT EXISTS planCycleStatusIdx ON TABLE planCycle COLUMNS status;
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
DEFINE TABLE IF NOT EXISTS runtimeBootstrap SCHEMAFULL;
|
|
3
3
|
DEFINE FIELD IF NOT EXISTS key ON TABLE runtimeBootstrap TYPE string;
|
|
4
4
|
DEFINE FIELD IF NOT EXISTS schemaFingerprint ON TABLE runtimeBootstrap TYPE string;
|
|
5
|
+
DEFINE FIELD IF NOT EXISTS createdAt ON TABLE runtimeBootstrap TYPE datetime DEFAULT time::now() READONLY;
|
|
5
6
|
DEFINE FIELD IF NOT EXISTS readyAt ON TABLE runtimeBootstrap TYPE datetime;
|
|
6
7
|
DEFINE FIELD IF NOT EXISTS updatedAt ON TABLE runtimeBootstrap TYPE datetime VALUE time::now();
|
|
7
8
|
|
|
@@ -2,7 +2,7 @@ DEFINE TABLE IF NOT EXISTS autonomousJob SCHEMAFULL;
|
|
|
2
2
|
DEFINE FIELD IF NOT EXISTS organizationId ON TABLE autonomousJob TYPE record<organization>;
|
|
3
3
|
DEFINE FIELD IF NOT EXISTS ownerUserId ON TABLE autonomousJob TYPE record<user>;
|
|
4
4
|
DEFINE FIELD IF NOT EXISTS ownerUserName ON TABLE autonomousJob TYPE option<string>;
|
|
5
|
-
DEFINE FIELD IF NOT EXISTS
|
|
5
|
+
DEFINE FIELD IF NOT EXISTS threadId ON TABLE autonomousJob TYPE record<thread> REFERENCE ON DELETE CASCADE;
|
|
6
6
|
DEFINE FIELD IF NOT EXISTS agentId ON TABLE autonomousJob TYPE string;
|
|
7
7
|
DEFINE FIELD IF NOT EXISTS title ON TABLE autonomousJob TYPE string;
|
|
8
8
|
DEFINE FIELD IF NOT EXISTS prompt ON TABLE autonomousJob TYPE string;
|
|
@@ -20,12 +20,12 @@ DEFINE FIELD IF NOT EXISTS createdAt ON TABLE autonomousJob TYPE datetime DEFAUL
|
|
|
20
20
|
DEFINE FIELD IF NOT EXISTS updatedAt ON TABLE autonomousJob TYPE datetime VALUE time::now();
|
|
21
21
|
|
|
22
22
|
DEFINE INDEX IF NOT EXISTS autonomousJobOrgStatusIdx ON TABLE autonomousJob COLUMNS organizationId, status;
|
|
23
|
-
DEFINE INDEX IF NOT EXISTS
|
|
23
|
+
DEFINE INDEX IF NOT EXISTS autonomousJobThreadIdx ON TABLE autonomousJob COLUMNS threadId;
|
|
24
24
|
DEFINE INDEX IF NOT EXISTS autonomousJobOwnerIdx ON TABLE autonomousJob COLUMNS ownerUserId;
|
|
25
25
|
|
|
26
26
|
DEFINE TABLE IF NOT EXISTS autonomousJobRun SCHEMAFULL;
|
|
27
27
|
DEFINE FIELD IF NOT EXISTS autonomousJobId ON TABLE autonomousJobRun TYPE record<autonomousJob> REFERENCE ON DELETE CASCADE;
|
|
28
|
-
DEFINE FIELD IF NOT EXISTS
|
|
28
|
+
DEFINE FIELD IF NOT EXISTS threadId ON TABLE autonomousJobRun TYPE record<thread> REFERENCE ON DELETE CASCADE;
|
|
29
29
|
DEFINE FIELD IF NOT EXISTS queueJobId ON TABLE autonomousJobRun TYPE option<record<queueJob>>;
|
|
30
30
|
DEFINE FIELD IF NOT EXISTS status ON TABLE autonomousJobRun TYPE string;
|
|
31
31
|
DEFINE FIELD IF NOT EXISTS inputMessageId ON TABLE autonomousJobRun TYPE option<string>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lota-sdk/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./src/index.ts",
|
|
6
6
|
"types": "./src/index.ts",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"@chat-adapter/slack": "^4.23.0",
|
|
33
33
|
"@chat-adapter/state-ioredis": "^4.23.0",
|
|
34
34
|
"@logtape/logtape": "^2.0.5",
|
|
35
|
-
"@lota-sdk/shared": "0.
|
|
35
|
+
"@lota-sdk/shared": "0.3.1",
|
|
36
36
|
"@mendable/firecrawl-js": "^4.18.1",
|
|
37
37
|
"@surrealdb/node": "^3.0.3",
|
|
38
38
|
"ai": "^6.0.145",
|
package/src/ai/definitions.ts
CHANGED
|
@@ -129,7 +129,7 @@ Use this skill for any Lota SDK task that changes SurrealQL schema files, DB ser
|
|
|
129
129
|
|
|
130
130
|
<schema-rules>
|
|
131
131
|
- Default schema files to \`IF NOT EXISTS\`. Do not add migration DML, compatibility branches, or fallback logic.
|
|
132
|
-
- Avoid \`OVERWRITE\` unless SurrealDB itself requires a specific wildcard exception on a fresh database shape, such as \`
|
|
132
|
+
- Avoid \`OVERWRITE\` unless SurrealDB itself requires a specific wildcard exception on a fresh database shape, such as \`threadMessage.parts.*\` or \`planSpec.contextEnrichments.*\`.
|
|
133
133
|
- Treat the database as fresh. Replace incorrect definitions directly instead of layering migrations.
|
|
134
134
|
- Let SurrealDB own \`updatedAt\` when the schema uses \`VALUE time::now()\`. Do not write that field from application code.
|
|
135
135
|
- Keep flexible object fields explicit, for example \`TYPE option<object> FLEXIBLE\` or \`TYPE array<object> FLEXIBLE\`.
|
|
@@ -17,7 +17,7 @@ export let agentRoster: readonly string[] = []
|
|
|
17
17
|
export let leadAgentId = ''
|
|
18
18
|
export let teamConsultParticipants: readonly string[] = []
|
|
19
19
|
|
|
20
|
-
export interface
|
|
20
|
+
export interface CoreThreadProfile {
|
|
21
21
|
config: { coreType: string; agentId: string; title: string }
|
|
22
22
|
members: readonly string[]
|
|
23
23
|
tools: readonly string[]
|
|
@@ -25,7 +25,7 @@ export interface CoreWorkstreamProfile {
|
|
|
25
25
|
instructions: string
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
export let
|
|
28
|
+
export let getCoreThreadProfile: (coreType: string) => CoreThreadProfile = (_coreType) => ({
|
|
29
29
|
config: { coreType: _coreType, agentId: '', title: '' },
|
|
30
30
|
members: [],
|
|
31
31
|
tools: [],
|
|
@@ -41,7 +41,7 @@ export function configureAgents(config: {
|
|
|
41
41
|
descriptions?: Record<string, string>
|
|
42
42
|
routerModelId?: string
|
|
43
43
|
teamConsultParticipants: readonly string[]
|
|
44
|
-
|
|
44
|
+
getCoreThreadProfile?: (coreType: string) => CoreThreadProfile
|
|
45
45
|
}): void {
|
|
46
46
|
if (!config.roster.includes(config.leadAgentId)) {
|
|
47
47
|
throw new Error(`Lead agent "${config.leadAgentId}" must be present in the configured roster.`)
|
|
@@ -54,8 +54,8 @@ export function configureAgents(config: {
|
|
|
54
54
|
agentDescriptions = config.descriptions ?? {}
|
|
55
55
|
routerModelId = config.routerModelId
|
|
56
56
|
teamConsultParticipants = config.teamConsultParticipants
|
|
57
|
-
if (config.
|
|
58
|
-
|
|
57
|
+
if (config.getCoreThreadProfile) {
|
|
58
|
+
getCoreThreadProfile = config.getCoreThreadProfile
|
|
59
59
|
}
|
|
60
60
|
_agentRosterSet = null
|
|
61
61
|
_aliasMap = null
|
package/src/config/index.ts
CHANGED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export interface ThreadBootstrapWelcomeConfig {
|
|
2
|
+
defaultAgentId: string
|
|
3
|
+
buildMessageText: (params: { userName?: string | null }) => string
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
export interface LotaThreadBootstrapConfig {
|
|
7
|
+
onboardingDefaultAgents?: readonly string[]
|
|
8
|
+
completedDefaultAgents?: readonly string[]
|
|
9
|
+
threadTypesAfterOnboarding?: readonly string[]
|
|
10
|
+
ensureDefaultGroupOnCompleted?: boolean
|
|
11
|
+
onboardingWelcome?: ThreadBootstrapWelcomeConfig
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface LotaThreadConfig {
|
|
15
|
+
bootstrap?: LotaThreadBootstrapConfig
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
interface ResolvedThreadBootstrapConfig {
|
|
19
|
+
onboardingDefaultAgents: readonly string[]
|
|
20
|
+
completedDefaultAgents: readonly string[]
|
|
21
|
+
threadTypesAfterOnboarding: readonly string[]
|
|
22
|
+
ensureDefaultGroupOnCompleted: boolean
|
|
23
|
+
onboardingWelcome?: ThreadBootstrapWelcomeConfig
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const DEFAULT_THREAD_BOOTSTRAP_CONFIG: ResolvedThreadBootstrapConfig = {
|
|
27
|
+
onboardingDefaultAgents: [],
|
|
28
|
+
completedDefaultAgents: [],
|
|
29
|
+
threadTypesAfterOnboarding: [],
|
|
30
|
+
ensureDefaultGroupOnCompleted: true,
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
let resolvedThreadBootstrapConfig: ResolvedThreadBootstrapConfig = DEFAULT_THREAD_BOOTSTRAP_CONFIG
|
|
34
|
+
|
|
35
|
+
function withDedupedStrings(values: readonly string[]): string[] {
|
|
36
|
+
const seen = new Set<string>()
|
|
37
|
+
const deduped: string[] = []
|
|
38
|
+
|
|
39
|
+
for (const value of values) {
|
|
40
|
+
const normalized = value.trim()
|
|
41
|
+
if (!normalized || seen.has(normalized)) continue
|
|
42
|
+
seen.add(normalized)
|
|
43
|
+
deduped.push(normalized)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return deduped
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function configureThreads(params: { agentRoster: readonly string[]; config?: LotaThreadConfig }): void {
|
|
50
|
+
const bootstrap = params.config?.bootstrap
|
|
51
|
+
const onboardingWelcome = bootstrap?.onboardingWelcome
|
|
52
|
+
const onboardingDefaultAgents = withDedupedStrings([
|
|
53
|
+
...(bootstrap?.onboardingDefaultAgents ?? params.agentRoster),
|
|
54
|
+
...(onboardingWelcome ? [onboardingWelcome.defaultAgentId] : []),
|
|
55
|
+
])
|
|
56
|
+
|
|
57
|
+
resolvedThreadBootstrapConfig = {
|
|
58
|
+
onboardingDefaultAgents,
|
|
59
|
+
completedDefaultAgents: withDedupedStrings(bootstrap?.completedDefaultAgents ?? params.agentRoster),
|
|
60
|
+
threadTypesAfterOnboarding: withDedupedStrings(bootstrap?.threadTypesAfterOnboarding ?? []),
|
|
61
|
+
ensureDefaultGroupOnCompleted: bootstrap?.ensureDefaultGroupOnCompleted ?? true,
|
|
62
|
+
...(onboardingWelcome ? { onboardingWelcome } : {}),
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function getThreadBootstrapConfig(): ResolvedThreadBootstrapConfig {
|
|
67
|
+
return resolvedThreadBootstrapConfig
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function resolveOnboardingOwnerAgentId(defaultLeadAgentId: string): string {
|
|
71
|
+
return resolvedThreadBootstrapConfig.onboardingWelcome?.defaultAgentId ?? defaultLeadAgentId
|
|
72
|
+
}
|