@lota-sdk/shared 0.1.8 → 0.1.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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lota-sdk/shared",
3
- "version": "0.1.8",
3
+ "version": "0.1.11",
4
4
  "type": "module",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
@@ -3,8 +3,6 @@ import { z } from 'zod'
3
3
 
4
4
  import type { CoreChatTools } from './tools'
5
5
 
6
- const publicWorkstreamStateSchema = z.record(z.string(), z.unknown())
7
-
8
6
  export const messageMetadataSchema = z
9
7
  .object({
10
8
  agentId: z.string().optional(),
@@ -32,9 +30,9 @@ export function parseRowMetadata(raw: unknown): MessageMetadata {
32
30
  return result.success ? result.data : undefined
33
31
  }
34
32
 
35
- export const dataPartsSchema = { workstreamTracker: publicWorkstreamStateSchema }
33
+ export const dataPartsSchema = {}
36
34
 
37
- export type CustomDataParts = { workstreamTracker: z.infer<typeof publicWorkstreamStateSchema> }
35
+ export type CustomDataParts = {}
38
36
 
39
37
  export type AnyChatTools = Record<string, { input: unknown; output: unknown }>
40
38
  export type HostExtensionChatTools = AnyChatTools
@@ -2,101 +2,420 @@ import { z } from 'zod'
2
2
 
3
3
  import { recordIdSchema, unixTimestampSchema } from './common'
4
4
 
5
- export const ExecutionPlanStatusSchema = z
6
- .enum(['draft', 'executing', 'blocked', 'completed', 'aborted'])
7
- .meta({ id: 'ExecutionPlanStatusSchema' })
8
- export type ExecutionPlanStatus = z.infer<typeof ExecutionPlanStatusSchema>
9
-
10
- export const ExecutionPlanTaskStatusSchema = z
11
- .enum(['pending', 'in-progress', 'completed', 'blocked', 'skipped', 'failed'])
12
- .meta({ id: 'ExecutionPlanTaskStatusSchema' })
13
- export type ExecutionPlanTaskStatus = z.infer<typeof ExecutionPlanTaskStatusSchema>
14
-
15
- export const ExecutionPlanTaskResultStatusSchema = z
16
- .enum(['not-started', 'success', 'partial', 'failed'])
17
- .meta({ id: 'ExecutionPlanTaskResultStatusSchema' })
18
- export type ExecutionPlanTaskResultStatus = z.infer<typeof ExecutionPlanTaskResultStatusSchema>
19
-
20
- export const ExecutionPlanTaskKindSchema = z
21
- .enum(['agent', 'user-input', 'plugin'])
22
- .meta({ id: 'ExecutionPlanTaskKindSchema' })
23
- export type ExecutionPlanTaskKind = z.infer<typeof ExecutionPlanTaskKindSchema>
24
-
25
- export const ExecutionPlanTaskOwnerTypeSchema = z
26
- .enum(['agent', 'plugin', 'user'])
27
- .meta({ id: 'ExecutionPlanTaskOwnerTypeSchema' })
28
- export type ExecutionPlanTaskOwnerType = z.infer<typeof ExecutionPlanTaskOwnerTypeSchema>
29
-
30
- export const ExecutionPlanEventTypeSchema = z
5
+ const planSchemaLiteralSchema = z.union([z.string(), z.number(), z.boolean(), z.null()])
6
+
7
+ export type PlanDataSchemaDefinition = {
8
+ type: 'string' | 'number' | 'boolean' | 'object' | 'array'
9
+ description?: string
10
+ nullable?: boolean
11
+ required?: boolean
12
+ enum?: Array<string | number | boolean | null>
13
+ properties?: Record<string, PlanDataSchemaDefinition>
14
+ items?: PlanDataSchemaDefinition
15
+ minItems?: number
16
+ maxItems?: number
17
+ }
18
+
19
+ export const PlanDataSchemaDefinitionSchema: z.ZodType<PlanDataSchemaDefinition> = z.lazy(() =>
20
+ z
21
+ .object({
22
+ type: z.enum(['string', 'number', 'boolean', 'object', 'array']),
23
+ description: z.string().optional(),
24
+ nullable: z.boolean().optional(),
25
+ required: z.boolean().optional(),
26
+ enum: z.array(planSchemaLiteralSchema).optional(),
27
+ properties: z.record(z.string(), PlanDataSchemaDefinitionSchema).optional(),
28
+ items: PlanDataSchemaDefinitionSchema.optional(),
29
+ minItems: z.number().int().nonnegative().optional(),
30
+ maxItems: z.number().int().nonnegative().optional(),
31
+ })
32
+ .strict(),
33
+ )
34
+ export type PlanDataSchema = z.infer<typeof PlanDataSchemaDefinitionSchema>
35
+
36
+ export const PlanSchemaRegistrySchema = z.record(z.string(), PlanDataSchemaDefinitionSchema)
37
+ export type PlanSchemaRegistry = z.infer<typeof PlanSchemaRegistrySchema>
38
+
39
+ export const PlanNodeTypeSchema = z
40
+ .enum([
41
+ 'action',
42
+ 'human-input',
43
+ 'human-approval',
44
+ 'human-review-edit',
45
+ 'human-decision',
46
+ 'switch',
47
+ 'join',
48
+ 'subgraph',
49
+ ])
50
+ .meta({ id: 'PlanNodeTypeSchema' })
51
+ export type PlanNodeType = z.infer<typeof PlanNodeTypeSchema>
52
+
53
+ export const PlanNodeExecutorTypeSchema = z
54
+ .enum(['agent', 'plugin', 'user', 'system'])
55
+ .meta({ id: 'PlanNodeExecutorTypeSchema' })
56
+ export type PlanNodeExecutorType = z.infer<typeof PlanNodeExecutorTypeSchema>
57
+
58
+ export const PlanArtifactKindSchema = z
59
+ .enum(['json', 'markdown', 'file', 'external-ref', 'record'])
60
+ .meta({ id: 'PlanArtifactKindSchema' })
61
+ export type PlanArtifactKind = z.infer<typeof PlanArtifactKindSchema>
62
+
63
+ export const PlanCompletionCheckTypeSchema = z
64
+ .enum(['schema', 'assertion', 'llm-judge', 'human-approval', 'tool-check'])
65
+ .meta({ id: 'PlanCompletionCheckTypeSchema' })
66
+ export type PlanCompletionCheckType = z.infer<typeof PlanCompletionCheckTypeSchema>
67
+
68
+ export const PlanFailureClassSchema = z
69
+ .enum([
70
+ 'schema_validation_failed',
71
+ 'required_artifact_missing',
72
+ 'tool_access_denied',
73
+ 'external_system_unavailable',
74
+ 'human_rejected',
75
+ 'insufficient_context',
76
+ 'policy_blocked',
77
+ 'timeout_exceeded',
78
+ 'non_recoverable_logic_error',
79
+ ])
80
+ .meta({ id: 'PlanFailureClassSchema' })
81
+ export type PlanFailureClass = z.infer<typeof PlanFailureClassSchema>
82
+
83
+ export const PlanFailureTriggerSchema = z.union([PlanFailureClassSchema, z.string().trim().min(1)])
84
+ export type PlanFailureTrigger = z.infer<typeof PlanFailureTriggerSchema>
85
+
86
+ export const PlanFailureActionSchema = z
87
+ .enum(['retry', 'human-review', 'replan', 'abort'])
88
+ .meta({ id: 'PlanFailureActionSchema' })
89
+ export type PlanFailureAction = z.infer<typeof PlanFailureActionSchema>
90
+
91
+ export const PlanSpecStatusSchema = z.enum(['compiled', 'superseded']).meta({ id: 'PlanSpecStatusSchema' })
92
+ export type PlanSpecStatus = z.infer<typeof PlanSpecStatusSchema>
93
+
94
+ export const PlanRunStatusSchema = z
95
+ .enum(['running', 'awaiting-human', 'blocked', 'completed', 'failed', 'aborted'])
96
+ .meta({ id: 'PlanRunStatusSchema' })
97
+ export type PlanRunStatus = z.infer<typeof PlanRunStatusSchema>
98
+
99
+ export const PlanNodeRunStatusSchema = z
100
+ .enum(['pending', 'ready', 'running', 'awaiting-human', 'completed', 'partial', 'blocked', 'failed', 'skipped'])
101
+ .meta({ id: 'PlanNodeRunStatusSchema' })
102
+ export type PlanNodeRunStatus = z.infer<typeof PlanNodeRunStatusSchema>
103
+
104
+ export const PlanAttemptStatusSchema = z
105
+ .enum(['submitted', 'validated', 'completed', 'failed', 'rejected'])
106
+ .meta({ id: 'PlanAttemptStatusSchema' })
107
+ export type PlanAttemptStatus = z.infer<typeof PlanAttemptStatusSchema>
108
+
109
+ export const PlanValidationIssueSeveritySchema = z
110
+ .enum(['warning', 'blocking'])
111
+ .meta({ id: 'PlanValidationIssueSeveritySchema' })
112
+ export type PlanValidationIssueSeverity = z.infer<typeof PlanValidationIssueSeveritySchema>
113
+
114
+ export const PlanApprovalStatusSchema = z
115
+ .enum(['pending', 'approved', 'rejected', 'changes-requested'])
116
+ .meta({ id: 'PlanApprovalStatusSchema' })
117
+ export type PlanApprovalStatus = z.infer<typeof PlanApprovalStatusSchema>
118
+
119
+ export const PlanEventTypeSchema = z
31
120
  .enum([
32
121
  'plan-created',
33
122
  'plan-replaced',
34
- 'plan-status-changed',
35
- 'task-started',
36
- 'task-progress',
37
- 'task-completed',
38
- 'task-failed',
39
- 'task-blocked',
40
- 'task-skipped',
41
- 'task-restarted',
42
- 'replan',
123
+ 'run-status-changed',
124
+ 'node-ready',
125
+ 'node-running',
126
+ 'node-awaiting-human',
127
+ 'node-completed',
128
+ 'node-partial',
129
+ 'node-blocked',
130
+ 'node-failed',
131
+ 'node-skipped',
132
+ 'node-auto-completed',
133
+ 'approval-requested',
134
+ 'approval-resolved',
135
+ 'checkpoint-saved',
136
+ 'run-resumed',
137
+ 'validation-reported',
43
138
  ])
44
- .meta({ id: 'ExecutionPlanEventTypeSchema' })
45
- export type ExecutionPlanEventType = z.infer<typeof ExecutionPlanEventTypeSchema>
139
+ .meta({ id: 'PlanEventTypeSchema' })
140
+ export type PlanEventType = z.infer<typeof PlanEventTypeSchema>
141
+
142
+ export const PlanNodeOwnerSchema = z
143
+ .object({ executorType: PlanNodeExecutorTypeSchema, ref: z.string().trim().min(1).max(200) })
144
+ .strict()
145
+ export type PlanNodeOwner = z.infer<typeof PlanNodeOwnerSchema>
146
+
147
+ export const PlanArtifactSpecSchema = z
148
+ .object({
149
+ name: z.string().trim().min(1).max(200),
150
+ kind: PlanArtifactKindSchema,
151
+ required: z.boolean().default(true),
152
+ schemaRef: z.string().trim().min(1).max(200).optional(),
153
+ description: z.string().trim().min(1).max(1000),
154
+ })
155
+ .strict()
156
+ export type PlanArtifactSpec = z.infer<typeof PlanArtifactSpecSchema>
157
+
158
+ export const PlanCompletionCheckSchema = z
159
+ .object({
160
+ type: PlanCompletionCheckTypeSchema,
161
+ config: z.record(z.string(), z.unknown()).default({}),
162
+ blocking: z.boolean().default(true),
163
+ description: z.string().trim().min(1).max(1000),
164
+ })
165
+ .strict()
166
+ export type PlanCompletionCheck = z.infer<typeof PlanCompletionCheckSchema>
167
+
168
+ export const PlanFailureRuleSchema = z
169
+ .object({ on: PlanFailureTriggerSchema, action: PlanFailureActionSchema, note: z.string().trim().min(1).max(1000) })
170
+ .strict()
171
+ export type PlanFailureRule = z.infer<typeof PlanFailureRuleSchema>
172
+
173
+ export const PlanRetryPolicySchema = z
174
+ .object({ maxAttempts: z.number().int().min(0).default(0), retryOn: z.array(PlanFailureTriggerSchema).default([]) })
175
+ .strict()
176
+ export type PlanRetryPolicy = z.infer<typeof PlanRetryPolicySchema>
177
+
178
+ export const PlanToolPolicySchema = z
179
+ .object({
180
+ allow: z.array(z.string().trim().min(1).max(200)).default([]),
181
+ deny: z.array(z.string().trim().min(1).max(200)).default([]),
182
+ })
183
+ .strict()
184
+ export type PlanToolPolicy = z.infer<typeof PlanToolPolicySchema>
46
185
 
47
- export const ExecutionPlanTaskInputSchema = z.union([z.string(), z.record(z.string(), z.unknown())])
48
- export type ExecutionPlanTaskInput = z.infer<typeof ExecutionPlanTaskInputSchema>
186
+ export const PlanContextPolicySchema = z
187
+ .object({
188
+ retrievalScopes: z.array(z.string().trim().min(1).max(200)).default([]),
189
+ attachmentPolicy: z.enum(['none', 'referenced-only', 'all-visible']).default('referenced-only'),
190
+ webPolicy: z.enum(['forbidden', 'allowed', 'required-fresh']).default('allowed'),
191
+ })
192
+ .strict()
193
+ export type PlanContextPolicy = z.infer<typeof PlanContextPolicySchema>
49
194
 
50
- export const ExecutionPlanSchema = z.object({
195
+ const planStructuredPayloadSchema = z.union([z.record(z.string(), z.unknown()), z.array(z.unknown())])
196
+
197
+ export const PlanNodeSpecSchema = z
198
+ .object({
199
+ id: z.string().trim().min(1).max(200),
200
+ type: PlanNodeTypeSchema,
201
+ label: z.string().trim().min(1).max(300),
202
+ owner: PlanNodeOwnerSchema,
203
+ objective: z.string().trim().min(1).max(2000),
204
+ instructions: z.string().trim().min(1).max(4000),
205
+ inputSchemaRef: z.string().trim().min(1).max(200).optional(),
206
+ outputSchemaRef: z.string().trim().min(1).max(200).optional(),
207
+ deliverables: z.array(PlanArtifactSpecSchema).default([]),
208
+ successCriteria: z.array(z.string().trim().min(1).max(1000)).default([]),
209
+ completionChecks: z.array(PlanCompletionCheckSchema).default([]),
210
+ retryPolicy: PlanRetryPolicySchema.default({ maxAttempts: 0, retryOn: [] }),
211
+ failurePolicy: z.array(PlanFailureRuleSchema).default([]),
212
+ timeoutMs: z.number().int().positive().optional(),
213
+ toolPolicy: PlanToolPolicySchema.default({ allow: [], deny: [] }),
214
+ contextPolicy: PlanContextPolicySchema.default({
215
+ retrievalScopes: [],
216
+ attachmentPolicy: 'referenced-only',
217
+ webPolicy: 'allowed',
218
+ }),
219
+ })
220
+ .strict()
221
+ export type PlanNodeSpec = z.infer<typeof PlanNodeSpecSchema>
222
+
223
+ export const PlanEdgeSpecSchema = z
224
+ .object({
225
+ id: z.string().trim().min(1).max(200),
226
+ source: z.string().trim().min(1).max(200),
227
+ target: z.string().trim().min(1).max(200),
228
+ when: z.string().trim().min(1).max(500).optional(),
229
+ map: z.record(z.string(), z.string()).default({}),
230
+ })
231
+ .strict()
232
+ export type PlanEdgeSpec = z.infer<typeof PlanEdgeSpecSchema>
233
+
234
+ export const PlanDraftSchema = z
235
+ .object({
236
+ title: z.string().trim().min(1).max(200),
237
+ objective: z.string().trim().min(1).max(2000),
238
+ schemas: PlanSchemaRegistrySchema.default({}),
239
+ nodes: z.array(PlanNodeSpecSchema).min(1).max(32),
240
+ edges: z.array(PlanEdgeSpecSchema).default([]),
241
+ entryNodeIds: z.array(z.string().trim().min(1).max(200)).min(1).optional(),
242
+ })
243
+ .strict()
244
+ export type PlanDraft = z.infer<typeof PlanDraftSchema>
245
+
246
+ export const PlanSpecSchema = z.object({
51
247
  id: recordIdSchema,
52
248
  organizationId: recordIdSchema,
53
249
  workstreamId: recordIdSchema,
54
250
  title: z.string(),
55
251
  objective: z.string(),
56
- status: ExecutionPlanStatusSchema,
252
+ version: z.number().int().positive(),
253
+ status: PlanSpecStatusSchema,
57
254
  leadAgentId: z.string(),
58
- currentTaskId: recordIdSchema.optional(),
59
- restartFromTaskId: recordIdSchema.optional(),
60
- replacedPlanId: recordIdSchema.optional(),
61
- failureCount: z.number().int().nonnegative(),
255
+ schemaRegistry: PlanSchemaRegistrySchema,
256
+ edges: z.array(PlanEdgeSpecSchema),
257
+ entryNodeIds: z.array(z.string()),
258
+ replacedSpecId: recordIdSchema.optional(),
259
+ createdAt: unixTimestampSchema,
260
+ updatedAt: unixTimestampSchema.optional(),
261
+ compiledAt: unixTimestampSchema.optional(),
262
+ })
263
+ export type PlanSpecRecord = z.infer<typeof PlanSpecSchema>
264
+
265
+ export const PlanNodeSpecRecordSchema = z.object({
266
+ id: recordIdSchema,
267
+ planSpecId: recordIdSchema,
268
+ nodeId: z.string(),
269
+ position: z.number().int().nonnegative(),
270
+ type: PlanNodeTypeSchema,
271
+ label: z.string(),
272
+ owner: PlanNodeOwnerSchema,
273
+ objective: z.string(),
274
+ instructions: z.string(),
275
+ inputSchemaRef: z.string().optional(),
276
+ outputSchemaRef: z.string().optional(),
277
+ deliverables: z.array(PlanArtifactSpecSchema),
278
+ successCriteria: z.array(z.string()),
279
+ completionChecks: z.array(PlanCompletionCheckSchema),
280
+ retryPolicy: PlanRetryPolicySchema,
281
+ failurePolicy: z.array(PlanFailureRuleSchema),
282
+ timeoutMs: z.number().int().positive().optional(),
283
+ toolPolicy: PlanToolPolicySchema,
284
+ contextPolicy: PlanContextPolicySchema,
285
+ upstreamNodeIds: z.array(z.string()).default([]),
286
+ downstreamNodeIds: z.array(z.string()).default([]),
62
287
  createdAt: unixTimestampSchema,
63
288
  updatedAt: unixTimestampSchema.optional(),
64
- startedAt: unixTimestampSchema.optional(),
65
- completedAt: unixTimestampSchema.optional(),
66
289
  })
67
- export type ExecutionPlanRecord = z.infer<typeof ExecutionPlanSchema>
290
+ export type PlanNodeSpecRecord = z.infer<typeof PlanNodeSpecRecordSchema>
68
291
 
69
- export const ExecutionPlanTaskSchema = z.object({
292
+ export const PlanRunSchema = z.object({
70
293
  id: recordIdSchema,
71
- planId: recordIdSchema,
294
+ planSpecId: recordIdSchema,
72
295
  organizationId: recordIdSchema,
73
296
  workstreamId: recordIdSchema,
74
- position: z.number().int().nonnegative(),
75
- title: z.string(),
76
- rationale: z.string(),
77
- kind: ExecutionPlanTaskKindSchema,
78
- ownerType: ExecutionPlanTaskOwnerTypeSchema,
79
- ownerRef: z.string(),
80
- status: ExecutionPlanTaskStatusSchema,
81
- resultStatus: ExecutionPlanTaskResultStatusSchema,
82
- input: ExecutionPlanTaskInputSchema.optional(),
83
- outputSummary: z.string().optional(),
84
- blockedReason: z.string().optional(),
85
- externalRef: z.string().optional(),
86
- retryCount: z.number().int().nonnegative(),
87
- idempotencyKey: z.string(),
297
+ leadAgentId: z.string(),
298
+ status: PlanRunStatusSchema,
299
+ currentNodeId: z.string().optional(),
300
+ waitingNodeId: z.string().optional(),
301
+ readyNodeIds: z.array(z.string()).default([]),
302
+ failureCount: z.number().int().nonnegative(),
303
+ replacedRunId: recordIdSchema.optional(),
304
+ lastCheckpointId: recordIdSchema.optional(),
88
305
  createdAt: unixTimestampSchema,
89
306
  updatedAt: unixTimestampSchema.optional(),
90
307
  startedAt: unixTimestampSchema.optional(),
91
308
  completedAt: unixTimestampSchema.optional(),
92
309
  })
93
- export type ExecutionPlanTaskRecord = z.infer<typeof ExecutionPlanTaskSchema>
310
+ export type PlanRunRecord = z.infer<typeof PlanRunSchema>
311
+
312
+ export const PlanNodeRunSchema = z.object({
313
+ id: recordIdSchema,
314
+ runId: recordIdSchema,
315
+ planSpecId: recordIdSchema,
316
+ nodeId: z.string(),
317
+ status: PlanNodeRunStatusSchema,
318
+ attemptCount: z.number().int().nonnegative(),
319
+ retryCount: z.number().int().nonnegative(),
320
+ resolvedInput: z.record(z.string(), z.unknown()).optional(),
321
+ latestStructuredOutput: z.record(z.string(), z.unknown()).optional(),
322
+ latestNotes: z.string().optional(),
323
+ latestAttemptId: recordIdSchema.optional(),
324
+ blockedReason: z.string().optional(),
325
+ failureClass: PlanFailureClassSchema.optional(),
326
+ readyAt: unixTimestampSchema.optional(),
327
+ startedAt: unixTimestampSchema.optional(),
328
+ completedAt: unixTimestampSchema.optional(),
329
+ createdAt: unixTimestampSchema,
330
+ updatedAt: unixTimestampSchema.optional(),
331
+ })
332
+ export type PlanNodeRunRecord = z.infer<typeof PlanNodeRunSchema>
333
+
334
+ export const PlanNodeAttemptSchema = z.object({
335
+ id: recordIdSchema,
336
+ runId: recordIdSchema,
337
+ nodeRunId: recordIdSchema,
338
+ nodeId: z.string(),
339
+ emittedBy: z.string(),
340
+ status: PlanAttemptStatusSchema,
341
+ structuredOutput: z.record(z.string(), z.unknown()).optional(),
342
+ notes: z.string().optional(),
343
+ validationIssueIds: z.array(recordIdSchema).default([]),
344
+ failureClass: PlanFailureClassSchema.optional(),
345
+ createdAt: unixTimestampSchema,
346
+ })
347
+ export type PlanNodeAttemptRecord = z.infer<typeof PlanNodeAttemptSchema>
348
+
349
+ export const PlanArtifactSchema = z.object({
350
+ id: recordIdSchema,
351
+ runId: recordIdSchema,
352
+ nodeId: z.string(),
353
+ attemptId: recordIdSchema,
354
+ name: z.string(),
355
+ kind: PlanArtifactKindSchema,
356
+ pointer: z.string(),
357
+ schemaRef: z.string().optional(),
358
+ description: z.string().optional(),
359
+ payload: planStructuredPayloadSchema.optional(),
360
+ createdAt: unixTimestampSchema,
361
+ })
362
+ export type PlanArtifactRecord = z.infer<typeof PlanArtifactSchema>
363
+
364
+ export const PlanValidationIssueSchema = z.object({
365
+ id: recordIdSchema,
366
+ planSpecId: recordIdSchema.optional(),
367
+ runId: recordIdSchema.optional(),
368
+ nodeId: z.string().optional(),
369
+ attemptId: recordIdSchema.optional(),
370
+ severity: PlanValidationIssueSeveritySchema,
371
+ code: z.string(),
372
+ message: z.string(),
373
+ detail: z.record(z.string(), z.unknown()).optional(),
374
+ createdAt: unixTimestampSchema,
375
+ })
376
+ export type PlanValidationIssueRecord = z.infer<typeof PlanValidationIssueSchema>
377
+
378
+ export const PlanCheckpointSchema = z.object({
379
+ id: recordIdSchema,
380
+ runId: recordIdSchema,
381
+ sequence: z.number().int().positive(),
382
+ runStatus: PlanRunStatusSchema,
383
+ readyNodeIds: z.array(z.string()).default([]),
384
+ activeNodeIds: z.array(z.string()).default([]),
385
+ artifactIds: z.array(recordIdSchema).default([]),
386
+ lastCompletedNodeIds: z.array(z.string()).default([]),
387
+ snapshot: z.record(z.string(), z.unknown()),
388
+ createdAt: unixTimestampSchema,
389
+ })
390
+ export type PlanCheckpointRecord = z.infer<typeof PlanCheckpointSchema>
391
+
392
+ export const PlanApprovalSchema = z.object({
393
+ id: recordIdSchema,
394
+ runId: recordIdSchema,
395
+ nodeId: z.string(),
396
+ nodeRunId: recordIdSchema,
397
+ status: PlanApprovalStatusSchema,
398
+ presented: z.record(z.string(), z.unknown()).optional(),
399
+ response: z.record(z.string(), z.unknown()).optional(),
400
+ requestedBy: z.string(),
401
+ respondedBy: z.string().optional(),
402
+ approvalMessageId: z.string().optional(),
403
+ comments: z.string().optional(),
404
+ requiredEdits: z.array(z.string()).default([]),
405
+ createdAt: unixTimestampSchema,
406
+ updatedAt: unixTimestampSchema.optional(),
407
+ respondedAt: unixTimestampSchema.optional(),
408
+ })
409
+ export type PlanApprovalRecord = z.infer<typeof PlanApprovalSchema>
94
410
 
95
- export const ExecutionPlanEventSchema = z.object({
411
+ export const PlanEventSchema = z.object({
96
412
  id: recordIdSchema,
97
- planId: recordIdSchema,
98
- taskId: recordIdSchema.optional(),
99
- eventType: ExecutionPlanEventTypeSchema,
413
+ planSpecId: recordIdSchema,
414
+ runId: recordIdSchema,
415
+ nodeId: z.string().optional(),
416
+ attemptId: recordIdSchema.optional(),
417
+ approvalId: recordIdSchema.optional(),
418
+ eventType: PlanEventTypeSchema,
100
419
  fromStatus: z.string().optional(),
101
420
  toStatus: z.string().optional(),
102
421
  message: z.string(),
@@ -104,33 +423,102 @@ export const ExecutionPlanEventSchema = z.object({
104
423
  emittedBy: z.string(),
105
424
  createdAt: unixTimestampSchema,
106
425
  })
107
- export type ExecutionPlanEventRecord = z.infer<typeof ExecutionPlanEventSchema>
426
+ export type PlanEventRecord = z.infer<typeof PlanEventSchema>
108
427
 
109
- export const SerializableExecutionPlanTaskSchema = z.object({
428
+ export const SerializablePlanNodeSchema = z.object({
110
429
  id: z.string(),
111
- position: z.number().int().nonnegative(),
112
- title: z.string(),
113
- rationale: z.string(),
114
- kind: ExecutionPlanTaskKindSchema,
115
- ownerType: ExecutionPlanTaskOwnerTypeSchema,
116
- ownerRef: z.string(),
117
- status: ExecutionPlanTaskStatusSchema,
118
- resultStatus: ExecutionPlanTaskResultStatusSchema,
119
- input: ExecutionPlanTaskInputSchema.optional(),
120
- outputSummary: z.string().nullish(),
121
- blockedReason: z.string().nullish(),
122
- externalRef: z.string().nullish(),
430
+ type: PlanNodeTypeSchema,
431
+ label: z.string(),
432
+ owner: PlanNodeOwnerSchema,
433
+ objective: z.string(),
434
+ instructions: z.string(),
435
+ inputSchemaRef: z.string().nullish(),
436
+ outputSchemaRef: z.string().nullish(),
437
+ deliverables: z.array(PlanArtifactSpecSchema),
438
+ successCriteria: z.array(z.string()),
439
+ completionChecks: z.array(PlanCompletionCheckSchema),
440
+ retryPolicy: PlanRetryPolicySchema,
441
+ failurePolicy: z.array(PlanFailureRuleSchema),
442
+ timeoutMs: z.number().int().positive().nullish(),
443
+ toolPolicy: PlanToolPolicySchema,
444
+ contextPolicy: PlanContextPolicySchema,
445
+ status: PlanNodeRunStatusSchema,
446
+ attemptCount: z.number().int().nonnegative(),
123
447
  retryCount: z.number().int().nonnegative(),
124
- idempotencyKey: z.string(),
448
+ resolvedInput: z.record(z.string(), z.unknown()).nullish(),
449
+ latestStructuredOutput: z.record(z.string(), z.unknown()).nullish(),
450
+ latestNotes: z.string().nullish(),
451
+ blockedReason: z.string().nullish(),
452
+ failureClass: PlanFailureClassSchema.nullish(),
453
+ upstreamNodeIds: z.array(z.string()),
454
+ downstreamNodeIds: z.array(z.string()),
455
+ readyAt: z.iso.datetime().nullish(),
125
456
  startedAt: z.iso.datetime().nullish(),
126
457
  completedAt: z.iso.datetime().nullish(),
127
458
  })
128
- export type SerializableExecutionPlanTask = z.infer<typeof SerializableExecutionPlanTaskSchema>
459
+ export type SerializablePlanNode = z.infer<typeof SerializablePlanNodeSchema>
460
+
461
+ export const SerializablePlanArtifactSchema = z.object({
462
+ id: z.string(),
463
+ nodeId: z.string(),
464
+ attemptId: z.string(),
465
+ name: z.string(),
466
+ kind: PlanArtifactKindSchema,
467
+ pointer: z.string(),
468
+ schemaRef: z.string().nullish(),
469
+ description: z.string().nullish(),
470
+ payload: planStructuredPayloadSchema.nullish(),
471
+ createdAt: z.iso.datetime(),
472
+ })
473
+ export type SerializablePlanArtifact = z.infer<typeof SerializablePlanArtifactSchema>
474
+
475
+ export const SerializablePlanValidationIssueSchema = z.object({
476
+ id: z.string(),
477
+ nodeId: z.string().nullish(),
478
+ attemptId: z.string().nullish(),
479
+ severity: PlanValidationIssueSeveritySchema,
480
+ code: z.string(),
481
+ message: z.string(),
482
+ detail: z.record(z.string(), z.unknown()).nullish(),
483
+ createdAt: z.iso.datetime(),
484
+ })
485
+ export type SerializablePlanValidationIssue = z.infer<typeof SerializablePlanValidationIssueSchema>
129
486
 
130
- export const SerializableExecutionPlanEventSchema = z.object({
487
+ export const SerializablePlanApprovalSchema = z.object({
131
488
  id: z.string(),
132
- taskId: z.string().nullish(),
133
- eventType: ExecutionPlanEventTypeSchema,
489
+ nodeId: z.string(),
490
+ status: PlanApprovalStatusSchema,
491
+ presented: z.record(z.string(), z.unknown()).nullish(),
492
+ response: z.record(z.string(), z.unknown()).nullish(),
493
+ requestedBy: z.string(),
494
+ respondedBy: z.string().nullish(),
495
+ approvalMessageId: z.string().nullish(),
496
+ comments: z.string().nullish(),
497
+ requiredEdits: z.array(z.string()),
498
+ createdAt: z.iso.datetime(),
499
+ respondedAt: z.iso.datetime().nullish(),
500
+ })
501
+ export type SerializablePlanApproval = z.infer<typeof SerializablePlanApprovalSchema>
502
+
503
+ export const SerializablePlanCheckpointSchema = z.object({
504
+ id: z.string(),
505
+ sequence: z.number().int().positive(),
506
+ runStatus: PlanRunStatusSchema,
507
+ readyNodeIds: z.array(z.string()),
508
+ activeNodeIds: z.array(z.string()),
509
+ artifactIds: z.array(z.string()),
510
+ lastCompletedNodeIds: z.array(z.string()),
511
+ snapshot: z.record(z.string(), z.unknown()),
512
+ createdAt: z.iso.datetime(),
513
+ })
514
+ export type SerializablePlanCheckpoint = z.infer<typeof SerializablePlanCheckpointSchema>
515
+
516
+ export const SerializablePlanEventSchema = z.object({
517
+ id: z.string(),
518
+ nodeId: z.string().nullish(),
519
+ attemptId: z.string().nullish(),
520
+ approvalId: z.string().nullish(),
521
+ eventType: PlanEventTypeSchema,
134
522
  fromStatus: z.string().nullish(),
135
523
  toStatus: z.string().nullish(),
136
524
  message: z.string(),
@@ -138,22 +526,16 @@ export const SerializableExecutionPlanEventSchema = z.object({
138
526
  emittedBy: z.string(),
139
527
  createdAt: z.iso.datetime(),
140
528
  })
141
- export type SerializableExecutionPlanEvent = z.infer<typeof SerializableExecutionPlanEventSchema>
142
-
143
- export const SerializableExecutionPlanCarriedTaskSchema = z.object({
144
- planId: z.string(),
145
- taskId: z.string(),
146
- title: z.string(),
147
- resultStatus: ExecutionPlanTaskResultStatusSchema,
148
- outputSummary: z.string(),
149
- })
150
- export type SerializableExecutionPlanCarriedTask = z.infer<typeof SerializableExecutionPlanCarriedTaskSchema>
529
+ export type SerializablePlanEvent = z.infer<typeof SerializablePlanEventSchema>
151
530
 
152
531
  export const SerializableExecutionPlanProgressSchema = z.object({
153
532
  total: z.number().int().nonnegative(),
154
533
  pending: z.number().int().nonnegative(),
155
- inProgress: z.number().int().nonnegative(),
534
+ ready: z.number().int().nonnegative(),
535
+ running: z.number().int().nonnegative(),
536
+ awaitingHuman: z.number().int().nonnegative(),
156
537
  completed: z.number().int().nonnegative(),
538
+ partial: z.number().int().nonnegative(),
157
539
  blocked: z.number().int().nonnegative(),
158
540
  failed: z.number().int().nonnegative(),
159
541
  skipped: z.number().int().nonnegative(),
@@ -162,22 +544,32 @@ export const SerializableExecutionPlanProgressSchema = z.object({
162
544
  export type SerializableExecutionPlanProgress = z.infer<typeof SerializableExecutionPlanProgressSchema>
163
545
 
164
546
  export const SerializableExecutionPlanSchema = z.object({
165
- planId: z.string(),
547
+ specId: z.string(),
548
+ runId: z.string(),
166
549
  workstreamId: z.string(),
167
550
  organizationId: z.string(),
168
551
  title: z.string(),
169
552
  objective: z.string(),
170
- status: ExecutionPlanStatusSchema,
553
+ version: z.number().int().positive(),
554
+ status: PlanRunStatusSchema,
171
555
  leadAgentId: z.string(),
172
- currentTaskId: z.string().nullish(),
173
- restartFromTaskId: z.string().nullish(),
174
- replacedPlanId: z.string().nullish(),
556
+ schemaRegistry: PlanSchemaRegistrySchema,
557
+ entryNodeIds: z.array(z.string()),
558
+ edges: z.array(PlanEdgeSpecSchema),
559
+ activeNodeIds: z.array(z.string()),
560
+ readyNodeIds: z.array(z.string()),
561
+ waitingNodeId: z.string().nullish(),
562
+ replacedRunId: z.string().nullish(),
175
563
  failureCount: z.number().int().nonnegative(),
176
564
  startedAt: z.iso.datetime().nullish(),
177
565
  completedAt: z.iso.datetime().nullish(),
178
566
  progress: SerializableExecutionPlanProgressSchema,
179
- tasks: z.array(SerializableExecutionPlanTaskSchema),
180
- recentEvents: z.array(SerializableExecutionPlanEventSchema),
181
- carriedTasks: z.array(SerializableExecutionPlanCarriedTaskSchema),
567
+ nodes: z.array(SerializablePlanNodeSchema),
568
+ artifacts: z.array(SerializablePlanArtifactSchema),
569
+ lineageArtifacts: z.array(SerializablePlanArtifactSchema),
570
+ validationIssues: z.array(SerializablePlanValidationIssueSchema),
571
+ approvals: z.array(SerializablePlanApprovalSchema),
572
+ latestCheckpoint: SerializablePlanCheckpointSchema.nullish(),
573
+ recentEvents: z.array(SerializablePlanEventSchema),
182
574
  })
183
575
  export type SerializableExecutionPlan = z.infer<typeof SerializableExecutionPlanSchema>
@@ -3,10 +3,9 @@ import { z } from 'zod'
3
3
  import { baseChatMessageSchema } from './chat-api'
4
4
  import type { AnyChatMessage } from './chat-message'
5
5
  import {
6
- ExecutionPlanStatusSchema,
7
- ExecutionPlanTaskInputSchema,
8
- ExecutionPlanTaskResultStatusSchema,
9
- ExecutionPlanTaskStatusSchema,
6
+ PlanArtifactKindSchema,
7
+ PlanDraftSchema,
8
+ PlanRunStatusSchema,
10
9
  SerializableExecutionPlanSchema,
11
10
  } from './execution-plan'
12
11
 
@@ -15,9 +14,9 @@ export const CONSULT_SPECIALIST_TOOL_NAME = 'consultSpecialist' as const
15
14
  export const CONSULT_TEAM_TOOL_NAME = 'consultTeam' as const
16
15
  export const CREATE_EXECUTION_PLAN_TOOL_NAME = 'createExecutionPlan' as const
17
16
  export const REPLACE_EXECUTION_PLAN_TOOL_NAME = 'replaceExecutionPlan' as const
18
- export const SET_EXECUTION_TASK_STATUS_TOOL_NAME = 'setExecutionTaskStatus' as const
17
+ export const SUBMIT_EXECUTION_NODE_RESULT_TOOL_NAME = 'submitExecutionNodeResult' as const
19
18
  export const GET_ACTIVE_EXECUTION_PLAN_TOOL_NAME = 'getActiveExecutionPlan' as const
20
- export const RESTART_EXECUTION_TASK_TOOL_NAME = 'restartExecutionTask' as const
19
+ export const RESUME_EXECUTION_PLAN_RUN_TOOL_NAME = 'resumeExecutionPlanRun' as const
21
20
 
22
21
  const UserQuestionItemSchema = z
23
22
  .object({
@@ -49,88 +48,69 @@ export const ConsultTeamResponseSchema = z
49
48
 
50
49
  export const ConsultTeamArgsSchema = z.object({ task: z.string().trim().min(1).max(6000) }).strict()
51
50
 
52
- const ExecutionPlanCreateTaskKindSchema = z.enum(['agent', 'user-input'])
53
- const ExecutionPlanCreateTaskOwnerTypeSchema = z.enum(['agent', 'user'])
51
+ const planStructuredPayloadSchema = z.union([z.record(z.string(), z.unknown()), z.array(z.unknown())])
54
52
 
55
- const ExecutionPlanTaskDefinitionSchema = z
53
+ export const PlanArtifactSubmissionSchema = z
56
54
  .object({
57
- title: z.string().trim().min(1).max(300),
58
- rationale: z.string().trim().min(1).max(500),
59
- kind: ExecutionPlanCreateTaskKindSchema,
60
- ownerType: ExecutionPlanCreateTaskOwnerTypeSchema,
61
- ownerRef: z.string().trim().min(1).max(200),
62
- input: ExecutionPlanTaskInputSchema.optional(),
55
+ name: z.string().trim().min(1).max(200),
56
+ kind: PlanArtifactKindSchema,
57
+ pointer: z.string().trim().min(1).max(500),
58
+ schemaRef: z.string().trim().min(1).max(200).optional(),
59
+ description: z.string().trim().min(1).max(1000).optional(),
60
+ payload: planStructuredPayloadSchema.optional(),
63
61
  })
64
62
  .strict()
65
- .refine(
66
- (task) =>
67
- (task.kind === 'agent' && task.ownerType === 'agent') ||
68
- (task.kind === 'user-input' && task.ownerType === 'user'),
69
- {
70
- message: 'agent tasks must be owned by an agent and user-input tasks must be owned by a user.',
71
- path: ['ownerType'],
72
- },
73
- )
63
+ export type PlanArtifactSubmission = z.infer<typeof PlanArtifactSubmissionSchema>
64
+
65
+ export const PlanNodeResultSubmissionSchema = z
66
+ .object({
67
+ structuredOutput: z.record(z.string(), z.unknown()).optional(),
68
+ artifacts: z.array(PlanArtifactSubmissionSchema).default([]),
69
+ notes: z.string().trim().min(1).max(2000).optional(),
70
+ })
71
+ .strict()
72
+ export type PlanNodeResultSubmission = z.infer<typeof PlanNodeResultSubmissionSchema>
74
73
 
75
74
  const ExecutionPlanToolActionSchema = z.enum([
76
75
  'created',
77
76
  'replaced',
78
77
  'loaded',
79
- 'task-status-updated',
80
- 'task-restarted',
78
+ 'node-result-submitted',
79
+ 'run-resumed',
81
80
  'none',
82
81
  ])
83
82
 
84
- export const CreateExecutionPlanArgsSchema = z
85
- .object({
86
- title: z.string().trim().min(1).max(200),
87
- objective: z.string().trim().min(1).max(1500),
88
- tasks: z.array(ExecutionPlanTaskDefinitionSchema).min(1).max(10),
89
- })
90
- .strict()
83
+ export const CreateExecutionPlanArgsSchema = PlanDraftSchema
91
84
 
92
- export const ReplaceExecutionPlanArgsSchema = z
93
- .object({
94
- planId: z.string().trim().min(1),
95
- reason: z.string().trim().min(1).max(1000),
96
- title: z.string().trim().min(1).max(200),
97
- objective: z.string().trim().min(1).max(1500),
98
- tasks: CreateExecutionPlanArgsSchema.shape.tasks,
99
- })
100
- .strict()
85
+ export const ReplaceExecutionPlanArgsSchema = PlanDraftSchema.extend({
86
+ runId: z.string().trim().min(1),
87
+ reason: z.string().trim().min(1).max(1000),
88
+ }).strict()
101
89
 
102
- export const SetExecutionTaskStatusArgsSchema = z
103
- .object({
104
- planId: z.string().trim().min(1),
105
- taskId: z.string().trim().min(1),
106
- status: ExecutionPlanTaskStatusSchema,
107
- resultStatus: ExecutionPlanTaskResultStatusSchema.optional(),
108
- outputSummary: z.string().trim().max(1500).optional(),
109
- blockedReason: z.string().trim().max(1000).optional(),
110
- externalRef: z.string().trim().max(300).optional(),
111
- })
90
+ export const SubmitExecutionNodeResultArgsSchema = z
91
+ .object({ runId: z.string().trim().min(1), nodeId: z.string().trim().min(1), result: PlanNodeResultSubmissionSchema })
112
92
  .strict()
113
93
 
114
94
  export const GetActiveExecutionPlanArgsSchema = z
115
- .object({ includeEvents: z.boolean().optional().default(false) })
116
- .strict()
117
-
118
- export const RestartExecutionTaskArgsSchema = z
119
95
  .object({
120
- planId: z.string().trim().min(1),
121
- taskId: z.string().trim().min(1),
122
- resetDownstream: z.boolean().optional().default(true),
96
+ includeEvents: z.boolean().optional().default(true),
97
+ includeArtifacts: z.boolean().optional().default(true),
98
+ includeApprovals: z.boolean().optional().default(true),
99
+ includeCheckpoints: z.boolean().optional().default(false),
100
+ includeValidationIssues: z.boolean().optional().default(true),
123
101
  })
124
102
  .strict()
125
103
 
104
+ export const ResumeExecutionPlanRunArgsSchema = z.object({ runId: z.string().trim().min(1) }).strict()
105
+
126
106
  export const ExecutionPlanToolResultDataSchema = z
127
107
  .object({
128
108
  action: ExecutionPlanToolActionSchema,
129
109
  message: z.string().trim().min(1).optional(),
130
- changedTaskId: z.string().nullish(),
110
+ changedNodeId: z.string().nullish(),
131
111
  plan: SerializableExecutionPlanSchema.nullish(),
132
112
  hasPlan: z.boolean(),
133
- status: ExecutionPlanStatusSchema.nullish(),
113
+ status: PlanRunStatusSchema.nullish(),
134
114
  })
135
115
  .strict()
136
116
 
@@ -147,9 +127,9 @@ export type ConsultTeamResponseData = Omit<z.infer<typeof ConsultTeamResponseSch
147
127
  export type ConsultTeamResultData = { responses: ConsultTeamResponseData[] }
148
128
  export type CreateExecutionPlanArgs = z.infer<typeof CreateExecutionPlanArgsSchema>
149
129
  export type ReplaceExecutionPlanArgs = z.infer<typeof ReplaceExecutionPlanArgsSchema>
150
- export type SetExecutionTaskStatusArgs = z.infer<typeof SetExecutionTaskStatusArgsSchema>
130
+ export type SubmitExecutionNodeResultArgs = z.infer<typeof SubmitExecutionNodeResultArgsSchema>
151
131
  export type GetActiveExecutionPlanArgs = z.infer<typeof GetActiveExecutionPlanArgsSchema>
152
- export type RestartExecutionTaskArgs = z.infer<typeof RestartExecutionTaskArgsSchema>
132
+ export type ResumeExecutionPlanRunArgs = z.infer<typeof ResumeExecutionPlanRunArgsSchema>
153
133
  export type ExecutionPlanToolResultData = z.infer<typeof ExecutionPlanToolResultDataSchema>
154
134
  export type CoreChatTools = {
155
135
  userQuestions: { input: UserQuestionsArgs; output: unknown }
@@ -157,7 +137,7 @@ export type CoreChatTools = {
157
137
  consultTeam: { input: ConsultTeamArgs; output: ConsultTeamResultData }
158
138
  createExecutionPlan: { input: CreateExecutionPlanArgs; output: ExecutionPlanToolResultData }
159
139
  replaceExecutionPlan: { input: ReplaceExecutionPlanArgs; output: ExecutionPlanToolResultData }
160
- setExecutionTaskStatus: { input: SetExecutionTaskStatusArgs; output: ExecutionPlanToolResultData }
140
+ submitExecutionNodeResult: { input: SubmitExecutionNodeResultArgs; output: ExecutionPlanToolResultData }
161
141
  getActiveExecutionPlan: { input: GetActiveExecutionPlanArgs; output: ExecutionPlanToolResultData }
162
- restartExecutionTask: { input: RestartExecutionTaskArgs; output: ExecutionPlanToolResultData }
142
+ resumeExecutionPlanRun: { input: ResumeExecutionPlanRunArgs; output: ExecutionPlanToolResultData }
163
143
  }
@@ -36,7 +36,7 @@ export const sdkWorkstreamRecordSchema = z.object({
36
36
  memoryBlock: z.string().nullish(),
37
37
  memoryBlockSummary: z.string().nullish(),
38
38
  activeRunId: z.string().nullish(),
39
- chatSummary: z.string().nullish(),
39
+ compactionSummary: z.string().nullish(),
40
40
  lastCompactedMessageId: z.string().nullish(),
41
41
  nameGenerated: z.boolean().optional(),
42
42
  isCompacting: z.boolean().optional(),