@agent-vm/control-protocol-contracts 0.0.109 → 0.0.111
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 +4 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -11,6 +11,10 @@ declare const CONTROL_SESSION_TIMING_MS: {
|
|
|
11
11
|
readonly controlSessionDeathGrace: 600000;
|
|
12
12
|
readonly engineIoPingInterval: 10000;
|
|
13
13
|
readonly engineIoPingTimeout: 10000;
|
|
14
|
+
readonly manualReconnectInitialDelay: 250;
|
|
15
|
+
readonly manualReconnectJitterRatio: 0.2;
|
|
16
|
+
readonly manualReconnectMaxDelay: 5000;
|
|
17
|
+
readonly priorityAckFailureThreshold: 3;
|
|
14
18
|
readonly resyncTimeout: 5000;
|
|
15
19
|
};
|
|
16
20
|
declare const CONTROL_QUEUE_LIMITS: {
|
|
@@ -29,9 +33,7 @@ declare const ControlMessageKindSchema: z.ZodEnum<{
|
|
|
29
33
|
command: "command";
|
|
30
34
|
command_result: "command_result";
|
|
31
35
|
event: "event";
|
|
32
|
-
snapshot: "snapshot";
|
|
33
36
|
heartbeat: "heartbeat";
|
|
34
|
-
observation: "observation";
|
|
35
37
|
}>;
|
|
36
38
|
declare const ControlDeliveryPolicySchema: z.ZodEnum<{
|
|
37
39
|
latest_wins: "latest_wins";
|
|
@@ -85,9 +87,7 @@ declare const ControlEnvelopeSchema: z.ZodObject<{
|
|
|
85
87
|
command: "command";
|
|
86
88
|
command_result: "command_result";
|
|
87
89
|
event: "event";
|
|
88
|
-
snapshot: "snapshot";
|
|
89
90
|
heartbeat: "heartbeat";
|
|
90
|
-
observation: "observation";
|
|
91
91
|
}>;
|
|
92
92
|
messageId: z.ZodString;
|
|
93
93
|
operation: z.ZodOptional<z.ZodString>;
|
|
@@ -311,8 +311,6 @@ declare const controlMessageKindDisposition: {
|
|
|
311
311
|
readonly command_result: "rpc_lifecycle";
|
|
312
312
|
readonly event: "domain_event";
|
|
313
313
|
readonly heartbeat: "priority_liveness";
|
|
314
|
-
readonly observation: "append_only_observation";
|
|
315
|
-
readonly snapshot: "latest_wins_state";
|
|
316
314
|
};
|
|
317
315
|
type ControlDomain = z.infer<typeof ControlDomainSchema>;
|
|
318
316
|
type KnownControlDomain = z.infer<typeof KnownControlDomainSchema>;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"mappings":";;;cAEa,wBAAA;AAAA,cAEA,yBAAA;EAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -10,6 +10,10 @@ const CONTROL_SESSION_TIMING_MS = {
|
|
|
10
10
|
controlSessionDeathGrace: 6e5,
|
|
11
11
|
engineIoPingInterval: 1e4,
|
|
12
12
|
engineIoPingTimeout: 1e4,
|
|
13
|
+
manualReconnectInitialDelay: 250,
|
|
14
|
+
manualReconnectJitterRatio: .2,
|
|
15
|
+
manualReconnectMaxDelay: 5e3,
|
|
16
|
+
priorityAckFailureThreshold: 3,
|
|
13
17
|
resyncTimeout: 5e3
|
|
14
18
|
};
|
|
15
19
|
const CONTROL_QUEUE_LIMITS = {
|
|
@@ -25,9 +29,7 @@ const ControlMessageKindSchema = z.enum([
|
|
|
25
29
|
"command",
|
|
26
30
|
"command_result",
|
|
27
31
|
"event",
|
|
28
|
-
"
|
|
29
|
-
"heartbeat",
|
|
30
|
-
"observation"
|
|
32
|
+
"heartbeat"
|
|
31
33
|
]);
|
|
32
34
|
const ControlDeliveryPolicySchema = z.enum([
|
|
33
35
|
"latest_wins",
|
|
@@ -210,9 +212,7 @@ const controlMessageKindDisposition = {
|
|
|
210
212
|
command: "rpc_lifecycle",
|
|
211
213
|
command_result: "rpc_lifecycle",
|
|
212
214
|
event: "domain_event",
|
|
213
|
-
heartbeat: "priority_liveness"
|
|
214
|
-
observation: "append_only_observation",
|
|
215
|
-
snapshot: "latest_wins_state"
|
|
215
|
+
heartbeat: "priority_liveness"
|
|
216
216
|
};
|
|
217
217
|
function assertControlEnvelopeMatchesDomainMessage(envelope, domainMessage) {
|
|
218
218
|
if (envelope.kind !== domainMessage.kind) throw new Error(`control message kind mismatch: ${envelope.kind} !== ${domainMessage.kind}`);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { ZodError, z } from 'zod/v4';\n\nexport const CONTROL_PROTOCOL_VERSION = 1;\n\nexport const CONTROL_SESSION_TIMING_MS = {\n\tactiveUseHeartbeatCadence: 30_000,\n\tactiveUseStaleTtl: 120_000,\n\tclockSkewTolerance: 30_000,\n\tcommandAckTimeout: 2_000,\n\tconnectTimeout: 3_000,\n\tcontrolSessionDeathGrace: 600_000,\n\tengineIoPingInterval: 10_000,\n\tengineIoPingTimeout: 10_000,\n\tresyncTimeout: 5_000,\n} as const;\n\nexport const CONTROL_QUEUE_LIMITS = {\n\tdedupeWindowMessages: 512,\n\tdedupeWindowTtlMs: 60_000,\n\tmaxHttpBufferBytes: 65_536,\n\tqueueByteCap: 4 * 1024 * 1024,\n\tqueueMessageCap: 256,\n} as const;\n\nexport const ControlDomainSchema = z.string().regex(/^[a-z][a-z0-9_]*$/u);\n\nexport const KnownControlDomainSchema = z.enum(['gateway_control', 'worker_control']);\n\nexport const ControlMessageKindSchema = z.enum([\n\t'command',\n\t'command_result',\n\t'event',\n\t'snapshot',\n\t'heartbeat',\n\t'observation',\n]);\n\nexport const ControlDeliveryPolicySchema = z.enum([\n\t'latest_wins',\n\t'droppable',\n\t'acked_idempotent',\n\t'critical_idempotent',\n\t'append_only_observation',\n\t'single_use_critical',\n\t'forbidden_bulk',\n]);\n\nexport const ControlSessionCloseReasonSchema = z.enum([\n\t'normal_shutdown',\n\t'controller_restart',\n\t'peer_restart',\n\t'auth_failed',\n\t'protocol_version_mismatch',\n\t'domain_mismatch',\n\t'generation_mismatch',\n\t'controller_epoch_mismatch',\n\t'duplicate_session',\n\t'stale_session',\n\t'sequence_gap',\n\t'ack_timeout',\n\t'command_timeout',\n\t'resync_timeout',\n\t'queue_overflow',\n\t'message_too_large',\n\t'schema_validation_failed',\n\t'forbidden_bulk_message',\n\t'transport_error',\n]);\n\nexport const ControlEnvelopeSchema = z\n\t.object({\n\t\tbootId: z.string().min(1),\n\t\tcommandId: z.string().uuid().optional(),\n\t\tconnectionId: z.string().uuid(),\n\t\tcontrollerEpoch: z.string().min(1),\n\t\tcreatedAtMs: z.number().int().positive(),\n\t\tdeliveryPolicy: ControlDeliveryPolicySchema,\n\t\tdomain: ControlDomainSchema,\n\t\texpiresAtMs: z.number().int().positive().optional(),\n\t\tidempotencyKey: z.string().min(1).optional(),\n\t\tkind: ControlMessageKindSchema,\n\t\tmessageId: z.string().uuid(),\n\t\toperation: z.string().min(1).optional(),\n\t\tpeerId: z.string().min(1),\n\t\tprotocolVersion: z.literal(CONTROL_PROTOCOL_VERSION),\n\t\tsequence: z.number().int().nonnegative(),\n\t\tsessionId: z.string().uuid(),\n\t\tzoneId: z.string().min(1),\n\t})\n\t.strict();\n\nexport const ControlSessionStateSchema = z.enum([\n\t'unknown',\n\t'connecting',\n\t'ready',\n\t'reconnecting',\n\t'stale',\n\t'rejected',\n\t'generation_mismatch',\n\t'failed',\n\t'closed',\n]);\n\nexport const ControlRpcResultBaseSchema = z.enum([\n\t'ok',\n\t'failed',\n\t'timeout',\n\t'rejected',\n\t'cancelled',\n\t'stale_generation',\n]);\n\nexport const ControlRpcErrorSchema = z\n\t.object({\n\t\terrorClass: z.string().min(1),\n\t\tretryable: z.boolean().optional(),\n\t\tsafeMessage: z.string().min(1).optional(),\n\t})\n\t.strict();\n\nexport const ControlCorrelationSchema = z\n\t.object({\n\t\tcausationId: z.string().uuid().optional(),\n\t\tcorrelationId: z.string().min(1).optional(),\n\t\trequestId: z.string().min(1).optional(),\n\t\trunId: z.string().min(1).optional(),\n\t\tsessionKeyDigest: z.string().min(32).optional(),\n\t\ttoolCallId: z.string().min(1).optional(),\n\t\ttraceId: z\n\t\t\t.string()\n\t\t\t.regex(/^[0-9a-f]{32}$/u)\n\t\t\t.optional(),\n\t})\n\t.strict();\n\nexport const ControlHelloSchema = z\n\t.object({\n\t\tbootId: z.string().min(1),\n\t\tcontrollerEpoch: z.string().min(1).optional(),\n\t\tdomain: ControlDomainSchema,\n\t\tlastSeenControllerSequence: z.number().int().nonnegative().optional(),\n\t\tlastSeenPeerSequence: z.number().int().nonnegative().optional(),\n\t\tpeerId: z.string().min(1),\n\t\tpreviousSessionId: z.string().uuid().optional(),\n\t\tprotocolVersion: z.literal(CONTROL_PROTOCOL_VERSION),\n\t})\n\t.strict();\n\nexport const ControlHelloResponseSchema = z\n\t.object({\n\t\tconnectionId: z.string().uuid(),\n\t\tcontrollerEpoch: z.string().min(1),\n\t\tfences: z.record(z.string(), z.string()).optional(),\n\t\toutcome: z.enum(['accepted', 'rejected', 'resync_required', 'generation_mismatch']),\n\t\tsessionId: z.string().uuid(),\n\t})\n\t.strict();\n\nexport const ControlCloseSchema = z\n\t.object({\n\t\treason: ControlSessionCloseReasonSchema,\n\t\tsafeMessage: z.string().min(1).optional(),\n\t\tsessionId: z.string().uuid(),\n\t})\n\t.strict();\n\nexport const ControlMessageAcceptedReceiptSchema = z\n\t.object({\n\t\treceived: z.literal(true),\n\t})\n\t.strict();\n\nexport const ControlMessageRejectedReceiptSchema = z\n\t.object({\n\t\terrorClass: z.string().min(1),\n\t\treceived: z.literal(false),\n\t\tsafeMessage: z.string().min(1).optional(),\n\t})\n\t.strict();\n\nexport const ControlMessageReceiptSchema = z.discriminatedUnion('received', [\n\tControlMessageAcceptedReceiptSchema,\n\tControlMessageRejectedReceiptSchema,\n]);\n\nexport const DomainCommandResultResponseLinkSchema = z\n\t.object({\n\t\tkind: z.literal('command_result'),\n\t\tpayload: z\n\t\t\t.object({\n\t\t\t\tresponseToMessageId: z.string().uuid(),\n\t\t\t})\n\t\t\t.passthrough(),\n\t})\n\t.passthrough();\n\nexport const ControlHandshakeCredentialSchema = z\n\t.object({\n\t\taudience: KnownControlDomainSchema,\n\t\tbootId: z.string().min(1),\n\t\tcontrollerEpoch: z.string().min(1),\n\t\tcredentialId: z.string().min(1),\n\t\texpiresAtMs: z.number().int().positive(),\n\t\tgenerationId: z.string().min(1),\n\t\tissuedAtMs: z.number().int().positive(),\n\t\tnonce: z.string().min(16),\n\t\tpeerId: z.string().min(1),\n\t\tprotocolVersion: z.literal(CONTROL_PROTOCOL_VERSION),\n\t\tzoneId: z.string().min(1),\n\t})\n\t.strict()\n\t.refine((value) => value.expiresAtMs > value.issuedAtMs, {\n\t\tmessage: 'expiresAtMs must be greater than issuedAtMs',\n\t\tpath: ['expiresAtMs'],\n\t});\n\nexport const ControlHandshakeProofSchema = ControlHandshakeCredentialSchema.extend({\n\tsignature: z.string().min(1),\n}).strict();\n\nexport const ControlReadyRequestCredentialSchema = z\n\t.object({\n\t\taudience: KnownControlDomainSchema,\n\t\tbootId: z.string().min(1),\n\t\tcontrollerEpoch: z.string().min(1),\n\t\tgenerationId: z.string().min(1),\n\t\tissuedAtMs: z.number().int().positive(),\n\t\tpeerId: z.string().min(1),\n\t\tprotocolVersion: z.literal(CONTROL_PROTOCOL_VERSION),\n\t\trequestId: z.string().uuid(),\n\t\tzoneId: z.string().min(1),\n\t})\n\t.strict();\n\nexport const ControlReadyRequestProofSchema = ControlReadyRequestCredentialSchema.extend({\n\tsignature: z.string().min(1),\n}).strict();\n\nexport const ControlHandshakeHeadersSchema = z\n\t.object({\n\t\tproof: ControlHandshakeProofSchema,\n\t})\n\t.strict();\n\nexport const CONTROL_HANDSHAKE_PROTOCOL_HEADER_VALUE = 'agent-vm.control.v1';\n\nexport const CONTROL_HANDSHAKE_HEADER_NAMES = {\n\tbootId: 'x-agent-vm-control-boot-id',\n\tcontrollerEpoch: 'x-agent-vm-control-controller-epoch',\n\tcredentialId: 'x-agent-vm-control-credential-id',\n\tdomain: 'x-agent-vm-control-domain',\n\texpiresAtMs: 'x-agent-vm-control-expires-at-ms',\n\tgenerationId: 'x-agent-vm-control-generation-id',\n\tissuedAtMs: 'x-agent-vm-control-issued-at-ms',\n\tnonce: 'x-agent-vm-control-nonce',\n\tpeerId: 'x-agent-vm-control-peer-id',\n\tprotocol: 'x-agent-vm-control-protocol',\n\tsignature: 'x-agent-vm-control-signature',\n\tzoneId: 'x-agent-vm-control-zone-id',\n} as const;\n\nexport const CONTROL_READY_HEADER_NAMES = {\n\tbootId: CONTROL_HANDSHAKE_HEADER_NAMES.bootId,\n\tcontrollerEpoch: CONTROL_HANDSHAKE_HEADER_NAMES.controllerEpoch,\n\tdomain: CONTROL_HANDSHAKE_HEADER_NAMES.domain,\n\tgenerationId: CONTROL_HANDSHAKE_HEADER_NAMES.generationId,\n\tissuedAtMs: CONTROL_HANDSHAKE_HEADER_NAMES.issuedAtMs,\n\tpeerId: CONTROL_HANDSHAKE_HEADER_NAMES.peerId,\n\tprotocol: CONTROL_HANDSHAKE_HEADER_NAMES.protocol,\n\trequestId: 'x-agent-vm-control-ready-request-id',\n\tsignature: CONTROL_HANDSHAKE_HEADER_NAMES.signature,\n\tzoneId: CONTROL_HANDSHAKE_HEADER_NAMES.zoneId,\n} as const;\n\nexport const controlMessageKindDisposition = {\n\tcommand: 'rpc_lifecycle',\n\tcommand_result: 'rpc_lifecycle',\n\tevent: 'domain_event',\n\theartbeat: 'priority_liveness',\n\tobservation: 'append_only_observation',\n\tsnapshot: 'latest_wins_state',\n} as const satisfies Record<ControlMessageKind, string>;\n\nexport type ControlDomain = z.infer<typeof ControlDomainSchema>;\nexport type KnownControlDomain = z.infer<typeof KnownControlDomainSchema>;\nexport type ControlMessageKind = z.infer<typeof ControlMessageKindSchema>;\nexport type ControlDeliveryPolicy = z.infer<typeof ControlDeliveryPolicySchema>;\nexport type ControlEnvelope = z.infer<typeof ControlEnvelopeSchema>;\nexport type ControlHello = z.infer<typeof ControlHelloSchema>;\nexport type ControlHelloResponse = z.infer<typeof ControlHelloResponseSchema>;\nexport type ControlMessageReceipt = z.infer<typeof ControlMessageReceiptSchema>;\nexport type ControlClose = z.infer<typeof ControlCloseSchema>;\nexport type ControlSessionCloseReason = z.infer<typeof ControlSessionCloseReasonSchema>;\nexport type ControlHandshakeCredential = z.infer<typeof ControlHandshakeCredentialSchema>;\nexport type ControlHandshakeProof = z.infer<typeof ControlHandshakeProofSchema>;\nexport type ControlReadyRequestCredential = z.infer<typeof ControlReadyRequestCredentialSchema>;\nexport type ControlReadyRequestProof = z.infer<typeof ControlReadyRequestProofSchema>;\n\nexport type ControlHelloAcknowledge = (response: ControlHelloResponse) => void;\nexport type ControlMessageAcknowledge = (receipt: ControlMessageReceipt) => void;\nexport type ControlCloseAcknowledge = (receipt: ControlMessageReceipt) => void;\n\nexport interface ControlSessionControllerToPeerEvents<TDomainMessage> {\n\t'control:close': (payload: ControlClose, acknowledge: ControlCloseAcknowledge) => void;\n\t'control:hello': (payload: ControlHello, acknowledge: ControlHelloAcknowledge) => void;\n\t'control:message': (\n\t\tenvelope: ControlEnvelope,\n\t\tpayload: TDomainMessage,\n\t\tacknowledge: ControlMessageAcknowledge,\n\t) => void;\n}\n\nexport interface ControlSessionPeerToControllerEvents<TDomainMessage> {\n\t'control:close': (payload: ControlClose, acknowledge: ControlCloseAcknowledge) => void;\n\t'control:message': (\n\t\tenvelope: ControlEnvelope,\n\t\tpayload: TDomainMessage,\n\t\tacknowledge: ControlMessageAcknowledge,\n\t) => void;\n}\n\nexport interface DomainControlMessageIdentity {\n\treadonly kind: ControlMessageKind;\n\treadonly operation?: string;\n}\n\nexport interface DeliveryPolicyDerivationProps {\n\treadonly envelope: ControlEnvelope;\n\treadonly policyByOperation: Readonly<Record<string, ControlDeliveryPolicy>>;\n\treadonly policyByKind?: Partial<Record<ControlMessageKind, ControlDeliveryPolicy>>;\n}\n\nexport function assertControlEnvelopeMatchesDomainMessage(\n\tenvelope: ControlEnvelope,\n\tdomainMessage: DomainControlMessageIdentity,\n): void {\n\tif (envelope.kind !== domainMessage.kind) {\n\t\tthrow new Error(`control message kind mismatch: ${envelope.kind} !== ${domainMessage.kind}`);\n\t}\n\tif (envelope.operation !== domainMessage.operation) {\n\t\tthrow new Error(\n\t\t\t`control message operation mismatch: ${envelope.operation ?? '<none>'} !== ${domainMessage.operation ?? '<none>'}`,\n\t\t);\n\t}\n}\n\nexport function buildControlMessageReceipt(): ControlMessageReceipt {\n\treturn ControlMessageReceiptSchema.parse({ received: true });\n}\n\nexport function buildControlMessageRejectionReceipt(props: {\n\treadonly errorClass: string;\n\treadonly safeMessage?: string;\n}): ControlMessageReceipt {\n\treturn ControlMessageReceiptSchema.parse({\n\t\terrorClass: props.errorClass,\n\t\treceived: false,\n\t\t...(props.safeMessage === undefined ? {} : { safeMessage: props.safeMessage }),\n\t});\n}\n\nexport function buildControlMessageExceptionRejectionReceipt(props: {\n\treadonly error: unknown;\n\treadonly processingErrorClass: string;\n\treadonly safeMessage: string;\n\treadonly schemaErrorClass?: string;\n}): ControlMessageReceipt {\n\treturn buildControlMessageRejectionReceipt({\n\t\terrorClass:\n\t\t\tprops.error instanceof ZodError\n\t\t\t\t? (props.schemaErrorClass ?? 'schema_validation_failed')\n\t\t\t\t: props.processingErrorClass,\n\t\tsafeMessage: props.safeMessage,\n\t});\n}\n\nexport function assertControlMessageReceiptAccepted(receiptPayload: unknown): void {\n\tconst receipt = ControlMessageReceiptSchema.parse(receiptPayload);\n\tif (!receipt.received) {\n\t\tthrow new Error(receipt.safeMessage ?? receipt.errorClass);\n\t}\n}\n\nexport function extractDomainCommandResultResponseToMessageId(\n\tpayload: unknown,\n): string | undefined {\n\tconst parsed = DomainCommandResultResponseLinkSchema.safeParse(payload);\n\treturn parsed.success ? parsed.data.payload.responseToMessageId : undefined;\n}\n\nexport function buildControlHandshakeSignaturePayload(proof: ControlHandshakeCredential): string {\n\treturn JSON.stringify({\n\t\taudience: proof.audience,\n\t\tbootId: proof.bootId,\n\t\tcontrollerEpoch: proof.controllerEpoch,\n\t\tcredentialId: proof.credentialId,\n\t\texpiresAtMs: proof.expiresAtMs,\n\t\tgenerationId: proof.generationId,\n\t\tissuedAtMs: proof.issuedAtMs,\n\t\tnonce: proof.nonce,\n\t\tpeerId: proof.peerId,\n\t\tprotocolVersion: proof.protocolVersion,\n\t\tzoneId: proof.zoneId,\n\t});\n}\n\nexport function buildControlReadyRequestSignaturePayload(\n\tproof: ControlReadyRequestCredential,\n): string {\n\treturn JSON.stringify({\n\t\taudience: proof.audience,\n\t\tbootId: proof.bootId,\n\t\tcontrollerEpoch: proof.controllerEpoch,\n\t\tgenerationId: proof.generationId,\n\t\tissuedAtMs: proof.issuedAtMs,\n\t\tpeerId: proof.peerId,\n\t\tprotocolVersion: proof.protocolVersion,\n\t\trequestId: proof.requestId,\n\t\tzoneId: proof.zoneId,\n\t});\n}\n\nexport function deriveControlDeliveryPolicy(\n\tprops: DeliveryPolicyDerivationProps,\n): ControlDeliveryPolicy {\n\tif (props.envelope.operation !== undefined) {\n\t\tconst operationPolicy = props.policyByOperation[props.envelope.operation];\n\t\tif (operationPolicy !== undefined) {\n\t\t\treturn operationPolicy;\n\t\t}\n\t}\n\tconst kindPolicy = props.policyByKind?.[props.envelope.kind];\n\tif (kindPolicy !== undefined) {\n\t\treturn kindPolicy;\n\t}\n\tthrow new Error(\n\t\t`no derived delivery policy for ${props.envelope.kind}:${props.envelope.operation ?? '<none>'}`,\n\t);\n}\n\nexport function assertDerivedControlDeliveryPolicy(props: DeliveryPolicyDerivationProps): void {\n\tconst derivedPolicy = deriveControlDeliveryPolicy(props);\n\tif (props.envelope.deliveryPolicy !== derivedPolicy) {\n\t\tthrow new Error(\n\t\t\t`control delivery policy mismatch: ${props.envelope.deliveryPolicy} !== ${derivedPolicy}`,\n\t\t);\n\t}\n}\n\nexport function coalesceLatestWinsByKey<TMessage>(\n\tmessages: readonly TMessage[],\n\tkeyForMessage: (message: TMessage) => string,\n): readonly TMessage[] {\n\tconst latestByKey = new Map<string, TMessage>();\n\tfor (const message of messages) {\n\t\tlatestByKey.set(keyForMessage(message), message);\n\t}\n\treturn [...latestByKey.values()];\n}\n\nexport function shouldReplayControlEnvelope(envelope: ControlEnvelope): boolean {\n\treturn (\n\t\tenvelope.deliveryPolicy !== 'droppable' &&\n\t\tenvelope.deliveryPolicy !== 'latest_wins' &&\n\t\tenvelope.deliveryPolicy !== 'forbidden_bulk'\n\t);\n}\n\nexport interface ControlSequenceContinuityProps {\n\treadonly envelope: ControlEnvelope;\n\treadonly lastSeenSequence: number;\n}\n\nexport interface ControlEnvelopeSequencedMessage {\n\treadonly envelope: Pick<ControlEnvelope, 'sequence'>;\n}\n\nexport function orderControlMessagesByEnvelopeSequence<\n\tTControlMessage extends ControlEnvelopeSequencedMessage,\n>(messages: readonly TControlMessage[]): readonly TControlMessage[] {\n\treturn messages.toSorted((left, right) => left.envelope.sequence - right.envelope.sequence);\n}\n\nfunction controlSequenceDiagnosticSuffix(envelope: ControlEnvelope): string {\n\treturn ` kind=${envelope.kind} operation=${envelope.operation ?? '<none>'} delivery=${envelope.deliveryPolicy} sessionId=${envelope.sessionId}`;\n}\n\nexport type ControlSequenceContinuityDecision =\n\t| {\n\t\t\treadonly action: 'accept';\n\t\t\treadonly nextLastSeenSequence: number;\n\t }\n\t| {\n\t\t\treadonly action: 'drop';\n\t\t\treadonly nextLastSeenSequence: number;\n\t\t\treadonly safeMessage: string;\n\t }\n\t| {\n\t\t\treadonly action: 'stale';\n\t\t\treadonly closeReason: Extract<ControlSessionCloseReason, 'sequence_gap'>;\n\t\t\treadonly nextLastSeenSequence: number;\n\t\t\treadonly safeMessage: string;\n\t };\n\nexport function evaluateControlSequenceContinuity(\n\tprops: ControlSequenceContinuityProps,\n): ControlSequenceContinuityDecision {\n\tif (props.envelope.sequence <= props.lastSeenSequence) {\n\t\treturn {\n\t\t\taction: 'drop',\n\t\t\tnextLastSeenSequence: props.lastSeenSequence,\n\t\t\tsafeMessage: `control sequence did not advance: last=${String(props.lastSeenSequence)} received=${String(props.envelope.sequence)}${controlSequenceDiagnosticSuffix(props.envelope)}`,\n\t\t};\n\t}\n\tif (\n\t\tprops.envelope.deliveryPolicy === 'droppable' ||\n\t\tprops.envelope.deliveryPolicy === 'latest_wins'\n\t) {\n\t\treturn {\n\t\t\taction: 'accept',\n\t\t\tnextLastSeenSequence: props.lastSeenSequence,\n\t\t};\n\t}\n\tconst expectedSequence = props.lastSeenSequence + 1;\n\tif (props.envelope.sequence === expectedSequence) {\n\t\treturn {\n\t\t\taction: 'accept',\n\t\t\tnextLastSeenSequence: props.envelope.sequence,\n\t\t};\n\t}\n\treturn {\n\t\taction: 'stale',\n\t\tcloseReason: 'sequence_gap',\n\t\tnextLastSeenSequence: props.lastSeenSequence,\n\t\tsafeMessage: `control sequence gap: expected=${String(expectedSequence)} received=${String(props.envelope.sequence)}${controlSequenceDiagnosticSuffix(props.envelope)}`,\n\t};\n}\n\nexport function buildControlProtocolJsonSchemas(): Readonly<Record<string, unknown>> {\n\treturn {\n\t\tclose: z.toJSONSchema(ControlCloseSchema, { io: 'input' }),\n\t\tenvelope: z.toJSONSchema(ControlEnvelopeSchema, { io: 'input' }),\n\t\thandshakeCredential: z.toJSONSchema(ControlHandshakeCredentialSchema, { io: 'input' }),\n\t\thandshakeProof: z.toJSONSchema(ControlHandshakeProofSchema, { io: 'input' }),\n\t\thello: z.toJSONSchema(ControlHelloSchema, { io: 'input' }),\n\t\thelloResponse: z.toJSONSchema(ControlHelloResponseSchema, { io: 'input' }),\n\t\treadyRequestCredential: z.toJSONSchema(ControlReadyRequestCredentialSchema, {\n\t\t\tio: 'input',\n\t\t}),\n\t\treadyRequestProof: z.toJSONSchema(ControlReadyRequestProofSchema, { io: 'input' }),\n\t};\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { ZodError, z } from 'zod/v4';\n\nexport const CONTROL_PROTOCOL_VERSION = 1;\n\nexport const CONTROL_SESSION_TIMING_MS = {\n\tactiveUseHeartbeatCadence: 30_000,\n\tactiveUseStaleTtl: 120_000,\n\tclockSkewTolerance: 30_000,\n\tcommandAckTimeout: 2_000,\n\tconnectTimeout: 3_000,\n\tcontrolSessionDeathGrace: 600_000,\n\tengineIoPingInterval: 10_000,\n\tengineIoPingTimeout: 10_000,\n\tmanualReconnectInitialDelay: 250,\n\tmanualReconnectJitterRatio: 0.2,\n\tmanualReconnectMaxDelay: 5_000,\n\tpriorityAckFailureThreshold: 3,\n\tresyncTimeout: 5_000,\n} as const;\n\nexport const CONTROL_QUEUE_LIMITS = {\n\tdedupeWindowMessages: 512,\n\tdedupeWindowTtlMs: 60_000,\n\tmaxHttpBufferBytes: 65_536,\n\tqueueByteCap: 4 * 1024 * 1024,\n\tqueueMessageCap: 256,\n} as const;\n\nexport const ControlDomainSchema = z.string().regex(/^[a-z][a-z0-9_]*$/u);\n\nexport const KnownControlDomainSchema = z.enum(['gateway_control', 'worker_control']);\n\nexport const ControlMessageKindSchema = z.enum(['command', 'command_result', 'event', 'heartbeat']);\n\nexport const ControlDeliveryPolicySchema = z.enum([\n\t'latest_wins',\n\t'droppable',\n\t'acked_idempotent',\n\t'critical_idempotent',\n\t'append_only_observation',\n\t'single_use_critical',\n\t'forbidden_bulk',\n]);\n\nexport const ControlSessionCloseReasonSchema = z.enum([\n\t'normal_shutdown',\n\t'controller_restart',\n\t'peer_restart',\n\t'auth_failed',\n\t'protocol_version_mismatch',\n\t'domain_mismatch',\n\t'generation_mismatch',\n\t'controller_epoch_mismatch',\n\t'duplicate_session',\n\t'stale_session',\n\t'sequence_gap',\n\t'ack_timeout',\n\t'command_timeout',\n\t'resync_timeout',\n\t'queue_overflow',\n\t'message_too_large',\n\t'schema_validation_failed',\n\t'forbidden_bulk_message',\n\t'transport_error',\n]);\n\nexport const ControlEnvelopeSchema = z\n\t.object({\n\t\tbootId: z.string().min(1),\n\t\tcommandId: z.string().uuid().optional(),\n\t\tconnectionId: z.string().uuid(),\n\t\tcontrollerEpoch: z.string().min(1),\n\t\tcreatedAtMs: z.number().int().positive(),\n\t\tdeliveryPolicy: ControlDeliveryPolicySchema,\n\t\tdomain: ControlDomainSchema,\n\t\texpiresAtMs: z.number().int().positive().optional(),\n\t\tidempotencyKey: z.string().min(1).optional(),\n\t\tkind: ControlMessageKindSchema,\n\t\tmessageId: z.string().uuid(),\n\t\toperation: z.string().min(1).optional(),\n\t\tpeerId: z.string().min(1),\n\t\tprotocolVersion: z.literal(CONTROL_PROTOCOL_VERSION),\n\t\tsequence: z.number().int().nonnegative(),\n\t\tsessionId: z.string().uuid(),\n\t\tzoneId: z.string().min(1),\n\t})\n\t.strict();\n\nexport const ControlSessionStateSchema = z.enum([\n\t'unknown',\n\t'connecting',\n\t'ready',\n\t'reconnecting',\n\t'stale',\n\t'rejected',\n\t'generation_mismatch',\n\t'failed',\n\t'closed',\n]);\n\nexport const ControlRpcResultBaseSchema = z.enum([\n\t'ok',\n\t'failed',\n\t'timeout',\n\t'rejected',\n\t'cancelled',\n\t'stale_generation',\n]);\n\nexport const ControlRpcErrorSchema = z\n\t.object({\n\t\terrorClass: z.string().min(1),\n\t\tretryable: z.boolean().optional(),\n\t\tsafeMessage: z.string().min(1).optional(),\n\t})\n\t.strict();\n\nexport const ControlCorrelationSchema = z\n\t.object({\n\t\tcausationId: z.string().uuid().optional(),\n\t\tcorrelationId: z.string().min(1).optional(),\n\t\trequestId: z.string().min(1).optional(),\n\t\trunId: z.string().min(1).optional(),\n\t\tsessionKeyDigest: z.string().min(32).optional(),\n\t\ttoolCallId: z.string().min(1).optional(),\n\t\ttraceId: z\n\t\t\t.string()\n\t\t\t.regex(/^[0-9a-f]{32}$/u)\n\t\t\t.optional(),\n\t})\n\t.strict();\n\nexport const ControlHelloSchema = z\n\t.object({\n\t\tbootId: z.string().min(1),\n\t\tcontrollerEpoch: z.string().min(1).optional(),\n\t\tdomain: ControlDomainSchema,\n\t\tlastSeenControllerSequence: z.number().int().nonnegative().optional(),\n\t\tlastSeenPeerSequence: z.number().int().nonnegative().optional(),\n\t\tpeerId: z.string().min(1),\n\t\tpreviousSessionId: z.string().uuid().optional(),\n\t\tprotocolVersion: z.literal(CONTROL_PROTOCOL_VERSION),\n\t})\n\t.strict();\n\nexport const ControlHelloResponseSchema = z\n\t.object({\n\t\tconnectionId: z.string().uuid(),\n\t\tcontrollerEpoch: z.string().min(1),\n\t\tfences: z.record(z.string(), z.string()).optional(),\n\t\toutcome: z.enum(['accepted', 'rejected', 'resync_required', 'generation_mismatch']),\n\t\tsessionId: z.string().uuid(),\n\t})\n\t.strict();\n\nexport const ControlCloseSchema = z\n\t.object({\n\t\treason: ControlSessionCloseReasonSchema,\n\t\tsafeMessage: z.string().min(1).optional(),\n\t\tsessionId: z.string().uuid(),\n\t})\n\t.strict();\n\nexport const ControlMessageAcceptedReceiptSchema = z\n\t.object({\n\t\treceived: z.literal(true),\n\t})\n\t.strict();\n\nexport const ControlMessageRejectedReceiptSchema = z\n\t.object({\n\t\terrorClass: z.string().min(1),\n\t\treceived: z.literal(false),\n\t\tsafeMessage: z.string().min(1).optional(),\n\t})\n\t.strict();\n\nexport const ControlMessageReceiptSchema = z.discriminatedUnion('received', [\n\tControlMessageAcceptedReceiptSchema,\n\tControlMessageRejectedReceiptSchema,\n]);\n\nexport const DomainCommandResultResponseLinkSchema = z\n\t.object({\n\t\tkind: z.literal('command_result'),\n\t\tpayload: z\n\t\t\t.object({\n\t\t\t\tresponseToMessageId: z.string().uuid(),\n\t\t\t})\n\t\t\t.passthrough(),\n\t})\n\t.passthrough();\n\nexport const ControlHandshakeCredentialSchema = z\n\t.object({\n\t\taudience: KnownControlDomainSchema,\n\t\tbootId: z.string().min(1),\n\t\tcontrollerEpoch: z.string().min(1),\n\t\tcredentialId: z.string().min(1),\n\t\texpiresAtMs: z.number().int().positive(),\n\t\tgenerationId: z.string().min(1),\n\t\tissuedAtMs: z.number().int().positive(),\n\t\tnonce: z.string().min(16),\n\t\tpeerId: z.string().min(1),\n\t\tprotocolVersion: z.literal(CONTROL_PROTOCOL_VERSION),\n\t\tzoneId: z.string().min(1),\n\t})\n\t.strict()\n\t.refine((value) => value.expiresAtMs > value.issuedAtMs, {\n\t\tmessage: 'expiresAtMs must be greater than issuedAtMs',\n\t\tpath: ['expiresAtMs'],\n\t});\n\nexport const ControlHandshakeProofSchema = ControlHandshakeCredentialSchema.extend({\n\tsignature: z.string().min(1),\n}).strict();\n\nexport const ControlReadyRequestCredentialSchema = z\n\t.object({\n\t\taudience: KnownControlDomainSchema,\n\t\tbootId: z.string().min(1),\n\t\tcontrollerEpoch: z.string().min(1),\n\t\tgenerationId: z.string().min(1),\n\t\tissuedAtMs: z.number().int().positive(),\n\t\tpeerId: z.string().min(1),\n\t\tprotocolVersion: z.literal(CONTROL_PROTOCOL_VERSION),\n\t\trequestId: z.string().uuid(),\n\t\tzoneId: z.string().min(1),\n\t})\n\t.strict();\n\nexport const ControlReadyRequestProofSchema = ControlReadyRequestCredentialSchema.extend({\n\tsignature: z.string().min(1),\n}).strict();\n\nexport const ControlHandshakeHeadersSchema = z\n\t.object({\n\t\tproof: ControlHandshakeProofSchema,\n\t})\n\t.strict();\n\nexport const CONTROL_HANDSHAKE_PROTOCOL_HEADER_VALUE = 'agent-vm.control.v1';\n\nexport const CONTROL_HANDSHAKE_HEADER_NAMES = {\n\tbootId: 'x-agent-vm-control-boot-id',\n\tcontrollerEpoch: 'x-agent-vm-control-controller-epoch',\n\tcredentialId: 'x-agent-vm-control-credential-id',\n\tdomain: 'x-agent-vm-control-domain',\n\texpiresAtMs: 'x-agent-vm-control-expires-at-ms',\n\tgenerationId: 'x-agent-vm-control-generation-id',\n\tissuedAtMs: 'x-agent-vm-control-issued-at-ms',\n\tnonce: 'x-agent-vm-control-nonce',\n\tpeerId: 'x-agent-vm-control-peer-id',\n\tprotocol: 'x-agent-vm-control-protocol',\n\tsignature: 'x-agent-vm-control-signature',\n\tzoneId: 'x-agent-vm-control-zone-id',\n} as const;\n\nexport const CONTROL_READY_HEADER_NAMES = {\n\tbootId: CONTROL_HANDSHAKE_HEADER_NAMES.bootId,\n\tcontrollerEpoch: CONTROL_HANDSHAKE_HEADER_NAMES.controllerEpoch,\n\tdomain: CONTROL_HANDSHAKE_HEADER_NAMES.domain,\n\tgenerationId: CONTROL_HANDSHAKE_HEADER_NAMES.generationId,\n\tissuedAtMs: CONTROL_HANDSHAKE_HEADER_NAMES.issuedAtMs,\n\tpeerId: CONTROL_HANDSHAKE_HEADER_NAMES.peerId,\n\tprotocol: CONTROL_HANDSHAKE_HEADER_NAMES.protocol,\n\trequestId: 'x-agent-vm-control-ready-request-id',\n\tsignature: CONTROL_HANDSHAKE_HEADER_NAMES.signature,\n\tzoneId: CONTROL_HANDSHAKE_HEADER_NAMES.zoneId,\n} as const;\n\nexport const controlMessageKindDisposition = {\n\tcommand: 'rpc_lifecycle',\n\tcommand_result: 'rpc_lifecycle',\n\tevent: 'domain_event',\n\theartbeat: 'priority_liveness',\n} as const satisfies Record<ControlMessageKind, string>;\n\nexport type ControlDomain = z.infer<typeof ControlDomainSchema>;\nexport type KnownControlDomain = z.infer<typeof KnownControlDomainSchema>;\nexport type ControlMessageKind = z.infer<typeof ControlMessageKindSchema>;\nexport type ControlDeliveryPolicy = z.infer<typeof ControlDeliveryPolicySchema>;\nexport type ControlEnvelope = z.infer<typeof ControlEnvelopeSchema>;\nexport type ControlHello = z.infer<typeof ControlHelloSchema>;\nexport type ControlHelloResponse = z.infer<typeof ControlHelloResponseSchema>;\nexport type ControlMessageReceipt = z.infer<typeof ControlMessageReceiptSchema>;\nexport type ControlClose = z.infer<typeof ControlCloseSchema>;\nexport type ControlSessionCloseReason = z.infer<typeof ControlSessionCloseReasonSchema>;\nexport type ControlHandshakeCredential = z.infer<typeof ControlHandshakeCredentialSchema>;\nexport type ControlHandshakeProof = z.infer<typeof ControlHandshakeProofSchema>;\nexport type ControlReadyRequestCredential = z.infer<typeof ControlReadyRequestCredentialSchema>;\nexport type ControlReadyRequestProof = z.infer<typeof ControlReadyRequestProofSchema>;\n\nexport type ControlHelloAcknowledge = (response: ControlHelloResponse) => void;\nexport type ControlMessageAcknowledge = (receipt: ControlMessageReceipt) => void;\nexport type ControlCloseAcknowledge = (receipt: ControlMessageReceipt) => void;\n\nexport interface ControlSessionControllerToPeerEvents<TDomainMessage> {\n\t'control:close': (payload: ControlClose, acknowledge: ControlCloseAcknowledge) => void;\n\t'control:hello': (payload: ControlHello, acknowledge: ControlHelloAcknowledge) => void;\n\t'control:message': (\n\t\tenvelope: ControlEnvelope,\n\t\tpayload: TDomainMessage,\n\t\tacknowledge: ControlMessageAcknowledge,\n\t) => void;\n}\n\nexport interface ControlSessionPeerToControllerEvents<TDomainMessage> {\n\t'control:close': (payload: ControlClose, acknowledge: ControlCloseAcknowledge) => void;\n\t'control:message': (\n\t\tenvelope: ControlEnvelope,\n\t\tpayload: TDomainMessage,\n\t\tacknowledge: ControlMessageAcknowledge,\n\t) => void;\n}\n\nexport interface DomainControlMessageIdentity {\n\treadonly kind: ControlMessageKind;\n\treadonly operation?: string;\n}\n\nexport interface DeliveryPolicyDerivationProps {\n\treadonly envelope: ControlEnvelope;\n\treadonly policyByOperation: Readonly<Record<string, ControlDeliveryPolicy>>;\n\treadonly policyByKind?: Partial<Record<ControlMessageKind, ControlDeliveryPolicy>>;\n}\n\nexport function assertControlEnvelopeMatchesDomainMessage(\n\tenvelope: ControlEnvelope,\n\tdomainMessage: DomainControlMessageIdentity,\n): void {\n\tif (envelope.kind !== domainMessage.kind) {\n\t\tthrow new Error(`control message kind mismatch: ${envelope.kind} !== ${domainMessage.kind}`);\n\t}\n\tif (envelope.operation !== domainMessage.operation) {\n\t\tthrow new Error(\n\t\t\t`control message operation mismatch: ${envelope.operation ?? '<none>'} !== ${domainMessage.operation ?? '<none>'}`,\n\t\t);\n\t}\n}\n\nexport function buildControlMessageReceipt(): ControlMessageReceipt {\n\treturn ControlMessageReceiptSchema.parse({ received: true });\n}\n\nexport function buildControlMessageRejectionReceipt(props: {\n\treadonly errorClass: string;\n\treadonly safeMessage?: string;\n}): ControlMessageReceipt {\n\treturn ControlMessageReceiptSchema.parse({\n\t\terrorClass: props.errorClass,\n\t\treceived: false,\n\t\t...(props.safeMessage === undefined ? {} : { safeMessage: props.safeMessage }),\n\t});\n}\n\nexport function buildControlMessageExceptionRejectionReceipt(props: {\n\treadonly error: unknown;\n\treadonly processingErrorClass: string;\n\treadonly safeMessage: string;\n\treadonly schemaErrorClass?: string;\n}): ControlMessageReceipt {\n\treturn buildControlMessageRejectionReceipt({\n\t\terrorClass:\n\t\t\tprops.error instanceof ZodError\n\t\t\t\t? (props.schemaErrorClass ?? 'schema_validation_failed')\n\t\t\t\t: props.processingErrorClass,\n\t\tsafeMessage: props.safeMessage,\n\t});\n}\n\nexport function assertControlMessageReceiptAccepted(receiptPayload: unknown): void {\n\tconst receipt = ControlMessageReceiptSchema.parse(receiptPayload);\n\tif (!receipt.received) {\n\t\tthrow new Error(receipt.safeMessage ?? receipt.errorClass);\n\t}\n}\n\nexport function extractDomainCommandResultResponseToMessageId(\n\tpayload: unknown,\n): string | undefined {\n\tconst parsed = DomainCommandResultResponseLinkSchema.safeParse(payload);\n\treturn parsed.success ? parsed.data.payload.responseToMessageId : undefined;\n}\n\nexport function buildControlHandshakeSignaturePayload(proof: ControlHandshakeCredential): string {\n\treturn JSON.stringify({\n\t\taudience: proof.audience,\n\t\tbootId: proof.bootId,\n\t\tcontrollerEpoch: proof.controllerEpoch,\n\t\tcredentialId: proof.credentialId,\n\t\texpiresAtMs: proof.expiresAtMs,\n\t\tgenerationId: proof.generationId,\n\t\tissuedAtMs: proof.issuedAtMs,\n\t\tnonce: proof.nonce,\n\t\tpeerId: proof.peerId,\n\t\tprotocolVersion: proof.protocolVersion,\n\t\tzoneId: proof.zoneId,\n\t});\n}\n\nexport function buildControlReadyRequestSignaturePayload(\n\tproof: ControlReadyRequestCredential,\n): string {\n\treturn JSON.stringify({\n\t\taudience: proof.audience,\n\t\tbootId: proof.bootId,\n\t\tcontrollerEpoch: proof.controllerEpoch,\n\t\tgenerationId: proof.generationId,\n\t\tissuedAtMs: proof.issuedAtMs,\n\t\tpeerId: proof.peerId,\n\t\tprotocolVersion: proof.protocolVersion,\n\t\trequestId: proof.requestId,\n\t\tzoneId: proof.zoneId,\n\t});\n}\n\nexport function deriveControlDeliveryPolicy(\n\tprops: DeliveryPolicyDerivationProps,\n): ControlDeliveryPolicy {\n\tif (props.envelope.operation !== undefined) {\n\t\tconst operationPolicy = props.policyByOperation[props.envelope.operation];\n\t\tif (operationPolicy !== undefined) {\n\t\t\treturn operationPolicy;\n\t\t}\n\t}\n\tconst kindPolicy = props.policyByKind?.[props.envelope.kind];\n\tif (kindPolicy !== undefined) {\n\t\treturn kindPolicy;\n\t}\n\tthrow new Error(\n\t\t`no derived delivery policy for ${props.envelope.kind}:${props.envelope.operation ?? '<none>'}`,\n\t);\n}\n\nexport function assertDerivedControlDeliveryPolicy(props: DeliveryPolicyDerivationProps): void {\n\tconst derivedPolicy = deriveControlDeliveryPolicy(props);\n\tif (props.envelope.deliveryPolicy !== derivedPolicy) {\n\t\tthrow new Error(\n\t\t\t`control delivery policy mismatch: ${props.envelope.deliveryPolicy} !== ${derivedPolicy}`,\n\t\t);\n\t}\n}\n\nexport function coalesceLatestWinsByKey<TMessage>(\n\tmessages: readonly TMessage[],\n\tkeyForMessage: (message: TMessage) => string,\n): readonly TMessage[] {\n\tconst latestByKey = new Map<string, TMessage>();\n\tfor (const message of messages) {\n\t\tlatestByKey.set(keyForMessage(message), message);\n\t}\n\treturn [...latestByKey.values()];\n}\n\nexport function shouldReplayControlEnvelope(envelope: ControlEnvelope): boolean {\n\treturn (\n\t\tenvelope.deliveryPolicy !== 'droppable' &&\n\t\tenvelope.deliveryPolicy !== 'latest_wins' &&\n\t\tenvelope.deliveryPolicy !== 'forbidden_bulk'\n\t);\n}\n\nexport interface ControlSequenceContinuityProps {\n\treadonly envelope: ControlEnvelope;\n\treadonly lastSeenSequence: number;\n}\n\nexport interface ControlEnvelopeSequencedMessage {\n\treadonly envelope: Pick<ControlEnvelope, 'sequence'>;\n}\n\nexport function orderControlMessagesByEnvelopeSequence<\n\tTControlMessage extends ControlEnvelopeSequencedMessage,\n>(messages: readonly TControlMessage[]): readonly TControlMessage[] {\n\treturn messages.toSorted((left, right) => left.envelope.sequence - right.envelope.sequence);\n}\n\nfunction controlSequenceDiagnosticSuffix(envelope: ControlEnvelope): string {\n\treturn ` kind=${envelope.kind} operation=${envelope.operation ?? '<none>'} delivery=${envelope.deliveryPolicy} sessionId=${envelope.sessionId}`;\n}\n\nexport type ControlSequenceContinuityDecision =\n\t| {\n\t\t\treadonly action: 'accept';\n\t\t\treadonly nextLastSeenSequence: number;\n\t }\n\t| {\n\t\t\treadonly action: 'drop';\n\t\t\treadonly nextLastSeenSequence: number;\n\t\t\treadonly safeMessage: string;\n\t }\n\t| {\n\t\t\treadonly action: 'stale';\n\t\t\treadonly closeReason: Extract<ControlSessionCloseReason, 'sequence_gap'>;\n\t\t\treadonly nextLastSeenSequence: number;\n\t\t\treadonly safeMessage: string;\n\t };\n\nexport function evaluateControlSequenceContinuity(\n\tprops: ControlSequenceContinuityProps,\n): ControlSequenceContinuityDecision {\n\tif (props.envelope.sequence <= props.lastSeenSequence) {\n\t\treturn {\n\t\t\taction: 'drop',\n\t\t\tnextLastSeenSequence: props.lastSeenSequence,\n\t\t\tsafeMessage: `control sequence did not advance: last=${String(props.lastSeenSequence)} received=${String(props.envelope.sequence)}${controlSequenceDiagnosticSuffix(props.envelope)}`,\n\t\t};\n\t}\n\tif (\n\t\tprops.envelope.deliveryPolicy === 'droppable' ||\n\t\tprops.envelope.deliveryPolicy === 'latest_wins'\n\t) {\n\t\treturn {\n\t\t\taction: 'accept',\n\t\t\tnextLastSeenSequence: props.lastSeenSequence,\n\t\t};\n\t}\n\tconst expectedSequence = props.lastSeenSequence + 1;\n\tif (props.envelope.sequence === expectedSequence) {\n\t\treturn {\n\t\t\taction: 'accept',\n\t\t\tnextLastSeenSequence: props.envelope.sequence,\n\t\t};\n\t}\n\treturn {\n\t\taction: 'stale',\n\t\tcloseReason: 'sequence_gap',\n\t\tnextLastSeenSequence: props.lastSeenSequence,\n\t\tsafeMessage: `control sequence gap: expected=${String(expectedSequence)} received=${String(props.envelope.sequence)}${controlSequenceDiagnosticSuffix(props.envelope)}`,\n\t};\n}\n\nexport function buildControlProtocolJsonSchemas(): Readonly<Record<string, unknown>> {\n\treturn {\n\t\tclose: z.toJSONSchema(ControlCloseSchema, { io: 'input' }),\n\t\tenvelope: z.toJSONSchema(ControlEnvelopeSchema, { io: 'input' }),\n\t\thandshakeCredential: z.toJSONSchema(ControlHandshakeCredentialSchema, { io: 'input' }),\n\t\thandshakeProof: z.toJSONSchema(ControlHandshakeProofSchema, { io: 'input' }),\n\t\thello: z.toJSONSchema(ControlHelloSchema, { io: 'input' }),\n\t\thelloResponse: z.toJSONSchema(ControlHelloResponseSchema, { io: 'input' }),\n\t\treadyRequestCredential: z.toJSONSchema(ControlReadyRequestCredentialSchema, {\n\t\t\tio: 'input',\n\t\t}),\n\t\treadyRequestProof: z.toJSONSchema(ControlReadyRequestProofSchema, { io: 'input' }),\n\t};\n}\n"],"mappings":";;AAEA,MAAa,2BAA2B;AAExC,MAAa,4BAA4B;CACxC,2BAA2B;CAC3B,mBAAmB;CACnB,oBAAoB;CACpB,mBAAmB;CACnB,gBAAgB;CAChB,0BAA0B;CAC1B,sBAAsB;CACtB,qBAAqB;CACrB,6BAA6B;CAC7B,4BAA4B;CAC5B,yBAAyB;CACzB,6BAA6B;CAC7B,eAAe;CACf;AAED,MAAa,uBAAuB;CACnC,sBAAsB;CACtB,mBAAmB;CACnB,oBAAoB;CACpB,cAAc,IAAI,OAAO;CACzB,iBAAiB;CACjB;AAED,MAAa,sBAAsB,EAAE,QAAQ,CAAC,MAAM,qBAAqB;AAEzE,MAAa,2BAA2B,EAAE,KAAK,CAAC,mBAAmB,iBAAiB,CAAC;AAErF,MAAa,2BAA2B,EAAE,KAAK;CAAC;CAAW;CAAkB;CAAS;CAAY,CAAC;AAEnG,MAAa,8BAA8B,EAAE,KAAK;CACjD;CACA;CACA;CACA;CACA;CACA;CACA;CACA,CAAC;AAEF,MAAa,kCAAkC,EAAE,KAAK;CACrD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,CAAC;AAEF,MAAa,wBAAwB,EACnC,OAAO;CACP,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE;CACzB,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU;CACvC,cAAc,EAAE,QAAQ,CAAC,MAAM;CAC/B,iBAAiB,EAAE,QAAQ,CAAC,IAAI,EAAE;CAClC,aAAa,EAAE,QAAQ,CAAC,KAAK,CAAC,UAAU;CACxC,gBAAgB;CAChB,QAAQ;CACR,aAAa,EAAE,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU;CACnD,gBAAgB,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU;CAC5C,MAAM;CACN,WAAW,EAAE,QAAQ,CAAC,MAAM;CAC5B,WAAW,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU;CACvC,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE;CACzB,iBAAiB,EAAE,QAAA,EAAiC;CACpD,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa;CACxC,WAAW,EAAE,QAAQ,CAAC,MAAM;CAC5B,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE;CACzB,CAAC,CACD,QAAQ;AAEV,MAAa,4BAA4B,EAAE,KAAK;CAC/C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,CAAC;AAEF,MAAa,6BAA6B,EAAE,KAAK;CAChD;CACA;CACA;CACA;CACA;CACA;CACA,CAAC;AAEF,MAAa,wBAAwB,EACnC,OAAO;CACP,YAAY,EAAE,QAAQ,CAAC,IAAI,EAAE;CAC7B,WAAW,EAAE,SAAS,CAAC,UAAU;CACjC,aAAa,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU;CACzC,CAAC,CACD,QAAQ;AAEV,MAAa,2BAA2B,EACtC,OAAO;CACP,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU;CACzC,eAAe,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU;CAC3C,WAAW,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU;CACvC,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU;CACnC,kBAAkB,EAAE,QAAQ,CAAC,IAAI,GAAG,CAAC,UAAU;CAC/C,YAAY,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU;CACxC,SAAS,EACP,QAAQ,CACR,MAAM,kBAAkB,CACxB,UAAU;CACZ,CAAC,CACD,QAAQ;AAEV,MAAa,qBAAqB,EAChC,OAAO;CACP,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE;CACzB,iBAAiB,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU;CAC7C,QAAQ;CACR,4BAA4B,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,UAAU;CACrE,sBAAsB,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,UAAU;CAC/D,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE;CACzB,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU;CAC/C,iBAAiB,EAAE,QAAA,EAAiC;CACpD,CAAC,CACD,QAAQ;AAEV,MAAa,6BAA6B,EACxC,OAAO;CACP,cAAc,EAAE,QAAQ,CAAC,MAAM;CAC/B,iBAAiB,EAAE,QAAQ,CAAC,IAAI,EAAE;CAClC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC,UAAU;CACnD,SAAS,EAAE,KAAK;EAAC;EAAY;EAAY;EAAmB;EAAsB,CAAC;CACnF,WAAW,EAAE,QAAQ,CAAC,MAAM;CAC5B,CAAC,CACD,QAAQ;AAEV,MAAa,qBAAqB,EAChC,OAAO;CACP,QAAQ;CACR,aAAa,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU;CACzC,WAAW,EAAE,QAAQ,CAAC,MAAM;CAC5B,CAAC,CACD,QAAQ;AAEV,MAAa,sCAAsC,EACjD,OAAO,EACP,UAAU,EAAE,QAAQ,KAAK,EACzB,CAAC,CACD,QAAQ;AAEV,MAAa,sCAAsC,EACjD,OAAO;CACP,YAAY,EAAE,QAAQ,CAAC,IAAI,EAAE;CAC7B,UAAU,EAAE,QAAQ,MAAM;CAC1B,aAAa,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU;CACzC,CAAC,CACD,QAAQ;AAEV,MAAa,8BAA8B,EAAE,mBAAmB,YAAY,CAC3E,qCACA,oCACA,CAAC;AAEF,MAAa,wCAAwC,EACnD,OAAO;CACP,MAAM,EAAE,QAAQ,iBAAiB;CACjC,SAAS,EACP,OAAO,EACP,qBAAqB,EAAE,QAAQ,CAAC,MAAM,EACtC,CAAC,CACD,aAAa;CACf,CAAC,CACD,aAAa;AAEf,MAAa,mCAAmC,EAC9C,OAAO;CACP,UAAU;CACV,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE;CACzB,iBAAiB,EAAE,QAAQ,CAAC,IAAI,EAAE;CAClC,cAAc,EAAE,QAAQ,CAAC,IAAI,EAAE;CAC/B,aAAa,EAAE,QAAQ,CAAC,KAAK,CAAC,UAAU;CACxC,cAAc,EAAE,QAAQ,CAAC,IAAI,EAAE;CAC/B,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,UAAU;CACvC,OAAO,EAAE,QAAQ,CAAC,IAAI,GAAG;CACzB,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE;CACzB,iBAAiB,EAAE,QAAA,EAAiC;CACpD,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE;CACzB,CAAC,CACD,QAAQ,CACR,QAAQ,UAAU,MAAM,cAAc,MAAM,YAAY;CACxD,SAAS;CACT,MAAM,CAAC,cAAc;CACrB,CAAC;AAEH,MAAa,8BAA8B,iCAAiC,OAAO,EAClF,WAAW,EAAE,QAAQ,CAAC,IAAI,EAAE,EAC5B,CAAC,CAAC,QAAQ;AAEX,MAAa,sCAAsC,EACjD,OAAO;CACP,UAAU;CACV,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE;CACzB,iBAAiB,EAAE,QAAQ,CAAC,IAAI,EAAE;CAClC,cAAc,EAAE,QAAQ,CAAC,IAAI,EAAE;CAC/B,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,UAAU;CACvC,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE;CACzB,iBAAiB,EAAE,QAAA,EAAiC;CACpD,WAAW,EAAE,QAAQ,CAAC,MAAM;CAC5B,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE;CACzB,CAAC,CACD,QAAQ;AAEV,MAAa,iCAAiC,oCAAoC,OAAO,EACxF,WAAW,EAAE,QAAQ,CAAC,IAAI,EAAE,EAC5B,CAAC,CAAC,QAAQ;AAEX,MAAa,gCAAgC,EAC3C,OAAO,EACP,OAAO,6BACP,CAAC,CACD,QAAQ;AAEV,MAAa,0CAA0C;AAEvD,MAAa,iCAAiC;CAC7C,QAAQ;CACR,iBAAiB;CACjB,cAAc;CACd,QAAQ;CACR,aAAa;CACb,cAAc;CACd,YAAY;CACZ,OAAO;CACP,QAAQ;CACR,UAAU;CACV,WAAW;CACX,QAAQ;CACR;AAED,MAAa,6BAA6B;CACzC,QAAQ,+BAA+B;CACvC,iBAAiB,+BAA+B;CAChD,QAAQ,+BAA+B;CACvC,cAAc,+BAA+B;CAC7C,YAAY,+BAA+B;CAC3C,QAAQ,+BAA+B;CACvC,UAAU,+BAA+B;CACzC,WAAW;CACX,WAAW,+BAA+B;CAC1C,QAAQ,+BAA+B;CACvC;AAED,MAAa,gCAAgC;CAC5C,SAAS;CACT,gBAAgB;CAChB,OAAO;CACP,WAAW;CACX;AAmDD,SAAgB,0CACf,UACA,eACO;CACP,IAAI,SAAS,SAAS,cAAc,MACnC,MAAM,IAAI,MAAM,kCAAkC,SAAS,KAAK,OAAO,cAAc,OAAO;CAE7F,IAAI,SAAS,cAAc,cAAc,WACxC,MAAM,IAAI,MACT,uCAAuC,SAAS,aAAa,SAAS,OAAO,cAAc,aAAa,WACxG;;AAIH,SAAgB,6BAAoD;CACnE,OAAO,4BAA4B,MAAM,EAAE,UAAU,MAAM,CAAC;;AAG7D,SAAgB,oCAAoC,OAG1B;CACzB,OAAO,4BAA4B,MAAM;EACxC,YAAY,MAAM;EAClB,UAAU;EACV,GAAI,MAAM,gBAAgB,KAAA,IAAY,EAAE,GAAG,EAAE,aAAa,MAAM,aAAa;EAC7E,CAAC;;AAGH,SAAgB,6CAA6C,OAKnC;CACzB,OAAO,oCAAoC;EAC1C,YACC,MAAM,iBAAiB,WACnB,MAAM,oBAAoB,6BAC3B,MAAM;EACV,aAAa,MAAM;EACnB,CAAC;;AAGH,SAAgB,oCAAoC,gBAA+B;CAClF,MAAM,UAAU,4BAA4B,MAAM,eAAe;CACjE,IAAI,CAAC,QAAQ,UACZ,MAAM,IAAI,MAAM,QAAQ,eAAe,QAAQ,WAAW;;AAI5D,SAAgB,8CACf,SACqB;CACrB,MAAM,SAAS,sCAAsC,UAAU,QAAQ;CACvE,OAAO,OAAO,UAAU,OAAO,KAAK,QAAQ,sBAAsB,KAAA;;AAGnE,SAAgB,sCAAsC,OAA2C;CAChG,OAAO,KAAK,UAAU;EACrB,UAAU,MAAM;EAChB,QAAQ,MAAM;EACd,iBAAiB,MAAM;EACvB,cAAc,MAAM;EACpB,aAAa,MAAM;EACnB,cAAc,MAAM;EACpB,YAAY,MAAM;EAClB,OAAO,MAAM;EACb,QAAQ,MAAM;EACd,iBAAiB,MAAM;EACvB,QAAQ,MAAM;EACd,CAAC;;AAGH,SAAgB,yCACf,OACS;CACT,OAAO,KAAK,UAAU;EACrB,UAAU,MAAM;EAChB,QAAQ,MAAM;EACd,iBAAiB,MAAM;EACvB,cAAc,MAAM;EACpB,YAAY,MAAM;EAClB,QAAQ,MAAM;EACd,iBAAiB,MAAM;EACvB,WAAW,MAAM;EACjB,QAAQ,MAAM;EACd,CAAC;;AAGH,SAAgB,4BACf,OACwB;CACxB,IAAI,MAAM,SAAS,cAAc,KAAA,GAAW;EAC3C,MAAM,kBAAkB,MAAM,kBAAkB,MAAM,SAAS;EAC/D,IAAI,oBAAoB,KAAA,GACvB,OAAO;;CAGT,MAAM,aAAa,MAAM,eAAe,MAAM,SAAS;CACvD,IAAI,eAAe,KAAA,GAClB,OAAO;CAER,MAAM,IAAI,MACT,kCAAkC,MAAM,SAAS,KAAK,GAAG,MAAM,SAAS,aAAa,WACrF;;AAGF,SAAgB,mCAAmC,OAA4C;CAC9F,MAAM,gBAAgB,4BAA4B,MAAM;CACxD,IAAI,MAAM,SAAS,mBAAmB,eACrC,MAAM,IAAI,MACT,qCAAqC,MAAM,SAAS,eAAe,OAAO,gBAC1E;;AAIH,SAAgB,wBACf,UACA,eACsB;CACtB,MAAM,8BAAc,IAAI,KAAuB;CAC/C,KAAK,MAAM,WAAW,UACrB,YAAY,IAAI,cAAc,QAAQ,EAAE,QAAQ;CAEjD,OAAO,CAAC,GAAG,YAAY,QAAQ,CAAC;;AAGjC,SAAgB,4BAA4B,UAAoC;CAC/E,OACC,SAAS,mBAAmB,eAC5B,SAAS,mBAAmB,iBAC5B,SAAS,mBAAmB;;AAa9B,SAAgB,uCAEd,UAAkE;CACnE,OAAO,SAAS,UAAU,MAAM,UAAU,KAAK,SAAS,WAAW,MAAM,SAAS,SAAS;;AAG5F,SAAS,gCAAgC,UAAmC;CAC3E,OAAO,SAAS,SAAS,KAAK,aAAa,SAAS,aAAa,SAAS,YAAY,SAAS,eAAe,aAAa,SAAS;;AAoBrI,SAAgB,kCACf,OACoC;CACpC,IAAI,MAAM,SAAS,YAAY,MAAM,kBACpC,OAAO;EACN,QAAQ;EACR,sBAAsB,MAAM;EAC5B,aAAa,0CAA0C,OAAO,MAAM,iBAAiB,CAAC,YAAY,OAAO,MAAM,SAAS,SAAS,GAAG,gCAAgC,MAAM,SAAS;EACnL;CAEF,IACC,MAAM,SAAS,mBAAmB,eAClC,MAAM,SAAS,mBAAmB,eAElC,OAAO;EACN,QAAQ;EACR,sBAAsB,MAAM;EAC5B;CAEF,MAAM,mBAAmB,MAAM,mBAAmB;CAClD,IAAI,MAAM,SAAS,aAAa,kBAC/B,OAAO;EACN,QAAQ;EACR,sBAAsB,MAAM,SAAS;EACrC;CAEF,OAAO;EACN,QAAQ;EACR,aAAa;EACb,sBAAsB,MAAM;EAC5B,aAAa,kCAAkC,OAAO,iBAAiB,CAAC,YAAY,OAAO,MAAM,SAAS,SAAS,GAAG,gCAAgC,MAAM,SAAS;EACrK;;AAGF,SAAgB,kCAAqE;CACpF,OAAO;EACN,OAAO,EAAE,aAAa,oBAAoB,EAAE,IAAI,SAAS,CAAC;EAC1D,UAAU,EAAE,aAAa,uBAAuB,EAAE,IAAI,SAAS,CAAC;EAChE,qBAAqB,EAAE,aAAa,kCAAkC,EAAE,IAAI,SAAS,CAAC;EACtF,gBAAgB,EAAE,aAAa,6BAA6B,EAAE,IAAI,SAAS,CAAC;EAC5E,OAAO,EAAE,aAAa,oBAAoB,EAAE,IAAI,SAAS,CAAC;EAC1D,eAAe,EAAE,aAAa,4BAA4B,EAAE,IAAI,SAAS,CAAC;EAC1E,wBAAwB,EAAE,aAAa,qCAAqC,EAC3E,IAAI,SACJ,CAAC;EACF,mBAAmB,EAAE,aAAa,gCAAgC,EAAE,IAAI,SAAS,CAAC;EAClF"}
|
package/package.json
CHANGED