52bf0279Definitions#
These TypeScript definitions document server validation. check.object rejects unknown fields. Custom functions and refinements specify additional checks.
Imported definitions#
services/crossfire/node/packages/contracts/src/schema/controller.tsservices/crossfire/node/packages/contracts/src/schema/validation.tsservices/crossfire/node/packages/kernel/src/result.tsservices/crossfire/node/packages/contracts/src/policy.tsservices/crossfire/node/packages/contracts/src/statistics.tsservices/crossfire/node/packages/contracts/src/coordination-policy.ts
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: