Definitions#

These TypeScript definitions document server validation. check.object rejects unknown fields. Custom functions and refinements specify additional checks.

Imported definitions#

revision#

revision = check.integer()

Related definitions:

accountProof#

accountProof = check.object({ agentId: check.identifier, accessToken: check.text(8192) })

Related definitions:

instance#

instance = check.object({ instanceKey: check.name, name: check.name, identity: check.optional(accountProof), coordinationPolicy })

Related definitions:

roster#

roster = { controller, controllerCredential: check.optional(check.text(200)), ownerMatrixId: check.matrixUserId, fleetKey: check.name, instances: check.list(instance, 100, 1) }

Related definitions:

preflight#

preflight = check.object(roster)

Related definitions:

enrollment#

enrollment = check.object({ ...roster, enrollmentId: check.identifier, claimSecret: check.secret })

Related definitions:

enrollmentDecision#

enrollmentDecision = check.object({ expectedRevision: revision, decision: check.choice('approve', 'reject'), verificationCode: check.text(12, 12) })

Related definitions:

exchange#

exchange = check.object({ claimSecret: check.secret })

Related definitions:

session#

session = check.object({ nativeAccessToken: check.text(8192) })

Related definitions:

agentChange#

agentChange = check.object({ expectedRevision: revision, status: check.optional(check.status) })

Related definitions:

wakeSelection#

wakeSelection = check.object({ principalId: check.identifier, includeAgents: check.boolean })

Related definitions:

wakePolicy#

wakePolicy = check.refine(check.object({ expectedRevision: revision, mode: check.wakeMode, senders: check.list(wakeSelection, 2000) }), policy => new Set(policy.senders.map(sender => sender.principalId)).size === policy.senders.length
    && (policy.mode !== 'everyone' || policy.senders.length === 0), 'Select unique identities; everyone requires no individual selections')

Related definitions:

memberChange#

memberChange = check.object({ expectedRevision: revision, status: check.optional(check.status), displayName: check.optional(check.text(HUMAN_SIGNUP.labelMax)) })

Related definitions:

memberRole#

memberRole = check.object({ expectedRevision: revision, roleCode: check.choice('member', 'administrator') })

Related definitions:

memberInvitation#

memberInvitation = check.object({ roleCode: check.choice('member', 'administrator'), expiresSeconds: check.integer(60, 604800) })

Related definitions:

invitationClaim#

invitationClaim = check.object({ claimSecret: check.secret })

Related definitions:

grantIntent#

grantIntent = check.object({ roomId: check.roomId, accessMode: check.choice('read', 'reply', 'custom'), powerLevel: check.nullable(check.integer(Number.MIN_SAFE_INTEGER)), muted: check.boolean })

Related definitions:

roomGrant#

roomGrant = check.object({ expectedRevision: revision, expectedGeneration: check.nullable(check.identifier), accessMode: check.choice('read', 'reply', 'custom'), powerLevel: check.nullable(check.integer(Number.MIN_SAFE_INTEGER)), muted: check.boolean })

Related definitions:

removeGrant#

removeGrant = check.object({ expectedRevision: revision, expectedGeneration: check.nullable(check.identifier) })

Related definitions:

roomPermissions#

roomPermissions = check.object({ expectedRevision: revision, expectedGeneration: check.identifier, permissions: check.list(check.choice('room.agent.invite'), 1) })

Related definitions:

heartbeat#

heartbeat = check.object({ release: check.text(200), messagesDelivered: check.integer(), stopped: check.boolean,
    controller: check.object({ fleetId: check.identifier, connectionId: check.identifier, credential: check.text(200) }), statistics: check.nullable(statisticsBatch) })

Related definitions:

wakeNotice#

wakeNotice = check.object({ roomId: check.roomId })

Related definitions:

principalResolution#

principalResolution = check.object({ matrixUserIds: check.refine(check.list(check.matrixUserId, 100, 1), ids => new Set(ids).size === ids.length, 'Resolve unique Matrix identities') })

Related definitions:

plan#

plan = check.object({ fleetId: check.identifier, agents: check.list(check.object({ instanceKey: check.name, grants: check.list(grantIntent, 100) }), 100, 1) })

Related definitions:

planPreview#

planPreview = check.object({ plan })

Related definitions:

planChange#

planChange = check.object({ plan, digest: check.text(64, 64), snapshots: check.list(check.object({ agentId: check.identifier, revision,
        grants: check.list(check.object({ roomId: check.roomId, generation: check.identifier, revision }), 100) }), 100, 1) })

Related definitions:

policy#

policy = check.object({ expectedRevision: revision, maxOwnerAgents: check.integer(1, 100), maxAgents: check.integer(1, 1000), maxPending: check.integer(1, 1000),
    maxMessageBytes: check.integer(4096, 4194304),
    fleetIdleTimeoutSeconds: check.integer(0, 604800),
    enrollmentSeconds: check.integer(60, 3600), reconcileSeconds: check.integer(30, 3600), agentInstructions: check.multiline,
    signupMode: check.choice('invitation', 'open'), invitationIssuers: check.choice('administrators', 'members') })

Related definitions:

ListQuery#

export type ListQuery = {
    page: number;
    pageSize: number;
    search: string;
    status: ('active' | 'suspended' | 'revoked')[];
    kind: 'all' | 'human' | 'agent';
    listener: 'all' | 'online' | 'offline' | 'disconnecting';
    agentId?: string;
};

listQuery#

export function listQuery(allowed: readonly string[]): Parser<URLSearchParams> {
    return input => {
        if (!(input instanceof URLSearchParams) || [...input.keys()].some(key => !allowed.includes(key) || input.getAll(key).length !== 1))
            return failure('invalid', 'Unknown or duplicated query parameters');
        return success(input);
    };
}

Related definitions:

pagination#

export function pagination(input: URLSearchParams) {
    const pageText = input.get('page') ?? '1', sizeText = input.get('pageSize') ?? '20';
    const page = Number(pageText), pageSize = Number(sizeText);
    return /^[1-9][0-9]*$/u.test(pageText) && /^[1-9][0-9]*$/u.test(sizeText)
        && Number.isSafeInteger(page) && page <= 100000 && Number.isSafeInteger(pageSize) && pageSize <= 100
        ? success({ page, pageSize }) : failure('invalid', 'Use page ≥ 1 and pageSize 1–100');
}

Related definitions:

fleetChange#

fleetChange = check.object({ expectedRevision: revision, label: check.text(100), controller })

Related definitions:

fleetArchive#

fleetArchive = check.object({ expectedRevision: revision })

Related definitions:

fleetAgentRemoval#

fleetAgentRemoval = check.object({ expectedRevision: revision, instanceKey: check.name })

Related definitions: