@sequenceholdings/agent-spec 0.1.1 → 0.1.3

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.
Files changed (72) hide show
  1. package/README.md +93 -0
  2. package/dist/agent-definition.d.ts +616 -0
  3. package/dist/agent-definition.js +240 -0
  4. package/dist/canonical-json.d.ts +2 -0
  5. package/dist/canonical-json.js +13 -0
  6. package/dist/index.d.ts +2 -117
  7. package/dist/index.js +2 -248
  8. package/dist/input-schema.d.ts +19 -0
  9. package/dist/input-schema.js +57 -0
  10. package/dist/voice-access.d.ts +40 -0
  11. package/dist/voice-access.js +34 -0
  12. package/dist/voice-actions-contracts.d.ts +423 -0
  13. package/dist/voice-actions-contracts.js +95 -0
  14. package/dist/voice-actions-transitions.d.ts +52 -0
  15. package/dist/voice-actions-transitions.js +170 -0
  16. package/dist/voice-actions.d.ts +2 -0
  17. package/dist/voice-actions.js +2 -0
  18. package/dist/voice-api.d.ts +1102 -0
  19. package/dist/voice-api.js +164 -0
  20. package/dist/voice-authoring.d.ts +463 -0
  21. package/dist/voice-authoring.js +132 -0
  22. package/dist/voice-authority-contracts.d.ts +247 -0
  23. package/dist/voice-authority-contracts.js +177 -0
  24. package/dist/voice-authority-evaluation.d.ts +29 -0
  25. package/dist/voice-authority-evaluation.js +80 -0
  26. package/dist/voice-authority-verification.d.ts +47 -0
  27. package/dist/voice-authority-verification.js +184 -0
  28. package/dist/voice-authority.d.ts +3 -0
  29. package/dist/voice-authority.js +3 -0
  30. package/dist/voice-common.d.ts +21 -0
  31. package/dist/voice-common.js +23 -0
  32. package/dist/voice-drafts.d.ts +441 -0
  33. package/dist/voice-drafts.js +75 -0
  34. package/dist/voice-grant.d.ts +19 -0
  35. package/dist/voice-grant.js +21 -0
  36. package/dist/voice-lifecycle-control.d.ts +130 -0
  37. package/dist/voice-lifecycle-control.js +138 -0
  38. package/dist/voice-lifecycle-session.d.ts +168 -0
  39. package/dist/voice-lifecycle-session.js +114 -0
  40. package/dist/voice-lifecycle-states.d.ts +96 -0
  41. package/dist/voice-lifecycle-states.js +139 -0
  42. package/dist/voice-lifecycle.d.ts +3 -0
  43. package/dist/voice-lifecycle.js +3 -0
  44. package/dist/voice-policy-duration.d.ts +46 -0
  45. package/dist/voice-policy-duration.js +166 -0
  46. package/dist/voice-policy-limits.d.ts +174 -0
  47. package/dist/voice-policy-limits.js +188 -0
  48. package/dist/voice-policy.d.ts +2 -0
  49. package/dist/voice-policy.js +2 -0
  50. package/dist/voice-provider-evidence.d.ts +80 -0
  51. package/dist/voice-provider-evidence.js +115 -0
  52. package/dist/voice-provider-publication.d.ts +319 -0
  53. package/dist/voice-provider-publication.js +117 -0
  54. package/dist/voice-provider-release.d.ts +386 -0
  55. package/dist/voice-provider-release.js +154 -0
  56. package/dist/voice-provider.d.ts +3 -0
  57. package/dist/voice-provider.js +3 -0
  58. package/dist/voice-release.d.ts +808 -0
  59. package/dist/voice-release.js +110 -0
  60. package/dist/voice-runs-audio.d.ts +157 -0
  61. package/dist/voice-runs-audio.js +85 -0
  62. package/dist/voice-runs-evidence.d.ts +183 -0
  63. package/dist/voice-runs-evidence.js +154 -0
  64. package/dist/voice-runs-model.d.ts +967 -0
  65. package/dist/voice-runs-model.js +199 -0
  66. package/dist/voice-runs-tooling.d.ts +88 -0
  67. package/dist/voice-runs-tooling.js +100 -0
  68. package/dist/voice-runs.d.ts +4 -0
  69. package/dist/voice-runs.js +4 -0
  70. package/dist/voice.d.ts +13 -0
  71. package/dist/voice.js +13 -0
  72. package/package.json +8 -3
