@nextera.one/axis-server-sdk 0.5.0 → 0.6.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/core/index.d.mts +15 -1
- package/dist/core/index.d.ts +15 -1
- package/dist/core/index.js +42 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.mjs +28 -0
- package/dist/core/index.mjs.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +28 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/decorators/handler.decorator.ts","../src/decorators/intent.decorator.ts","../src/engine/intent.router.ts","../src/core/constants.ts","../src/core/varint.ts","../src/core/tlv.ts","../src/core/signature.ts","../src/core/axis-bin.ts","../src/codec/ats1.constants.ts","../src/codec/ats1.ts","../src/codec/ats1.passkey.schemas.ts","../src/codec/tlv.encode.ts","../src/codec/axis1.encode.ts","../src/codec/axis1.signing.ts","../src/crypto/b64url.ts","../src/crypto/canonical-json.ts","../src/contract/execution-meter.ts","../src/contract/contract.interface.ts","../src/types/tlv.ts","../src/types/frame.ts","../src/types/packet.ts","../src/sensor/axis-sensor.ts"],"sourcesContent":["// Decorators\nexport { Handler, HANDLER_METADATA_KEY } from './decorators/handler.decorator';\nexport {\n Intent,\n INTENT_ROUTES_KEY,\n IntentRoute,\n IntentOptions,\n} from './decorators/intent.decorator';\n\n// Engine\nexport { IntentRouter, AxisEffect } from './engine/intent.router';\n\n// Core Protocol\nexport * from './core/constants';\nexport * from './core/varint';\nexport * from './core/tlv';\nexport * from './core/signature';\nexport {\n AxisFrameZ,\n decodeFrame,\n encodeFrame,\n getSignTarget,\n} from './core/axis-bin';\nexport type { AxisBinaryFrame } from './core/axis-bin';\n\n// Codec\nexport * from './codec/ats1.constants';\nexport * from './codec/ats1.passkey.schemas';\nexport * as Ats1Codec from './codec/ats1';\nexport * from './codec/axis1.encode';\nexport * from './codec/axis1.signing';\nexport * from './codec/tlv.encode';\n\n// Crypto Utilities\nexport * from './crypto/b64url';\nexport * from './crypto/canonical-json';\nexport * from './crypto/types';\n\n// Contract Utilities\nexport * from './contract/execution-meter';\nexport * from './contract/contract.interface';\n\n// Packet and Sensor Types\nexport { Axis1DecodedFrame, decodeAxis1Frame } from './types/frame';\nexport {\n AxisPacket as AxisBinaryPacket,\n T as AxisPacketTags,\n buildPacket,\n} from './types/packet';\nexport type { AxisObservedContext, AxisRequestContext } from './types/axis-frame.types';\nexport type { TLV as AxisTlvType } from './core/tlv';\nexport {\n Decision,\n normalizeSensorDecision,\n SensorDecisions,\n} from './sensor/axis-sensor';\nexport type {\n AxisSensor,\n AxisSensorInit,\n AxisPreSensor,\n AxisPostSensor,\n SensorPhaseMetadata,\n SensorInput,\n SensorDecision,\n SensorMinifiedDecision,\n} from './sensor/axis-sensor';\n\n// Interfaces\nexport { AxisHandler, AxisHandlerInit } from './interfaces/axis-handler.interface';\nexport { AxisCrudHandler } from './interfaces/axis-crud-handler.interface';\n\n// Types\n","import { Injectable, SetMetadata } from '@nestjs/common';\n\nexport const HANDLER_METADATA_KEY = 'axis:handler';\n\n/**\n * Decorator to mark a class as an Axis Handler.\n * Handlers are responsible for processing intents or specific logic\n * for Axis modules.\n */\nexport function Handler(intent?: string): ClassDecorator {\n return (target: Function) => {\n SetMetadata(HANDLER_METADATA_KEY, { intent })(target);\n Injectable()(target as any);\n };\n}\n","import 'reflect-metadata';\n\nexport const INTENT_ROUTES_KEY = 'axis:intent_routes';\n\nexport interface IntentRoute {\n action: string;\n methodName: string | symbol;\n absolute?: boolean;\n frame?: boolean;\n}\n\nexport interface IntentOptions {\n /** If true, the action is the full intent name (not prefixed with handler name) */\n absolute?: boolean;\n /** If true, register as { handle: fn } for frame-based handlers */\n frame?: boolean;\n}\n\n/**\n * Marks a method as an intent handler.\n *\n * The full intent name is resolved as `{handler_prefix}.{action}` by default.\n * Use `{ absolute: true }` to use the action string as the full intent name.\n * Use `{ frame: true }` for handlers that receive an AxisFrame and return AxisEffect.\n *\n * @example\n * ```ts\n * @Handler('axis.actor_keys')\n * class MyHandler {\n * @Intent('create')\n * async create(body: Uint8Array) { ... }\n *\n * @Intent('public.auth.capsule.issue', { absolute: true })\n * async publicIssue(body: Uint8Array) { ... }\n *\n * @Intent('presence.resume', { frame: true })\n * async handlePresence(frame: AxisFrame) { ... }\n * }\n * ```\n */\nexport function Intent(action: string, options?: IntentOptions): MethodDecorator {\n return (target, propertyKey) => {\n const routes: IntentRoute[] =\n Reflect.getMetadata(INTENT_ROUTES_KEY, target.constructor) || [];\n routes.push({\n action,\n methodName: propertyKey,\n absolute: options?.absolute,\n frame: options?.frame,\n });\n Reflect.defineMetadata(INTENT_ROUTES_KEY, routes, target.constructor);\n };\n}\n","import { Injectable } from '@nestjs/common';\nimport { AxisFrame } from '../core/axis-bin';\nimport { HANDLER_METADATA_KEY } from '../decorators/handler.decorator';\nimport { INTENT_ROUTES_KEY, IntentRoute } from '../decorators/intent.decorator';\n\n/**\n * Represents the outcome of an AXIS intent execution.\n *\n * @interface AxisEffect\n */\nexport interface AxisEffect {\n /** Whether the intent was processed successfully at the application level */\n ok: boolean;\n /** A descriptive string classifier for the result (e.g., 'FILE_CREATED', 'PONG') */\n effect: string;\n /** Optional binary payload (body) to be returned to the requester */\n body?: Uint8Array;\n /** Optional custom TLV headers to be included in the response frame */\n headers?: Map<number, Uint8Array>;\n /** Optional metadata for internal logging or audit (not sent to client) */\n metadata?: any;\n}\n\n/**\n * IntentRouter\n *\n * The central dispatching mechanism of the AXIS backend.\n * Maps binary intents (identified by their name in the header) to specialized handlers.\n *\n * **Features:**\n * 1. **Built-in Fast Path:** Handles high-frequency system intents (ping, time, echo) directly.\n * 2. **Dynamic Handler Registration:** Allows modules to register handlers at runtime.\n * 3. **Decorator-driven Registration:** Uses {@link registerHandler} to auto-register `@Intent`-decorated methods.\n * 4. **Polymorphic Handlers:** Supports both raw function handlers and object-based `{ handle }` handlers.\n *\n * @class IntentRouter\n */\n@Injectable()\nexport class IntentRouter {\n /** Internal registry of dynamic intent handlers */\n private handlers = new Map<string, any>();\n\n /**\n * Registers a handler for a specific intent.\n * Handlers can be functions: `(body, headers) => Promise<Uint8Array | AxisEffect>`\n * Or objects with a method: `handle(frame: AxisFrame) => Promise<AxisEffect>`\n *\n * @param {string} intent - The unique intent identifier (e.g., 'axis.vault.create')\n * @param {any} handler - The handler function or object\n */\n register(intent: string, handler: any) {\n this.handlers.set(intent, handler);\n }\n\n /**\n * Automatically registers all `@Intent`-decorated methods from a handler instance.\n *\n * Reads the handler prefix from `@Handler` metadata (or falls back to `instance.name`),\n * then registers each `@Intent`-decorated method accordingly.\n *\n * @param {any} instance - The handler instance with `@Intent`-decorated methods\n */\n registerHandler(instance: any) {\n const handlerMeta = Reflect.getMetadata(\n HANDLER_METADATA_KEY,\n instance.constructor,\n );\n const prefix: string | undefined = handlerMeta?.intent || instance.name;\n\n const routes: IntentRoute[] =\n Reflect.getMetadata(INTENT_ROUTES_KEY, instance.constructor) || [];\n\n for (const route of routes) {\n const intentName = route.absolute\n ? route.action\n : `${prefix}.${route.action}`;\n const fn = instance[route.methodName].bind(instance);\n\n if (route.frame) {\n this.register(intentName, { handle: fn });\n } else {\n this.register(intentName, fn);\n }\n }\n }\n\n /**\n * Routes a decoded AXIS frame to the appropriate handler.\n *\n * **Precedence:**\n * 1. System Built-ins (`system.ping`, `public.ping`, `system.time`, `system.echo`)\n * 2. Meta-intent execution (`INTENT.EXEC` / `axis.intent.exec`)\n * 3. Dynamically registered handlers from modules.\n *\n * @param {AxisFrame} frame - The validated and decoded binary frame\n * @returns {Promise<AxisEffect>} The resulting effect of the execution\n * @throws {Error} If the intent header is missing or no handler is registered\n */\n async route(frame: AxisFrame): Promise<AxisEffect> {\n const start = process.hrtime();\n let intent = 'unknown';\n\n try {\n // Extract intent from header TLV (tag 3 = TLV_INTENT)\n const intentBytes = frame.headers.get(3);\n if (!intentBytes) throw new Error('Missing intent');\n intent = new TextDecoder().decode(intentBytes);\n\n let effect: AxisEffect;\n\n if (intent === 'system.ping' || intent === 'public.ping') {\n effect = {\n ok: true,\n effect: 'pong',\n headers: new Map([\n [100, new TextEncoder().encode('AXIS_BACKEND_V1')],\n ]),\n body: new TextEncoder().encode(\n JSON.stringify({\n status: 'ok',\n timestamp: new Date().toISOString(),\n version: '1.0.0',\n }),\n ),\n };\n } else if (intent === 'system.time') {\n const ts = Date.now().toString();\n effect = {\n ok: true,\n effect: 'time',\n body: new TextEncoder().encode(\n JSON.stringify({\n ts,\n iso: new Date().toISOString(),\n }),\n ),\n };\n } else if (intent === 'system.echo') {\n effect = {\n ok: true,\n effect: 'echo',\n body: frame.body,\n };\n } else if (intent === 'INTENT.EXEC' || intent === 'axis.intent.exec') {\n // Meta-intent: Unwrap and execute the inner intent\n try {\n const bodyJSON = JSON.parse(new TextDecoder().decode(frame.body));\n const innerIntent = bodyJSON.intent;\n const innerArgs = bodyJSON.args || {};\n\n if (!innerIntent) {\n throw new Error('INTENT.EXEC missing inner intent');\n }\n\n const innerFrame: AxisFrame = {\n ...frame,\n headers: new Map(frame.headers),\n body: new TextEncoder().encode(JSON.stringify(innerArgs)),\n };\n innerFrame.headers.set(3, new TextEncoder().encode(innerIntent));\n\n return await this.route(innerFrame);\n } catch (e: any) {\n throw new Error(`INTENT.EXEC unwrapping failed: ${e.message}`);\n }\n } else {\n const handler = this.handlers.get(intent);\n if (!handler) {\n throw new Error(`Intent not found: ${intent}`);\n }\n\n if (typeof handler === 'function') {\n const resultBody = await handler(frame.body, frame.headers);\n effect = {\n ok: true,\n effect: 'complete',\n body: resultBody,\n };\n } else {\n if (typeof (handler as any).handle === 'function') {\n effect = await (handler as any).handle(frame);\n } else if (typeof (handler as any).execute === 'function') {\n const bodyRes = await (handler as any).execute(\n frame.body,\n frame.headers,\n );\n effect = {\n ok: true,\n effect: 'complete',\n body: bodyRes,\n };\n } else {\n throw new Error(\n `Handler for ${intent} does not implement handle or execute`,\n );\n }\n }\n }\n\n this.recordLatency(intent, start);\n return effect;\n } catch (e: any) {\n console.error(`Error routing intent ${intent}:`, e.message);\n throw e;\n }\n }\n\n private recordLatency(intent: string, start: [number, number]) {\n const diff = process.hrtime(start);\n // Available for subclass telemetry hooks or future logging\n void diff;\n }\n}\n","/**\n * AXIS Protocol Magic Bytes (e.g., 'AXIS1')\n */\nexport const AXIS_MAGIC = new Uint8Array([0x41, 0x58, 0x49, 0x53, 0x31]);\n\n/**\n * AXIS Protocol Version\n */\nexport const AXIS_VERSION = 0x01;\n\n/**\n * Maximum allowed size for the Header section in bytes.\n */\nexport const MAX_HDR_LEN = 2048;\n\n/**\n * Maximum allowed size for the Body section in bytes.\n */\nexport const MAX_BODY_LEN = 65536;\n\n/**\n * Maximum allowed size for the Signature section in bytes.\n */\nexport const MAX_SIG_LEN = 128;\n\n/**\n * Total maximum allowed size for a single AXIS frame.\n */\nexport const MAX_FRAME_LEN = 70 * 1024; // 70 KB\n\n/**\n * Frame Control Flags\n */\nexport const FLAG_BODY_TLV = 0x01;\nexport const FLAG_CHAIN_REQ = 0x02;\nexport const FLAG_HAS_WITNESS = 0x04;\n\n/**\n * TLV Tags for Header Section\n */\nexport const TLV_PID = 1;\nexport const TLV_TS = 2;\nexport const TLV_INTENT = 3;\nexport const TLV_ACTOR_ID = 4;\nexport const TLV_PROOF_TYPE = 5;\nexport const TLV_PROOF_REF = 6;\nexport const TLV_NONCE = 7;\nexport const TLV_AUD = 8;\nexport const TLV_REALM = TLV_AUD;\nexport const TLV_NODE = 9;\nexport const TLV_TRACE_ID = 10;\n/** Key ID for key rotation support */\nexport const TLV_KID = 11;\n\n/**\n * TLV Tags for Receipt Section\n */\nexport const TLV_RID = 15;\nexport const TLV_OK = 16;\nexport const TLV_EFFECT = 17;\nexport const TLV_ERROR_CODE = 18;\nexport const TLV_ERROR_MSG = 19;\nexport const TLV_PREV_HASH = 20;\nexport const TLV_RECEIPT_HASH = 21;\nexport const TLV_NODE_KID = 30;\nexport const TLV_NODE_CERT_HASH = 34;\n\n/**\n * TLV Tags for Loom Runtime (Lawful Execution)\n */\n/** Presence ID - liveness proof (UTF-8 string, e.g., \"pr_abc123\") */\nexport const TLV_LOOM_PRESENCE_ID = 91;\n/** Writ - executable intent (canonical JSON, UTF-8 encoded) */\nexport const TLV_LOOM_WRIT = 92;\n/** Thread Hash - causal continuity (32 bytes, raw binary) */\nexport const TLV_LOOM_THREAD_HASH = 93;\n\n/**\n * TLV Tags for Application Extensions (File Transfer / Capsule, range 70-99)\n */\n/** Upload session identifier (16 bytes, raw binary) */\nexport const TLV_UPLOAD_ID = 70;\n/** Chunk index within an upload session */\nexport const TLV_INDEX = 71;\n/** Byte offset of the chunk within the file */\nexport const TLV_OFFSET = 72;\n/** SHA-256 hash of a file chunk (32 bytes, raw binary) */\nexport const TLV_SHA256_CHUNK = 73;\n/** Capsule identifier stored as UTF-8 string */\nexport const TLV_CAPSULE = 90;\n\n/**\n * Supported Authentication Proof Types\n */\nexport const PROOF_CAPSULE = 1;\nexport const PROOF_JWT = 2;\nexport const PROOF_MTLS = 3;\n/** Loom Presence + Writ proof */\nexport const PROOF_LOOM = 4;\n\n/**\n * Standard Protocol Error Codes\n */\nexport const ERR_INVALID_PACKET = 'INVALID_PACKET';\nexport const ERR_BAD_SIGNATURE = 'BAD_SIGNATURE';\nexport const ERR_REPLAY_DETECTED = 'REPLAY_DETECTED';\nexport const ERR_CONTRACT_VIOLATION = 'CONTRACT_VIOLATION';\n","/**\n * Encodes a number (up to 53 bits safe integer) into a Varint buffer.\n * Varints are a way of encoding integers using one or more bytes.\n * Smaller numbers take fewer bytes.\n *\n * @param {number} value - The unsigned integer to encode\n * @returns {Uint8Array} The encoded binary buffer\n * @throws {Error} If the value is negative\n */\nexport function encodeVarint(value: number): Uint8Array {\n if (value < 0) throw new Error('Varint must be unsigned');\n const bytes: number[] = [];\n while (true) {\n const byte = value & 0x7f;\n value >>>= 7;\n if (value === 0) {\n bytes.push(byte);\n break;\n }\n bytes.push(byte | 0x80);\n }\n return new Uint8Array(bytes);\n}\n\n/**\n * Decodes a Varint from a buffer starting at a specific offset.\n *\n * @param {Uint8Array} buf - The buffer containing the encoded varint\n * @param {number} [offset=0] - The starting position in the buffer\n * @returns {Object} The decoded numeric value and the number of bytes consumed (length)\n * @throws {Error} If the buffer is too small or the varint exceeds 8 bytes (max 53-bit safe int)\n */\nexport function decodeVarint(\n buf: Uint8Array,\n offset = 0,\n): { value: number; length: number } {\n let value = 0;\n let shift = 0;\n let length = 0;\n\n while (true) {\n if (offset + length >= buf.length) {\n throw new Error('Varint decode out of bounds');\n }\n const byte = buf[offset + length];\n value += (byte & 0x7f) * Math.pow(2, shift);\n length++;\n shift += 7;\n if ((byte & 0x80) === 0) {\n break;\n }\n if (length > 8) throw new Error('Varint too large');\n }\n\n return { value, length };\n}\n\n/**\n * Calculates the number of bytes required to encode a value as a varint.\n * Useful for pre-allocating buffers.\n *\n * @param {number} value - The unsigned integer to check\n * @returns {number} The byte length\n * @throws {Error} If the value is negative\n */\nexport function varintLength(value: number): number {\n if (value < 0) throw new Error('Varint must be unsigned');\n let len = 0;\n do {\n value >>>= 7;\n len++;\n } while (value !== 0);\n return len;\n}\n","import { encodeVarint, decodeVarint, varintLength } from './varint';\n\n/**\n * Represents a basic Type-Length-Value structure.\n *\n * @interface TLV\n */\nexport interface TLV {\n /** The tag or type identifier */\n type: number;\n /** The raw binary value */\n value: Uint8Array;\n}\n\n/**\n * Encodes an array of TLVs into a canonical binary buffer.\n *\n * **Canonical Rules:**\n * 1. TLVs MUST be sorted by `type` in ascending order.\n * 2. Duplicate `type` entries are NOT allowed.\n * 3. Format: `[type_varint][len_varint][value_bytes]`\n *\n * @param {TLV[]} tlvs - The list of TLV entries to encode\n * @returns {Uint8Array} The sorted and encoded binary buffer\n * @throws {Error} If duplicate types are detected\n */\nexport function encodeTLVs(tlvs: TLV[]): Uint8Array {\n // 1. Sort by TYPE ascending\n // Create a copy to avoid mutating input\n const sorted = [...tlvs].sort((a, b) => a.type - b.type);\n\n // 2. Check for duplicates\n for (let i = 0; i < sorted.length - 1; i++) {\n if (sorted[i].type === sorted[i + 1].type) {\n throw new Error(`Duplicate TLV type: ${sorted[i].type}`);\n }\n }\n\n // 3. Calculate total size\n let totalSize = 0;\n for (const t of sorted) {\n totalSize += varintLength(t.type);\n totalSize += varintLength(t.value.length);\n totalSize += t.value.length;\n }\n\n // 4. Encode\n const buf = new Uint8Array(totalSize);\n let offset = 0;\n for (const t of sorted) {\n const typeBytes = encodeVarint(t.type);\n buf.set(typeBytes, offset);\n offset += typeBytes.length;\n\n const lenBytes = encodeVarint(t.value.length);\n buf.set(lenBytes, offset);\n offset += lenBytes.length;\n\n buf.set(t.value, offset);\n offset += t.value.length;\n }\n\n return buf;\n}\n\n/**\n * Decodes a binary buffer of TLVs into a flat list.\n * Preserves the original wire order and allows duplicate types.\n *\n * @param {Uint8Array} buf - The buffer containing TLV-encoded data\n * @param {number} [maxItems=1024] - Security limit for the number of parsed items\n * @returns {TLV[]} A list of decoded TLV entries\n * @throws {Error} If the buffer is truncated or malformed\n */\nexport function decodeTLVsList(buf: Uint8Array, maxItems = 1024): TLV[] {\n const list: TLV[] = [];\n let offset = 0;\n\n while (offset < buf.length) {\n if (list.length >= maxItems) throw new Error('TLV_LIMIT');\n\n // Decode TYPE\n const { value: type, length: typeLen } = decodeVarint(buf, offset);\n offset += typeLen;\n\n // Decode LEN\n const { value: len, length: lenLen } = decodeVarint(buf, offset);\n offset += lenLen;\n\n // Check bounds\n if (offset + len > buf.length) {\n throw new Error(`TLV violation: Length ${len} exceeds buffer`);\n }\n\n // Extract VALUE\n const value = buf.slice(offset, offset + len);\n list.push({ type, value });\n offset += len;\n }\n\n return list;\n}\n\n/**\n * Decodes a binary buffer of TLVs into a Map for efficient access.\n * Enforces strict canonical order (sorted tiles) and forbids duplicate types.\n *\n * @param {Uint8Array} buf - The buffer containing canonical TLV data\n * @returns {Map<number, Uint8Array>} Map of Tag -> Value\n * @throws {Error} If canonical order is violated or duplicates are found\n */\nexport function decodeTLVs(buf: Uint8Array): Map<number, Uint8Array> {\n const map = new Map<number, Uint8Array>();\n let offset = 0;\n let lastType = -1;\n\n while (offset < buf.length) {\n // Decode TYPE\n const { value: type, length: typeLen } = decodeVarint(buf, offset);\n offset += typeLen;\n\n // Check canonical order\n if (type <= lastType) {\n throw new Error(\n `TLV violation: Unsorted or duplicate type ${type} after ${lastType}`,\n );\n }\n lastType = type;\n\n // Decode LEN\n const { value: len, length: lenLen } = decodeVarint(buf, offset);\n offset += lenLen;\n\n // Check bounds\n if (offset + len > buf.length) {\n throw new Error(`TLV violation: Length ${len} exceeds buffer`);\n }\n\n // Extract VALUE\n const value = buf.slice(offset, offset + len);\n map.set(type, value);\n offset += len;\n }\n\n return map;\n}\n\n/**\n * Recursive Object Decoder (safe nesting).\n * This follows the AXIS Option A: Nested TLV objects.\n */\nexport function decodeObject(\n bytes: Uint8Array,\n depth = 0,\n limits = { maxDepth: 8, maxItems: 128 },\n): Map<number, any> {\n if (depth > limits.maxDepth) {\n throw new Error('OBJECT_DEPTH_EXCEEDED');\n }\n\n const map = decodeTLVs(bytes);\n // In v1, we leave values as Uint8Array unless schema-driven.\n // The IntentSchemaValidator will handle deeper recursion.\n return map;\n}\n\n/**\n * Array Decoder (explicit container).\n * VALUE = repeated TLVs of one ITEM type.\n */\nexport function decodeArray(\n bytes: Uint8Array,\n itemType: number,\n maxItems = 256,\n): Uint8Array[] {\n const list = decodeTLVsList(bytes, maxItems);\n const items: Uint8Array[] = [];\n\n for (const tlv of list) {\n if (tlv.type !== itemType) {\n throw new Error(`INVALID_ARRAY_ITEM:${tlv.type}`);\n }\n items.push(tlv.value);\n }\n\n return items;\n}\n","import * as crypto from 'crypto';\n\nimport { AxisFrame, encodeFrame } from './axis-bin';\n\n/**\n * Signature utilities for AXIS binary frames\n * Supports Ed25519 signature generation and verification\n */\n\n/**\n * Computes the canonical payload for signing an AXIS frame.\n * The signature covers all bytes of the encoded frame EXCEPT the signature field itself.\n *\n * @param {AxisFrame} frame - The frame to prepare for signing\n * @returns {Buffer} The serialized canonical bytes for the signature algorithm\n */\nexport function computeSignaturePayload(frame: AxisFrame): Buffer {\n // Re-encode frame with empty signature\n const frameWithoutSig: AxisFrame = {\n ...frame,\n sig: new Uint8Array(0),\n };\n\n const encoded = encodeFrame(frameWithoutSig);\n return Buffer.from(encoded);\n}\n\n/**\n * Signs an AXIS frame using the Ed25519 algorithm.\n * Automatically handles both raw 32-byte seeds and pkcs8 DER-encoded private keys.\n *\n * @param {AxisFrame} frame - The frame to sign\n * @param {Buffer} privateKey - Ed25519 private key (32-byte raw OR pkcs8 DER)\n * @returns {Buffer} The 64-byte Ed25519 signature\n * @throws {Error} If key format is invalid or signing fail\n */\nexport function signFrame(frame: AxisFrame, privateKey: Buffer): Buffer {\n const payload = computeSignaturePayload(frame);\n\n let keyObject: crypto.KeyObject;\n\n // Check if key is raw 32-byte seed or DER-encoded\n if (privateKey.length === 32) {\n // Raw seed - wrap in pkcs8 DER format\n // pkcs8 prefix for Ed25519: 0x302e020100300506032b657004220420\n const pkcs8Prefix = Buffer.from([\n 0x30, 0x2e, 0x02, 0x01, 0x00, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70,\n 0x04, 0x22, 0x04, 0x20,\n ]);\n const pkcs8Key = Buffer.concat([pkcs8Prefix, privateKey]);\n\n keyObject = crypto.createPrivateKey({\n key: pkcs8Key,\n format: 'der',\n type: 'pkcs8',\n });\n } else {\n // Assume already DER-encoded pkcs8\n keyObject = crypto.createPrivateKey({\n key: privateKey,\n format: 'der',\n type: 'pkcs8',\n });\n }\n\n const signature = crypto.sign(null, payload, keyObject);\n\n if (signature.length !== 64) {\n throw new Error('Ed25519 signature must be 64 bytes');\n }\n\n return signature;\n}\n\n/**\n * Verifies an Ed25519 signature on an AXIS frame.\n * Automatically handles both raw 32-byte public keys and spki DER-encoded public keys.\n *\n * @param {AxisFrame} frame - The frame containing the signature to verify\n * @param {Buffer} publicKey - Ed25519 public key (32-byte raw OR spki DER)\n * @returns {boolean} True if the signature is cryptographically valid\n * @throws {Error} If signature length is invalid\n */\nexport function verifyFrameSignature(\n frame: AxisFrame,\n publicKey: Buffer,\n): boolean {\n if (frame.sig.length === 0) {\n return false; // No signature\n }\n\n if (frame.sig.length !== 64) {\n throw new Error('Ed25519 signature must be 64 bytes');\n }\n\n const payload = computeSignaturePayload(frame);\n\n try {\n let keyObject: crypto.KeyObject;\n\n // Check if key is raw 32-byte or DER-encoded\n if (publicKey.length === 32) {\n // Raw key - wrap in spki DER format\n // spki prefix for Ed25519: 0x302a300506032b6570032100\n const spkiPrefix = Buffer.from([\n 0x30, 0x2a, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70, 0x03, 0x21, 0x00,\n ]);\n const spkiKey = Buffer.concat([spkiPrefix, publicKey]);\n\n keyObject = crypto.createPublicKey({\n key: spkiKey,\n format: 'der',\n type: 'spki',\n });\n } else {\n // Assume already DER-encoded spki\n keyObject = crypto.createPublicKey({\n key: publicKey,\n format: 'der',\n type: 'spki',\n });\n }\n\n const valid = crypto.verify(\n null,\n payload,\n keyObject,\n Buffer.from(frame.sig),\n );\n return valid;\n } catch (error) {\n return false;\n }\n}\n\n/**\n * Generates a new Ed25519 key pair for use with the AXIS protocol.\n * Returns keys in canonical DER format (pkcs8 for private, spki for public).\n *\n * @returns {Object} An object containing the privateKey and publicKey as Buffers\n */\nexport function generateEd25519KeyPair(): {\n privateKey: Buffer;\n publicKey: Buffer;\n} {\n const { privateKey, publicKey } = crypto.generateKeyPairSync('ed25519');\n\n return {\n privateKey: privateKey.export({ type: 'pkcs8', format: 'der' }) as Buffer,\n publicKey: publicKey.export({ type: 'spki', format: 'der' }) as Buffer,\n };\n}\n\n/**\n * Computes a standard SHA-256 hash of the provided data.\n *\n * @param {Buffer | Uint8Array} data - The input data to hash\n * @returns {Buffer} The 32-byte SHA-256 digest\n */\nexport function sha256(data: Buffer | Uint8Array): Buffer {\n return crypto.createHash('sha256').update(data).digest();\n}\n\n/**\n * Computes a hash for an AXIS receipt, optionally chaining it to a previous hash.\n * This is used for generating an immutable transaction chain.\n *\n * @param {Buffer | Uint8Array} receiptBytes - The canonical binary representation of the receipt\n * @param {Buffer | Uint8Array} [prevHash] - The hash of the previous receipt in the chain\n * @returns {Buffer} The 32-byte SHA-256 hash of the receipt (and link)\n */\nexport function computeReceiptHash(\n receiptBytes: Buffer | Uint8Array,\n prevHash?: Buffer | Uint8Array,\n): Buffer {\n const hasher = crypto.createHash('sha256');\n hasher.update(receiptBytes);\n\n if (prevHash && prevHash.length > 0) {\n hasher.update(prevHash);\n }\n\n return hasher.digest();\n}\n","import * as z from 'zod';\n\n/**\n * AxisFrame Schema\n *\n * Defines the logical structure of an AXIS frame using Zod for runtime validation.\n * This is used for internal processing after the low-level binary parsing is complete.\n */\nexport const AxisFrameZ = z.object({\n /** Flag bits for protocol control (e.g., encryption, compression) */\n flags: z.number().int().nonnegative(),\n /** A map of TLV headers where key=Tag and value=BinaryData */\n headers: z.map(\n z.number(),\n z.custom<Uint8Array>((v) => v instanceof Uint8Array),\n ),\n /** The main payload of the frame */\n body: z.custom<Uint8Array>((v) => v instanceof Uint8Array),\n /** The cryptographic signature covering the frame (except the signature itself) */\n sig: z.custom<Uint8Array>((v) => v instanceof Uint8Array),\n});\n\n/**\n * Represents a structured AXIS frame.\n * @typedef {Object} AxisFrame\n */\nexport type AxisFrame = z.infer<typeof AxisFrameZ>;\nexport type AxisBinaryFrame = AxisFrame;\nimport {\n AXIS_MAGIC,\n AXIS_VERSION,\n MAX_BODY_LEN,\n MAX_FRAME_LEN,\n MAX_HDR_LEN,\n MAX_SIG_LEN,\n} from './constants';\nimport { decodeTLVs, encodeTLVs } from './tlv';\nimport { decodeVarint, encodeVarint } from './varint';\n\n/**\n * Encodes a structured AxisFrame into its binary wire representation.\n *\n * **Encoding Steps:**\n * 1. Encodes header TLV map into a single buffer.\n * 2. Validates lengths against MAX_* constants.\n * 3. Encodes lengths (HDR, BODY, SIG) as varints.\n * 4. Assembles the final byte array with magic, version, and flags.\n *\n * @param {AxisFrame} frame - The structured frame to encode\n * @returns {Uint8Array} The full binary frame\n * @throws {Error} If any section exceeds protocol limits\n */\nexport function encodeFrame(frame: AxisFrame): Uint8Array {\n const hdrBytes = encodeTLVs(\n Array.from(frame.headers.entries()).map(([t, v]) => ({\n type: t,\n value: v,\n })),\n );\n\n if (hdrBytes.length > MAX_HDR_LEN) throw new Error('Header too large');\n if (frame.body.length > MAX_BODY_LEN) throw new Error('Body too large');\n if (frame.sig.length > MAX_SIG_LEN) throw new Error('Signature too large');\n\n // Header Len, Body Len, Sig Len\n const hdrLenBytes = encodeVarint(hdrBytes.length);\n const bodyLenBytes = encodeVarint(frame.body.length);\n const sigLenBytes = encodeVarint(frame.sig.length);\n\n const totalLen =\n 5 + // Magic (AXIS1)\n 1 + // Version\n 1 + // Flags\n hdrLenBytes.length +\n bodyLenBytes.length +\n sigLenBytes.length +\n hdrBytes.length +\n frame.body.length +\n frame.sig.length;\n\n if (totalLen > MAX_FRAME_LEN) throw new Error('Total frame too large');\n\n const buf = new Uint8Array(totalLen);\n let offset = 0;\n\n // Magic (AXIS1 - 5 bytes)\n buf.set(AXIS_MAGIC, offset);\n offset += 5;\n\n // Version\n buf[offset++] = AXIS_VERSION;\n\n // Flags\n buf[offset++] = frame.flags;\n\n // Lengths\n buf.set(hdrLenBytes, offset);\n offset += hdrLenBytes.length;\n\n buf.set(bodyLenBytes, offset);\n offset += bodyLenBytes.length;\n\n buf.set(sigLenBytes, offset);\n offset += sigLenBytes.length;\n\n // Payloads\n buf.set(hdrBytes, offset);\n offset += hdrBytes.length;\n\n buf.set(frame.body, offset);\n offset += frame.body.length;\n\n buf.set(frame.sig, offset);\n offset += frame.sig.length;\n\n return buf;\n}\n\n/**\n * Decodes a binary buffer into a structured AxisFrame with strict validation.\n *\n * @param {Uint8Array} buf - Raw bytes from the wire\n * @returns {AxisFrame} The parsed and validated frame\n * @throws {Error} If magic, version, or lengths are invalid\n */\nexport function decodeFrame(buf: Uint8Array): AxisFrame {\n let offset = 0;\n\n // 1. Magic (AXIS1 - 5 bytes)\n if (offset + 5 > buf.length) throw new Error('Packet too short');\n for (let i = 0; i < 5; i++) {\n if (buf[offset + i] !== AXIS_MAGIC[i]) throw new Error('Invalid Magic');\n }\n offset += 5;\n\n // 2. Version\n const ver = buf[offset++];\n if (ver !== AXIS_VERSION) throw new Error(`Unsupported version: ${ver}`);\n\n // 3. Flags\n const flags = buf[offset++];\n\n // 4. Lengths\n const { value: hdrLen, length: hlLen } = decodeVarint(buf, offset);\n offset += hlLen;\n if (hdrLen > MAX_HDR_LEN) throw new Error('Header limit exceeded');\n\n const { value: bodyLen, length: blLen } = decodeVarint(buf, offset);\n offset += blLen;\n if (bodyLen > MAX_BODY_LEN) throw new Error('Body limit exceeded');\n\n const { value: sigLen, length: slLen } = decodeVarint(buf, offset);\n offset += slLen;\n if (sigLen > MAX_SIG_LEN) throw new Error('Signature limit exceeded');\n\n // 5. Extract Bytes\n if (offset + hdrLen + bodyLen + sigLen > buf.length) {\n throw new Error('Frame truncated');\n }\n\n const hdrBytes = buf.slice(offset, offset + hdrLen);\n offset += hdrLen;\n\n const bodyBytes = buf.slice(offset, offset + bodyLen);\n offset += bodyLen;\n\n const sigBytes = buf.slice(offset, offset + sigLen);\n offset += sigLen;\n\n // 6. Decode Header TLVs\n const headers = decodeTLVs(hdrBytes);\n\n return {\n flags,\n headers,\n body: bodyBytes,\n sig: sigBytes,\n };\n}\n\n/**\n * Helper to get canonical bytes for signing.\n * SigTarget = All bytes up to SigLen, with SigLen=0, and no SigBytes.\n */\nexport function getSignTarget(frame: AxisFrame): Uint8Array {\n // Re-encode frame but with empty signature\n // Note: This is efficient enough for v1 (tens of KB).\n return encodeFrame({\n ...frame,\n sig: new Uint8Array(0),\n });\n}\n","// ats1.constants.ts\n\n// Header TLV tags (hdr TLVs)\nexport const ATS1_HDR = {\n INTENT_ID: 1, // uvarint\n ACTOR_KEY_ID: 2, // bytes (key fingerprint / credentialId hash)\n CAPSULE_ID: 3, // bytes or varint\n NONCE: 4, // 16 bytes\n TS_MS: 5, // u64be (8)\n SCHEMA_ID: 6, // uvarint\n BODY_HASH: 7, // 32 bytes (sha256)\n TRACE_ID: 8, // 16 bytes\n} as const;\n\n// Schema IDs (body TLVs meaning depends on schema)\nexport const ATS1_SCHEMA = {\n PASSKEY_LOGIN_OPTIONS_REQ: 2001,\n PASSKEY_LOGIN_OPTIONS_RES: 2002,\n\n PASSKEY_LOGIN_VERIFY_REQ: 2011,\n PASSKEY_LOGIN_VERIFY_RES: 2012,\n\n PASSKEY_REGISTER_OPTIONS_REQ: 2021,\n PASSKEY_REGISTER_OPTIONS_RES: 2022,\n\n PASSKEY_REGISTER_VERIFY_REQ: 2031,\n PASSKEY_REGISTER_VERIFY_RES: 2032,\n} as const;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * ATS1 (AXIS-TLV Schema v1) — TypeScript Encoder/Decoder\n * - Canonical TLV: [TAG(uvarint)][LEN(uvarint)][VALUE(bytes)]\n * - Canonical ordering: ascending TAG\n * - Minimal varint encoding enforced in decoder\n * - Strict schema validation (unknown tags rejected by default)\n * - Nested TLV streams supported\n *\n * Node.js: uses crypto for SHA-256\n */\n\nimport { createHash, randomBytes } from 'crypto';\n\n// -----------------------------\n// Types\n// -----------------------------\n\nexport type Ats1FieldType = 'bytes' | 'utf8' | 'uvarint' | 'u64be' | 'nested';\n\nexport type Ats1FieldDescriptor = {\n tag: number;\n name: string;\n type: Ats1FieldType;\n required?: boolean;\n repeated?: boolean;\n nestedSchema?: Ats1SchemaDescriptor; // required if type === 'nested'\n maxLen?: number; // optional per-field limit (bytes length)\n};\n\nexport type Ats1SchemaDescriptor = {\n schemaId: number;\n name: string;\n strict: boolean; // if true: reject unknown tags\n maxNestingDepth: number; // e.g. 4\n maxBodyBytes?: number; // optional overall body limit\n fields: Ats1FieldDescriptor[];\n};\n\nexport type DecodedTlv = { tag: number; value: Buffer };\n\nexport type DecodedTlvMap = Map<number, Buffer[]>; // tag -> list of values\n\nexport type SensorInputLike = {\n hdrTLVs: DecodedTlvMap;\n bodyTLVs: DecodedTlvMap;\n schemaId: number;\n intentId: number;\n};\n\n// -----------------------------\n// Limits (sane defaults)\n// -----------------------------\n\nexport type Ats1Limits = {\n maxVarintBytes: number; // e.g. 10 for u64\n maxTlvCount: number; // e.g. 512\n maxValueBytes: number; // e.g. 1MB\n maxNestingDepth: number; // e.g. 4\n};\n\nexport const DEFAULT_LIMITS: Ats1Limits = {\n maxVarintBytes: 10,\n maxTlvCount: 512,\n maxValueBytes: 1_048_576, // 1 MiB\n maxNestingDepth: 4,\n};\n\n// -----------------------------\n// Varint (unsigned LEB128)\n// -----------------------------\n\nexport function encodeUVarint(n: number | bigint): Buffer {\n let x = typeof n === 'bigint' ? n : BigInt(n);\n if (x < 0n) throw new Error('encodeUVarint: negative not allowed');\n\n const out: number[] = [];\n while (x >= 0x80n) {\n out.push(Number((x & 0x7fn) | 0x80n));\n x >>= 7n;\n }\n out.push(Number(x));\n return Buffer.from(out);\n}\n\nexport function decodeUVarint(\n buf: Buffer,\n offset: number,\n limits: Ats1Limits = DEFAULT_LIMITS,\n): { value: bigint; offset: number; bytesRead: number } {\n let x = 0n;\n let shift = 0n;\n const start = offset;\n\n for (let i = 0; i < limits.maxVarintBytes; i++) {\n if (offset >= buf.length) throw new Error('decodeUVarint: truncated');\n const b = buf[offset++];\n x |= BigInt(b & 0x7f) << shift;\n\n if ((b & 0x80) === 0) {\n const bytesRead = offset - start;\n\n // Minimal-encoding check:\n // Re-encode and compare exact bytes.\n const re = encodeUVarint(x);\n const original = buf.subarray(start, offset);\n if (!re.equals(original))\n throw new Error('decodeUVarint: non-minimal varint');\n\n return { value: x, offset, bytesRead };\n }\n\n shift += 7n;\n }\n\n throw new Error('decodeUVarint: too long');\n}\n\n// -----------------------------\n// Primitive encoders/decoders\n// -----------------------------\n\nexport function encodeU64BE(n: bigint): Buffer {\n if (n < 0n) throw new Error('encodeU64BE: negative not allowed');\n const b = Buffer.alloc(8);\n b.writeBigUInt64BE(n, 0);\n return b;\n}\n\nexport function decodeU64BE(buf: Buffer): bigint {\n if (buf.length !== 8) throw new Error('decodeU64BE: length must be 8');\n return buf.readBigUInt64BE(0);\n}\n\nexport function sha256(data: Buffer): Buffer {\n return createHash('sha256').update(data).digest();\n}\n\n// -----------------------------\n// TLV encode/decode\n// -----------------------------\n\nexport function encodeTLV(tag: number, value: Buffer): Buffer {\n if (!Number.isInteger(tag) || tag <= 0)\n throw new Error('encodeTLV: tag must be positive int');\n const t = encodeUVarint(tag);\n const l = encodeUVarint(value.length);\n return Buffer.concat([t, l, value]);\n}\n\nexport function encodeTLVStreamCanonical(entries: DecodedTlv[]): Buffer {\n // Canonical sort ascending tag\n const sorted = [...entries].sort((a, b) => a.tag - b.tag);\n\n // Duplicate tags are allowed only if the schema says repeated.\n // This function does not enforce schema; caller should.\n const parts: Buffer[] = [];\n for (const e of sorted) parts.push(encodeTLV(e.tag, e.value));\n return Buffer.concat(parts);\n}\n\nexport function decodeTLVStream(\n stream: Buffer,\n limits: Ats1Limits = DEFAULT_LIMITS,\n): DecodedTlv[] {\n const out: DecodedTlv[] = [];\n let off = 0;\n\n while (off < stream.length) {\n if (out.length >= limits.maxTlvCount)\n throw new Error('decodeTLVStream: too many TLVs');\n\n const tagRes = decodeUVarint(stream, off, limits);\n const tag = Number(tagRes.value);\n off = tagRes.offset;\n\n const lenRes = decodeUVarint(stream, off, limits);\n const len = Number(lenRes.value);\n off = lenRes.offset;\n\n if (len < 0) throw new Error('decodeTLVStream: negative length');\n if (len > limits.maxValueBytes)\n throw new Error('decodeTLVStream: value too large');\n if (off + len > stream.length)\n throw new Error('decodeTLVStream: truncated value');\n\n const value = stream.subarray(off, off + len);\n off += len;\n\n out.push({ tag, value: Buffer.from(value) });\n }\n\n // Canonical check: must be sorted ascending tag.\n for (let i = 1; i < out.length; i++) {\n if (out[i].tag < out[i - 1].tag)\n throw new Error('decodeTLVStream: non-canonical tag order');\n }\n\n return out;\n}\n\nexport function tlvsToMap(entries: DecodedTlv[]): DecodedTlvMap {\n const m: DecodedTlvMap = new Map();\n for (const e of entries) {\n const arr = m.get(e.tag) ?? [];\n arr.push(e.value);\n m.set(e.tag, arr);\n }\n return m;\n}\n\n// -----------------------------\n// Schema validation + object \\u2194 TLV mapping\n// -----------------------------\n\ntype LogicalBody = { schemaId: number; fields: Record<string, any> };\n\nexport function validateTLVsAgainstSchema(\n schema: Ats1SchemaDescriptor,\n tlvs: DecodedTlv[],\n depth = 0,\n limits: Ats1Limits = DEFAULT_LIMITS,\n): void {\n if (depth > Math.min(schema.maxNestingDepth, limits.maxNestingDepth)) {\n throw new Error('validateTLVsAgainstSchema: nesting depth exceeded');\n }\n\n if (schema.maxBodyBytes && tlvsBytes(tlvs) > schema.maxBodyBytes) {\n throw new Error('validateTLVsAgainstSchema: body too large');\n }\n\n const byTag = new Map<number, DecodedTlv[]>();\n for (const t of tlvs) {\n if (!byTag.has(t.tag)) byTag.set(t.tag, []);\n byTag.get(t.tag)!.push(t);\n }\n\n const fieldByTag = new Map(schema.fields.map((f) => [f.tag, f] as const));\n\n // Unknown tags\n if (schema.strict) {\n for (const tag of byTag.keys()) {\n if (!fieldByTag.has(tag))\n throw new Error(`validateTLVsAgainstSchema: unknown tag ${tag}`);\n }\n }\n\n // Required fields & repetition rules\n for (const f of schema.fields) {\n const vals = byTag.get(f.tag) ?? [];\n if (f.required && vals.length === 0)\n throw new Error(`validateTLVsAgainstSchema: missing ${f.name}`);\n\n if (!f.repeated && vals.length > 1) {\n throw new Error(\n `validateTLVsAgainstSchema: duplicate tag not allowed for ${f.name}`,\n );\n }\n\n // Per-field max length\n if (typeof f.maxLen === 'number') {\n for (const v of vals) {\n if (v.value.length > f.maxLen)\n throw new Error(`validateTLVsAgainstSchema: ${f.name} too long`);\n }\n }\n\n // Type checks (lightweight)\n for (const v of vals) {\n switch (f.type) {\n case 'u64be':\n if (v.value.length !== 8)\n throw new Error(\n `validateTLVsAgainstSchema: ${f.name} u64be must be 8 bytes`,\n );\n break;\n case 'nested': {\n if (!f.nestedSchema)\n throw new Error(\n `validateTLVsAgainstSchema: ${f.name} missing nestedSchema`,\n );\n const nestedTlvs = decodeTLVStream(v.value, limits);\n validateTLVsAgainstSchema(\n f.nestedSchema,\n nestedTlvs,\n depth + 1,\n limits,\n );\n break;\n }\n default:\n // bytes/utf8/uvarint are accepted structurally; deeper validation can be added if you want.\n break;\n }\n }\n }\n}\n\nfunction tlvsBytes(tlvs: DecodedTlv[]): number {\n // approximate encoded size if re-encoded\n let n = 0;\n for (const t of tlvs) {\n n +=\n encodeUVarint(t.tag).length +\n encodeUVarint(t.value.length).length +\n t.value.length;\n }\n return n;\n}\n\nexport function logicalBodyToTLVs(\n schema: Ats1SchemaDescriptor,\n body: LogicalBody,\n limits: Ats1Limits = DEFAULT_LIMITS,\n): DecodedTlv[] {\n if (body.schemaId !== schema.schemaId)\n throw new Error('logicalBodyToTLVs: schemaId mismatch');\n\n const fieldsByName = new Map(schema.fields.map((f) => [f.name, f] as const));\n const tlvs: DecodedTlv[] = [];\n\n for (const [name, val] of Object.entries(body.fields ?? {})) {\n const f = fieldsByName.get(name);\n if (!f) {\n if (schema.strict)\n throw new Error(`logicalBodyToTLVs: unknown field ${name}`);\n continue;\n }\n\n const pushOne = (v: any) => {\n const valueBuf = encodeFieldValue(f, v, limits);\n if (valueBuf.length > limits.maxValueBytes)\n throw new Error('logicalBodyToTLVs: value too large');\n tlvs.push({ tag: f.tag, value: valueBuf });\n };\n\n if (f.repeated) {\n if (!Array.isArray(val))\n throw new Error(\n `logicalBodyToTLVs: repeated field ${name} must be array`,\n );\n for (const item of val) pushOne(item);\n } else {\n pushOne(val);\n }\n }\n\n // Validate required + duplicates + nested schema correctness\n // Validation also enforces canonical ordering check only after encoding/decoding;\n // here we validate semantics.\n validateTLVsAgainstSchema(schema, tlvs, 0, limits);\n\n // NOTE: canonical ordering will be applied in encodeTLVStreamCanonical()\n return tlvs;\n}\n\nfunction encodeFieldValue(\n f: Ats1FieldDescriptor,\n val: any,\n limits: Ats1Limits,\n): Buffer {\n switch (f.type) {\n case 'bytes':\n if (Buffer.isBuffer(val)) return Buffer.from(val);\n if (val instanceof Uint8Array) return Buffer.from(val);\n throw new Error(`encodeFieldValue: ${f.name} expects bytes`);\n case 'utf8':\n if (typeof val !== 'string')\n throw new Error(`encodeFieldValue: ${f.name} expects string`);\n return Buffer.from(val, 'utf8');\n case 'uvarint':\n if (typeof val !== 'number' && typeof val !== 'bigint')\n throw new Error(`encodeFieldValue: ${f.name} expects number/bigint`);\n return encodeUVarint(val);\n case 'u64be':\n if (typeof val !== 'bigint')\n throw new Error(`encodeFieldValue: ${f.name} expects bigint`);\n return encodeU64BE(val);\n case 'nested': {\n if (!f.nestedSchema)\n throw new Error(`encodeFieldValue: ${f.name} missing nestedSchema`);\n // Accept nested logical object in the form { fields: {...} } or direct record\n const nestedFields =\n val && typeof val === 'object' && 'fields' in val\n ? (val as any).fields\n : val;\n if (!nestedFields || typeof nestedFields !== 'object')\n throw new Error(`encodeFieldValue: ${f.name} expects object`);\n const nestedBody: LogicalBody = {\n schemaId: f.nestedSchema.schemaId,\n fields: nestedFields,\n };\n const nestedTlvs = logicalBodyToTLVs(f.nestedSchema, nestedBody, limits);\n const nestedBytes = encodeTLVStreamCanonical(nestedTlvs);\n // Re-parse to ensure canonical encoding would pass, and validate\n const re = decodeTLVStream(nestedBytes, limits);\n validateTLVsAgainstSchema(f.nestedSchema, re, 1, limits);\n return nestedBytes;\n }\n default:\n throw new Error(`encodeFieldValue: unsupported type ${(f as any).type}`);\n }\n}\n\nexport function tlvsToLogicalBody(\n schema: Ats1SchemaDescriptor,\n tlvs: DecodedTlv[],\n limits: Ats1Limits = DEFAULT_LIMITS,\n): LogicalBody {\n // TLVs must already be decoded and canonical-checked\n validateTLVsAgainstSchema(schema, tlvs, 0, limits);\n\n const fields: Record<string, any> = {};\n const fieldByTag = new Map(schema.fields.map((f) => [f.tag, f] as const));\n\n for (const t of tlvs) {\n const f = fieldByTag.get(t.tag);\n if (!f) {\n if (schema.strict)\n throw new Error(`tlvsToLogicalBody: unknown tag ${t.tag}`);\n continue;\n }\n\n const decoded = decodeFieldValue(f, t.value, limits);\n\n if (f.repeated) {\n if (!Array.isArray(fields[f.name])) fields[f.name] = [];\n fields[f.name].push(decoded);\n } else {\n fields[f.name] = decoded;\n }\n }\n\n return { schemaId: schema.schemaId, fields };\n}\n\nfunction decodeFieldValue(\n f: Ats1FieldDescriptor,\n value: Buffer,\n limits: Ats1Limits,\n): any {\n switch (f.type) {\n case 'bytes':\n return Buffer.from(value);\n case 'utf8':\n return value.toString('utf8');\n case 'uvarint': {\n const r = decodeUVarint(value, 0, limits);\n if (r.offset !== value.length)\n throw new Error(\n `decodeFieldValue: ${f.name} uvarint has trailing bytes`,\n );\n // return as number when safe, else bigint\n const asNum = Number(r.value);\n return Number.isSafeInteger(asNum) ? asNum : r.value;\n }\n case 'u64be':\n return decodeU64BE(value);\n case 'nested': {\n if (!f.nestedSchema)\n throw new Error(`decodeFieldValue: ${f.name} missing nestedSchema`);\n const nestedTlvs = decodeTLVStream(value, limits);\n // nested schema validation is called by validateTLVsAgainstSchema already,\n // but we decode again safely here.\n const nestedBody = tlvsToLogicalBody(f.nestedSchema, nestedTlvs, limits);\n return nestedBody.fields; // return the record by default\n }\n default:\n throw new Error(`decodeFieldValue: unsupported type ${(f as any).type}`);\n }\n}\n\n// -----------------------------\n// AXIS HDR tags (ATS1 header TLVs)\n// -----------------------------\n\nexport const HDR_TAGS = {\n intent_id: 1,\n actor_key_id: 2,\n capsule_id: 3,\n nonce: 4,\n ts_ms: 5,\n schema_id: 6,\n body_hash: 7,\n trace_id: 8,\n} as const;\n\nexport type AxisHeaderLogical = {\n intentId: number;\n actorKeyId: Uint8Array;\n capsuleId?: Uint8Array;\n nonce: Uint8Array; // 16 bytes\n tsMs: bigint; // ms\n schemaId: number;\n bodyHash: Uint8Array; // 32 bytes\n traceId?: Uint8Array; // 16 bytes\n version?: number; // optional\n headerHash?: Uint8Array; // 32 bytes\n headerTlvs?: DecodedTlv[]; // optional\n bodyTlvs?: DecodedTlv[]; // optional\n};\n\nexport type AxisLogicalRequest = {\n hdr: AxisHeaderLogical;\n body: LogicalBody;\n};\n\nexport function encodeAxisHeaderToTLVs(hdr: AxisHeaderLogical): DecodedTlv[] {\n if (hdr.nonce.byteLength !== 16)\n throw new Error('encodeAxisHeaderToTLVs: nonce must be 16 bytes');\n if (hdr.bodyHash.byteLength !== 32)\n throw new Error('encodeAxisHeaderToTLVs: bodyHash must be 32 bytes');\n if (hdr.traceId && hdr.traceId.byteLength !== 16)\n throw new Error('encodeAxisHeaderToTLVs: traceId must be 16 bytes');\n\n const tlvs: DecodedTlv[] = [\n { tag: HDR_TAGS.intent_id, value: encodeUVarint(hdr.intentId) },\n { tag: HDR_TAGS.actor_key_id, value: Buffer.from(hdr.actorKeyId) },\n { tag: HDR_TAGS.nonce, value: Buffer.from(hdr.nonce) },\n { tag: HDR_TAGS.ts_ms, value: encodeU64BE(hdr.tsMs) },\n { tag: HDR_TAGS.schema_id, value: encodeUVarint(hdr.schemaId) },\n { tag: HDR_TAGS.body_hash, value: Buffer.from(hdr.bodyHash) },\n ];\n\n if (hdr.capsuleId)\n tlvs.push({ tag: HDR_TAGS.capsule_id, value: Buffer.from(hdr.capsuleId) });\n if (hdr.traceId)\n tlvs.push({ tag: HDR_TAGS.trace_id, value: Buffer.from(hdr.traceId) });\n\n return tlvs;\n}\n\nexport function decodeAxisHeaderFromTLVs(\n hdrTlvs: DecodedTlv[],\n limits: Ats1Limits = DEFAULT_LIMITS,\n): AxisHeaderLogical {\n // hdr TLVs must be canonical-ordered (enforced by decodeTLVStream) and duplicates only if allowed.\n const m = tlvsToMap(hdrTlvs);\n\n const get1 = (tag: number) => {\n const arr = m.get(tag);\n if (!arr || arr.length !== 1)\n throw new Error(\n `decodeAxisHeaderFromTLVs: missing/dup header tag ${tag}`,\n );\n return arr[0];\n };\n const getOpt1 = (tag: number) => {\n const arr = m.get(tag);\n if (!arr) return undefined;\n if (arr.length !== 1)\n throw new Error(`decodeAxisHeaderFromTLVs: dup header tag ${tag}`);\n return arr[0];\n };\n\n const intentIdVar = decodeUVarint(get1(HDR_TAGS.intent_id), 0, limits);\n if (intentIdVar.offset !== get1(HDR_TAGS.intent_id).length)\n throw new Error('decodeAxisHeaderFromTLVs: intent_id trailing bytes');\n\n const schemaIdVar = decodeUVarint(get1(HDR_TAGS.schema_id), 0, limits);\n if (schemaIdVar.offset !== get1(HDR_TAGS.schema_id).length)\n throw new Error('decodeAxisHeaderFromTLVs: schema_id trailing bytes');\n\n const ts = decodeU64BE(get1(HDR_TAGS.ts_ms));\n\n const nonce = get1(HDR_TAGS.nonce);\n if (nonce.length !== 16)\n throw new Error('decodeAxisHeaderFromTLVs: nonce must be 16 bytes');\n\n const bodyHash = get1(HDR_TAGS.body_hash);\n if (bodyHash.length !== 32)\n throw new Error('decodeAxisHeaderFromTLVs: body_hash must be 32 bytes');\n\n const trace = getOpt1(HDR_TAGS.trace_id);\n if (trace && trace.length !== 16)\n throw new Error('decodeAxisHeaderFromTLVs: trace_id must be 16 bytes');\n\n return {\n intentId: Number(intentIdVar.value),\n actorKeyId: Buffer.from(get1(HDR_TAGS.actor_key_id)),\n capsuleId: getOpt1(HDR_TAGS.capsule_id)\n ? Buffer.from(getOpt1(HDR_TAGS.capsule_id)!)\n : undefined,\n nonce: Buffer.from(nonce),\n tsMs: ts,\n schemaId: Number(schemaIdVar.value),\n bodyHash: Buffer.from(bodyHash),\n traceId: trace ? Buffer.from(trace) : undefined,\n };\n}\n\n// -----------------------------\n// Encode/Decode AXIS request body + hdr with body_hash binding\n// -----------------------------\n\nexport function encodeAxisRequestBinary(\n schema: Ats1SchemaDescriptor,\n req: Omit<AxisLogicalRequest, 'hdr'> & {\n hdr: Omit<AxisHeaderLogical, 'bodyHash'>;\n },\n limits: Ats1Limits = DEFAULT_LIMITS,\n): { hdrBytes: Buffer; bodyBytes: Buffer; bodyHash: Buffer } {\n // 1) encode body TLVs\n const bodyTlvs = logicalBodyToTLVs(schema, req.body, limits);\n const bodyBytes = encodeTLVStreamCanonical(bodyTlvs);\n\n // 2) compute body hash\n const bodyHash = sha256(bodyBytes);\n\n // 3) encode hdr TLVs (with computed hash)\n const hdr: AxisHeaderLogical = {\n ...req.hdr,\n schemaId: schema.schemaId,\n bodyHash,\n };\n const hdrTlvs = encodeAxisHeaderToTLVs(hdr);\n const hdrBytes = encodeTLVStreamCanonical(hdrTlvs);\n\n return { hdrBytes, bodyBytes, bodyHash };\n}\n\nexport function decodeAxisRequestBinary(\n schema: Ats1SchemaDescriptor,\n hdrBytes: Buffer,\n bodyBytes: Buffer,\n limits: Ats1Limits = DEFAULT_LIMITS,\n): { hdr: AxisHeaderLogical; body: LogicalBody; sensorInput: SensorInputLike } {\n const hdrTlvs = decodeTLVStream(hdrBytes, limits);\n const bodyTlvs = decodeTLVStream(bodyBytes, limits);\n\n const hdr = decodeAxisHeaderFromTLVs(hdrTlvs, limits);\n\n // Schema binding check\n if (hdr.schemaId !== schema.schemaId)\n throw new Error('decodeAxisRequestBinary: schemaId mismatch');\n\n // body_hash check\n const bh = sha256(bodyBytes);\n if (!Buffer.from(hdr.bodyHash).equals(bh))\n throw new Error('decodeAxisRequestBinary: body_hash mismatch');\n\n // validate + decode body\n const body = tlvsToLogicalBody(schema, bodyTlvs, limits);\n\n const sensorInput: SensorInputLike = {\n hdrTLVs: tlvsToMap(hdrTlvs),\n bodyTLVs: tlvsToMap(bodyTlvs),\n schemaId: hdr.schemaId,\n intentId: hdr.intentId,\n };\n\n return { hdr, body, sensorInput };\n}\n\n// -----------------------------\n// Example Schemas\n// -----------------------------\n\nexport const Schema3100_DeviceContext: Ats1SchemaDescriptor = {\n schemaId: 3100,\n name: 'device.context',\n strict: true,\n maxNestingDepth: 4,\n fields: [\n { tag: 1, name: 'deviceId', type: 'bytes', required: true, maxLen: 128 },\n { tag: 2, name: 'os', type: 'utf8', required: true, maxLen: 64 },\n { tag: 3, name: 'hw', type: 'utf8', required: true, maxLen: 64 },\n ],\n};\n\nexport const Schema2001_PasskeyLoginOptionsReq: Ats1SchemaDescriptor = {\n schemaId: 2001,\n name: 'axis.auth.passkey.login.options.req',\n strict: true,\n maxNestingDepth: 4,\n fields: [\n { tag: 1, name: 'username', type: 'utf8', required: true, maxLen: 128 },\n ],\n};\n\nexport const Schema4001_LoginWithDeviceReq: Ats1SchemaDescriptor = {\n schemaId: 4001,\n name: 'axis.auth.login.with_device.req',\n strict: true,\n maxNestingDepth: 4,\n fields: [\n { tag: 1, name: 'username', type: 'utf8', required: true, maxLen: 128 },\n {\n tag: 2,\n name: 'device',\n type: 'nested',\n required: true,\n nestedSchema: Schema3100_DeviceContext,\n },\n ],\n};\n","import { ATS1_HDR, ATS1_SCHEMA } from './ats1.constants';\nimport * as ats1 from './ats1';\n\n/**\n * Build canonical hdr for any request using ATS1 codec.\n */\nexport function buildAts1Hdr(params: {\n intentId: number;\n schemaId: number;\n actorKeyId?: Buffer;\n capsuleId?: Buffer;\n traceId?: Buffer;\n tsMs?: bigint;\n nonce?: Buffer;\n bodyHash?: Buffer;\n}): Buffer {\n const hdr: ats1.AxisHeaderLogical = {\n intentId: params.intentId,\n schemaId: params.schemaId,\n actorKeyId: params.actorKeyId ?? Buffer.alloc(0),\n capsuleId: params.capsuleId,\n nonce: params.nonce ?? require('crypto').randomBytes(16),\n tsMs: params.tsMs ?? BigInt(Date.now()),\n bodyHash: params.bodyHash ?? Buffer.alloc(32),\n traceId: params.traceId,\n };\n\n const tlvs = ats1.encodeAxisHeaderToTLVs(hdr);\n return ats1.encodeTLVStreamCanonical(tlvs);\n}\n\n/**\n * PASSKEY: login.options.req\n * schema 2001 body:\n * - (1) username: utf8\n */\nexport function packPasskeyLoginOptionsReq(params: {\n intentId: number;\n username: string;\n actorKeyId?: Buffer;\n capsuleId?: Buffer;\n traceId?: Buffer;\n}) {\n const bodyTlvs = ats1.logicalBodyToTLVs(\n ats1.Schema2001_PasskeyLoginOptionsReq,\n {\n schemaId: ATS1_SCHEMA.PASSKEY_LOGIN_OPTIONS_REQ,\n fields: { username: params.username },\n },\n );\n const body = ats1.encodeTLVStreamCanonical(bodyTlvs);\n const bodyHash = ats1.sha256(body);\n\n const hdr = buildAts1Hdr({\n intentId: params.intentId,\n schemaId: ATS1_SCHEMA.PASSKEY_LOGIN_OPTIONS_REQ,\n actorKeyId: params.actorKeyId,\n capsuleId: params.capsuleId,\n traceId: params.traceId,\n bodyHash,\n });\n\n return { hdr, body };\n}\n\nexport function unpackPasskeyLoginOptionsReq(body: Buffer) {\n const tlvs = ats1.decodeTLVStream(body);\n const decoded = ats1.tlvsToLogicalBody(\n ats1.Schema2001_PasskeyLoginOptionsReq,\n tlvs,\n );\n return { username: decoded.fields.username as string };\n}\n\n/**\n * Defined schemas for passkey operations\n */\nexport const Schema2021_PasskeyRegisterOptionsReq: ats1.Ats1SchemaDescriptor = {\n schemaId: ATS1_SCHEMA.PASSKEY_REGISTER_OPTIONS_REQ,\n name: 'axis.auth.passkey.register.options.req',\n strict: true,\n maxNestingDepth: 4,\n fields: [\n { tag: 1, name: 'username', type: 'utf8', required: true, maxLen: 128 },\n ],\n};\n\nexport const Schema2011_PasskeyLoginVerifyReq: ats1.Ats1SchemaDescriptor = {\n schemaId: ATS1_SCHEMA.PASSKEY_LOGIN_VERIFY_REQ,\n name: 'axis.auth.passkey.login.verify.req',\n strict: true,\n maxNestingDepth: 4,\n fields: [\n { tag: 1, name: 'username', type: 'utf8', required: true, maxLen: 128 },\n {\n tag: 2,\n name: 'credentialId',\n type: 'bytes',\n required: true,\n maxLen: 1024,\n },\n {\n tag: 3,\n name: 'clientDataJSON',\n type: 'bytes',\n required: true,\n maxLen: 4096,\n },\n {\n tag: 4,\n name: 'authenticatorData',\n type: 'bytes',\n required: true,\n maxLen: 1024,\n },\n { tag: 5, name: 'signature', type: 'bytes', required: true, maxLen: 1024 },\n { tag: 6, name: 'userHandle', type: 'bytes', required: false, maxLen: 128 },\n ],\n};\n\n/**\n * PASSKEY: register.options.req\n */\nexport function packPasskeyRegisterOptionsReq(params: {\n intentId: number;\n username: string;\n actorKeyId?: Buffer;\n traceId?: Buffer;\n}) {\n const bodyTlvs = ats1.logicalBodyToTLVs(\n Schema2021_PasskeyRegisterOptionsReq,\n {\n schemaId: ATS1_SCHEMA.PASSKEY_REGISTER_OPTIONS_REQ,\n fields: { username: params.username },\n },\n );\n const body = ats1.encodeTLVStreamCanonical(bodyTlvs);\n const bodyHash = ats1.sha256(body);\n\n const hdr = buildAts1Hdr({\n intentId: params.intentId,\n schemaId: ATS1_SCHEMA.PASSKEY_REGISTER_OPTIONS_REQ,\n actorKeyId: params.actorKeyId,\n traceId: params.traceId,\n bodyHash,\n });\n\n return { hdr, body };\n}\n\nexport function unpackPasskeyRegisterOptionsReq(body: Buffer) {\n const tlvs = ats1.decodeTLVStream(body);\n const decoded = ats1.tlvsToLogicalBody(\n Schema2021_PasskeyRegisterOptionsReq,\n tlvs,\n );\n return { username: decoded.fields.username as string };\n}\n\n/**\n * PASSKEY: login.verify.req\n */\nexport function packPasskeyLoginVerifyReq(params: {\n intentId: number;\n username: string;\n credentialId: Buffer;\n clientDataJSON: Buffer;\n authenticatorData: Buffer;\n signature: Buffer;\n userHandle?: Buffer;\n actorKeyId?: Buffer;\n traceId?: Buffer;\n}) {\n const bodyTlvs = ats1.logicalBodyToTLVs(Schema2011_PasskeyLoginVerifyReq, {\n schemaId: ATS1_SCHEMA.PASSKEY_LOGIN_VERIFY_REQ,\n fields: {\n username: params.username,\n credentialId: params.credentialId,\n clientDataJSON: params.clientDataJSON,\n authenticatorData: params.authenticatorData,\n signature: params.signature,\n userHandle: params.userHandle,\n },\n });\n\n const body = ats1.encodeTLVStreamCanonical(bodyTlvs);\n const bodyHash = ats1.sha256(body);\n\n const hdr = buildAts1Hdr({\n intentId: params.intentId,\n schemaId: ATS1_SCHEMA.PASSKEY_LOGIN_VERIFY_REQ,\n actorKeyId: params.actorKeyId,\n traceId: params.traceId,\n bodyHash,\n });\n\n return { hdr, body };\n}\n\nexport function unpackPasskeyLoginVerifyReq(body: Buffer) {\n const tlvs = ats1.decodeTLVStream(body);\n const decoded = ats1.tlvsToLogicalBody(\n Schema2011_PasskeyLoginVerifyReq,\n tlvs,\n );\n const f = decoded.fields;\n\n return {\n username: f.username as string,\n credentialId: f.credentialId as Buffer,\n clientDataJSON: f.clientDataJSON as Buffer,\n authenticatorData: f.authenticatorData as Buffer,\n signature: f.signature as Buffer,\n userHandle: f.userHandle as Buffer | undefined,\n };\n}\n\n// ========================================\n// Response Schemas\n// ========================================\n\n/**\n * Schema 2002: Passkey Login Options Response\n * - (1) challenge: bytes\n * - (2) timeout: uvarint (ms)\n * - (3) rpId: utf8\n * - (4) allowCredentials: bytes (nested TLV array, each item is id+type+transports)\n * - (5) userVerification: utf8\n */\nexport const Schema2002_PasskeyLoginOptionsRes: ats1.Ats1SchemaDescriptor = {\n schemaId: ATS1_SCHEMA.PASSKEY_LOGIN_OPTIONS_RES,\n name: 'axis.auth.passkey.login.options.res',\n strict: false, // allow extra fields from WebAuthn library\n maxNestingDepth: 4,\n fields: [\n { tag: 1, name: 'challenge', type: 'utf8', required: true }, // base64url string\n { tag: 2, name: 'timeout', type: 'uvarint', required: false },\n { tag: 3, name: 'rpId', type: 'utf8', required: false },\n { tag: 4, name: 'userVerification', type: 'utf8', required: false },\n { tag: 5, name: 'allowCredentialsJson', type: 'utf8', required: false }, // JSON array for simplicity\n ],\n};\n\nexport function packPasskeyLoginOptionsRes(params: {\n challenge: string;\n timeout?: number;\n rpId?: string;\n userVerification?: string;\n allowCredentials?: { id: string; type: string; transports?: string[] }[];\n}): Buffer {\n const fields: Record<string, any> = {\n challenge: params.challenge,\n };\n if (params.timeout !== undefined) fields.timeout = params.timeout;\n if (params.rpId) fields.rpId = params.rpId;\n if (params.userVerification)\n fields.userVerification = params.userVerification;\n if (params.allowCredentials)\n fields.allowCredentialsJson = JSON.stringify(params.allowCredentials);\n\n const bodyTlvs = ats1.logicalBodyToTLVs(Schema2002_PasskeyLoginOptionsRes, {\n schemaId: ATS1_SCHEMA.PASSKEY_LOGIN_OPTIONS_RES,\n fields,\n });\n return ats1.encodeTLVStreamCanonical(bodyTlvs);\n}\n\n/**\n * Schema 2012: Passkey Login Verify Response\n * - (1) actorId: utf8\n * - (2) keyId: utf8 (credentialId base64url)\n * - (3) capsule: bytes\n * - (4) expiresAt: u64be (ms)\n */\nexport const Schema2012_PasskeyLoginVerifyRes: ats1.Ats1SchemaDescriptor = {\n schemaId: ATS1_SCHEMA.PASSKEY_LOGIN_VERIFY_RES,\n name: 'axis.auth.passkey.login.verify.res',\n strict: true,\n maxNestingDepth: 4,\n fields: [\n { tag: 1, name: 'actorId', type: 'utf8', required: true, maxLen: 256 },\n { tag: 2, name: 'keyId', type: 'utf8', required: true, maxLen: 256 },\n { tag: 3, name: 'capsule', type: 'bytes', required: true, maxLen: 4096 },\n { tag: 4, name: 'expiresAt', type: 'u64be', required: true },\n ],\n};\n\nexport function packPasskeyLoginVerifyRes(params: {\n actorId: string;\n keyId: string;\n capsule: Buffer;\n expiresAt: bigint;\n}): Buffer {\n const bodyTlvs = ats1.logicalBodyToTLVs(Schema2012_PasskeyLoginVerifyRes, {\n schemaId: ATS1_SCHEMA.PASSKEY_LOGIN_VERIFY_RES,\n fields: {\n actorId: params.actorId,\n keyId: params.keyId,\n capsule: params.capsule,\n expiresAt: params.expiresAt,\n },\n });\n return ats1.encodeTLVStreamCanonical(bodyTlvs);\n}\n","// tlv.encode.ts\nimport { randomBytes } from 'crypto';\n\nexport function encVarint(x: bigint): Buffer {\n if (x < 0n) throw new Error('VARINT_NEG');\n const out: number[] = [];\n while (x >= 0x80n) {\n out.push(Number((x & 0x7fn) | 0x80n));\n x >>= 7n;\n }\n out.push(Number(x));\n return Buffer.from(out);\n}\n\nexport function varintU(x: number | bigint): Buffer {\n const v = typeof x === 'number' ? BigInt(x) : x;\n return encVarint(v);\n}\n\nexport function u64be(x: bigint): Buffer {\n if (x < 0n) throw new Error('U64_NEG');\n const b = Buffer.alloc(8);\n b.writeBigUInt64BE(x, 0);\n return b;\n}\n\nexport function utf8(s: string): Buffer {\n return Buffer.from(s, 'utf8');\n}\n\nexport function bytes(b: Uint8Array | Buffer): Buffer {\n return Buffer.isBuffer(b) ? b : Buffer.from(b);\n}\n\nexport function nonce16(): Buffer {\n return randomBytes(16);\n}\n\nexport function tlv(type: number, value: Buffer): Buffer {\n if (!Number.isSafeInteger(type) || type < 0) throw new Error('TLV_BAD_TYPE');\n return Buffer.concat([\n encVarint(BigInt(type)),\n encVarint(BigInt(value.length)),\n value,\n ]);\n}\n\n/**\n * Canonical TLV encoding:\n * - sorted by type ascending\n * - no duplicates by default\n */\nexport function buildTLVs(\n items: { type: number; value: Buffer }[],\n opts?: { allowDupTypes?: Set<number> },\n): Buffer {\n const allow = opts?.allowDupTypes ?? new Set<number>();\n const sorted = [...items].sort((a, b) => a.type - b.type);\n\n for (let i = 1; i < sorted.length; i++) {\n if (sorted[i].type === sorted[i - 1].type && !allow.has(sorted[i].type)) {\n throw new Error(`TLV_DUP_TYPE_${sorted[i].type}`);\n }\n }\n\n return Buffer.concat(sorted.map((it) => tlv(it.type, it.value)));\n}\n","// axis1.encode.ts\nimport { encVarint } from './tlv.encode';\n\nconst MAGIC = Buffer.from('AXIS1', 'ascii');\n\nexport type Axis1FrameToEncode = {\n ver: number; // 1\n flags: number; // bit flags\n hdr: Buffer; // TLVs\n body: Buffer; // TLVs or raw payload\n sig: Buffer; // signature bytes\n};\n\nexport function encodeAxis1Frame(f: Axis1FrameToEncode): Buffer {\n if (\n !Buffer.isBuffer(f.hdr) ||\n !Buffer.isBuffer(f.body) ||\n !Buffer.isBuffer(f.sig)\n ) {\n throw new Error('AXIS1_BAD_BUFFERS');\n }\n if (f.ver !== 1) throw new Error('AXIS1_BAD_VER');\n\n const hdrLen = encVarint(BigInt(f.hdr.length));\n const bodyLen = encVarint(BigInt(f.body.length));\n const sigLen = encVarint(BigInt(f.sig.length));\n\n return Buffer.concat([\n MAGIC,\n Buffer.from([f.ver & 0xff]),\n Buffer.from([f.flags & 0xff]),\n hdrLen,\n bodyLen,\n sigLen,\n f.hdr,\n f.body,\n f.sig,\n ]);\n}\n","// axis1.signing.ts\nimport { encVarint } from './tlv.encode';\n\nconst MAGIC = Buffer.from('AXIS1', 'ascii');\n\nexport function axis1SigningBytes(params: {\n ver: number;\n flags: number;\n hdr: Buffer;\n body: Buffer;\n}): Buffer {\n if (params.ver !== 1) throw new Error('AXIS1_BAD_VER');\n const hdrLen = encVarint(BigInt(params.hdr.length));\n const bodyLen = encVarint(BigInt(params.body.length));\n const sigLenZero = encVarint(0n); // IMPORTANT: sigLen=0 in signing bytes\n\n return Buffer.concat([\n MAGIC,\n Buffer.from([params.ver & 0xff]),\n Buffer.from([params.flags & 0xff]),\n hdrLen,\n bodyLen,\n sigLenZero,\n params.hdr,\n params.body,\n ]);\n}\n","/**\n * Base64url encoding/decoding utilities\n * RFC 4648 base64url (URL-safe, no padding)\n */\n\n/**\n * Encode buffer to base64url string\n * @param buf - Buffer to encode\n * @returns Base64url string (no padding, URL-safe)\n */\nexport function b64urlEncode(buf: Buffer): string {\n return buf\n .toString('base64')\n .replace(/=/g, '')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_');\n}\n\n/**\n * Decode base64url string to buffer\n * @param str - Base64url string\n * @returns Decoded buffer\n */\nexport function b64urlDecode(str: string): Buffer {\n // Add padding if needed\n const pad = str.length % 4 ? '='.repeat(4 - (str.length % 4)) : '';\n const base64 = (str + pad).replace(/-/g, '+').replace(/_/g, '/');\n return Buffer.from(base64, 'base64');\n}\n\n/**\n * Encode string to base64url\n * @param str - String to encode\n * @param encoding - String encoding (default: utf8)\n * @returns Base64url string\n */\nexport function b64urlEncodeString(\n str: string,\n encoding: BufferEncoding = 'utf8',\n): string {\n return b64urlEncode(Buffer.from(str, encoding));\n}\n\n/**\n * Decode base64url string to string\n * @param str - Base64url string\n * @param encoding - String encoding (default: utf8)\n * @returns Decoded string\n */\nexport function b64urlDecodeString(\n str: string,\n encoding: BufferEncoding = 'utf8',\n): string {\n return b64urlDecode(str).toString(encoding);\n}\n","/**\n * Canonical JSON serialization for stable cryptographic signing\n *\n * Rules:\n * - Recursively sort object keys lexicographically\n * - Remove undefined values\n * - Preserve array order\n * - No whitespace in output\n * - Stable number formatting\n */\n\n/**\n * Recursively sort object keys and remove undefined values\n */\nfunction sortRec(value: any): any {\n if (value === null) {\n return null;\n }\n\n if (value === undefined) {\n return undefined;\n }\n\n if (Array.isArray(value)) {\n return value.map(sortRec);\n }\n\n if (typeof value === 'object') {\n const sorted: Record<string, any> = {};\n const keys = Object.keys(value).sort();\n\n for (const key of keys) {\n const sortedValue = sortRec(value[key]);\n // Skip undefined values\n if (sortedValue !== undefined) {\n sorted[key] = sortedValue;\n }\n }\n\n return sorted;\n }\n\n // Primitive types (number, string, boolean)\n return value;\n}\n\n/**\n * Convert value to canonical JSON string for signing\n *\n * @param value - Value to canonicalize\n * @returns Canonical JSON string (no whitespace, sorted keys, no undefined)\n */\nexport function canonicalJson(value: any): string {\n return JSON.stringify(sortRec(value));\n}\n\n/**\n * Helper to create canonical JSON for signing (excluding specific fields)\n *\n * @param obj - Object to canonicalize\n * @param exclude - Fields to exclude (e.g., 'sig' when signing)\n * @returns Canonical JSON string\n */\nexport function canonicalJsonExcluding(\n obj: Record<string, any>,\n exclude: string[],\n): string {\n const filtered: Record<string, any> = {};\n\n for (const key in obj) {\n if (!exclude.includes(key) && obj[key] !== undefined) {\n filtered[key] = obj[key];\n }\n }\n\n return canonicalJson(filtered);\n}\n","export class ContractViolationError extends Error {\n constructor(\n public code: string,\n message: string,\n ) {\n super(message);\n this.name = 'ContractViolationError';\n }\n}\n\nexport interface ExecutionMetrics {\n dbWrites: number;\n dbReads: number;\n externalCalls: number;\n elapsedMs: number;\n}\n\nexport class ExecutionMeter {\n private dbWrites = 0;\n private dbReads = 0;\n private externalCalls = 0;\n private startTime: number;\n private contract: any; // ExecutionContract\n\n constructor(contract: any) {\n this.contract = contract;\n this.startTime = Date.now();\n }\n\n recordDbWrite(): void {\n this.dbWrites++;\n if (this.dbWrites > this.contract.maxDbWrites) {\n throw new ContractViolationError(\n 'MAX_DB_WRITES_EXCEEDED',\n `DB writes exceeded: ${this.dbWrites}/${this.contract.maxDbWrites}`,\n );\n }\n }\n\n recordDbRead(): void {\n this.dbReads++;\n if (this.contract.maxDbReads && this.dbReads > this.contract.maxDbReads) {\n throw new ContractViolationError(\n 'MAX_DB_READS_EXCEEDED',\n `DB reads exceeded: ${this.dbReads}/${this.contract.maxDbReads}`,\n );\n }\n }\n\n recordExternalCall(): void {\n this.externalCalls++;\n if (this.externalCalls > this.contract.maxExternalCalls) {\n throw new ContractViolationError(\n 'MAX_EXTERNAL_CALLS_EXCEEDED',\n `External calls exceeded: ${this.externalCalls}/${this.contract.maxExternalCalls}`,\n );\n }\n }\n\n checkTime(): void {\n const elapsed = Date.now() - this.startTime;\n if (elapsed > this.contract.maxTimeMs) {\n throw new ContractViolationError(\n 'MAX_TIME_EXCEEDED',\n `Execution time exceeded: ${elapsed}ms/${this.contract.maxTimeMs}ms`,\n );\n }\n }\n\n validateEffect(effect: string): void {\n // Wildcard allows any effect\n if (this.contract.allowedEffects.includes('*')) {\n return;\n }\n\n if (!this.contract.allowedEffects.includes(effect)) {\n throw new ContractViolationError(\n 'INVALID_EFFECT',\n `Effect '${effect}' not allowed. Allowed: ${this.contract.allowedEffects.join(', ')}`,\n );\n }\n }\n\n getMetrics(): ExecutionMetrics {\n return {\n dbWrites: this.dbWrites,\n dbReads: this.dbReads,\n externalCalls: this.externalCalls,\n elapsedMs: Date.now() - this.startTime,\n };\n }\n\n getContract() {\n return this.contract;\n }\n}\n","export interface ExecutionContract {\n maxDbWrites: number;\n maxDbReads?: number;\n maxExternalCalls: number;\n maxTimeMs: number;\n allowedEffects: string[];\n maxMemoryMb?: number;\n}\n\nexport const DEFAULT_CONTRACTS: Record<string, ExecutionContract> = {\n // System intents\n 'system.ping': {\n maxDbWrites: 0,\n maxExternalCalls: 0,\n maxTimeMs: 100,\n allowedEffects: ['system.pong'],\n },\n\n // Catalog intents\n 'catalog.list': {\n maxDbWrites: 0,\n maxExternalCalls: 0,\n maxTimeMs: 200,\n allowedEffects: ['catalog.listed'],\n },\n 'catalog.search': {\n maxDbWrites: 0,\n maxExternalCalls: 0,\n maxTimeMs: 300,\n allowedEffects: ['catalog.searched'],\n },\n\n // Passport intents\n 'passport.issue': {\n maxDbWrites: 10,\n maxExternalCalls: 0,\n maxTimeMs: 500,\n allowedEffects: ['passport.issued', 'passport.rejected'],\n },\n 'passport.revoke': {\n maxDbWrites: 5,\n maxExternalCalls: 0,\n maxTimeMs: 300,\n allowedEffects: ['passport.revoked', 'passport.revoke_failed'],\n },\n\n // File intents\n 'file.init': {\n maxDbWrites: 2,\n maxExternalCalls: 0,\n maxTimeMs: 200,\n allowedEffects: ['file.initialized'],\n },\n 'file.chunk': {\n maxDbWrites: 2,\n maxExternalCalls: 0,\n maxTimeMs: 1000,\n allowedEffects: ['file.chunk.stored'],\n },\n 'file.finalize': {\n maxDbWrites: 2,\n maxExternalCalls: 0,\n maxTimeMs: 500,\n allowedEffects: ['file.finalized'],\n },\n\n // Stream intents\n 'stream.publish': {\n maxDbWrites: 1,\n maxExternalCalls: 0,\n maxTimeMs: 200,\n allowedEffects: ['stream.published'],\n },\n 'stream.read': {\n maxDbWrites: 0,\n maxExternalCalls: 0,\n maxTimeMs: 300,\n allowedEffects: ['stream.data'],\n },\n\n // Mail intents\n 'mail.send': {\n maxDbWrites: 3,\n maxExternalCalls: 1, // Email service\n maxTimeMs: 2000,\n allowedEffects: ['mail.sent', 'mail.failed'],\n },\n};\n\n// Default contract for unknown intents\nexport const FALLBACK_CONTRACT: ExecutionContract = {\n maxDbWrites: 10,\n maxExternalCalls: 0,\n maxTimeMs: 1000,\n allowedEffects: ['*'], // Allow any effect\n};\n","/**\n * Decodes a variable-length integer (Varint) from a buffer.\n * Supports up to 64-bit integers.\n *\n * @param {Buffer} buf - The buffer to read from\n * @param {number} off - The offset to start reading from\n * @returns {Object} The decoded bigint value and the new offset\n * @throws {Error} If the varint is malformed or exceeds 64 bits\n */\nexport function decVarint(\n buf: Buffer,\n off: number,\n): { val: bigint; off: number } {\n let shift = 0n;\n let x = 0n;\n while (true) {\n if (off >= buf.length) throw new Error('varint overflow');\n const b = BigInt(buf[off++]);\n x |= (b & 0x7fn) << shift;\n if ((b & 0x80n) === 0n) break;\n shift += 7n;\n if (shift > 63n) throw new Error('varint too large');\n }\n return { val: x, off };\n}\n\nimport type { TLV } from '../core/tlv';\n\n/**\n * Parses a buffer into an array of TLV objects.\n *\n * @param {Buffer} buf - The buffer containing TLV-encoded data\n * @param {number} [maxItems=512] - Security limit for the number of TLVs to parse\n * @returns {TLV[]} An array of parsed TLVs\n * @throws {Error} If TLV structure is invalid or limits are exceeded\n */\nexport function parseTLVs(buf: Buffer, maxItems: number = 512): TLV[] {\n const out: TLV[] = [];\n let off = 0;\n while (off < buf.length) {\n if (out.length >= maxItems) throw new Error('TLV_TOO_MANY_ITEMS');\n const t1 = decVarint(buf, off);\n off = t1.off;\n const t2 = decVarint(buf, off);\n off = t2.off;\n const type = Number(t1.val);\n const len = Number(t2.val);\n if (len < 0 || off + len > buf.length) {\n throw new Error('TLV_LEN_INVALID');\n }\n const value = buf.subarray(off, off + len);\n off += len;\n out.push({ type, value });\n }\n return out;\n}\n\n/**\n * Parses TLVs and organizes them into a Map for efficient access.\n * Multiple values for the same type are preserved in an array.\n *\n * @param {Buffer} buf - The raw TLV-encoded buffer\n * @returns {Map<number, Buffer[]>} A map of Tag -> [Values]\n */\nexport function tlvMap(buf: Buffer): Map<number, Buffer[]> {\n const m = new Map<number, Buffer[]>();\n for (const it of parseTLVs(buf)) {\n const arr = m.get(it.type) ?? [];\n arr.push(it.value as Buffer);\n m.set(it.type, arr);\n }\n return m;\n}\n\nexport function asUtf8(b?: Buffer): string | undefined {\n if (!b) return undefined;\n return b.toString('utf8');\n}\n\nexport function asBigintVarint(b?: Buffer): bigint | undefined {\n if (!b) return undefined;\n const { val, off } = decVarint(b, 0);\n if (off !== b.length) throw new Error('VARINT_TRAILING_BYTES');\n return val;\n}\n\n/**\n * Parses an 8-byte big-endian buffer as a BigInt.\n * Used for timestamps which are sent as fixed 8-byte u64.\n */\nexport function asBigint64BE(b?: Buffer): bigint | undefined {\n if (!b) return undefined;\n if (b.length !== 8) throw new Error('Expected 8 bytes for u64');\n return b.readBigUInt64BE(0);\n}\n\nexport function encVarint(x: bigint): Buffer {\n if (x < 0n) throw new Error('varint neg');\n const out: number[] = [];\n while (x >= 0x80n) {\n out.push(Number((x & 0x7fn) | 0x80n));\n x >>= 7n;\n }\n out.push(Number(x));\n return Buffer.from(out);\n}\n\nexport function tlv(type: number, value: Buffer): Buffer {\n return Buffer.concat([\n encVarint(BigInt(type)),\n encVarint(BigInt(value.length)),\n value,\n ]);\n}\n\nexport function buildTLVs(items: { type: number; value: Buffer }[]): Buffer {\n // Canonical: sort by type ascending\n const sorted = [...items].sort((a, b) => a.type - b.type);\n\n // Canonical: forbid duplicate tags by default\n for (let i = 1; i < sorted.length; i++) {\n if (sorted[i].type === sorted[i - 1].type) {\n throw new Error(`TLV_DUP_TYPE_${sorted[i].type}`);\n }\n }\n\n return Buffer.concat(sorted.map((it) => tlv(it.type, it.value)));\n}\n\nexport function u64be(x: bigint): Buffer {\n const b = Buffer.alloc(8);\n b.writeBigUInt64BE(x);\n return b;\n}\n\nexport function utf8(s: string): Buffer {\n return Buffer.from(s, 'utf8');\n}\n\nexport function varintU(x: number | bigint): Buffer {\n const v = typeof x === 'number' ? BigInt(x) : x;\n return encVarint(v);\n}\n","import { decVarint } from './tlv';\n\n/**\n * Axis1DecodedFrame\n *\n * Represents a parsed AXIS v1 binary frame.\n *\n * @typedef {Object} Axis1DecodedFrame\n */\nexport type Axis1DecodedFrame = {\n /** Protocol version (should be 1) */\n ver: number;\n /** Frame flags for protocol extensions */\n flags: number;\n /** Raw header bytes (containing primary TLVs) */\n hdr: Buffer;\n /** Raw body bytes (the main payload) */\n body: Buffer;\n /** Cryptographic signature bytes */\n sig: Buffer;\n /** Total original size of the frame in bytes */\n frameSize: number;\n};\n\nconst MAGIC = Buffer.from('AXIS1', 'ascii');\n\n/**\n * Decodes a raw binary buffer into a structured Axis1DecodedFrame.\n * Implements the AXIS v1 wire format specification.\n *\n * **Binary Structure:**\n * 1. Magic: 'AXIS1' (5 bytes)\n * 2. Version: (1 byte)\n * 3. Flags: (1 byte)\n * 4. HDR_LEN: Varint\n * 5. BODY_LEN: Varint\n * 6. HDR: (HDR_LEN bytes)\n * 7. BODY: (BODY_LEN bytes)\n * 8. SIG_LEN: Varint\n * 9. SIG: (SIG_LEN bytes)\n *\n * @param {Buffer} buf - Raw bytes from the wire\n * @returns {Axis1DecodedFrame} Parsed frame object\n * @throws {Error} If magic is invalid, frame is truncated, or lengths are inconsistent\n */\nexport function decodeAxis1Frame(buf: Buffer): Axis1DecodedFrame {\n let off = 0;\n\n const magic = buf.subarray(off, off + 5);\n off += 5;\n if (magic.length !== 5 || !magic.equals(MAGIC))\n throw new Error('AXIS1_BAD_MAGIC');\n\n if (off + 2 > buf.length) throw new Error('AXIS1_TRUNCATED');\n const ver = buf[off++];\n const flags = buf[off++];\n\n const h1 = decVarint(buf, off);\n off = h1.off;\n const b1 = decVarint(buf, off);\n off = b1.off;\n const s1 = decVarint(buf, off);\n off = s1.off;\n\n const hdrLen = Number(h1.val);\n const bodyLen = Number(b1.val);\n const sigLen = Number(s1.val);\n\n if (hdrLen < 0 || bodyLen < 0 || sigLen < 0) throw new Error('AXIS1_LEN_NEG');\n\n if (off + hdrLen + bodyLen + sigLen > buf.length)\n throw new Error('AXIS1_TRUNCATED_PAYLOAD');\n\n const hdr = buf.subarray(off, off + hdrLen);\n off += hdrLen;\n const body = buf.subarray(off, off + bodyLen);\n off += bodyLen;\n const sig = buf.subarray(off, off + sigLen);\n off += sigLen;\n\n if (off !== buf.length) throw new Error('AXIS1_TRAILING_BYTES');\n\n return { ver, flags, hdr, body, sig, frameSize: buf.length };\n}\n","import {\n TLV_ACTOR_ID,\n TLV_INTENT,\n TLV_NONCE,\n TLV_PID,\n TLV_PROOF_REF,\n TLV_PROOF_TYPE,\n TLV_TS,\n} from '../core/constants';\nimport { asBigint64BE, asBigintVarint, asUtf8, tlvMap } from './tlv';\n\n/**\n * AXIS TLV Tag Definitions (as per specification)\n */\nexport const T = {\n /** The specific intent or action (e.g., 'vault.create') */\n INTENT: TLV_INTENT,\n /** Package identifier / ID */\n PID: TLV_PID,\n /** Versioning of the intent schema */\n INTENT_VERSION: 10, // Defaulting to TRACE_ID for now or a new tag if available\n /** Unique identifier for the requesting actor */\n ACTOR_ID: TLV_ACTOR_ID,\n /** Optional Capability Token identifier (16 bytes) */\n CAPSULE_ID: TLV_PROOF_REF,\n /** Unique session/request identifier (16 bytes) */\n NONCE: TLV_NONCE,\n /** High-precision Unix timestamp in milliseconds */\n TS_MS: TLV_TS,\n /** Proof type */\n PROOF_TYPE: TLV_PROOF_TYPE,\n /** Standard binary body tag */\n BODY: 100,\n /** Standard JSON-encoded body tag */\n JSON: 200,\n};\n\n/**\n * AxisPacket\n *\n * A high-level representation of an AXIS message after TLV decoding.\n * Combines header metadata with the raw body and signature.\n *\n * @typedef {Object} AxisPacket\n */\nexport type AxisPacket = {\n /** The intent string */\n intent: string;\n /** Intent schema version */\n intentVersion: number;\n /** Actor identifier */\n actorId: string;\n /** Optional binary Capsule ID */\n capsuleId?: Buffer;\n /** Packet identifier */\n pid: Buffer;\n /** Random nonce for replay protection */\n nonce: Buffer;\n /** Request timestamp */\n tsMs: bigint;\n /** Decoded header TLV map */\n headersMap: Map<number, Buffer[]>;\n /** Decoded body TLV map (if body contains TLVs) */\n bodyMap: Map<number, Buffer[]>;\n /** Original raw header bytes */\n hdrBytes: Buffer;\n /** Original raw body bytes */\n bodyBytes: Buffer;\n /** Cryptographic signature of the frame */\n sig: Buffer;\n};\n\n/**\n * Constructs a structured AxisPacket from raw header, body, and signature buffers.\n * Performs rigorous validation on mandatory AXIS fields.\n *\n * @param {Buffer} hdr - Raw header bytes containing the primary TLVs\n * @param {Buffer} body - Raw body bytes\n * @param {Buffer} sig - Signature bytes for the frame\n * @param {number} [flags=0] - Frame flags (bit 0 = BODY_IS_TLV)\n * @returns {AxisPacket} A fully validated AxisPacket object\n * @throws {Error} If mandatory fields (intent, version, actor, nonce, ts) are missing or malformed\n */\nexport function buildPacket(\n hdr: Buffer,\n body: Buffer,\n sig: Buffer,\n flags: number = 0,\n): AxisPacket {\n const hm = tlvMap(hdr);\n\n // Only parse body as TLV if BODY_IS_TLV flag is set (bit 0)\n const BODY_IS_TLV = 0x01;\n const bm = flags & BODY_IS_TLV ? tlvMap(body) : new Map<number, Buffer[]>();\n\n const intent = asUtf8(hm.get(T.INTENT)?.[0]);\n const intentVerRaw = hm.get(T.INTENT_VERSION)?.[0];\n const intentVer = intentVerRaw ? Number(asBigintVarint(intentVerRaw)) : 1;\n const actorIdRaw = hm.get(T.ACTOR_ID)?.[0];\n const actorId = actorIdRaw ? actorIdRaw.toString('hex') : undefined;\n const capsuleId = hm.get(T.CAPSULE_ID)?.[0];\n const pid = hm.get(T.PID)?.[0] || hm.get(T.NONCE)?.[0]; // Fallback to nonce if pid missing\n const nonce = hm.get(T.NONCE)?.[0];\n const tsMs = asBigint64BE(hm.get(T.TS_MS)?.[0]);\n\n if (!intent) throw new Error('PACKET_MISSING_INTENT');\n if (!actorId) throw new Error('PACKET_MISSING_ACTOR_ID');\n if (!nonce || nonce.length < 16 || nonce.length > 32)\n throw new Error('PACKET_BAD_NONCE');\n if (!pid) throw new Error('PACKET_MISSING_PID');\n if (!tsMs) throw new Error('PACKET_MISSING_TS');\n\n return {\n intent,\n intentVersion: intentVer,\n actorId,\n capsuleId,\n pid,\n nonce,\n tsMs,\n headersMap: hm,\n bodyMap: bm,\n hdrBytes: hdr,\n bodyBytes: body,\n sig,\n };\n}\n","import { OnModuleInit } from '@nestjs/common';\nimport type { AxisObservedContext } from '../types/axis-frame.types';\n\n/**\n * Sensor Phase Metadata\n *\n * Metadata describing which phase(s) a sensor executes in.\n * Used for validation and optimization.\n *\n * @interface SensorPhaseMetadata\n */\nexport interface SensorPhaseMetadata {\n /** Execution phase: pre-decode (middleware) or post-decode (controller) */\n phase: 'PRE_DECODE' | 'POST_DECODE';\n\n /** Other sensors that must run before this one */\n dependencies?: string[];\n\n /** Whether this sensor can perform async I/O */\n asyncOk?: boolean;\n\n /** Whether this sensor can use cryptographic operations */\n cryptoOk?: boolean;\n\n /** Human-readable description of sensor purpose */\n description?: string;\n}\n\n/**\n * AXIS Sensor Interface\n *\n * Core interface for all security sensors in the AXIS pipeline.\n */\nexport interface AxisSensor {\n readonly name: string;\n readonly order?: number; // Lower runs first\n /** Execution phase hint */\n phase?: SensorPhaseMetadata | 'PRE_DECODE' | 'POST_DECODE';\n supports?(input: SensorInput): boolean;\n run(input: SensorInput): Promise<SensorDecision>;\n}\n\n// Optional capability (only some sensors need it)\nexport interface AxisSensorInit extends AxisSensor, OnModuleInit {}\n\n/**\n * Sensors that run before frame decoding/deserialization.\n * They should be fast, avoid I/O, and fail fast on malformed traffic.\n */\nexport interface AxisPreSensor extends AxisSensor {\n phase: 'PRE_DECODE';\n}\n\n/**\n * Sensors that run after a frame is fully decoded and parsed.\n * They may use full context (intent, actor, proofs) and can perform I/O.\n */\nexport interface AxisPostSensor extends AxisSensor {\n phase: 'POST_DECODE';\n}\n\n/**\n * Sensor Input\n *\n * Represents the structured data passed to a security sensor for evaluation.\n * Depending on the execution phase, different fields may be populated.\n *\n * **Flow:**\n * - **Phase 1 (Pre-decode):** `rawBytes`, `ip`, `path`, and `peek` are typically available.\n * - **Phase 2/3 (Post-decode):** `intent`, `contentLength`, and `metadata` are populated after frame parsing.\n *\n * @interface SensorInput\n */\nexport interface SensorInput {\n /** The full raw binary frame from the wire (if available) */\n rawBytes?: Buffer | Uint8Array;\n\n /** The AXIS intent string extracted from the frame header (e.g., 'system.info') */\n intent?: string;\n\n /** IPv4/IPv6 address of the edge client */\n ip?: string;\n\n /** The HTTP or transport path being accessed */\n path?: string;\n\n /** Total size of the frame body in bytes */\n contentLength?: number;\n\n /** A small slice of the beginning of the body for early pattern matching */\n peek?: Uint8Array;\n\n /** Geolocation country code (if resolved by upstream middleware) */\n country?: string;\n\n /** Client identifier from the transport layer (e.g., Capsule ID or Socket ID) */\n clientId?: string;\n\n /** Whether the request is coming via a WebSocket connection */\n isWs?: boolean;\n\n /** Extensible metadata for cross-sensor communication */\n metadata?: Record<string, any>;\n\n /** Actor ID from frame or request */\n actorId?: string;\n\n /** Operation code */\n opcode?: string;\n\n /** Audience field */\n aud?: string;\n\n /** Observed context from frame parsing */\n observed?: AxisObservedContext;\n\n /** Parsed frame body */\n frameBody?: any;\n\n /** Device identifier */\n deviceId?: string;\n\n /** Session identifier */\n sessionId?: string;\n\n /** Parsed packet data */\n packet?: Record<string, any>;\n\n /** Dynamic field access for sensor-specific data */\n [key: string]: any;\n}\n\nexport enum Decision {\n ALLOW = 'ALLOW',\n DENY = 'DENY',\n THROTTLE = 'THROTTLE',\n FLAG = 'FLAG',\n}\n/**\n * Sensor Decision\n *\n * Represents the outcome of an individual sensor's evaluation.\n * Supports two formats for backward compatibility:\n *\n * 1. Modern format (preferred): Uses decision/allow/riskScore/reasons\n * 2. Legacy format: Uses action/code/reason (deprecated, will be removed)\n */\nexport type SensorDecision =\n // Modern format (preferred)\n | {\n /** Final decision outcome (optional for backward compatibility) */\n decision?: Decision;\n /** Whether the request may continue immediately */\n allow: boolean;\n /** Risk score from 0–100 (0 = safe, 100 = blocked) */\n riskScore: number;\n /** Human & machine traceable reasons */\n reasons: string[];\n /** Machine-readable error or control code */\n code?: string;\n /** Throttle hint (only relevant for THROTTLE) */\n retryAfterMs?: number;\n /** Optional delta applied to rolling risk/anomaly state */\n scoreDelta?: number;\n /** Extra signals for audit, observability, forensics */\n tags?: Record<string, any>;\n /** Optional capsule / verification metadata */\n meta?: any;\n /** Optional constraint tightening instructions */\n tighten?: {\n expSecondsMax?: number;\n constraintsPatch?: Record<string, any>;\n };\n }\n // Legacy action-based format (deprecated)\n | { action: 'ALLOW'; meta?: any }\n | {\n action: 'DENY';\n code: string;\n reason?: string;\n retryAfterMs?: number;\n meta?: any;\n }\n | { action: 'THROTTLE'; retryAfterMs: number; meta?: any }\n | { action: 'FLAG'; scoreDelta: number; reasons: string[]; meta?: any };\n\nexport type SensorMinifiedDecision = {\n allow: boolean;\n riskScore: number;\n reasons: string[];\n tags?: Record<string, any>;\n meta?: any;\n tighten?: { expSecondsMax?: number; constraintsPatch?: Record<string, any> };\n /** Legacy fields for compatibility */\n retryAfterMs?: number;\n};\n\n/**\n * Helper to normalize SensorDecision (handles both legacy and modern formats)\n */\nexport function normalizeSensorDecision(\n sensorDecision: SensorDecision,\n): SensorMinifiedDecision {\n // Check if it's a legacy action-based format\n if ('action' in sensorDecision) {\n // Convert legacy format to modern\n switch (sensorDecision.action) {\n case 'ALLOW':\n return {\n allow: true,\n riskScore: 0,\n reasons: [],\n meta: sensorDecision.meta,\n };\n case 'DENY':\n return {\n allow: false,\n riskScore: 100,\n reasons: [sensorDecision.code, sensorDecision.reason].filter(\n Boolean,\n ) as string[],\n meta: sensorDecision.meta,\n retryAfterMs: sensorDecision.retryAfterMs,\n };\n case 'THROTTLE':\n return {\n allow: false,\n riskScore: 50,\n reasons: ['RATE_LIMIT'],\n retryAfterMs: sensorDecision.retryAfterMs,\n meta: sensorDecision.meta,\n };\n case 'FLAG':\n return {\n allow: true,\n riskScore: sensorDecision.scoreDelta,\n reasons: sensorDecision.reasons,\n meta: sensorDecision.meta,\n };\n }\n }\n\n // Modern format - already has the required fields\n return {\n allow: sensorDecision.allow,\n riskScore: sensorDecision.riskScore,\n reasons: sensorDecision.reasons,\n tags: sensorDecision.tags,\n meta: sensorDecision.meta,\n tighten: sensorDecision.tighten,\n retryAfterMs: sensorDecision.retryAfterMs,\n };\n}\n\n/**\n * Helper factories for creating SensorDecision objects\n */\nexport const SensorDecisions = {\n allow(meta?: any, tags?: Record<string, any>): SensorDecision {\n return {\n decision: Decision.ALLOW,\n allow: true,\n riskScore: 0,\n reasons: [],\n tags,\n meta,\n };\n },\n\n deny(code: string, reason?: string, meta?: any): SensorDecision {\n return {\n decision: Decision.DENY,\n allow: false,\n riskScore: 100,\n code,\n reasons: [code, reason].filter(Boolean) as string[],\n meta,\n };\n },\n\n throttle(retryAfterMs: number, meta?: any): SensorDecision {\n return {\n decision: Decision.THROTTLE,\n allow: false,\n riskScore: 50,\n retryAfterMs,\n code: 'RATE_LIMIT',\n reasons: ['RATE_LIMIT'],\n meta,\n };\n },\n\n flag(scoreDelta: number, reasons: string[], meta?: any): SensorDecision {\n return {\n decision: Decision.FLAG,\n allow: true,\n riskScore: scoreDelta,\n scoreDelta,\n reasons,\n meta,\n };\n },\n};\n"],"mappings":"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","names":["import_common","bytes","map","bytes","tlv","sha256","sha256","import_crypto","MAGIC","MAGIC","Decision"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/decorators/handler.decorator.ts","../src/decorators/intent.decorator.ts","../src/engine/intent.router.ts","../src/core/constants.ts","../src/core/varint.ts","../src/core/tlv.ts","../src/core/signature.ts","../src/core/axis-bin.ts","../src/codec/ats1.constants.ts","../src/codec/ats1.ts","../src/codec/ats1.passkey.schemas.ts","../src/codec/tlv.encode.ts","../src/codec/axis1.encode.ts","../src/codec/axis1.signing.ts","../src/crypto/b64url.ts","../src/crypto/canonical-json.ts","../src/contract/execution-meter.ts","../src/contract/contract.interface.ts","../src/types/tlv.ts","../src/types/frame.ts","../src/types/packet.ts","../src/sensor/axis-sensor.ts"],"sourcesContent":["// Decorators\nexport { Handler, HANDLER_METADATA_KEY } from './decorators/handler.decorator';\nexport {\n Intent,\n INTENT_ROUTES_KEY,\n IntentRoute,\n IntentOptions,\n} from './decorators/intent.decorator';\n\n// Engine\nexport { IntentRouter, AxisEffect } from './engine/intent.router';\n\n// Core Protocol\nexport * from './core/constants';\nexport * from './core/varint';\nexport * from './core/tlv';\nexport * from './core/signature';\nexport {\n AxisFrameZ,\n decodeFrame,\n encodeFrame,\n getSignTarget,\n} from './core/axis-bin';\nexport type { AxisBinaryFrame } from './core/axis-bin';\n\n// Codec\nexport * from './codec/ats1.constants';\nexport * from './codec/ats1.passkey.schemas';\nexport * as Ats1Codec from './codec/ats1';\nexport * from './codec/axis1.encode';\nexport * from './codec/axis1.signing';\nexport * from './codec/tlv.encode';\n\n// Crypto Utilities\nexport * from './crypto/b64url';\nexport * from './crypto/canonical-json';\nexport * from './crypto/types';\n\n// Contract Utilities\nexport * from './contract/execution-meter';\nexport * from './contract/contract.interface';\n\n// Packet and Sensor Types\nexport { Axis1DecodedFrame, decodeAxis1Frame } from './types/frame';\nexport {\n AxisPacket as AxisBinaryPacket,\n T as AxisPacketTags,\n buildPacket,\n} from './types/packet';\nexport type { AxisObservedContext, AxisRequestContext } from './types/axis-frame.types';\nexport type { TLV as AxisTlvType } from './core/tlv';\nexport {\n Decision,\n normalizeSensorDecision,\n SensorDecisions,\n} from './sensor/axis-sensor';\nexport type {\n AxisSensor,\n AxisSensorInit,\n AxisPreSensor,\n AxisPostSensor,\n SensorPhaseMetadata,\n SensorInput,\n SensorDecision,\n SensorMinifiedDecision,\n} from './sensor/axis-sensor';\n\n// Interfaces\nexport { AxisHandler, AxisHandlerInit } from './interfaces/axis-handler.interface';\nexport { AxisCrudHandler } from './interfaces/axis-crud-handler.interface';\n\n// Types\n","import { Injectable, SetMetadata } from '@nestjs/common';\n\nexport const HANDLER_METADATA_KEY = 'axis:handler';\n\n/**\n * Decorator to mark a class as an Axis Handler.\n * Handlers are responsible for processing intents or specific logic\n * for Axis modules.\n */\nexport function Handler(intent?: string): ClassDecorator {\n return (target: Function) => {\n SetMetadata(HANDLER_METADATA_KEY, { intent })(target);\n Injectable()(target as any);\n };\n}\n","import 'reflect-metadata';\n\nexport const INTENT_ROUTES_KEY = 'axis:intent_routes';\n\nexport interface IntentRoute {\n action: string;\n methodName: string | symbol;\n absolute?: boolean;\n frame?: boolean;\n}\n\nexport interface IntentOptions {\n /** If true, the action is the full intent name (not prefixed with handler name) */\n absolute?: boolean;\n /** If true, register as { handle: fn } for frame-based handlers */\n frame?: boolean;\n}\n\n/**\n * Marks a method as an intent handler.\n *\n * The full intent name is resolved as `{handler_prefix}.{action}` by default.\n * Use `{ absolute: true }` to use the action string as the full intent name.\n * Use `{ frame: true }` for handlers that receive an AxisFrame and return AxisEffect.\n *\n * @example\n * ```ts\n * @Handler('axis.actor_keys')\n * class MyHandler {\n * @Intent('create')\n * async create(body: Uint8Array) { ... }\n *\n * @Intent('public.auth.capsule.issue', { absolute: true })\n * async publicIssue(body: Uint8Array) { ... }\n *\n * @Intent('presence.resume', { frame: true })\n * async handlePresence(frame: AxisFrame) { ... }\n * }\n * ```\n */\nexport function Intent(action: string, options?: IntentOptions): MethodDecorator {\n return (target, propertyKey) => {\n const routes: IntentRoute[] =\n Reflect.getMetadata(INTENT_ROUTES_KEY, target.constructor) || [];\n routes.push({\n action,\n methodName: propertyKey,\n absolute: options?.absolute,\n frame: options?.frame,\n });\n Reflect.defineMetadata(INTENT_ROUTES_KEY, routes, target.constructor);\n };\n}\n","import { Injectable } from '@nestjs/common';\nimport { AxisFrame } from '../core/axis-bin';\nimport { HANDLER_METADATA_KEY } from '../decorators/handler.decorator';\nimport { INTENT_ROUTES_KEY, IntentRoute } from '../decorators/intent.decorator';\n\n/**\n * Represents the outcome of an AXIS intent execution.\n *\n * @interface AxisEffect\n */\nexport interface AxisEffect {\n /** Whether the intent was processed successfully at the application level */\n ok: boolean;\n /** A descriptive string classifier for the result (e.g., 'FILE_CREATED', 'PONG') */\n effect: string;\n /** Optional binary payload (body) to be returned to the requester */\n body?: Uint8Array;\n /** Optional custom TLV headers to be included in the response frame */\n headers?: Map<number, Uint8Array>;\n /** Optional metadata for internal logging or audit (not sent to client) */\n metadata?: any;\n}\n\n/**\n * IntentRouter\n *\n * The central dispatching mechanism of the AXIS backend.\n * Maps binary intents (identified by their name in the header) to specialized handlers.\n *\n * **Features:**\n * 1. **Built-in Fast Path:** Handles high-frequency system intents (ping, time, echo) directly.\n * 2. **Dynamic Handler Registration:** Allows modules to register handlers at runtime.\n * 3. **Decorator-driven Registration:** Uses {@link registerHandler} to auto-register `@Intent`-decorated methods.\n * 4. **Polymorphic Handlers:** Supports both raw function handlers and object-based `{ handle }` handlers.\n *\n * @class IntentRouter\n */\n@Injectable()\nexport class IntentRouter {\n /** Internal registry of dynamic intent handlers */\n private handlers = new Map<string, any>();\n\n /**\n * Registers a handler for a specific intent.\n * Handlers can be functions: `(body, headers) => Promise<Uint8Array | AxisEffect>`\n * Or objects with a method: `handle(frame: AxisFrame) => Promise<AxisEffect>`\n *\n * @param {string} intent - The unique intent identifier (e.g., 'axis.vault.create')\n * @param {any} handler - The handler function or object\n */\n register(intent: string, handler: any) {\n this.handlers.set(intent, handler);\n }\n\n /**\n * Automatically registers all `@Intent`-decorated methods from a handler instance.\n *\n * Reads the handler prefix from `@Handler` metadata (or falls back to `instance.name`),\n * then registers each `@Intent`-decorated method accordingly.\n *\n * @param {any} instance - The handler instance with `@Intent`-decorated methods\n */\n registerHandler(instance: any) {\n const handlerMeta = Reflect.getMetadata(\n HANDLER_METADATA_KEY,\n instance.constructor,\n );\n const prefix: string | undefined = handlerMeta?.intent || instance.name;\n\n const routes: IntentRoute[] =\n Reflect.getMetadata(INTENT_ROUTES_KEY, instance.constructor) || [];\n\n for (const route of routes) {\n const intentName = route.absolute\n ? route.action\n : `${prefix}.${route.action}`;\n const fn = instance[route.methodName].bind(instance);\n\n if (route.frame) {\n this.register(intentName, { handle: fn });\n } else {\n this.register(intentName, fn);\n }\n }\n }\n\n /**\n * Routes a decoded AXIS frame to the appropriate handler.\n *\n * **Precedence:**\n * 1. System Built-ins (`system.ping`, `public.ping`, `system.time`, `system.echo`)\n * 2. Meta-intent execution (`INTENT.EXEC` / `axis.intent.exec`)\n * 3. Dynamically registered handlers from modules.\n *\n * @param {AxisFrame} frame - The validated and decoded binary frame\n * @returns {Promise<AxisEffect>} The resulting effect of the execution\n * @throws {Error} If the intent header is missing or no handler is registered\n */\n async route(frame: AxisFrame): Promise<AxisEffect> {\n const start = process.hrtime();\n let intent = 'unknown';\n\n try {\n // Extract intent from header TLV (tag 3 = TLV_INTENT)\n const intentBytes = frame.headers.get(3);\n if (!intentBytes) throw new Error('Missing intent');\n intent = new TextDecoder().decode(intentBytes);\n\n let effect: AxisEffect;\n\n if (intent === 'system.ping' || intent === 'public.ping') {\n effect = {\n ok: true,\n effect: 'pong',\n headers: new Map([\n [100, new TextEncoder().encode('AXIS_BACKEND_V1')],\n ]),\n body: new TextEncoder().encode(\n JSON.stringify({\n status: 'ok',\n timestamp: new Date().toISOString(),\n version: '1.0.0',\n }),\n ),\n };\n } else if (intent === 'system.time') {\n const ts = Date.now().toString();\n effect = {\n ok: true,\n effect: 'time',\n body: new TextEncoder().encode(\n JSON.stringify({\n ts,\n iso: new Date().toISOString(),\n }),\n ),\n };\n } else if (intent === 'system.echo') {\n effect = {\n ok: true,\n effect: 'echo',\n body: frame.body,\n };\n } else if (intent === 'INTENT.EXEC' || intent === 'axis.intent.exec') {\n // Meta-intent: Unwrap and execute the inner intent\n try {\n const bodyJSON = JSON.parse(new TextDecoder().decode(frame.body));\n const innerIntent = bodyJSON.intent;\n const innerArgs = bodyJSON.args || {};\n\n if (!innerIntent) {\n throw new Error('INTENT.EXEC missing inner intent');\n }\n\n const innerFrame: AxisFrame = {\n ...frame,\n headers: new Map(frame.headers),\n body: new TextEncoder().encode(JSON.stringify(innerArgs)),\n };\n innerFrame.headers.set(3, new TextEncoder().encode(innerIntent));\n\n return await this.route(innerFrame);\n } catch (e: any) {\n throw new Error(`INTENT.EXEC unwrapping failed: ${e.message}`);\n }\n } else {\n const handler = this.handlers.get(intent);\n if (!handler) {\n throw new Error(`Intent not found: ${intent}`);\n }\n\n if (typeof handler === 'function') {\n const resultBody = await handler(frame.body, frame.headers);\n effect = {\n ok: true,\n effect: 'complete',\n body: resultBody,\n };\n } else {\n if (typeof (handler as any).handle === 'function') {\n effect = await (handler as any).handle(frame);\n } else if (typeof (handler as any).execute === 'function') {\n const bodyRes = await (handler as any).execute(\n frame.body,\n frame.headers,\n );\n effect = {\n ok: true,\n effect: 'complete',\n body: bodyRes,\n };\n } else {\n throw new Error(\n `Handler for ${intent} does not implement handle or execute`,\n );\n }\n }\n }\n\n this.recordLatency(intent, start);\n return effect;\n } catch (e: any) {\n console.error(`Error routing intent ${intent}:`, e.message);\n throw e;\n }\n }\n\n private recordLatency(intent: string, start: [number, number]) {\n const diff = process.hrtime(start);\n // Available for subclass telemetry hooks or future logging\n void diff;\n }\n}\n","/**\n * AXIS Protocol Magic Bytes (e.g., 'AXIS1')\n */\nexport const AXIS_MAGIC = new Uint8Array([0x41, 0x58, 0x49, 0x53, 0x31]);\n\n/**\n * AXIS Protocol Version\n */\nexport const AXIS_VERSION = 0x01;\n\n/**\n * Maximum allowed size for the Header section in bytes.\n */\nexport const MAX_HDR_LEN = 2048;\n\n/**\n * Maximum allowed size for the Body section in bytes.\n */\nexport const MAX_BODY_LEN = 65536;\n\n/**\n * Maximum allowed size for the Signature section in bytes.\n */\nexport const MAX_SIG_LEN = 128;\n\n/**\n * Total maximum allowed size for a single AXIS frame.\n */\nexport const MAX_FRAME_LEN = 70 * 1024; // 70 KB\n\n/**\n * Frame Control Flags\n */\nexport const FLAG_BODY_TLV = 0x01;\nexport const FLAG_CHAIN_REQ = 0x02;\nexport const FLAG_HAS_WITNESS = 0x04;\n\n/**\n * TLV Tags for Header Section\n */\nexport const TLV_PID = 1;\nexport const TLV_TS = 2;\nexport const TLV_INTENT = 3;\nexport const TLV_ACTOR_ID = 4;\nexport const TLV_PROOF_TYPE = 5;\nexport const TLV_PROOF_REF = 6;\nexport const TLV_NONCE = 7;\nexport const TLV_AUD = 8;\nexport const TLV_REALM = TLV_AUD;\nexport const TLV_NODE = 9;\nexport const TLV_TRACE_ID = 10;\n/** Key ID for key rotation support */\nexport const TLV_KID = 11;\n\n/**\n * TLV Tags for Receipt Section\n */\nexport const TLV_RID = 15;\nexport const TLV_OK = 16;\nexport const TLV_EFFECT = 17;\nexport const TLV_ERROR_CODE = 18;\nexport const TLV_ERROR_MSG = 19;\nexport const TLV_PREV_HASH = 20;\nexport const TLV_RECEIPT_HASH = 21;\nexport const TLV_NODE_KID = 30;\nexport const TLV_NODE_CERT_HASH = 34;\n\n/**\n * TLV Tags for Loom Runtime (Lawful Execution)\n */\n/** Presence ID - liveness proof (UTF-8 string, e.g., \"pr_abc123\") */\nexport const TLV_LOOM_PRESENCE_ID = 91;\n/** Writ - executable intent (canonical JSON, UTF-8 encoded) */\nexport const TLV_LOOM_WRIT = 92;\n/** Thread Hash - causal continuity (32 bytes, raw binary) */\nexport const TLV_LOOM_THREAD_HASH = 93;\n\n/**\n * TLV Tags for Application Extensions (File Transfer / Capsule, range 70-99)\n */\n/** Upload session identifier (16 bytes, raw binary) */\nexport const TLV_UPLOAD_ID = 70;\n/** Chunk index within an upload session */\nexport const TLV_INDEX = 71;\n/** Byte offset of the chunk within the file */\nexport const TLV_OFFSET = 72;\n/** SHA-256 hash of a file chunk (32 bytes, raw binary) */\nexport const TLV_SHA256_CHUNK = 73;\n/** Capsule identifier stored as UTF-8 string */\nexport const TLV_CAPSULE = 90;\n\n/**\n * TLV Tags for Body Structure (used in body-profile validation)\n */\n/** Nested object TLV type */\nexport const TLV_BODY_OBJ = 254;\n/** Array TLV type */\nexport const TLV_BODY_ARR = 255;\n\n/**\n * TLV Tags for Node Certificate format (cert payload fields, not frame headers)\n *\n * These are used exclusively inside the node certificate binary format\n * and are NOT shared with the frame header TLV namespace.\n */\nexport const NCERT_NODE_ID = 1;\nexport const NCERT_KID = 2;\nexport const NCERT_ALG = 3;\nexport const NCERT_PUB = 4;\nexport const NCERT_NBF = 5;\nexport const NCERT_EXP = 6;\nexport const NCERT_SCOPE = 7;\nexport const NCERT_ISSUER_KID = 8;\n/** Cert envelope: signed payload bytes */\nexport const NCERT_PAYLOAD = 50;\n/** Cert envelope: root signature (64 bytes, Ed25519) */\nexport const NCERT_SIG = 51;\n\n/**\n * Supported Authentication Proof Types\n */\n/** No proof / unauthenticated request */\nexport const PROOF_NONE = 0;\nexport const PROOF_CAPSULE = 1;\nexport const PROOF_JWT = 2;\nexport const PROOF_MTLS = 3;\n/** Loom Presence + Writ proof (Lawful Execution) */\nexport const PROOF_LOOM = 4;\n/** Witnessed signature proof */\nexport const PROOF_WITNESS = 5;\n\n/**\n * Standard Protocol Error Codes\n */\nexport const ERR_INVALID_PACKET = 'INVALID_PACKET';\nexport const ERR_BAD_SIGNATURE = 'BAD_SIGNATURE';\nexport const ERR_REPLAY_DETECTED = 'REPLAY_DETECTED';\nexport const ERR_CONTRACT_VIOLATION = 'CONTRACT_VIOLATION';\n","/**\n * Encodes a number (up to 53 bits safe integer) into a Varint buffer.\n * Varints are a way of encoding integers using one or more bytes.\n * Smaller numbers take fewer bytes.\n *\n * @param {number} value - The unsigned integer to encode\n * @returns {Uint8Array} The encoded binary buffer\n * @throws {Error} If the value is negative\n */\nexport function encodeVarint(value: number): Uint8Array {\n if (value < 0) throw new Error('Varint must be unsigned');\n const bytes: number[] = [];\n while (true) {\n const byte = value & 0x7f;\n value >>>= 7;\n if (value === 0) {\n bytes.push(byte);\n break;\n }\n bytes.push(byte | 0x80);\n }\n return new Uint8Array(bytes);\n}\n\n/**\n * Decodes a Varint from a buffer starting at a specific offset.\n *\n * @param {Uint8Array} buf - The buffer containing the encoded varint\n * @param {number} [offset=0] - The starting position in the buffer\n * @returns {Object} The decoded numeric value and the number of bytes consumed (length)\n * @throws {Error} If the buffer is too small or the varint exceeds 8 bytes (max 53-bit safe int)\n */\nexport function decodeVarint(\n buf: Uint8Array,\n offset = 0,\n): { value: number; length: number } {\n let value = 0;\n let shift = 0;\n let length = 0;\n\n while (true) {\n if (offset + length >= buf.length) {\n throw new Error('Varint decode out of bounds');\n }\n const byte = buf[offset + length];\n value += (byte & 0x7f) * Math.pow(2, shift);\n length++;\n shift += 7;\n if ((byte & 0x80) === 0) {\n break;\n }\n if (length > 8) throw new Error('Varint too large');\n }\n\n return { value, length };\n}\n\n/**\n * Calculates the number of bytes required to encode a value as a varint.\n * Useful for pre-allocating buffers.\n *\n * @param {number} value - The unsigned integer to check\n * @returns {number} The byte length\n * @throws {Error} If the value is negative\n */\nexport function varintLength(value: number): number {\n if (value < 0) throw new Error('Varint must be unsigned');\n let len = 0;\n do {\n value >>>= 7;\n len++;\n } while (value !== 0);\n return len;\n}\n","import { encodeVarint, decodeVarint, varintLength } from './varint';\n\n/**\n * Represents a basic Type-Length-Value structure.\n *\n * @interface TLV\n */\nexport interface TLV {\n /** The tag or type identifier */\n type: number;\n /** The raw binary value */\n value: Uint8Array;\n}\n\n/**\n * Encodes an array of TLVs into a canonical binary buffer.\n *\n * **Canonical Rules:**\n * 1. TLVs MUST be sorted by `type` in ascending order.\n * 2. Duplicate `type` entries are NOT allowed.\n * 3. Format: `[type_varint][len_varint][value_bytes]`\n *\n * @param {TLV[]} tlvs - The list of TLV entries to encode\n * @returns {Uint8Array} The sorted and encoded binary buffer\n * @throws {Error} If duplicate types are detected\n */\nexport function encodeTLVs(tlvs: TLV[]): Uint8Array {\n // 1. Sort by TYPE ascending\n // Create a copy to avoid mutating input\n const sorted = [...tlvs].sort((a, b) => a.type - b.type);\n\n // 2. Check for duplicates\n for (let i = 0; i < sorted.length - 1; i++) {\n if (sorted[i].type === sorted[i + 1].type) {\n throw new Error(`Duplicate TLV type: ${sorted[i].type}`);\n }\n }\n\n // 3. Calculate total size\n let totalSize = 0;\n for (const t of sorted) {\n totalSize += varintLength(t.type);\n totalSize += varintLength(t.value.length);\n totalSize += t.value.length;\n }\n\n // 4. Encode\n const buf = new Uint8Array(totalSize);\n let offset = 0;\n for (const t of sorted) {\n const typeBytes = encodeVarint(t.type);\n buf.set(typeBytes, offset);\n offset += typeBytes.length;\n\n const lenBytes = encodeVarint(t.value.length);\n buf.set(lenBytes, offset);\n offset += lenBytes.length;\n\n buf.set(t.value, offset);\n offset += t.value.length;\n }\n\n return buf;\n}\n\n/**\n * Decodes a binary buffer of TLVs into a flat list.\n * Preserves the original wire order and allows duplicate types.\n *\n * @param {Uint8Array} buf - The buffer containing TLV-encoded data\n * @param {number} [maxItems=1024] - Security limit for the number of parsed items\n * @returns {TLV[]} A list of decoded TLV entries\n * @throws {Error} If the buffer is truncated or malformed\n */\nexport function decodeTLVsList(buf: Uint8Array, maxItems = 1024): TLV[] {\n const list: TLV[] = [];\n let offset = 0;\n\n while (offset < buf.length) {\n if (list.length >= maxItems) throw new Error('TLV_LIMIT');\n\n // Decode TYPE\n const { value: type, length: typeLen } = decodeVarint(buf, offset);\n offset += typeLen;\n\n // Decode LEN\n const { value: len, length: lenLen } = decodeVarint(buf, offset);\n offset += lenLen;\n\n // Check bounds\n if (offset + len > buf.length) {\n throw new Error(`TLV violation: Length ${len} exceeds buffer`);\n }\n\n // Extract VALUE\n const value = buf.slice(offset, offset + len);\n list.push({ type, value });\n offset += len;\n }\n\n return list;\n}\n\n/**\n * Decodes a binary buffer of TLVs into a Map for efficient access.\n * Enforces strict canonical order (sorted tiles) and forbids duplicate types.\n *\n * @param {Uint8Array} buf - The buffer containing canonical TLV data\n * @returns {Map<number, Uint8Array>} Map of Tag -> Value\n * @throws {Error} If canonical order is violated or duplicates are found\n */\nexport function decodeTLVs(buf: Uint8Array): Map<number, Uint8Array> {\n const map = new Map<number, Uint8Array>();\n let offset = 0;\n let lastType = -1;\n\n while (offset < buf.length) {\n // Decode TYPE\n const { value: type, length: typeLen } = decodeVarint(buf, offset);\n offset += typeLen;\n\n // Check canonical order\n if (type <= lastType) {\n throw new Error(\n `TLV violation: Unsorted or duplicate type ${type} after ${lastType}`,\n );\n }\n lastType = type;\n\n // Decode LEN\n const { value: len, length: lenLen } = decodeVarint(buf, offset);\n offset += lenLen;\n\n // Check bounds\n if (offset + len > buf.length) {\n throw new Error(`TLV violation: Length ${len} exceeds buffer`);\n }\n\n // Extract VALUE\n const value = buf.slice(offset, offset + len);\n map.set(type, value);\n offset += len;\n }\n\n return map;\n}\n\n/**\n * Recursive Object Decoder (safe nesting).\n * This follows the AXIS Option A: Nested TLV objects.\n */\nexport function decodeObject(\n bytes: Uint8Array,\n depth = 0,\n limits = { maxDepth: 8, maxItems: 128 },\n): Map<number, any> {\n if (depth > limits.maxDepth) {\n throw new Error('OBJECT_DEPTH_EXCEEDED');\n }\n\n const map = decodeTLVs(bytes);\n // In v1, we leave values as Uint8Array unless schema-driven.\n // The IntentSchemaValidator will handle deeper recursion.\n return map;\n}\n\n/**\n * Array Decoder (explicit container).\n * VALUE = repeated TLVs of one ITEM type.\n */\nexport function decodeArray(\n bytes: Uint8Array,\n itemType: number,\n maxItems = 256,\n): Uint8Array[] {\n const list = decodeTLVsList(bytes, maxItems);\n const items: Uint8Array[] = [];\n\n for (const tlv of list) {\n if (tlv.type !== itemType) {\n throw new Error(`INVALID_ARRAY_ITEM:${tlv.type}`);\n }\n items.push(tlv.value);\n }\n\n return items;\n}\n","import * as crypto from 'crypto';\n\nimport { AxisFrame, encodeFrame } from './axis-bin';\n\n/**\n * Signature utilities for AXIS binary frames\n * Supports Ed25519 signature generation and verification\n */\n\n/**\n * Computes the canonical payload for signing an AXIS frame.\n * The signature covers all bytes of the encoded frame EXCEPT the signature field itself.\n *\n * @param {AxisFrame} frame - The frame to prepare for signing\n * @returns {Buffer} The serialized canonical bytes for the signature algorithm\n */\nexport function computeSignaturePayload(frame: AxisFrame): Buffer {\n // Re-encode frame with empty signature\n const frameWithoutSig: AxisFrame = {\n ...frame,\n sig: new Uint8Array(0),\n };\n\n const encoded = encodeFrame(frameWithoutSig);\n return Buffer.from(encoded);\n}\n\n/**\n * Signs an AXIS frame using the Ed25519 algorithm.\n * Automatically handles both raw 32-byte seeds and pkcs8 DER-encoded private keys.\n *\n * @param {AxisFrame} frame - The frame to sign\n * @param {Buffer} privateKey - Ed25519 private key (32-byte raw OR pkcs8 DER)\n * @returns {Buffer} The 64-byte Ed25519 signature\n * @throws {Error} If key format is invalid or signing fail\n */\nexport function signFrame(frame: AxisFrame, privateKey: Buffer): Buffer {\n const payload = computeSignaturePayload(frame);\n\n let keyObject: crypto.KeyObject;\n\n // Check if key is raw 32-byte seed or DER-encoded\n if (privateKey.length === 32) {\n // Raw seed - wrap in pkcs8 DER format\n // pkcs8 prefix for Ed25519: 0x302e020100300506032b657004220420\n const pkcs8Prefix = Buffer.from([\n 0x30, 0x2e, 0x02, 0x01, 0x00, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70,\n 0x04, 0x22, 0x04, 0x20,\n ]);\n const pkcs8Key = Buffer.concat([pkcs8Prefix, privateKey]);\n\n keyObject = crypto.createPrivateKey({\n key: pkcs8Key,\n format: 'der',\n type: 'pkcs8',\n });\n } else {\n // Assume already DER-encoded pkcs8\n keyObject = crypto.createPrivateKey({\n key: privateKey,\n format: 'der',\n type: 'pkcs8',\n });\n }\n\n const signature = crypto.sign(null, payload, keyObject);\n\n if (signature.length !== 64) {\n throw new Error('Ed25519 signature must be 64 bytes');\n }\n\n return signature;\n}\n\n/**\n * Verifies an Ed25519 signature on an AXIS frame.\n * Automatically handles both raw 32-byte public keys and spki DER-encoded public keys.\n *\n * @param {AxisFrame} frame - The frame containing the signature to verify\n * @param {Buffer} publicKey - Ed25519 public key (32-byte raw OR spki DER)\n * @returns {boolean} True if the signature is cryptographically valid\n * @throws {Error} If signature length is invalid\n */\nexport function verifyFrameSignature(\n frame: AxisFrame,\n publicKey: Buffer,\n): boolean {\n if (frame.sig.length === 0) {\n return false; // No signature\n }\n\n if (frame.sig.length !== 64) {\n throw new Error('Ed25519 signature must be 64 bytes');\n }\n\n const payload = computeSignaturePayload(frame);\n\n try {\n let keyObject: crypto.KeyObject;\n\n // Check if key is raw 32-byte or DER-encoded\n if (publicKey.length === 32) {\n // Raw key - wrap in spki DER format\n // spki prefix for Ed25519: 0x302a300506032b6570032100\n const spkiPrefix = Buffer.from([\n 0x30, 0x2a, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70, 0x03, 0x21, 0x00,\n ]);\n const spkiKey = Buffer.concat([spkiPrefix, publicKey]);\n\n keyObject = crypto.createPublicKey({\n key: spkiKey,\n format: 'der',\n type: 'spki',\n });\n } else {\n // Assume already DER-encoded spki\n keyObject = crypto.createPublicKey({\n key: publicKey,\n format: 'der',\n type: 'spki',\n });\n }\n\n const valid = crypto.verify(\n null,\n payload,\n keyObject,\n Buffer.from(frame.sig),\n );\n return valid;\n } catch (error) {\n return false;\n }\n}\n\n/**\n * Generates a new Ed25519 key pair for use with the AXIS protocol.\n * Returns keys in canonical DER format (pkcs8 for private, spki for public).\n *\n * @returns {Object} An object containing the privateKey and publicKey as Buffers\n */\nexport function generateEd25519KeyPair(): {\n privateKey: Buffer;\n publicKey: Buffer;\n} {\n const { privateKey, publicKey } = crypto.generateKeyPairSync('ed25519');\n\n return {\n privateKey: privateKey.export({ type: 'pkcs8', format: 'der' }) as Buffer,\n publicKey: publicKey.export({ type: 'spki', format: 'der' }) as Buffer,\n };\n}\n\n/**\n * Computes a standard SHA-256 hash of the provided data.\n *\n * @param {Buffer | Uint8Array} data - The input data to hash\n * @returns {Buffer} The 32-byte SHA-256 digest\n */\nexport function sha256(data: Buffer | Uint8Array): Buffer {\n return crypto.createHash('sha256').update(data).digest();\n}\n\n/**\n * Computes a hash for an AXIS receipt, optionally chaining it to a previous hash.\n * This is used for generating an immutable transaction chain.\n *\n * @param {Buffer | Uint8Array} receiptBytes - The canonical binary representation of the receipt\n * @param {Buffer | Uint8Array} [prevHash] - The hash of the previous receipt in the chain\n * @returns {Buffer} The 32-byte SHA-256 hash of the receipt (and link)\n */\nexport function computeReceiptHash(\n receiptBytes: Buffer | Uint8Array,\n prevHash?: Buffer | Uint8Array,\n): Buffer {\n const hasher = crypto.createHash('sha256');\n hasher.update(receiptBytes);\n\n if (prevHash && prevHash.length > 0) {\n hasher.update(prevHash);\n }\n\n return hasher.digest();\n}\n","import * as z from 'zod';\n\n/**\n * AxisFrame Schema\n *\n * Defines the logical structure of an AXIS frame using Zod for runtime validation.\n * This is used for internal processing after the low-level binary parsing is complete.\n */\nexport const AxisFrameZ = z.object({\n /** Flag bits for protocol control (e.g., encryption, compression) */\n flags: z.number().int().nonnegative(),\n /** A map of TLV headers where key=Tag and value=BinaryData */\n headers: z.map(\n z.number(),\n z.custom<Uint8Array>((v) => v instanceof Uint8Array),\n ),\n /** The main payload of the frame */\n body: z.custom<Uint8Array>((v) => v instanceof Uint8Array),\n /** The cryptographic signature covering the frame (except the signature itself) */\n sig: z.custom<Uint8Array>((v) => v instanceof Uint8Array),\n});\n\n/**\n * Represents a structured AXIS frame.\n * @typedef {Object} AxisFrame\n */\nexport type AxisFrame = z.infer<typeof AxisFrameZ>;\nexport type AxisBinaryFrame = AxisFrame;\nimport {\n AXIS_MAGIC,\n AXIS_VERSION,\n MAX_BODY_LEN,\n MAX_FRAME_LEN,\n MAX_HDR_LEN,\n MAX_SIG_LEN,\n} from './constants';\nimport { decodeTLVs, encodeTLVs } from './tlv';\nimport { decodeVarint, encodeVarint } from './varint';\n\n/**\n * Encodes a structured AxisFrame into its binary wire representation.\n *\n * **Encoding Steps:**\n * 1. Encodes header TLV map into a single buffer.\n * 2. Validates lengths against MAX_* constants.\n * 3. Encodes lengths (HDR, BODY, SIG) as varints.\n * 4. Assembles the final byte array with magic, version, and flags.\n *\n * @param {AxisFrame} frame - The structured frame to encode\n * @returns {Uint8Array} The full binary frame\n * @throws {Error} If any section exceeds protocol limits\n */\nexport function encodeFrame(frame: AxisFrame): Uint8Array {\n const hdrBytes = encodeTLVs(\n Array.from(frame.headers.entries()).map(([t, v]) => ({\n type: t,\n value: v,\n })),\n );\n\n if (hdrBytes.length > MAX_HDR_LEN) throw new Error('Header too large');\n if (frame.body.length > MAX_BODY_LEN) throw new Error('Body too large');\n if (frame.sig.length > MAX_SIG_LEN) throw new Error('Signature too large');\n\n // Header Len, Body Len, Sig Len\n const hdrLenBytes = encodeVarint(hdrBytes.length);\n const bodyLenBytes = encodeVarint(frame.body.length);\n const sigLenBytes = encodeVarint(frame.sig.length);\n\n const totalLen =\n 5 + // Magic (AXIS1)\n 1 + // Version\n 1 + // Flags\n hdrLenBytes.length +\n bodyLenBytes.length +\n sigLenBytes.length +\n hdrBytes.length +\n frame.body.length +\n frame.sig.length;\n\n if (totalLen > MAX_FRAME_LEN) throw new Error('Total frame too large');\n\n const buf = new Uint8Array(totalLen);\n let offset = 0;\n\n // Magic (AXIS1 - 5 bytes)\n buf.set(AXIS_MAGIC, offset);\n offset += 5;\n\n // Version\n buf[offset++] = AXIS_VERSION;\n\n // Flags\n buf[offset++] = frame.flags;\n\n // Lengths\n buf.set(hdrLenBytes, offset);\n offset += hdrLenBytes.length;\n\n buf.set(bodyLenBytes, offset);\n offset += bodyLenBytes.length;\n\n buf.set(sigLenBytes, offset);\n offset += sigLenBytes.length;\n\n // Payloads\n buf.set(hdrBytes, offset);\n offset += hdrBytes.length;\n\n buf.set(frame.body, offset);\n offset += frame.body.length;\n\n buf.set(frame.sig, offset);\n offset += frame.sig.length;\n\n return buf;\n}\n\n/**\n * Decodes a binary buffer into a structured AxisFrame with strict validation.\n *\n * @param {Uint8Array} buf - Raw bytes from the wire\n * @returns {AxisFrame} The parsed and validated frame\n * @throws {Error} If magic, version, or lengths are invalid\n */\nexport function decodeFrame(buf: Uint8Array): AxisFrame {\n let offset = 0;\n\n // 1. Magic (AXIS1 - 5 bytes)\n if (offset + 5 > buf.length) throw new Error('Packet too short');\n for (let i = 0; i < 5; i++) {\n if (buf[offset + i] !== AXIS_MAGIC[i]) throw new Error('Invalid Magic');\n }\n offset += 5;\n\n // 2. Version\n const ver = buf[offset++];\n if (ver !== AXIS_VERSION) throw new Error(`Unsupported version: ${ver}`);\n\n // 3. Flags\n const flags = buf[offset++];\n\n // 4. Lengths\n const { value: hdrLen, length: hlLen } = decodeVarint(buf, offset);\n offset += hlLen;\n if (hdrLen > MAX_HDR_LEN) throw new Error('Header limit exceeded');\n\n const { value: bodyLen, length: blLen } = decodeVarint(buf, offset);\n offset += blLen;\n if (bodyLen > MAX_BODY_LEN) throw new Error('Body limit exceeded');\n\n const { value: sigLen, length: slLen } = decodeVarint(buf, offset);\n offset += slLen;\n if (sigLen > MAX_SIG_LEN) throw new Error('Signature limit exceeded');\n\n // 5. Extract Bytes\n if (offset + hdrLen + bodyLen + sigLen > buf.length) {\n throw new Error('Frame truncated');\n }\n\n const hdrBytes = buf.slice(offset, offset + hdrLen);\n offset += hdrLen;\n\n const bodyBytes = buf.slice(offset, offset + bodyLen);\n offset += bodyLen;\n\n const sigBytes = buf.slice(offset, offset + sigLen);\n offset += sigLen;\n\n // 6. Decode Header TLVs\n const headers = decodeTLVs(hdrBytes);\n\n return {\n flags,\n headers,\n body: bodyBytes,\n sig: sigBytes,\n };\n}\n\n/**\n * Helper to get canonical bytes for signing.\n * SigTarget = All bytes up to SigLen, with SigLen=0, and no SigBytes.\n */\nexport function getSignTarget(frame: AxisFrame): Uint8Array {\n // Re-encode frame but with empty signature\n // Note: This is efficient enough for v1 (tens of KB).\n return encodeFrame({\n ...frame,\n sig: new Uint8Array(0),\n });\n}\n","// ats1.constants.ts\n\n// Header TLV tags (hdr TLVs)\nexport const ATS1_HDR = {\n INTENT_ID: 1, // uvarint\n ACTOR_KEY_ID: 2, // bytes (key fingerprint / credentialId hash)\n CAPSULE_ID: 3, // bytes or varint\n NONCE: 4, // 16 bytes\n TS_MS: 5, // u64be (8)\n SCHEMA_ID: 6, // uvarint\n BODY_HASH: 7, // 32 bytes (sha256)\n TRACE_ID: 8, // 16 bytes\n} as const;\n\n// Schema IDs (body TLVs meaning depends on schema)\nexport const ATS1_SCHEMA = {\n PASSKEY_LOGIN_OPTIONS_REQ: 2001,\n PASSKEY_LOGIN_OPTIONS_RES: 2002,\n\n PASSKEY_LOGIN_VERIFY_REQ: 2011,\n PASSKEY_LOGIN_VERIFY_RES: 2012,\n\n PASSKEY_REGISTER_OPTIONS_REQ: 2021,\n PASSKEY_REGISTER_OPTIONS_RES: 2022,\n\n PASSKEY_REGISTER_VERIFY_REQ: 2031,\n PASSKEY_REGISTER_VERIFY_RES: 2032,\n} as const;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * ATS1 (AXIS-TLV Schema v1) — TypeScript Encoder/Decoder\n * - Canonical TLV: [TAG(uvarint)][LEN(uvarint)][VALUE(bytes)]\n * - Canonical ordering: ascending TAG\n * - Minimal varint encoding enforced in decoder\n * - Strict schema validation (unknown tags rejected by default)\n * - Nested TLV streams supported\n *\n * Node.js: uses crypto for SHA-256\n */\n\nimport { createHash, randomBytes } from 'crypto';\n\n// -----------------------------\n// Types\n// -----------------------------\n\nexport type Ats1FieldType = 'bytes' | 'utf8' | 'uvarint' | 'u64be' | 'nested';\n\nexport type Ats1FieldDescriptor = {\n tag: number;\n name: string;\n type: Ats1FieldType;\n required?: boolean;\n repeated?: boolean;\n nestedSchema?: Ats1SchemaDescriptor; // required if type === 'nested'\n maxLen?: number; // optional per-field limit (bytes length)\n};\n\nexport type Ats1SchemaDescriptor = {\n schemaId: number;\n name: string;\n strict: boolean; // if true: reject unknown tags\n maxNestingDepth: number; // e.g. 4\n maxBodyBytes?: number; // optional overall body limit\n fields: Ats1FieldDescriptor[];\n};\n\nexport type DecodedTlv = { tag: number; value: Buffer };\n\nexport type DecodedTlvMap = Map<number, Buffer[]>; // tag -> list of values\n\nexport type SensorInputLike = {\n hdrTLVs: DecodedTlvMap;\n bodyTLVs: DecodedTlvMap;\n schemaId: number;\n intentId: number;\n};\n\n// -----------------------------\n// Limits (sane defaults)\n// -----------------------------\n\nexport type Ats1Limits = {\n maxVarintBytes: number; // e.g. 10 for u64\n maxTlvCount: number; // e.g. 512\n maxValueBytes: number; // e.g. 1MB\n maxNestingDepth: number; // e.g. 4\n};\n\nexport const DEFAULT_LIMITS: Ats1Limits = {\n maxVarintBytes: 10,\n maxTlvCount: 512,\n maxValueBytes: 1_048_576, // 1 MiB\n maxNestingDepth: 4,\n};\n\n// -----------------------------\n// Varint (unsigned LEB128)\n// -----------------------------\n\nexport function encodeUVarint(n: number | bigint): Buffer {\n let x = typeof n === 'bigint' ? n : BigInt(n);\n if (x < 0n) throw new Error('encodeUVarint: negative not allowed');\n\n const out: number[] = [];\n while (x >= 0x80n) {\n out.push(Number((x & 0x7fn) | 0x80n));\n x >>= 7n;\n }\n out.push(Number(x));\n return Buffer.from(out);\n}\n\nexport function decodeUVarint(\n buf: Buffer,\n offset: number,\n limits: Ats1Limits = DEFAULT_LIMITS,\n): { value: bigint; offset: number; bytesRead: number } {\n let x = 0n;\n let shift = 0n;\n const start = offset;\n\n for (let i = 0; i < limits.maxVarintBytes; i++) {\n if (offset >= buf.length) throw new Error('decodeUVarint: truncated');\n const b = buf[offset++];\n x |= BigInt(b & 0x7f) << shift;\n\n if ((b & 0x80) === 0) {\n const bytesRead = offset - start;\n\n // Minimal-encoding check:\n // Re-encode and compare exact bytes.\n const re = encodeUVarint(x);\n const original = buf.subarray(start, offset);\n if (!re.equals(original))\n throw new Error('decodeUVarint: non-minimal varint');\n\n return { value: x, offset, bytesRead };\n }\n\n shift += 7n;\n }\n\n throw new Error('decodeUVarint: too long');\n}\n\n// -----------------------------\n// Primitive encoders/decoders\n// -----------------------------\n\nexport function encodeU64BE(n: bigint): Buffer {\n if (n < 0n) throw new Error('encodeU64BE: negative not allowed');\n const b = Buffer.alloc(8);\n b.writeBigUInt64BE(n, 0);\n return b;\n}\n\nexport function decodeU64BE(buf: Buffer): bigint {\n if (buf.length !== 8) throw new Error('decodeU64BE: length must be 8');\n return buf.readBigUInt64BE(0);\n}\n\nexport function sha256(data: Buffer): Buffer {\n return createHash('sha256').update(data).digest();\n}\n\n// -----------------------------\n// TLV encode/decode\n// -----------------------------\n\nexport function encodeTLV(tag: number, value: Buffer): Buffer {\n if (!Number.isInteger(tag) || tag <= 0)\n throw new Error('encodeTLV: tag must be positive int');\n const t = encodeUVarint(tag);\n const l = encodeUVarint(value.length);\n return Buffer.concat([t, l, value]);\n}\n\nexport function encodeTLVStreamCanonical(entries: DecodedTlv[]): Buffer {\n // Canonical sort ascending tag\n const sorted = [...entries].sort((a, b) => a.tag - b.tag);\n\n // Duplicate tags are allowed only if the schema says repeated.\n // This function does not enforce schema; caller should.\n const parts: Buffer[] = [];\n for (const e of sorted) parts.push(encodeTLV(e.tag, e.value));\n return Buffer.concat(parts);\n}\n\nexport function decodeTLVStream(\n stream: Buffer,\n limits: Ats1Limits = DEFAULT_LIMITS,\n): DecodedTlv[] {\n const out: DecodedTlv[] = [];\n let off = 0;\n\n while (off < stream.length) {\n if (out.length >= limits.maxTlvCount)\n throw new Error('decodeTLVStream: too many TLVs');\n\n const tagRes = decodeUVarint(stream, off, limits);\n const tag = Number(tagRes.value);\n off = tagRes.offset;\n\n const lenRes = decodeUVarint(stream, off, limits);\n const len = Number(lenRes.value);\n off = lenRes.offset;\n\n if (len < 0) throw new Error('decodeTLVStream: negative length');\n if (len > limits.maxValueBytes)\n throw new Error('decodeTLVStream: value too large');\n if (off + len > stream.length)\n throw new Error('decodeTLVStream: truncated value');\n\n const value = stream.subarray(off, off + len);\n off += len;\n\n out.push({ tag, value: Buffer.from(value) });\n }\n\n // Canonical check: must be sorted ascending tag.\n for (let i = 1; i < out.length; i++) {\n if (out[i].tag < out[i - 1].tag)\n throw new Error('decodeTLVStream: non-canonical tag order');\n }\n\n return out;\n}\n\nexport function tlvsToMap(entries: DecodedTlv[]): DecodedTlvMap {\n const m: DecodedTlvMap = new Map();\n for (const e of entries) {\n const arr = m.get(e.tag) ?? [];\n arr.push(e.value);\n m.set(e.tag, arr);\n }\n return m;\n}\n\n// -----------------------------\n// Schema validation + object \\u2194 TLV mapping\n// -----------------------------\n\ntype LogicalBody = { schemaId: number; fields: Record<string, any> };\n\nexport function validateTLVsAgainstSchema(\n schema: Ats1SchemaDescriptor,\n tlvs: DecodedTlv[],\n depth = 0,\n limits: Ats1Limits = DEFAULT_LIMITS,\n): void {\n if (depth > Math.min(schema.maxNestingDepth, limits.maxNestingDepth)) {\n throw new Error('validateTLVsAgainstSchema: nesting depth exceeded');\n }\n\n if (schema.maxBodyBytes && tlvsBytes(tlvs) > schema.maxBodyBytes) {\n throw new Error('validateTLVsAgainstSchema: body too large');\n }\n\n const byTag = new Map<number, DecodedTlv[]>();\n for (const t of tlvs) {\n if (!byTag.has(t.tag)) byTag.set(t.tag, []);\n byTag.get(t.tag)!.push(t);\n }\n\n const fieldByTag = new Map(schema.fields.map((f) => [f.tag, f] as const));\n\n // Unknown tags\n if (schema.strict) {\n for (const tag of byTag.keys()) {\n if (!fieldByTag.has(tag))\n throw new Error(`validateTLVsAgainstSchema: unknown tag ${tag}`);\n }\n }\n\n // Required fields & repetition rules\n for (const f of schema.fields) {\n const vals = byTag.get(f.tag) ?? [];\n if (f.required && vals.length === 0)\n throw new Error(`validateTLVsAgainstSchema: missing ${f.name}`);\n\n if (!f.repeated && vals.length > 1) {\n throw new Error(\n `validateTLVsAgainstSchema: duplicate tag not allowed for ${f.name}`,\n );\n }\n\n // Per-field max length\n if (typeof f.maxLen === 'number') {\n for (const v of vals) {\n if (v.value.length > f.maxLen)\n throw new Error(`validateTLVsAgainstSchema: ${f.name} too long`);\n }\n }\n\n // Type checks (lightweight)\n for (const v of vals) {\n switch (f.type) {\n case 'u64be':\n if (v.value.length !== 8)\n throw new Error(\n `validateTLVsAgainstSchema: ${f.name} u64be must be 8 bytes`,\n );\n break;\n case 'nested': {\n if (!f.nestedSchema)\n throw new Error(\n `validateTLVsAgainstSchema: ${f.name} missing nestedSchema`,\n );\n const nestedTlvs = decodeTLVStream(v.value, limits);\n validateTLVsAgainstSchema(\n f.nestedSchema,\n nestedTlvs,\n depth + 1,\n limits,\n );\n break;\n }\n default:\n // bytes/utf8/uvarint are accepted structurally; deeper validation can be added if you want.\n break;\n }\n }\n }\n}\n\nfunction tlvsBytes(tlvs: DecodedTlv[]): number {\n // approximate encoded size if re-encoded\n let n = 0;\n for (const t of tlvs) {\n n +=\n encodeUVarint(t.tag).length +\n encodeUVarint(t.value.length).length +\n t.value.length;\n }\n return n;\n}\n\nexport function logicalBodyToTLVs(\n schema: Ats1SchemaDescriptor,\n body: LogicalBody,\n limits: Ats1Limits = DEFAULT_LIMITS,\n): DecodedTlv[] {\n if (body.schemaId !== schema.schemaId)\n throw new Error('logicalBodyToTLVs: schemaId mismatch');\n\n const fieldsByName = new Map(schema.fields.map((f) => [f.name, f] as const));\n const tlvs: DecodedTlv[] = [];\n\n for (const [name, val] of Object.entries(body.fields ?? {})) {\n const f = fieldsByName.get(name);\n if (!f) {\n if (schema.strict)\n throw new Error(`logicalBodyToTLVs: unknown field ${name}`);\n continue;\n }\n\n const pushOne = (v: any) => {\n const valueBuf = encodeFieldValue(f, v, limits);\n if (valueBuf.length > limits.maxValueBytes)\n throw new Error('logicalBodyToTLVs: value too large');\n tlvs.push({ tag: f.tag, value: valueBuf });\n };\n\n if (f.repeated) {\n if (!Array.isArray(val))\n throw new Error(\n `logicalBodyToTLVs: repeated field ${name} must be array`,\n );\n for (const item of val) pushOne(item);\n } else {\n pushOne(val);\n }\n }\n\n // Validate required + duplicates + nested schema correctness\n // Validation also enforces canonical ordering check only after encoding/decoding;\n // here we validate semantics.\n validateTLVsAgainstSchema(schema, tlvs, 0, limits);\n\n // NOTE: canonical ordering will be applied in encodeTLVStreamCanonical()\n return tlvs;\n}\n\nfunction encodeFieldValue(\n f: Ats1FieldDescriptor,\n val: any,\n limits: Ats1Limits,\n): Buffer {\n switch (f.type) {\n case 'bytes':\n if (Buffer.isBuffer(val)) return Buffer.from(val);\n if (val instanceof Uint8Array) return Buffer.from(val);\n throw new Error(`encodeFieldValue: ${f.name} expects bytes`);\n case 'utf8':\n if (typeof val !== 'string')\n throw new Error(`encodeFieldValue: ${f.name} expects string`);\n return Buffer.from(val, 'utf8');\n case 'uvarint':\n if (typeof val !== 'number' && typeof val !== 'bigint')\n throw new Error(`encodeFieldValue: ${f.name} expects number/bigint`);\n return encodeUVarint(val);\n case 'u64be':\n if (typeof val !== 'bigint')\n throw new Error(`encodeFieldValue: ${f.name} expects bigint`);\n return encodeU64BE(val);\n case 'nested': {\n if (!f.nestedSchema)\n throw new Error(`encodeFieldValue: ${f.name} missing nestedSchema`);\n // Accept nested logical object in the form { fields: {...} } or direct record\n const nestedFields =\n val && typeof val === 'object' && 'fields' in val\n ? (val as any).fields\n : val;\n if (!nestedFields || typeof nestedFields !== 'object')\n throw new Error(`encodeFieldValue: ${f.name} expects object`);\n const nestedBody: LogicalBody = {\n schemaId: f.nestedSchema.schemaId,\n fields: nestedFields,\n };\n const nestedTlvs = logicalBodyToTLVs(f.nestedSchema, nestedBody, limits);\n const nestedBytes = encodeTLVStreamCanonical(nestedTlvs);\n // Re-parse to ensure canonical encoding would pass, and validate\n const re = decodeTLVStream(nestedBytes, limits);\n validateTLVsAgainstSchema(f.nestedSchema, re, 1, limits);\n return nestedBytes;\n }\n default:\n throw new Error(`encodeFieldValue: unsupported type ${(f as any).type}`);\n }\n}\n\nexport function tlvsToLogicalBody(\n schema: Ats1SchemaDescriptor,\n tlvs: DecodedTlv[],\n limits: Ats1Limits = DEFAULT_LIMITS,\n): LogicalBody {\n // TLVs must already be decoded and canonical-checked\n validateTLVsAgainstSchema(schema, tlvs, 0, limits);\n\n const fields: Record<string, any> = {};\n const fieldByTag = new Map(schema.fields.map((f) => [f.tag, f] as const));\n\n for (const t of tlvs) {\n const f = fieldByTag.get(t.tag);\n if (!f) {\n if (schema.strict)\n throw new Error(`tlvsToLogicalBody: unknown tag ${t.tag}`);\n continue;\n }\n\n const decoded = decodeFieldValue(f, t.value, limits);\n\n if (f.repeated) {\n if (!Array.isArray(fields[f.name])) fields[f.name] = [];\n fields[f.name].push(decoded);\n } else {\n fields[f.name] = decoded;\n }\n }\n\n return { schemaId: schema.schemaId, fields };\n}\n\nfunction decodeFieldValue(\n f: Ats1FieldDescriptor,\n value: Buffer,\n limits: Ats1Limits,\n): any {\n switch (f.type) {\n case 'bytes':\n return Buffer.from(value);\n case 'utf8':\n return value.toString('utf8');\n case 'uvarint': {\n const r = decodeUVarint(value, 0, limits);\n if (r.offset !== value.length)\n throw new Error(\n `decodeFieldValue: ${f.name} uvarint has trailing bytes`,\n );\n // return as number when safe, else bigint\n const asNum = Number(r.value);\n return Number.isSafeInteger(asNum) ? asNum : r.value;\n }\n case 'u64be':\n return decodeU64BE(value);\n case 'nested': {\n if (!f.nestedSchema)\n throw new Error(`decodeFieldValue: ${f.name} missing nestedSchema`);\n const nestedTlvs = decodeTLVStream(value, limits);\n // nested schema validation is called by validateTLVsAgainstSchema already,\n // but we decode again safely here.\n const nestedBody = tlvsToLogicalBody(f.nestedSchema, nestedTlvs, limits);\n return nestedBody.fields; // return the record by default\n }\n default:\n throw new Error(`decodeFieldValue: unsupported type ${(f as any).type}`);\n }\n}\n\n// -----------------------------\n// AXIS HDR tags (ATS1 header TLVs)\n// -----------------------------\n\nexport const HDR_TAGS = {\n intent_id: 1,\n actor_key_id: 2,\n capsule_id: 3,\n nonce: 4,\n ts_ms: 5,\n schema_id: 6,\n body_hash: 7,\n trace_id: 8,\n} as const;\n\nexport type AxisHeaderLogical = {\n intentId: number;\n actorKeyId: Uint8Array;\n capsuleId?: Uint8Array;\n nonce: Uint8Array; // 16 bytes\n tsMs: bigint; // ms\n schemaId: number;\n bodyHash: Uint8Array; // 32 bytes\n traceId?: Uint8Array; // 16 bytes\n version?: number; // optional\n headerHash?: Uint8Array; // 32 bytes\n headerTlvs?: DecodedTlv[]; // optional\n bodyTlvs?: DecodedTlv[]; // optional\n};\n\nexport type AxisLogicalRequest = {\n hdr: AxisHeaderLogical;\n body: LogicalBody;\n};\n\nexport function encodeAxisHeaderToTLVs(hdr: AxisHeaderLogical): DecodedTlv[] {\n if (hdr.nonce.byteLength !== 16)\n throw new Error('encodeAxisHeaderToTLVs: nonce must be 16 bytes');\n if (hdr.bodyHash.byteLength !== 32)\n throw new Error('encodeAxisHeaderToTLVs: bodyHash must be 32 bytes');\n if (hdr.traceId && hdr.traceId.byteLength !== 16)\n throw new Error('encodeAxisHeaderToTLVs: traceId must be 16 bytes');\n\n const tlvs: DecodedTlv[] = [\n { tag: HDR_TAGS.intent_id, value: encodeUVarint(hdr.intentId) },\n { tag: HDR_TAGS.actor_key_id, value: Buffer.from(hdr.actorKeyId) },\n { tag: HDR_TAGS.nonce, value: Buffer.from(hdr.nonce) },\n { tag: HDR_TAGS.ts_ms, value: encodeU64BE(hdr.tsMs) },\n { tag: HDR_TAGS.schema_id, value: encodeUVarint(hdr.schemaId) },\n { tag: HDR_TAGS.body_hash, value: Buffer.from(hdr.bodyHash) },\n ];\n\n if (hdr.capsuleId)\n tlvs.push({ tag: HDR_TAGS.capsule_id, value: Buffer.from(hdr.capsuleId) });\n if (hdr.traceId)\n tlvs.push({ tag: HDR_TAGS.trace_id, value: Buffer.from(hdr.traceId) });\n\n return tlvs;\n}\n\nexport function decodeAxisHeaderFromTLVs(\n hdrTlvs: DecodedTlv[],\n limits: Ats1Limits = DEFAULT_LIMITS,\n): AxisHeaderLogical {\n // hdr TLVs must be canonical-ordered (enforced by decodeTLVStream) and duplicates only if allowed.\n const m = tlvsToMap(hdrTlvs);\n\n const get1 = (tag: number) => {\n const arr = m.get(tag);\n if (!arr || arr.length !== 1)\n throw new Error(\n `decodeAxisHeaderFromTLVs: missing/dup header tag ${tag}`,\n );\n return arr[0];\n };\n const getOpt1 = (tag: number) => {\n const arr = m.get(tag);\n if (!arr) return undefined;\n if (arr.length !== 1)\n throw new Error(`decodeAxisHeaderFromTLVs: dup header tag ${tag}`);\n return arr[0];\n };\n\n const intentIdVar = decodeUVarint(get1(HDR_TAGS.intent_id), 0, limits);\n if (intentIdVar.offset !== get1(HDR_TAGS.intent_id).length)\n throw new Error('decodeAxisHeaderFromTLVs: intent_id trailing bytes');\n\n const schemaIdVar = decodeUVarint(get1(HDR_TAGS.schema_id), 0, limits);\n if (schemaIdVar.offset !== get1(HDR_TAGS.schema_id).length)\n throw new Error('decodeAxisHeaderFromTLVs: schema_id trailing bytes');\n\n const ts = decodeU64BE(get1(HDR_TAGS.ts_ms));\n\n const nonce = get1(HDR_TAGS.nonce);\n if (nonce.length !== 16)\n throw new Error('decodeAxisHeaderFromTLVs: nonce must be 16 bytes');\n\n const bodyHash = get1(HDR_TAGS.body_hash);\n if (bodyHash.length !== 32)\n throw new Error('decodeAxisHeaderFromTLVs: body_hash must be 32 bytes');\n\n const trace = getOpt1(HDR_TAGS.trace_id);\n if (trace && trace.length !== 16)\n throw new Error('decodeAxisHeaderFromTLVs: trace_id must be 16 bytes');\n\n return {\n intentId: Number(intentIdVar.value),\n actorKeyId: Buffer.from(get1(HDR_TAGS.actor_key_id)),\n capsuleId: getOpt1(HDR_TAGS.capsule_id)\n ? Buffer.from(getOpt1(HDR_TAGS.capsule_id)!)\n : undefined,\n nonce: Buffer.from(nonce),\n tsMs: ts,\n schemaId: Number(schemaIdVar.value),\n bodyHash: Buffer.from(bodyHash),\n traceId: trace ? Buffer.from(trace) : undefined,\n };\n}\n\n// -----------------------------\n// Encode/Decode AXIS request body + hdr with body_hash binding\n// -----------------------------\n\nexport function encodeAxisRequestBinary(\n schema: Ats1SchemaDescriptor,\n req: Omit<AxisLogicalRequest, 'hdr'> & {\n hdr: Omit<AxisHeaderLogical, 'bodyHash'>;\n },\n limits: Ats1Limits = DEFAULT_LIMITS,\n): { hdrBytes: Buffer; bodyBytes: Buffer; bodyHash: Buffer } {\n // 1) encode body TLVs\n const bodyTlvs = logicalBodyToTLVs(schema, req.body, limits);\n const bodyBytes = encodeTLVStreamCanonical(bodyTlvs);\n\n // 2) compute body hash\n const bodyHash = sha256(bodyBytes);\n\n // 3) encode hdr TLVs (with computed hash)\n const hdr: AxisHeaderLogical = {\n ...req.hdr,\n schemaId: schema.schemaId,\n bodyHash,\n };\n const hdrTlvs = encodeAxisHeaderToTLVs(hdr);\n const hdrBytes = encodeTLVStreamCanonical(hdrTlvs);\n\n return { hdrBytes, bodyBytes, bodyHash };\n}\n\nexport function decodeAxisRequestBinary(\n schema: Ats1SchemaDescriptor,\n hdrBytes: Buffer,\n bodyBytes: Buffer,\n limits: Ats1Limits = DEFAULT_LIMITS,\n): { hdr: AxisHeaderLogical; body: LogicalBody; sensorInput: SensorInputLike } {\n const hdrTlvs = decodeTLVStream(hdrBytes, limits);\n const bodyTlvs = decodeTLVStream(bodyBytes, limits);\n\n const hdr = decodeAxisHeaderFromTLVs(hdrTlvs, limits);\n\n // Schema binding check\n if (hdr.schemaId !== schema.schemaId)\n throw new Error('decodeAxisRequestBinary: schemaId mismatch');\n\n // body_hash check\n const bh = sha256(bodyBytes);\n if (!Buffer.from(hdr.bodyHash).equals(bh))\n throw new Error('decodeAxisRequestBinary: body_hash mismatch');\n\n // validate + decode body\n const body = tlvsToLogicalBody(schema, bodyTlvs, limits);\n\n const sensorInput: SensorInputLike = {\n hdrTLVs: tlvsToMap(hdrTlvs),\n bodyTLVs: tlvsToMap(bodyTlvs),\n schemaId: hdr.schemaId,\n intentId: hdr.intentId,\n };\n\n return { hdr, body, sensorInput };\n}\n\n// -----------------------------\n// Example Schemas\n// -----------------------------\n\nexport const Schema3100_DeviceContext: Ats1SchemaDescriptor = {\n schemaId: 3100,\n name: 'device.context',\n strict: true,\n maxNestingDepth: 4,\n fields: [\n { tag: 1, name: 'deviceId', type: 'bytes', required: true, maxLen: 128 },\n { tag: 2, name: 'os', type: 'utf8', required: true, maxLen: 64 },\n { tag: 3, name: 'hw', type: 'utf8', required: true, maxLen: 64 },\n ],\n};\n\nexport const Schema2001_PasskeyLoginOptionsReq: Ats1SchemaDescriptor = {\n schemaId: 2001,\n name: 'axis.auth.passkey.login.options.req',\n strict: true,\n maxNestingDepth: 4,\n fields: [\n { tag: 1, name: 'username', type: 'utf8', required: true, maxLen: 128 },\n ],\n};\n\nexport const Schema4001_LoginWithDeviceReq: Ats1SchemaDescriptor = {\n schemaId: 4001,\n name: 'axis.auth.login.with_device.req',\n strict: true,\n maxNestingDepth: 4,\n fields: [\n { tag: 1, name: 'username', type: 'utf8', required: true, maxLen: 128 },\n {\n tag: 2,\n name: 'device',\n type: 'nested',\n required: true,\n nestedSchema: Schema3100_DeviceContext,\n },\n ],\n};\n","import { ATS1_HDR, ATS1_SCHEMA } from './ats1.constants';\nimport * as ats1 from './ats1';\n\n/**\n * Build canonical hdr for any request using ATS1 codec.\n */\nexport function buildAts1Hdr(params: {\n intentId: number;\n schemaId: number;\n actorKeyId?: Buffer;\n capsuleId?: Buffer;\n traceId?: Buffer;\n tsMs?: bigint;\n nonce?: Buffer;\n bodyHash?: Buffer;\n}): Buffer {\n const hdr: ats1.AxisHeaderLogical = {\n intentId: params.intentId,\n schemaId: params.schemaId,\n actorKeyId: params.actorKeyId ?? Buffer.alloc(0),\n capsuleId: params.capsuleId,\n nonce: params.nonce ?? require('crypto').randomBytes(16),\n tsMs: params.tsMs ?? BigInt(Date.now()),\n bodyHash: params.bodyHash ?? Buffer.alloc(32),\n traceId: params.traceId,\n };\n\n const tlvs = ats1.encodeAxisHeaderToTLVs(hdr);\n return ats1.encodeTLVStreamCanonical(tlvs);\n}\n\n/**\n * PASSKEY: login.options.req\n * schema 2001 body:\n * - (1) username: utf8\n */\nexport function packPasskeyLoginOptionsReq(params: {\n intentId: number;\n username: string;\n actorKeyId?: Buffer;\n capsuleId?: Buffer;\n traceId?: Buffer;\n}) {\n const bodyTlvs = ats1.logicalBodyToTLVs(\n ats1.Schema2001_PasskeyLoginOptionsReq,\n {\n schemaId: ATS1_SCHEMA.PASSKEY_LOGIN_OPTIONS_REQ,\n fields: { username: params.username },\n },\n );\n const body = ats1.encodeTLVStreamCanonical(bodyTlvs);\n const bodyHash = ats1.sha256(body);\n\n const hdr = buildAts1Hdr({\n intentId: params.intentId,\n schemaId: ATS1_SCHEMA.PASSKEY_LOGIN_OPTIONS_REQ,\n actorKeyId: params.actorKeyId,\n capsuleId: params.capsuleId,\n traceId: params.traceId,\n bodyHash,\n });\n\n return { hdr, body };\n}\n\nexport function unpackPasskeyLoginOptionsReq(body: Buffer) {\n const tlvs = ats1.decodeTLVStream(body);\n const decoded = ats1.tlvsToLogicalBody(\n ats1.Schema2001_PasskeyLoginOptionsReq,\n tlvs,\n );\n return { username: decoded.fields.username as string };\n}\n\n/**\n * Defined schemas for passkey operations\n */\nexport const Schema2021_PasskeyRegisterOptionsReq: ats1.Ats1SchemaDescriptor = {\n schemaId: ATS1_SCHEMA.PASSKEY_REGISTER_OPTIONS_REQ,\n name: 'axis.auth.passkey.register.options.req',\n strict: true,\n maxNestingDepth: 4,\n fields: [\n { tag: 1, name: 'username', type: 'utf8', required: true, maxLen: 128 },\n ],\n};\n\nexport const Schema2011_PasskeyLoginVerifyReq: ats1.Ats1SchemaDescriptor = {\n schemaId: ATS1_SCHEMA.PASSKEY_LOGIN_VERIFY_REQ,\n name: 'axis.auth.passkey.login.verify.req',\n strict: true,\n maxNestingDepth: 4,\n fields: [\n { tag: 1, name: 'username', type: 'utf8', required: true, maxLen: 128 },\n {\n tag: 2,\n name: 'credentialId',\n type: 'bytes',\n required: true,\n maxLen: 1024,\n },\n {\n tag: 3,\n name: 'clientDataJSON',\n type: 'bytes',\n required: true,\n maxLen: 4096,\n },\n {\n tag: 4,\n name: 'authenticatorData',\n type: 'bytes',\n required: true,\n maxLen: 1024,\n },\n { tag: 5, name: 'signature', type: 'bytes', required: true, maxLen: 1024 },\n { tag: 6, name: 'userHandle', type: 'bytes', required: false, maxLen: 128 },\n ],\n};\n\n/**\n * PASSKEY: register.options.req\n */\nexport function packPasskeyRegisterOptionsReq(params: {\n intentId: number;\n username: string;\n actorKeyId?: Buffer;\n traceId?: Buffer;\n}) {\n const bodyTlvs = ats1.logicalBodyToTLVs(\n Schema2021_PasskeyRegisterOptionsReq,\n {\n schemaId: ATS1_SCHEMA.PASSKEY_REGISTER_OPTIONS_REQ,\n fields: { username: params.username },\n },\n );\n const body = ats1.encodeTLVStreamCanonical(bodyTlvs);\n const bodyHash = ats1.sha256(body);\n\n const hdr = buildAts1Hdr({\n intentId: params.intentId,\n schemaId: ATS1_SCHEMA.PASSKEY_REGISTER_OPTIONS_REQ,\n actorKeyId: params.actorKeyId,\n traceId: params.traceId,\n bodyHash,\n });\n\n return { hdr, body };\n}\n\nexport function unpackPasskeyRegisterOptionsReq(body: Buffer) {\n const tlvs = ats1.decodeTLVStream(body);\n const decoded = ats1.tlvsToLogicalBody(\n Schema2021_PasskeyRegisterOptionsReq,\n tlvs,\n );\n return { username: decoded.fields.username as string };\n}\n\n/**\n * PASSKEY: login.verify.req\n */\nexport function packPasskeyLoginVerifyReq(params: {\n intentId: number;\n username: string;\n credentialId: Buffer;\n clientDataJSON: Buffer;\n authenticatorData: Buffer;\n signature: Buffer;\n userHandle?: Buffer;\n actorKeyId?: Buffer;\n traceId?: Buffer;\n}) {\n const bodyTlvs = ats1.logicalBodyToTLVs(Schema2011_PasskeyLoginVerifyReq, {\n schemaId: ATS1_SCHEMA.PASSKEY_LOGIN_VERIFY_REQ,\n fields: {\n username: params.username,\n credentialId: params.credentialId,\n clientDataJSON: params.clientDataJSON,\n authenticatorData: params.authenticatorData,\n signature: params.signature,\n userHandle: params.userHandle,\n },\n });\n\n const body = ats1.encodeTLVStreamCanonical(bodyTlvs);\n const bodyHash = ats1.sha256(body);\n\n const hdr = buildAts1Hdr({\n intentId: params.intentId,\n schemaId: ATS1_SCHEMA.PASSKEY_LOGIN_VERIFY_REQ,\n actorKeyId: params.actorKeyId,\n traceId: params.traceId,\n bodyHash,\n });\n\n return { hdr, body };\n}\n\nexport function unpackPasskeyLoginVerifyReq(body: Buffer) {\n const tlvs = ats1.decodeTLVStream(body);\n const decoded = ats1.tlvsToLogicalBody(\n Schema2011_PasskeyLoginVerifyReq,\n tlvs,\n );\n const f = decoded.fields;\n\n return {\n username: f.username as string,\n credentialId: f.credentialId as Buffer,\n clientDataJSON: f.clientDataJSON as Buffer,\n authenticatorData: f.authenticatorData as Buffer,\n signature: f.signature as Buffer,\n userHandle: f.userHandle as Buffer | undefined,\n };\n}\n\n// ========================================\n// Response Schemas\n// ========================================\n\n/**\n * Schema 2002: Passkey Login Options Response\n * - (1) challenge: bytes\n * - (2) timeout: uvarint (ms)\n * - (3) rpId: utf8\n * - (4) allowCredentials: bytes (nested TLV array, each item is id+type+transports)\n * - (5) userVerification: utf8\n */\nexport const Schema2002_PasskeyLoginOptionsRes: ats1.Ats1SchemaDescriptor = {\n schemaId: ATS1_SCHEMA.PASSKEY_LOGIN_OPTIONS_RES,\n name: 'axis.auth.passkey.login.options.res',\n strict: false, // allow extra fields from WebAuthn library\n maxNestingDepth: 4,\n fields: [\n { tag: 1, name: 'challenge', type: 'utf8', required: true }, // base64url string\n { tag: 2, name: 'timeout', type: 'uvarint', required: false },\n { tag: 3, name: 'rpId', type: 'utf8', required: false },\n { tag: 4, name: 'userVerification', type: 'utf8', required: false },\n { tag: 5, name: 'allowCredentialsJson', type: 'utf8', required: false }, // JSON array for simplicity\n ],\n};\n\nexport function packPasskeyLoginOptionsRes(params: {\n challenge: string;\n timeout?: number;\n rpId?: string;\n userVerification?: string;\n allowCredentials?: { id: string; type: string; transports?: string[] }[];\n}): Buffer {\n const fields: Record<string, any> = {\n challenge: params.challenge,\n };\n if (params.timeout !== undefined) fields.timeout = params.timeout;\n if (params.rpId) fields.rpId = params.rpId;\n if (params.userVerification)\n fields.userVerification = params.userVerification;\n if (params.allowCredentials)\n fields.allowCredentialsJson = JSON.stringify(params.allowCredentials);\n\n const bodyTlvs = ats1.logicalBodyToTLVs(Schema2002_PasskeyLoginOptionsRes, {\n schemaId: ATS1_SCHEMA.PASSKEY_LOGIN_OPTIONS_RES,\n fields,\n });\n return ats1.encodeTLVStreamCanonical(bodyTlvs);\n}\n\n/**\n * Schema 2012: Passkey Login Verify Response\n * - (1) actorId: utf8\n * - (2) keyId: utf8 (credentialId base64url)\n * - (3) capsule: bytes\n * - (4) expiresAt: u64be (ms)\n */\nexport const Schema2012_PasskeyLoginVerifyRes: ats1.Ats1SchemaDescriptor = {\n schemaId: ATS1_SCHEMA.PASSKEY_LOGIN_VERIFY_RES,\n name: 'axis.auth.passkey.login.verify.res',\n strict: true,\n maxNestingDepth: 4,\n fields: [\n { tag: 1, name: 'actorId', type: 'utf8', required: true, maxLen: 256 },\n { tag: 2, name: 'keyId', type: 'utf8', required: true, maxLen: 256 },\n { tag: 3, name: 'capsule', type: 'bytes', required: true, maxLen: 4096 },\n { tag: 4, name: 'expiresAt', type: 'u64be', required: true },\n ],\n};\n\nexport function packPasskeyLoginVerifyRes(params: {\n actorId: string;\n keyId: string;\n capsule: Buffer;\n expiresAt: bigint;\n}): Buffer {\n const bodyTlvs = ats1.logicalBodyToTLVs(Schema2012_PasskeyLoginVerifyRes, {\n schemaId: ATS1_SCHEMA.PASSKEY_LOGIN_VERIFY_RES,\n fields: {\n actorId: params.actorId,\n keyId: params.keyId,\n capsule: params.capsule,\n expiresAt: params.expiresAt,\n },\n });\n return ats1.encodeTLVStreamCanonical(bodyTlvs);\n}\n","// tlv.encode.ts\nimport { randomBytes } from 'crypto';\n\nexport function encVarint(x: bigint): Buffer {\n if (x < 0n) throw new Error('VARINT_NEG');\n const out: number[] = [];\n while (x >= 0x80n) {\n out.push(Number((x & 0x7fn) | 0x80n));\n x >>= 7n;\n }\n out.push(Number(x));\n return Buffer.from(out);\n}\n\nexport function varintU(x: number | bigint): Buffer {\n const v = typeof x === 'number' ? BigInt(x) : x;\n return encVarint(v);\n}\n\nexport function u64be(x: bigint): Buffer {\n if (x < 0n) throw new Error('U64_NEG');\n const b = Buffer.alloc(8);\n b.writeBigUInt64BE(x, 0);\n return b;\n}\n\nexport function utf8(s: string): Buffer {\n return Buffer.from(s, 'utf8');\n}\n\nexport function bytes(b: Uint8Array | Buffer): Buffer {\n return Buffer.isBuffer(b) ? b : Buffer.from(b);\n}\n\nexport function nonce16(): Buffer {\n return randomBytes(16);\n}\n\nexport function tlv(type: number, value: Buffer): Buffer {\n if (!Number.isSafeInteger(type) || type < 0) throw new Error('TLV_BAD_TYPE');\n return Buffer.concat([\n encVarint(BigInt(type)),\n encVarint(BigInt(value.length)),\n value,\n ]);\n}\n\n/**\n * Canonical TLV encoding:\n * - sorted by type ascending\n * - no duplicates by default\n */\nexport function buildTLVs(\n items: { type: number; value: Buffer }[],\n opts?: { allowDupTypes?: Set<number> },\n): Buffer {\n const allow = opts?.allowDupTypes ?? new Set<number>();\n const sorted = [...items].sort((a, b) => a.type - b.type);\n\n for (let i = 1; i < sorted.length; i++) {\n if (sorted[i].type === sorted[i - 1].type && !allow.has(sorted[i].type)) {\n throw new Error(`TLV_DUP_TYPE_${sorted[i].type}`);\n }\n }\n\n return Buffer.concat(sorted.map((it) => tlv(it.type, it.value)));\n}\n","// axis1.encode.ts\nimport { encVarint } from './tlv.encode';\n\nconst MAGIC = Buffer.from('AXIS1', 'ascii');\n\nexport type Axis1FrameToEncode = {\n ver: number; // 1\n flags: number; // bit flags\n hdr: Buffer; // TLVs\n body: Buffer; // TLVs or raw payload\n sig: Buffer; // signature bytes\n};\n\nexport function encodeAxis1Frame(f: Axis1FrameToEncode): Buffer {\n if (\n !Buffer.isBuffer(f.hdr) ||\n !Buffer.isBuffer(f.body) ||\n !Buffer.isBuffer(f.sig)\n ) {\n throw new Error('AXIS1_BAD_BUFFERS');\n }\n if (f.ver !== 1) throw new Error('AXIS1_BAD_VER');\n\n const hdrLen = encVarint(BigInt(f.hdr.length));\n const bodyLen = encVarint(BigInt(f.body.length));\n const sigLen = encVarint(BigInt(f.sig.length));\n\n return Buffer.concat([\n MAGIC,\n Buffer.from([f.ver & 0xff]),\n Buffer.from([f.flags & 0xff]),\n hdrLen,\n bodyLen,\n sigLen,\n f.hdr,\n f.body,\n f.sig,\n ]);\n}\n","// axis1.signing.ts\nimport { encVarint } from './tlv.encode';\n\nconst MAGIC = Buffer.from('AXIS1', 'ascii');\n\nexport function axis1SigningBytes(params: {\n ver: number;\n flags: number;\n hdr: Buffer;\n body: Buffer;\n}): Buffer {\n if (params.ver !== 1) throw new Error('AXIS1_BAD_VER');\n const hdrLen = encVarint(BigInt(params.hdr.length));\n const bodyLen = encVarint(BigInt(params.body.length));\n const sigLenZero = encVarint(0n); // IMPORTANT: sigLen=0 in signing bytes\n\n return Buffer.concat([\n MAGIC,\n Buffer.from([params.ver & 0xff]),\n Buffer.from([params.flags & 0xff]),\n hdrLen,\n bodyLen,\n sigLenZero,\n params.hdr,\n params.body,\n ]);\n}\n","/**\n * Base64url encoding/decoding utilities\n * RFC 4648 base64url (URL-safe, no padding)\n */\n\n/**\n * Encode buffer to base64url string\n * @param buf - Buffer to encode\n * @returns Base64url string (no padding, URL-safe)\n */\nexport function b64urlEncode(buf: Buffer): string {\n return buf\n .toString('base64')\n .replace(/=/g, '')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_');\n}\n\n/**\n * Decode base64url string to buffer\n * @param str - Base64url string\n * @returns Decoded buffer\n */\nexport function b64urlDecode(str: string): Buffer {\n // Add padding if needed\n const pad = str.length % 4 ? '='.repeat(4 - (str.length % 4)) : '';\n const base64 = (str + pad).replace(/-/g, '+').replace(/_/g, '/');\n return Buffer.from(base64, 'base64');\n}\n\n/**\n * Encode string to base64url\n * @param str - String to encode\n * @param encoding - String encoding (default: utf8)\n * @returns Base64url string\n */\nexport function b64urlEncodeString(\n str: string,\n encoding: BufferEncoding = 'utf8',\n): string {\n return b64urlEncode(Buffer.from(str, encoding));\n}\n\n/**\n * Decode base64url string to string\n * @param str - Base64url string\n * @param encoding - String encoding (default: utf8)\n * @returns Decoded string\n */\nexport function b64urlDecodeString(\n str: string,\n encoding: BufferEncoding = 'utf8',\n): string {\n return b64urlDecode(str).toString(encoding);\n}\n","/**\n * Canonical JSON serialization for stable cryptographic signing\n *\n * Rules:\n * - Recursively sort object keys lexicographically\n * - Remove undefined values\n * - Preserve array order\n * - No whitespace in output\n * - Stable number formatting\n */\n\n/**\n * Recursively sort object keys and remove undefined values\n */\nfunction sortRec(value: any): any {\n if (value === null) {\n return null;\n }\n\n if (value === undefined) {\n return undefined;\n }\n\n if (Array.isArray(value)) {\n return value.map(sortRec);\n }\n\n if (typeof value === 'object') {\n const sorted: Record<string, any> = {};\n const keys = Object.keys(value).sort();\n\n for (const key of keys) {\n const sortedValue = sortRec(value[key]);\n // Skip undefined values\n if (sortedValue !== undefined) {\n sorted[key] = sortedValue;\n }\n }\n\n return sorted;\n }\n\n // Primitive types (number, string, boolean)\n return value;\n}\n\n/**\n * Convert value to canonical JSON string for signing\n *\n * @param value - Value to canonicalize\n * @returns Canonical JSON string (no whitespace, sorted keys, no undefined)\n */\nexport function canonicalJson(value: any): string {\n return JSON.stringify(sortRec(value));\n}\n\n/**\n * Helper to create canonical JSON for signing (excluding specific fields)\n *\n * @param obj - Object to canonicalize\n * @param exclude - Fields to exclude (e.g., 'sig' when signing)\n * @returns Canonical JSON string\n */\nexport function canonicalJsonExcluding(\n obj: Record<string, any>,\n exclude: string[],\n): string {\n const filtered: Record<string, any> = {};\n\n for (const key in obj) {\n if (!exclude.includes(key) && obj[key] !== undefined) {\n filtered[key] = obj[key];\n }\n }\n\n return canonicalJson(filtered);\n}\n","export class ContractViolationError extends Error {\n constructor(\n public code: string,\n message: string,\n ) {\n super(message);\n this.name = 'ContractViolationError';\n }\n}\n\nexport interface ExecutionMetrics {\n dbWrites: number;\n dbReads: number;\n externalCalls: number;\n elapsedMs: number;\n}\n\nexport class ExecutionMeter {\n private dbWrites = 0;\n private dbReads = 0;\n private externalCalls = 0;\n private startTime: number;\n private contract: any; // ExecutionContract\n\n constructor(contract: any) {\n this.contract = contract;\n this.startTime = Date.now();\n }\n\n recordDbWrite(): void {\n this.dbWrites++;\n if (this.dbWrites > this.contract.maxDbWrites) {\n throw new ContractViolationError(\n 'MAX_DB_WRITES_EXCEEDED',\n `DB writes exceeded: ${this.dbWrites}/${this.contract.maxDbWrites}`,\n );\n }\n }\n\n recordDbRead(): void {\n this.dbReads++;\n if (this.contract.maxDbReads && this.dbReads > this.contract.maxDbReads) {\n throw new ContractViolationError(\n 'MAX_DB_READS_EXCEEDED',\n `DB reads exceeded: ${this.dbReads}/${this.contract.maxDbReads}`,\n );\n }\n }\n\n recordExternalCall(): void {\n this.externalCalls++;\n if (this.externalCalls > this.contract.maxExternalCalls) {\n throw new ContractViolationError(\n 'MAX_EXTERNAL_CALLS_EXCEEDED',\n `External calls exceeded: ${this.externalCalls}/${this.contract.maxExternalCalls}`,\n );\n }\n }\n\n checkTime(): void {\n const elapsed = Date.now() - this.startTime;\n if (elapsed > this.contract.maxTimeMs) {\n throw new ContractViolationError(\n 'MAX_TIME_EXCEEDED',\n `Execution time exceeded: ${elapsed}ms/${this.contract.maxTimeMs}ms`,\n );\n }\n }\n\n validateEffect(effect: string): void {\n // Wildcard allows any effect\n if (this.contract.allowedEffects.includes('*')) {\n return;\n }\n\n if (!this.contract.allowedEffects.includes(effect)) {\n throw new ContractViolationError(\n 'INVALID_EFFECT',\n `Effect '${effect}' not allowed. Allowed: ${this.contract.allowedEffects.join(', ')}`,\n );\n }\n }\n\n getMetrics(): ExecutionMetrics {\n return {\n dbWrites: this.dbWrites,\n dbReads: this.dbReads,\n externalCalls: this.externalCalls,\n elapsedMs: Date.now() - this.startTime,\n };\n }\n\n getContract() {\n return this.contract;\n }\n}\n","export interface ExecutionContract {\n maxDbWrites: number;\n maxDbReads?: number;\n maxExternalCalls: number;\n maxTimeMs: number;\n allowedEffects: string[];\n maxMemoryMb?: number;\n}\n\nexport const DEFAULT_CONTRACTS: Record<string, ExecutionContract> = {\n // System intents\n 'system.ping': {\n maxDbWrites: 0,\n maxExternalCalls: 0,\n maxTimeMs: 100,\n allowedEffects: ['system.pong'],\n },\n\n // Catalog intents\n 'catalog.list': {\n maxDbWrites: 0,\n maxExternalCalls: 0,\n maxTimeMs: 200,\n allowedEffects: ['catalog.listed'],\n },\n 'catalog.search': {\n maxDbWrites: 0,\n maxExternalCalls: 0,\n maxTimeMs: 300,\n allowedEffects: ['catalog.searched'],\n },\n\n // Passport intents\n 'passport.issue': {\n maxDbWrites: 10,\n maxExternalCalls: 0,\n maxTimeMs: 500,\n allowedEffects: ['passport.issued', 'passport.rejected'],\n },\n 'passport.revoke': {\n maxDbWrites: 5,\n maxExternalCalls: 0,\n maxTimeMs: 300,\n allowedEffects: ['passport.revoked', 'passport.revoke_failed'],\n },\n\n // File intents\n 'file.init': {\n maxDbWrites: 2,\n maxExternalCalls: 0,\n maxTimeMs: 200,\n allowedEffects: ['file.initialized'],\n },\n 'file.chunk': {\n maxDbWrites: 2,\n maxExternalCalls: 0,\n maxTimeMs: 1000,\n allowedEffects: ['file.chunk.stored'],\n },\n 'file.finalize': {\n maxDbWrites: 2,\n maxExternalCalls: 0,\n maxTimeMs: 500,\n allowedEffects: ['file.finalized'],\n },\n\n // Stream intents\n 'stream.publish': {\n maxDbWrites: 1,\n maxExternalCalls: 0,\n maxTimeMs: 200,\n allowedEffects: ['stream.published'],\n },\n 'stream.read': {\n maxDbWrites: 0,\n maxExternalCalls: 0,\n maxTimeMs: 300,\n allowedEffects: ['stream.data'],\n },\n\n // Mail intents\n 'mail.send': {\n maxDbWrites: 3,\n maxExternalCalls: 1, // Email service\n maxTimeMs: 2000,\n allowedEffects: ['mail.sent', 'mail.failed'],\n },\n};\n\n// Default contract for unknown intents\nexport const FALLBACK_CONTRACT: ExecutionContract = {\n maxDbWrites: 10,\n maxExternalCalls: 0,\n maxTimeMs: 1000,\n allowedEffects: ['*'], // Allow any effect\n};\n","/**\n * Decodes a variable-length integer (Varint) from a buffer.\n * Supports up to 64-bit integers.\n *\n * @param {Buffer} buf - The buffer to read from\n * @param {number} off - The offset to start reading from\n * @returns {Object} The decoded bigint value and the new offset\n * @throws {Error} If the varint is malformed or exceeds 64 bits\n */\nexport function decVarint(\n buf: Buffer,\n off: number,\n): { val: bigint; off: number } {\n let shift = 0n;\n let x = 0n;\n while (true) {\n if (off >= buf.length) throw new Error('varint overflow');\n const b = BigInt(buf[off++]);\n x |= (b & 0x7fn) << shift;\n if ((b & 0x80n) === 0n) break;\n shift += 7n;\n if (shift > 63n) throw new Error('varint too large');\n }\n return { val: x, off };\n}\n\nimport type { TLV } from '../core/tlv';\n\n/**\n * Parses a buffer into an array of TLV objects.\n *\n * @param {Buffer} buf - The buffer containing TLV-encoded data\n * @param {number} [maxItems=512] - Security limit for the number of TLVs to parse\n * @returns {TLV[]} An array of parsed TLVs\n * @throws {Error} If TLV structure is invalid or limits are exceeded\n */\nexport function parseTLVs(buf: Buffer, maxItems: number = 512): TLV[] {\n const out: TLV[] = [];\n let off = 0;\n while (off < buf.length) {\n if (out.length >= maxItems) throw new Error('TLV_TOO_MANY_ITEMS');\n const t1 = decVarint(buf, off);\n off = t1.off;\n const t2 = decVarint(buf, off);\n off = t2.off;\n const type = Number(t1.val);\n const len = Number(t2.val);\n if (len < 0 || off + len > buf.length) {\n throw new Error('TLV_LEN_INVALID');\n }\n const value = buf.subarray(off, off + len);\n off += len;\n out.push({ type, value });\n }\n return out;\n}\n\n/**\n * Parses TLVs and organizes them into a Map for efficient access.\n * Multiple values for the same type are preserved in an array.\n *\n * @param {Buffer} buf - The raw TLV-encoded buffer\n * @returns {Map<number, Buffer[]>} A map of Tag -> [Values]\n */\nexport function tlvMap(buf: Buffer): Map<number, Buffer[]> {\n const m = new Map<number, Buffer[]>();\n for (const it of parseTLVs(buf)) {\n const arr = m.get(it.type) ?? [];\n arr.push(it.value as Buffer);\n m.set(it.type, arr);\n }\n return m;\n}\n\nexport function asUtf8(b?: Buffer): string | undefined {\n if (!b) return undefined;\n return b.toString('utf8');\n}\n\nexport function asBigintVarint(b?: Buffer): bigint | undefined {\n if (!b) return undefined;\n const { val, off } = decVarint(b, 0);\n if (off !== b.length) throw new Error('VARINT_TRAILING_BYTES');\n return val;\n}\n\n/**\n * Parses an 8-byte big-endian buffer as a BigInt.\n * Used for timestamps which are sent as fixed 8-byte u64.\n */\nexport function asBigint64BE(b?: Buffer): bigint | undefined {\n if (!b) return undefined;\n if (b.length !== 8) throw new Error('Expected 8 bytes for u64');\n return b.readBigUInt64BE(0);\n}\n\nexport function encVarint(x: bigint): Buffer {\n if (x < 0n) throw new Error('varint neg');\n const out: number[] = [];\n while (x >= 0x80n) {\n out.push(Number((x & 0x7fn) | 0x80n));\n x >>= 7n;\n }\n out.push(Number(x));\n return Buffer.from(out);\n}\n\nexport function tlv(type: number, value: Buffer): Buffer {\n return Buffer.concat([\n encVarint(BigInt(type)),\n encVarint(BigInt(value.length)),\n value,\n ]);\n}\n\nexport function buildTLVs(items: { type: number; value: Buffer }[]): Buffer {\n // Canonical: sort by type ascending\n const sorted = [...items].sort((a, b) => a.type - b.type);\n\n // Canonical: forbid duplicate tags by default\n for (let i = 1; i < sorted.length; i++) {\n if (sorted[i].type === sorted[i - 1].type) {\n throw new Error(`TLV_DUP_TYPE_${sorted[i].type}`);\n }\n }\n\n return Buffer.concat(sorted.map((it) => tlv(it.type, it.value)));\n}\n\nexport function u64be(x: bigint): Buffer {\n const b = Buffer.alloc(8);\n b.writeBigUInt64BE(x);\n return b;\n}\n\nexport function utf8(s: string): Buffer {\n return Buffer.from(s, 'utf8');\n}\n\nexport function varintU(x: number | bigint): Buffer {\n const v = typeof x === 'number' ? BigInt(x) : x;\n return encVarint(v);\n}\n","import { decVarint } from './tlv';\n\n/**\n * Axis1DecodedFrame\n *\n * Represents a parsed AXIS v1 binary frame.\n *\n * @typedef {Object} Axis1DecodedFrame\n */\nexport type Axis1DecodedFrame = {\n /** Protocol version (should be 1) */\n ver: number;\n /** Frame flags for protocol extensions */\n flags: number;\n /** Raw header bytes (containing primary TLVs) */\n hdr: Buffer;\n /** Raw body bytes (the main payload) */\n body: Buffer;\n /** Cryptographic signature bytes */\n sig: Buffer;\n /** Total original size of the frame in bytes */\n frameSize: number;\n};\n\nconst MAGIC = Buffer.from('AXIS1', 'ascii');\n\n/**\n * Decodes a raw binary buffer into a structured Axis1DecodedFrame.\n * Implements the AXIS v1 wire format specification.\n *\n * **Binary Structure:**\n * 1. Magic: 'AXIS1' (5 bytes)\n * 2. Version: (1 byte)\n * 3. Flags: (1 byte)\n * 4. HDR_LEN: Varint\n * 5. BODY_LEN: Varint\n * 6. HDR: (HDR_LEN bytes)\n * 7. BODY: (BODY_LEN bytes)\n * 8. SIG_LEN: Varint\n * 9. SIG: (SIG_LEN bytes)\n *\n * @param {Buffer} buf - Raw bytes from the wire\n * @returns {Axis1DecodedFrame} Parsed frame object\n * @throws {Error} If magic is invalid, frame is truncated, or lengths are inconsistent\n */\nexport function decodeAxis1Frame(buf: Buffer): Axis1DecodedFrame {\n let off = 0;\n\n const magic = buf.subarray(off, off + 5);\n off += 5;\n if (magic.length !== 5 || !magic.equals(MAGIC))\n throw new Error('AXIS1_BAD_MAGIC');\n\n if (off + 2 > buf.length) throw new Error('AXIS1_TRUNCATED');\n const ver = buf[off++];\n const flags = buf[off++];\n\n const h1 = decVarint(buf, off);\n off = h1.off;\n const b1 = decVarint(buf, off);\n off = b1.off;\n const s1 = decVarint(buf, off);\n off = s1.off;\n\n const hdrLen = Number(h1.val);\n const bodyLen = Number(b1.val);\n const sigLen = Number(s1.val);\n\n if (hdrLen < 0 || bodyLen < 0 || sigLen < 0) throw new Error('AXIS1_LEN_NEG');\n\n if (off + hdrLen + bodyLen + sigLen > buf.length)\n throw new Error('AXIS1_TRUNCATED_PAYLOAD');\n\n const hdr = buf.subarray(off, off + hdrLen);\n off += hdrLen;\n const body = buf.subarray(off, off + bodyLen);\n off += bodyLen;\n const sig = buf.subarray(off, off + sigLen);\n off += sigLen;\n\n if (off !== buf.length) throw new Error('AXIS1_TRAILING_BYTES');\n\n return { ver, flags, hdr, body, sig, frameSize: buf.length };\n}\n","import {\n TLV_ACTOR_ID,\n TLV_INTENT,\n TLV_NONCE,\n TLV_PID,\n TLV_PROOF_REF,\n TLV_PROOF_TYPE,\n TLV_TS,\n} from '../core/constants';\nimport { asBigint64BE, asBigintVarint, asUtf8, tlvMap } from './tlv';\n\n/**\n * AXIS TLV Tag Definitions (as per specification)\n */\nexport const T = {\n /** The specific intent or action (e.g., 'vault.create') */\n INTENT: TLV_INTENT,\n /** Package identifier / ID */\n PID: TLV_PID,\n /** Versioning of the intent schema */\n INTENT_VERSION: 10, // Defaulting to TRACE_ID for now or a new tag if available\n /** Unique identifier for the requesting actor */\n ACTOR_ID: TLV_ACTOR_ID,\n /** Optional Capability Token identifier (16 bytes) */\n CAPSULE_ID: TLV_PROOF_REF,\n /** Unique session/request identifier (16 bytes) */\n NONCE: TLV_NONCE,\n /** High-precision Unix timestamp in milliseconds */\n TS_MS: TLV_TS,\n /** Proof type */\n PROOF_TYPE: TLV_PROOF_TYPE,\n /** Standard binary body tag */\n BODY: 100,\n /** Standard JSON-encoded body tag */\n JSON: 200,\n};\n\n/**\n * AxisPacket\n *\n * A high-level representation of an AXIS message after TLV decoding.\n * Combines header metadata with the raw body and signature.\n *\n * @typedef {Object} AxisPacket\n */\nexport type AxisPacket = {\n /** The intent string */\n intent: string;\n /** Intent schema version */\n intentVersion: number;\n /** Actor identifier */\n actorId: string;\n /** Optional binary Capsule ID */\n capsuleId?: Buffer;\n /** Packet identifier */\n pid: Buffer;\n /** Random nonce for replay protection */\n nonce: Buffer;\n /** Request timestamp */\n tsMs: bigint;\n /** Decoded header TLV map */\n headersMap: Map<number, Buffer[]>;\n /** Decoded body TLV map (if body contains TLVs) */\n bodyMap: Map<number, Buffer[]>;\n /** Original raw header bytes */\n hdrBytes: Buffer;\n /** Original raw body bytes */\n bodyBytes: Buffer;\n /** Cryptographic signature of the frame */\n sig: Buffer;\n};\n\n/**\n * Constructs a structured AxisPacket from raw header, body, and signature buffers.\n * Performs rigorous validation on mandatory AXIS fields.\n *\n * @param {Buffer} hdr - Raw header bytes containing the primary TLVs\n * @param {Buffer} body - Raw body bytes\n * @param {Buffer} sig - Signature bytes for the frame\n * @param {number} [flags=0] - Frame flags (bit 0 = BODY_IS_TLV)\n * @returns {AxisPacket} A fully validated AxisPacket object\n * @throws {Error} If mandatory fields (intent, version, actor, nonce, ts) are missing or malformed\n */\nexport function buildPacket(\n hdr: Buffer,\n body: Buffer,\n sig: Buffer,\n flags: number = 0,\n): AxisPacket {\n const hm = tlvMap(hdr);\n\n // Only parse body as TLV if BODY_IS_TLV flag is set (bit 0)\n const BODY_IS_TLV = 0x01;\n const bm = flags & BODY_IS_TLV ? tlvMap(body) : new Map<number, Buffer[]>();\n\n const intent = asUtf8(hm.get(T.INTENT)?.[0]);\n const intentVerRaw = hm.get(T.INTENT_VERSION)?.[0];\n const intentVer = intentVerRaw ? Number(asBigintVarint(intentVerRaw)) : 1;\n const actorIdRaw = hm.get(T.ACTOR_ID)?.[0];\n const actorId = actorIdRaw ? actorIdRaw.toString('hex') : undefined;\n const capsuleId = hm.get(T.CAPSULE_ID)?.[0];\n const pid = hm.get(T.PID)?.[0] || hm.get(T.NONCE)?.[0]; // Fallback to nonce if pid missing\n const nonce = hm.get(T.NONCE)?.[0];\n const tsMs = asBigint64BE(hm.get(T.TS_MS)?.[0]);\n\n if (!intent) throw new Error('PACKET_MISSING_INTENT');\n if (!actorId) throw new Error('PACKET_MISSING_ACTOR_ID');\n if (!nonce || nonce.length < 16 || nonce.length > 32)\n throw new Error('PACKET_BAD_NONCE');\n if (!pid) throw new Error('PACKET_MISSING_PID');\n if (!tsMs) throw new Error('PACKET_MISSING_TS');\n\n return {\n intent,\n intentVersion: intentVer,\n actorId,\n capsuleId,\n pid,\n nonce,\n tsMs,\n headersMap: hm,\n bodyMap: bm,\n hdrBytes: hdr,\n bodyBytes: body,\n sig,\n };\n}\n","import { OnModuleInit } from '@nestjs/common';\nimport type { AxisObservedContext } from '../types/axis-frame.types';\n\n/**\n * Sensor Phase Metadata\n *\n * Metadata describing which phase(s) a sensor executes in.\n * Used for validation and optimization.\n *\n * @interface SensorPhaseMetadata\n */\nexport interface SensorPhaseMetadata {\n /** Execution phase: pre-decode (middleware) or post-decode (controller) */\n phase: 'PRE_DECODE' | 'POST_DECODE';\n\n /** Other sensors that must run before this one */\n dependencies?: string[];\n\n /** Whether this sensor can perform async I/O */\n asyncOk?: boolean;\n\n /** Whether this sensor can use cryptographic operations */\n cryptoOk?: boolean;\n\n /** Human-readable description of sensor purpose */\n description?: string;\n}\n\n/**\n * AXIS Sensor Interface\n *\n * Core interface for all security sensors in the AXIS pipeline.\n */\nexport interface AxisSensor {\n readonly name: string;\n readonly order?: number; // Lower runs first\n /** Execution phase hint */\n phase?: SensorPhaseMetadata | 'PRE_DECODE' | 'POST_DECODE';\n supports?(input: SensorInput): boolean;\n run(input: SensorInput): Promise<SensorDecision>;\n}\n\n// Optional capability (only some sensors need it)\nexport interface AxisSensorInit extends AxisSensor, OnModuleInit {}\n\n/**\n * Sensors that run before frame decoding/deserialization.\n * They should be fast, avoid I/O, and fail fast on malformed traffic.\n */\nexport interface AxisPreSensor extends AxisSensor {\n phase: 'PRE_DECODE';\n}\n\n/**\n * Sensors that run after a frame is fully decoded and parsed.\n * They may use full context (intent, actor, proofs) and can perform I/O.\n */\nexport interface AxisPostSensor extends AxisSensor {\n phase: 'POST_DECODE';\n}\n\n/**\n * Sensor Input\n *\n * Represents the structured data passed to a security sensor for evaluation.\n * Depending on the execution phase, different fields may be populated.\n *\n * **Flow:**\n * - **Phase 1 (Pre-decode):** `rawBytes`, `ip`, `path`, and `peek` are typically available.\n * - **Phase 2/3 (Post-decode):** `intent`, `contentLength`, and `metadata` are populated after frame parsing.\n *\n * @interface SensorInput\n */\nexport interface SensorInput {\n /** The full raw binary frame from the wire (if available) */\n rawBytes?: Buffer | Uint8Array;\n\n /** The AXIS intent string extracted from the frame header (e.g., 'system.info') */\n intent?: string;\n\n /** IPv4/IPv6 address of the edge client */\n ip?: string;\n\n /** The HTTP or transport path being accessed */\n path?: string;\n\n /** Total size of the frame body in bytes */\n contentLength?: number;\n\n /** A small slice of the beginning of the body for early pattern matching */\n peek?: Uint8Array;\n\n /** Geolocation country code (if resolved by upstream middleware) */\n country?: string;\n\n /** Client identifier from the transport layer (e.g., Capsule ID or Socket ID) */\n clientId?: string;\n\n /** Whether the request is coming via a WebSocket connection */\n isWs?: boolean;\n\n /** Extensible metadata for cross-sensor communication */\n metadata?: Record<string, any>;\n\n /** Actor ID from frame or request */\n actorId?: string;\n\n /** Operation code */\n opcode?: string;\n\n /** Audience field */\n aud?: string;\n\n /** Observed context from frame parsing */\n observed?: AxisObservedContext;\n\n /** Parsed frame body */\n frameBody?: any;\n\n /** Device identifier */\n deviceId?: string;\n\n /** Session identifier */\n sessionId?: string;\n\n /** Parsed packet data */\n packet?: Record<string, any>;\n\n /** Dynamic field access for sensor-specific data */\n [key: string]: any;\n}\n\nexport enum Decision {\n ALLOW = 'ALLOW',\n DENY = 'DENY',\n THROTTLE = 'THROTTLE',\n FLAG = 'FLAG',\n}\n/**\n * Sensor Decision\n *\n * Represents the outcome of an individual sensor's evaluation.\n * Supports two formats for backward compatibility:\n *\n * 1. Modern format (preferred): Uses decision/allow/riskScore/reasons\n * 2. Legacy format: Uses action/code/reason (deprecated, will be removed)\n */\nexport type SensorDecision =\n // Modern format (preferred)\n | {\n /** Final decision outcome (optional for backward compatibility) */\n decision?: Decision;\n /** Whether the request may continue immediately */\n allow: boolean;\n /** Risk score from 0–100 (0 = safe, 100 = blocked) */\n riskScore: number;\n /** Human & machine traceable reasons */\n reasons: string[];\n /** Machine-readable error or control code */\n code?: string;\n /** Throttle hint (only relevant for THROTTLE) */\n retryAfterMs?: number;\n /** Optional delta applied to rolling risk/anomaly state */\n scoreDelta?: number;\n /** Extra signals for audit, observability, forensics */\n tags?: Record<string, any>;\n /** Optional capsule / verification metadata */\n meta?: any;\n /** Optional constraint tightening instructions */\n tighten?: {\n expSecondsMax?: number;\n constraintsPatch?: Record<string, any>;\n };\n }\n // Legacy action-based format (deprecated)\n | { action: 'ALLOW'; meta?: any }\n | {\n action: 'DENY';\n code: string;\n reason?: string;\n retryAfterMs?: number;\n meta?: any;\n }\n | { action: 'THROTTLE'; retryAfterMs: number; meta?: any }\n | { action: 'FLAG'; scoreDelta: number; reasons: string[]; meta?: any };\n\nexport type SensorMinifiedDecision = {\n allow: boolean;\n riskScore: number;\n reasons: string[];\n tags?: Record<string, any>;\n meta?: any;\n tighten?: { expSecondsMax?: number; constraintsPatch?: Record<string, any> };\n /** Legacy fields for compatibility */\n retryAfterMs?: number;\n};\n\n/**\n * Helper to normalize SensorDecision (handles both legacy and modern formats)\n */\nexport function normalizeSensorDecision(\n sensorDecision: SensorDecision,\n): SensorMinifiedDecision {\n // Check if it's a legacy action-based format\n if ('action' in sensorDecision) {\n // Convert legacy format to modern\n switch (sensorDecision.action) {\n case 'ALLOW':\n return {\n allow: true,\n riskScore: 0,\n reasons: [],\n meta: sensorDecision.meta,\n };\n case 'DENY':\n return {\n allow: false,\n riskScore: 100,\n reasons: [sensorDecision.code, sensorDecision.reason].filter(\n Boolean,\n ) as string[],\n meta: sensorDecision.meta,\n retryAfterMs: sensorDecision.retryAfterMs,\n };\n case 'THROTTLE':\n return {\n allow: false,\n riskScore: 50,\n reasons: ['RATE_LIMIT'],\n retryAfterMs: sensorDecision.retryAfterMs,\n meta: sensorDecision.meta,\n };\n case 'FLAG':\n return {\n allow: true,\n riskScore: sensorDecision.scoreDelta,\n reasons: sensorDecision.reasons,\n meta: sensorDecision.meta,\n };\n }\n }\n\n // Modern format - already has the required fields\n return {\n allow: sensorDecision.allow,\n riskScore: sensorDecision.riskScore,\n reasons: sensorDecision.reasons,\n tags: sensorDecision.tags,\n meta: sensorDecision.meta,\n tighten: sensorDecision.tighten,\n retryAfterMs: sensorDecision.retryAfterMs,\n };\n}\n\n/**\n * Helper factories for creating SensorDecision objects\n */\nexport const SensorDecisions = {\n allow(meta?: any, tags?: Record<string, any>): SensorDecision {\n return {\n decision: Decision.ALLOW,\n allow: true,\n riskScore: 0,\n reasons: [],\n tags,\n meta,\n };\n },\n\n deny(code: string, reason?: string, meta?: any): SensorDecision {\n return {\n decision: Decision.DENY,\n allow: false,\n riskScore: 100,\n code,\n reasons: [code, reason].filter(Boolean) as string[],\n meta,\n };\n },\n\n throttle(retryAfterMs: number, meta?: any): SensorDecision {\n return {\n decision: Decision.THROTTLE,\n allow: false,\n riskScore: 50,\n retryAfterMs,\n code: 'RATE_LIMIT',\n reasons: ['RATE_LIMIT'],\n meta,\n };\n },\n\n flag(scoreDelta: number, reasons: string[], meta?: any): SensorDecision {\n return {\n decision: Decision.FLAG,\n allow: true,\n riskScore: scoreDelta,\n scoreDelta,\n reasons,\n meta,\n };\n },\n};\n"],"mappings":"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","names":["import_common","bytes","map","bytes","tlv","sha256","sha256","import_crypto","MAGIC","MAGIC","Decision"]}
|