@adea-ai/runtime-sdk 1.21.1 → 1.23.0
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/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/pi-durable-lead.d.ts +188 -0
- package/dist/pi-durable-lead.js +123 -0
- package/dist/pi-durable-questions.d.ts +106 -0
- package/dist/pi-durable-questions.js +109 -0
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { PiDurableQuestionAnswersSchema, PiDurableQuestionRequestIdSchema } from './pi-durable-questions.js';
|
|
2
3
|
import { IdentifierSchemas, ModelSelectionRefSchema } from '@adea-ai/contracts';
|
|
3
4
|
import { RuntimeExecutionProgressSchema, RuntimeExecutionStatusSchema, RuntimeExecutionStateSchema, RuntimeObservedGenerationSchema } from './adapter.js';
|
|
4
5
|
declare const IntentId: z.ZodUUID;
|
|
@@ -155,6 +156,55 @@ export declare const PiDurableLeadProgressRequestSchema: z.ZodObject<{
|
|
|
155
156
|
afterSequence: z.ZodOptional<z.ZodNumber>;
|
|
156
157
|
}, z.core.$strict>;
|
|
157
158
|
}, z.core.$strict>;
|
|
159
|
+
export declare const PI_DURABLE_LEAD_EVENTS_CONTRACT_VERSION = 1;
|
|
160
|
+
export declare const PI_DURABLE_LEAD_EVENTS_MAX_PAGE = 256;
|
|
161
|
+
export declare const PI_DURABLE_LEAD_EVENTS_MAX_WAIT_MS = 8000;
|
|
162
|
+
export declare const PiDurableLeadEventsRequestSchema: z.ZodObject<{
|
|
163
|
+
contractVersion: z.ZodObject<{
|
|
164
|
+
major: z.ZodNumber;
|
|
165
|
+
minor: z.ZodNumber;
|
|
166
|
+
}, z.core.$strict>;
|
|
167
|
+
requestId: z.ZodPipe<z.ZodString, z.ZodTransform<import("@adea-ai/contracts").OpaqueIdentifier<"request ID">, string>>;
|
|
168
|
+
workspaceId: z.ZodPipe<z.ZodString, z.ZodTransform<import("@adea-ai/contracts").OpaqueIdentifier<"workspace ID">, string>>;
|
|
169
|
+
projectId: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<import("@adea-ai/contracts").OpaqueIdentifier<"project ID">, string>>>;
|
|
170
|
+
requestedAt: z.ZodISODateTime;
|
|
171
|
+
caller: typeof Caller;
|
|
172
|
+
correlation: typeof Correlation;
|
|
173
|
+
operation: z.ZodLiteral<"pi-durable.lead.events">;
|
|
174
|
+
parameters: z.ZodObject<{
|
|
175
|
+
dispatchId: typeof DispatchId;
|
|
176
|
+
messageId: z.ZodString;
|
|
177
|
+
afterSeq: z.ZodNumber;
|
|
178
|
+
waitMs: z.ZodNumber;
|
|
179
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
180
|
+
}, z.core.$strict>;
|
|
181
|
+
}, z.core.$strict>;
|
|
182
|
+
export declare const PiDurableLeadTurnEventSchema: z.ZodObject<{
|
|
183
|
+
schemaVersion: z.ZodLiteral<1>;
|
|
184
|
+
eventId: z.ZodString;
|
|
185
|
+
runtimeSessionId: z.ZodString;
|
|
186
|
+
harnessRunId: z.ZodString;
|
|
187
|
+
generation: z.ZodLiteral<1>;
|
|
188
|
+
seq: z.ZodString;
|
|
189
|
+
occurredAt: z.ZodISODateTime;
|
|
190
|
+
receivedAt: z.ZodISODateTime;
|
|
191
|
+
source: z.ZodLiteral<"native">;
|
|
192
|
+
sourceEventId: z.ZodString;
|
|
193
|
+
confidence: z.ZodLiteral<"authoritative">;
|
|
194
|
+
classification: z.ZodEnum<{
|
|
195
|
+
restricted_local: "restricted_local";
|
|
196
|
+
workspace_private: "workspace_private";
|
|
197
|
+
}>;
|
|
198
|
+
kind: z.ZodString;
|
|
199
|
+
payload: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
200
|
+
}, z.core.$strict>;
|
|
201
|
+
export declare const PiDurableLeadEventsDataSchema: z.ZodObject<{
|
|
202
|
+
contractVersion: z.ZodLiteral<1>;
|
|
203
|
+
dispatchId: typeof DispatchId;
|
|
204
|
+
events: z.ZodArray<typeof PiDurableLeadTurnEventSchema>;
|
|
205
|
+
nextSeq: z.ZodNumber;
|
|
206
|
+
complete: z.ZodBoolean;
|
|
207
|
+
}, z.core.$strict>;
|
|
158
208
|
export declare const PiDurableLeadChildrenCursorSchema: z.ZodReadonly<z.ZodObject<{
|
|
159
209
|
acceptedAt: z.ZodISODateTime;
|
|
160
210
|
delegationId: z.ZodPipe<z.ZodString, z.ZodTransform<import("@adea-ai/contracts").OpaqueIdentifier<"delegation ID">, string>>;
|
|
@@ -215,6 +265,47 @@ export declare const PiDurableLeadCancelRequestSchema: z.ZodObject<{
|
|
|
215
265
|
dispatchId: z.ZodString;
|
|
216
266
|
}, z.core.$strict>;
|
|
217
267
|
}, z.core.$strict>;
|
|
268
|
+
export declare const PiDurableLeadQuestionAnswerRequestSchema: z.ZodObject<{
|
|
269
|
+
contractVersion: z.ZodObject<{
|
|
270
|
+
major: z.ZodNumber;
|
|
271
|
+
minor: z.ZodNumber;
|
|
272
|
+
}, z.core.$strict>;
|
|
273
|
+
requestId: z.ZodPipe<z.ZodString, z.ZodTransform<import("@adea-ai/contracts").OpaqueIdentifier<"request ID">, string>>;
|
|
274
|
+
workspaceId: z.ZodPipe<z.ZodString, z.ZodTransform<import("@adea-ai/contracts").OpaqueIdentifier<"workspace ID">, string>>;
|
|
275
|
+
projectId: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<import("@adea-ai/contracts").OpaqueIdentifier<"project ID">, string>>>;
|
|
276
|
+
commandId: z.ZodPipe<z.ZodString, z.ZodTransform<import("@adea-ai/contracts").OpaqueIdentifier<"command ID">, string>>;
|
|
277
|
+
idempotencyKey: z.ZodString;
|
|
278
|
+
payloadHash: z.ZodString;
|
|
279
|
+
issuedAt: z.ZodISODateTime;
|
|
280
|
+
caller: typeof Caller;
|
|
281
|
+
correlation: typeof Correlation;
|
|
282
|
+
operation: z.ZodLiteral<"pi-durable.lead.question-answer">;
|
|
283
|
+
payload: z.ZodObject<{
|
|
284
|
+
dispatchId: typeof DispatchId;
|
|
285
|
+
requestId: typeof PiDurableQuestionRequestIdSchema;
|
|
286
|
+
answers: typeof PiDurableQuestionAnswersSchema;
|
|
287
|
+
}, z.core.$strict>;
|
|
288
|
+
}, z.core.$strict>;
|
|
289
|
+
export declare const PiDurableLeadChildCancelRequestSchema: z.ZodObject<{
|
|
290
|
+
contractVersion: z.ZodObject<{
|
|
291
|
+
major: z.ZodNumber;
|
|
292
|
+
minor: z.ZodNumber;
|
|
293
|
+
}, z.core.$strict>;
|
|
294
|
+
requestId: z.ZodPipe<z.ZodString, z.ZodTransform<import("@adea-ai/contracts").OpaqueIdentifier<"request ID">, string>>;
|
|
295
|
+
workspaceId: z.ZodPipe<z.ZodString, z.ZodTransform<import("@adea-ai/contracts").OpaqueIdentifier<"workspace ID">, string>>;
|
|
296
|
+
projectId: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<import("@adea-ai/contracts").OpaqueIdentifier<"project ID">, string>>>;
|
|
297
|
+
commandId: z.ZodPipe<z.ZodString, z.ZodTransform<import("@adea-ai/contracts").OpaqueIdentifier<"command ID">, string>>;
|
|
298
|
+
idempotencyKey: z.ZodString;
|
|
299
|
+
payloadHash: z.ZodString;
|
|
300
|
+
issuedAt: z.ZodISODateTime;
|
|
301
|
+
caller: typeof Caller;
|
|
302
|
+
correlation: typeof Correlation;
|
|
303
|
+
operation: z.ZodLiteral<"pi-durable.lead.child-cancel">;
|
|
304
|
+
payload: z.ZodObject<{
|
|
305
|
+
dispatchId: typeof DispatchId;
|
|
306
|
+
delegationId: typeof IdentifierSchemas.delegationId;
|
|
307
|
+
}, z.core.$strict>;
|
|
308
|
+
}, z.core.$strict>;
|
|
218
309
|
export declare const PiDurableLeadReceiptResponseSchema: z.ZodObject<{
|
|
219
310
|
schemaVersion: z.ZodLiteral<"pi-lead-dispatch/v1">;
|
|
220
311
|
dispatchId: typeof DispatchId;
|
|
@@ -437,6 +528,51 @@ export declare const PiDurableLeadCancelResponseSchema: z.ZodObject<{
|
|
|
437
528
|
status: typeof RuntimeExecutionStatusSchema;
|
|
438
529
|
}, z.core.$strict>;
|
|
439
530
|
}, z.core.$strict>;
|
|
531
|
+
export declare const PiDurableLeadQuestionAnswerResponseSchema: z.ZodObject<{
|
|
532
|
+
contractVersion: z.ZodObject<{
|
|
533
|
+
major: z.ZodNumber;
|
|
534
|
+
minor: z.ZodNumber;
|
|
535
|
+
}, z.core.$strict>;
|
|
536
|
+
requestId: z.ZodPipe<z.ZodString, z.ZodTransform<import("@adea-ai/contracts").OpaqueIdentifier<"request ID">, string>>;
|
|
537
|
+
correlation: z.ZodObject<{
|
|
538
|
+
traceId: z.ZodPipe<z.ZodString, z.ZodTransform<import("@adea-ai/contracts").OpaqueIdentifier<"trace ID">, string>>;
|
|
539
|
+
causationCommandId: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<import("@adea-ai/contracts").OpaqueIdentifier<"command ID">, string>>>;
|
|
540
|
+
parentEventId: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<import("@adea-ai/contracts").OpaqueIdentifier<"event ID">, string>>>;
|
|
541
|
+
}, z.core.$strict>;
|
|
542
|
+
data: z.ZodObject<{
|
|
543
|
+
schemaVersion: z.ZodLiteral<"pi-lead-dispatch/v1">;
|
|
544
|
+
dispatchId: typeof DispatchId;
|
|
545
|
+
intentId: typeof IntentId;
|
|
546
|
+
executionId: typeof IdentifierSchemas.executionId;
|
|
547
|
+
attemptId: typeof IdentifierSchemas.attemptId;
|
|
548
|
+
runtimeSessionId: z.ZodPipe<z.ZodString, z.ZodTransform<import("@adea-ai/contracts").OpaqueIdentifier<"external-session ID">, string>>;
|
|
549
|
+
requestedTarget: z.ZodOptional<typeof PiDurableLeadRequestedTargetSchema>;
|
|
550
|
+
observedTarget: z.ZodOptional<typeof PiDurableLeadObservedTargetSchema>;
|
|
551
|
+
questionSchemaVersion: z.ZodLiteral<"pi-lead-question-answer/v1">;
|
|
552
|
+
requestId: typeof PiDurableQuestionRequestIdSchema;
|
|
553
|
+
requestEventId: z.ZodString;
|
|
554
|
+
outcome: z.ZodEnum<{
|
|
555
|
+
already_answered: "already_answered";
|
|
556
|
+
answered: "answered";
|
|
557
|
+
expired: "expired";
|
|
558
|
+
}>;
|
|
559
|
+
state: typeof RuntimeExecutionStateSchema;
|
|
560
|
+
status: typeof RuntimeExecutionStatusSchema;
|
|
561
|
+
}, z.core.$strict>;
|
|
562
|
+
}, z.core.$strict>;
|
|
563
|
+
export declare const PiDurableLeadEventsResponseSchema: z.ZodObject<{
|
|
564
|
+
contractVersion: z.ZodObject<{
|
|
565
|
+
major: z.ZodNumber;
|
|
566
|
+
minor: z.ZodNumber;
|
|
567
|
+
}, z.core.$strict>;
|
|
568
|
+
requestId: z.ZodPipe<z.ZodString, z.ZodTransform<import("@adea-ai/contracts").OpaqueIdentifier<"request ID">, string>>;
|
|
569
|
+
correlation: z.ZodObject<{
|
|
570
|
+
traceId: z.ZodPipe<z.ZodString, z.ZodTransform<import("@adea-ai/contracts").OpaqueIdentifier<"trace ID">, string>>;
|
|
571
|
+
causationCommandId: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<import("@adea-ai/contracts").OpaqueIdentifier<"command ID">, string>>>;
|
|
572
|
+
parentEventId: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<import("@adea-ai/contracts").OpaqueIdentifier<"event ID">, string>>>;
|
|
573
|
+
}, z.core.$strict>;
|
|
574
|
+
data: typeof PiDurableLeadEventsDataSchema;
|
|
575
|
+
}, z.core.$strict>;
|
|
440
576
|
declare const ChildReference: z.ZodString;
|
|
441
577
|
export declare const PiDurableLeadChildOutcomeSchema: z.ZodObject<{
|
|
442
578
|
state: z.ZodEnum<{
|
|
@@ -506,6 +642,30 @@ export declare const PiDurableLeadChildrenResponseSchema: z.ZodObject<{
|
|
|
506
642
|
next: z.ZodOptional<typeof PiDurableLeadChildrenCursorSchema>;
|
|
507
643
|
}, z.core.$strict>;
|
|
508
644
|
}, z.core.$strict>;
|
|
645
|
+
export declare const PiDurableLeadChildCancelResponseSchema: z.ZodObject<{
|
|
646
|
+
contractVersion: z.ZodObject<{
|
|
647
|
+
major: z.ZodNumber;
|
|
648
|
+
minor: z.ZodNumber;
|
|
649
|
+
}, z.core.$strict>;
|
|
650
|
+
requestId: z.ZodPipe<z.ZodString, z.ZodTransform<import("@adea-ai/contracts").OpaqueIdentifier<"request ID">, string>>;
|
|
651
|
+
correlation: z.ZodObject<{
|
|
652
|
+
traceId: z.ZodPipe<z.ZodString, z.ZodTransform<import("@adea-ai/contracts").OpaqueIdentifier<"trace ID">, string>>;
|
|
653
|
+
causationCommandId: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<import("@adea-ai/contracts").OpaqueIdentifier<"command ID">, string>>>;
|
|
654
|
+
parentEventId: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<import("@adea-ai/contracts").OpaqueIdentifier<"event ID">, string>>>;
|
|
655
|
+
}, z.core.$strict>;
|
|
656
|
+
data: z.ZodObject<{
|
|
657
|
+
schemaVersion: z.ZodLiteral<"pi-lead-dispatch/v1">;
|
|
658
|
+
dispatchId: typeof DispatchId;
|
|
659
|
+
intentId: typeof IntentId;
|
|
660
|
+
executionId: typeof IdentifierSchemas.executionId;
|
|
661
|
+
attemptId: typeof IdentifierSchemas.attemptId;
|
|
662
|
+
runtimeSessionId: z.ZodPipe<z.ZodString, z.ZodTransform<import("@adea-ai/contracts").OpaqueIdentifier<"external-session ID">, string>>;
|
|
663
|
+
requestedTarget: z.ZodOptional<typeof PiDurableLeadRequestedTargetSchema>;
|
|
664
|
+
observedTarget: z.ZodOptional<typeof PiDurableLeadObservedTargetSchema>;
|
|
665
|
+
child: typeof PiDurableLeadChildSchema;
|
|
666
|
+
attributed: z.ZodBoolean;
|
|
667
|
+
}, z.core.$strict>;
|
|
668
|
+
}, z.core.$strict>;
|
|
509
669
|
export declare const PiDurableLeadChildTargetSchema: z.ZodObject<{
|
|
510
670
|
source: z.ZodLiteral<"control_plane_reported">;
|
|
511
671
|
runtimeConnectionId: typeof IdentifierSchemas.runtimeConnectionId;
|
|
@@ -629,6 +789,13 @@ export declare const PiDurableLeadHttpContract: Readonly<{
|
|
|
629
789
|
requestSchema: typeof PiDurableLeadProgressRequestSchema;
|
|
630
790
|
responseSchema: typeof PiDurableLeadProgressResponseSchema;
|
|
631
791
|
}>;
|
|
792
|
+
events: Readonly<{
|
|
793
|
+
route: "events";
|
|
794
|
+
operation: "pi-durable.lead.events";
|
|
795
|
+
scope: "execution:read";
|
|
796
|
+
requestSchema: typeof PiDurableLeadEventsRequestSchema;
|
|
797
|
+
responseSchema: typeof PiDurableLeadEventsResponseSchema;
|
|
798
|
+
}>;
|
|
632
799
|
children: Readonly<{
|
|
633
800
|
route: "children";
|
|
634
801
|
operation: "pi-durable.lead.children";
|
|
@@ -650,6 +817,20 @@ export declare const PiDurableLeadHttpContract: Readonly<{
|
|
|
650
817
|
requestSchema: typeof PiDurableLeadCancelRequestSchema;
|
|
651
818
|
responseSchema: typeof PiDurableLeadCancelResponseSchema;
|
|
652
819
|
}>;
|
|
820
|
+
questionAnswer: Readonly<{
|
|
821
|
+
route: "questions/answer";
|
|
822
|
+
operation: "pi-durable.lead.question-answer";
|
|
823
|
+
scope: "execution:write";
|
|
824
|
+
requestSchema: typeof PiDurableLeadQuestionAnswerRequestSchema;
|
|
825
|
+
responseSchema: typeof PiDurableLeadQuestionAnswerResponseSchema;
|
|
826
|
+
}>;
|
|
827
|
+
childCancel: Readonly<{
|
|
828
|
+
route: "child-cancel";
|
|
829
|
+
operation: "pi-durable.lead.child-cancel";
|
|
830
|
+
scope: "execution:cancel";
|
|
831
|
+
requestSchema: typeof PiDurableLeadChildCancelRequestSchema;
|
|
832
|
+
responseSchema: typeof PiDurableLeadChildCancelResponseSchema;
|
|
833
|
+
}>;
|
|
653
834
|
}>;
|
|
654
835
|
export type PiDurableLeadPrepareRequest = z.output<typeof PiDurableLeadPrepareRequestSchema>;
|
|
655
836
|
export type PiDurableLeadPrepareResponse = z.output<typeof PiDurableLeadPrepareResponseSchema>;
|
|
@@ -663,11 +844,18 @@ export type PiDurableLeadStatusRequest = z.output<typeof PiDurableLeadStatusRequ
|
|
|
663
844
|
export type PiDurableLeadStatusResponse = z.output<typeof PiDurableLeadStatusResponseSchema>;
|
|
664
845
|
export type PiDurableLeadProgressRequest = z.output<typeof PiDurableLeadProgressRequestSchema>;
|
|
665
846
|
export type PiDurableLeadProgressResponse = z.output<typeof PiDurableLeadProgressResponseSchema>;
|
|
847
|
+
export type PiDurableLeadEventsRequest = z.output<typeof PiDurableLeadEventsRequestSchema>;
|
|
848
|
+
export type PiDurableLeadEventsResponse = z.output<typeof PiDurableLeadEventsResponseSchema>;
|
|
849
|
+
export type PiDurableLeadTurnEvent = z.output<typeof PiDurableLeadTurnEventSchema>;
|
|
666
850
|
export type PiDurableLeadChildrenRequest = z.output<typeof PiDurableLeadChildrenRequestSchema>;
|
|
667
851
|
export type PiDurableLeadChildrenResponse = z.output<typeof PiDurableLeadChildrenResponseSchema>;
|
|
668
852
|
export type PiDurableLeadChild = z.output<typeof PiDurableLeadChildSchema>;
|
|
669
853
|
export type PiDurableLeadCancelRequest = z.output<typeof PiDurableLeadCancelRequestSchema>;
|
|
670
854
|
export type PiDurableLeadCancelResponse = z.output<typeof PiDurableLeadCancelResponseSchema>;
|
|
855
|
+
export type PiDurableLeadQuestionAnswerRequest = z.output<typeof PiDurableLeadQuestionAnswerRequestSchema>;
|
|
856
|
+
export type PiDurableLeadQuestionAnswerResponse = z.output<typeof PiDurableLeadQuestionAnswerResponseSchema>;
|
|
857
|
+
export type PiDurableLeadChildCancelRequest = z.output<typeof PiDurableLeadChildCancelRequestSchema>;
|
|
858
|
+
export type PiDurableLeadChildCancelResponse = z.output<typeof PiDurableLeadChildCancelResponseSchema>;
|
|
671
859
|
export type PiDurableLeadChildTargetRequest = z.output<typeof PiDurableLeadChildTargetRequestSchema>;
|
|
672
860
|
export type PiDurableLeadChildTargetResponse = z.output<typeof PiDurableLeadChildTargetResponseSchema>;
|
|
673
861
|
export type PiDurableLeadChildTarget = z.output<typeof PiDurableLeadChildTargetSchema>;
|
package/dist/pi-durable-lead.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { PiDurableQuestionAnswersSchema, PiDurableQuestionRequestIdSchema, } from './pi-durable-questions.js';
|
|
2
3
|
import { ContractVersionSchema, IdentifierSchemas, ModelSelectionFundingViewSchema, ModelSelectionRefSchema, PublicContractManifest, ReadRequestEnvelopeSchema, StateChangingCommandEnvelopeSchema, SuccessResponseEnvelopeSchema, negotiateContractVersion, } from '@adea-ai/contracts';
|
|
3
4
|
import { RuntimeExecutionHandleSchema, RuntimeExecutionProgressSchema, RuntimeExecutionStatusSchema, RuntimeExecutionStateSchema, RuntimeObservedGenerationSchema, } from './adapter.js';
|
|
4
5
|
const IntentId = z.uuid();
|
|
@@ -101,6 +102,69 @@ export const PiDurableLeadProgressRequestSchema = PiDurableLeadReadEnvelopeSchem
|
|
|
101
102
|
})
|
|
102
103
|
.strict(),
|
|
103
104
|
});
|
|
105
|
+
export const PI_DURABLE_LEAD_EVENTS_CONTRACT_VERSION = 1;
|
|
106
|
+
export const PI_DURABLE_LEAD_EVENTS_MAX_PAGE = 256;
|
|
107
|
+
export const PI_DURABLE_LEAD_EVENTS_MAX_WAIT_MS = 8000;
|
|
108
|
+
const LeadEventSeq = z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER);
|
|
109
|
+
export const PiDurableLeadEventsRequestSchema = PiDurableLeadReadEnvelopeSchema.extend({
|
|
110
|
+
operation: z.literal('pi-durable.lead.events'),
|
|
111
|
+
parameters: z
|
|
112
|
+
.object({
|
|
113
|
+
dispatchId: DispatchId,
|
|
114
|
+
messageId: z
|
|
115
|
+
.string()
|
|
116
|
+
.min(1)
|
|
117
|
+
.max(128)
|
|
118
|
+
.regex(/^[A-Za-z0-9._:-]+$/),
|
|
119
|
+
afterSeq: LeadEventSeq,
|
|
120
|
+
waitMs: z.number().int().min(0).max(PI_DURABLE_LEAD_EVENTS_MAX_WAIT_MS),
|
|
121
|
+
limit: z.number().int().min(1).max(PI_DURABLE_LEAD_EVENTS_MAX_PAGE).optional(),
|
|
122
|
+
})
|
|
123
|
+
.strict(),
|
|
124
|
+
});
|
|
125
|
+
export const PiDurableLeadTurnEventSchema = z
|
|
126
|
+
.object({
|
|
127
|
+
schemaVersion: z.literal(1),
|
|
128
|
+
eventId: z.string().min(1).max(256),
|
|
129
|
+
runtimeSessionId: z.string().regex(/^pi-lead:dispatch_[a-f0-9]{32}$/),
|
|
130
|
+
harnessRunId: z.string().min(1).max(256),
|
|
131
|
+
generation: z.literal(1),
|
|
132
|
+
seq: z.string().regex(/^[1-9]\d*$/),
|
|
133
|
+
occurredAt: z.iso.datetime(),
|
|
134
|
+
receivedAt: z.iso.datetime(),
|
|
135
|
+
source: z.literal('native'),
|
|
136
|
+
sourceEventId: z.string().min(1).max(256),
|
|
137
|
+
confidence: z.literal('authoritative'),
|
|
138
|
+
classification: z.enum(['workspace_private', 'restricted_local']),
|
|
139
|
+
kind: z.string().min(1).max(64),
|
|
140
|
+
payload: z.record(z.string(), z.unknown()),
|
|
141
|
+
})
|
|
142
|
+
.strict();
|
|
143
|
+
export const PiDurableLeadEventsDataSchema = z
|
|
144
|
+
.object({
|
|
145
|
+
contractVersion: z.literal(PI_DURABLE_LEAD_EVENTS_CONTRACT_VERSION),
|
|
146
|
+
dispatchId: DispatchId,
|
|
147
|
+
events: z
|
|
148
|
+
.array(PiDurableLeadTurnEventSchema)
|
|
149
|
+
.max(PI_DURABLE_LEAD_EVENTS_MAX_PAGE),
|
|
150
|
+
nextSeq: LeadEventSeq,
|
|
151
|
+
complete: z.boolean(),
|
|
152
|
+
})
|
|
153
|
+
.strict()
|
|
154
|
+
.superRefine((value, context) => {
|
|
155
|
+
const first = value.nextSeq - value.events.length + 1;
|
|
156
|
+
value.events.forEach((event, index) => {
|
|
157
|
+
if (event.seq !== String(first + index) ||
|
|
158
|
+
event.runtimeSessionId !== `pi-lead:${value.dispatchId}`)
|
|
159
|
+
context.addIssue({
|
|
160
|
+
code: 'custom',
|
|
161
|
+
path: ['events', index],
|
|
162
|
+
message: 'Events must be the contiguous seqs of this dispatch ending at nextSeq',
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
if (first < 1)
|
|
166
|
+
context.addIssue({ code: 'custom', path: ['nextSeq'], message: 'nextSeq precedes the page' });
|
|
167
|
+
});
|
|
104
168
|
export const PiDurableLeadChildrenCursorSchema = z
|
|
105
169
|
.object({ acceptedAt: z.iso.datetime(), delegationId: IdentifierSchemas.delegationId })
|
|
106
170
|
.strict()
|
|
@@ -129,6 +193,25 @@ export const PiDurableLeadCancelRequestSchema = PiDurableLeadCommandEnvelopeSche
|
|
|
129
193
|
operation: z.literal('pi-durable.lead.cancel'),
|
|
130
194
|
payload: z.object({ dispatchId: DispatchId }).strict(),
|
|
131
195
|
});
|
|
196
|
+
export const PiDurableLeadQuestionAnswerRequestSchema = PiDurableLeadCommandEnvelopeSchema.extend({
|
|
197
|
+
operation: z.literal('pi-durable.lead.question-answer'),
|
|
198
|
+
payload: z
|
|
199
|
+
.object({
|
|
200
|
+
dispatchId: DispatchId,
|
|
201
|
+
requestId: PiDurableQuestionRequestIdSchema,
|
|
202
|
+
answers: PiDurableQuestionAnswersSchema,
|
|
203
|
+
})
|
|
204
|
+
.strict(),
|
|
205
|
+
});
|
|
206
|
+
export const PiDurableLeadChildCancelRequestSchema = PiDurableLeadCommandEnvelopeSchema.extend({
|
|
207
|
+
operation: z.literal('pi-durable.lead.child-cancel'),
|
|
208
|
+
payload: z
|
|
209
|
+
.object({
|
|
210
|
+
dispatchId: DispatchId,
|
|
211
|
+
delegationId: IdentifierSchemas.delegationId,
|
|
212
|
+
})
|
|
213
|
+
.strict(),
|
|
214
|
+
});
|
|
132
215
|
export const PiDurableLeadReceiptResponseSchema = z
|
|
133
216
|
.object({
|
|
134
217
|
schemaVersion: z.literal('pi-lead-dispatch/v1'),
|
|
@@ -247,6 +330,19 @@ export const PiDurableLeadProgressResponseSchema = response.extend({
|
|
|
247
330
|
}),
|
|
248
331
|
});
|
|
249
332
|
export const PiDurableLeadCancelResponseSchema = PiDurableLeadStatusResponseSchema;
|
|
333
|
+
export const PiDurableLeadQuestionAnswerResponseSchema = response.extend({
|
|
334
|
+
data: PiDurableLeadReceiptResponseSchema.extend({
|
|
335
|
+
questionSchemaVersion: z.literal('pi-lead-question-answer/v1'),
|
|
336
|
+
requestId: PiDurableQuestionRequestIdSchema,
|
|
337
|
+
requestEventId: z.string().min(1).max(256),
|
|
338
|
+
outcome: z.enum(['answered', 'already_answered', 'expired']),
|
|
339
|
+
state: RuntimeExecutionStateSchema,
|
|
340
|
+
status: RuntimeExecutionStatusSchema,
|
|
341
|
+
}),
|
|
342
|
+
});
|
|
343
|
+
export const PiDurableLeadEventsResponseSchema = response.extend({
|
|
344
|
+
data: PiDurableLeadEventsDataSchema,
|
|
345
|
+
});
|
|
250
346
|
const ChildReference = z
|
|
251
347
|
.string()
|
|
252
348
|
.trim()
|
|
@@ -313,6 +409,12 @@ export const PiDurableLeadChildrenResponseSchema = response.extend({
|
|
|
313
409
|
});
|
|
314
410
|
}),
|
|
315
411
|
});
|
|
412
|
+
export const PiDurableLeadChildCancelResponseSchema = response.extend({
|
|
413
|
+
data: PiDurableLeadReceiptResponseSchema.extend({
|
|
414
|
+
child: PiDurableLeadChildSchema,
|
|
415
|
+
attributed: z.boolean(),
|
|
416
|
+
}),
|
|
417
|
+
});
|
|
316
418
|
export const PiDurableLeadChildTargetSchema = z.strictObject({
|
|
317
419
|
source: z.literal('control_plane_reported'),
|
|
318
420
|
runtimeConnectionId: IdentifierSchemas.runtimeConnectionId,
|
|
@@ -443,6 +545,13 @@ export const PiDurableLeadHttpContract = Object.freeze({
|
|
|
443
545
|
requestSchema: PiDurableLeadProgressRequestSchema,
|
|
444
546
|
responseSchema: PiDurableLeadProgressResponseSchema,
|
|
445
547
|
}),
|
|
548
|
+
events: Object.freeze({
|
|
549
|
+
route: 'events',
|
|
550
|
+
operation: 'pi-durable.lead.events',
|
|
551
|
+
scope: 'execution:read',
|
|
552
|
+
requestSchema: PiDurableLeadEventsRequestSchema,
|
|
553
|
+
responseSchema: PiDurableLeadEventsResponseSchema,
|
|
554
|
+
}),
|
|
446
555
|
children: Object.freeze({
|
|
447
556
|
route: 'children',
|
|
448
557
|
operation: 'pi-durable.lead.children',
|
|
@@ -464,4 +573,18 @@ export const PiDurableLeadHttpContract = Object.freeze({
|
|
|
464
573
|
requestSchema: PiDurableLeadCancelRequestSchema,
|
|
465
574
|
responseSchema: PiDurableLeadCancelResponseSchema,
|
|
466
575
|
}),
|
|
576
|
+
questionAnswer: Object.freeze({
|
|
577
|
+
route: 'questions/answer',
|
|
578
|
+
operation: 'pi-durable.lead.question-answer',
|
|
579
|
+
scope: 'execution:write',
|
|
580
|
+
requestSchema: PiDurableLeadQuestionAnswerRequestSchema,
|
|
581
|
+
responseSchema: PiDurableLeadQuestionAnswerResponseSchema,
|
|
582
|
+
}),
|
|
583
|
+
childCancel: Object.freeze({
|
|
584
|
+
route: 'child-cancel',
|
|
585
|
+
operation: 'pi-durable.lead.child-cancel',
|
|
586
|
+
scope: 'execution:cancel',
|
|
587
|
+
requestSchema: PiDurableLeadChildCancelRequestSchema,
|
|
588
|
+
responseSchema: PiDurableLeadChildCancelResponseSchema,
|
|
589
|
+
}),
|
|
467
590
|
});
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const PI_QUESTION_TIMEOUT_DEFAULT_SECONDS: number;
|
|
3
|
+
export declare const PI_QUESTION_TIMEOUT_MIN_SECONDS = 60;
|
|
4
|
+
export declare const PI_QUESTION_TIMEOUT_MAX_SECONDS: number;
|
|
5
|
+
export declare const PI_QUESTIONS_MAX = 8;
|
|
6
|
+
export declare const PI_QUESTION_OPTIONS_MAX = 16;
|
|
7
|
+
export declare const PI_QUESTION_CONTENT_BYTES_MAX: number;
|
|
8
|
+
export declare const PiDurableQuestionRequestIdSchema: z.ZodString;
|
|
9
|
+
export declare const PiDurableQuestionSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
10
|
+
id: z.ZodString;
|
|
11
|
+
prompt: z.ZodString;
|
|
12
|
+
required: z.ZodBoolean;
|
|
13
|
+
kind: z.ZodLiteral<"text">;
|
|
14
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
15
|
+
id: z.ZodString;
|
|
16
|
+
prompt: z.ZodString;
|
|
17
|
+
required: z.ZodBoolean;
|
|
18
|
+
kind: z.ZodLiteral<"choice">;
|
|
19
|
+
multiple: z.ZodBoolean;
|
|
20
|
+
options: z.ZodArray<z.ZodObject<{
|
|
21
|
+
id: z.ZodString;
|
|
22
|
+
label: z.ZodString;
|
|
23
|
+
description: z.ZodOptional<z.ZodString>;
|
|
24
|
+
}, z.core.$strict>>;
|
|
25
|
+
}, z.core.$strict>], "kind">;
|
|
26
|
+
export type PiDurableQuestion = z.output<typeof PiDurableQuestionSchema>;
|
|
27
|
+
export declare const PiDurableQuestionsSchema: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
28
|
+
id: z.ZodString;
|
|
29
|
+
prompt: z.ZodString;
|
|
30
|
+
required: z.ZodBoolean;
|
|
31
|
+
kind: z.ZodLiteral<"text">;
|
|
32
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
33
|
+
id: z.ZodString;
|
|
34
|
+
prompt: z.ZodString;
|
|
35
|
+
required: z.ZodBoolean;
|
|
36
|
+
kind: z.ZodLiteral<"choice">;
|
|
37
|
+
multiple: z.ZodBoolean;
|
|
38
|
+
options: z.ZodArray<z.ZodObject<{
|
|
39
|
+
id: z.ZodString;
|
|
40
|
+
label: z.ZodString;
|
|
41
|
+
description: z.ZodOptional<z.ZodString>;
|
|
42
|
+
}, z.core.$strict>>;
|
|
43
|
+
}, z.core.$strict>], "kind">>;
|
|
44
|
+
export declare const PiDurableQuestionAnswerSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
45
|
+
questionId: z.ZodString;
|
|
46
|
+
text: z.ZodString;
|
|
47
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
48
|
+
questionId: z.ZodString;
|
|
49
|
+
optionIds: z.ZodArray<z.ZodString>;
|
|
50
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
51
|
+
questionId: z.ZodString;
|
|
52
|
+
skipped: z.ZodLiteral<true>;
|
|
53
|
+
}, z.core.$strict>]>;
|
|
54
|
+
export type PiDurableQuestionAnswer = z.output<typeof PiDurableQuestionAnswerSchema>;
|
|
55
|
+
export declare const PiDurableQuestionAnswersSchema: z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
|
|
56
|
+
questionId: z.ZodString;
|
|
57
|
+
text: z.ZodString;
|
|
58
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
59
|
+
questionId: z.ZodString;
|
|
60
|
+
optionIds: z.ZodArray<z.ZodString>;
|
|
61
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
62
|
+
questionId: z.ZodString;
|
|
63
|
+
skipped: z.ZodLiteral<true>;
|
|
64
|
+
}, z.core.$strict>]>>;
|
|
65
|
+
export declare const PiDurableQuestionRequestSchema: z.ZodObject<{
|
|
66
|
+
requestId: z.ZodString;
|
|
67
|
+
callId: z.ZodString;
|
|
68
|
+
questions: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
69
|
+
id: z.ZodString;
|
|
70
|
+
prompt: z.ZodString;
|
|
71
|
+
required: z.ZodBoolean;
|
|
72
|
+
kind: z.ZodLiteral<"text">;
|
|
73
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
74
|
+
id: z.ZodString;
|
|
75
|
+
prompt: z.ZodString;
|
|
76
|
+
required: z.ZodBoolean;
|
|
77
|
+
kind: z.ZodLiteral<"choice">;
|
|
78
|
+
multiple: z.ZodBoolean;
|
|
79
|
+
options: z.ZodArray<z.ZodObject<{
|
|
80
|
+
id: z.ZodString;
|
|
81
|
+
label: z.ZodString;
|
|
82
|
+
description: z.ZodOptional<z.ZodString>;
|
|
83
|
+
}, z.core.$strict>>;
|
|
84
|
+
}, z.core.$strict>], "kind">>;
|
|
85
|
+
expiresAt: z.ZodISODateTime;
|
|
86
|
+
}, z.core.$strict>;
|
|
87
|
+
export type PiDurableQuestionRequest = z.output<typeof PiDurableQuestionRequestSchema>;
|
|
88
|
+
export declare const PiDurableQuestionOutcomeSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
89
|
+
decision: z.ZodLiteral<"answered">;
|
|
90
|
+
answers: z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
|
|
91
|
+
questionId: z.ZodString;
|
|
92
|
+
text: z.ZodString;
|
|
93
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
94
|
+
questionId: z.ZodString;
|
|
95
|
+
optionIds: z.ZodArray<z.ZodString>;
|
|
96
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
97
|
+
questionId: z.ZodString;
|
|
98
|
+
skipped: z.ZodLiteral<true>;
|
|
99
|
+
}, z.core.$strict>]>>;
|
|
100
|
+
decidedAt: z.ZodISODateTime;
|
|
101
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
102
|
+
decision: z.ZodLiteral<"expired">;
|
|
103
|
+
decidedAt: z.ZodISODateTime;
|
|
104
|
+
}, z.core.$strict>], "decision">;
|
|
105
|
+
export type PiDurableQuestionOutcome = z.output<typeof PiDurableQuestionOutcomeSchema>;
|
|
106
|
+
export declare function questionAnswersProblem(questions: readonly PiDurableQuestion[], input: unknown): string | undefined;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export const PI_QUESTION_TIMEOUT_DEFAULT_SECONDS = 60 * 60;
|
|
3
|
+
export const PI_QUESTION_TIMEOUT_MIN_SECONDS = 60;
|
|
4
|
+
export const PI_QUESTION_TIMEOUT_MAX_SECONDS = 24 * 60 * 60;
|
|
5
|
+
export const PI_QUESTIONS_MAX = 8;
|
|
6
|
+
export const PI_QUESTION_OPTIONS_MAX = 16;
|
|
7
|
+
export const PI_QUESTION_CONTENT_BYTES_MAX = 32 * 1024;
|
|
8
|
+
const Id = z
|
|
9
|
+
.string()
|
|
10
|
+
.min(1)
|
|
11
|
+
.max(64)
|
|
12
|
+
.regex(/^[A-Za-z0-9][A-Za-z0-9._:-]*$/);
|
|
13
|
+
export const PiDurableQuestionRequestIdSchema = z.string().regex(/^pi-question:[a-f0-9]{32}$/);
|
|
14
|
+
const OptionSchema = z.strictObject({
|
|
15
|
+
id: Id,
|
|
16
|
+
label: z.string().trim().min(1).max(512),
|
|
17
|
+
description: z.string().trim().min(1).max(2048).optional(),
|
|
18
|
+
});
|
|
19
|
+
export const PiDurableQuestionSchema = z.discriminatedUnion('kind', [
|
|
20
|
+
z.strictObject({
|
|
21
|
+
id: Id,
|
|
22
|
+
prompt: z.string().trim().min(1).max(4096),
|
|
23
|
+
required: z.boolean(),
|
|
24
|
+
kind: z.literal('text'),
|
|
25
|
+
}),
|
|
26
|
+
z.strictObject({
|
|
27
|
+
id: Id,
|
|
28
|
+
prompt: z.string().trim().min(1).max(4096),
|
|
29
|
+
required: z.boolean(),
|
|
30
|
+
kind: z.literal('choice'),
|
|
31
|
+
multiple: z.boolean(),
|
|
32
|
+
options: z
|
|
33
|
+
.array(OptionSchema)
|
|
34
|
+
.min(1)
|
|
35
|
+
.max(PI_QUESTION_OPTIONS_MAX)
|
|
36
|
+
.refine((options) => unique(options.map((option) => option.id)), 'duplicate option id'),
|
|
37
|
+
}),
|
|
38
|
+
]);
|
|
39
|
+
export const PiDurableQuestionsSchema = z
|
|
40
|
+
.array(PiDurableQuestionSchema)
|
|
41
|
+
.min(1)
|
|
42
|
+
.max(PI_QUESTIONS_MAX)
|
|
43
|
+
.refine((questions) => unique(questions.map((question) => question.id)), 'duplicate question id')
|
|
44
|
+
.refine((questions) => fits(questions), 'questions too large');
|
|
45
|
+
export const PiDurableQuestionAnswerSchema = z.union([
|
|
46
|
+
z.strictObject({ questionId: Id, text: z.string().min(1).max(16_384) }),
|
|
47
|
+
z.strictObject({
|
|
48
|
+
questionId: Id,
|
|
49
|
+
optionIds: z
|
|
50
|
+
.array(Id)
|
|
51
|
+
.min(1)
|
|
52
|
+
.max(PI_QUESTION_OPTIONS_MAX)
|
|
53
|
+
.refine((ids) => unique(ids), 'duplicate option id'),
|
|
54
|
+
}),
|
|
55
|
+
z.strictObject({ questionId: Id, skipped: z.literal(true) }),
|
|
56
|
+
]);
|
|
57
|
+
export const PiDurableQuestionAnswersSchema = z
|
|
58
|
+
.array(PiDurableQuestionAnswerSchema)
|
|
59
|
+
.max(PI_QUESTIONS_MAX)
|
|
60
|
+
.refine((answers) => unique(answers.map((answer) => answer.questionId)), 'duplicate question id')
|
|
61
|
+
.refine((answers) => fits(answers), 'answers too large');
|
|
62
|
+
export const PiDurableQuestionRequestSchema = z.strictObject({
|
|
63
|
+
requestId: PiDurableQuestionRequestIdSchema,
|
|
64
|
+
callId: z.string().min(1).max(256),
|
|
65
|
+
questions: PiDurableQuestionsSchema,
|
|
66
|
+
expiresAt: z.iso.datetime(),
|
|
67
|
+
});
|
|
68
|
+
export const PiDurableQuestionOutcomeSchema = z.discriminatedUnion('decision', [
|
|
69
|
+
z.strictObject({
|
|
70
|
+
decision: z.literal('answered'),
|
|
71
|
+
answers: PiDurableQuestionAnswersSchema,
|
|
72
|
+
decidedAt: z.iso.datetime(),
|
|
73
|
+
}),
|
|
74
|
+
z.strictObject({ decision: z.literal('expired'), decidedAt: z.iso.datetime() }),
|
|
75
|
+
]);
|
|
76
|
+
export function questionAnswersProblem(questions, input) {
|
|
77
|
+
const parsed = PiDurableQuestionAnswersSchema.safeParse(input);
|
|
78
|
+
if (!parsed.success)
|
|
79
|
+
return 'answers are malformed';
|
|
80
|
+
const answers = new Map(parsed.data.map((answer) => [answer.questionId, answer]));
|
|
81
|
+
for (const question of questions) {
|
|
82
|
+
const answer = answers.get(question.id);
|
|
83
|
+
answers.delete(question.id);
|
|
84
|
+
if (!answer || 'skipped' in answer) {
|
|
85
|
+
if (question.required)
|
|
86
|
+
return 'a required question is unanswered';
|
|
87
|
+
}
|
|
88
|
+
else if (question.kind === 'text') {
|
|
89
|
+
if (!('text' in answer))
|
|
90
|
+
return 'a text question needs a text answer';
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
if (!('optionIds' in answer))
|
|
94
|
+
return 'a choice question needs option ids';
|
|
95
|
+
if (!question.multiple && answer.optionIds.length !== 1)
|
|
96
|
+
return 'expected a single choice';
|
|
97
|
+
const known = new Set(question.options.map((option) => option.id));
|
|
98
|
+
if (answer.optionIds.some((id) => !known.has(id)))
|
|
99
|
+
return 'unknown option id';
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return answers.size ? 'unknown question id' : undefined;
|
|
103
|
+
}
|
|
104
|
+
function unique(values) {
|
|
105
|
+
return new Set(values).size === values.length;
|
|
106
|
+
}
|
|
107
|
+
function fits(value) {
|
|
108
|
+
return Buffer.byteLength(JSON.stringify(value), 'utf8') <= PI_QUESTION_CONTENT_BYTES_MAX;
|
|
109
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adea-ai/runtime-sdk",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.23.0",
|
|
4
4
|
"description": "SDK for building Control Plane runtimes: adapters, capabilities, conformance, discovery, eligibility, health, sessions, transport, and routing.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"adapter",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"test": "bun test src"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@adea-ai/contracts": "^
|
|
46
|
+
"@adea-ai/contracts": "^3.0.0",
|
|
47
47
|
"zod": "4.6.6"
|
|
48
48
|
},
|
|
49
49
|
"engines": {
|