@@ -0,0 +1,115 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { z } from 'zod';
3
+ import { canonicalJson } from './canonical-json.js';
4
+ import { voiceHashSchema, voiceIdSchema, voiceLocalKeySchema, voiceTimestampSchema, } from './voice-common.js';
5
+ export const MAX_VOICE_PROVIDER_DOCUMENT_BYTES = 128 * 1024;
6
+ export const MAX_VOICE_PROVIDER_DOCUMENT_DEPTH = 12;
7
+ export const MAX_VOICE_PROVIDER_DOCUMENT_NODES = 2_000;
8
+ export const voiceProviderEvidenceReferenceSchema = z.string().trim().min(1).max(500);
9
+ export const voiceSanitizedEvidenceTextSchema = z.string().trim().min(1).max(2_000);
10
+ const SECRET_KEY = /(?:^|[_-])(authorization|credential|password|secret|token|api[_-]?key|call[_-]?grant)(?:$|[_-])/i;
11
+ function inspectDocument({ value, path, depth, state, context, }) {
12
+ state.nodes += 1;
13
+ if (state.nodes > MAX_VOICE_PROVIDER_DOCUMENT_NODES) {
14
+ context.addIssue({ code: 'custom', message: 'sanitized provider document has too many nodes' });
15
+ return;
16
+ }
17
+ if (depth > MAX_VOICE_PROVIDER_DOCUMENT_DEPTH) {
18
+ context.addIssue({ code: 'custom', message: 'sanitized provider document is too deeply nested' });
19
+ return;
20
+ }
21
+ if (Array.isArray(value)) {
22
+ value.forEach((entry, index) => inspectDocument({
23
+ value: entry,
24
+ path: `${path}[${index}]`,
25
+ depth: depth + 1,
26
+ state,
27
+ context,
28
+ }));
29
+ return;
30
+ }
31
+ if (value === null || typeof value !== 'object')
32
+ return;
33
+ for (const [key, entry] of Object.entries(value)) {
34
+ if (SECRET_KEY.test(key)) {
35
+ context.addIssue({
36
+ code: 'custom',
37
+ message: `${path}.${key} is a secret-bearing key and cannot be retained`,
38
+ });
39
+ }
40
+ inspectDocument({ value: entry, path: `${path}.${key}`, depth: depth + 1, state, context });
41
+ }
42
+ }
43
+ export const voiceSanitizedProviderDocumentSchema = z.json().superRefine((value, context) => {
44
+ if (Buffer.byteLength(JSON.stringify(value), 'utf8') > MAX_VOICE_PROVIDER_DOCUMENT_BYTES) {
45
+ context.addIssue({ code: 'custom', message: 'sanitized provider document is too large' });
46
+ return;
47
+ }
48
+ inspectDocument({ value, path: '(root)', depth: 0, state: { nodes: 0 }, context });
49
+ });
50
+ export function hashVoiceProviderEvidenceValue({ value }) {
51
+ return createHash('sha256').update(canonicalJson(value)).digest('hex');
52
+ }
53
+ export const voiceProviderBranchVersionSchema = z.strictObject({
54
+ identifierContract: z.enum([
55
+ 'LIVE_PROOF_PENDING', 'NOT_USED', 'BRANCH_ONLY', 'VERSION_ONLY', 'BRANCH_AND_VERSION',
56
+ ]),
57
+ branchId: voiceIdSchema.nullable(),
58
+ versionId: voiceIdSchema.nullable(),
59
+ verifiedAt: voiceTimestampSchema.nullable(),
60
+ evidenceRef: voiceProviderEvidenceReferenceSchema.nullable(),
61
+ }).superRefine((value, context) => {
62
+ const needsBranch = ['BRANCH_ONLY', 'BRANCH_AND_VERSION'].includes(value.identifierContract);
63
+ const needsVersion = ['VERSION_ONLY', 'BRANCH_AND_VERSION'].includes(value.identifierContract);
64
+ if (value.identifierContract === 'LIVE_PROOF_PENDING') {
65
+ if ([value.branchId, value.versionId, value.verifiedAt, value.evidenceRef]
66
+ .some((field) => field !== null)) {
67
+ context.addIssue({ code: 'custom', message: 'pending contract cannot claim verification' });
68
+ }
69
+ return;
70
+ }
71
+ if (value.verifiedAt === null || value.evidenceRef === null) {
72
+ context.addIssue({ code: 'custom', message: 'settled contract requires live proof' });
73
+ }
74
+ if (needsBranch !== (value.branchId !== null)) {
75
+ context.addIssue({ code: 'custom', path: ['branchId'], message: 'branchId contradicts contract' });
76
+ }
77
+ if (needsVersion !== (value.versionId !== null)) {
78
+ context.addIssue({ code: 'custom', path: ['versionId'], message: 'versionId contradicts contract' });
79
+ }
80
+ });
81
+ export const voiceProviderProcedureMappingSchema = z.strictObject({
82
+ localProcedureKey: voiceLocalKeySchema,
83
+ providerProcedureId: voiceIdSchema,
84
+ branchVersion: voiceProviderBranchVersionSchema,
85
+ });
86
+ export function isVoiceCanonicalList({ values }) {
87
+ return values.every((value, index) => index === 0 || (values[index - 1] ?? '') < value);
88
+ }
89
+ export const voiceCanonicalToolAliasesSchema = z.array(voiceLocalKeySchema).max(100)
90
+ .refine((values) => isVoiceCanonicalList({ values }), {
91
+ message: 'tool aliases must be unique and sorted in canonical order',
92
+ });
93
+ export const voiceCanonicalProcedureMappingsSchema = z.array(voiceProviderProcedureMappingSchema).max(100).refine((mappings) => isVoiceCanonicalList({ values: mappings.map(({ localProcedureKey }) => localProcedureKey) }) &&
94
+ new Set(mappings.map(({ providerProcedureId }) => providerProcedureId)).size === mappings.length, { message: 'procedureMappings must be sorted with unique local and provider IDs' });
95
+ export const voiceGeneratedWorkflowEvidenceSchema = z.strictObject({
96
+ schemaVersion: z.literal('1'),
97
+ capturedAt: voiceTimestampSchema,
98
+ documentHash: voiceHashSchema,
99
+ sanitizedDocument: voiceSanitizedProviderDocumentSchema,
100
+ normalized: z.strictObject({
101
+ authoritySource: z.literal('ATLAS_RELEASE_BINDINGS'),
102
+ procedures: z.array(z.strictObject({
103
+ localProcedureKey: voiceLocalKeySchema,
104
+ providerProcedureId: voiceIdSchema,
105
+ toolAliases: voiceCanonicalToolAliasesSchema,
106
+ referencedProviderProcedureIds: z.array(voiceIdSchema).max(100)
107
+ .refine((values) => isVoiceCanonicalList({ values }), {
108
+ message: 'procedure references must be unique and sorted',
109
+ }),
110
+ })).max(100).refine((procedures) => isVoiceCanonicalList({
111
+ values: procedures.map(({ localProcedureKey }) => localProcedureKey),
112
+ }), { message: 'generated procedures must be unique and sorted' }),
113
+ toolAliases: voiceCanonicalToolAliasesSchema,
114
+ }),
115
+ });
@@ -0,0 +1,319 @@
1
+ import { z } from 'zod';
2
+ export declare const voiceProviderOperationResultSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
3
+ status: z.ZodLiteral<"NOT_STARTED">;
4
+ operationId: z.ZodString;
5
+ }, z.core.$strict>, z.ZodObject<{
6
+ lastObservedAt: z.ZodISODateTime;
7
+ operationId: z.ZodString;
8
+ startedAt: z.ZodISODateTime;
9
+ status: z.ZodLiteral<"IN_PROGRESS">;
10
+ }, z.core.$strict>, z.ZodObject<{
11
+ completedAt: z.ZodISODateTime;
12
+ receiptId: z.ZodNullable<z.ZodString>;
13
+ operationId: z.ZodString;
14
+ startedAt: z.ZodISODateTime;
15
+ status: z.ZodLiteral<"SUCCEEDED">;
16
+ }, z.core.$strict>, z.ZodObject<{
17
+ failedAt: z.ZodISODateTime;
18
+ errorCode: z.ZodString;
19
+ sanitizedMessage: z.ZodString;
20
+ retryable: z.ZodBoolean;
21
+ operationId: z.ZodString;
22
+ startedAt: z.ZodISODateTime;
23
+ status: z.ZodLiteral<"FAILED">;
24
+ }, z.core.$strict>, z.ZodObject<{
25
+ observedAt: z.ZodISODateTime;
26
+ reconciliationKey: z.ZodString;
27
+ sanitizedReason: z.ZodString;
28
+ operationId: z.ZodString;
29
+ startedAt: z.ZodISODateTime;
30
+ status: z.ZodLiteral<"UNKNOWN">;
31
+ }, z.core.$strict>], "status">;
32
+ export type VoiceProviderOperationResult = z.infer<typeof voiceProviderOperationResultSchema>;
33
+ export declare const voiceProviderPublicationProgressSchema: z.ZodObject<{
34
+ phase: z.ZodEnum<{
35
+ FAILED: "FAILED";
36
+ RECONCILIATION_REQUIRED: "RECONCILIATION_REQUIRED";
37
+ CREATE_AGENT: "CREATE_AGENT";
38
+ CREATE_PROCEDURES: "CREATE_PROCEDURES";
39
+ COMPILE: "COMPILE";
40
+ VALIDATE_GENERATED_WORKFLOW: "VALIDATE_GENERATED_WORKFLOW";
41
+ FINALIZE: "FINALIZE";
42
+ READBACK: "READBACK";
43
+ COMPLETE: "COMPLETE";
44
+ }>;
45
+ compile: z.ZodDiscriminatedUnion<[z.ZodObject<{
46
+ status: z.ZodLiteral<"NOT_STARTED">;
47
+ operationId: z.ZodString;
48
+ }, z.core.$strict>, z.ZodObject<{
49
+ lastObservedAt: z.ZodISODateTime;
50
+ operationId: z.ZodString;
51
+ startedAt: z.ZodISODateTime;
52
+ status: z.ZodLiteral<"IN_PROGRESS">;
53
+ }, z.core.$strict>, z.ZodObject<{
54
+ completedAt: z.ZodISODateTime;
55
+ receiptId: z.ZodNullable<z.ZodString>;
56
+ operationId: z.ZodString;
57
+ startedAt: z.ZodISODateTime;
58
+ status: z.ZodLiteral<"SUCCEEDED">;
59
+ }, z.core.$strict>, z.ZodObject<{
60
+ failedAt: z.ZodISODateTime;
61
+ errorCode: z.ZodString;
62
+ sanitizedMessage: z.ZodString;
63
+ retryable: z.ZodBoolean;
64
+ operationId: z.ZodString;
65
+ startedAt: z.ZodISODateTime;
66
+ status: z.ZodLiteral<"FAILED">;
67
+ }, z.core.$strict>, z.ZodObject<{
68
+ observedAt: z.ZodISODateTime;
69
+ reconciliationKey: z.ZodString;
70
+ sanitizedReason: z.ZodString;
71
+ operationId: z.ZodString;
72
+ startedAt: z.ZodISODateTime;
73
+ status: z.ZodLiteral<"UNKNOWN">;
74
+ }, z.core.$strict>], "status">;
75
+ finalization: z.ZodDiscriminatedUnion<[z.ZodObject<{
76
+ status: z.ZodLiteral<"NOT_STARTED">;
77
+ operationId: z.ZodString;
78
+ }, z.core.$strict>, z.ZodObject<{
79
+ lastObservedAt: z.ZodISODateTime;
80
+ operationId: z.ZodString;
81
+ startedAt: z.ZodISODateTime;
82
+ status: z.ZodLiteral<"IN_PROGRESS">;
83
+ }, z.core.$strict>, z.ZodObject<{
84
+ completedAt: z.ZodISODateTime;
85
+ receiptId: z.ZodNullable<z.ZodString>;
86
+ operationId: z.ZodString;
87
+ startedAt: z.ZodISODateTime;
88
+ status: z.ZodLiteral<"SUCCEEDED">;
89
+ }, z.core.$strict>, z.ZodObject<{
90
+ failedAt: z.ZodISODateTime;
91
+ errorCode: z.ZodString;
92
+ sanitizedMessage: z.ZodString;
93
+ retryable: z.ZodBoolean;
94
+ operationId: z.ZodString;
95
+ startedAt: z.ZodISODateTime;
96
+ status: z.ZodLiteral<"FAILED">;
97
+ }, z.core.$strict>, z.ZodObject<{
98
+ observedAt: z.ZodISODateTime;
99
+ reconciliationKey: z.ZodString;
100
+ sanitizedReason: z.ZodString;
101
+ operationId: z.ZodString;
102
+ startedAt: z.ZodISODateTime;
103
+ status: z.ZodLiteral<"UNKNOWN">;
104
+ }, z.core.$strict>], "status">;
105
+ updatedAt: z.ZodISODateTime;
106
+ }, z.core.$strict>;
107
+ export type VoiceProviderPublicationProgress = z.infer<typeof voiceProviderPublicationProgressSchema>;
108
+ export declare const voiceProviderNormalizedConfigurationSchema: z.ZodObject<{
109
+ providerAgentId: z.ZodString;
110
+ agentBranchVersion: z.ZodObject<{
111
+ identifierContract: z.ZodEnum<{
112
+ LIVE_PROOF_PENDING: "LIVE_PROOF_PENDING";
113
+ NOT_USED: "NOT_USED";
114
+ BRANCH_ONLY: "BRANCH_ONLY";
115
+ VERSION_ONLY: "VERSION_ONLY";
116
+ BRANCH_AND_VERSION: "BRANCH_AND_VERSION";
117
+ }>;
118
+ branchId: z.ZodNullable<z.ZodString>;
119
+ versionId: z.ZodNullable<z.ZodString>;
120
+ verifiedAt: z.ZodNullable<z.ZodISODateTime>;
121
+ evidenceRef: z.ZodNullable<z.ZodString>;
122
+ }, z.core.$strict>;
123
+ privacy: z.ZodLiteral<"PRIVATE">;
124
+ procedureMappings: z.ZodArray<z.ZodObject<{
125
+ localProcedureKey: z.ZodString;
126
+ providerProcedureId: z.ZodString;
127
+ branchVersion: z.ZodObject<{
128
+ identifierContract: z.ZodEnum<{
129
+ LIVE_PROOF_PENDING: "LIVE_PROOF_PENDING";
130
+ NOT_USED: "NOT_USED";
131
+ BRANCH_ONLY: "BRANCH_ONLY";
132
+ VERSION_ONLY: "VERSION_ONLY";
133
+ BRANCH_AND_VERSION: "BRANCH_AND_VERSION";
134
+ }>;
135
+ branchId: z.ZodNullable<z.ZodString>;
136
+ versionId: z.ZodNullable<z.ZodString>;
137
+ verifiedAt: z.ZodNullable<z.ZodISODateTime>;
138
+ evidenceRef: z.ZodNullable<z.ZodString>;
139
+ }, z.core.$strict>;
140
+ }, z.core.$strict>>;
141
+ toolAliases: z.ZodArray<z.ZodString>;
142
+ generatedWorkflowHash: z.ZodString;
143
+ maxCallDurationSeconds: z.ZodNumber;
144
+ providerDurationCeilingSeconds: z.ZodNumber;
145
+ recordingEnabled: z.ZodBoolean;
146
+ retentionDays: z.ZodLiteral<-1>;
147
+ telephonyConnection: z.ZodLiteral<"ATLAS_TWILIO_REGISTER_CALL">;
148
+ directProviderConversationAccess: z.ZodLiteral<false>;
149
+ transfersEnabled: z.ZodLiteral<false>;
150
+ authoritySource: z.ZodLiteral<"ATLAS_RELEASE_BINDINGS">;
151
+ }, z.core.$strict>;
152
+ export type VoiceProviderNormalizedConfiguration = z.infer<typeof voiceProviderNormalizedConfigurationSchema>;
153
+ export declare const voiceProviderDesiredConfigurationSchema: z.ZodObject<{
154
+ configuration: z.ZodObject<{
155
+ providerAgentId: z.ZodString;
156
+ agentBranchVersion: z.ZodObject<{
157
+ identifierContract: z.ZodEnum<{
158
+ LIVE_PROOF_PENDING: "LIVE_PROOF_PENDING";
159
+ NOT_USED: "NOT_USED";
160
+ BRANCH_ONLY: "BRANCH_ONLY";
161
+ VERSION_ONLY: "VERSION_ONLY";
162
+ BRANCH_AND_VERSION: "BRANCH_AND_VERSION";
163
+ }>;
164
+ branchId: z.ZodNullable<z.ZodString>;
165
+ versionId: z.ZodNullable<z.ZodString>;
166
+ verifiedAt: z.ZodNullable<z.ZodISODateTime>;
167
+ evidenceRef: z.ZodNullable<z.ZodString>;
168
+ }, z.core.$strict>;
169
+ privacy: z.ZodLiteral<"PRIVATE">;
170
+ procedureMappings: z.ZodArray<z.ZodObject<{
171
+ localProcedureKey: z.ZodString;
172
+ providerProcedureId: z.ZodString;
173
+ branchVersion: z.ZodObject<{
174
+ identifierContract: z.ZodEnum<{
175
+ LIVE_PROOF_PENDING: "LIVE_PROOF_PENDING";
176
+ NOT_USED: "NOT_USED";
177
+ BRANCH_ONLY: "BRANCH_ONLY";
178
+ VERSION_ONLY: "VERSION_ONLY";
179
+ BRANCH_AND_VERSION: "BRANCH_AND_VERSION";
180
+ }>;
181
+ branchId: z.ZodNullable<z.ZodString>;
182
+ versionId: z.ZodNullable<z.ZodString>;
183
+ verifiedAt: z.ZodNullable<z.ZodISODateTime>;
184
+ evidenceRef: z.ZodNullable<z.ZodString>;
185
+ }, z.core.$strict>;
186
+ }, z.core.$strict>>;
187
+ toolAliases: z.ZodArray<z.ZodString>;
188
+ generatedWorkflowHash: z.ZodString;
189
+ maxCallDurationSeconds: z.ZodNumber;
190
+ providerDurationCeilingSeconds: z.ZodNumber;
191
+ recordingEnabled: z.ZodBoolean;
192
+ retentionDays: z.ZodLiteral<-1>;
193
+ telephonyConnection: z.ZodLiteral<"ATLAS_TWILIO_REGISTER_CALL">;
194
+ directProviderConversationAccess: z.ZodLiteral<false>;
195
+ transfersEnabled: z.ZodLiteral<false>;
196
+ authoritySource: z.ZodLiteral<"ATLAS_RELEASE_BINDINGS">;
197
+ }, z.core.$strict>;
198
+ configurationHash: z.ZodString;
199
+ capturedAt: z.ZodISODateTime;
200
+ }, z.core.$strict>;
201
+ export type VoiceProviderDesiredConfiguration = z.infer<typeof voiceProviderDesiredConfigurationSchema>;
202
+ export declare const voiceProviderReadbackEvidenceSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
203
+ status: z.ZodLiteral<"VERIFIED">;
204
+ configuration: z.ZodObject<{
205
+ providerAgentId: z.ZodString;
206
+ agentBranchVersion: z.ZodObject<{
207
+ identifierContract: z.ZodEnum<{
208
+ LIVE_PROOF_PENDING: "LIVE_PROOF_PENDING";
209
+ NOT_USED: "NOT_USED";
210
+ BRANCH_ONLY: "BRANCH_ONLY";
211
+ VERSION_ONLY: "VERSION_ONLY";
212
+ BRANCH_AND_VERSION: "BRANCH_AND_VERSION";
213
+ }>;
214
+ branchId: z.ZodNullable<z.ZodString>;
215
+ versionId: z.ZodNullable<z.ZodString>;
216
+ verifiedAt: z.ZodNullable<z.ZodISODateTime>;
217
+ evidenceRef: z.ZodNullable<z.ZodString>;
218
+ }, z.core.$strict>;
219
+ privacy: z.ZodLiteral<"PRIVATE">;
220
+ procedureMappings: z.ZodArray<z.ZodObject<{
221
+ localProcedureKey: z.ZodString;
222
+ providerProcedureId: z.ZodString;
223
+ branchVersion: z.ZodObject<{
224
+ identifierContract: z.ZodEnum<{
225
+ LIVE_PROOF_PENDING: "LIVE_PROOF_PENDING";
226
+ NOT_USED: "NOT_USED";
227
+ BRANCH_ONLY: "BRANCH_ONLY";
228
+ VERSION_ONLY: "VERSION_ONLY";
229
+ BRANCH_AND_VERSION: "BRANCH_AND_VERSION";
230
+ }>;
231
+ branchId: z.ZodNullable<z.ZodString>;
232
+ versionId: z.ZodNullable<z.ZodString>;
233
+ verifiedAt: z.ZodNullable<z.ZodISODateTime>;
234
+ evidenceRef: z.ZodNullable<z.ZodString>;
235
+ }, z.core.$strict>;
236
+ }, z.core.$strict>>;
237
+ toolAliases: z.ZodArray<z.ZodString>;
238
+ generatedWorkflowHash: z.ZodString;
239
+ maxCallDurationSeconds: z.ZodNumber;
240
+ providerDurationCeilingSeconds: z.ZodNumber;
241
+ recordingEnabled: z.ZodBoolean;
242
+ retentionDays: z.ZodLiteral<-1>;
243
+ telephonyConnection: z.ZodLiteral<"ATLAS_TWILIO_REGISTER_CALL">;
244
+ directProviderConversationAccess: z.ZodLiteral<false>;
245
+ transfersEnabled: z.ZodLiteral<false>;
246
+ authoritySource: z.ZodLiteral<"ATLAS_RELEASE_BINDINGS">;
247
+ }, z.core.$strict>;
248
+ configurationHash: z.ZodString;
249
+ observedAt: z.ZodISODateTime;
250
+ evidenceRef: z.ZodString;
251
+ sanitizedDetail: z.ZodNullable<z.ZodString>;
252
+ }, z.core.$strict>, z.ZodObject<{
253
+ status: z.ZodEnum<{
254
+ INCOMPLETE: "INCOMPLETE";
255
+ CONTRADICTORY: "CONTRADICTORY";
256
+ }>;
257
+ configuration: z.ZodNullable<z.ZodObject<{
258
+ providerAgentId: z.ZodString;
259
+ agentBranchVersion: z.ZodObject<{
260
+ identifierContract: z.ZodEnum<{
261
+ LIVE_PROOF_PENDING: "LIVE_PROOF_PENDING";
262
+ NOT_USED: "NOT_USED";
263
+ BRANCH_ONLY: "BRANCH_ONLY";
264
+ VERSION_ONLY: "VERSION_ONLY";
265
+ BRANCH_AND_VERSION: "BRANCH_AND_VERSION";
266
+ }>;
267
+ branchId: z.ZodNullable<z.ZodString>;
268
+ versionId: z.ZodNullable<z.ZodString>;
269
+ verifiedAt: z.ZodNullable<z.ZodISODateTime>;
270
+ evidenceRef: z.ZodNullable<z.ZodString>;
271
+ }, z.core.$strict>;
272
+ privacy: z.ZodLiteral<"PRIVATE">;
273
+ procedureMappings: z.ZodArray<z.ZodObject<{
274
+ localProcedureKey: z.ZodString;
275
+ providerProcedureId: z.ZodString;
276
+ branchVersion: z.ZodObject<{
277
+ identifierContract: z.ZodEnum<{
278
+ LIVE_PROOF_PENDING: "LIVE_PROOF_PENDING";
279
+ NOT_USED: "NOT_USED";
280
+ BRANCH_ONLY: "BRANCH_ONLY";
281
+ VERSION_ONLY: "VERSION_ONLY";
282
+ BRANCH_AND_VERSION: "BRANCH_AND_VERSION";
283
+ }>;
284
+ branchId: z.ZodNullable<z.ZodString>;
285
+ versionId: z.ZodNullable<z.ZodString>;
286
+ verifiedAt: z.ZodNullable<z.ZodISODateTime>;
287
+ evidenceRef: z.ZodNullable<z.ZodString>;
288
+ }, z.core.$strict>;
289
+ }, z.core.$strict>>;
290
+ toolAliases: z.ZodArray<z.ZodString>;
291
+ generatedWorkflowHash: z.ZodString;
292
+ maxCallDurationSeconds: z.ZodNumber;
293
+ providerDurationCeilingSeconds: z.ZodNumber;
294
+ recordingEnabled: z.ZodBoolean;
295
+ retentionDays: z.ZodLiteral<-1>;
296
+ telephonyConnection: z.ZodLiteral<"ATLAS_TWILIO_REGISTER_CALL">;
297
+ directProviderConversationAccess: z.ZodLiteral<false>;
298
+ transfersEnabled: z.ZodLiteral<false>;
299
+ authoritySource: z.ZodLiteral<"ATLAS_RELEASE_BINDINGS">;
300
+ }, z.core.$strict>>;
301
+ configurationHash: z.ZodNullable<z.ZodString>;
302
+ observedAt: z.ZodISODateTime;
303
+ evidenceRef: z.ZodNullable<z.ZodString>;
304
+ sanitizedDetail: z.ZodString;
305
+ }, z.core.$strict>], "status">;
306
+ export type VoiceProviderReadbackEvidence = z.infer<typeof voiceProviderReadbackEvidenceSchema>;
307
+ export declare const voiceProviderCapabilityGateSchema: z.ZodObject<{
308
+ status: z.ZodEnum<{
309
+ LIVE_PROOF_PENDING: "LIVE_PROOF_PENDING";
310
+ VERIFIED_SUPPORTED: "VERIFIED_SUPPORTED";
311
+ VERIFIED_UNSUPPORTED: "VERIFIED_UNSUPPORTED";
312
+ DEFERRED: "DEFERRED";
313
+ }>;
314
+ verifiedAt: z.ZodNullable<z.ZodISODateTime>;
315
+ verifiedByPrincipalId: z.ZodNullable<z.ZodString>;
316
+ evidenceRef: z.ZodNullable<z.ZodString>;
317
+ sanitizedNote: z.ZodNullable<z.ZodString>;
318
+ }, z.core.$strict>;
319
+ export type VoiceProviderCapabilityGate = z.infer<typeof voiceProviderCapabilityGateSchema>;
@@ -0,0 +1,117 @@
1
+ import { z } from 'zod';
2
+ import { voiceHashSchema, voiceIdSchema, voiceTimestampSchema } from './voice-common.js';
3
+ import { voiceCanonicalProcedureMappingsSchema, voiceCanonicalToolAliasesSchema, voiceProviderBranchVersionSchema, voiceProviderEvidenceReferenceSchema, voiceSanitizedEvidenceTextSchema, } from './voice-provider-evidence.js';
4
+ const operationIdSchema = z.string().trim().min(1).max(300);
5
+ const operationBase = { operationId: operationIdSchema, startedAt: voiceTimestampSchema };
6
+ export const voiceProviderOperationResultSchema = z.discriminatedUnion('status', [
7
+ z.strictObject({ status: z.literal('NOT_STARTED'), operationId: operationIdSchema }),
8
+ z.strictObject({
9
+ status: z.literal('IN_PROGRESS'), ...operationBase, lastObservedAt: voiceTimestampSchema,
10
+ }),
11
+ z.strictObject({
12
+ status: z.literal('SUCCEEDED'), ...operationBase, completedAt: voiceTimestampSchema,
13
+ receiptId: voiceIdSchema.nullable(),
14
+ }),
15
+ z.strictObject({
16
+ status: z.literal('FAILED'), ...operationBase, failedAt: voiceTimestampSchema,
17
+ errorCode: z.string().trim().min(1).max(100),
18
+ sanitizedMessage: voiceSanitizedEvidenceTextSchema,
19
+ retryable: z.boolean(),
20
+ }),
21
+ z.strictObject({
22
+ status: z.literal('UNKNOWN'), ...operationBase, observedAt: voiceTimestampSchema,
23
+ reconciliationKey: z.string().trim().min(1).max(500),
24
+ sanitizedReason: voiceSanitizedEvidenceTextSchema,
25
+ }),
26
+ ]);
27
+ export const voiceProviderPublicationProgressSchema = z.strictObject({
28
+ phase: z.enum([
29
+ 'CREATE_AGENT', 'CREATE_PROCEDURES', 'COMPILE', 'VALIDATE_GENERATED_WORKFLOW',
30
+ 'FINALIZE', 'READBACK', 'COMPLETE', 'FAILED', 'RECONCILIATION_REQUIRED',
31
+ ]),
32
+ compile: voiceProviderOperationResultSchema,
33
+ finalization: voiceProviderOperationResultSchema,
34
+ updatedAt: voiceTimestampSchema,
35
+ }).superRefine((value, context) => {
36
+ const unknown = value.compile.status === 'UNKNOWN' || value.finalization.status === 'UNKNOWN';
37
+ if (unknown && value.phase !== 'RECONCILIATION_REQUIRED') {
38
+ context.addIssue({ code: 'custom', message: 'unknown results require RECONCILIATION_REQUIRED' });
39
+ }
40
+ if (value.phase === 'COMPLETE' &&
41
+ (value.compile.status !== 'SUCCEEDED' || value.finalization.status !== 'SUCCEEDED')) {
42
+ context.addIssue({
43
+ code: 'custom', message: 'COMPLETE requires successful compile and finalization evidence',
44
+ });
45
+ }
46
+ });
47
+ export const voiceProviderNormalizedConfigurationSchema = z.strictObject({
48
+ providerAgentId: voiceIdSchema,
49
+ agentBranchVersion: voiceProviderBranchVersionSchema,
50
+ privacy: z.literal('PRIVATE'),
51
+ procedureMappings: voiceCanonicalProcedureMappingsSchema,
52
+ toolAliases: voiceCanonicalToolAliasesSchema,
53
+ generatedWorkflowHash: voiceHashSchema,
54
+ maxCallDurationSeconds: z.number().int().positive().safe(),
55
+ providerDurationCeilingSeconds: z.number().int().positive().safe(),
56
+ recordingEnabled: z.boolean(),
57
+ retentionDays: z.literal(-1),
58
+ telephonyConnection: z.literal('ATLAS_TWILIO_REGISTER_CALL'),
59
+ directProviderConversationAccess: z.literal(false),
60
+ transfersEnabled: z.literal(false),
61
+ authoritySource: z.literal('ATLAS_RELEASE_BINDINGS'),
62
+ }).superRefine((value, context) => {
63
+ if (value.maxCallDurationSeconds > value.providerDurationCeilingSeconds) {
64
+ context.addIssue({
65
+ code: 'custom', path: ['maxCallDurationSeconds'],
66
+ message: 'call duration exceeds the verified provider release ceiling',
67
+ });
68
+ }
69
+ });
70
+ export const voiceProviderDesiredConfigurationSchema = z.strictObject({
71
+ configuration: voiceProviderNormalizedConfigurationSchema,
72
+ configurationHash: voiceHashSchema,
73
+ capturedAt: voiceTimestampSchema,
74
+ });
75
+ const verifiedReadbackSchema = z.strictObject({
76
+ status: z.literal('VERIFIED'),
77
+ configuration: voiceProviderNormalizedConfigurationSchema,
78
+ configurationHash: voiceHashSchema,
79
+ observedAt: voiceTimestampSchema,
80
+ evidenceRef: voiceProviderEvidenceReferenceSchema,
81
+ sanitizedDetail: voiceSanitizedEvidenceTextSchema.nullable(),
82
+ });
83
+ const unresolvedReadbackSchema = z.strictObject({
84
+ status: z.enum(['INCOMPLETE', 'CONTRADICTORY']),
85
+ configuration: voiceProviderNormalizedConfigurationSchema.nullable(),
86
+ configurationHash: voiceHashSchema.nullable(),
87
+ observedAt: voiceTimestampSchema,
88
+ evidenceRef: voiceProviderEvidenceReferenceSchema.nullable(),
89
+ sanitizedDetail: voiceSanitizedEvidenceTextSchema,
90
+ });
91
+ export const voiceProviderReadbackEvidenceSchema = z.discriminatedUnion('status', [
92
+ verifiedReadbackSchema, unresolvedReadbackSchema,
93
+ ]);
94
+ export const voiceProviderCapabilityGateSchema = z.strictObject({
95
+ status: z.enum([
96
+ 'LIVE_PROOF_PENDING', 'VERIFIED_SUPPORTED', 'VERIFIED_UNSUPPORTED', 'DEFERRED',
97
+ ]),
98
+ verifiedAt: voiceTimestampSchema.nullable(),
99
+ verifiedByPrincipalId: voiceIdSchema.nullable(),
100
+ evidenceRef: voiceProviderEvidenceReferenceSchema.nullable(),
101
+ sanitizedNote: voiceSanitizedEvidenceTextSchema.nullable(),
102
+ }).superRefine((value, context) => {
103
+ const proof = [value.verifiedAt, value.verifiedByPrincipalId, value.evidenceRef];
104
+ if (value.status === 'LIVE_PROOF_PENDING') {
105
+ if (proof.some((field) => field !== null)) {
106
+ context.addIssue({ code: 'custom', message: 'pending gate cannot claim verification' });
107
+ }
108
+ return;
109
+ }
110
+ if (proof.some((field) => field === null)) {
111
+ context.addIssue({ code: 'custom', message: 'settled capability gate requires attribution' });
112
+ }
113
+ if (['VERIFIED_UNSUPPORTED', 'DEFERRED'].includes(value.status) &&
114
+ value.sanitizedNote === null) {
115
+ context.addIssue({ code: 'custom', message: 'unsupported/deferred gate requires a note' });
116
+ }
117
+ });