@lota-sdk/core 0.3.3 → 0.4.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lota-sdk/core",
3
- "version": "0.3.3",
3
+ "version": "0.4.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.3.3",
35
+ "@lota-sdk/shared": "0.4.1",
36
36
  "@mendable/firecrawl-js": "^4.18.1",
37
37
  "@surrealdb/node": "^3.0.3",
38
38
  "ai": "^6.0.145",
@@ -56,10 +56,7 @@ function parseAiGatewayJsonRequestBody(body: BodyInit | null | undefined): Recor
56
56
  }
57
57
 
58
58
  function withDefaultAiGatewayCacheHeaders(params: AiGatewayCallOptions): AiGatewayCallOptions {
59
- return {
60
- ...params,
61
- headers: mergeAiGatewayHeaders(params.headers, buildAiGatewayCacheHeaders('lota-sdk')),
62
- }
59
+ return { ...params, headers: mergeAiGatewayHeaders(params.headers, buildAiGatewayCacheHeaders('lota-sdk')) }
63
60
  }
64
61
 
65
62
  function normalizeAiGatewayUrl(value: string): string {
@@ -1 +1 @@
1
- export const LOTA_SDK_DATABASE_NAME = 'lotasdk'
1
+ export const LOTA_SDK_DATABASE_NAME = 'lotasdk_thread'
@@ -368,7 +368,7 @@ class PlanRunService {
368
368
 
369
369
  // Slim mode: non-active/ready nodes get summary only (used for prompt injection via JSON.stringify).
370
370
  // The cast is safe — this data is only consumed by formatExecutionPlansForPrompt, not by Zod validation.
371
- // Plan introspection tools (getExecutionPlanDetails) call toSerializablePlan without slim=true.
371
+ // executionPlanQuery calls toSerializablePlan without slim=true for full inspection payloads.
372
372
  if (slim && !isActiveOrReady) {
373
373
  return {
374
374
  id: nodeSpec.nodeId,
@@ -1,11 +1,16 @@
1
1
  import {
2
2
  ExecutionPlanArgsSchema,
3
+ ExecutionPlanCreateArgsSchema,
4
+ ExecutionPlanCreateProjectArgsSchema,
3
5
  ExecutionPlanQueryArgsSchema,
6
+ ExecutionPlanReplaceArgsSchema,
7
+ ExecutionPlanResumeArgsSchema,
4
8
  SubmitExecutionNodeResultArgsSchema,
9
+ AgentPlanDraftSchema,
5
10
  expandAgentPlanDraft,
6
11
  getLatestExecutionPlanResult,
7
12
  } from '@lota-sdk/shared'
8
- import type { CreateProjectWithPlanResultData } from '@lota-sdk/shared'
13
+ import type { CreateProjectWithPlanResultData, ExecutionPlanArgs } from '@lota-sdk/shared'
9
14
  import { tool } from 'ai'
10
15
 
11
16
  import type { RecordIdRef } from '../db/record-id'
@@ -44,17 +49,16 @@ export function createExecutionPlanTool(params: {
44
49
  'Manage execution plans. Actions: create (inline, 1-2 nodes), create-project (dedicated project thread, 3+ nodes), replace (swap active plan), resume (resume interrupted plan).',
45
50
  inputSchema: ExecutionPlanArgsSchema,
46
51
  execute: async (input) => {
47
- const parsed = ExecutionPlanArgsSchema.parse(input)
52
+ const parsed = parseExecutionPlanArgs(input)
48
53
  let result: unknown
49
54
 
50
55
  switch (parsed.action) {
51
56
  case 'create': {
52
- const { action: _action, targetThreadId, ...draftInput } = parsed
53
- const draft = expandAgentPlanDraft(draftInput)
57
+ const draft = extractAgentPlanDraft(parsed)
54
58
  params.validateInlinePlan?.(draft)
55
59
  result = await resolvedEpService.createPlan({
56
60
  organizationId: params.orgId,
57
- threadId: targetThreadId ?? params.threadId,
61
+ threadId: parsed.targetThreadId ?? params.threadId,
58
62
  leadAgentId: params.agentId,
59
63
  input: draft,
60
64
  })
@@ -62,19 +66,18 @@ export function createExecutionPlanTool(params: {
62
66
  }
63
67
 
64
68
  case 'create-project': {
65
- const { action: _action, projectTitle, targetThreadId, ...draftInput } = parsed
66
- const draft = expandAgentPlanDraft(draftInput)
67
- const targetThread = targetThreadId
68
- ? await resolvedWsService.getThread(targetThreadId)
69
+ const draft = extractAgentPlanDraft(parsed)
70
+ const targetThread = parsed.targetThreadId
71
+ ? await resolvedWsService.getThread(parsed.targetThreadId)
69
72
  : await (() => {
70
- if (!projectTitle) {
73
+ if (!parsed.projectTitle) {
71
74
  throw new Error('projectTitle is required when action is "create-project".')
72
75
  }
73
76
 
74
77
  return resolvedWsService.createThread({
75
78
  userId: params.userId,
76
79
  organizationId: params.orgId,
77
- title: projectTitle,
80
+ title: parsed.projectTitle,
78
81
  type: 'group',
79
82
  })
80
83
  })()
@@ -93,7 +96,7 @@ export function createExecutionPlanTool(params: {
93
96
  )
94
97
  }
95
98
 
96
- const createdThread = !targetThreadId
99
+ const createdThread = !parsed.targetThreadId
97
100
  try {
98
101
  const created = await resolvedEpService.createPlan({
99
102
  organizationId: params.orgId,
@@ -117,13 +120,12 @@ export function createExecutionPlanTool(params: {
117
120
  }
118
121
 
119
122
  case 'replace': {
120
- const { action: _action, runId, reason, ...draftInput } = parsed
121
- const draft = expandAgentPlanDraft(draftInput)
123
+ const draft = extractAgentPlanDraft(parsed)
122
124
  result = await resolvedEpService.replacePlan({
123
125
  organizationId: params.orgId,
124
126
  threadId: params.threadId,
125
127
  leadAgentId: params.agentId,
126
- input: { runId, reason, ...draft },
128
+ input: { runId: parsed.runId, reason: parsed.reason, ...draft },
127
129
  })
128
130
  break
129
131
  }
@@ -143,6 +145,32 @@ export function createExecutionPlanTool(params: {
143
145
  })
144
146
  }
145
147
 
148
+ function parseExecutionPlanArgs(input: unknown): ExecutionPlanArgs {
149
+ const parsed = ExecutionPlanArgsSchema.parse(input)
150
+
151
+ switch (parsed.action) {
152
+ case 'create':
153
+ return ExecutionPlanCreateArgsSchema.parse(parsed)
154
+ case 'create-project':
155
+ return ExecutionPlanCreateProjectArgsSchema.parse(parsed)
156
+ case 'replace':
157
+ return ExecutionPlanReplaceArgsSchema.parse(parsed)
158
+ case 'resume':
159
+ return ExecutionPlanResumeArgsSchema.parse(parsed)
160
+ }
161
+ }
162
+
163
+ function extractAgentPlanDraft(input: Extract<ExecutionPlanArgs, { action: 'create' | 'create-project' | 'replace' }>) {
164
+ return expandAgentPlanDraft(
165
+ AgentPlanDraftSchema.parse({
166
+ title: input.title,
167
+ objective: input.objective,
168
+ nodes: input.nodes,
169
+ edges: input.edges,
170
+ }),
171
+ )
172
+ }
173
+
146
174
  export function createExecutionPlanQueryTool(params: { threadId: RecordIdRef }) {
147
175
  return tool({
148
176
  description: