@subcortex-ai/sdk 0.1.0 → 0.1.2

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/http.ts","../src/types/schema.ts","../src/types/signals.ts","../src/signals.ts","../src/users.ts","../src/client.ts","../src/context.ts"],"sourcesContent":["/**\n * @subcortex-ai/sdk — TypeScript SDK for the SubCortex Cognitive Engine\n *\n * @example\n * ```typescript\n * import { SubCortexClient } from '@subcortex-ai/sdk'\n *\n * const subcortex = new SubCortexClient({\n * endpoint: 'https://api.subcortex.example.com',\n * tenantId: 'my-tenant',\n * apiKey: 'scx_live_...',\n * })\n *\n * // Assertions\n * await subcortex.assertions.create({ subject: 'user:alice', predicate: 'name', value: 'Alice' })\n * const facts = await subcortex.assertions.query('user:alice')\n *\n * // Relationships\n * await subcortex.relationships.create({ fromSubject: 'user:alice', toSubject: 'team:eng', relationshipType: 'member_of' })\n *\n * // Health\n * const health = await subcortex.health()\n * ```\n */\n\n// Client\nexport { SubCortexClient } from './client'\nexport type { SubCortexClientOptions } from './client'\n\n// Namespace classes (for type reference in docs)\nexport { AssertionsNamespace, RelationshipsNamespace, AgentsNamespace, MemoryNamespace } from './client'\n\n// HTTP transport config\nexport type { RetryConfig } from './http'\n\n// Assertion types\nexport type {\n Assertion,\n CreateAssertionInput,\n SupersedeAssertionInput,\n} from './client'\n\n// Relationship types\nexport type {\n Relationship,\n CreateRelationshipInput,\n} from './client'\n\n// Agent types\nexport type {\n AgentConfig,\n AgentPersonality,\n AgentInstructions,\n AgentModelConfig,\n AgentCapability,\n AgentMemoryPolicy,\n CreateAgentInput,\n UpdateAgentInput,\n ComposedInstructions,\n} from './client'\n\n// Memory types\nexport type {\n StoreMemoryInput,\n} from './client'\n\n// Intake types (Thalamus)\nexport type {\n CandidateAssertion,\n IntakeSubmission,\n IntakeResult,\n IntakeResponseItem,\n IntakeStats,\n} from './client'\n\n// Intake namespace\nexport { IntakeNamespace } from './client'\n\n// Users namespace\nexport { UsersNamespace } from './users'\nexport type {\n IdentifyUserInput,\n UserIdentification,\n UserMemory,\n ConnectedPerson,\n ConflictItem,\n RegisterPersonInput,\n RegisterPersonResult,\n RecordRapportInput,\n} from './types/users'\n\n// Context formatting (model injection)\nexport { formatContext, toContextXml, CONTEXT_SCHEMA_VERSION } from './context'\nexport type { ContextFormat, ContextFormatOptions } from './context'\n\n// Signals namespace\nexport { SignalsNamespace } from './signals'\nexport type {\n SignalType,\n SystemSignalType,\n SignalEntry,\n SignalSnapshot,\n RecordSignalInput,\n SignalQueryOptions,\n ResolveSignalInput,\n Trajectory,\n} from './types/signals'\nexport {\n SYSTEM_SIGNAL_TYPES,\n SIGNAL_DECAY_CONFIG,\n POSITIVE_SIGNALS,\n NEGATIVE_SIGNALS,\n isValidSignalType,\n getDecayHalfLife,\n} from './types/signals'\n\n// Schema — built-in predicates, relationships, confidence\nexport {\n SubjectPrefix,\n subject,\n IdentityPredicate,\n WorkPredicate,\n EventPredicate,\n RapportPredicate,\n MemoryPredicate,\n EntityPredicate,\n Predicates,\n OrgRelationship,\n EntityRelationship,\n RelationshipTypes,\n ConfidenceLevel,\n ConfidenceScores,\n confidenceToScore,\n scoreToConfidence,\n MULTI_VALUE_PREDICATES,\n REVERSE_RELATIONSHIPS,\n RELATIONSHIP_LABELS,\n} from './types/schema'\n\n// Common types\nexport type {\n HealthResponse,\n ConfidenceScore,\n TemporalBounds,\n Provenance,\n PaginatedResponse,\n BatchResult,\n} from './types/common'\n\n// Errors\nexport {\n SubCortexError,\n SubCortexValidationError,\n SubCortexAuthenticationError,\n SubCortexAuthorizationError,\n SubCortexNotFoundError,\n SubCortexConflictError,\n SubCortexRateLimitError,\n SubCortexServerError,\n SubCortexNetworkError,\n SubCortexTimeoutError,\n} from './errors'\n","/**\n * SubCortex SDK Error Hierarchy\n *\n * Typed error classes for programmatic error handling.\n * Consumers can catch specific error types:\n *\n * ```typescript\n * try {\n * await subcortex.assertions.create(...)\n * } catch (e) {\n * if (e instanceof SubCortexNotFoundError) { ... }\n * if (e instanceof SubCortexRateLimitError) { await sleep(e.retryAfter) }\n * }\n * ```\n */\n\n/** Base error for all SubCortex SDK errors. */\nexport class SubCortexError extends Error {\n /** HTTP status code (0 for network errors) */\n readonly statusCode: number\n /** Server-assigned request ID for debugging */\n readonly requestId?: string\n /** Whether the request can be retried */\n readonly retryable: boolean\n /** Raw response body */\n readonly body?: string\n\n constructor(\n message: string,\n statusCode: number,\n options?: {\n requestId?: string\n retryable?: boolean\n body?: string\n }\n ) {\n super(message)\n this.name = 'SubCortexError'\n this.statusCode = statusCode\n this.requestId = options?.requestId\n this.retryable = options?.retryable ?? false\n this.body = options?.body\n }\n}\n\n/** 400 — Bad request, validation failure. */\nexport class SubCortexValidationError extends SubCortexError {\n /** Field-level validation errors if available */\n readonly details?: Record<string, string>\n\n constructor(\n message: string,\n options?: {\n requestId?: string\n body?: string\n details?: Record<string, string>\n }\n ) {\n super(message, 400, { ...options, retryable: false })\n this.name = 'SubCortexValidationError'\n this.details = options?.details\n }\n}\n\n/** 401 — Invalid or missing credentials. */\nexport class SubCortexAuthenticationError extends SubCortexError {\n constructor(message: string, options?: { requestId?: string; body?: string }) {\n super(message, 401, { ...options, retryable: false })\n this.name = 'SubCortexAuthenticationError'\n }\n}\n\n/** 403 — Valid credentials but insufficient permissions. */\nexport class SubCortexAuthorizationError extends SubCortexError {\n constructor(message: string, options?: { requestId?: string; body?: string }) {\n super(message, 403, { ...options, retryable: false })\n this.name = 'SubCortexAuthorizationError'\n }\n}\n\n/** 404 — Resource not found. */\nexport class SubCortexNotFoundError extends SubCortexError {\n constructor(message: string, options?: { requestId?: string; body?: string }) {\n super(message, 404, { ...options, retryable: false })\n this.name = 'SubCortexNotFoundError'\n }\n}\n\n/** 409 — Conflict (e.g., duplicate assertion). */\nexport class SubCortexConflictError extends SubCortexError {\n constructor(message: string, options?: { requestId?: string; body?: string }) {\n super(message, 409, { ...options, retryable: false })\n this.name = 'SubCortexConflictError'\n }\n}\n\n/** 429 — Rate limit exceeded. */\nexport class SubCortexRateLimitError extends SubCortexError {\n /** Seconds to wait before retrying */\n readonly retryAfter?: number\n\n constructor(\n message: string,\n options?: {\n requestId?: string\n body?: string\n retryAfter?: number\n }\n ) {\n super(message, 429, { ...options, retryable: true })\n this.name = 'SubCortexRateLimitError'\n this.retryAfter = options?.retryAfter\n }\n}\n\n/** 5xx — Server-side error. */\nexport class SubCortexServerError extends SubCortexError {\n constructor(\n message: string,\n statusCode: number,\n options?: { requestId?: string; body?: string }\n ) {\n super(message, statusCode, { ...options, retryable: true })\n this.name = 'SubCortexServerError'\n }\n}\n\n/** Network-level failure (DNS, timeout, connection refused). */\nexport class SubCortexNetworkError extends SubCortexError {\n readonly cause?: Error\n\n constructor(message: string, options?: { cause?: Error }) {\n super(message, 0, { retryable: true })\n this.name = 'SubCortexNetworkError'\n this.cause = options?.cause\n }\n}\n\n/** Timeout — request exceeded the configured timeout. */\nexport class SubCortexTimeoutError extends SubCortexNetworkError {\n constructor(timeoutMs: number) {\n super(`Request timed out after ${timeoutMs}ms`)\n this.name = 'SubCortexTimeoutError'\n }\n}\n\n\n/**\n * Structured error response from the SubCortex REST API.\n *\n * ```json\n * {\n * \"error\": {\n * \"code\": \"NOT_FOUND\",\n * \"message\": \"Assertion not found\",\n * \"details\": { ... }\n * }\n * }\n * ```\n */\ninterface SubCortexErrorResponse {\n error?: {\n code?: string\n message?: string\n details?: Record<string, unknown>\n }\n}\n\n/**\n * Classify an HTTP response into the appropriate error type.\n * Parses structured JSON error responses from the SubCortex API.\n * Falls back to raw body if not parseable.\n */\nexport function classifyError(\n statusCode: number,\n body: string,\n requestId?: string,\n retryAfterHint?: number\n): SubCortexError {\n // Try to parse structured error response\n let errorCode = ''\n let message = ''\n let details: Record<string, string> | undefined\n\n try {\n const parsed: SubCortexErrorResponse = JSON.parse(body)\n if (parsed.error) {\n errorCode = parsed.error.code || ''\n message = parsed.error.message || ''\n if (parsed.error.details) {\n details = parsed.error.details as Record<string, string>\n }\n }\n } catch {\n // Not JSON — use raw body as message\n }\n\n if (!message) {\n message = body || `HTTP ${statusCode}`\n }\n\n const opts = { requestId, body }\n\n switch (statusCode) {\n case 400:\n return new SubCortexValidationError(message, { ...opts, details })\n case 401:\n return new SubCortexAuthenticationError(message, opts)\n case 403:\n return new SubCortexAuthorizationError(message, opts)\n case 404:\n return new SubCortexNotFoundError(message, opts)\n case 409:\n return new SubCortexConflictError(message, opts)\n case 429: {\n let retryAfter: number | undefined = retryAfterHint\n if (retryAfter === undefined) {\n try {\n const parsed = JSON.parse(body)\n retryAfter = parsed.retryAfter ?? parsed.retry_after\n } catch {\n // ignore\n }\n }\n return new SubCortexRateLimitError(message, { ...opts, retryAfter })\n }\n default:\n if (statusCode >= 500) {\n return new SubCortexServerError(message, statusCode, opts)\n }\n return new SubCortexError(message, statusCode, opts)\n }\n}\n","/**\n * HTTP Transport Layer\n *\n * Handles fetch calls, auth headers, retry with backoff,\n * timeout, request IDs, and snake_case ↔ camelCase mapping.\n *\n * This module is internal — consumers use SubCortexClient, not HttpTransport.\n */\n\nimport {\n SubCortexNetworkError,\n SubCortexRateLimitError,\n SubCortexTimeoutError,\n classifyError,\n} from './errors'\n\n// ─── Configuration ──────────────────────────────────\n\nexport interface RetryConfig {\n maxRetries: number\n baseDelayMs: number\n maxDelayMs: number\n}\n\nexport interface HttpTransportOptions {\n baseUrl: string\n tenantId: string\n apiKey?: string\n token?: string\n retry: RetryConfig\n timeoutMs: number\n fetchImpl: typeof fetch\n headers: Record<string, string>\n signal?: AbortSignal\n}\n\n// ─── snake_case ↔ camelCase mapping ─────────────────\n\nfunction snakeToCamel(s: string): string {\n return s.replace(/_([a-z])/g, (_, c) => c.toUpperCase())\n}\n\nfunction camelToSnake(s: string): string {\n return s.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`)\n}\n\n/** Deep-map object keys from snake_case to camelCase */\nexport function mapKeys(obj: unknown, mapper: (s: string) => string): unknown {\n if (obj === null || obj === undefined) return obj\n if (Array.isArray(obj)) return obj.map((item) => mapKeys(item, mapper))\n if (typeof obj === 'object') {\n const mapped: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n mapped[mapper(key)] = mapKeys(value, mapper)\n }\n return mapped\n }\n return obj\n}\n\n/** Convert wire format (snake_case) to SDK format (camelCase) */\nexport function fromWire<T>(data: unknown): T {\n return mapKeys(data, snakeToCamel) as T\n}\n\n/** Convert SDK format (camelCase) to wire format (snake_case) */\nexport function toWire(data: unknown): unknown {\n return mapKeys(data, camelToSnake)\n}\n\n// ─── Request ID generation ──────────────────────────\n\nlet counter = 0\nfunction generateRequestId(): string {\n const ts = Date.now().toString(36)\n const seq = (counter++).toString(36)\n const rand = Math.random().toString(36).slice(2, 6)\n return `scx-${ts}-${seq}-${rand}`\n}\n\n// ─── Retry with exponential backoff + jitter ────────\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nfunction computeDelay(attempt: number, config: RetryConfig): number {\n const exponential = config.baseDelayMs * Math.pow(2, attempt)\n const capped = Math.min(exponential, config.maxDelayMs)\n // Full jitter: random between 50% and 150% of computed delay\n const jitter = capped * (0.5 + Math.random())\n return Math.round(jitter)\n}\n\nfunction isRetryable(status: number): boolean {\n return status === 429 || status >= 500\n}\n\n// ─── Transport ──────────────────────────────────────\n\nexport class HttpTransport {\n private readonly opts: HttpTransportOptions\n\n constructor(options: HttpTransportOptions) {\n this.opts = {\n ...options,\n baseUrl: options.baseUrl.replace(/\\/$/, ''),\n }\n }\n\n /** GET request with retry and typed response. */\n async get<T>(path: string, tenantId?: string): Promise<T> {\n return this.request<T>('GET', path, undefined, tenantId)\n }\n\n /** POST request with retry and typed response. */\n async post<T>(path: string, body: unknown, tenantId?: string): Promise<T> {\n return this.request<T>('POST', path, body, tenantId)\n }\n\n /** PUT request with retry and typed response. */\n async put<T>(path: string, body: unknown, tenantId?: string): Promise<T> {\n return this.request<T>('PUT', path, body, tenantId)\n }\n\n /** DELETE request with retry and typed response. */\n async delete<T>(path: string, tenantId?: string): Promise<T> {\n return this.request<T>('DELETE', path, undefined, tenantId)\n }\n\n /** Core request method with retry loop. */\n private async request<T>(\n method: string,\n path: string,\n body: unknown,\n tenantIdOverride?: string\n ): Promise<T> {\n const url = `${this.opts.baseUrl}${path}`\n const requestId = generateRequestId()\n const tenantId = tenantIdOverride || this.opts.tenantId\n\n const headers: Record<string, string> = {\n Accept: 'application/json',\n 'X-Request-ID': requestId,\n 'X-Tenant-ID': tenantId,\n ...this.opts.headers,\n }\n\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json'\n }\n\n // Auth header\n if (this.opts.apiKey) {\n headers['Authorization'] = `Bearer ${this.opts.apiKey}`\n } else if (this.opts.token) {\n headers['Authorization'] = `Bearer ${this.opts.token}`\n }\n\n const fetchOpts: RequestInit = {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n }\n\n let lastError: Error | undefined\n\n for (let attempt = 0; attempt <= this.opts.retry.maxRetries; attempt++) {\n try {\n const response = await this.fetchWithTimeout(url, fetchOpts)\n\n if (response.ok) {\n const text = await response.text()\n if (!text) return undefined as T\n const parsed = JSON.parse(text)\n return fromWire<T>(parsed)\n }\n\n // Non-OK response\n const responseBody = await response.text()\n\n // Rate limit: respect Retry-After header\n if (response.status === 429) {\n const retryAfterRaw = response.headers.get('Retry-After')\n const retryAfterSecs = retryAfterRaw ? parseInt(retryAfterRaw, 10) : 0\n if (attempt < this.opts.retry.maxRetries) {\n const delay = retryAfterSecs > 0\n ? retryAfterSecs * 1000\n : computeDelay(attempt, this.opts.retry)\n await sleep(delay)\n lastError = classifyError(response.status, responseBody, requestId, retryAfterSecs || undefined)\n continue\n }\n // Exhausted retries on 429 — throw with retryAfter from header\n throw classifyError(response.status, responseBody, requestId, retryAfterSecs || undefined)\n }\n\n // Retryable server error\n if (isRetryable(response.status) && attempt < this.opts.retry.maxRetries) {\n lastError = classifyError(response.status, responseBody, requestId)\n await sleep(computeDelay(attempt, this.opts.retry))\n continue\n }\n\n // Non-retryable or exhausted retries — throw classified error\n throw classifyError(response.status, responseBody, requestId)\n } catch (error) {\n // Already a SubCortexError — rethrow if non-retryable or out of retries\n if (error instanceof Error && error.name.startsWith('SubCortex')) {\n if (\n !(error as { retryable?: boolean }).retryable ||\n attempt >= this.opts.retry.maxRetries\n ) {\n throw error\n }\n lastError = error\n await sleep(computeDelay(attempt, this.opts.retry))\n continue\n }\n\n // Network-level failure (DNS, connection refused, etc.)\n if (error instanceof TypeError || error instanceof DOMException) {\n lastError = new SubCortexNetworkError(\n `Network error: ${(error as Error).message}`,\n { cause: error as Error }\n )\n if (attempt < this.opts.retry.maxRetries) {\n await sleep(computeDelay(attempt, this.opts.retry))\n continue\n }\n throw lastError\n }\n\n // Unknown error\n throw error\n }\n }\n\n // Should not reach here, but safety net\n throw lastError || new SubCortexNetworkError('Request failed after all retries')\n }\n\n /** Fetch with AbortController timeout. */\n private async fetchWithTimeout(\n url: string,\n init: RequestInit\n ): Promise<Response> {\n const controller = new AbortController()\n const timeoutId = setTimeout(\n () => controller.abort(),\n this.opts.timeoutMs\n )\n\n // Compose with user-provided signal\n if (this.opts.signal) {\n this.opts.signal.addEventListener('abort', () => controller.abort())\n }\n\n try {\n return await this.opts.fetchImpl(url, {\n ...init,\n signal: controller.signal,\n })\n } catch (error) {\n if (\n error instanceof DOMException &&\n error.name === 'AbortError' &&\n !this.opts.signal?.aborted\n ) {\n throw new SubCortexTimeoutError(this.opts.timeoutMs)\n }\n throw error\n } finally {\n clearTimeout(timeoutId)\n }\n }\n}\n","/**\n * SubCortex Built-in Schema\n *\n * These are the foundational types, predicates, relationship types,\n * and confidence levels that SubCortex supports natively. They are\n * NOT exhaustive — tenants can extend them. But these cover the\n * universal patterns every agent-user interaction needs.\n *\n * Consumer systems import these instead of using raw strings.\n */\n\n// ─── Subject Prefixes ───────────────────────────────\n\n/**\n * Well-known subject prefixes. SubCortex recognizes these and\n * provides specialized behavior for each.\n */\nexport enum SubjectPrefix {\n /** The authenticated user interacting with the agent */\n USER = 'user',\n /** A person mentioned by the user (not the user themselves) */\n PERSON = 'person',\n /** A job role or position */\n ROLE = 'role',\n /** A business entity / data model (e.g., Project, Invoice) */\n ENTITY = 'entity',\n /** A property/field on an entity */\n PROPERTY = 'property',\n /** A project, initiative, or ongoing effort */\n PROJECT = 'project',\n /** An event, meeting, or milestone */\n EVENT = 'event',\n /** An agent using SubCortex */\n AGENT = 'agent',\n}\n\n/**\n * Build a subject string from a prefix and identifier.\n * Normalizes the identifier to lowercase with hyphens.\n */\n/**\n * Common abbreviation expansions for role/title normalization.\n * Ensures \"VP of Engineering\" and \"Vice President of Engineering\"\n * resolve to the same subject.\n */\nconst TITLE_NORMALIZATIONS: [RegExp, string][] = [\n [/\\bvp\\b/gi, 'Vice President'],\n [/\\bsvp\\b/gi, 'Senior Vice President'],\n [/\\bevp\\b/gi, 'Executive Vice President'],\n [/\\bcto\\b/gi, 'Chief Technology Officer'],\n [/\\bceo\\b/gi, 'Chief Executive Officer'],\n [/\\bcfo\\b/gi, 'Chief Financial Officer'],\n [/\\bcoo\\b/gi, 'Chief Operating Officer'],\n [/\\bcmo\\b/gi, 'Chief Marketing Officer'],\n [/\\bcpo\\b/gi, 'Chief Product Officer'],\n [/\\bcio\\b/gi, 'Chief Information Officer'],\n [/\\bea\\b/gi, 'Executive Assistant'],\n [/\\bpm\\b/gi, 'Project Manager'],\n [/\\bdir\\b/gi, 'Director'],\n [/\\bsr\\b/gi, 'Senior'],\n [/\\bjr\\b/gi, 'Junior'],\n]\n\nexport function subject(prefix: SubjectPrefix | string, identifier: string): string {\n let expanded = identifier\n // Normalize titles/roles to prevent duplicate subjects from abbreviations\n if (prefix === SubjectPrefix.ROLE || prefix === 'role') {\n for (const [pattern, replacement] of TITLE_NORMALIZATIONS) {\n expanded = expanded.replace(pattern, replacement)\n }\n }\n const normalized = expanded.toLowerCase().replace(/\\s+/g, '-')\n return `${prefix}:${normalized}`\n}\n\n// ─── Predicates ─────────────────────────────────────\n\n/**\n * Built-in predicates for user/person identity and profile.\n */\nexport enum IdentityPredicate {\n NAME = 'name',\n FULL_NAME = 'full_name',\n ROLE = 'role',\n TITLE = 'title',\n DEPARTMENT = 'department',\n TEAM = 'team',\n START_DATE = 'start_date',\n EMAIL = 'email',\n}\n\n/**\n * Built-in predicates for work context.\n * NOTE: Org relationships (reports_to, manages, etc.) are NOT predicates.\n * They are relationship types — connections between two subjects.\n * See OrgRelationship enum.\n */\nexport enum WorkPredicate {\n EXPERTISE = 'expertise',\n CURRENT_PROJECT = 'current_project',\n PAIN_POINT = 'pain_point',\n}\n\n/**\n * Built-in predicates for events and status tracking.\n */\nexport enum EventPredicate {\n STATUS = 'status',\n STATUS_CHANGE = 'status_change',\n EVENT = 'event',\n DECISION = 'decision',\n OUTCOME = 'outcome',\n}\n\n/**\n * Built-in predicates for emotional/rapport tracking.\n */\nexport enum RapportPredicate {\n SENTIMENT = 'sentiment',\n FRUSTRATION = 'frustration',\n EXCITEMENT = 'excitement',\n CONCERN = 'concern',\n GOAL = 'goal',\n ASPIRATION = 'aspiration',\n PREFERENCE = 'preference',\n PAIN_POINT = 'pain_point',\n INTEREST = 'interest',\n COMMUNICATION_STYLE = 'communication_style',\n}\n\n/**\n * Built-in predicates for agent memory management.\n */\nexport enum MemoryPredicate {\n REMINDER = 'reminder',\n CONTEXT = 'context',\n CONTEXT_TASK = 'context:task',\n CURRENT_PROJECT = 'current_project',\n}\n\n/**\n * Built-in predicates for entity/schema definition.\n */\nexport enum EntityPredicate {\n TYPE = 'type',\n DESCRIPTION = 'description',\n FIELD_TYPE = 'field_type',\n REQUIRED = 'required',\n WORKFLOW = 'workflow',\n}\n\n/**\n * All built-in predicates combined.\n * Consumer systems should use these instead of raw strings.\n */\nexport const Predicates = {\n ...IdentityPredicate,\n ...WorkPredicate,\n ...EventPredicate,\n ...RapportPredicate,\n ...MemoryPredicate,\n ...EntityPredicate,\n} as const\n\n// ─── Relationship Types ─────────────────────────────\n\n/**\n * Built-in relationship types for organizational structure.\n *\n * Each relationship is directional. Many have a natural reverse:\n * reports_to ↔ manages\n * mentored_by ↔ mentors\n * member_of ↔ has_member\n */\nexport enum OrgRelationship {\n /** Person reports to user/manager */\n REPORTS_TO = 'reports_to',\n /** User/manager manages person */\n MANAGES = 'manages',\n /** Person is member of team/project */\n MEMBER_OF = 'member_of',\n /** Team/project has this person as member */\n HAS_MEMBER = 'has_member',\n /** Person holds a specific role */\n HOLDS_ROLE = 'holds_role',\n /** Person is a candidate for a role */\n CANDIDATE_FOR = 'candidate_for',\n /** Person collaborates with another person */\n COLLABORATES_WITH = 'collaborates_with',\n /** Person mentors another person */\n MENTORS = 'mentors',\n /** Person is mentored by another person */\n MENTORED_BY = 'mentored_by',\n /** Person is a stakeholder in something */\n STAKEHOLDER_IN = 'stakeholder_in',\n}\n\n/**\n * Built-in relationship types for entity/schema structure.\n */\nexport enum EntityRelationship {\n HAS_PROPERTY = 'has_property',\n BELONGS_TO = 'belongs_to',\n HAS_MANY = 'has_many',\n MANY_TO_MANY = 'many_to_many',\n DEPENDS_ON = 'depends_on',\n}\n\n/**\n * All built-in relationship types combined.\n */\nexport const RelationshipTypes = {\n ...OrgRelationship,\n ...EntityRelationship,\n} as const\n\n// ─── Confidence ─────────────────────────────────────\n\n/**\n * Standard confidence levels with numeric values.\n * The agent chooses the level; SubCortex maps to the score.\n */\nexport enum ConfidenceLevel {\n /** User stated it directly: \"My name is Alice\" */\n CONFIRMED = 'confirmed',\n /** Strongly implied: \"I've been managing the team\" → manager */\n HIGH = 'high',\n /** Reasonable inference from context */\n MODERATE = 'moderate',\n /** Speculative — worth checking later */\n LOW = 'low',\n}\n\n/** Map confidence levels to numeric scores */\nexport const ConfidenceScores: Record<ConfidenceLevel, number> = {\n [ConfidenceLevel.CONFIRMED]: 0.99,\n [ConfidenceLevel.HIGH]: 0.85,\n [ConfidenceLevel.MODERATE]: 0.65,\n [ConfidenceLevel.LOW]: 0.40,\n}\n\n/** Convert a confidence level label to a numeric score */\nexport function confidenceToScore(level: ConfidenceLevel | string): number {\n return ConfidenceScores[level as ConfidenceLevel] ?? 0.70\n}\n\n/** Convert a numeric score to the closest confidence level */\nexport function scoreToConfidence(score: number): ConfidenceLevel {\n if (score >= 0.95) return ConfidenceLevel.CONFIRMED\n if (score >= 0.80) return ConfidenceLevel.HIGH\n if (score >= 0.60) return ConfidenceLevel.MODERATE\n return ConfidenceLevel.LOW\n}\n\n// ─── Predicate Metadata ─────────────────────────────\n\n/**\n * Whether a predicate supports multiple values on the same subject.\n * Multi-value predicates don't trigger conflict detection in the Thalamus.\n */\n/**\n * Predicates that can have multiple values on the same subject.\n * These don't trigger conflict detection in the Thalamus.\n */\nexport const MULTI_VALUE_PREDICATES = new Set<string>([\n // Events — multiple things happen over time\n EventPredicate.STATUS_CHANGE,\n EventPredicate.EVENT,\n EventPredicate.DECISION,\n EventPredicate.OUTCOME,\n // Emotional — multiple sentiments about different things\n RapportPredicate.SENTIMENT,\n RapportPredicate.FRUSTRATION,\n RapportPredicate.EXCITEMENT,\n RapportPredicate.CONCERN,\n RapportPredicate.GOAL,\n RapportPredicate.INTEREST,\n // Memory — multiple reminders, contexts, projects\n MemoryPredicate.REMINDER,\n MemoryPredicate.CONTEXT_TASK,\n WorkPredicate.CURRENT_PROJECT,\n // Timeline\n 'timeline',\n])\n\n/**\n * Map from relationship type to its reverse.\n * Used by brain.users.registerPerson() to create bidirectional edges.\n */\nexport const REVERSE_RELATIONSHIPS: Record<string, string> = {\n // Proper OrgRelationship values\n [OrgRelationship.REPORTS_TO]: OrgRelationship.MANAGES,\n [OrgRelationship.MANAGES]: OrgRelationship.REPORTS_TO,\n [OrgRelationship.MEMBER_OF]: OrgRelationship.HAS_MEMBER,\n [OrgRelationship.HAS_MEMBER]: OrgRelationship.MEMBER_OF,\n [OrgRelationship.MENTORS]: OrgRelationship.MENTORED_BY,\n [OrgRelationship.MENTORED_BY]: OrgRelationship.MENTORS,\n [OrgRelationship.COLLABORATES_WITH]: OrgRelationship.COLLABORATES_WITH,\n [OrgRelationship.CANDIDATE_FOR]: OrgRelationship.CANDIDATE_FOR,\n [OrgRelationship.STAKEHOLDER_IN]: OrgRelationship.STAKEHOLDER_IN,\n // Agent-facing predicate names → proper relationship types\n // The model sends 'direct_report' as predicate, SDK maps to proper relationships\n 'direct_report': OrgRelationship.REPORTS_TO,\n 'team_member': OrgRelationship.MEMBER_OF,\n 'candidate': OrgRelationship.CANDIDATE_FOR,\n 'manager': OrgRelationship.MANAGES,\n 'stakeholder': OrgRelationship.STAKEHOLDER_IN,\n 'collaborator': OrgRelationship.COLLABORATES_WITH,\n 'mentor': OrgRelationship.MENTORED_BY,\n}\n\n/**\n * Agent-facing labels for relationship types.\n * Used in tool descriptions so the model knows what's available.\n */\nexport const RELATIONSHIP_LABELS: Record<string, string> = {\n [OrgRelationship.REPORTS_TO]: 'reports to (person is a direct report)',\n [OrgRelationship.MANAGES]: 'manages (user is the manager)',\n [OrgRelationship.MEMBER_OF]: 'is a member of (team, project)',\n [OrgRelationship.HOLDS_ROLE]: 'holds a role/position',\n [OrgRelationship.CANDIDATE_FOR]: 'is a candidate for a role',\n [OrgRelationship.COLLABORATES_WITH]: 'collaborates with',\n [OrgRelationship.MENTORS]: 'mentors',\n [OrgRelationship.STAKEHOLDER_IN]: 'is a stakeholder in',\n}\n","/**\n * SubCortex Signal Types\n *\n * Signals represent emotional and rapport-related data that attach to\n * the knowledge they relate to. Unlike assertions, signals:\n * - Compound (never conflict)\n * - Decay over time (exponential, configurable half-life)\n * - Have trajectory (warming/cooling/stable/neutral)\n * - Can be resolved by interaction (not just time)\n *\n * Storage: Signals are assertions with `signal:{type}` predicates.\n * The consumer-facing API treats them as a separate entity.\n */\n\n// ─── Signal Types (Gated + Custom) ────────────────────\n\n/**\n * SYSTEM signal types — available for all tenants.\n * Tenant-specific types use `custom:{tenant}:{type}` convention.\n */\nexport const SYSTEM_SIGNAL_TYPES = [\n 'frustration',\n 'excitement',\n 'concern',\n 'satisfaction',\n 'confusion',\n 'gratitude',\n 'tension',\n 'sentiment',\n] as const\n\nexport type SystemSignalType = typeof SYSTEM_SIGNAL_TYPES[number]\n\n/** Any valid signal type — system or custom */\nexport type SignalType = SystemSignalType | `custom:${string}`\n\nexport function isValidSignalType(type: string): type is SignalType {\n if (SYSTEM_SIGNAL_TYPES.includes(type as SystemSignalType)) return true\n if (type.startsWith('custom:')) return true\n return false\n}\n\n// ─── Decay Configuration ──────────────────────────────\n\n/**\n * Per-type decay half-life in hours.\n * All start at 24h — structure supports per-type tuning.\n */\nexport const SIGNAL_DECAY_CONFIG: Record<string, number> = {\n frustration: 24,\n excitement: 24,\n concern: 24,\n satisfaction: 24,\n confusion: 24,\n gratitude: 24,\n tension: 24,\n sentiment: 24,\n _default: 24,\n}\n\nexport function getDecayHalfLife(signalType: string): number {\n return SIGNAL_DECAY_CONFIG[signalType] ?? SIGNAL_DECAY_CONFIG._default\n}\n\n// ─── Trajectory ───────────────────────────────────────\n\nexport type Trajectory = 'warming' | 'cooling' | 'stable' | 'neutral'\n\n// ─── Signal Entry ─────────────────────────────────────\n\n/** A single recorded signal */\nexport interface SignalEntry {\n /** Assertion ID backing this signal */\n id: string\n /** Signal type (e.g., 'frustration', 'excitement') */\n type: string\n /** Human-readable content */\n content: string\n /** Raw recorded intensity (0-1) */\n intensity: number\n /** Time-decayed intensity */\n decayedIntensity: number\n /** Age in hours since recorded */\n ageHours: number\n /** Subject this signal is about (e.g., 'context:hiring', 'person:sarah') */\n aboutSubject?: string\n /** If this signal was resolved by another signal */\n resolvedBy?: string\n /** ISO timestamp when recorded */\n timestamp: string\n}\n\n/** Aggregated snapshot of all signals for a subject */\nexport interface SignalSnapshot {\n /** All signal entries within the query window */\n signals: SignalEntry[]\n /** Overall rapport trajectory */\n trajectory: Trajectory\n /** Aggregate intensity across all active signals */\n aggregateIntensity: number\n}\n\n// ─── Signal Resolution Sets ──────────────────────────\n\n/**\n * Signal types that indicate a positive emotional shift.\n * When recorded with `resolveConflicting: true`, these automatically\n * resolve recent negative signals on the same subject.\n */\nexport const POSITIVE_SIGNALS = new Set<string>([\n 'satisfaction',\n 'excitement',\n 'gratitude',\n])\n\n/**\n * Signal types that indicate a negative emotional state.\n * These are candidates for resolution by a subsequent positive signal.\n */\nexport const NEGATIVE_SIGNALS = new Set<string>([\n 'frustration',\n 'concern',\n 'tension',\n 'confusion',\n])\n\n// ─── Input/Output Types ───────────────────────────────\n\nexport interface RecordSignalInput {\n /** User ID the signal is about */\n userId: string\n /** Signal type */\n type: SignalType\n /** Human-readable description */\n content: string\n /** Intensity 0-1 (default: 0.7) */\n intensity?: number\n /** Subject this signal relates to (e.g., a project, person, topic) */\n aboutSubject?: string\n /** Session ID for contextual binding */\n sessionId?: string\n /**\n * When true and the signal type is a positive signal (satisfaction, excitement, gratitude),\n * automatically resolves recent negative signals on the same subject within the last 72 hours.\n * Resolved signals decay 4x faster. Default: false.\n */\n resolveConflicting?: boolean\n}\n\nexport interface SignalQueryOptions {\n /** Window in hours to look back (default: 72) */\n windowHours?: number\n /** Filter to specific signal type */\n type?: string\n}\n\nexport interface ResolveSignalInput {\n /** ID of the signal being resolved */\n signalId: string\n /** ID of the signal that resolves it */\n resolvedBySignalId: string\n}\n","/**\n * SubCortex Signals Namespace\n *\n * Records and queries emotional/rapport signals. Signals attach to\n * the knowledge they relate to and provide temporal decay + trajectory.\n *\n * Signals are stored as assertions with `signal:{type}` predicates.\n * The consumer sees them as a separate entity via this namespace.\n */\n\nimport type { HttpTransport } from './http'\nimport type { Assertion } from './client'\nimport type {\n SignalEntry,\n SignalSnapshot,\n RecordSignalInput,\n SignalQueryOptions,\n ResolveSignalInput,\n Trajectory,\n} from './types/signals'\nimport {\n isValidSignalType,\n getDecayHalfLife,\n SYSTEM_SIGNAL_TYPES,\n POSITIVE_SIGNALS,\n NEGATIVE_SIGNALS,\n} from './types/signals'\nimport { SubjectPrefix, subject } from './types/schema'\n\n/** Shape returned by the engine's GET /api/v1/signals/:tenant/:subject */\ninterface EngineSignalQueryResponse {\n signals: Array<{\n assertion_id: string\n signal_type: string\n content: string\n intensity: number\n decayed_intensity: number\n age_hours: number\n about_subject: string | null\n resolved_by: string | null\n timestamp: string\n }>\n trajectory: string\n aggregate_intensity: number\n}\n\n/** Predicates from legacy rapport recording (pre-signal: namespace) */\nconst LEGACY_SIGNAL_PREDICATES = new Set([\n 'sentiment', 'frustration', 'excitement', 'concern',\n 'goal', 'aspiration', 'preference', 'interest',\n])\n\nexport class SignalsNamespace {\n constructor(\n private http: HttpTransport,\n private tenantId: string\n ) {}\n\n /**\n * Record an emotional signal about a user.\n *\n * @example\n * ```typescript\n * await brain.signals.record({\n * userId: 'cmk123',\n * type: 'frustration',\n * content: 'Frustrated about the hiring timeline',\n * intensity: 0.85,\n * aboutSubject: 'context:hiring-ea',\n * })\n * ```\n */\n async record(input: RecordSignalInput): Promise<{ id: string; resolved?: number }> {\n if (!isValidSignalType(input.type)) {\n throw new Error(`Invalid signal type: ${input.type}. Use one of: ${SYSTEM_SIGNAL_TYPES.join(', ')} or custom:{tenant}:{type}`)\n }\n\n const userSubject = subject(SubjectPrefix.USER, input.userId)\n const predicate = `signal:${input.type}`\n const value = {\n content: input.content,\n intensity: input.intensity ?? 0.7,\n about_subject: input.aboutSubject || null,\n session_id: input.sessionId || null,\n }\n\n const result = await this.http.post<Assertion>('/api/v1/assertions', {\n tenant_id: this.tenantId,\n subject: userSubject,\n predicate,\n value,\n confidence: input.intensity ?? 0.7,\n })\n\n // Auto-resolve negative signals when a positive signal is recorded\n let resolved = 0\n if (input.resolveConflicting && POSITIVE_SIGNALS.has(input.type)) {\n try {\n const snapshot = await this.query(userSubject, { windowHours: 72 })\n for (const sig of snapshot.signals) {\n if (!NEGATIVE_SIGNALS.has(sig.type)) continue\n if (sig.resolvedBy) continue\n const sameContext = input.aboutSubject\n ? sig.aboutSubject === input.aboutSubject\n : !sig.aboutSubject\n if (sameContext) {\n await this.resolve({ signalId: sig.id, resolvedBySignalId: result.id })\n resolved++\n }\n }\n } catch {\n // Non-critical — signal was recorded successfully\n }\n }\n\n return { id: result.id, ...(resolved > 0 && { resolved }) }\n }\n\n /**\n * Query signals for a user with computed decay and trajectory.\n * Delegates to the engine's signal query endpoint for server-side computation.\n *\n * @example\n * ```typescript\n * const snapshot = await brain.signals.query('user:cmk123', {\n * windowHours: 72,\n * type: 'frustration',\n * })\n * ```\n */\n async query(userSubject: string, options: SignalQueryOptions = {}): Promise<SignalSnapshot> {\n const windowHours = options.windowHours ?? 72\n\n const query: Record<string, string> = { window: String(windowHours) }\n if (options.type) query.type = options.type\n\n const qs = new URLSearchParams(query).toString()\n const response = await this.http.get<EngineSignalQueryResponse>(\n `/api/v1/signals/${enc(this.tenantId)}/${enc(userSubject)}?${qs}`\n )\n\n const signals: SignalEntry[] = response.signals.map(s => ({\n id: s.assertion_id,\n type: s.signal_type,\n content: s.content,\n intensity: s.intensity,\n decayedIntensity: s.decayed_intensity,\n ageHours: Math.round(s.age_hours * 10) / 10,\n aboutSubject: s.about_subject || undefined,\n resolvedBy: s.resolved_by || undefined,\n timestamp: s.timestamp,\n }))\n\n return {\n signals,\n trajectory: response.trajectory as Trajectory,\n aggregateIntensity: response.aggregate_intensity,\n }\n }\n\n /**\n * Resolve a signal — mark it as resolved by a subsequent positive interaction.\n * The resolved signal's effective intensity drops faster.\n *\n * @example\n * ```typescript\n * await brain.signals.resolve({\n * signalId: 'abc123',\n * resolvedBySignalId: 'def456',\n * })\n * ```\n */\n async resolve(input: ResolveSignalInput): Promise<{ success: boolean }> {\n // Supersede the original assertion with an updated value that includes resolved_by\n const original = await this.http.get<Assertion>(\n `/api/v1/assertions/${enc(this.tenantId)}/${enc(input.signalId)}`\n ).catch(() => null)\n\n if (!original) return { success: false }\n\n const value = typeof original.value === 'object' && original.value !== null\n ? { ...(original.value as Record<string, unknown>), resolved_by: input.resolvedBySignalId }\n : { content: String(original.value), resolved_by: input.resolvedBySignalId }\n\n await this.http.post('/api/v1/assertions/supersede', {\n tenant_id: this.tenantId,\n original_assertion_id: input.signalId,\n subject: original.subject,\n predicate: original.predicate,\n value,\n confidence: original.confidence,\n })\n\n return { success: true }\n }\n}\n\n// ─── Pure Computation Functions ───────────────────────\n// @internal — computeDecay is still needed by extractSignals() for users.identify(),\n// which builds signal entries from raw assertions. Trajectory computation has been\n// moved to the engine (SignalIndex::compute_trajectory in cortex-storage).\n\n/**\n * Exponential decay: intensity × 2^(-age / halfLife)\n * Resolved signals decay 4x faster.\n */\nexport function computeDecay(\n intensity: number,\n ageHours: number,\n halfLifeHours: number,\n isResolved: boolean = false\n): number {\n const effectiveHalfLife = isResolved ? halfLifeHours / 4 : halfLifeHours\n const decayed = intensity * Math.pow(2, -ageHours / effectiveHalfLife)\n return Math.round(decayed * 100) / 100\n}\n\n// ─── Helpers ──────────────────────────────────────────\n\n/**\n * Extract signal entries from a list of assertions.\n * Used by users.identify() to populate the signals field.\n */\nexport function extractSignals(\n assertions: Assertion[],\n windowHours: number = 72\n): SignalEntry[] {\n const now = Date.now()\n const windowMs = windowHours * 60 * 60 * 1000\n const entries: SignalEntry[] = []\n\n for (const a of assertions) {\n if (a.isSuperseded) continue\n const isSignal = a.predicate.startsWith('signal:')\n const isLegacy = LEGACY_SIGNAL_PREDICATES.has(a.predicate)\n if (!isSignal && !isLegacy) continue\n\n const timestamp = a.validFrom\n const ageMs = now - new Date(timestamp).getTime()\n if (ageMs > windowMs) continue\n\n const ageHours = ageMs / (60 * 60 * 1000)\n const type = isSignal ? a.predicate.slice(7) : a.predicate\n const halfLife = getDecayHalfLife(type)\n\n let content = ''\n let intensity = a.confidence ?? 0.7\n let aboutSubject: string | undefined\n let resolvedBy: string | undefined\n\n if (typeof a.value === 'object' && a.value !== null) {\n const v = a.value as Record<string, unknown>\n content = (v.content as string) || ''\n intensity = (v.intensity as number) ?? intensity\n aboutSubject = (v.about_subject as string) || undefined\n resolvedBy = (v.resolved_by as string) || undefined\n } else {\n content = String(a.value)\n }\n\n entries.push({\n id: a.id,\n type,\n content,\n intensity,\n decayedIntensity: computeDecay(intensity, ageHours, halfLife, !!resolvedBy),\n ageHours: Math.round(ageHours * 10) / 10,\n aboutSubject,\n resolvedBy,\n timestamp,\n })\n }\n\n entries.sort((a, b) => a.ageHours - b.ageHours)\n return entries\n}\n\nfunction enc(s: string): string {\n return encodeURIComponent(s)\n}\n","/**\n * SubCortex Users Namespace\n *\n * High-level operations for user rapport building.\n * This is where orchestration logic lives — NOT in the consumer's proxy.\n *\n * The consumer agent calls brain.users.identify() and gets back\n * a complete picture. One call, one round-trip, full context.\n */\n\nimport type { HttpTransport } from './http'\nimport type { Assertion } from './client'\nimport type {\n IdentifyUserInput,\n UserIdentification,\n UserMemory,\n ConnectedPerson,\n ConflictItem,\n RegisterPersonInput,\n RegisterPersonResult,\n RecordRapportInput,\n} from './types/users'\nimport {\n SubjectPrefix,\n subject,\n confidenceToScore,\n ConfidenceLevel,\n REVERSE_RELATIONSHIPS,\n OrgRelationship,\n} from './types/schema'\nimport type { Trajectory } from './types/signals'\nimport { extractSignals } from './signals'\n\nexport class UsersNamespace {\n constructor(\n private http: HttpTransport,\n private tenantId: string\n ) {}\n\n /**\n * Identify a user and retrieve their full context.\n *\n * This is the FIRST thing an agent should call at session start.\n * Returns whether the user is known, their memories, connected\n * people, reminders, conflicts, and a summary.\n *\n * @example\n * ```typescript\n * const user = await brain.users.identify({\n * userId: 'cmk123...',\n * displayName: 'Tom Santos',\n * })\n *\n * if (!user.isKnown) {\n * // First encounter — get to know them\n * } else {\n * // Returning user — reference what you know\n * // user.reminders — bring these up\n * // user.conflicts — address these\n * // user.connectedPeople — context about their org\n * }\n * ```\n */\n async identify(input: IdentifyUserInput): Promise<UserIdentification> {\n const userSubject = subject(SubjectPrefix.USER, input.userId)\n\n // 1. Get all assertions about this user\n const assertions = await this.http.get<Assertion[]>(\n `/api/v1/assertions/query/${enc(this.tenantId)}/${enc(userSubject)}`\n )\n\n const active = assertions.filter(a => !a.isSuperseded)\n const isKnown = active.length > 0\n\n // 2. Seed display name if first encounter\n if (input.displayName && !active.some(a => a.predicate === 'name' || a.predicate === 'full_name')) {\n try {\n await this.http.post('/api/v1/assertions', {\n tenant_id: this.tenantId,\n subject: userSubject,\n predicate: 'name',\n value: input.displayName,\n confidence: 1.0,\n })\n } catch { /* best-effort */ }\n }\n\n // 3. Get user's name\n const nameAssertion = active.find(a => a.predicate === 'name' || a.predicate === 'full_name')\n const name = (nameAssertion?.value as string) || input.displayName || null\n\n // 4. Categorize assertions\n const reminders: UserMemory[] = active\n .filter(a => a.predicate === 'reminder')\n .map(a => ({ id: a.id, predicate: a.predicate, value: a.value, confidence: a.confidence, createdAt: a.validFrom }))\n\n // Auto-dismiss reminders after returning them.\n // Once surfaced, they shouldn't repeat. If the user wants to\n // keep a reminder alive, they'll say so and the agent will recreate it.\n for (const reminder of reminders) {\n try {\n await this.http.post(\n `/api/v1/assertions/retract/${enc(this.tenantId)}/${enc(reminder.id)}`,\n {}\n )\n } catch { /* best-effort — don't block recall if retract fails */ }\n }\n\n const contexts: UserMemory[] = active\n .filter(a => a.predicate === 'context' || a.predicate === 'context:task')\n .map(a => ({ id: a.id, predicate: a.predicate, value: a.value, confidence: a.confidence, createdAt: a.validFrom }))\n\n // 5a. Extract signals (signal:* predicates + legacy rapport predicates)\n const signals = extractSignals(assertions)\n const signalIds = new Set(signals.map(s => s.id))\n\n // Get trajectory from the engine (server-side computation)\n let rapportTrajectory: Trajectory = 'neutral'\n try {\n const qs = new URLSearchParams({ window: '72' }).toString()\n const snapshot = await this.http.get<{ trajectory: Trajectory }>(\n `/api/v1/signals/${enc(this.tenantId)}/${enc(userSubject)}?${qs}`\n )\n rapportTrajectory = snapshot.trajectory\n } catch { /* Non-critical — default to neutral */ }\n\n const memories: UserMemory[] = active\n .filter(a =>\n a.predicate !== 'reminder' &&\n a.predicate !== 'context' &&\n a.predicate !== 'context:task' &&\n !signalIds.has(a.id) // exclude signals from memories\n )\n .map(a => ({ id: a.id, predicate: a.predicate, value: a.value, confidence: a.confidence, createdAt: a.validFrom }))\n\n // 5. Traverse relationships to find connected people\n const connectedPeople: ConnectedPerson[] = []\n try {\n const relationships = await this.http.get<Array<{\n fromSubject: string; toSubject: string; relationshipType: string\n }>>(`/api/v1/relationships/${enc(this.tenantId)}/${enc(userSubject)}`)\n\n const visited = new Set<string>()\n for (const rel of relationships) {\n const other = rel.fromSubject === userSubject ? rel.toSubject : rel.fromSubject\n if (!other || other === userSubject || visited.has(other)) continue\n visited.add(other)\n\n const personAssertions = await this.http.get<Assertion[]>(\n `/api/v1/assertions/query/${enc(this.tenantId)}/${enc(other)}`\n )\n const personActive = personAssertions.filter(a => !a.isSuperseded)\n const personName = personActive.find(a => a.predicate === 'name')\n const facts = personActive\n .filter(a => a.predicate !== 'name')\n .map(a => ({ predicate: a.predicate, value: a.value }))\n\n connectedPeople.push({\n subject: other,\n name: (personName?.value as string) || other,\n relationship: rel.relationshipType,\n facts,\n })\n }\n } catch { /* non-critical */ }\n\n // 6. Check Thalamus queue for conflicts relevant to THIS user\n const conflicts: ConflictItem[] = []\n try {\n if (!input.agentId) throw new Error('agentId is required on IdentifyUserInput to fetch conflicts')\n const pending = await this.http.get<Array<{\n id: string; surfacingHint: string; acknowledged: boolean; status: string;\n persistedAssertionIds?: string[]; conflictingAssertionId?: string\n }>>(`/api/v1/intake/pending/${enc(input.agentId)}?status=conflict_detected`)\n\n for (const item of pending) {\n if (item.acknowledged) continue\n\n // Only surface conflicts that mention this user's subject\n const hint = item.surfacingHint || ''\n const involvesUser = hint.includes(userSubject)\n || (item.persistedAssertionIds || []).some(id => {\n // Check if any persisted assertion is about this user\n const a = assertions.find(a2 => a2.id === id)\n return a?.subject === userSubject\n })\n\n if (!involvesUser) continue\n\n let resolvedHint = hint || 'A conflict was detected.'\n if (name) {\n resolvedHint = resolvedHint.replace(\n new RegExp(userSubject.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'g'),\n name\n )\n }\n conflicts.push({ id: item.id, hint: resolvedHint })\n }\n } catch { /* non-critical */ }\n\n // 7. Build summary\n const parts: string[] = []\n if (conflicts.length > 0) {\n parts.push(`ATTENTION: ${conflicts.length} knowledge conflict(s) — MUST address: ${conflicts.map(c => c.hint).join(' | ')}`)\n }\n if (reminders.length > 0) {\n parts.push(`REMINDERS (${reminders.length}): ${reminders.map(r => `\"${r.value}\"`).join(', ')}. Dismiss each after surfacing.`)\n }\n if (connectedPeople.length > 0) {\n parts.push(`Connected people:\\n${connectedPeople.map(p => {\n const factsStr = p.facts.map(f => `${f.predicate}: ${f.value}`).join(', ')\n return `- ${p.name} (${p.relationship})${factsStr ? ': ' + factsStr : ''}`\n }).join('\\n')}`)\n }\n if (memories.length > 0 && parts.length === 0) {\n parts.push(`You know ${memories.length} things about this user.`)\n }\n if (parts.length === 0) {\n parts.push('This is a new user — no memories yet. Get to know them.')\n }\n\n return {\n subject: userSubject,\n isKnown,\n name,\n memories,\n connectedPeople,\n reminders,\n contexts,\n conflicts,\n signals,\n rapportTrajectory,\n summary: parts.join('\\n'),\n }\n }\n\n /**\n * Register a person that the user mentioned.\n *\n * Creates the person node, their role, and bidirectional\n * relationships to the user. One call does everything.\n *\n * @example\n * ```typescript\n * const result = await brain.users.registerPerson({\n * name: 'John Smith',\n * userId: 'cmk123...',\n * relationship: 'direct_report',\n * role: 'VP of Engineering',\n * })\n * ```\n */\n async registerPerson(input: RegisterPersonInput): Promise<RegisterPersonResult> {\n const userSubject = subject(SubjectPrefix.USER, input.userId)\n const personSubject = subject(SubjectPrefix.PERSON, input.name)\n const conf = typeof input.confidence === 'number'\n ? input.confidence\n : confidenceToScore(input.confidence || ConfidenceLevel.CONFIRMED)\n\n let assertionsCreated = 0\n let relationshipsCreated = 0\n const warnings: string[] = []\n\n // Create person node\n await this.http.post('/api/v1/assertions', {\n tenant_id: this.tenantId, subject: personSubject, predicate: 'name', value: input.name, confidence: conf,\n })\n assertionsCreated++\n\n // Set role if provided\n if (input.role) {\n // Check for role conflict\n try {\n const existing = await this.http.get<Assertion[]>(\n `/api/v1/assertions/query/${enc(this.tenantId)}/${enc(personSubject)}`\n )\n const existingRole = existing.find(a => a.predicate === 'role' && !a.isSuperseded)\n if (existingRole && existingRole.value !== input.role) {\n warnings.push(`${input.name} was previously \"${existingRole.value}\" — now being set as \"${input.role}\". Role change or mistake?`)\n await this.http.post('/api/v1/assertions/supersede', {\n tenant_id: this.tenantId, original_assertion_id: existingRole.id,\n subject: personSubject, predicate: 'role', value: input.role, confidence: conf,\n })\n } else if (!existingRole) {\n await this.http.post('/api/v1/assertions', {\n tenant_id: this.tenantId, subject: personSubject, predicate: 'role', value: input.role, confidence: conf,\n })\n }\n } catch {\n await this.http.post('/api/v1/assertions', {\n tenant_id: this.tenantId, subject: personSubject, predicate: 'role', value: input.role, confidence: conf,\n })\n }\n assertionsCreated++\n\n // Check if someone else holds this role\n try {\n const allAssertions = await this.http.get<Assertion[]>(\n `/api/v1/assertions/list/${enc(this.tenantId)}`\n )\n const sameRole = allAssertions.filter(a =>\n a.subject.startsWith('person:') &&\n a.subject !== personSubject &&\n a.predicate === 'role' &&\n a.value === input.role &&\n !a.isSuperseded\n )\n if (sameRole.length > 0) {\n const otherAssertions = await this.http.get<Assertion[]>(\n `/api/v1/assertions/query/${enc(this.tenantId)}/${enc(sameRole[0].subject)}`\n )\n const otherName = otherAssertions.find(a => a.predicate === 'name')?.value || sameRole[0].subject\n warnings.push(`\"${input.role}\" is already held by ${otherName}. Is ${otherName} no longer in this role?`)\n }\n } catch { /* non-critical */ }\n\n // Role as relationship\n const roleSubject = subject(SubjectPrefix.ROLE, input.role)\n await this.http.post('/api/v1/assertions', {\n tenant_id: this.tenantId, subject: roleSubject, predicate: 'name', value: input.role, confidence: conf,\n })\n await this.http.post('/api/v1/relationships', {\n tenant_id: this.tenantId, from_subject: personSubject, to_subject: roleSubject,\n relationship_type: OrgRelationship.HOLDS_ROLE, confidence: conf,\n })\n assertionsCreated++\n relationshipsCreated++\n }\n\n // Details if provided\n if (input.details) {\n await this.http.post('/api/v1/assertions', {\n tenant_id: this.tenantId, subject: personSubject, predicate: 'details', value: input.details, confidence: conf,\n })\n assertionsCreated++\n }\n\n // Status\n await this.http.post('/api/v1/assertions', {\n tenant_id: this.tenantId, subject: personSubject, predicate: 'status',\n value: input.relationship === 'candidate' ? 'candidate' : 'active', confidence: conf,\n })\n assertionsCreated++\n\n // Normalize relationship types: model sends 'direct_report',\n // SDK maps to proper forward/reverse relationship names\n const FORWARD_MAP: Record<string, string> = {\n 'direct_report': OrgRelationship.MANAGES,\n 'team_member': OrgRelationship.HAS_MEMBER,\n 'candidate': OrgRelationship.MANAGES, // user manages the hiring\n 'manager': OrgRelationship.REPORTS_TO, // user reports to this person\n 'stakeholder': OrgRelationship.STAKEHOLDER_IN,\n 'collaborator': OrgRelationship.COLLABORATES_WITH,\n 'mentor': OrgRelationship.MENTORS,\n }\n\n const forwardType = FORWARD_MAP[input.relationship] || input.relationship\n const reverseType = REVERSE_RELATIONSHIPS[input.relationship] || REVERSE_RELATIONSHIPS[forwardType] || input.relationship\n\n // User → Person\n await this.http.post('/api/v1/relationships', {\n tenant_id: this.tenantId, from_subject: userSubject, to_subject: personSubject,\n relationship_type: forwardType, confidence: conf,\n })\n relationshipsCreated++\n\n // Person → User (reverse)\n await this.http.post('/api/v1/relationships', {\n tenant_id: this.tenantId, from_subject: personSubject, to_subject: userSubject,\n relationship_type: reverseType, confidence: conf,\n })\n relationshipsCreated++\n\n return { personSubject, assertionsCreated, relationshipsCreated, warnings }\n }\n\n /**\n * Record an emotional state or rapport signal about the user.\n *\n * @example\n * ```typescript\n * await brain.users.recordRapport({\n * userId: 'cmk123...',\n * type: 'frustration',\n * value: 'Frustrated about losing the EA candidate',\n * aboutPerson: 'Sarah Johnson',\n * })\n * ```\n */\n async recordRapport(input: RecordRapportInput): Promise<{ success: boolean }> {\n const userSubject = subject(SubjectPrefix.USER, input.userId)\n const conf = typeof input.confidence === 'number'\n ? input.confidence\n : confidenceToScore(input.confidence || ConfidenceLevel.HIGH)\n\n await this.http.post('/api/v1/assertions', {\n tenant_id: this.tenantId, subject: userSubject,\n predicate: input.type, value: input.value, confidence: conf,\n })\n\n // If about a specific person, also create a timeline entry on their subject\n if (input.aboutPerson) {\n const personSubject = subject(SubjectPrefix.PERSON, input.aboutPerson)\n try {\n // Only if the person exists\n const personAssertions = await this.http.get<Assertion[]>(\n `/api/v1/assertions/query/${enc(this.tenantId)}/${enc(personSubject)}`\n )\n if (personAssertions.length > 0) {\n await this.http.post('/api/v1/assertions', {\n tenant_id: this.tenantId, subject: personSubject,\n predicate: 'timeline', value: input.value, confidence: conf,\n })\n }\n } catch { /* non-critical */ }\n }\n\n return { success: true }\n }\n\n /**\n * Dismiss a reminder after the agent has surfaced it.\n */\n async dismissReminder(userId: string, reminderContent: string): Promise<{ success: boolean }> {\n const userSubject = subject(SubjectPrefix.USER, userId)\n const assertions = await this.http.get<Assertion[]>(\n `/api/v1/assertions/query/${enc(this.tenantId)}/${enc(userSubject)}`\n )\n\n const reminder = assertions.find(\n a => a.predicate === 'reminder' && !a.isSuperseded &&\n (a.value as string).toLowerCase().includes(reminderContent.toLowerCase())\n )\n\n if (reminder) {\n await this.http.post(`/api/v1/assertions/retract/${enc(this.tenantId)}/${enc(reminder.id)}`, {})\n return { success: true }\n }\n return { success: false }\n }\n}\n\nfunction enc(s: string): string {\n return encodeURIComponent(s)\n}\n","/**\n * SubCortexClient — the main entry point for the SubCortex SDK.\n *\n * @example\n * ```typescript\n * import { SubCortexClient } from '@subcortex-ai/sdk'\n *\n * const subcortex = new SubCortexClient({\n * endpoint: 'https://api.subcortex.example.com',\n * tenantId: 'my-tenant',\n * apiKey: 'scx_live_...',\n * })\n *\n * // Create an assertion\n * const assertion = await subcortex.assertions.create({\n * subject: 'user:alice',\n * predicate: 'name',\n * value: 'Alice Smith',\n * })\n *\n * // Query by subject\n * const facts = await subcortex.assertions.query('user:alice')\n *\n * // Create a relationship\n * const rel = await subcortex.relationships.create({\n * fromSubject: 'user:alice',\n * toSubject: 'team:engineering',\n * relationshipType: 'belongs_to',\n * })\n * ```\n */\n\nimport { HttpTransport, toWire, type RetryConfig } from './http'\nimport type { HealthResponse } from './types/common'\nimport { UsersNamespace } from './users'\nimport { SignalsNamespace } from './signals'\n\n// ─── Client Options ─────────────────────────────────\n\nexport interface SubCortexClientOptions {\n /** Base URL of the SubCortex REST API */\n endpoint: string\n /** Tenant ID — required, used as default for all operations */\n tenantId: string\n /** API key for authentication */\n apiKey?: string\n /** JWT token for authentication (alternative to apiKey) */\n token?: string\n /** Retry configuration */\n retry?: Partial<RetryConfig>\n /** Request timeout in milliseconds (default: 30000) */\n timeoutMs?: number\n /** Custom fetch implementation (for testing or Cloudflare Workers) */\n fetch?: typeof fetch\n /** Custom headers added to every request */\n headers?: Record<string, string>\n /** AbortSignal for cancelling all pending requests */\n signal?: AbortSignal\n}\n\n// ─── Assertion Types ────────────────────────────────\n\n/**\n * An assertion — the atomic unit of knowledge in SubCortex.\n *\n * An assertion represents a single claim: \"subject S has property P with value V.\"\n * Assertions are content-addressable (same content = same ID), carry confidence\n * scores, and have temporal bounds.\n *\n * @example\n * ```typescript\n * const fact = await subcortex.assertions.create({\n * subject: 'user:alice',\n * predicate: 'role',\n * value: 'Engineering Manager',\n * confidence: 0.99,\n * })\n * console.log(fact.id) // content-addressable BLAKE3 hash\n * ```\n */\nexport interface Assertion {\n /** Content-addressable ID (BLAKE3 hash of subject + predicate + value + temporal bounds) */\n id: string\n /** Tenant this assertion belongs to */\n tenantId: string\n /** The subject this assertion is about (e.g., `\"user:alice\"`, `\"entity:Project\"`) */\n subject: string\n /** The property being asserted (e.g., `\"name\"`, `\"role\"`, `\"status\"`) */\n predicate: string\n /** The asserted value — can be a string, number, boolean, or object */\n value: unknown\n /** Confidence score (0.0–1.0). Higher = more certain. */\n confidence: number\n /** When this assertion became valid (ISO 8601) */\n validFrom: string\n /** Whether this assertion has been superseded by a newer version */\n isSuperseded: boolean\n}\n\n/**\n * Input for creating an assertion.\n *\n * @example\n * ```typescript\n * await subcortex.assertions.create({\n * subject: 'user:alice',\n * predicate: 'department',\n * value: 'Engineering',\n * confidence: 0.95,\n * })\n * ```\n */\nexport interface CreateAssertionInput {\n /** Subject of the assertion (e.g., `\"user:alice\"`, `\"entity:Project\"`) */\n subject: string\n /** Predicate — what property is being asserted */\n predicate: string\n /** The value being asserted */\n value: unknown\n /** Confidence score 0.0–1.0 (default: server-side default, typically 0.95) */\n confidence?: number\n /** Override the default tenant ID for this operation */\n tenantId?: string\n}\n\n/**\n * Input for superseding (updating) an existing assertion.\n *\n * SubCortex assertions are immutable. To \"update\" a fact, you supersede it:\n * the old assertion is marked as superseded and a new one is created.\n *\n * @example\n * ```typescript\n * await subcortex.assertions.supersede({\n * originalAssertionId: 'abc123...',\n * subject: 'user:alice',\n * predicate: 'role',\n * value: 'VP Engineering', // was \"Engineering Manager\"\n * })\n * ```\n */\nexport interface SupersedeAssertionInput {\n /** ID of the assertion being superseded */\n originalAssertionId: string\n /** Subject of the new assertion */\n subject: string\n /** Predicate of the new assertion */\n predicate: string\n /** Updated value */\n value: unknown\n /** Confidence for the new assertion */\n confidence?: number\n /** Override the default tenant ID */\n tenantId?: string\n}\n\n// ─── Relationship Types ─────────────────────────────\n\n/** What the SDK returns for a relationship. */\nexport interface Relationship {\n id: string\n tenantId: string\n fromSubject: string\n toSubject: string\n relationshipType: string\n confidence: number\n validFrom: string\n weight: number | null\n properties: Record<string, string>\n}\n\n/** Input for creating a relationship. */\nexport interface CreateRelationshipInput {\n fromSubject: string\n toSubject: string\n relationshipType: string\n confidence?: number\n weight?: number\n properties?: Record<string, string>\n tenantId?: string\n}\n\n// ─── Namespace Classes ──────────────────────────────\n\n/** Operations on assertions — the atomic units of knowledge in SubCortex. */\nexport class AssertionsNamespace {\n constructor(\n private http: HttpTransport,\n private tenantId: string\n ) {}\n\n /** Create an assertion in the knowledge graph. */\n async create(input: CreateAssertionInput): Promise<Assertion> {\n const tenantId = input.tenantId || this.tenantId\n return this.http.post<Assertion>('/api/v1/assertions', {\n tenant_id: tenantId,\n subject: input.subject,\n predicate: input.predicate,\n value: input.value,\n confidence: input.confidence,\n })\n }\n\n /** Get an assertion by its content-addressable ID. */\n async get(assertionId: string, options?: { tenantId?: string }): Promise<Assertion> {\n const tenantId = options?.tenantId || this.tenantId\n return this.http.get<Assertion>(\n `/api/v1/assertions/${enc(tenantId)}/${enc(assertionId)}`\n )\n }\n\n /** Query assertions by subject. */\n async query(subject: string, options?: { tenantId?: string }): Promise<Assertion[]> {\n const tenantId = options?.tenantId || this.tenantId\n return this.http.get<Assertion[]>(\n `/api/v1/assertions/query/${enc(tenantId)}/${enc(subject)}`\n )\n }\n\n /** List all active assertions for the tenant. */\n async list(options?: { tenantId?: string }): Promise<Assertion[]> {\n const tenantId = options?.tenantId || this.tenantId\n return this.http.get<Assertion[]>(\n `/api/v1/assertions/list/${enc(tenantId)}`\n )\n }\n\n /** Supersede an existing assertion with updated values. */\n async supersede(input: SupersedeAssertionInput): Promise<Assertion> {\n const tenantId = input.tenantId || this.tenantId\n return this.http.post<Assertion>('/api/v1/assertions/supersede', {\n tenant_id: tenantId,\n original_assertion_id: input.originalAssertionId,\n subject: input.subject,\n predicate: input.predicate,\n value: input.value,\n confidence: input.confidence,\n })\n }\n\n /** Retract an assertion by closing its temporal bounds. */\n async retract(assertionId: string, options?: { tenantId?: string }): Promise<Assertion> {\n const tenantId = options?.tenantId || this.tenantId\n return this.http.post<Assertion>(\n `/api/v1/assertions/retract/${enc(tenantId)}/${enc(assertionId)}`,\n {}\n )\n }\n}\n\n/** Operations on relationships — directional edges between subjects. */\nexport class RelationshipsNamespace {\n constructor(\n private http: HttpTransport,\n private tenantId: string\n ) {}\n\n /** Create a relationship between two subjects. */\n async create(input: CreateRelationshipInput): Promise<Relationship> {\n const tenantId = input.tenantId || this.tenantId\n return this.http.post<Relationship>('/api/v1/relationships', {\n tenant_id: tenantId,\n from_subject: input.fromSubject,\n to_subject: input.toSubject,\n relationship_type: input.relationshipType,\n confidence: input.confidence,\n weight: input.weight,\n properties: input.properties,\n })\n }\n\n /** Get relationships for a subject. */\n async query(subject: string, options?: { tenantId?: string }): Promise<Relationship[]> {\n const tenantId = options?.tenantId || this.tenantId\n return this.http.get<Relationship[]>(\n `/api/v1/relationships/${enc(tenantId)}/${enc(subject)}`\n )\n }\n\n /** List all relationships for the tenant. */\n async list(options?: { tenantId?: string }): Promise<Relationship[]> {\n const tenantId = options?.tenantId || this.tenantId\n return this.http.get<Relationship[]>(\n `/api/v1/relationships/list/${enc(tenantId)}`\n )\n }\n}\n\n// ─── Agent Types ────────────────────────────────────\n\n/**\n * Agent personality — defines how the agent communicates.\n *\n * @example\n * ```typescript\n * const personality: AgentPersonality = {\n * voice: \"Friendly cubicle neighbor who knows the business inside out\",\n * tone: \"casual\",\n * traits: [\"curious\", \"witty\", \"empathetic\"],\n * avoid: [\"corporate speak\", \"jargon\", \"being verbose\"],\n * }\n * ```\n */\nexport interface AgentPersonality {\n /** Overall personality description */\n voice?: string\n /** Communication tone: `\"casual\"`, `\"professional\"`, `\"playful\"` */\n tone?: string\n /** Personality traits */\n traits?: string[]\n /** Things the agent should avoid saying/doing */\n avoid?: string[]\n}\n\n/**\n * Composable instruction sections for an agent.\n *\n * Instructions are broken into sections so they can be independently\n * configured. SubCortex assembles them into a single system prompt\n * via {@link SubCortexClient.agents.getInstructions}.\n */\nexport interface AgentInstructions {\n /** How the agent speaks and presents itself */\n personality?: string\n /** What to remember about users, how to categorize facts */\n memoryGuidance?: string\n /** Domain-specific behavior rules (e.g., schema emergence) */\n domainRules?: string\n /** Organization-specific additions */\n custom?: string\n /** How to greet new vs returning users */\n greetingRules?: string\n}\n\n/**\n * LLM model configuration for the agent.\n */\nexport interface AgentModelConfig {\n /** Provider: `\"anthropic\"`, `\"openai\"`, `\"azure-openai\"` */\n provider?: string\n /** Model identifier (e.g., `\"claude-opus-4-6\"`, `\"gpt-4-turbo\"`) */\n modelId?: string\n /** Inference temperature (0.0–2.0) */\n temperature?: number\n /** Maximum response tokens */\n maxTokens?: number\n /** Voice ID for voice agents (e.g., `\"marin\"`, `\"echo\"`) */\n voiceId?: string\n}\n\n/**\n * A capability (tool/function) the agent can use.\n *\n * @example\n * ```typescript\n * const cap: AgentCapability = {\n * name: \"registerUserFact\",\n * description: \"Store a learned fact about the user\",\n * enabled: true,\n * }\n * ```\n */\nexport interface AgentCapability {\n /** Tool/function name */\n name: string\n /** What this capability does */\n description?: string\n /** Whether this capability is active */\n enabled?: boolean\n /** Tool parameter schema (JSON Schema) */\n parameters?: unknown\n}\n\n/**\n * Memory retention policy — controls how the agent manages its memories.\n */\nexport interface AgentMemoryPolicy {\n /** Max assertions per user subject (0 = unlimited) */\n maxMemoriesPerUser?: number\n /** Auto-forget memories below this confidence (0.0 = keep everything) */\n forgetConfidenceBelow?: number\n /** Days to retain memories (0 = forever) */\n retainDays?: number\n /** Compress old memories into higher-level summaries */\n autoSummarize?: boolean\n}\n\n/**\n * Full agent configuration — the agent's identity in SubCortex.\n *\n * This is what an agent retrieves at session start to know who it is,\n * how to behave, what tools it has, and how to manage its memory.\n *\n * @example\n * ```typescript\n * const agent = await cortex.agents.create({\n * name: 'Aria',\n * description: 'AI assistant for customer support',\n * personality: { tone: 'casual', traits: ['curious', 'empathetic'] },\n * instructions: {\n * personality: 'You are the user\\'s best friend at work...',\n * memoryGuidance: 'Remember names, roles, and org structure...',\n * },\n * model: { provider: 'openai', modelId: 'gpt-realtime-1.5', voiceId: 'marin' },\n * })\n * ```\n */\nexport interface AgentConfig {\n agentId: string\n tenantId: string\n name: string\n description: string\n personality: AgentPersonality\n instructions: AgentInstructions\n model: AgentModelConfig\n capabilities: AgentCapability[]\n memoryPolicy: AgentMemoryPolicy\n isActive: boolean\n createdAt: string\n updatedAt: string\n}\n\n/** Input for creating an agent. */\nexport interface CreateAgentInput {\n name: string\n description?: string\n personality?: AgentPersonality\n instructions?: AgentInstructions\n model?: AgentModelConfig\n capabilities?: AgentCapability[]\n memoryPolicy?: AgentMemoryPolicy\n tenantId?: string\n}\n\n/** Input for updating an agent. */\nexport interface UpdateAgentInput {\n name?: string\n description?: string\n personality?: AgentPersonality\n instructions?: AgentInstructions\n model?: AgentModelConfig\n capabilities?: AgentCapability[]\n memoryPolicy?: AgentMemoryPolicy\n isActive?: boolean\n}\n\n/** Composed instructions response. */\nexport interface ComposedInstructions {\n composedInstructions: string\n agentName: string\n modelProvider: string\n modelId: string\n temperature: number\n voiceId: string\n}\n\n/**\n * Operations on agent configurations — the identity layer.\n *\n * Create, update, and retrieve agent profiles that define who an agent is,\n * how it behaves, what tools it can use, and how it manages memory.\n *\n * @example\n * ```typescript\n * // Create an agent\n * const agent = await subcortex.agents.create({\n * name: 'Aria',\n * description: 'AI assistant for customer support',\n * personality: { tone: 'casual', traits: ['curious', 'witty'] },\n * })\n *\n * // Get composed system prompt at session start\n * const { composedInstructions } = await subcortex.agents.getInstructions(agent.agentId)\n * ```\n */\nexport class AgentsNamespace {\n constructor(\n private http: HttpTransport,\n private tenantId: string\n ) {}\n\n /** Create a new agent. */\n async create(input: CreateAgentInput): Promise<AgentConfig> {\n const tenantId = input.tenantId || this.tenantId\n return this.http.post<AgentConfig>('/api/v1/agents', {\n tenant_id: tenantId,\n name: input.name,\n description: input.description,\n personality: input.personality,\n instructions: input.instructions ? toWire(input.instructions) : undefined,\n model: input.model ? toWire(input.model) : undefined,\n capabilities: input.capabilities,\n memory_policy: input.memoryPolicy ? toWire(input.memoryPolicy) : undefined,\n })\n }\n\n /** Get an agent by ID. */\n async get(agentId: string, options?: { tenantId?: string }): Promise<AgentConfig> {\n const tenantId = options?.tenantId || this.tenantId\n return this.http.get<AgentConfig>(\n `/api/v1/agents/${enc(tenantId)}/${enc(agentId)}`\n )\n }\n\n /** Update an agent. */\n async update(agentId: string, input: UpdateAgentInput, options?: { tenantId?: string }): Promise<AgentConfig> {\n const tenantId = options?.tenantId || this.tenantId\n return this.http.put<AgentConfig>(\n `/api/v1/agents/${enc(tenantId)}/${enc(agentId)}`,\n {\n tenant_id: tenantId,\n name: input.name,\n description: input.description,\n personality: input.personality,\n instructions: input.instructions ? toWire(input.instructions) : undefined,\n model: input.model ? toWire(input.model) : undefined,\n capabilities: input.capabilities,\n memory_policy: input.memoryPolicy ? toWire(input.memoryPolicy) : undefined,\n is_active: input.isActive,\n }\n )\n }\n\n /** Delete an agent. */\n async delete(agentId: string, options?: { tenantId?: string }): Promise<void> {\n const tenantId = options?.tenantId || this.tenantId\n await this.http.delete<unknown>(`/api/v1/agents/${enc(tenantId)}/${enc(agentId)}`)\n }\n\n /** List all agents for the tenant. */\n async list(options?: { tenantId?: string }): Promise<AgentConfig[]> {\n const tenantId = options?.tenantId || this.tenantId\n return this.http.get<AgentConfig[]>(\n `/api/v1/agents/list/${enc(tenantId)}`\n )\n }\n\n /** Get composed system instructions for an agent. */\n async getInstructions(agentId: string, options?: { tenantId?: string }): Promise<ComposedInstructions> {\n const tenantId = options?.tenantId || this.tenantId\n return this.http.get<ComposedInstructions>(\n `/api/v1/agents/${enc(tenantId)}/${enc(agentId)}/instructions`\n )\n }\n}\n\n// ─── Memory Namespace ───────────────────────────────\n\n/** Input for storing a memory. */\nexport interface StoreMemoryInput {\n subject: string\n predicate: string\n value: unknown\n confidence?: number\n tenantId?: string\n /** Agent ID — required for Thalamus routing (used as agentId in intake submission) */\n agentId?: string\n /** Person this fact relates to */\n personName?: string\n /** Skip Thalamus processing — write directly to assertion store. For bulk imports, migrations. */\n raw?: boolean\n /** Conversational context for deep encoding */\n context?: {\n topic?: string\n emotionalState?: string\n sessionId?: string\n excerpt?: string\n }\n}\n\n/**\n * Agent memory operations.\n *\n * By default, `store()` routes through the Thalamus cognitive intake\n * pipeline for signal classification, contradiction detection, and\n * deduplication. Use `raw: true` to bypass for bulk imports.\n *\n * @example\n * ```typescript\n * // Store via Thalamus (default — validated, deduped, conflict-checked)\n * await subcortex.memory.store({\n * subject: 'user:alice',\n * predicate: 'role',\n * value: 'Engineering Manager',\n * confidence: 0.99,\n * agentId: 'agent_abc',\n * })\n *\n * // Store raw (bypass Thalamus — for imports/migrations)\n * await subcortex.memory.store({\n * subject: 'user:alice',\n * predicate: 'role',\n * value: 'Engineering Manager',\n * raw: true,\n * })\n *\n * // Recall everything about a user\n * const memories = await subcortex.memory.recall('user:alice')\n * ```\n */\nexport class MemoryNamespace {\n constructor(\n private http: HttpTransport,\n private tenantId: string\n ) {}\n\n /**\n * Store a fact in the agent's memory.\n *\n * Routes through the Thalamus by default. The Thalamus will:\n * - Classify the signal (reject noise)\n * - Check for contradictions with existing assertions\n * - Detect duplicates and reinforce instead of creating new\n *\n * Pass `raw: true` to bypass Thalamus for system operations.\n */\n async store(input: StoreMemoryInput): Promise<Assertion | IntakeResult> {\n const tenantId = input.tenantId || this.tenantId\n\n if (input.raw) {\n // Direct write — bypass Thalamus\n return this.http.post<Assertion>('/api/v1/assertions', {\n tenant_id: tenantId,\n subject: input.subject,\n predicate: input.predicate,\n value: input.value,\n confidence: input.confidence,\n })\n }\n\n // Route through Thalamus\n const correlationId = `mem_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 6)}`\n return this.http.post<IntakeResult>('/api/v1/intake/submit', {\n correlation_id: correlationId,\n agent_id: input.agentId,\n tenant_id: tenantId,\n candidates: [{\n subject: input.subject,\n predicate: input.predicate,\n value: input.value,\n source_confidence: input.confidence ?? 0.95,\n provenance: 'agent',\n person_name: input.personName,\n }],\n context: input.context,\n })\n }\n\n /** Recall all memories for a subject. */\n async recall(subject: string, options?: { tenantId?: string }): Promise<Assertion[]> {\n const tenantId = options?.tenantId || this.tenantId\n return this.http.get<Assertion[]>(\n `/api/v1/assertions/query/${enc(tenantId)}/${enc(subject)}`\n )\n }\n\n /** Forget a specific memory (retract the assertion). */\n async forget(assertionId: string, options?: { tenantId?: string }): Promise<Assertion> {\n const tenantId = options?.tenantId || this.tenantId\n return this.http.post<Assertion>(\n `/api/v1/assertions/retract/${enc(tenantId)}/${enc(assertionId)}`,\n {}\n )\n }\n}\n\n// ─── Intake Types ───────────────────────────────────\n\n/** A candidate assertion submitted for Thalamus processing. */\nexport interface CandidateAssertion {\n subject: string\n predicate: string\n value: unknown\n sourceConfidence: number\n validFrom?: string\n validUntil?: string | null\n provenance: 'human' | 'agent' | 'import' | 'derived'\n personName?: string\n}\n\n/** Full intake submission. */\nexport interface IntakeSubmission {\n correlationId: string\n agentId: string\n candidates: CandidateAssertion[]\n context?: {\n topic?: string\n emotionalState?: string\n sessionId?: string\n excerpt?: string\n }\n tenantId?: string\n}\n\n/** Result of Thalamus processing. */\nexport interface IntakeResult {\n correlationId: string\n processed: number\n accepted: number\n reinforced: number\n conflicts: number\n rejected: number\n items: IntakeResponseItem[]\n}\n\n/** A single intake response queue item. */\nexport interface IntakeResponseItem {\n id: string\n correlationId: string\n agentId: string\n tenantId: string\n status: 'accepted' | 'reinforced' | 'conflict_detected' | 'needs_clarification' | 'rejected'\n priority: number\n surfacingHint?: string\n expiresAt: string\n persistedAssertionIds: string[]\n inferredBondIds: string[]\n conflictingAssertionId?: string\n clarificationQuestions: string[]\n rejectionReason?: string\n signalCategory?: string\n acknowledged: boolean\n createdAt: string\n}\n\n/** Intake processing stats. */\nexport interface IntakeStats {\n total: number\n accepted: number\n reinforced: number\n conflicts: number\n clarifications: number\n rejected: number\n}\n\n/**\n * Thalamus cognitive intake operations.\n *\n * Submit candidate assertions for processing through the Thalamus\n * pipeline. The pipeline validates, deduplicates, detects contradictions,\n * and enriches assertions before persisting them.\n *\n * @example\n * ```typescript\n * // Submit a fact for processing\n * const result = await subcortex.intake.submit({\n * correlationId: 'corr-123',\n * agentId: 'agent_abc',\n * candidates: [{\n * subject: 'user:tommy',\n * predicate: 'role',\n * value: 'CTO',\n * sourceConfidence: 0.99,\n * provenance: 'human',\n * }],\n * })\n *\n * // Check for conflicts or clarification requests\n * const pending = await subcortex.intake.pending('agent_abc')\n *\n * // Acknowledge after handling\n * await subcortex.intake.acknowledge(pending[0].id)\n * ```\n */\nexport class IntakeNamespace {\n constructor(\n private http: HttpTransport,\n private tenantId: string\n ) {}\n\n /** Submit candidate assertions for Thalamus processing. */\n async submit(input: IntakeSubmission): Promise<IntakeResult> {\n const tenantId = input.tenantId || this.tenantId\n return this.http.post<IntakeResult>('/api/v1/intake/submit', {\n correlation_id: input.correlationId,\n agent_id: input.agentId,\n tenant_id: tenantId,\n candidates: input.candidates.map(c => ({\n subject: c.subject,\n predicate: c.predicate,\n value: c.value,\n source_confidence: c.sourceConfidence,\n valid_from: c.validFrom,\n valid_until: c.validUntil,\n provenance: c.provenance,\n person_name: c.personName,\n })),\n context: input.context,\n })\n }\n\n /** Get pending intake results for an agent. */\n async pending(agentId: string, options?: {\n status?: string[]\n limit?: number\n }): Promise<IntakeResponseItem[]> {\n let path = `/api/v1/intake/pending/${enc(agentId)}`\n const params: string[] = []\n if (options?.status) params.push(`status=${options.status.join(',')}`)\n if (options?.limit) params.push(`limit=${options.limit}`)\n if (params.length) path += `?${params.join('&')}`\n\n return this.http.get<IntakeResponseItem[]>(path)\n }\n\n /** Acknowledge an intake result (mark as consumed). */\n async acknowledge(itemId: string): Promise<void> {\n await this.http.post<unknown>(`/api/v1/intake/acknowledge/${enc(itemId)}`, {})\n }\n\n /** Acknowledge all pending items for an agent. */\n async acknowledgeAll(agentId: string): Promise<{ acknowledged: number }> {\n return this.http.post<{ acknowledged: number }>(\n `/api/v1/intake/acknowledge-all/${enc(agentId)}`,\n {}\n )\n }\n\n /** Get intake processing stats for an agent. */\n async stats(agentId: string): Promise<IntakeStats> {\n return this.http.get<IntakeStats>(`/api/v1/intake/stats/${enc(agentId)}`)\n }\n}\n\n// ─── Client ─────────────────────────────────────────\n\nconst DEFAULT_RETRY: RetryConfig = {\n maxRetries: 3,\n baseDelayMs: 500,\n maxDelayMs: 10_000,\n}\n\nexport class SubCortexClient {\n /** Assertion operations (low-level knowledge primitives) */\n readonly assertions: AssertionsNamespace\n /** Relationship operations */\n readonly relationships: RelationshipsNamespace\n /** Agent identity & configuration */\n readonly agents: AgentsNamespace\n /** Agent memory (semantic wrapper over assertions) */\n readonly memory: MemoryNamespace\n /** Thalamus cognitive intake pipeline */\n readonly intake: IntakeNamespace\n /** User rapport building operations */\n readonly users: UsersNamespace\n /** Emotional signals — record, query, and resolve */\n readonly signals: SignalsNamespace\n\n private readonly http: HttpTransport\n\n constructor(options: SubCortexClientOptions) {\n if (!options.apiKey && !options.token) {\n console.warn('[SubCortex] No apiKey or token provided — requests will be unauthenticated.')\n }\n\n this.http = new HttpTransport({\n baseUrl: options.endpoint,\n tenantId: options.tenantId,\n apiKey: options.apiKey,\n token: options.token,\n retry: { ...DEFAULT_RETRY, ...options.retry },\n timeoutMs: options.timeoutMs ?? 30_000,\n fetchImpl: options.fetch ?? globalThis.fetch,\n headers: options.headers ?? {},\n signal: options.signal,\n })\n\n this.assertions = new AssertionsNamespace(this.http, options.tenantId)\n this.relationships = new RelationshipsNamespace(this.http, options.tenantId)\n this.agents = new AgentsNamespace(this.http, options.tenantId)\n this.memory = new MemoryNamespace(this.http, options.tenantId)\n this.intake = new IntakeNamespace(this.http, options.tenantId)\n this.users = new UsersNamespace(this.http, options.tenantId)\n this.signals = new SignalsNamespace(this.http, options.tenantId)\n }\n\n /** Check SubCortex server health. */\n async health(): Promise<HealthResponse> {\n return this.http.get<HealthResponse>('/health')\n }\n}\n\n\n// ─── Helpers ────────────────────────────────────────\n\nfunction enc(s: string): string {\n return encodeURIComponent(s)\n}\n","/**\n * SubCortex Context Formatting — v1.0 Schema\n *\n * Transforms structured UserIdentification data into XML optimized\n * for model injection. Signals nest as children of the knowledge\n * they relate to, not as a separate section.\n *\n * Section order = priority order (transformer attention bias):\n * conflicts → reminders → contexts → identity → knowledge → relationships\n *\n * Why XML: Tag boundaries create hard attention delimiters for transformers.\n * See docs/context-format-rationale.md for full analysis.\n */\n\nimport type { UserIdentification, UserMemory, ConnectedPerson } from './types/users'\nimport type { SignalEntry } from './types/signals'\n\nexport const CONTEXT_SCHEMA_VERSION = '1.0'\n\nexport type ContextFormat = 'xml' | 'json' | 'summary'\n\nexport interface ContextFormatOptions {\n /** Output format. Default: 'xml' */\n format?: ContextFormat\n /** Include memories section. Default: true */\n includeMemories?: boolean\n /** Include connected people. Default: true */\n includeRelationships?: boolean\n /** Include reminders. Default: true */\n includeReminders?: boolean\n /** Include conflicts. Default: true */\n includeConflicts?: boolean\n /** Include active contexts. Default: true */\n includeContexts?: boolean\n /** Include emotional signals. Default: true */\n includeSignals?: boolean\n /** Minimum confidence threshold to include (0-1). Default: 0 */\n minConfidence?: number\n}\n\n/**\n * Format a UserIdentification result for model injection.\n */\nexport function formatContext(user: UserIdentification, options: ContextFormatOptions = {}): string {\n const format = options.format ?? 'xml'\n switch (format) {\n case 'xml': return toContextXml(user, options)\n case 'json': return JSON.stringify(user, null, 2)\n case 'summary': return user.summary\n }\n}\n\n/**\n * Transform UserIdentification into versioned XML optimized for model attention.\n * Signals nest as children of the facts/contexts/people they relate to.\n */\nexport function toContextXml(user: UserIdentification, options: ContextFormatOptions = {}): string {\n const {\n includeMemories = true,\n includeRelationships = true,\n includeReminders = true,\n includeConflicts = true,\n includeContexts = true,\n includeSignals = true,\n minConfidence = 0,\n } = options\n\n const ts = new Date().toISOString()\n const lines: string[] = []\n\n // Build signal lookup: aboutSubject → signals\n const signalsByAbout = new Map<string, SignalEntry[]>()\n const unattachedSignals: SignalEntry[] = []\n if (includeSignals && user.signals) {\n for (const sig of user.signals) {\n if (sig.aboutSubject) {\n const existing = signalsByAbout.get(sig.aboutSubject) || []\n existing.push(sig)\n signalsByAbout.set(sig.aboutSubject, existing)\n } else {\n unattachedSignals.push(sig)\n }\n }\n }\n\n lines.push(`<subcortex_context version=\"${CONTEXT_SCHEMA_VERSION}\" subject=\"${esc(user.subject)}\" known=\"${user.isKnown}\" ts=\"${ts}\">`)\n\n // ── Priority 1: Conflicts ──\n if (includeConflicts && user.conflicts.length > 0) {\n lines.push(` <conflicts count=\"${user.conflicts.length}\" priority=\"critical\">`)\n for (const conflict of user.conflicts) {\n lines.push(` <conflict id=\"${esc(conflict.id)}\">${esc(conflict.hint)}</conflict>`)\n }\n lines.push(` </conflicts>`)\n }\n\n // ── Priority 2: Reminders ──\n if (includeReminders && user.reminders.length > 0) {\n lines.push(` <reminders count=\"${user.reminders.length}\" priority=\"high\">`)\n for (const reminder of user.reminders) {\n lines.push(` <reminder id=\"${esc(reminder.id)}\" confidence=\"${fmtConf(reminder.confidence)}\">${esc(String(reminder.value))}</reminder>`)\n }\n lines.push(` </reminders>`)\n }\n\n // ── Priority 3: Active Contexts (with attached signals) ──\n if (includeContexts && user.contexts.length > 0) {\n lines.push(` <active_contexts count=\"${user.contexts.length}\">`)\n for (const ctx of user.contexts) {\n const ctxSignals = findSignalsForFact(ctx, signalsByAbout)\n if (ctxSignals.length > 0) {\n lines.push(` <context predicate=\"${esc(ctx.predicate)}\" confidence=\"${fmtConf(ctx.confidence)}\">`)\n lines.push(` ${esc(String(ctx.value))}`)\n for (const sig of ctxSignals) {\n lines.push(` ${renderSignal(sig)}`)\n }\n lines.push(` </context>`)\n } else {\n lines.push(` <context predicate=\"${esc(ctx.predicate)}\" confidence=\"${fmtConf(ctx.confidence)}\">${esc(String(ctx.value))}</context>`)\n }\n }\n lines.push(` </active_contexts>`)\n }\n\n // ── Priority 4: Identity (with unattached signals + rapport trajectory) ──\n if (user.name) {\n const trajectoryAttr = user.rapportTrajectory ? ` rapport_trajectory=\"${user.rapportTrajectory}\"` : ''\n lines.push(` <identity name=\"${esc(String(user.name))}\" subject=\"${esc(user.subject)}\"${trajectoryAttr}>`)\n const identityPredicates = new Set(['name', 'full_name', 'role', 'title', 'department', 'team', 'email', 'start_date', 'communication_style'])\n const identityFacts = user.memories.filter(m => identityPredicates.has(m.predicate) && m.confidence >= minConfidence)\n for (const fact of identityFacts) {\n const factSignals = findSignalsForFact(fact, signalsByAbout)\n if (factSignals.length > 0) {\n lines.push(` <fact predicate=\"${esc(fact.predicate)}\" confidence=\"${fmtConf(fact.confidence)}\">`)\n lines.push(` ${esc(String(fact.value))}`)\n for (const sig of factSignals) {\n lines.push(` ${renderSignal(sig)}`)\n }\n lines.push(` </fact>`)\n } else {\n lines.push(` <fact predicate=\"${esc(fact.predicate)}\" confidence=\"${fmtConf(fact.confidence)}\">${esc(String(fact.value))}</fact>`)\n }\n }\n // Unattached signals go under identity (general mood)\n for (const sig of unattachedSignals) {\n lines.push(` ${renderSignal(sig)}`)\n }\n lines.push(` </identity>`)\n }\n\n // ── Priority 5: Knowledge (with attached signals) ──\n if (includeMemories) {\n const identityPredicates = new Set(['name', 'full_name', 'role', 'title', 'department', 'team', 'email', 'start_date', 'communication_style'])\n const knowledge = user.memories.filter(m =>\n !identityPredicates.has(m.predicate) && m.confidence >= minConfidence\n )\n if (knowledge.length > 0) {\n lines.push(` <knowledge count=\"${knowledge.length}\">`)\n for (const mem of knowledge) {\n const memSignals = findSignalsForFact(mem, signalsByAbout)\n if (memSignals.length > 0) {\n lines.push(` <fact predicate=\"${esc(mem.predicate)}\" confidence=\"${fmtConf(mem.confidence)}\">`)\n lines.push(` ${esc(String(mem.value))}`)\n for (const sig of memSignals) {\n lines.push(` ${renderSignal(sig)}`)\n }\n lines.push(` </fact>`)\n } else {\n lines.push(` <fact predicate=\"${esc(mem.predicate)}\" confidence=\"${fmtConf(mem.confidence)}\">${esc(String(mem.value))}</fact>`)\n }\n }\n lines.push(` </knowledge>`)\n }\n }\n\n // ── Priority 6: Relationships (with attached signals) ──\n if (includeRelationships && user.connectedPeople.length > 0) {\n lines.push(` <relationships count=\"${user.connectedPeople.length}\">`)\n for (const person of user.connectedPeople) {\n const personSignals = signalsByAbout.get(person.subject) || []\n const hasContent = person.facts.length > 0 || personSignals.length > 0\n if (!hasContent) {\n lines.push(` <person name=\"${esc(person.name)}\" relationship=\"${esc(person.relationship)}\" />`)\n } else {\n lines.push(` <person name=\"${esc(person.name)}\" relationship=\"${esc(person.relationship)}\">`)\n for (const fact of person.facts) {\n lines.push(` <fact predicate=\"${esc(fact.predicate)}\">${esc(String(fact.value))}</fact>`)\n }\n for (const sig of personSignals) {\n lines.push(` ${renderSignal(sig)}`)\n }\n lines.push(` </person>`)\n }\n }\n lines.push(` </relationships>`)\n }\n\n lines.push(`</subcortex_context>`)\n return lines.join('\\n')\n}\n\n// ─── Helpers ──────────────────────────────────────────\n\nfunction renderSignal(sig: SignalEntry): string {\n const aboutAttr = sig.aboutSubject ? ` about=\"${esc(sig.aboutSubject)}\"` : ''\n return `<signal type=\"${esc(sig.type)}\" intensity=\"${fmtConf(sig.intensity)}\" decayed=\"${fmtConf(sig.decayedIntensity)}\" age_hours=\"${sig.ageHours}\"${aboutAttr}>${esc(sig.content)}</signal>`\n}\n\n/**\n * Find signals that relate to a specific fact/memory.\n * Matches on predicate name or value content as subject references.\n */\nfunction findSignalsForFact(fact: UserMemory, signalsByAbout: Map<string, SignalEntry[]>): SignalEntry[] {\n const results: SignalEntry[] = []\n // Match by predicate (e.g., about_subject = \"context:current_project\" matches predicate \"current_project\")\n for (const [aboutSubject, signals] of signalsByAbout) {\n if (aboutSubject.includes(fact.predicate) || aboutSubject.includes(String(fact.value).toLowerCase().replace(/\\s+/g, '-').slice(0, 30))) {\n results.push(...signals)\n }\n }\n return results\n}\n\nfunction fmtConf(n: number): string {\n return n.toFixed(2)\n}\n\nfunction esc(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACiBO,IAAM,iBAAN,cAA6B,MAAM;AAAA;AAAA,EAE/B;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EAET,YACE,SACA,YACA,SAKA;AACA,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,SAAK,YAAY,SAAS;AAC1B,SAAK,YAAY,SAAS,aAAa;AACvC,SAAK,OAAO,SAAS;AAAA,EACvB;AACF;AAGO,IAAM,2BAAN,cAAuC,eAAe;AAAA;AAAA,EAElD;AAAA,EAET,YACE,SACA,SAKA;AACA,UAAM,SAAS,KAAK,EAAE,GAAG,SAAS,WAAW,MAAM,CAAC;AACpD,SAAK,OAAO;AACZ,SAAK,UAAU,SAAS;AAAA,EAC1B;AACF;AAGO,IAAM,+BAAN,cAA2C,eAAe;AAAA,EAC/D,YAAY,SAAiB,SAAiD;AAC5E,UAAM,SAAS,KAAK,EAAE,GAAG,SAAS,WAAW,MAAM,CAAC;AACpD,SAAK,OAAO;AAAA,EACd;AACF;AAGO,IAAM,8BAAN,cAA0C,eAAe;AAAA,EAC9D,YAAY,SAAiB,SAAiD;AAC5E,UAAM,SAAS,KAAK,EAAE,GAAG,SAAS,WAAW,MAAM,CAAC;AACpD,SAAK,OAAO;AAAA,EACd;AACF;AAGO,IAAM,yBAAN,cAAqC,eAAe;AAAA,EACzD,YAAY,SAAiB,SAAiD;AAC5E,UAAM,SAAS,KAAK,EAAE,GAAG,SAAS,WAAW,MAAM,CAAC;AACpD,SAAK,OAAO;AAAA,EACd;AACF;AAGO,IAAM,yBAAN,cAAqC,eAAe;AAAA,EACzD,YAAY,SAAiB,SAAiD;AAC5E,UAAM,SAAS,KAAK,EAAE,GAAG,SAAS,WAAW,MAAM,CAAC;AACpD,SAAK,OAAO;AAAA,EACd;AACF;AAGO,IAAM,0BAAN,cAAsC,eAAe;AAAA;AAAA,EAEjD;AAAA,EAET,YACE,SACA,SAKA;AACA,UAAM,SAAS,KAAK,EAAE,GAAG,SAAS,WAAW,KAAK,CAAC;AACnD,SAAK,OAAO;AACZ,SAAK,aAAa,SAAS;AAAA,EAC7B;AACF;AAGO,IAAM,uBAAN,cAAmC,eAAe;AAAA,EACvD,YACE,SACA,YACA,SACA;AACA,UAAM,SAAS,YAAY,EAAE,GAAG,SAAS,WAAW,KAAK,CAAC;AAC1D,SAAK,OAAO;AAAA,EACd;AACF;AAGO,IAAM,wBAAN,cAAoC,eAAe;AAAA,EAC/C;AAAA,EAET,YAAY,SAAiB,SAA6B;AACxD,UAAM,SAAS,GAAG,EAAE,WAAW,KAAK,CAAC;AACrC,SAAK,OAAO;AACZ,SAAK,QAAQ,SAAS;AAAA,EACxB;AACF;AAGO,IAAM,wBAAN,cAAoC,sBAAsB;AAAA,EAC/D,YAAY,WAAmB;AAC7B,UAAM,2BAA2B,SAAS,IAAI;AAC9C,SAAK,OAAO;AAAA,EACd;AACF;AA6BO,SAAS,cACd,YACA,MACA,WACA,gBACgB;AAEhB,MAAI,YAAY;AAChB,MAAI,UAAU;AACd,MAAI;AAEJ,MAAI;AACF,UAAM,SAAiC,KAAK,MAAM,IAAI;AACtD,QAAI,OAAO,OAAO;AAChB,kBAAY,OAAO,MAAM,QAAQ;AACjC,gBAAU,OAAO,MAAM,WAAW;AAClC,UAAI,OAAO,MAAM,SAAS;AACxB,kBAAU,OAAO,MAAM;AAAA,MACzB;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,MAAI,CAAC,SAAS;AACZ,cAAU,QAAQ,QAAQ,UAAU;AAAA,EACtC;AAEA,QAAM,OAAO,EAAE,WAAW,KAAK;AAE/B,UAAQ,YAAY;AAAA,IAClB,KAAK;AACH,aAAO,IAAI,yBAAyB,SAAS,EAAE,GAAG,MAAM,QAAQ,CAAC;AAAA,IACnE,KAAK;AACH,aAAO,IAAI,6BAA6B,SAAS,IAAI;AAAA,IACvD,KAAK;AACH,aAAO,IAAI,4BAA4B,SAAS,IAAI;AAAA,IACtD,KAAK;AACH,aAAO,IAAI,uBAAuB,SAAS,IAAI;AAAA,IACjD,KAAK;AACH,aAAO,IAAI,uBAAuB,SAAS,IAAI;AAAA,IACjD,KAAK,KAAK;AACR,UAAI,aAAiC;AACrC,UAAI,eAAe,QAAW;AAC5B,YAAI;AACF,gBAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,uBAAa,OAAO,cAAc,OAAO;AAAA,QAC3C,QAAQ;AAAA,QAER;AAAA,MACF;AACA,aAAO,IAAI,wBAAwB,SAAS,EAAE,GAAG,MAAM,WAAW,CAAC;AAAA,IACrE;AAAA,IACA;AACE,UAAI,cAAc,KAAK;AACrB,eAAO,IAAI,qBAAqB,SAAS,YAAY,IAAI;AAAA,MAC3D;AACA,aAAO,IAAI,eAAe,SAAS,YAAY,IAAI;AAAA,EACvD;AACF;;;AClMA,SAAS,aAAa,GAAmB;AACvC,SAAO,EAAE,QAAQ,aAAa,CAAC,GAAG,MAAM,EAAE,YAAY,CAAC;AACzD;AAEA,SAAS,aAAa,GAAmB;AACvC,SAAO,EAAE,QAAQ,UAAU,CAAC,MAAM,IAAI,EAAE,YAAY,CAAC,EAAE;AACzD;AAGO,SAAS,QAAQ,KAAc,QAAwC;AAC5E,MAAI,QAAQ,QAAQ,QAAQ,OAAW,QAAO;AAC9C,MAAI,MAAM,QAAQ,GAAG,EAAG,QAAO,IAAI,IAAI,CAAC,SAAS,QAAQ,MAAM,MAAM,CAAC;AACtE,MAAI,OAAO,QAAQ,UAAU;AAC3B,UAAM,SAAkC,CAAC;AACzC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAA8B,GAAG;AACzE,aAAO,OAAO,GAAG,CAAC,IAAI,QAAQ,OAAO,MAAM;AAAA,IAC7C;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAGO,SAAS,SAAY,MAAkB;AAC5C,SAAO,QAAQ,MAAM,YAAY;AACnC;AAGO,SAAS,OAAO,MAAwB;AAC7C,SAAO,QAAQ,MAAM,YAAY;AACnC;AAIA,IAAI,UAAU;AACd,SAAS,oBAA4B;AACnC,QAAM,KAAK,KAAK,IAAI,EAAE,SAAS,EAAE;AACjC,QAAM,OAAO,WAAW,SAAS,EAAE;AACnC,QAAM,OAAO,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC;AAClD,SAAO,OAAO,EAAE,IAAI,GAAG,IAAI,IAAI;AACjC;AAIA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;AAEA,SAAS,aAAa,SAAiB,QAA6B;AAClE,QAAM,cAAc,OAAO,cAAc,KAAK,IAAI,GAAG,OAAO;AAC5D,QAAM,SAAS,KAAK,IAAI,aAAa,OAAO,UAAU;AAEtD,QAAM,SAAS,UAAU,MAAM,KAAK,OAAO;AAC3C,SAAO,KAAK,MAAM,MAAM;AAC1B;AAEA,SAAS,YAAY,QAAyB;AAC5C,SAAO,WAAW,OAAO,UAAU;AACrC;AAIO,IAAM,gBAAN,MAAoB;AAAA,EACR;AAAA,EAEjB,YAAY,SAA+B;AACzC,SAAK,OAAO;AAAA,MACV,GAAG;AAAA,MACH,SAAS,QAAQ,QAAQ,QAAQ,OAAO,EAAE;AAAA,IAC5C;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,IAAO,MAAc,UAA+B;AACxD,WAAO,KAAK,QAAW,OAAO,MAAM,QAAW,QAAQ;AAAA,EACzD;AAAA;AAAA,EAGA,MAAM,KAAQ,MAAc,MAAe,UAA+B;AACxE,WAAO,KAAK,QAAW,QAAQ,MAAM,MAAM,QAAQ;AAAA,EACrD;AAAA;AAAA,EAGA,MAAM,IAAO,MAAc,MAAe,UAA+B;AACvE,WAAO,KAAK,QAAW,OAAO,MAAM,MAAM,QAAQ;AAAA,EACpD;AAAA;AAAA,EAGA,MAAM,OAAU,MAAc,UAA+B;AAC3D,WAAO,KAAK,QAAW,UAAU,MAAM,QAAW,QAAQ;AAAA,EAC5D;AAAA;AAAA,EAGA,MAAc,QACZ,QACA,MACA,MACA,kBACY;AACZ,UAAM,MAAM,GAAG,KAAK,KAAK,OAAO,GAAG,IAAI;AACvC,UAAM,YAAY,kBAAkB;AACpC,UAAM,WAAW,oBAAoB,KAAK,KAAK;AAE/C,UAAM,UAAkC;AAAA,MACtC,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,GAAG,KAAK,KAAK;AAAA,IACf;AAEA,QAAI,SAAS,QAAW;AACtB,cAAQ,cAAc,IAAI;AAAA,IAC5B;AAGA,QAAI,KAAK,KAAK,QAAQ;AACpB,cAAQ,eAAe,IAAI,UAAU,KAAK,KAAK,MAAM;AAAA,IACvD,WAAW,KAAK,KAAK,OAAO;AAC1B,cAAQ,eAAe,IAAI,UAAU,KAAK,KAAK,KAAK;AAAA,IACtD;AAEA,UAAM,YAAyB;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,MAAM,SAAS,SAAY,KAAK,UAAU,IAAI,IAAI;AAAA,IACpD;AAEA,QAAI;AAEJ,aAAS,UAAU,GAAG,WAAW,KAAK,KAAK,MAAM,YAAY,WAAW;AACtE,UAAI;AACF,cAAM,WAAW,MAAM,KAAK,iBAAiB,KAAK,SAAS;AAE3D,YAAI,SAAS,IAAI;AACf,gBAAM,OAAO,MAAM,SAAS,KAAK;AACjC,cAAI,CAAC,KAAM,QAAO;AAClB,gBAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,iBAAO,SAAY,MAAM;AAAA,QAC3B;AAGA,cAAM,eAAe,MAAM,SAAS,KAAK;AAGzC,YAAI,SAAS,WAAW,KAAK;AAC3B,gBAAM,gBAAgB,SAAS,QAAQ,IAAI,aAAa;AACxD,gBAAM,iBAAiB,gBAAgB,SAAS,eAAe,EAAE,IAAI;AACrE,cAAI,UAAU,KAAK,KAAK,MAAM,YAAY;AACxC,kBAAM,QAAQ,iBAAiB,IAC3B,iBAAiB,MACjB,aAAa,SAAS,KAAK,KAAK,KAAK;AACzC,kBAAM,MAAM,KAAK;AACjB,wBAAY,cAAc,SAAS,QAAQ,cAAc,WAAW,kBAAkB,MAAS;AAC/F;AAAA,UACF;AAEA,gBAAM,cAAc,SAAS,QAAQ,cAAc,WAAW,kBAAkB,MAAS;AAAA,QAC3F;AAGA,YAAI,YAAY,SAAS,MAAM,KAAK,UAAU,KAAK,KAAK,MAAM,YAAY;AACxE,sBAAY,cAAc,SAAS,QAAQ,cAAc,SAAS;AAClE,gBAAM,MAAM,aAAa,SAAS,KAAK,KAAK,KAAK,CAAC;AAClD;AAAA,QACF;AAGA,cAAM,cAAc,SAAS,QAAQ,cAAc,SAAS;AAAA,MAC9D,SAAS,OAAO;AAEd,YAAI,iBAAiB,SAAS,MAAM,KAAK,WAAW,WAAW,GAAG;AAChE,cACE,CAAE,MAAkC,aACpC,WAAW,KAAK,KAAK,MAAM,YAC3B;AACA,kBAAM;AAAA,UACR;AACA,sBAAY;AACZ,gBAAM,MAAM,aAAa,SAAS,KAAK,KAAK,KAAK,CAAC;AAClD;AAAA,QACF;AAGA,YAAI,iBAAiB,aAAa,iBAAiB,cAAc;AAC/D,sBAAY,IAAI;AAAA,YACd,kBAAmB,MAAgB,OAAO;AAAA,YAC1C,EAAE,OAAO,MAAe;AAAA,UAC1B;AACA,cAAI,UAAU,KAAK,KAAK,MAAM,YAAY;AACxC,kBAAM,MAAM,aAAa,SAAS,KAAK,KAAK,KAAK,CAAC;AAClD;AAAA,UACF;AACA,gBAAM;AAAA,QACR;AAGA,cAAM;AAAA,MACR;AAAA,IACF;AAGA,UAAM,aAAa,IAAI,sBAAsB,kCAAkC;AAAA,EACjF;AAAA;AAAA,EAGA,MAAc,iBACZ,KACA,MACmB;AACnB,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,YAAY;AAAA,MAChB,MAAM,WAAW,MAAM;AAAA,MACvB,KAAK,KAAK;AAAA,IACZ;AAGA,QAAI,KAAK,KAAK,QAAQ;AACpB,WAAK,KAAK,OAAO,iBAAiB,SAAS,MAAM,WAAW,MAAM,CAAC;AAAA,IACrE;AAEA,QAAI;AACF,aAAO,MAAM,KAAK,KAAK,UAAU,KAAK;AAAA,QACpC,GAAG;AAAA,QACH,QAAQ,WAAW;AAAA,MACrB,CAAC;AAAA,IACH,SAAS,OAAO;AACd,UACE,iBAAiB,gBACjB,MAAM,SAAS,gBACf,CAAC,KAAK,KAAK,QAAQ,SACnB;AACA,cAAM,IAAI,sBAAsB,KAAK,KAAK,SAAS;AAAA,MACrD;AACA,YAAM;AAAA,IACR,UAAE;AACA,mBAAa,SAAS;AAAA,IACxB;AAAA,EACF;AACF;;;ACnQO,IAAK,gBAAL,kBAAKA,mBAAL;AAEL,EAAAA,eAAA,UAAO;AAEP,EAAAA,eAAA,YAAS;AAET,EAAAA,eAAA,UAAO;AAEP,EAAAA,eAAA,YAAS;AAET,EAAAA,eAAA,cAAW;AAEX,EAAAA,eAAA,aAAU;AAEV,EAAAA,eAAA,WAAQ;AAER,EAAAA,eAAA,WAAQ;AAhBE,SAAAA;AAAA,GAAA;AA4BZ,IAAM,uBAA2C;AAAA,EAC/C,CAAC,YAAY,gBAAgB;AAAA,EAC7B,CAAC,aAAa,uBAAuB;AAAA,EACrC,CAAC,aAAa,0BAA0B;AAAA,EACxC,CAAC,aAAa,0BAA0B;AAAA,EACxC,CAAC,aAAa,yBAAyB;AAAA,EACvC,CAAC,aAAa,yBAAyB;AAAA,EACvC,CAAC,aAAa,yBAAyB;AAAA,EACvC,CAAC,aAAa,yBAAyB;AAAA,EACvC,CAAC,aAAa,uBAAuB;AAAA,EACrC,CAAC,aAAa,2BAA2B;AAAA,EACzC,CAAC,YAAY,qBAAqB;AAAA,EAClC,CAAC,YAAY,iBAAiB;AAAA,EAC9B,CAAC,aAAa,UAAU;AAAA,EACxB,CAAC,YAAY,QAAQ;AAAA,EACrB,CAAC,YAAY,QAAQ;AACvB;AAEO,SAAS,QAAQ,QAAgC,YAA4B;AAClF,MAAI,WAAW;AAEf,MAAI,WAAW,qBAAsB,WAAW,QAAQ;AACtD,eAAW,CAAC,SAAS,WAAW,KAAK,sBAAsB;AACzD,iBAAW,SAAS,QAAQ,SAAS,WAAW;AAAA,IAClD;AAAA,EACF;AACA,QAAM,aAAa,SAAS,YAAY,EAAE,QAAQ,QAAQ,GAAG;AAC7D,SAAO,GAAG,MAAM,IAAI,UAAU;AAChC;AAOO,IAAK,oBAAL,kBAAKC,uBAAL;AACL,EAAAA,mBAAA,UAAO;AACP,EAAAA,mBAAA,eAAY;AACZ,EAAAA,mBAAA,UAAO;AACP,EAAAA,mBAAA,WAAQ;AACR,EAAAA,mBAAA,gBAAa;AACb,EAAAA,mBAAA,UAAO;AACP,EAAAA,mBAAA,gBAAa;AACb,EAAAA,mBAAA,WAAQ;AARE,SAAAA;AAAA,GAAA;AAiBL,IAAK,gBAAL,kBAAKC,mBAAL;AACL,EAAAA,eAAA,eAAY;AACZ,EAAAA,eAAA,qBAAkB;AAClB,EAAAA,eAAA,gBAAa;AAHH,SAAAA;AAAA,GAAA;AASL,IAAK,iBAAL,kBAAKC,oBAAL;AACL,EAAAA,gBAAA,YAAS;AACT,EAAAA,gBAAA,mBAAgB;AAChB,EAAAA,gBAAA,WAAQ;AACR,EAAAA,gBAAA,cAAW;AACX,EAAAA,gBAAA,aAAU;AALA,SAAAA;AAAA,GAAA;AAWL,IAAK,mBAAL,kBAAKC,sBAAL;AACL,EAAAA,kBAAA,eAAY;AACZ,EAAAA,kBAAA,iBAAc;AACd,EAAAA,kBAAA,gBAAa;AACb,EAAAA,kBAAA,aAAU;AACV,EAAAA,kBAAA,UAAO;AACP,EAAAA,kBAAA,gBAAa;AACb,EAAAA,kBAAA,gBAAa;AACb,EAAAA,kBAAA,gBAAa;AACb,EAAAA,kBAAA,cAAW;AACX,EAAAA,kBAAA,yBAAsB;AAVZ,SAAAA;AAAA,GAAA;AAgBL,IAAK,kBAAL,kBAAKC,qBAAL;AACL,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,kBAAe;AACf,EAAAA,iBAAA,qBAAkB;AAJR,SAAAA;AAAA,GAAA;AAUL,IAAK,kBAAL,kBAAKC,qBAAL;AACL,EAAAA,iBAAA,UAAO;AACP,EAAAA,iBAAA,iBAAc;AACd,EAAAA,iBAAA,gBAAa;AACb,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,cAAW;AALD,SAAAA;AAAA,GAAA;AAYL,IAAM,aAAa;AAAA,EACxB,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAYO,IAAK,kBAAL,kBAAKC,qBAAL;AAEL,EAAAA,iBAAA,gBAAa;AAEb,EAAAA,iBAAA,aAAU;AAEV,EAAAA,iBAAA,eAAY;AAEZ,EAAAA,iBAAA,gBAAa;AAEb,EAAAA,iBAAA,gBAAa;AAEb,EAAAA,iBAAA,mBAAgB;AAEhB,EAAAA,iBAAA,uBAAoB;AAEpB,EAAAA,iBAAA,aAAU;AAEV,EAAAA,iBAAA,iBAAc;AAEd,EAAAA,iBAAA,oBAAiB;AApBP,SAAAA;AAAA,GAAA;AA0BL,IAAK,qBAAL,kBAAKC,wBAAL;AACL,EAAAA,oBAAA,kBAAe;AACf,EAAAA,oBAAA,gBAAa;AACb,EAAAA,oBAAA,cAAW;AACX,EAAAA,oBAAA,kBAAe;AACf,EAAAA,oBAAA,gBAAa;AALH,SAAAA;AAAA,GAAA;AAWL,IAAM,oBAAoB;AAAA,EAC/B,GAAG;AAAA,EACH,GAAG;AACL;AAQO,IAAK,kBAAL,kBAAKC,qBAAL;AAEL,EAAAA,iBAAA,eAAY;AAEZ,EAAAA,iBAAA,UAAO;AAEP,EAAAA,iBAAA,cAAW;AAEX,EAAAA,iBAAA,SAAM;AARI,SAAAA;AAAA,GAAA;AAYL,IAAM,mBAAoD;AAAA,EAC/D,CAAC,2BAAyB,GAAG;AAAA,EAC7B,CAAC,iBAAoB,GAAG;AAAA,EACxB,CAAC,yBAAwB,GAAG;AAAA,EAC5B,CAAC,eAAmB,GAAG;AACzB;AAGO,SAAS,kBAAkB,OAAyC;AACzE,SAAO,iBAAiB,KAAwB,KAAK;AACvD;AAGO,SAAS,kBAAkB,OAAgC;AAChE,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI,SAAS,IAAM,QAAO;AAC1B,MAAI,SAAS,IAAM,QAAO;AAC1B,SAAO;AACT;AAYO,IAAM,yBAAyB,oBAAI,IAAY;AAAA;AAAA,EAEpD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AACF,CAAC;AAMM,IAAM,wBAAgD;AAAA;AAAA,EAE3D,CAAC,6BAA0B,GAAG;AAAA,EAC9B,CAAC,uBAAuB,GAAG;AAAA,EAC3B,CAAC,2BAAyB,GAAG;AAAA,EAC7B,CAAC,6BAA0B,GAAG;AAAA,EAC9B,CAAC,uBAAuB,GAAG;AAAA,EAC3B,CAAC,+BAA2B,GAAG;AAAA,EAC/B,CAAC,2CAAiC,GAAG;AAAA,EACrC,CAAC,mCAA6B,GAAG;AAAA,EACjC,CAAC,qCAA8B,GAAG;AAAA;AAAA;AAAA,EAGlC,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,aAAa;AAAA,EACb,WAAW;AAAA,EACX,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,UAAU;AACZ;AAMO,IAAM,sBAA8C;AAAA,EACzD,CAAC,6BAA0B,GAAG;AAAA,EAC9B,CAAC,uBAAuB,GAAG;AAAA,EAC3B,CAAC,2BAAyB,GAAG;AAAA,EAC7B,CAAC,6BAA0B,GAAG;AAAA,EAC9B,CAAC,mCAA6B,GAAG;AAAA,EACjC,CAAC,2CAAiC,GAAG;AAAA,EACrC,CAAC,uBAAuB,GAAG;AAAA,EAC3B,CAAC,qCAA8B,GAAG;AACpC;;;AChTO,IAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAOO,SAAS,kBAAkB,MAAkC;AAClE,MAAI,oBAAoB,SAAS,IAAwB,EAAG,QAAO;AACnE,MAAI,KAAK,WAAW,SAAS,EAAG,QAAO;AACvC,SAAO;AACT;AAQO,IAAM,sBAA8C;AAAA,EACzD,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,cAAc;AAAA,EACd,WAAW;AAAA,EACX,WAAW;AAAA,EACX,SAAS;AAAA,EACT,WAAW;AAAA,EACX,UAAU;AACZ;AAEO,SAAS,iBAAiB,YAA4B;AAC3D,SAAO,oBAAoB,UAAU,KAAK,oBAAoB;AAChE;AA+CO,IAAM,mBAAmB,oBAAI,IAAY;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,mBAAmB,oBAAI,IAAY;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;;;AC7ED,IAAM,2BAA2B,oBAAI,IAAI;AAAA,EACvC;AAAA,EAAa;AAAA,EAAe;AAAA,EAAc;AAAA,EAC1C;AAAA,EAAQ;AAAA,EAAc;AAAA,EAAc;AACtC,CAAC;AAEM,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YACU,MACA,UACR;AAFQ;AACA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBH,MAAM,OAAO,OAAsE;AACjF,QAAI,CAAC,kBAAkB,MAAM,IAAI,GAAG;AAClC,YAAM,IAAI,MAAM,wBAAwB,MAAM,IAAI,iBAAiB,oBAAoB,KAAK,IAAI,CAAC,4BAA4B;AAAA,IAC/H;AAEA,UAAM,cAAc,2BAA4B,MAAM,MAAM;AAC5D,UAAM,YAAY,UAAU,MAAM,IAAI;AACtC,UAAM,QAAQ;AAAA,MACZ,SAAS,MAAM;AAAA,MACf,WAAW,MAAM,aAAa;AAAA,MAC9B,eAAe,MAAM,gBAAgB;AAAA,MACrC,YAAY,MAAM,aAAa;AAAA,IACjC;AAEA,UAAM,SAAS,MAAM,KAAK,KAAK,KAAgB,sBAAsB;AAAA,MACnE,WAAW,KAAK;AAAA,MAChB,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA,YAAY,MAAM,aAAa;AAAA,IACjC,CAAC;AAGD,QAAI,WAAW;AACf,QAAI,MAAM,sBAAsB,iBAAiB,IAAI,MAAM,IAAI,GAAG;AAChE,UAAI;AACF,cAAM,WAAW,MAAM,KAAK,MAAM,aAAa,EAAE,aAAa,GAAG,CAAC;AAClE,mBAAW,OAAO,SAAS,SAAS;AAClC,cAAI,CAAC,iBAAiB,IAAI,IAAI,IAAI,EAAG;AACrC,cAAI,IAAI,WAAY;AACpB,gBAAM,cAAc,MAAM,eACtB,IAAI,iBAAiB,MAAM,eAC3B,CAAC,IAAI;AACT,cAAI,aAAa;AACf,kBAAM,KAAK,QAAQ,EAAE,UAAU,IAAI,IAAI,oBAAoB,OAAO,GAAG,CAAC;AACtE;AAAA,UACF;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,WAAO,EAAE,IAAI,OAAO,IAAI,GAAI,WAAW,KAAK,EAAE,SAAS,EAAG;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,MAAM,aAAqB,UAA8B,CAAC,GAA4B;AAC1F,UAAM,cAAc,QAAQ,eAAe;AAE3C,UAAM,QAAgC,EAAE,QAAQ,OAAO,WAAW,EAAE;AACpE,QAAI,QAAQ,KAAM,OAAM,OAAO,QAAQ;AAEvC,UAAM,KAAK,IAAI,gBAAgB,KAAK,EAAE,SAAS;AAC/C,UAAM,WAAW,MAAM,KAAK,KAAK;AAAA,MAC/B,mBAAmB,IAAI,KAAK,QAAQ,CAAC,IAAI,IAAI,WAAW,CAAC,IAAI,EAAE;AAAA,IACjE;AAEA,UAAM,UAAyB,SAAS,QAAQ,IAAI,QAAM;AAAA,MACxD,IAAI,EAAE;AAAA,MACN,MAAM,EAAE;AAAA,MACR,SAAS,EAAE;AAAA,MACX,WAAW,EAAE;AAAA,MACb,kBAAkB,EAAE;AAAA,MACpB,UAAU,KAAK,MAAM,EAAE,YAAY,EAAE,IAAI;AAAA,MACzC,cAAc,EAAE,iBAAiB;AAAA,MACjC,YAAY,EAAE,eAAe;AAAA,MAC7B,WAAW,EAAE;AAAA,IACf,EAAE;AAEF,WAAO;AAAA,MACL;AAAA,MACA,YAAY,SAAS;AAAA,MACrB,oBAAoB,SAAS;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,QAAQ,OAA0D;AAEtE,UAAM,WAAW,MAAM,KAAK,KAAK;AAAA,MAC/B,sBAAsB,IAAI,KAAK,QAAQ,CAAC,IAAI,IAAI,MAAM,QAAQ,CAAC;AAAA,IACjE,EAAE,MAAM,MAAM,IAAI;AAElB,QAAI,CAAC,SAAU,QAAO,EAAE,SAAS,MAAM;AAEvC,UAAM,QAAQ,OAAO,SAAS,UAAU,YAAY,SAAS,UAAU,OACnE,EAAE,GAAI,SAAS,OAAmC,aAAa,MAAM,mBAAmB,IACxF,EAAE,SAAS,OAAO,SAAS,KAAK,GAAG,aAAa,MAAM,mBAAmB;AAE7E,UAAM,KAAK,KAAK,KAAK,gCAAgC;AAAA,MACnD,WAAW,KAAK;AAAA,MAChB,uBAAuB,MAAM;AAAA,MAC7B,SAAS,SAAS;AAAA,MAClB,WAAW,SAAS;AAAA,MACpB;AAAA,MACA,YAAY,SAAS;AAAA,IACvB,CAAC;AAED,WAAO,EAAE,SAAS,KAAK;AAAA,EACzB;AACF;AAWO,SAAS,aACd,WACA,UACA,eACA,aAAsB,OACd;AACR,QAAM,oBAAoB,aAAa,gBAAgB,IAAI;AAC3D,QAAM,UAAU,YAAY,KAAK,IAAI,GAAG,CAAC,WAAW,iBAAiB;AACrE,SAAO,KAAK,MAAM,UAAU,GAAG,IAAI;AACrC;AAQO,SAAS,eACd,YACA,cAAsB,IACP;AACf,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,WAAW,cAAc,KAAK,KAAK;AACzC,QAAM,UAAyB,CAAC;AAEhC,aAAW,KAAK,YAAY;AAC1B,QAAI,EAAE,aAAc;AACpB,UAAM,WAAW,EAAE,UAAU,WAAW,SAAS;AACjD,UAAM,WAAW,yBAAyB,IAAI,EAAE,SAAS;AACzD,QAAI,CAAC,YAAY,CAAC,SAAU;AAE5B,UAAM,YAAY,EAAE;AACpB,UAAM,QAAQ,MAAM,IAAI,KAAK,SAAS,EAAE,QAAQ;AAChD,QAAI,QAAQ,SAAU;AAEtB,UAAM,WAAW,SAAS,KAAK,KAAK;AACpC,UAAM,OAAO,WAAW,EAAE,UAAU,MAAM,CAAC,IAAI,EAAE;AACjD,UAAM,WAAW,iBAAiB,IAAI;AAEtC,QAAI,UAAU;AACd,QAAI,YAAY,EAAE,cAAc;AAChC,QAAI;AACJ,QAAI;AAEJ,QAAI,OAAO,EAAE,UAAU,YAAY,EAAE,UAAU,MAAM;AACnD,YAAM,IAAI,EAAE;AACZ,gBAAW,EAAE,WAAsB;AACnC,kBAAa,EAAE,aAAwB;AACvC,qBAAgB,EAAE,iBAA4B;AAC9C,mBAAc,EAAE,eAA0B;AAAA,IAC5C,OAAO;AACL,gBAAU,OAAO,EAAE,KAAK;AAAA,IAC1B;AAEA,YAAQ,KAAK;AAAA,MACX,IAAI,EAAE;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,kBAAkB,aAAa,WAAW,UAAU,UAAU,CAAC,CAAC,UAAU;AAAA,MAC1E,UAAU,KAAK,MAAM,WAAW,EAAE,IAAI;AAAA,MACtC;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,UAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ;AAC9C,SAAO;AACT;AAEA,SAAS,IAAI,GAAmB;AAC9B,SAAO,mBAAmB,CAAC;AAC7B;;;ACtPO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YACU,MACA,UACR;AAFQ;AACA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BH,MAAM,SAAS,OAAuD;AACpE,UAAM,cAAc,2BAA4B,MAAM,MAAM;AAG5D,UAAM,aAAa,MAAM,KAAK,KAAK;AAAA,MACjC,4BAA4BC,KAAI,KAAK,QAAQ,CAAC,IAAIA,KAAI,WAAW,CAAC;AAAA,IACpE;AAEA,UAAM,SAAS,WAAW,OAAO,OAAK,CAAC,EAAE,YAAY;AACrD,UAAM,UAAU,OAAO,SAAS;AAGhC,QAAI,MAAM,eAAe,CAAC,OAAO,KAAK,OAAK,EAAE,cAAc,UAAU,EAAE,cAAc,WAAW,GAAG;AACjG,UAAI;AACF,cAAM,KAAK,KAAK,KAAK,sBAAsB;AAAA,UACzC,WAAW,KAAK;AAAA,UAChB,SAAS;AAAA,UACT,WAAW;AAAA,UACX,OAAO,MAAM;AAAA,UACb,YAAY;AAAA,QACd,CAAC;AAAA,MACH,QAAQ;AAAA,MAAoB;AAAA,IAC9B;AAGA,UAAM,gBAAgB,OAAO,KAAK,OAAK,EAAE,cAAc,UAAU,EAAE,cAAc,WAAW;AAC5F,UAAM,OAAQ,eAAe,SAAoB,MAAM,eAAe;AAGtE,UAAM,YAA0B,OAC7B,OAAO,OAAK,EAAE,cAAc,UAAU,EACtC,IAAI,QAAM,EAAE,IAAI,EAAE,IAAI,WAAW,EAAE,WAAW,OAAO,EAAE,OAAO,YAAY,EAAE,YAAY,WAAW,EAAE,UAAU,EAAE;AAKpH,eAAW,YAAY,WAAW;AAChC,UAAI;AACF,cAAM,KAAK,KAAK;AAAA,UACd,8BAA8BA,KAAI,KAAK,QAAQ,CAAC,IAAIA,KAAI,SAAS,EAAE,CAAC;AAAA,UACpE,CAAC;AAAA,QACH;AAAA,MACF,QAAQ;AAAA,MAA0D;AAAA,IACpE;AAEA,UAAM,WAAyB,OAC5B,OAAO,OAAK,EAAE,cAAc,aAAa,EAAE,cAAc,cAAc,EACvE,IAAI,QAAM,EAAE,IAAI,EAAE,IAAI,WAAW,EAAE,WAAW,OAAO,EAAE,OAAO,YAAY,EAAE,YAAY,WAAW,EAAE,UAAU,EAAE;AAGpH,UAAM,UAAU,eAAe,UAAU;AACzC,UAAM,YAAY,IAAI,IAAI,QAAQ,IAAI,OAAK,EAAE,EAAE,CAAC;AAGhD,QAAI,oBAAgC;AACpC,QAAI;AACF,YAAM,KAAK,IAAI,gBAAgB,EAAE,QAAQ,KAAK,CAAC,EAAE,SAAS;AAC1D,YAAM,WAAW,MAAM,KAAK,KAAK;AAAA,QAC/B,mBAAmBA,KAAI,KAAK,QAAQ,CAAC,IAAIA,KAAI,WAAW,CAAC,IAAI,EAAE;AAAA,MACjE;AACA,0BAAoB,SAAS;AAAA,IAC/B,QAAQ;AAAA,IAA0C;AAElD,UAAM,WAAyB,OAC5B;AAAA,MAAO,OACN,EAAE,cAAc,cAChB,EAAE,cAAc,aAChB,EAAE,cAAc,kBAChB,CAAC,UAAU,IAAI,EAAE,EAAE;AAAA;AAAA,IACrB,EACC,IAAI,QAAM,EAAE,IAAI,EAAE,IAAI,WAAW,EAAE,WAAW,OAAO,EAAE,OAAO,YAAY,EAAE,YAAY,WAAW,EAAE,UAAU,EAAE;AAGpH,UAAM,kBAAqC,CAAC;AAC5C,QAAI;AACF,YAAM,gBAAgB,MAAM,KAAK,KAAK,IAElC,yBAAyBA,KAAI,KAAK,QAAQ,CAAC,IAAIA,KAAI,WAAW,CAAC,EAAE;AAErE,YAAM,UAAU,oBAAI,IAAY;AAChC,iBAAW,OAAO,eAAe;AAC/B,cAAM,QAAQ,IAAI,gBAAgB,cAAc,IAAI,YAAY,IAAI;AACpE,YAAI,CAAC,SAAS,UAAU,eAAe,QAAQ,IAAI,KAAK,EAAG;AAC3D,gBAAQ,IAAI,KAAK;AAEjB,cAAM,mBAAmB,MAAM,KAAK,KAAK;AAAA,UACvC,4BAA4BA,KAAI,KAAK,QAAQ,CAAC,IAAIA,KAAI,KAAK,CAAC;AAAA,QAC9D;AACA,cAAM,eAAe,iBAAiB,OAAO,OAAK,CAAC,EAAE,YAAY;AACjE,cAAM,aAAa,aAAa,KAAK,OAAK,EAAE,cAAc,MAAM;AAChE,cAAM,QAAQ,aACX,OAAO,OAAK,EAAE,cAAc,MAAM,EAClC,IAAI,QAAM,EAAE,WAAW,EAAE,WAAW,OAAO,EAAE,MAAM,EAAE;AAExD,wBAAgB,KAAK;AAAA,UACnB,SAAS;AAAA,UACT,MAAO,YAAY,SAAoB;AAAA,UACvC,cAAc,IAAI;AAAA,UAClB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,QAAQ;AAAA,IAAqB;AAG7B,UAAM,YAA4B,CAAC;AACnC,QAAI;AACF,UAAI,CAAC,MAAM,QAAS,OAAM,IAAI,MAAM,6DAA6D;AACjG,YAAM,UAAU,MAAM,KAAK,KAAK,IAG5B,0BAA0BA,KAAI,MAAM,OAAO,CAAC,2BAA2B;AAE3E,iBAAW,QAAQ,SAAS;AAC1B,YAAI,KAAK,aAAc;AAGvB,cAAM,OAAO,KAAK,iBAAiB;AACnC,cAAM,eAAe,KAAK,SAAS,WAAW,MACxC,KAAK,yBAAyB,CAAC,GAAG,KAAK,QAAM;AAE/C,gBAAM,IAAI,WAAW,KAAK,QAAM,GAAG,OAAO,EAAE;AAC5C,iBAAO,GAAG,YAAY;AAAA,QACxB,CAAC;AAEH,YAAI,CAAC,aAAc;AAEnB,YAAI,eAAe,QAAQ;AAC3B,YAAI,MAAM;AACR,yBAAe,aAAa;AAAA,YAC1B,IAAI,OAAO,YAAY,QAAQ,uBAAuB,MAAM,GAAG,GAAG;AAAA,YAChE;AAAA,UACF;AAAA,QACF;AACF,kBAAU,KAAK,EAAE,IAAI,KAAK,IAAI,MAAM,aAAa,CAAC;AAAA,MACpD;AAAA,IACF,QAAQ;AAAA,IAAqB;AAG7B,UAAM,QAAkB,CAAC;AACzB,QAAI,UAAU,SAAS,GAAG;AACxB,YAAM,KAAK,cAAc,UAAU,MAAM,+CAA0C,UAAU,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,KAAK,CAAC,EAAE;AAAA,IAC7H;AACA,QAAI,UAAU,SAAS,GAAG;AACxB,YAAM,KAAK,cAAc,UAAU,MAAM,MAAM,UAAU,IAAI,OAAK,IAAI,EAAE,KAAK,GAAG,EAAE,KAAK,IAAI,CAAC,iCAAiC;AAAA,IAC/H;AACA,QAAI,gBAAgB,SAAS,GAAG;AAC9B,YAAM,KAAK;AAAA,EAAsB,gBAAgB,IAAI,OAAK;AACxD,cAAM,WAAW,EAAE,MAAM,IAAI,OAAK,GAAG,EAAE,SAAS,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,IAAI;AACzE,eAAO,KAAK,EAAE,IAAI,KAAK,EAAE,YAAY,IAAI,WAAW,OAAO,WAAW,EAAE;AAAA,MAC1E,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,IACjB;AACA,QAAI,SAAS,SAAS,KAAK,MAAM,WAAW,GAAG;AAC7C,YAAM,KAAK,YAAY,SAAS,MAAM,0BAA0B;AAAA,IAClE;AACA,QAAI,MAAM,WAAW,GAAG;AACtB,YAAM,KAAK,8DAAyD;AAAA,IACtE;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,MAAM,KAAK,IAAI;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,eAAe,OAA2D;AAC9E,UAAM,cAAc,2BAA4B,MAAM,MAAM;AAC5D,UAAM,gBAAgB,+BAA8B,MAAM,IAAI;AAC9D,UAAM,OAAO,OAAO,MAAM,eAAe,WACrC,MAAM,aACN,kBAAkB,MAAM,yCAAuC;AAEnE,QAAI,oBAAoB;AACxB,QAAI,uBAAuB;AAC3B,UAAM,WAAqB,CAAC;AAG5B,UAAM,KAAK,KAAK,KAAK,sBAAsB;AAAA,MACzC,WAAW,KAAK;AAAA,MAAU,SAAS;AAAA,MAAe,WAAW;AAAA,MAAQ,OAAO,MAAM;AAAA,MAAM,YAAY;AAAA,IACtG,CAAC;AACD;AAGA,QAAI,MAAM,MAAM;AAEd,UAAI;AACF,cAAM,WAAW,MAAM,KAAK,KAAK;AAAA,UAC/B,4BAA4BA,KAAI,KAAK,QAAQ,CAAC,IAAIA,KAAI,aAAa,CAAC;AAAA,QACtE;AACA,cAAM,eAAe,SAAS,KAAK,OAAK,EAAE,cAAc,UAAU,CAAC,EAAE,YAAY;AACjF,YAAI,gBAAgB,aAAa,UAAU,MAAM,MAAM;AACrD,mBAAS,KAAK,GAAG,MAAM,IAAI,oBAAoB,aAAa,KAAK,8BAAyB,MAAM,IAAI,4BAA4B;AAChI,gBAAM,KAAK,KAAK,KAAK,gCAAgC;AAAA,YACnD,WAAW,KAAK;AAAA,YAAU,uBAAuB,aAAa;AAAA,YAC9D,SAAS;AAAA,YAAe,WAAW;AAAA,YAAQ,OAAO,MAAM;AAAA,YAAM,YAAY;AAAA,UAC5E,CAAC;AAAA,QACH,WAAW,CAAC,cAAc;AACxB,gBAAM,KAAK,KAAK,KAAK,sBAAsB;AAAA,YACzC,WAAW,KAAK;AAAA,YAAU,SAAS;AAAA,YAAe,WAAW;AAAA,YAAQ,OAAO,MAAM;AAAA,YAAM,YAAY;AAAA,UACtG,CAAC;AAAA,QACH;AAAA,MACF,QAAQ;AACN,cAAM,KAAK,KAAK,KAAK,sBAAsB;AAAA,UACzC,WAAW,KAAK;AAAA,UAAU,SAAS;AAAA,UAAe,WAAW;AAAA,UAAQ,OAAO,MAAM;AAAA,UAAM,YAAY;AAAA,QACtG,CAAC;AAAA,MACH;AACA;AAGA,UAAI;AACF,cAAM,gBAAgB,MAAM,KAAK,KAAK;AAAA,UACpC,2BAA2BA,KAAI,KAAK,QAAQ,CAAC;AAAA,QAC/C;AACA,cAAM,WAAW,cAAc;AAAA,UAAO,OACpC,EAAE,QAAQ,WAAW,SAAS,KAC9B,EAAE,YAAY,iBACd,EAAE,cAAc,UAChB,EAAE,UAAU,MAAM,QAClB,CAAC,EAAE;AAAA,QACL;AACA,YAAI,SAAS,SAAS,GAAG;AACvB,gBAAM,kBAAkB,MAAM,KAAK,KAAK;AAAA,YACtC,4BAA4BA,KAAI,KAAK,QAAQ,CAAC,IAAIA,KAAI,SAAS,CAAC,EAAE,OAAO,CAAC;AAAA,UAC5E;AACA,gBAAM,YAAY,gBAAgB,KAAK,OAAK,EAAE,cAAc,MAAM,GAAG,SAAS,SAAS,CAAC,EAAE;AAC1F,mBAAS,KAAK,IAAI,MAAM,IAAI,wBAAwB,SAAS,QAAQ,SAAS,0BAA0B;AAAA,QAC1G;AAAA,MACF,QAAQ;AAAA,MAAqB;AAG7B,YAAM,cAAc,2BAA4B,MAAM,IAAI;AAC1D,YAAM,KAAK,KAAK,KAAK,sBAAsB;AAAA,QACzC,WAAW,KAAK;AAAA,QAAU,SAAS;AAAA,QAAa,WAAW;AAAA,QAAQ,OAAO,MAAM;AAAA,QAAM,YAAY;AAAA,MACpG,CAAC;AACD,YAAM,KAAK,KAAK,KAAK,yBAAyB;AAAA,QAC5C,WAAW,KAAK;AAAA,QAAU,cAAc;AAAA,QAAe,YAAY;AAAA,QACnE;AAAA,QAA+C,YAAY;AAAA,MAC7D,CAAC;AACD;AACA;AAAA,IACF;AAGA,QAAI,MAAM,SAAS;AACjB,YAAM,KAAK,KAAK,KAAK,sBAAsB;AAAA,QACzC,WAAW,KAAK;AAAA,QAAU,SAAS;AAAA,QAAe,WAAW;AAAA,QAAW,OAAO,MAAM;AAAA,QAAS,YAAY;AAAA,MAC5G,CAAC;AACD;AAAA,IACF;AAGA,UAAM,KAAK,KAAK,KAAK,sBAAsB;AAAA,MACzC,WAAW,KAAK;AAAA,MAAU,SAAS;AAAA,MAAe,WAAW;AAAA,MAC7D,OAAO,MAAM,iBAAiB,cAAc,cAAc;AAAA,MAAU,YAAY;AAAA,IAClF,CAAC;AACD;AAIA,UAAM,cAAsC;AAAA,MAC1C;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,cAAc,YAAY,MAAM,YAAY,KAAK,MAAM;AAC7D,UAAM,cAAc,sBAAsB,MAAM,YAAY,KAAK,sBAAsB,WAAW,KAAK,MAAM;AAG7G,UAAM,KAAK,KAAK,KAAK,yBAAyB;AAAA,MAC5C,WAAW,KAAK;AAAA,MAAU,cAAc;AAAA,MAAa,YAAY;AAAA,MACjE,mBAAmB;AAAA,MAAa,YAAY;AAAA,IAC9C,CAAC;AACD;AAGA,UAAM,KAAK,KAAK,KAAK,yBAAyB;AAAA,MAC5C,WAAW,KAAK;AAAA,MAAU,cAAc;AAAA,MAAe,YAAY;AAAA,MACnE,mBAAmB;AAAA,MAAa,YAAY;AAAA,IAC9C,CAAC;AACD;AAEA,WAAO,EAAE,eAAe,mBAAmB,sBAAsB,SAAS;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,cAAc,OAA0D;AAC5E,UAAM,cAAc,2BAA4B,MAAM,MAAM;AAC5D,UAAM,OAAO,OAAO,MAAM,eAAe,WACrC,MAAM,aACN,kBAAkB,MAAM,+BAAkC;AAE9D,UAAM,KAAK,KAAK,KAAK,sBAAsB;AAAA,MACzC,WAAW,KAAK;AAAA,MAAU,SAAS;AAAA,MACnC,WAAW,MAAM;AAAA,MAAM,OAAO,MAAM;AAAA,MAAO,YAAY;AAAA,IACzD,CAAC;AAGD,QAAI,MAAM,aAAa;AACrB,YAAM,gBAAgB,+BAA8B,MAAM,WAAW;AACrE,UAAI;AAEF,cAAM,mBAAmB,MAAM,KAAK,KAAK;AAAA,UACvC,4BAA4BA,KAAI,KAAK,QAAQ,CAAC,IAAIA,KAAI,aAAa,CAAC;AAAA,QACtE;AACA,YAAI,iBAAiB,SAAS,GAAG;AAC/B,gBAAM,KAAK,KAAK,KAAK,sBAAsB;AAAA,YACzC,WAAW,KAAK;AAAA,YAAU,SAAS;AAAA,YACnC,WAAW;AAAA,YAAY,OAAO,MAAM;AAAA,YAAO,YAAY;AAAA,UACzD,CAAC;AAAA,QACH;AAAA,MACF,QAAQ;AAAA,MAAqB;AAAA,IAC/B;AAEA,WAAO,EAAE,SAAS,KAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,QAAgB,iBAAwD;AAC5F,UAAM,cAAc,2BAA4B,MAAM;AACtD,UAAM,aAAa,MAAM,KAAK,KAAK;AAAA,MACjC,4BAA4BA,KAAI,KAAK,QAAQ,CAAC,IAAIA,KAAI,WAAW,CAAC;AAAA,IACpE;AAEA,UAAM,WAAW,WAAW;AAAA,MAC1B,OAAK,EAAE,cAAc,cAAc,CAAC,EAAE,gBACnC,EAAE,MAAiB,YAAY,EAAE,SAAS,gBAAgB,YAAY,CAAC;AAAA,IAC5E;AAEA,QAAI,UAAU;AACZ,YAAM,KAAK,KAAK,KAAK,8BAA8BA,KAAI,KAAK,QAAQ,CAAC,IAAIA,KAAI,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC;AAC/F,aAAO,EAAE,SAAS,KAAK;AAAA,IACzB;AACA,WAAO,EAAE,SAAS,MAAM;AAAA,EAC1B;AACF;AAEA,SAASA,KAAI,GAAmB;AAC9B,SAAO,mBAAmB,CAAC;AAC7B;;;ACnQO,IAAM,sBAAN,MAA0B;AAAA,EAC/B,YACU,MACA,UACR;AAFQ;AACA;AAAA,EACP;AAAA;AAAA,EAGH,MAAM,OAAO,OAAiD;AAC5D,UAAM,WAAW,MAAM,YAAY,KAAK;AACxC,WAAO,KAAK,KAAK,KAAgB,sBAAsB;AAAA,MACrD,WAAW;AAAA,MACX,SAAS,MAAM;AAAA,MACf,WAAW,MAAM;AAAA,MACjB,OAAO,MAAM;AAAA,MACb,YAAY,MAAM;AAAA,IACpB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,IAAI,aAAqB,SAAqD;AAClF,UAAM,WAAW,SAAS,YAAY,KAAK;AAC3C,WAAO,KAAK,KAAK;AAAA,MACf,sBAAsBC,KAAI,QAAQ,CAAC,IAAIA,KAAI,WAAW,CAAC;AAAA,IACzD;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,MAAMC,UAAiB,SAAuD;AAClF,UAAM,WAAW,SAAS,YAAY,KAAK;AAC3C,WAAO,KAAK,KAAK;AAAA,MACf,4BAA4BD,KAAI,QAAQ,CAAC,IAAIA,KAAIC,QAAO,CAAC;AAAA,IAC3D;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,KAAK,SAAuD;AAChE,UAAM,WAAW,SAAS,YAAY,KAAK;AAC3C,WAAO,KAAK,KAAK;AAAA,MACf,2BAA2BD,KAAI,QAAQ,CAAC;AAAA,IAC1C;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,UAAU,OAAoD;AAClE,UAAM,WAAW,MAAM,YAAY,KAAK;AACxC,WAAO,KAAK,KAAK,KAAgB,gCAAgC;AAAA,MAC/D,WAAW;AAAA,MACX,uBAAuB,MAAM;AAAA,MAC7B,SAAS,MAAM;AAAA,MACf,WAAW,MAAM;AAAA,MACjB,OAAO,MAAM;AAAA,MACb,YAAY,MAAM;AAAA,IACpB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,QAAQ,aAAqB,SAAqD;AACtF,UAAM,WAAW,SAAS,YAAY,KAAK;AAC3C,WAAO,KAAK,KAAK;AAAA,MACf,8BAA8BA,KAAI,QAAQ,CAAC,IAAIA,KAAI,WAAW,CAAC;AAAA,MAC/D,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAGO,IAAM,yBAAN,MAA6B;AAAA,EAClC,YACU,MACA,UACR;AAFQ;AACA;AAAA,EACP;AAAA;AAAA,EAGH,MAAM,OAAO,OAAuD;AAClE,UAAM,WAAW,MAAM,YAAY,KAAK;AACxC,WAAO,KAAK,KAAK,KAAmB,yBAAyB;AAAA,MAC3D,WAAW;AAAA,MACX,cAAc,MAAM;AAAA,MACpB,YAAY,MAAM;AAAA,MAClB,mBAAmB,MAAM;AAAA,MACzB,YAAY,MAAM;AAAA,MAClB,QAAQ,MAAM;AAAA,MACd,YAAY,MAAM;AAAA,IACpB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,MAAMC,UAAiB,SAA0D;AACrF,UAAM,WAAW,SAAS,YAAY,KAAK;AAC3C,WAAO,KAAK,KAAK;AAAA,MACf,yBAAyBD,KAAI,QAAQ,CAAC,IAAIA,KAAIC,QAAO,CAAC;AAAA,IACxD;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,KAAK,SAA0D;AACnE,UAAM,WAAW,SAAS,YAAY,KAAK;AAC3C,WAAO,KAAK,KAAK;AAAA,MACf,8BAA8BD,KAAI,QAAQ,CAAC;AAAA,IAC7C;AAAA,EACF;AACF;AA6LO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YACU,MACA,UACR;AAFQ;AACA;AAAA,EACP;AAAA;AAAA,EAGH,MAAM,OAAO,OAA+C;AAC1D,UAAM,WAAW,MAAM,YAAY,KAAK;AACxC,WAAO,KAAK,KAAK,KAAkB,kBAAkB;AAAA,MACnD,WAAW;AAAA,MACX,MAAM,MAAM;AAAA,MACZ,aAAa,MAAM;AAAA,MACnB,aAAa,MAAM;AAAA,MACnB,cAAc,MAAM,eAAe,OAAO,MAAM,YAAY,IAAI;AAAA,MAChE,OAAO,MAAM,QAAQ,OAAO,MAAM,KAAK,IAAI;AAAA,MAC3C,cAAc,MAAM;AAAA,MACpB,eAAe,MAAM,eAAe,OAAO,MAAM,YAAY,IAAI;AAAA,IACnE,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,IAAI,SAAiB,SAAuD;AAChF,UAAM,WAAW,SAAS,YAAY,KAAK;AAC3C,WAAO,KAAK,KAAK;AAAA,MACf,kBAAkBA,KAAI,QAAQ,CAAC,IAAIA,KAAI,OAAO,CAAC;AAAA,IACjD;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,OAAO,SAAiB,OAAyB,SAAuD;AAC5G,UAAM,WAAW,SAAS,YAAY,KAAK;AAC3C,WAAO,KAAK,KAAK;AAAA,MACf,kBAAkBA,KAAI,QAAQ,CAAC,IAAIA,KAAI,OAAO,CAAC;AAAA,MAC/C;AAAA,QACE,WAAW;AAAA,QACX,MAAM,MAAM;AAAA,QACZ,aAAa,MAAM;AAAA,QACnB,aAAa,MAAM;AAAA,QACnB,cAAc,MAAM,eAAe,OAAO,MAAM,YAAY,IAAI;AAAA,QAChE,OAAO,MAAM,QAAQ,OAAO,MAAM,KAAK,IAAI;AAAA,QAC3C,cAAc,MAAM;AAAA,QACpB,eAAe,MAAM,eAAe,OAAO,MAAM,YAAY,IAAI;AAAA,QACjE,WAAW,MAAM;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,OAAO,SAAiB,SAAgD;AAC5E,UAAM,WAAW,SAAS,YAAY,KAAK;AAC3C,UAAM,KAAK,KAAK,OAAgB,kBAAkBA,KAAI,QAAQ,CAAC,IAAIA,KAAI,OAAO,CAAC,EAAE;AAAA,EACnF;AAAA;AAAA,EAGA,MAAM,KAAK,SAAyD;AAClE,UAAM,WAAW,SAAS,YAAY,KAAK;AAC3C,WAAO,KAAK,KAAK;AAAA,MACf,uBAAuBA,KAAI,QAAQ,CAAC;AAAA,IACtC;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,gBAAgB,SAAiB,SAAgE;AACrG,UAAM,WAAW,SAAS,YAAY,KAAK;AAC3C,WAAO,KAAK,KAAK;AAAA,MACf,kBAAkBA,KAAI,QAAQ,CAAC,IAAIA,KAAI,OAAO,CAAC;AAAA,IACjD;AAAA,EACF;AACF;AAwDO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YACU,MACA,UACR;AAFQ;AACA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYH,MAAM,MAAM,OAA4D;AACtE,UAAM,WAAW,MAAM,YAAY,KAAK;AAExC,QAAI,MAAM,KAAK;AAEb,aAAO,KAAK,KAAK,KAAgB,sBAAsB;AAAA,QACrD,WAAW;AAAA,QACX,SAAS,MAAM;AAAA,QACf,WAAW,MAAM;AAAA,QACjB,OAAO,MAAM;AAAA,QACb,YAAY,MAAM;AAAA,MACpB,CAAC;AAAA,IACH;AAGA,UAAM,gBAAgB,OAAO,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAC9F,WAAO,KAAK,KAAK,KAAmB,yBAAyB;AAAA,MAC3D,gBAAgB;AAAA,MAChB,UAAU,MAAM;AAAA,MAChB,WAAW;AAAA,MACX,YAAY,CAAC;AAAA,QACX,SAAS,MAAM;AAAA,QACf,WAAW,MAAM;AAAA,QACjB,OAAO,MAAM;AAAA,QACb,mBAAmB,MAAM,cAAc;AAAA,QACvC,YAAY;AAAA,QACZ,aAAa,MAAM;AAAA,MACrB,CAAC;AAAA,MACD,SAAS,MAAM;AAAA,IACjB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,OAAOC,UAAiB,SAAuD;AACnF,UAAM,WAAW,SAAS,YAAY,KAAK;AAC3C,WAAO,KAAK,KAAK;AAAA,MACf,4BAA4BD,KAAI,QAAQ,CAAC,IAAIA,KAAIC,QAAO,CAAC;AAAA,IAC3D;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,OAAO,aAAqB,SAAqD;AACrF,UAAM,WAAW,SAAS,YAAY,KAAK;AAC3C,WAAO,KAAK,KAAK;AAAA,MACf,8BAA8BD,KAAI,QAAQ,CAAC,IAAIA,KAAI,WAAW,CAAC;AAAA,MAC/D,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAoGO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YACU,MACA,UACR;AAFQ;AACA;AAAA,EACP;AAAA;AAAA,EAGH,MAAM,OAAO,OAAgD;AAC3D,UAAM,WAAW,MAAM,YAAY,KAAK;AACxC,WAAO,KAAK,KAAK,KAAmB,yBAAyB;AAAA,MAC3D,gBAAgB,MAAM;AAAA,MACtB,UAAU,MAAM;AAAA,MAChB,WAAW;AAAA,MACX,YAAY,MAAM,WAAW,IAAI,QAAM;AAAA,QACrC,SAAS,EAAE;AAAA,QACX,WAAW,EAAE;AAAA,QACb,OAAO,EAAE;AAAA,QACT,mBAAmB,EAAE;AAAA,QACrB,YAAY,EAAE;AAAA,QACd,aAAa,EAAE;AAAA,QACf,YAAY,EAAE;AAAA,QACd,aAAa,EAAE;AAAA,MACjB,EAAE;AAAA,MACF,SAAS,MAAM;AAAA,IACjB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,QAAQ,SAAiB,SAGG;AAChC,QAAI,OAAO,0BAA0BA,KAAI,OAAO,CAAC;AACjD,UAAM,SAAmB,CAAC;AAC1B,QAAI,SAAS,OAAQ,QAAO,KAAK,UAAU,QAAQ,OAAO,KAAK,GAAG,CAAC,EAAE;AACrE,QAAI,SAAS,MAAO,QAAO,KAAK,SAAS,QAAQ,KAAK,EAAE;AACxD,QAAI,OAAO,OAAQ,SAAQ,IAAI,OAAO,KAAK,GAAG,CAAC;AAE/C,WAAO,KAAK,KAAK,IAA0B,IAAI;AAAA,EACjD;AAAA;AAAA,EAGA,MAAM,YAAY,QAA+B;AAC/C,UAAM,KAAK,KAAK,KAAc,8BAA8BA,KAAI,MAAM,CAAC,IAAI,CAAC,CAAC;AAAA,EAC/E;AAAA;AAAA,EAGA,MAAM,eAAe,SAAoD;AACvE,WAAO,KAAK,KAAK;AAAA,MACf,kCAAkCA,KAAI,OAAO,CAAC;AAAA,MAC9C,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,MAAM,SAAuC;AACjD,WAAO,KAAK,KAAK,IAAiB,wBAAwBA,KAAI,OAAO,CAAC,EAAE;AAAA,EAC1E;AACF;AAIA,IAAM,gBAA6B;AAAA,EACjC,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,YAAY;AACd;AAEO,IAAM,kBAAN,MAAsB;AAAA;AAAA,EAElB;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EAEQ;AAAA,EAEjB,YAAY,SAAiC;AAC3C,QAAI,CAAC,QAAQ,UAAU,CAAC,QAAQ,OAAO;AACrC,cAAQ,KAAK,kFAA6E;AAAA,IAC5F;AAEA,SAAK,OAAO,IAAI,cAAc;AAAA,MAC5B,SAAS,QAAQ;AAAA,MACjB,UAAU,QAAQ;AAAA,MAClB,QAAQ,QAAQ;AAAA,MAChB,OAAO,QAAQ;AAAA,MACf,OAAO,EAAE,GAAG,eAAe,GAAG,QAAQ,MAAM;AAAA,MAC5C,WAAW,QAAQ,aAAa;AAAA,MAChC,WAAW,QAAQ,SAAS,WAAW;AAAA,MACvC,SAAS,QAAQ,WAAW,CAAC;AAAA,MAC7B,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAED,SAAK,aAAa,IAAI,oBAAoB,KAAK,MAAM,QAAQ,QAAQ;AACrE,SAAK,gBAAgB,IAAI,uBAAuB,KAAK,MAAM,QAAQ,QAAQ;AAC3E,SAAK,SAAS,IAAI,gBAAgB,KAAK,MAAM,QAAQ,QAAQ;AAC7D,SAAK,SAAS,IAAI,gBAAgB,KAAK,MAAM,QAAQ,QAAQ;AAC7D,SAAK,SAAS,IAAI,gBAAgB,KAAK,MAAM,QAAQ,QAAQ;AAC7D,SAAK,QAAQ,IAAI,eAAe,KAAK,MAAM,QAAQ,QAAQ;AAC3D,SAAK,UAAU,IAAI,iBAAiB,KAAK,MAAM,QAAQ,QAAQ;AAAA,EACjE;AAAA;AAAA,EAGA,MAAM,SAAkC;AACtC,WAAO,KAAK,KAAK,IAAoB,SAAS;AAAA,EAChD;AACF;AAKA,SAASA,KAAI,GAAmB;AAC9B,SAAO,mBAAmB,CAAC;AAC7B;;;ACt2BO,IAAM,yBAAyB;AA0B/B,SAAS,cAAc,MAA0B,UAAgC,CAAC,GAAW;AAClG,QAAM,SAAS,QAAQ,UAAU;AACjC,UAAQ,QAAQ;AAAA,IACd,KAAK;AAAO,aAAO,aAAa,MAAM,OAAO;AAAA,IAC7C,KAAK;AAAQ,aAAO,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,IAChD,KAAK;AAAW,aAAO,KAAK;AAAA,EAC9B;AACF;AAMO,SAAS,aAAa,MAA0B,UAAgC,CAAC,GAAW;AACjG,QAAM;AAAA,IACJ,kBAAkB;AAAA,IAClB,uBAAuB;AAAA,IACvB,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,IAClB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,EAClB,IAAI;AAEJ,QAAM,MAAK,oBAAI,KAAK,GAAE,YAAY;AAClC,QAAM,QAAkB,CAAC;AAGzB,QAAM,iBAAiB,oBAAI,IAA2B;AACtD,QAAM,oBAAmC,CAAC;AAC1C,MAAI,kBAAkB,KAAK,SAAS;AAClC,eAAW,OAAO,KAAK,SAAS;AAC9B,UAAI,IAAI,cAAc;AACpB,cAAM,WAAW,eAAe,IAAI,IAAI,YAAY,KAAK,CAAC;AAC1D,iBAAS,KAAK,GAAG;AACjB,uBAAe,IAAI,IAAI,cAAc,QAAQ;AAAA,MAC/C,OAAO;AACL,0BAAkB,KAAK,GAAG;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,QAAM,KAAK,+BAA+B,sBAAsB,cAAc,IAAI,KAAK,OAAO,CAAC,YAAY,KAAK,OAAO,SAAS,EAAE,IAAI;AAGtI,MAAI,oBAAoB,KAAK,UAAU,SAAS,GAAG;AACjD,UAAM,KAAK,uBAAuB,KAAK,UAAU,MAAM,wBAAwB;AAC/E,eAAW,YAAY,KAAK,WAAW;AACrC,YAAM,KAAK,qBAAqB,IAAI,SAAS,EAAE,CAAC,KAAK,IAAI,SAAS,IAAI,CAAC,aAAa;AAAA,IACtF;AACA,UAAM,KAAK,gBAAgB;AAAA,EAC7B;AAGA,MAAI,oBAAoB,KAAK,UAAU,SAAS,GAAG;AACjD,UAAM,KAAK,uBAAuB,KAAK,UAAU,MAAM,oBAAoB;AAC3E,eAAW,YAAY,KAAK,WAAW;AACrC,YAAM,KAAK,qBAAqB,IAAI,SAAS,EAAE,CAAC,iBAAiB,QAAQ,SAAS,UAAU,CAAC,KAAK,IAAI,OAAO,SAAS,KAAK,CAAC,CAAC,aAAa;AAAA,IAC5I;AACA,UAAM,KAAK,gBAAgB;AAAA,EAC7B;AAGA,MAAI,mBAAmB,KAAK,SAAS,SAAS,GAAG;AAC/C,UAAM,KAAK,6BAA6B,KAAK,SAAS,MAAM,IAAI;AAChE,eAAW,OAAO,KAAK,UAAU;AAC/B,YAAM,aAAa,mBAAmB,KAAK,cAAc;AACzD,UAAI,WAAW,SAAS,GAAG;AACzB,cAAM,KAAK,2BAA2B,IAAI,IAAI,SAAS,CAAC,iBAAiB,QAAQ,IAAI,UAAU,CAAC,IAAI;AACpG,cAAM,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,CAAC,CAAC,EAAE;AAC5C,mBAAW,OAAO,YAAY;AAC5B,gBAAM,KAAK,SAAS,aAAa,GAAG,CAAC,EAAE;AAAA,QACzC;AACA,cAAM,KAAK,gBAAgB;AAAA,MAC7B,OAAO;AACL,cAAM,KAAK,2BAA2B,IAAI,IAAI,SAAS,CAAC,iBAAiB,QAAQ,IAAI,UAAU,CAAC,KAAK,IAAI,OAAO,IAAI,KAAK,CAAC,CAAC,YAAY;AAAA,MACzI;AAAA,IACF;AACA,UAAM,KAAK,sBAAsB;AAAA,EACnC;AAGA,MAAI,KAAK,MAAM;AACb,UAAM,iBAAiB,KAAK,oBAAoB,wBAAwB,KAAK,iBAAiB,MAAM;AACpG,UAAM,KAAK,qBAAqB,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC,cAAc,IAAI,KAAK,OAAO,CAAC,IAAI,cAAc,GAAG;AAC1G,UAAM,qBAAqB,oBAAI,IAAI,CAAC,QAAQ,aAAa,QAAQ,SAAS,cAAc,QAAQ,SAAS,cAAc,qBAAqB,CAAC;AAC7I,UAAM,gBAAgB,KAAK,SAAS,OAAO,OAAK,mBAAmB,IAAI,EAAE,SAAS,KAAK,EAAE,cAAc,aAAa;AACpH,eAAW,QAAQ,eAAe;AAChC,YAAM,cAAc,mBAAmB,MAAM,cAAc;AAC3D,UAAI,YAAY,SAAS,GAAG;AAC1B,cAAM,KAAK,wBAAwB,IAAI,KAAK,SAAS,CAAC,iBAAiB,QAAQ,KAAK,UAAU,CAAC,IAAI;AACnG,cAAM,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,CAAC,CAAC,EAAE;AAC7C,mBAAW,OAAO,aAAa;AAC7B,gBAAM,KAAK,SAAS,aAAa,GAAG,CAAC,EAAE;AAAA,QACzC;AACA,cAAM,KAAK,aAAa;AAAA,MAC1B,OAAO;AACL,cAAM,KAAK,wBAAwB,IAAI,KAAK,SAAS,CAAC,iBAAiB,QAAQ,KAAK,UAAU,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS;AAAA,MACtI;AAAA,IACF;AAEA,eAAW,OAAO,mBAAmB;AACnC,YAAM,KAAK,OAAO,aAAa,GAAG,CAAC,EAAE;AAAA,IACvC;AACA,UAAM,KAAK,eAAe;AAAA,EAC5B;AAGA,MAAI,iBAAiB;AACnB,UAAM,qBAAqB,oBAAI,IAAI,CAAC,QAAQ,aAAa,QAAQ,SAAS,cAAc,QAAQ,SAAS,cAAc,qBAAqB,CAAC;AAC7I,UAAM,YAAY,KAAK,SAAS;AAAA,MAAO,OACrC,CAAC,mBAAmB,IAAI,EAAE,SAAS,KAAK,EAAE,cAAc;AAAA,IAC1D;AACA,QAAI,UAAU,SAAS,GAAG;AACxB,YAAM,KAAK,uBAAuB,UAAU,MAAM,IAAI;AACtD,iBAAW,OAAO,WAAW;AAC3B,cAAM,aAAa,mBAAmB,KAAK,cAAc;AACzD,YAAI,WAAW,SAAS,GAAG;AACzB,gBAAM,KAAK,wBAAwB,IAAI,IAAI,SAAS,CAAC,iBAAiB,QAAQ,IAAI,UAAU,CAAC,IAAI;AACjG,gBAAM,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,CAAC,CAAC,EAAE;AAC5C,qBAAW,OAAO,YAAY;AAC5B,kBAAM,KAAK,SAAS,aAAa,GAAG,CAAC,EAAE;AAAA,UACzC;AACA,gBAAM,KAAK,aAAa;AAAA,QAC1B,OAAO;AACL,gBAAM,KAAK,wBAAwB,IAAI,IAAI,SAAS,CAAC,iBAAiB,QAAQ,IAAI,UAAU,CAAC,KAAK,IAAI,OAAO,IAAI,KAAK,CAAC,CAAC,SAAS;AAAA,QACnI;AAAA,MACF;AACA,YAAM,KAAK,gBAAgB;AAAA,IAC7B;AAAA,EACF;AAGA,MAAI,wBAAwB,KAAK,gBAAgB,SAAS,GAAG;AAC3D,UAAM,KAAK,2BAA2B,KAAK,gBAAgB,MAAM,IAAI;AACrE,eAAW,UAAU,KAAK,iBAAiB;AACzC,YAAM,gBAAgB,eAAe,IAAI,OAAO,OAAO,KAAK,CAAC;AAC7D,YAAM,aAAa,OAAO,MAAM,SAAS,KAAK,cAAc,SAAS;AACrE,UAAI,CAAC,YAAY;AACf,cAAM,KAAK,qBAAqB,IAAI,OAAO,IAAI,CAAC,mBAAmB,IAAI,OAAO,YAAY,CAAC,MAAM;AAAA,MACnG,OAAO;AACL,cAAM,KAAK,qBAAqB,IAAI,OAAO,IAAI,CAAC,mBAAmB,IAAI,OAAO,YAAY,CAAC,IAAI;AAC/F,mBAAW,QAAQ,OAAO,OAAO;AAC/B,gBAAM,KAAK,0BAA0B,IAAI,KAAK,SAAS,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS;AAAA,QAC/F;AACA,mBAAW,OAAO,eAAe;AAC/B,gBAAM,KAAK,SAAS,aAAa,GAAG,CAAC,EAAE;AAAA,QACzC;AACA,cAAM,KAAK,eAAe;AAAA,MAC5B;AAAA,IACF;AACA,UAAM,KAAK,oBAAoB;AAAA,EACjC;AAEA,QAAM,KAAK,sBAAsB;AACjC,SAAO,MAAM,KAAK,IAAI;AACxB;AAIA,SAAS,aAAa,KAA0B;AAC9C,QAAM,YAAY,IAAI,eAAe,WAAW,IAAI,IAAI,YAAY,CAAC,MAAM;AAC3E,SAAO,iBAAiB,IAAI,IAAI,IAAI,CAAC,gBAAgB,QAAQ,IAAI,SAAS,CAAC,cAAc,QAAQ,IAAI,gBAAgB,CAAC,gBAAgB,IAAI,QAAQ,IAAI,SAAS,IAAI,IAAI,IAAI,OAAO,CAAC;AACrL;AAMA,SAAS,mBAAmB,MAAkB,gBAA2D;AACvG,QAAM,UAAyB,CAAC;AAEhC,aAAW,CAAC,cAAc,OAAO,KAAK,gBAAgB;AACpD,QAAI,aAAa,SAAS,KAAK,SAAS,KAAK,aAAa,SAAS,OAAO,KAAK,KAAK,EAAE,YAAY,EAAE,QAAQ,QAAQ,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG;AACtI,cAAQ,KAAK,GAAG,OAAO;AAAA,IACzB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,QAAQ,GAAmB;AAClC,SAAO,EAAE,QAAQ,CAAC;AACpB;AAEA,SAAS,IAAI,GAAmB;AAC9B,SAAO,EACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ;AAC3B;","names":["SubjectPrefix","IdentityPredicate","WorkPredicate","EventPredicate","RapportPredicate","MemoryPredicate","EntityPredicate","OrgRelationship","EntityRelationship","ConfidenceLevel","enc","enc","subject"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/http.ts","../src/types/schema.ts","../src/types/signals.ts","../src/signals.ts","../src/users.ts","../src/client.ts","../src/context.ts"],"sourcesContent":["/**\n * @subcortex-ai/sdk — TypeScript SDK for the SubCortex Cognitive Engine\n *\n * @example\n * ```typescript\n * import { SubCortexClient } from '@subcortex-ai/sdk'\n *\n * const subcortex = new SubCortexClient({\n * endpoint: 'https://api.subcortex.example.com',\n * tenantId: 'my-tenant',\n * apiKey: 'scx_live_...',\n * })\n *\n * // Assertions\n * await subcortex.assertions.create({ subject: 'user:alice', predicate: 'name', value: 'Alice' })\n * const facts = await subcortex.assertions.query('user:alice')\n *\n * // Relationships\n * await subcortex.relationships.create({ fromSubject: 'user:alice', toSubject: 'team:eng', relationshipType: 'member_of' })\n *\n * // Health\n * const health = await subcortex.health()\n * ```\n */\n\n// Client\nexport { SubCortexClient } from './client'\nexport type { SubCortexClientOptions } from './client'\n\n// Namespace classes (for type reference in docs)\nexport { AssertionsNamespace, RelationshipsNamespace, AgentsNamespace, MemoryNamespace } from './client'\n\n// HTTP transport config\nexport type { RetryConfig } from './http'\n\n// Assertion types\nexport type {\n Assertion,\n CreateAssertionInput,\n SupersedeAssertionInput,\n} from './client'\n\n// Relationship types\nexport type {\n Relationship,\n CreateRelationshipInput,\n} from './client'\n\n// Agent types\nexport type {\n AgentConfig,\n AgentPersonality,\n AgentInstructions,\n AgentModelConfig,\n AgentCapability,\n AgentMemoryPolicy,\n CreateAgentInput,\n UpdateAgentInput,\n ComposedInstructions,\n} from './client'\n\n// Memory types\nexport type {\n StoreMemoryInput,\n} from './client'\n\n// Intake types (Thalamus)\nexport type {\n CandidateAssertion,\n IntakeSubmission,\n IntakeResult,\n IntakeResponseItem,\n IntakeStats,\n} from './client'\n\n// Intake namespace\nexport { IntakeNamespace } from './client'\n\n// Users namespace\nexport { UsersNamespace } from './users'\nexport type {\n IdentifyUserInput,\n UserIdentification,\n UserMemory,\n ConnectedPerson,\n ConflictItem,\n RegisterPersonInput,\n RegisterPersonResult,\n RecordRapportInput,\n} from './types/users'\n\n// Context formatting (model injection)\nexport { formatContext, toContextXml, CONTEXT_SCHEMA_VERSION } from './context'\nexport type { ContextFormat, ContextFormatOptions } from './context'\n\n// Signals namespace\nexport { SignalsNamespace } from './signals'\nexport type {\n SignalType,\n SystemSignalType,\n SignalEntry,\n SignalSnapshot,\n RecordSignalInput,\n SignalQueryOptions,\n ResolveSignalInput,\n Trajectory,\n} from './types/signals'\nexport {\n SYSTEM_SIGNAL_TYPES,\n SIGNAL_DECAY_CONFIG,\n POSITIVE_SIGNALS,\n NEGATIVE_SIGNALS,\n isValidSignalType,\n getDecayHalfLife,\n} from './types/signals'\n\n// Schema — built-in predicates, relationships, confidence\nexport {\n SubjectPrefix,\n subject,\n IdentityPredicate,\n WorkPredicate,\n EventPredicate,\n RapportPredicate,\n MemoryPredicate,\n EntityPredicate,\n Predicates,\n OrgRelationship,\n EntityRelationship,\n RelationshipTypes,\n ConfidenceLevel,\n ConfidenceScores,\n confidenceToScore,\n scoreToConfidence,\n MULTI_VALUE_PREDICATES,\n REVERSE_RELATIONSHIPS,\n RELATIONSHIP_LABELS,\n} from './types/schema'\n\n// Common types\nexport type {\n HealthResponse,\n ConfidenceScore,\n TemporalBounds,\n Provenance,\n PaginatedResponse,\n BatchResult,\n} from './types/common'\n\n// Errors\nexport {\n SubCortexError,\n SubCortexValidationError,\n SubCortexAuthenticationError,\n SubCortexAuthorizationError,\n SubCortexNotFoundError,\n SubCortexConflictError,\n SubCortexRateLimitError,\n SubCortexServerError,\n SubCortexNetworkError,\n SubCortexTimeoutError,\n} from './errors'\n","/**\n * SubCortex SDK Error Hierarchy\n *\n * Typed error classes for programmatic error handling.\n * Consumers can catch specific error types:\n *\n * ```typescript\n * try {\n * await subcortex.assertions.create(...)\n * } catch (e) {\n * if (e instanceof SubCortexNotFoundError) { ... }\n * if (e instanceof SubCortexRateLimitError) { await sleep(e.retryAfter) }\n * }\n * ```\n */\n\n/** Base error for all SubCortex SDK errors. */\nexport class SubCortexError extends Error {\n /** HTTP status code (0 for network errors) */\n readonly statusCode: number\n /** Server-assigned request ID for debugging */\n readonly requestId?: string\n /** Whether the request can be retried */\n readonly retryable: boolean\n /** Raw response body */\n readonly body?: string\n\n constructor(\n message: string,\n statusCode: number,\n options?: {\n requestId?: string\n retryable?: boolean\n body?: string\n }\n ) {\n super(message)\n this.name = 'SubCortexError'\n this.statusCode = statusCode\n this.requestId = options?.requestId\n this.retryable = options?.retryable ?? false\n this.body = options?.body\n }\n}\n\n/** 400 — Bad request, validation failure. */\nexport class SubCortexValidationError extends SubCortexError {\n /** Field-level validation errors if available */\n readonly details?: Record<string, string>\n\n constructor(\n message: string,\n options?: {\n requestId?: string\n body?: string\n details?: Record<string, string>\n }\n ) {\n super(message, 400, { ...options, retryable: false })\n this.name = 'SubCortexValidationError'\n this.details = options?.details\n }\n}\n\n/** 401 — Invalid or missing credentials. */\nexport class SubCortexAuthenticationError extends SubCortexError {\n constructor(message: string, options?: { requestId?: string; body?: string }) {\n super(message, 401, { ...options, retryable: false })\n this.name = 'SubCortexAuthenticationError'\n }\n}\n\n/** 403 — Valid credentials but insufficient permissions. */\nexport class SubCortexAuthorizationError extends SubCortexError {\n constructor(message: string, options?: { requestId?: string; body?: string }) {\n super(message, 403, { ...options, retryable: false })\n this.name = 'SubCortexAuthorizationError'\n }\n}\n\n/** 404 — Resource not found. */\nexport class SubCortexNotFoundError extends SubCortexError {\n constructor(message: string, options?: { requestId?: string; body?: string }) {\n super(message, 404, { ...options, retryable: false })\n this.name = 'SubCortexNotFoundError'\n }\n}\n\n/** 409 — Conflict (e.g., duplicate assertion). */\nexport class SubCortexConflictError extends SubCortexError {\n constructor(message: string, options?: { requestId?: string; body?: string }) {\n super(message, 409, { ...options, retryable: false })\n this.name = 'SubCortexConflictError'\n }\n}\n\n/** 429 — Rate limit exceeded. */\nexport class SubCortexRateLimitError extends SubCortexError {\n /** Seconds to wait before retrying */\n readonly retryAfter?: number\n\n constructor(\n message: string,\n options?: {\n requestId?: string\n body?: string\n retryAfter?: number\n }\n ) {\n super(message, 429, { ...options, retryable: true })\n this.name = 'SubCortexRateLimitError'\n this.retryAfter = options?.retryAfter\n }\n}\n\n/** 5xx — Server-side error. */\nexport class SubCortexServerError extends SubCortexError {\n constructor(\n message: string,\n statusCode: number,\n options?: { requestId?: string; body?: string }\n ) {\n super(message, statusCode, { ...options, retryable: true })\n this.name = 'SubCortexServerError'\n }\n}\n\n/** Network-level failure (DNS, timeout, connection refused). */\nexport class SubCortexNetworkError extends SubCortexError {\n readonly cause?: Error\n\n constructor(message: string, options?: { cause?: Error }) {\n super(message, 0, { retryable: true })\n this.name = 'SubCortexNetworkError'\n this.cause = options?.cause\n }\n}\n\n/** Timeout — request exceeded the configured timeout. */\nexport class SubCortexTimeoutError extends SubCortexNetworkError {\n constructor(timeoutMs: number) {\n super(`Request timed out after ${timeoutMs}ms`)\n this.name = 'SubCortexTimeoutError'\n }\n}\n\n\n/**\n * Structured error response from the SubCortex REST API.\n *\n * ```json\n * {\n * \"error\": {\n * \"code\": \"NOT_FOUND\",\n * \"message\": \"Assertion not found\",\n * \"details\": { ... }\n * }\n * }\n * ```\n */\ninterface SubCortexErrorResponse {\n error?: {\n code?: string\n message?: string\n details?: Record<string, unknown>\n }\n}\n\n/**\n * Classify an HTTP response into the appropriate error type.\n * Parses structured JSON error responses from the SubCortex API.\n * Falls back to raw body if not parseable.\n */\nexport function classifyError(\n statusCode: number,\n body: string,\n requestId?: string,\n retryAfterHint?: number\n): SubCortexError {\n // Try to parse structured error response\n let errorCode = ''\n let message = ''\n let details: Record<string, string> | undefined\n\n try {\n const parsed: SubCortexErrorResponse = JSON.parse(body)\n if (parsed.error) {\n errorCode = parsed.error.code || ''\n message = parsed.error.message || ''\n if (parsed.error.details) {\n details = parsed.error.details as Record<string, string>\n }\n }\n } catch {\n // Not JSON — use raw body as message\n }\n\n if (!message) {\n message = body || `HTTP ${statusCode}`\n }\n\n const opts = { requestId, body }\n\n switch (statusCode) {\n case 400:\n return new SubCortexValidationError(message, { ...opts, details })\n case 401:\n return new SubCortexAuthenticationError(message, opts)\n case 403:\n return new SubCortexAuthorizationError(message, opts)\n case 404:\n return new SubCortexNotFoundError(message, opts)\n case 409:\n return new SubCortexConflictError(message, opts)\n case 429: {\n let retryAfter: number | undefined = retryAfterHint\n if (retryAfter === undefined) {\n try {\n const parsed = JSON.parse(body)\n retryAfter = parsed.retryAfter ?? parsed.retry_after\n } catch {\n // ignore\n }\n }\n return new SubCortexRateLimitError(message, { ...opts, retryAfter })\n }\n default:\n if (statusCode >= 500) {\n return new SubCortexServerError(message, statusCode, opts)\n }\n return new SubCortexError(message, statusCode, opts)\n }\n}\n","/**\n * HTTP Transport Layer\n *\n * Handles fetch calls, auth headers, retry with backoff,\n * timeout, request IDs, and snake_case ↔ camelCase mapping.\n *\n * This module is internal — consumers use SubCortexClient, not HttpTransport.\n */\n\nimport {\n SubCortexNetworkError,\n SubCortexRateLimitError,\n SubCortexTimeoutError,\n classifyError,\n} from './errors'\n\n// ─── Configuration ──────────────────────────────────\n\nexport interface RetryConfig {\n maxRetries: number\n baseDelayMs: number\n maxDelayMs: number\n}\n\nexport interface HttpTransportOptions {\n baseUrl: string\n tenantId: string\n apiKey?: string\n token?: string\n retry: RetryConfig\n timeoutMs: number\n fetchImpl: typeof fetch\n headers: Record<string, string>\n signal?: AbortSignal\n}\n\n// ─── snake_case ↔ camelCase mapping ─────────────────\n\nfunction snakeToCamel(s: string): string {\n return s.replace(/_([a-z])/g, (_, c) => c.toUpperCase())\n}\n\nfunction camelToSnake(s: string): string {\n return s.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`)\n}\n\n/** Deep-map object keys from snake_case to camelCase */\nexport function mapKeys(obj: unknown, mapper: (s: string) => string): unknown {\n if (obj === null || obj === undefined) return obj\n if (Array.isArray(obj)) return obj.map((item) => mapKeys(item, mapper))\n if (typeof obj === 'object') {\n const mapped: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n mapped[mapper(key)] = mapKeys(value, mapper)\n }\n return mapped\n }\n return obj\n}\n\n/** Convert wire format (snake_case) to SDK format (camelCase) */\nexport function fromWire<T>(data: unknown): T {\n return mapKeys(data, snakeToCamel) as T\n}\n\n/** Convert SDK format (camelCase) to wire format (snake_case) */\nexport function toWire(data: unknown): unknown {\n return mapKeys(data, camelToSnake)\n}\n\n// ─── Request ID generation ──────────────────────────\n\nlet counter = 0\nfunction generateRequestId(): string {\n const ts = Date.now().toString(36)\n const seq = (counter++).toString(36)\n const rand = Math.random().toString(36).slice(2, 6)\n return `scx-${ts}-${seq}-${rand}`\n}\n\n// ─── Retry with exponential backoff + jitter ────────\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nfunction computeDelay(attempt: number, config: RetryConfig): number {\n const exponential = config.baseDelayMs * Math.pow(2, attempt)\n const capped = Math.min(exponential, config.maxDelayMs)\n // Full jitter: random between 50% and 150% of computed delay\n const jitter = capped * (0.5 + Math.random())\n return Math.round(jitter)\n}\n\nfunction isRetryable(status: number): boolean {\n return status === 429 || status >= 500\n}\n\n// ─── Transport ──────────────────────────────────────\n\nexport class HttpTransport {\n private readonly opts: HttpTransportOptions\n\n constructor(options: HttpTransportOptions) {\n this.opts = {\n ...options,\n baseUrl: options.baseUrl.replace(/\\/$/, ''),\n }\n }\n\n /** GET request with retry and typed response. */\n async get<T>(path: string, tenantId?: string): Promise<T> {\n return this.request<T>('GET', path, undefined, tenantId)\n }\n\n /** POST request with retry and typed response. */\n async post<T>(path: string, body: unknown, tenantId?: string): Promise<T> {\n return this.request<T>('POST', path, body, tenantId)\n }\n\n /** PUT request with retry and typed response. */\n async put<T>(path: string, body: unknown, tenantId?: string): Promise<T> {\n return this.request<T>('PUT', path, body, tenantId)\n }\n\n /** DELETE request with retry and typed response. */\n async delete<T>(path: string, tenantId?: string): Promise<T> {\n return this.request<T>('DELETE', path, undefined, tenantId)\n }\n\n /** Core request method with retry loop. */\n private async request<T>(\n method: string,\n path: string,\n body: unknown,\n tenantIdOverride?: string\n ): Promise<T> {\n const url = `${this.opts.baseUrl}${path}`\n const requestId = generateRequestId()\n const tenantId = tenantIdOverride || this.opts.tenantId\n\n const headers: Record<string, string> = {\n Accept: 'application/json',\n 'X-Request-ID': requestId,\n 'X-Tenant-ID': tenantId,\n ...this.opts.headers,\n }\n\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json'\n }\n\n // Auth header\n if (this.opts.apiKey) {\n headers['Authorization'] = `Bearer ${this.opts.apiKey}`\n } else if (this.opts.token) {\n headers['Authorization'] = `Bearer ${this.opts.token}`\n }\n\n const fetchOpts: RequestInit = {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n }\n\n let lastError: Error | undefined\n\n for (let attempt = 0; attempt <= this.opts.retry.maxRetries; attempt++) {\n try {\n const response = await this.fetchWithTimeout(url, fetchOpts)\n\n if (response.ok) {\n const text = await response.text()\n if (!text) return undefined as T\n const parsed = JSON.parse(text)\n return fromWire<T>(parsed)\n }\n\n // Non-OK response\n const responseBody = await response.text()\n\n // Rate limit: respect Retry-After header\n if (response.status === 429) {\n const retryAfterRaw = response.headers.get('Retry-After')\n const retryAfterSecs = retryAfterRaw ? parseInt(retryAfterRaw, 10) : 0\n if (attempt < this.opts.retry.maxRetries) {\n const delay = retryAfterSecs > 0\n ? retryAfterSecs * 1000\n : computeDelay(attempt, this.opts.retry)\n await sleep(delay)\n lastError = classifyError(response.status, responseBody, requestId, retryAfterSecs || undefined)\n continue\n }\n // Exhausted retries on 429 — throw with retryAfter from header\n throw classifyError(response.status, responseBody, requestId, retryAfterSecs || undefined)\n }\n\n // Retryable server error\n if (isRetryable(response.status) && attempt < this.opts.retry.maxRetries) {\n lastError = classifyError(response.status, responseBody, requestId)\n await sleep(computeDelay(attempt, this.opts.retry))\n continue\n }\n\n // Non-retryable or exhausted retries — throw classified error\n throw classifyError(response.status, responseBody, requestId)\n } catch (error) {\n // Already a SubCortexError — rethrow if non-retryable or out of retries\n if (error instanceof Error && error.name.startsWith('SubCortex')) {\n if (\n !(error as { retryable?: boolean }).retryable ||\n attempt >= this.opts.retry.maxRetries\n ) {\n throw error\n }\n lastError = error\n await sleep(computeDelay(attempt, this.opts.retry))\n continue\n }\n\n // Network-level failure (DNS, connection refused, etc.)\n if (error instanceof TypeError || error instanceof DOMException) {\n lastError = new SubCortexNetworkError(\n `Network error: ${(error as Error).message}`,\n { cause: error as Error }\n )\n if (attempt < this.opts.retry.maxRetries) {\n await sleep(computeDelay(attempt, this.opts.retry))\n continue\n }\n throw lastError\n }\n\n // Unknown error\n throw error\n }\n }\n\n // Should not reach here, but safety net\n throw lastError || new SubCortexNetworkError('Request failed after all retries')\n }\n\n /** Fetch with AbortController timeout. */\n private async fetchWithTimeout(\n url: string,\n init: RequestInit\n ): Promise<Response> {\n const controller = new AbortController()\n const timeoutId = setTimeout(\n () => controller.abort(),\n this.opts.timeoutMs\n )\n\n // Compose with user-provided signal\n if (this.opts.signal) {\n this.opts.signal.addEventListener('abort', () => controller.abort())\n }\n\n try {\n return await this.opts.fetchImpl(url, {\n ...init,\n signal: controller.signal,\n })\n } catch (error) {\n if (\n error instanceof DOMException &&\n error.name === 'AbortError' &&\n !this.opts.signal?.aborted\n ) {\n throw new SubCortexTimeoutError(this.opts.timeoutMs)\n }\n throw error\n } finally {\n clearTimeout(timeoutId)\n }\n }\n}\n","/**\n * SubCortex Built-in Schema\n *\n * These are the foundational types, predicates, relationship types,\n * and confidence levels that SubCortex supports natively. They are\n * NOT exhaustive — tenants can extend them. But these cover the\n * universal patterns every agent-user interaction needs.\n *\n * Consumer systems import these instead of using raw strings.\n */\n\n// ─── Subject Prefixes ───────────────────────────────\n\n/**\n * Well-known subject prefixes. SubCortex recognizes these and\n * provides specialized behavior for each.\n */\nexport enum SubjectPrefix {\n /** The authenticated user interacting with the agent */\n USER = 'user',\n /** A person mentioned by the user (not the user themselves) */\n PERSON = 'person',\n /** A job role or position */\n ROLE = 'role',\n /** A business entity / data model (e.g., Project, Invoice) */\n ENTITY = 'entity',\n /** A property/field on an entity */\n PROPERTY = 'property',\n /** A project, initiative, or ongoing effort */\n PROJECT = 'project',\n /** An event, meeting, or milestone */\n EVENT = 'event',\n /** An agent using SubCortex */\n AGENT = 'agent',\n}\n\n/**\n * Build a subject string from a prefix and identifier.\n * Normalizes the identifier to lowercase with hyphens.\n */\n/**\n * Common abbreviation expansions for role/title normalization.\n * Ensures \"VP of Engineering\" and \"Vice President of Engineering\"\n * resolve to the same subject.\n */\nconst TITLE_NORMALIZATIONS: [RegExp, string][] = [\n [/\\bvp\\b/gi, 'Vice President'],\n [/\\bsvp\\b/gi, 'Senior Vice President'],\n [/\\bevp\\b/gi, 'Executive Vice President'],\n [/\\bcto\\b/gi, 'Chief Technology Officer'],\n [/\\bceo\\b/gi, 'Chief Executive Officer'],\n [/\\bcfo\\b/gi, 'Chief Financial Officer'],\n [/\\bcoo\\b/gi, 'Chief Operating Officer'],\n [/\\bcmo\\b/gi, 'Chief Marketing Officer'],\n [/\\bcpo\\b/gi, 'Chief Product Officer'],\n [/\\bcio\\b/gi, 'Chief Information Officer'],\n [/\\bea\\b/gi, 'Executive Assistant'],\n [/\\bpm\\b/gi, 'Project Manager'],\n [/\\bdir\\b/gi, 'Director'],\n [/\\bsr\\b/gi, 'Senior'],\n [/\\bjr\\b/gi, 'Junior'],\n]\n\nexport function subject(prefix: SubjectPrefix | string, identifier: string): string {\n let expanded = identifier\n // Normalize titles/roles to prevent duplicate subjects from abbreviations\n if (prefix === SubjectPrefix.ROLE || prefix === 'role') {\n for (const [pattern, replacement] of TITLE_NORMALIZATIONS) {\n expanded = expanded.replace(pattern, replacement)\n }\n }\n const normalized = expanded.toLowerCase().replace(/\\s+/g, '-')\n return `${prefix}:${normalized}`\n}\n\n// ─── Predicates ─────────────────────────────────────\n\n/**\n * Built-in predicates for user/person identity and profile.\n */\nexport enum IdentityPredicate {\n NAME = 'name',\n FULL_NAME = 'full_name',\n ROLE = 'role',\n TITLE = 'title',\n DEPARTMENT = 'department',\n TEAM = 'team',\n START_DATE = 'start_date',\n EMAIL = 'email',\n}\n\n/**\n * Built-in predicates for work context.\n * NOTE: Org relationships (reports_to, manages, etc.) are NOT predicates.\n * They are relationship types — connections between two subjects.\n * See OrgRelationship enum.\n */\nexport enum WorkPredicate {\n EXPERTISE = 'expertise',\n CURRENT_PROJECT = 'current_project',\n PAIN_POINT = 'pain_point',\n}\n\n/**\n * Built-in predicates for events and status tracking.\n */\nexport enum EventPredicate {\n STATUS = 'status',\n STATUS_CHANGE = 'status_change',\n EVENT = 'event',\n DECISION = 'decision',\n OUTCOME = 'outcome',\n}\n\n/**\n * Built-in predicates for emotional/rapport tracking.\n */\nexport enum RapportPredicate {\n SENTIMENT = 'sentiment',\n FRUSTRATION = 'frustration',\n EXCITEMENT = 'excitement',\n CONCERN = 'concern',\n GOAL = 'goal',\n ASPIRATION = 'aspiration',\n PREFERENCE = 'preference',\n PAIN_POINT = 'pain_point',\n INTEREST = 'interest',\n COMMUNICATION_STYLE = 'communication_style',\n}\n\n/**\n * Built-in predicates for agent memory management.\n */\nexport enum MemoryPredicate {\n REMINDER = 'reminder',\n CONTEXT = 'context',\n CONTEXT_TASK = 'context:task',\n CURRENT_PROJECT = 'current_project',\n}\n\n/**\n * Built-in predicates for entity/schema definition.\n */\nexport enum EntityPredicate {\n TYPE = 'type',\n DESCRIPTION = 'description',\n FIELD_TYPE = 'field_type',\n REQUIRED = 'required',\n WORKFLOW = 'workflow',\n}\n\n/**\n * All built-in predicates combined.\n * Consumer systems should use these instead of raw strings.\n */\nexport const Predicates = {\n ...IdentityPredicate,\n ...WorkPredicate,\n ...EventPredicate,\n ...RapportPredicate,\n ...MemoryPredicate,\n ...EntityPredicate,\n} as const\n\n// ─── Relationship Types ─────────────────────────────\n\n/**\n * Built-in relationship types for organizational structure.\n *\n * Each relationship is directional. Many have a natural reverse:\n * reports_to ↔ manages\n * mentored_by ↔ mentors\n * member_of ↔ has_member\n */\nexport enum OrgRelationship {\n /** Person reports to user/manager */\n REPORTS_TO = 'reports_to',\n /** User/manager manages person */\n MANAGES = 'manages',\n /** Person is member of team/project */\n MEMBER_OF = 'member_of',\n /** Team/project has this person as member */\n HAS_MEMBER = 'has_member',\n /** Person holds a specific role */\n HOLDS_ROLE = 'holds_role',\n /** Person is a candidate for a role */\n CANDIDATE_FOR = 'candidate_for',\n /** Person collaborates with another person */\n COLLABORATES_WITH = 'collaborates_with',\n /** Person mentors another person */\n MENTORS = 'mentors',\n /** Person is mentored by another person */\n MENTORED_BY = 'mentored_by',\n /** Person is a stakeholder in something */\n STAKEHOLDER_IN = 'stakeholder_in',\n}\n\n/**\n * Built-in relationship types for entity/schema structure.\n */\nexport enum EntityRelationship {\n HAS_PROPERTY = 'has_property',\n BELONGS_TO = 'belongs_to',\n HAS_MANY = 'has_many',\n MANY_TO_MANY = 'many_to_many',\n DEPENDS_ON = 'depends_on',\n}\n\n/**\n * All built-in relationship types combined.\n */\nexport const RelationshipTypes = {\n ...OrgRelationship,\n ...EntityRelationship,\n} as const\n\n// ─── Confidence ─────────────────────────────────────\n\n/**\n * Standard confidence levels with numeric values.\n * The agent chooses the level; SubCortex maps to the score.\n */\nexport enum ConfidenceLevel {\n /** User stated it directly: \"My name is Alice\" */\n CONFIRMED = 'confirmed',\n /** Strongly implied: \"I've been managing the team\" → manager */\n HIGH = 'high',\n /** Reasonable inference from context */\n MODERATE = 'moderate',\n /** Speculative — worth checking later */\n LOW = 'low',\n}\n\n/** Map confidence levels to numeric scores */\nexport const ConfidenceScores: Record<ConfidenceLevel, number> = {\n [ConfidenceLevel.CONFIRMED]: 0.99,\n [ConfidenceLevel.HIGH]: 0.85,\n [ConfidenceLevel.MODERATE]: 0.65,\n [ConfidenceLevel.LOW]: 0.40,\n}\n\n/** Convert a confidence level label to a numeric score */\nexport function confidenceToScore(level: ConfidenceLevel | string): number {\n return ConfidenceScores[level as ConfidenceLevel] ?? 0.70\n}\n\n/** Convert a numeric score to the closest confidence level */\nexport function scoreToConfidence(score: number): ConfidenceLevel {\n if (score >= 0.95) return ConfidenceLevel.CONFIRMED\n if (score >= 0.80) return ConfidenceLevel.HIGH\n if (score >= 0.60) return ConfidenceLevel.MODERATE\n return ConfidenceLevel.LOW\n}\n\n// ─── Predicate Metadata ─────────────────────────────\n\n/**\n * Whether a predicate supports multiple values on the same subject.\n * Multi-value predicates don't trigger conflict detection in the Thalamus.\n */\n/**\n * Predicates that can have multiple values on the same subject.\n * These don't trigger conflict detection in the Thalamus.\n */\nexport const MULTI_VALUE_PREDICATES = new Set<string>([\n // Events — multiple things happen over time\n EventPredicate.STATUS_CHANGE,\n EventPredicate.EVENT,\n EventPredicate.DECISION,\n EventPredicate.OUTCOME,\n // Emotional — multiple sentiments about different things\n RapportPredicate.SENTIMENT,\n RapportPredicate.FRUSTRATION,\n RapportPredicate.EXCITEMENT,\n RapportPredicate.CONCERN,\n RapportPredicate.GOAL,\n RapportPredicate.INTEREST,\n // Memory — multiple reminders, contexts, projects\n MemoryPredicate.REMINDER,\n MemoryPredicate.CONTEXT_TASK,\n WorkPredicate.CURRENT_PROJECT,\n // Timeline\n 'timeline',\n])\n\n/**\n * Map from relationship type to its reverse.\n * Used by brain.users.registerPerson() to create bidirectional edges.\n */\nexport const REVERSE_RELATIONSHIPS: Record<string, string> = {\n // Proper OrgRelationship values\n [OrgRelationship.REPORTS_TO]: OrgRelationship.MANAGES,\n [OrgRelationship.MANAGES]: OrgRelationship.REPORTS_TO,\n [OrgRelationship.MEMBER_OF]: OrgRelationship.HAS_MEMBER,\n [OrgRelationship.HAS_MEMBER]: OrgRelationship.MEMBER_OF,\n [OrgRelationship.MENTORS]: OrgRelationship.MENTORED_BY,\n [OrgRelationship.MENTORED_BY]: OrgRelationship.MENTORS,\n [OrgRelationship.COLLABORATES_WITH]: OrgRelationship.COLLABORATES_WITH,\n [OrgRelationship.CANDIDATE_FOR]: OrgRelationship.CANDIDATE_FOR,\n [OrgRelationship.STAKEHOLDER_IN]: OrgRelationship.STAKEHOLDER_IN,\n // Agent-facing predicate names → proper relationship types\n // The model sends 'direct_report' as predicate, SDK maps to proper relationships\n 'direct_report': OrgRelationship.REPORTS_TO,\n 'team_member': OrgRelationship.MEMBER_OF,\n 'candidate': OrgRelationship.CANDIDATE_FOR,\n 'manager': OrgRelationship.MANAGES,\n 'stakeholder': OrgRelationship.STAKEHOLDER_IN,\n 'collaborator': OrgRelationship.COLLABORATES_WITH,\n 'mentor': OrgRelationship.MENTORED_BY,\n}\n\n/**\n * Agent-facing labels for relationship types.\n * Used in tool descriptions so the model knows what's available.\n */\nexport const RELATIONSHIP_LABELS: Record<string, string> = {\n [OrgRelationship.REPORTS_TO]: 'reports to (person is a direct report)',\n [OrgRelationship.MANAGES]: 'manages (user is the manager)',\n [OrgRelationship.MEMBER_OF]: 'is a member of (team, project)',\n [OrgRelationship.HOLDS_ROLE]: 'holds a role/position',\n [OrgRelationship.CANDIDATE_FOR]: 'is a candidate for a role',\n [OrgRelationship.COLLABORATES_WITH]: 'collaborates with',\n [OrgRelationship.MENTORS]: 'mentors',\n [OrgRelationship.STAKEHOLDER_IN]: 'is a stakeholder in',\n}\n","/**\n * SubCortex Signal Types\n *\n * Signals represent emotional and rapport-related data that attach to\n * the knowledge they relate to. Unlike assertions, signals:\n * - Compound (never conflict)\n * - Decay over time (exponential, configurable half-life)\n * - Have trajectory (warming/cooling/stable/neutral)\n * - Can be resolved by interaction (not just time)\n *\n * Storage: Signals are assertions with `signal:{type}` predicates.\n * The consumer-facing API treats them as a separate entity.\n */\n\n// ─── Signal Types (Gated + Custom) ────────────────────\n\n/**\n * SYSTEM signal types — available for all tenants.\n * Tenant-specific types use `custom:{tenant}:{type}` convention.\n */\nexport const SYSTEM_SIGNAL_TYPES = [\n 'frustration',\n 'excitement',\n 'concern',\n 'satisfaction',\n 'confusion',\n 'gratitude',\n 'tension',\n 'sentiment',\n] as const\n\nexport type SystemSignalType = typeof SYSTEM_SIGNAL_TYPES[number]\n\n/** Any valid signal type — system or custom */\nexport type SignalType = SystemSignalType | `custom:${string}`\n\nexport function isValidSignalType(type: string): type is SignalType {\n if (SYSTEM_SIGNAL_TYPES.includes(type as SystemSignalType)) return true\n if (type.startsWith('custom:')) return true\n return false\n}\n\n// ─── Decay Configuration ──────────────────────────────\n\n/**\n * Per-type decay half-life in hours.\n * All start at 24h — structure supports per-type tuning.\n */\nexport const SIGNAL_DECAY_CONFIG: Record<string, number> = {\n frustration: 24,\n excitement: 24,\n concern: 24,\n satisfaction: 24,\n confusion: 24,\n gratitude: 24,\n tension: 24,\n sentiment: 24,\n _default: 24,\n}\n\nexport function getDecayHalfLife(signalType: string): number {\n return SIGNAL_DECAY_CONFIG[signalType] ?? SIGNAL_DECAY_CONFIG._default\n}\n\n// ─── Trajectory ───────────────────────────────────────\n\nexport type Trajectory = 'warming' | 'cooling' | 'stable' | 'neutral'\n\n// ─── Signal Entry ─────────────────────────────────────\n\n/** A single recorded signal */\nexport interface SignalEntry {\n /** Assertion ID backing this signal */\n id: string\n /** Signal type (e.g., 'frustration', 'excitement') */\n type: string\n /** Human-readable content */\n content: string\n /** Raw recorded intensity (0-1) */\n intensity: number\n /** Time-decayed intensity */\n decayedIntensity: number\n /** Age in hours since recorded */\n ageHours: number\n /** Subject this signal is about (e.g., 'context:hiring', 'person:sarah') */\n aboutSubject?: string\n /** If this signal was resolved by another signal */\n resolvedBy?: string\n /** ISO timestamp when recorded */\n timestamp: string\n}\n\n/** Aggregated snapshot of all signals for a subject */\nexport interface SignalSnapshot {\n /** All signal entries within the query window */\n signals: SignalEntry[]\n /** Overall rapport trajectory */\n trajectory: Trajectory\n /** Aggregate intensity across all active signals */\n aggregateIntensity: number\n}\n\n// ─── Signal Resolution Sets ──────────────────────────\n\n/**\n * Signal types that indicate a positive emotional shift.\n * When recorded with `resolveConflicting: true`, these automatically\n * resolve recent negative signals on the same subject.\n */\nexport const POSITIVE_SIGNALS = new Set<string>([\n 'satisfaction',\n 'excitement',\n 'gratitude',\n])\n\n/**\n * Signal types that indicate a negative emotional state.\n * These are candidates for resolution by a subsequent positive signal.\n */\nexport const NEGATIVE_SIGNALS = new Set<string>([\n 'frustration',\n 'concern',\n 'tension',\n 'confusion',\n])\n\n// ─── Input/Output Types ───────────────────────────────\n\nexport interface RecordSignalInput {\n /** User ID the signal is about */\n userId: string\n /** Signal type */\n type: SignalType\n /** Human-readable description */\n content: string\n /** Intensity 0-1 (default: 0.7) */\n intensity?: number\n /** Subject this signal relates to (e.g., a project, person, topic) */\n aboutSubject?: string\n /** Session ID for contextual binding */\n sessionId?: string\n /**\n * When true and the signal type is a positive signal (satisfaction, excitement, gratitude),\n * automatically resolves recent negative signals on the same subject within the last 72 hours.\n * Resolved signals decay 4x faster. Default: false.\n */\n resolveConflicting?: boolean\n}\n\nexport interface SignalQueryOptions {\n /** Window in hours to look back (default: 72) */\n windowHours?: number\n /** Filter to specific signal type */\n type?: string\n}\n\nexport interface ResolveSignalInput {\n /** ID of the signal being resolved */\n signalId: string\n /** ID of the signal that resolves it */\n resolvedBySignalId: string\n}\n","/**\n * SubCortex Signals Namespace\n *\n * Records and queries emotional/rapport signals. Signals attach to\n * the knowledge they relate to and provide temporal decay + trajectory.\n *\n * Signals are stored as assertions with `signal:{type}` predicates.\n * The consumer sees them as a separate entity via this namespace.\n */\n\nimport type { HttpTransport } from './http'\nimport type { Assertion } from './client'\nimport type {\n SignalEntry,\n SignalSnapshot,\n RecordSignalInput,\n SignalQueryOptions,\n ResolveSignalInput,\n Trajectory,\n} from './types/signals'\nimport {\n isValidSignalType,\n getDecayHalfLife,\n SYSTEM_SIGNAL_TYPES,\n POSITIVE_SIGNALS,\n NEGATIVE_SIGNALS,\n} from './types/signals'\nimport { SubjectPrefix, subject } from './types/schema'\n\n/** Shape returned by the engine's GET /api/v1/signals/:tenant/:subject */\ninterface EngineSignalQueryResponse {\n signals: Array<{\n assertion_id: string\n signal_type: string\n content: string\n intensity: number\n decayed_intensity: number\n age_hours: number\n about_subject: string | null\n resolved_by: string | null\n timestamp: string\n }>\n trajectory: string\n aggregate_intensity: number\n}\n\n/** Predicates from legacy rapport recording (pre-signal: namespace) */\nconst LEGACY_SIGNAL_PREDICATES = new Set([\n 'sentiment', 'frustration', 'excitement', 'concern',\n 'goal', 'aspiration', 'preference', 'interest',\n])\n\nexport class SignalsNamespace {\n constructor(\n private http: HttpTransport,\n private tenantId: string\n ) {}\n\n /**\n * Record an emotional signal about a user.\n *\n * @example\n * ```typescript\n * await brain.signals.record({\n * userId: 'cmk123',\n * type: 'frustration',\n * content: 'Frustrated about the hiring timeline',\n * intensity: 0.85,\n * aboutSubject: 'context:hiring-ea',\n * })\n * ```\n */\n async record(input: RecordSignalInput): Promise<{ id: string; resolved?: number }> {\n if (!isValidSignalType(input.type)) {\n throw new Error(`Invalid signal type: ${input.type}. Use one of: ${SYSTEM_SIGNAL_TYPES.join(', ')} or custom:{tenant}:{type}`)\n }\n\n const userSubject = subject(SubjectPrefix.USER, input.userId)\n const predicate = `signal:${input.type}`\n const value = {\n content: input.content,\n intensity: input.intensity ?? 0.7,\n about_subject: input.aboutSubject || null,\n session_id: input.sessionId || null,\n }\n\n const result = await this.http.post<Assertion>('/api/v1/assertions', {\n tenant_id: this.tenantId,\n subject: userSubject,\n predicate,\n value,\n confidence: input.intensity ?? 0.7,\n })\n\n // Auto-resolve negative signals when a positive signal is recorded\n let resolved = 0\n if (input.resolveConflicting && POSITIVE_SIGNALS.has(input.type)) {\n try {\n const snapshot = await this.query(userSubject, { windowHours: 72 })\n for (const sig of snapshot.signals) {\n if (!NEGATIVE_SIGNALS.has(sig.type)) continue\n if (sig.resolvedBy) continue\n const sameContext = input.aboutSubject\n ? sig.aboutSubject === input.aboutSubject\n : !sig.aboutSubject\n if (sameContext) {\n await this.resolve({ signalId: sig.id, resolvedBySignalId: result.id })\n resolved++\n }\n }\n } catch {\n // Non-critical — signal was recorded successfully\n }\n }\n\n return { id: result.id, ...(resolved > 0 && { resolved }) }\n }\n\n /**\n * Query signals for a user with computed decay and trajectory.\n * Delegates to the engine's signal query endpoint for server-side computation.\n *\n * @example\n * ```typescript\n * const snapshot = await brain.signals.query('user:cmk123', {\n * windowHours: 72,\n * type: 'frustration',\n * })\n * ```\n */\n async query(userSubject: string, options: SignalQueryOptions = {}): Promise<SignalSnapshot> {\n const windowHours = options.windowHours ?? 72\n\n const query: Record<string, string> = { window: String(windowHours) }\n if (options.type) query.type = options.type\n\n const qs = new URLSearchParams(query).toString()\n const response = await this.http.get<EngineSignalQueryResponse>(\n `/api/v1/signals/${enc(this.tenantId)}/${enc(userSubject)}?${qs}`\n )\n\n const signals: SignalEntry[] = response.signals.map(s => ({\n id: s.assertion_id,\n type: s.signal_type,\n content: s.content,\n intensity: s.intensity,\n decayedIntensity: s.decayed_intensity,\n ageHours: Math.round(s.age_hours * 10) / 10,\n aboutSubject: s.about_subject || undefined,\n resolvedBy: s.resolved_by || undefined,\n timestamp: s.timestamp,\n }))\n\n return {\n signals,\n trajectory: response.trajectory as Trajectory,\n aggregateIntensity: response.aggregate_intensity,\n }\n }\n\n /**\n * Resolve a signal — mark it as resolved by a subsequent positive interaction.\n * The resolved signal's effective intensity drops faster.\n *\n * @example\n * ```typescript\n * await brain.signals.resolve({\n * signalId: 'abc123',\n * resolvedBySignalId: 'def456',\n * })\n * ```\n */\n async resolve(input: ResolveSignalInput): Promise<{ success: boolean }> {\n // Supersede the original assertion with an updated value that includes resolved_by\n const original = await this.http.get<Assertion>(\n `/api/v1/assertions/${enc(this.tenantId)}/${enc(input.signalId)}`\n ).catch(() => null)\n\n if (!original) return { success: false }\n\n const value = typeof original.value === 'object' && original.value !== null\n ? { ...(original.value as Record<string, unknown>), resolved_by: input.resolvedBySignalId }\n : { content: String(original.value), resolved_by: input.resolvedBySignalId }\n\n await this.http.post('/api/v1/assertions/supersede', {\n tenant_id: this.tenantId,\n original_assertion_id: input.signalId,\n subject: original.subject,\n predicate: original.predicate,\n value,\n confidence: original.confidence,\n })\n\n return { success: true }\n }\n}\n\n// ─── Pure Computation Functions ───────────────────────\n// @internal — computeDecay is still needed by extractSignals() for users.identify(),\n// which builds signal entries from raw assertions. Trajectory computation has been\n// moved to the engine (SignalIndex::compute_trajectory in cortex-storage).\n\n/**\n * Exponential decay: intensity × 2^(-age / halfLife)\n * Resolved signals decay 4x faster.\n */\nexport function computeDecay(\n intensity: number,\n ageHours: number,\n halfLifeHours: number,\n isResolved: boolean = false\n): number {\n const effectiveHalfLife = isResolved ? halfLifeHours / 4 : halfLifeHours\n const decayed = intensity * Math.pow(2, -ageHours / effectiveHalfLife)\n return Math.round(decayed * 100) / 100\n}\n\n// ─── Helpers ──────────────────────────────────────────\n\n/**\n * Extract signal entries from a list of assertions.\n * Used by users.identify() to populate the signals field.\n */\nexport function extractSignals(\n assertions: Assertion[],\n windowHours: number = 72\n): SignalEntry[] {\n const now = Date.now()\n const windowMs = windowHours * 60 * 60 * 1000\n const entries: SignalEntry[] = []\n\n for (const a of assertions) {\n if (a.isSuperseded) continue\n const isSignal = a.predicate.startsWith('signal:')\n const isLegacy = LEGACY_SIGNAL_PREDICATES.has(a.predicate)\n if (!isSignal && !isLegacy) continue\n\n const timestamp = a.validFrom\n const ageMs = now - new Date(timestamp).getTime()\n if (ageMs > windowMs) continue\n\n const ageHours = ageMs / (60 * 60 * 1000)\n const type = isSignal ? a.predicate.slice(7) : a.predicate\n const halfLife = getDecayHalfLife(type)\n\n let content = ''\n let intensity = a.confidence ?? 0.7\n let aboutSubject: string | undefined\n let resolvedBy: string | undefined\n\n if (typeof a.value === 'object' && a.value !== null) {\n const v = a.value as Record<string, unknown>\n content = (v.content as string) || ''\n intensity = (v.intensity as number) ?? intensity\n aboutSubject = (v.about_subject as string) || undefined\n resolvedBy = (v.resolved_by as string) || undefined\n } else {\n content = String(a.value)\n }\n\n entries.push({\n id: a.id,\n type,\n content,\n intensity,\n decayedIntensity: computeDecay(intensity, ageHours, halfLife, !!resolvedBy),\n ageHours: Math.round(ageHours * 10) / 10,\n aboutSubject,\n resolvedBy,\n timestamp,\n })\n }\n\n entries.sort((a, b) => a.ageHours - b.ageHours)\n return entries\n}\n\nfunction enc(s: string): string {\n return encodeURIComponent(s)\n}\n","/**\n * SubCortex Users Namespace\n *\n * High-level operations for user rapport building.\n * This is where orchestration logic lives — NOT in the consumer's proxy.\n *\n * The consumer agent calls brain.users.identify() and gets back\n * a complete picture. One call, one round-trip, full context.\n */\n\nimport type { HttpTransport } from './http'\nimport type { Assertion } from './client'\nimport type {\n IdentifyUserInput,\n UserIdentification,\n UserMemory,\n ConnectedPerson,\n ConflictItem,\n RegisterPersonInput,\n RegisterPersonResult,\n RecordRapportInput,\n} from './types/users'\nimport {\n SubjectPrefix,\n subject,\n confidenceToScore,\n ConfidenceLevel,\n REVERSE_RELATIONSHIPS,\n OrgRelationship,\n} from './types/schema'\nimport type { Trajectory } from './types/signals'\nimport { extractSignals } from './signals'\n\nexport class UsersNamespace {\n constructor(\n private http: HttpTransport,\n private tenantId: string\n ) {}\n\n /**\n * Identify a user and retrieve their full context.\n *\n * This is the FIRST thing an agent should call at session start.\n * Returns whether the user is known, their memories, connected\n * people, reminders, conflicts, and a summary.\n *\n * @example\n * ```typescript\n * const user = await brain.users.identify({\n * userId: 'cmk123...',\n * displayName: 'Tom Santos',\n * })\n *\n * if (!user.isKnown) {\n * // First encounter — get to know them\n * } else {\n * // Returning user — reference what you know\n * // user.reminders — bring these up\n * // user.conflicts — address these\n * // user.connectedPeople — context about their org\n * }\n * ```\n */\n async identify(input: IdentifyUserInput): Promise<UserIdentification> {\n const userSubject = subject(SubjectPrefix.USER, input.userId)\n\n // 1. Get all assertions about this user\n const assertions = await this.http.get<Assertion[]>(\n `/api/v1/assertions/query/${enc(this.tenantId)}/${enc(userSubject)}`\n )\n\n const active = assertions.filter(a => !a.isSuperseded)\n const isKnown = active.length > 0\n\n // 2. Seed display name if first encounter\n if (input.displayName && !active.some(a => a.predicate === 'name' || a.predicate === 'full_name')) {\n try {\n await this.http.post('/api/v1/assertions', {\n tenant_id: this.tenantId,\n subject: userSubject,\n predicate: 'name',\n value: input.displayName,\n confidence: 1.0,\n })\n } catch { /* best-effort */ }\n }\n\n // 3. Get user's name\n const nameAssertion = active.find(a => a.predicate === 'name' || a.predicate === 'full_name')\n const name = (nameAssertion?.value as string) || input.displayName || null\n\n // 4. Categorize assertions\n const reminders: UserMemory[] = active\n .filter(a => a.predicate === 'reminder')\n .map(a => ({ id: a.id, predicate: a.predicate, value: a.value, confidence: a.confidence, createdAt: a.validFrom }))\n\n // Auto-dismiss reminders after returning them.\n // Once surfaced, they shouldn't repeat. If the user wants to\n // keep a reminder alive, they'll say so and the agent will recreate it.\n for (const reminder of reminders) {\n try {\n await this.http.post(\n `/api/v1/assertions/retract/${enc(this.tenantId)}/${enc(reminder.id)}`,\n {}\n )\n } catch { /* best-effort — don't block recall if retract fails */ }\n }\n\n const contexts: UserMemory[] = active\n .filter(a => a.predicate === 'context' || a.predicate === 'context:task')\n .map(a => ({ id: a.id, predicate: a.predicate, value: a.value, confidence: a.confidence, createdAt: a.validFrom }))\n\n // 5a. Extract signals (signal:* predicates + legacy rapport predicates)\n const signals = extractSignals(assertions)\n const signalIds = new Set(signals.map(s => s.id))\n\n // Get trajectory from the engine (server-side computation)\n let rapportTrajectory: Trajectory = 'neutral'\n try {\n const qs = new URLSearchParams({ window: '72' }).toString()\n const snapshot = await this.http.get<{ trajectory: Trajectory }>(\n `/api/v1/signals/${enc(this.tenantId)}/${enc(userSubject)}?${qs}`\n )\n rapportTrajectory = snapshot.trajectory\n } catch { /* Non-critical — default to neutral */ }\n\n const memories: UserMemory[] = active\n .filter(a =>\n a.predicate !== 'reminder' &&\n a.predicate !== 'context' &&\n a.predicate !== 'context:task' &&\n !signalIds.has(a.id) // exclude signals from memories\n )\n .map(a => ({ id: a.id, predicate: a.predicate, value: a.value, confidence: a.confidence, createdAt: a.validFrom }))\n\n // 5. Traverse relationships to find connected people\n const connectedPeople: ConnectedPerson[] = []\n try {\n const relationships = await this.http.get<Array<{\n fromSubject: string; toSubject: string; relationshipType: string\n }>>(`/api/v1/relationships/${enc(this.tenantId)}/${enc(userSubject)}`)\n\n const visited = new Set<string>()\n for (const rel of relationships) {\n const other = rel.fromSubject === userSubject ? rel.toSubject : rel.fromSubject\n if (!other || other === userSubject || visited.has(other)) continue\n visited.add(other)\n\n const personAssertions = await this.http.get<Assertion[]>(\n `/api/v1/assertions/query/${enc(this.tenantId)}/${enc(other)}`\n )\n const personActive = personAssertions.filter(a => !a.isSuperseded)\n const personName = personActive.find(a => a.predicate === 'name')\n const facts = personActive\n .filter(a => a.predicate !== 'name')\n .map(a => ({ predicate: a.predicate, value: a.value }))\n\n connectedPeople.push({\n subject: other,\n name: (personName?.value as string) || other,\n relationship: rel.relationshipType,\n facts,\n })\n }\n } catch { /* non-critical */ }\n\n // 6. Check Thalamus queue for conflicts relevant to THIS user\n const conflicts: ConflictItem[] = []\n try {\n if (!input.agentId) throw new Error('agentId is required on IdentifyUserInput to fetch conflicts')\n const pending = await this.http.get<Array<{\n id: string; surfacingHint: string; acknowledged: boolean; status: string;\n persistedAssertionIds?: string[]; conflictingAssertionId?: string\n }>>(`/api/v1/intake/pending/${enc(input.agentId)}?status=conflict_detected`)\n\n for (const item of pending) {\n if (item.acknowledged) continue\n\n // Only surface conflicts that mention this user's subject\n const hint = item.surfacingHint || ''\n const involvesUser = hint.includes(userSubject)\n || (item.persistedAssertionIds || []).some(id => {\n // Check if any persisted assertion is about this user\n const a = assertions.find(a2 => a2.id === id)\n return a?.subject === userSubject\n })\n\n if (!involvesUser) continue\n\n let resolvedHint = hint || 'A conflict was detected.'\n if (name) {\n resolvedHint = resolvedHint.replace(\n new RegExp(userSubject.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'g'),\n name\n )\n }\n conflicts.push({ id: item.id, hint: resolvedHint })\n }\n } catch { /* non-critical */ }\n\n // 7. Build summary\n const parts: string[] = []\n if (conflicts.length > 0) {\n parts.push(`ATTENTION: ${conflicts.length} knowledge conflict(s) — MUST address: ${conflicts.map(c => c.hint).join(' | ')}`)\n }\n if (reminders.length > 0) {\n parts.push(`REMINDERS (${reminders.length}): ${reminders.map(r => `\"${r.value}\"`).join(', ')}. Dismiss each after surfacing.`)\n }\n if (connectedPeople.length > 0) {\n parts.push(`Connected people:\\n${connectedPeople.map(p => {\n const factsStr = p.facts.map(f => `${f.predicate}: ${f.value}`).join(', ')\n return `- ${p.name} (${p.relationship})${factsStr ? ': ' + factsStr : ''}`\n }).join('\\n')}`)\n }\n if (memories.length > 0 && parts.length === 0) {\n parts.push(`You know ${memories.length} things about this user.`)\n }\n if (parts.length === 0) {\n parts.push('This is a new user — no memories yet. Get to know them.')\n }\n\n return {\n subject: userSubject,\n isKnown,\n name,\n memories,\n connectedPeople,\n reminders,\n contexts,\n conflicts,\n signals,\n rapportTrajectory,\n summary: parts.join('\\n'),\n }\n }\n\n /**\n * Register a person that the user mentioned.\n *\n * Creates the person node, their role, and bidirectional\n * relationships to the user. One call does everything.\n *\n * @example\n * ```typescript\n * const result = await brain.users.registerPerson({\n * name: 'John Smith',\n * userId: 'cmk123...',\n * relationship: 'direct_report',\n * role: 'VP of Engineering',\n * })\n * ```\n */\n async registerPerson(input: RegisterPersonInput): Promise<RegisterPersonResult> {\n const userSubject = subject(SubjectPrefix.USER, input.userId)\n const personSubject = subject(SubjectPrefix.PERSON, input.name)\n const conf = typeof input.confidence === 'number'\n ? input.confidence\n : confidenceToScore(input.confidence || ConfidenceLevel.CONFIRMED)\n\n let assertionsCreated = 0\n let relationshipsCreated = 0\n const warnings: string[] = []\n\n // Create person node\n await this.http.post('/api/v1/assertions', {\n tenant_id: this.tenantId, subject: personSubject, predicate: 'name', value: input.name, confidence: conf,\n })\n assertionsCreated++\n\n // Set role if provided\n if (input.role) {\n // Check for role conflict\n try {\n const existing = await this.http.get<Assertion[]>(\n `/api/v1/assertions/query/${enc(this.tenantId)}/${enc(personSubject)}`\n )\n const existingRole = existing.find(a => a.predicate === 'role' && !a.isSuperseded)\n if (existingRole && existingRole.value !== input.role) {\n warnings.push(`${input.name} was previously \"${existingRole.value}\" — now being set as \"${input.role}\". Role change or mistake?`)\n await this.http.post('/api/v1/assertions/supersede', {\n tenant_id: this.tenantId, original_assertion_id: existingRole.id,\n subject: personSubject, predicate: 'role', value: input.role, confidence: conf,\n })\n } else if (!existingRole) {\n await this.http.post('/api/v1/assertions', {\n tenant_id: this.tenantId, subject: personSubject, predicate: 'role', value: input.role, confidence: conf,\n })\n }\n } catch {\n await this.http.post('/api/v1/assertions', {\n tenant_id: this.tenantId, subject: personSubject, predicate: 'role', value: input.role, confidence: conf,\n })\n }\n assertionsCreated++\n\n // Check if someone else holds this role\n try {\n const allAssertions = await this.http.get<Assertion[]>(\n `/api/v1/assertions/list/${enc(this.tenantId)}`\n )\n const sameRole = allAssertions.filter(a =>\n a.subject.startsWith('person:') &&\n a.subject !== personSubject &&\n a.predicate === 'role' &&\n a.value === input.role &&\n !a.isSuperseded\n )\n if (sameRole.length > 0) {\n const otherAssertions = await this.http.get<Assertion[]>(\n `/api/v1/assertions/query/${enc(this.tenantId)}/${enc(sameRole[0].subject)}`\n )\n const otherName = otherAssertions.find(a => a.predicate === 'name')?.value || sameRole[0].subject\n warnings.push(`\"${input.role}\" is already held by ${otherName}. Is ${otherName} no longer in this role?`)\n }\n } catch { /* non-critical */ }\n\n // Role as relationship\n const roleSubject = subject(SubjectPrefix.ROLE, input.role)\n await this.http.post('/api/v1/assertions', {\n tenant_id: this.tenantId, subject: roleSubject, predicate: 'name', value: input.role, confidence: conf,\n })\n await this.http.post('/api/v1/relationships', {\n tenant_id: this.tenantId, from_subject: personSubject, to_subject: roleSubject,\n relationship_type: OrgRelationship.HOLDS_ROLE, confidence: conf,\n })\n assertionsCreated++\n relationshipsCreated++\n }\n\n // Details if provided\n if (input.details) {\n await this.http.post('/api/v1/assertions', {\n tenant_id: this.tenantId, subject: personSubject, predicate: 'details', value: input.details, confidence: conf,\n })\n assertionsCreated++\n }\n\n // Status\n await this.http.post('/api/v1/assertions', {\n tenant_id: this.tenantId, subject: personSubject, predicate: 'status',\n value: input.relationship === 'candidate' ? 'candidate' : 'active', confidence: conf,\n })\n assertionsCreated++\n\n // Normalize relationship types: model sends 'direct_report',\n // SDK maps to proper forward/reverse relationship names\n const FORWARD_MAP: Record<string, string> = {\n 'direct_report': OrgRelationship.MANAGES,\n 'team_member': OrgRelationship.HAS_MEMBER,\n 'candidate': OrgRelationship.MANAGES, // user manages the hiring\n 'manager': OrgRelationship.REPORTS_TO, // user reports to this person\n 'stakeholder': OrgRelationship.STAKEHOLDER_IN,\n 'collaborator': OrgRelationship.COLLABORATES_WITH,\n 'mentor': OrgRelationship.MENTORS,\n }\n\n const forwardType = FORWARD_MAP[input.relationship] || input.relationship\n const reverseType = REVERSE_RELATIONSHIPS[input.relationship] || REVERSE_RELATIONSHIPS[forwardType] || input.relationship\n\n // User → Person\n await this.http.post('/api/v1/relationships', {\n tenant_id: this.tenantId, from_subject: userSubject, to_subject: personSubject,\n relationship_type: forwardType, confidence: conf,\n })\n relationshipsCreated++\n\n // Person → User (reverse)\n await this.http.post('/api/v1/relationships', {\n tenant_id: this.tenantId, from_subject: personSubject, to_subject: userSubject,\n relationship_type: reverseType, confidence: conf,\n })\n relationshipsCreated++\n\n return { personSubject, assertionsCreated, relationshipsCreated, warnings }\n }\n\n /**\n * Record an emotional state or rapport signal about the user.\n *\n * @example\n * ```typescript\n * await brain.users.recordRapport({\n * userId: 'cmk123...',\n * type: 'frustration',\n * value: 'Frustrated about losing the EA candidate',\n * aboutPerson: 'Sarah Johnson',\n * })\n * ```\n */\n async recordRapport(input: RecordRapportInput): Promise<{ success: boolean }> {\n const userSubject = subject(SubjectPrefix.USER, input.userId)\n const conf = typeof input.confidence === 'number'\n ? input.confidence\n : confidenceToScore(input.confidence || ConfidenceLevel.HIGH)\n\n await this.http.post('/api/v1/assertions', {\n tenant_id: this.tenantId, subject: userSubject,\n predicate: input.type, value: input.value, confidence: conf,\n })\n\n // If about a specific person, also create a timeline entry on their subject\n if (input.aboutPerson) {\n const personSubject = subject(SubjectPrefix.PERSON, input.aboutPerson)\n try {\n // Only if the person exists\n const personAssertions = await this.http.get<Assertion[]>(\n `/api/v1/assertions/query/${enc(this.tenantId)}/${enc(personSubject)}`\n )\n if (personAssertions.length > 0) {\n await this.http.post('/api/v1/assertions', {\n tenant_id: this.tenantId, subject: personSubject,\n predicate: 'timeline', value: input.value, confidence: conf,\n })\n }\n } catch { /* non-critical */ }\n }\n\n return { success: true }\n }\n\n /**\n * Dismiss a reminder after the agent has surfaced it.\n */\n async dismissReminder(userId: string, reminderContent: string): Promise<{ success: boolean }> {\n const userSubject = subject(SubjectPrefix.USER, userId)\n const assertions = await this.http.get<Assertion[]>(\n `/api/v1/assertions/query/${enc(this.tenantId)}/${enc(userSubject)}`\n )\n\n const reminder = assertions.find(\n a => a.predicate === 'reminder' && !a.isSuperseded &&\n (a.value as string).toLowerCase().includes(reminderContent.toLowerCase())\n )\n\n if (reminder) {\n await this.http.post(`/api/v1/assertions/retract/${enc(this.tenantId)}/${enc(reminder.id)}`, {})\n return { success: true }\n }\n return { success: false }\n }\n}\n\nfunction enc(s: string): string {\n return encodeURIComponent(s)\n}\n","/**\n * SubCortexClient — the main entry point for the SubCortex SDK.\n *\n * @example\n * ```typescript\n * import { SubCortexClient } from '@subcortex-ai/sdk'\n *\n * const subcortex = new SubCortexClient({\n * endpoint: 'https://api.subcortex.example.com',\n * tenantId: 'my-tenant',\n * apiKey: 'scx_live_...',\n * })\n *\n * // Create an assertion\n * const assertion = await subcortex.assertions.create({\n * subject: 'user:alice',\n * predicate: 'name',\n * value: 'Alice Smith',\n * })\n *\n * // Query by subject\n * const facts = await subcortex.assertions.query('user:alice')\n *\n * // Create a relationship\n * const rel = await subcortex.relationships.create({\n * fromSubject: 'user:alice',\n * toSubject: 'team:engineering',\n * relationshipType: 'belongs_to',\n * })\n * ```\n */\n\nimport { HttpTransport, toWire, type RetryConfig } from './http'\nimport type { HealthResponse } from './types/common'\nimport { UsersNamespace } from './users'\nimport { SignalsNamespace } from './signals'\n\n// ─── Client Options ─────────────────────────────────\n\nexport interface SubCortexClientOptions {\n /** Base URL of the SubCortex REST API */\n endpoint: string\n /** Tenant ID — required, used as default for all operations */\n tenantId: string\n /** API key for authentication */\n apiKey?: string\n /** JWT token for authentication (alternative to apiKey) */\n token?: string\n /** Retry configuration */\n retry?: Partial<RetryConfig>\n /** Request timeout in milliseconds (default: 30000) */\n timeoutMs?: number\n /** Custom fetch implementation (for testing or Cloudflare Workers) */\n fetch?: typeof fetch\n /** Custom headers added to every request */\n headers?: Record<string, string>\n /** AbortSignal for cancelling all pending requests */\n signal?: AbortSignal\n}\n\n// ─── Assertion Types ────────────────────────────────\n\n/**\n * An assertion — the atomic unit of knowledge in SubCortex.\n *\n * An assertion represents a single claim: \"subject S has property P with value V.\"\n * Assertions are content-addressable (same content = same ID), carry confidence\n * scores, and have temporal bounds.\n *\n * @example\n * ```typescript\n * const fact = await subcortex.assertions.create({\n * subject: 'user:alice',\n * predicate: 'role',\n * value: 'Engineering Manager',\n * confidence: 0.99,\n * })\n * console.log(fact.id) // content-addressable BLAKE3 hash\n * ```\n */\nexport interface Assertion {\n /** Content-addressable ID (BLAKE3 hash of subject + predicate + value + temporal bounds) */\n id: string\n /** Tenant this assertion belongs to */\n tenantId: string\n /** The subject this assertion is about (e.g., `\"user:alice\"`, `\"entity:Project\"`) */\n subject: string\n /** The property being asserted (e.g., `\"name\"`, `\"role\"`, `\"status\"`) */\n predicate: string\n /** The asserted value — can be a string, number, boolean, or object */\n value: unknown\n /** Confidence score (0.0–1.0). Higher = more certain. */\n confidence: number\n /** When this assertion became valid (ISO 8601) */\n validFrom: string\n /** Whether this assertion has been superseded by a newer version */\n isSuperseded: boolean\n}\n\n/**\n * Input for creating an assertion.\n *\n * @example\n * ```typescript\n * await subcortex.assertions.create({\n * subject: 'user:alice',\n * predicate: 'department',\n * value: 'Engineering',\n * confidence: 0.95,\n * })\n * ```\n */\nexport interface CreateAssertionInput {\n /** Subject of the assertion (e.g., `\"user:alice\"`, `\"entity:Project\"`) */\n subject: string\n /** Predicate — what property is being asserted */\n predicate: string\n /** The value being asserted */\n value: unknown\n /** Confidence score 0.0–1.0 (default: server-side default, typically 0.95) */\n confidence?: number\n /** Override the default tenant ID for this operation */\n tenantId?: string\n}\n\n/**\n * Input for superseding (updating) an existing assertion.\n *\n * SubCortex assertions are immutable. To \"update\" a fact, you supersede it:\n * the old assertion is marked as superseded and a new one is created.\n *\n * @example\n * ```typescript\n * await subcortex.assertions.supersede({\n * originalAssertionId: 'abc123...',\n * subject: 'user:alice',\n * predicate: 'role',\n * value: 'VP Engineering', // was \"Engineering Manager\"\n * })\n * ```\n */\nexport interface SupersedeAssertionInput {\n /** ID of the assertion being superseded */\n originalAssertionId: string\n /** Subject of the new assertion */\n subject: string\n /** Predicate of the new assertion */\n predicate: string\n /** Updated value */\n value: unknown\n /** Confidence for the new assertion */\n confidence?: number\n /** Override the default tenant ID */\n tenantId?: string\n}\n\n// ─── Relationship Types ─────────────────────────────\n\n/** What the SDK returns for a relationship. */\nexport interface Relationship {\n id: string\n tenantId: string\n fromSubject: string\n toSubject: string\n relationshipType: string\n confidence: number\n validFrom: string\n weight: number | null\n properties: Record<string, string>\n}\n\n/** Input for creating a relationship. */\nexport interface CreateRelationshipInput {\n fromSubject: string\n toSubject: string\n relationshipType: string\n confidence?: number\n weight?: number\n properties?: Record<string, string>\n tenantId?: string\n}\n\n// ─── Namespace Classes ──────────────────────────────\n\n/** Operations on assertions — the atomic units of knowledge in SubCortex. */\nexport class AssertionsNamespace {\n constructor(\n private http: HttpTransport,\n private tenantId: string\n ) {}\n\n /** Create an assertion in the knowledge graph. */\n async create(input: CreateAssertionInput): Promise<Assertion> {\n const tenantId = input.tenantId || this.tenantId\n return this.http.post<Assertion>('/api/v1/assertions', {\n tenant_id: tenantId,\n subject: input.subject,\n predicate: input.predicate,\n value: input.value,\n confidence: input.confidence,\n })\n }\n\n /** Get an assertion by its content-addressable ID. */\n async get(assertionId: string, options?: { tenantId?: string }): Promise<Assertion> {\n const tenantId = options?.tenantId || this.tenantId\n return this.http.get<Assertion>(\n `/api/v1/assertions/${enc(tenantId)}/${enc(assertionId)}`\n )\n }\n\n /** Query assertions by subject. */\n async query(subject: string, options?: { tenantId?: string }): Promise<Assertion[]> {\n const tenantId = options?.tenantId || this.tenantId\n return this.http.get<Assertion[]>(\n `/api/v1/assertions/query/${enc(tenantId)}/${enc(subject)}`\n )\n }\n\n /** List all active assertions for the tenant. */\n async list(options?: { tenantId?: string }): Promise<Assertion[]> {\n const tenantId = options?.tenantId || this.tenantId\n return this.http.get<Assertion[]>(\n `/api/v1/assertions/list/${enc(tenantId)}`\n )\n }\n\n /** Supersede an existing assertion with updated values. */\n async supersede(input: SupersedeAssertionInput): Promise<Assertion> {\n const tenantId = input.tenantId || this.tenantId\n return this.http.post<Assertion>('/api/v1/assertions/supersede', {\n tenant_id: tenantId,\n original_assertion_id: input.originalAssertionId,\n subject: input.subject,\n predicate: input.predicate,\n value: input.value,\n confidence: input.confidence,\n })\n }\n\n /** Retract an assertion by closing its temporal bounds. */\n async retract(assertionId: string, options?: { tenantId?: string }): Promise<Assertion> {\n const tenantId = options?.tenantId || this.tenantId\n return this.http.post<Assertion>(\n `/api/v1/assertions/retract/${enc(tenantId)}/${enc(assertionId)}`,\n {}\n )\n }\n}\n\n/** Operations on relationships — directional edges between subjects. */\nexport class RelationshipsNamespace {\n constructor(\n private http: HttpTransport,\n private tenantId: string\n ) {}\n\n /** Create a relationship between two subjects. */\n async create(input: CreateRelationshipInput): Promise<Relationship> {\n const tenantId = input.tenantId || this.tenantId\n return this.http.post<Relationship>('/api/v1/relationships', {\n tenant_id: tenantId,\n from_subject: input.fromSubject,\n to_subject: input.toSubject,\n relationship_type: input.relationshipType,\n confidence: input.confidence,\n weight: input.weight,\n properties: input.properties,\n })\n }\n\n /** Get relationships for a subject. */\n async query(subject: string, options?: { tenantId?: string }): Promise<Relationship[]> {\n const tenantId = options?.tenantId || this.tenantId\n return this.http.get<Relationship[]>(\n `/api/v1/relationships/${enc(tenantId)}/${enc(subject)}`\n )\n }\n\n /** List all relationships for the tenant. */\n async list(options?: { tenantId?: string }): Promise<Relationship[]> {\n const tenantId = options?.tenantId || this.tenantId\n return this.http.get<Relationship[]>(\n `/api/v1/relationships/list/${enc(tenantId)}`\n )\n }\n}\n\n// ─── Agent Types ────────────────────────────────────\n\n/**\n * Agent personality — defines how the agent communicates.\n *\n * @example\n * ```typescript\n * const personality: AgentPersonality = {\n * voice: \"Friendly cubicle neighbor who knows the business inside out\",\n * tone: \"casual\",\n * traits: [\"curious\", \"witty\", \"empathetic\"],\n * avoid: [\"corporate speak\", \"jargon\", \"being verbose\"],\n * }\n * ```\n */\nexport interface AgentPersonality {\n /** Overall personality description */\n voice?: string\n /** Communication tone: `\"casual\"`, `\"professional\"`, `\"playful\"` */\n tone?: string\n /** Personality traits */\n traits?: string[]\n /** Things the agent should avoid saying/doing */\n avoid?: string[]\n}\n\n/**\n * Composable instruction sections for an agent.\n *\n * Instructions are broken into sections so they can be independently\n * configured. SubCortex assembles them into a single system prompt\n * via {@link SubCortexClient.agents.getInstructions}.\n */\nexport interface AgentInstructions {\n /** How the agent speaks and presents itself */\n personality?: string\n /** What to remember about users, how to categorize facts */\n memoryGuidance?: string\n /** Domain-specific behavior rules (e.g., schema emergence) */\n domainRules?: string\n /** Organization-specific additions */\n custom?: string\n /** How to greet new vs returning users */\n greetingRules?: string\n /** The agent's purpose, responsibilities, and proactive behaviors */\n goals?: string\n /** How to read and respond to emotional signals and rapport shifts */\n emotionalIntelligence?: string\n /** Guardrails, compliance rules, escalation triggers */\n safety?: string\n}\n\n/**\n * LLM model configuration for the agent.\n */\nexport interface AgentModelConfig {\n /** Provider: `\"anthropic\"`, `\"openai\"`, `\"azure-openai\"` */\n provider?: string\n /** Model identifier (e.g., `\"claude-opus-4-6\"`, `\"gpt-4-turbo\"`) */\n modelId?: string\n /** Inference temperature (0.0–2.0) */\n temperature?: number\n /** Maximum response tokens */\n maxTokens?: number\n /** Voice ID for voice agents (e.g., `\"marin\"`, `\"echo\"`) */\n voiceId?: string\n}\n\n/**\n * A capability (tool/function) the agent can use.\n *\n * @example\n * ```typescript\n * const cap: AgentCapability = {\n * name: \"registerUserFact\",\n * description: \"Store a learned fact about the user\",\n * enabled: true,\n * }\n * ```\n */\nexport interface AgentCapability {\n /** Tool/function name */\n name: string\n /** What this capability does */\n description?: string\n /** Whether this capability is active */\n enabled?: boolean\n /** Tool parameter schema (JSON Schema) */\n parameters?: unknown\n}\n\n/**\n * Memory retention policy — controls how the agent manages its memories.\n */\nexport interface AgentMemoryPolicy {\n /** Max assertions per user subject (0 = unlimited) */\n maxMemoriesPerUser?: number\n /** Auto-forget memories below this confidence (0.0 = keep everything) */\n forgetConfidenceBelow?: number\n /** Days to retain memories (0 = forever) */\n retainDays?: number\n /** Compress old memories into higher-level summaries */\n autoSummarize?: boolean\n}\n\n/**\n * Full agent configuration — the agent's identity in SubCortex.\n *\n * This is what an agent retrieves at session start to know who it is,\n * how to behave, what tools it has, and how to manage its memory.\n *\n * @example\n * ```typescript\n * const agent = await cortex.agents.create({\n * name: 'Aria',\n * description: 'AI assistant for customer support',\n * personality: { tone: 'casual', traits: ['curious', 'empathetic'] },\n * instructions: {\n * personality: 'You are the user\\'s best friend at work...',\n * memoryGuidance: 'Remember names, roles, and org structure...',\n * },\n * model: { provider: 'openai', modelId: 'gpt-realtime-1.5', voiceId: 'marin' },\n * })\n * ```\n */\nexport interface AgentConfig {\n agentId: string\n tenantId: string\n name: string\n description: string\n personality: AgentPersonality\n instructions: AgentInstructions\n model: AgentModelConfig\n capabilities: AgentCapability[]\n memoryPolicy: AgentMemoryPolicy\n isActive: boolean\n createdAt: string\n updatedAt: string\n}\n\n/** Input for creating an agent. */\nexport interface CreateAgentInput {\n name: string\n description?: string\n personality?: AgentPersonality\n instructions?: AgentInstructions\n model?: AgentModelConfig\n capabilities?: AgentCapability[]\n memoryPolicy?: AgentMemoryPolicy\n tenantId?: string\n}\n\n/** Input for updating an agent. */\nexport interface UpdateAgentInput {\n name?: string\n description?: string\n personality?: AgentPersonality\n instructions?: AgentInstructions\n model?: AgentModelConfig\n capabilities?: AgentCapability[]\n memoryPolicy?: AgentMemoryPolicy\n isActive?: boolean\n}\n\n/** Composed instructions response. */\nexport interface ComposedInstructions {\n composedInstructions: string\n agentName: string\n modelProvider: string\n modelId: string\n temperature: number\n voiceId: string\n}\n\n/**\n * Operations on agent configurations — the identity layer.\n *\n * Create, update, and retrieve agent profiles that define who an agent is,\n * how it behaves, what tools it can use, and how it manages memory.\n *\n * @example\n * ```typescript\n * // Create an agent\n * const agent = await subcortex.agents.create({\n * name: 'Aria',\n * description: 'AI assistant for customer support',\n * personality: { tone: 'casual', traits: ['curious', 'witty'] },\n * })\n *\n * // Get composed system prompt at session start\n * const { composedInstructions } = await subcortex.agents.getInstructions(agent.agentId)\n * ```\n */\nexport class AgentsNamespace {\n constructor(\n private http: HttpTransport,\n private tenantId: string\n ) {}\n\n /** Create a new agent. */\n async create(input: CreateAgentInput): Promise<AgentConfig> {\n const tenantId = input.tenantId || this.tenantId\n return this.http.post<AgentConfig>('/api/v1/agents', {\n tenant_id: tenantId,\n name: input.name,\n description: input.description,\n personality: input.personality,\n instructions: input.instructions ? toWire(input.instructions) : undefined,\n model: input.model ? toWire(input.model) : undefined,\n capabilities: input.capabilities,\n memory_policy: input.memoryPolicy ? toWire(input.memoryPolicy) : undefined,\n })\n }\n\n /** Get an agent by ID. */\n async get(agentId: string, options?: { tenantId?: string }): Promise<AgentConfig> {\n const tenantId = options?.tenantId || this.tenantId\n return this.http.get<AgentConfig>(\n `/api/v1/agents/${enc(tenantId)}/${enc(agentId)}`\n )\n }\n\n /** Update an agent. */\n async update(agentId: string, input: UpdateAgentInput, options?: { tenantId?: string }): Promise<AgentConfig> {\n const tenantId = options?.tenantId || this.tenantId\n return this.http.put<AgentConfig>(\n `/api/v1/agents/${enc(tenantId)}/${enc(agentId)}`,\n {\n tenant_id: tenantId,\n name: input.name,\n description: input.description,\n personality: input.personality,\n instructions: input.instructions ? toWire(input.instructions) : undefined,\n model: input.model ? toWire(input.model) : undefined,\n capabilities: input.capabilities,\n memory_policy: input.memoryPolicy ? toWire(input.memoryPolicy) : undefined,\n is_active: input.isActive,\n }\n )\n }\n\n /** Delete an agent. */\n async delete(agentId: string, options?: { tenantId?: string }): Promise<void> {\n const tenantId = options?.tenantId || this.tenantId\n await this.http.delete<unknown>(`/api/v1/agents/${enc(tenantId)}/${enc(agentId)}`)\n }\n\n /** List all agents for the tenant. */\n async list(options?: { tenantId?: string }): Promise<AgentConfig[]> {\n const tenantId = options?.tenantId || this.tenantId\n return this.http.get<AgentConfig[]>(\n `/api/v1/agents/list/${enc(tenantId)}`\n )\n }\n\n /** Get composed system instructions for an agent. */\n async getInstructions(agentId: string, options?: { tenantId?: string }): Promise<ComposedInstructions> {\n const tenantId = options?.tenantId || this.tenantId\n return this.http.get<ComposedInstructions>(\n `/api/v1/agents/${enc(tenantId)}/${enc(agentId)}/instructions`\n )\n }\n}\n\n// ─── Memory Namespace ───────────────────────────────\n\n/** Input for storing a memory. */\nexport interface StoreMemoryInput {\n subject: string\n predicate: string\n value: unknown\n confidence?: number\n tenantId?: string\n /** Agent ID — required for Thalamus routing (used as agentId in intake submission) */\n agentId?: string\n /** Person this fact relates to */\n personName?: string\n /** Skip Thalamus processing — write directly to assertion store. For bulk imports, migrations. */\n raw?: boolean\n /** Conversational context for deep encoding */\n context?: {\n topic?: string\n emotionalState?: string\n sessionId?: string\n excerpt?: string\n }\n}\n\n/**\n * Agent memory operations.\n *\n * By default, `store()` routes through the Thalamus cognitive intake\n * pipeline for signal classification, contradiction detection, and\n * deduplication. Use `raw: true` to bypass for bulk imports.\n *\n * @example\n * ```typescript\n * // Store via Thalamus (default — validated, deduped, conflict-checked)\n * await subcortex.memory.store({\n * subject: 'user:alice',\n * predicate: 'role',\n * value: 'Engineering Manager',\n * confidence: 0.99,\n * agentId: 'agent_abc',\n * })\n *\n * // Store raw (bypass Thalamus — for imports/migrations)\n * await subcortex.memory.store({\n * subject: 'user:alice',\n * predicate: 'role',\n * value: 'Engineering Manager',\n * raw: true,\n * })\n *\n * // Recall everything about a user\n * const memories = await subcortex.memory.recall('user:alice')\n * ```\n */\nexport class MemoryNamespace {\n constructor(\n private http: HttpTransport,\n private tenantId: string\n ) {}\n\n /**\n * Store a fact in the agent's memory.\n *\n * Routes through the Thalamus by default. The Thalamus will:\n * - Classify the signal (reject noise)\n * - Check for contradictions with existing assertions\n * - Detect duplicates and reinforce instead of creating new\n *\n * Pass `raw: true` to bypass Thalamus for system operations.\n */\n async store(input: StoreMemoryInput): Promise<Assertion | IntakeResult> {\n const tenantId = input.tenantId || this.tenantId\n\n if (input.raw) {\n // Direct write — bypass Thalamus\n return this.http.post<Assertion>('/api/v1/assertions', {\n tenant_id: tenantId,\n subject: input.subject,\n predicate: input.predicate,\n value: input.value,\n confidence: input.confidence,\n })\n }\n\n // Route through Thalamus\n const correlationId = `mem_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 6)}`\n return this.http.post<IntakeResult>('/api/v1/intake/submit', {\n correlation_id: correlationId,\n agent_id: input.agentId,\n tenant_id: tenantId,\n candidates: [{\n subject: input.subject,\n predicate: input.predicate,\n value: input.value,\n source_confidence: input.confidence ?? 0.95,\n provenance: 'agent',\n person_name: input.personName,\n }],\n context: input.context,\n })\n }\n\n /** Recall all memories for a subject. */\n async recall(subject: string, options?: { tenantId?: string }): Promise<Assertion[]> {\n const tenantId = options?.tenantId || this.tenantId\n return this.http.get<Assertion[]>(\n `/api/v1/assertions/query/${enc(tenantId)}/${enc(subject)}`\n )\n }\n\n /** Forget a specific memory (retract the assertion). */\n async forget(assertionId: string, options?: { tenantId?: string }): Promise<Assertion> {\n const tenantId = options?.tenantId || this.tenantId\n return this.http.post<Assertion>(\n `/api/v1/assertions/retract/${enc(tenantId)}/${enc(assertionId)}`,\n {}\n )\n }\n}\n\n// ─── Intake Types ───────────────────────────────────\n\n/** A candidate assertion submitted for Thalamus processing. */\nexport interface CandidateAssertion {\n subject: string\n predicate: string\n value: unknown\n sourceConfidence: number\n validFrom?: string\n validUntil?: string | null\n provenance: 'human' | 'agent' | 'import' | 'derived'\n personName?: string\n}\n\n/** Full intake submission. */\nexport interface IntakeSubmission {\n correlationId: string\n agentId: string\n candidates: CandidateAssertion[]\n context?: {\n topic?: string\n emotionalState?: string\n sessionId?: string\n excerpt?: string\n }\n tenantId?: string\n}\n\n/** Result of Thalamus processing. */\nexport interface IntakeResult {\n correlationId: string\n processed: number\n accepted: number\n reinforced: number\n conflicts: number\n rejected: number\n items: IntakeResponseItem[]\n}\n\n/** A single intake response queue item. */\nexport interface IntakeResponseItem {\n id: string\n correlationId: string\n agentId: string\n tenantId: string\n status: 'accepted' | 'reinforced' | 'conflict_detected' | 'needs_clarification' | 'rejected'\n priority: number\n surfacingHint?: string\n expiresAt: string\n persistedAssertionIds: string[]\n inferredBondIds: string[]\n conflictingAssertionId?: string\n clarificationQuestions: string[]\n rejectionReason?: string\n signalCategory?: string\n acknowledged: boolean\n createdAt: string\n}\n\n/** Intake processing stats. */\nexport interface IntakeStats {\n total: number\n accepted: number\n reinforced: number\n conflicts: number\n clarifications: number\n rejected: number\n}\n\n/**\n * Thalamus cognitive intake operations.\n *\n * Submit candidate assertions for processing through the Thalamus\n * pipeline. The pipeline validates, deduplicates, detects contradictions,\n * and enriches assertions before persisting them.\n *\n * @example\n * ```typescript\n * // Submit a fact for processing\n * const result = await subcortex.intake.submit({\n * correlationId: 'corr-123',\n * agentId: 'agent_abc',\n * candidates: [{\n * subject: 'user:tommy',\n * predicate: 'role',\n * value: 'CTO',\n * sourceConfidence: 0.99,\n * provenance: 'human',\n * }],\n * })\n *\n * // Check for conflicts or clarification requests\n * const pending = await subcortex.intake.pending('agent_abc')\n *\n * // Acknowledge after handling\n * await subcortex.intake.acknowledge(pending[0].id)\n * ```\n */\nexport class IntakeNamespace {\n constructor(\n private http: HttpTransport,\n private tenantId: string\n ) {}\n\n /** Submit candidate assertions for Thalamus processing. */\n async submit(input: IntakeSubmission): Promise<IntakeResult> {\n const tenantId = input.tenantId || this.tenantId\n return this.http.post<IntakeResult>('/api/v1/intake/submit', {\n correlation_id: input.correlationId,\n agent_id: input.agentId,\n tenant_id: tenantId,\n candidates: input.candidates.map(c => ({\n subject: c.subject,\n predicate: c.predicate,\n value: c.value,\n source_confidence: c.sourceConfidence,\n valid_from: c.validFrom,\n valid_until: c.validUntil,\n provenance: c.provenance,\n person_name: c.personName,\n })),\n context: input.context,\n })\n }\n\n /** Get pending intake results for an agent. */\n async pending(agentId: string, options?: {\n status?: string[]\n limit?: number\n }): Promise<IntakeResponseItem[]> {\n let path = `/api/v1/intake/pending/${enc(agentId)}`\n const params: string[] = []\n if (options?.status) params.push(`status=${options.status.join(',')}`)\n if (options?.limit) params.push(`limit=${options.limit}`)\n if (params.length) path += `?${params.join('&')}`\n\n return this.http.get<IntakeResponseItem[]>(path)\n }\n\n /** Acknowledge an intake result (mark as consumed). */\n async acknowledge(itemId: string): Promise<void> {\n await this.http.post<unknown>(`/api/v1/intake/acknowledge/${enc(itemId)}`, {})\n }\n\n /** Acknowledge all pending items for an agent. */\n async acknowledgeAll(agentId: string): Promise<{ acknowledged: number }> {\n return this.http.post<{ acknowledged: number }>(\n `/api/v1/intake/acknowledge-all/${enc(agentId)}`,\n {}\n )\n }\n\n /** Get intake processing stats for an agent. */\n async stats(agentId: string): Promise<IntakeStats> {\n return this.http.get<IntakeStats>(`/api/v1/intake/stats/${enc(agentId)}`)\n }\n}\n\n// ─── Client ─────────────────────────────────────────\n\nconst DEFAULT_RETRY: RetryConfig = {\n maxRetries: 3,\n baseDelayMs: 500,\n maxDelayMs: 10_000,\n}\n\nexport class SubCortexClient {\n /** Assertion operations (low-level knowledge primitives) */\n readonly assertions: AssertionsNamespace\n /** Relationship operations */\n readonly relationships: RelationshipsNamespace\n /** Agent identity & configuration */\n readonly agents: AgentsNamespace\n /** Agent memory (semantic wrapper over assertions) */\n readonly memory: MemoryNamespace\n /** Thalamus cognitive intake pipeline */\n readonly intake: IntakeNamespace\n /** User rapport building operations */\n readonly users: UsersNamespace\n /** Emotional signals — record, query, and resolve */\n readonly signals: SignalsNamespace\n\n private readonly http: HttpTransport\n\n constructor(options: SubCortexClientOptions) {\n if (!options.apiKey && !options.token) {\n console.warn('[SubCortex] No apiKey or token provided — requests will be unauthenticated.')\n }\n\n this.http = new HttpTransport({\n baseUrl: options.endpoint,\n tenantId: options.tenantId,\n apiKey: options.apiKey,\n token: options.token,\n retry: { ...DEFAULT_RETRY, ...options.retry },\n timeoutMs: options.timeoutMs ?? 30_000,\n fetchImpl: options.fetch ?? globalThis.fetch,\n headers: options.headers ?? {},\n signal: options.signal,\n })\n\n this.assertions = new AssertionsNamespace(this.http, options.tenantId)\n this.relationships = new RelationshipsNamespace(this.http, options.tenantId)\n this.agents = new AgentsNamespace(this.http, options.tenantId)\n this.memory = new MemoryNamespace(this.http, options.tenantId)\n this.intake = new IntakeNamespace(this.http, options.tenantId)\n this.users = new UsersNamespace(this.http, options.tenantId)\n this.signals = new SignalsNamespace(this.http, options.tenantId)\n }\n\n /** Check SubCortex server health. */\n async health(): Promise<HealthResponse> {\n return this.http.get<HealthResponse>('/health')\n }\n}\n\n\n// ─── Helpers ────────────────────────────────────────\n\nfunction enc(s: string): string {\n return encodeURIComponent(s)\n}\n","/**\n * SubCortex Context Formatting — v1.0 Schema\n *\n * Transforms structured UserIdentification data into XML optimized\n * for model injection. Signals nest as children of the knowledge\n * they relate to, not as a separate section.\n *\n * Section order = priority order (transformer attention bias):\n * conflicts → reminders → contexts → identity → knowledge → relationships\n *\n * Why XML: Tag boundaries create hard attention delimiters for transformers.\n * See docs/context-format-rationale.md for full analysis.\n */\n\nimport type { UserIdentification, UserMemory, ConnectedPerson } from './types/users'\nimport type { SignalEntry } from './types/signals'\n\nexport const CONTEXT_SCHEMA_VERSION = '1.0'\n\nexport type ContextFormat = 'xml' | 'json' | 'summary'\n\nexport interface ContextFormatOptions {\n /** Output format. Default: 'xml' */\n format?: ContextFormat\n /** Include memories section. Default: true */\n includeMemories?: boolean\n /** Include connected people. Default: true */\n includeRelationships?: boolean\n /** Include reminders. Default: true */\n includeReminders?: boolean\n /** Include conflicts. Default: true */\n includeConflicts?: boolean\n /** Include active contexts. Default: true */\n includeContexts?: boolean\n /** Include emotional signals. Default: true */\n includeSignals?: boolean\n /** Minimum confidence threshold to include (0-1). Default: 0 */\n minConfidence?: number\n}\n\n/**\n * Format a UserIdentification result for model injection.\n */\nexport function formatContext(user: UserIdentification, options: ContextFormatOptions = {}): string {\n const format = options.format ?? 'xml'\n switch (format) {\n case 'xml': return toContextXml(user, options)\n case 'json': return JSON.stringify(user, null, 2)\n case 'summary': return user.summary\n }\n}\n\n/**\n * Transform UserIdentification into versioned XML optimized for model attention.\n * Signals nest as children of the facts/contexts/people they relate to.\n */\nexport function toContextXml(user: UserIdentification, options: ContextFormatOptions = {}): string {\n const {\n includeMemories = true,\n includeRelationships = true,\n includeReminders = true,\n includeConflicts = true,\n includeContexts = true,\n includeSignals = true,\n minConfidence = 0,\n } = options\n\n const ts = new Date().toISOString()\n const lines: string[] = []\n\n // Build signal lookup: aboutSubject → signals\n const signalsByAbout = new Map<string, SignalEntry[]>()\n const unattachedSignals: SignalEntry[] = []\n if (includeSignals && user.signals) {\n for (const sig of user.signals) {\n if (sig.aboutSubject) {\n const existing = signalsByAbout.get(sig.aboutSubject) || []\n existing.push(sig)\n signalsByAbout.set(sig.aboutSubject, existing)\n } else {\n unattachedSignals.push(sig)\n }\n }\n }\n\n lines.push(`<subcortex_context version=\"${CONTEXT_SCHEMA_VERSION}\" subject=\"${esc(user.subject)}\" known=\"${user.isKnown}\" ts=\"${ts}\">`)\n\n // ── Priority 1: Conflicts ──\n if (includeConflicts && user.conflicts.length > 0) {\n lines.push(` <conflicts count=\"${user.conflicts.length}\" priority=\"critical\">`)\n for (const conflict of user.conflicts) {\n lines.push(` <conflict id=\"${esc(conflict.id)}\">${esc(conflict.hint)}</conflict>`)\n }\n lines.push(` </conflicts>`)\n }\n\n // ── Priority 2: Reminders ──\n if (includeReminders && user.reminders.length > 0) {\n lines.push(` <reminders count=\"${user.reminders.length}\" priority=\"high\">`)\n for (const reminder of user.reminders) {\n lines.push(` <reminder id=\"${esc(reminder.id)}\" confidence=\"${fmtConf(reminder.confidence)}\">${esc(String(reminder.value))}</reminder>`)\n }\n lines.push(` </reminders>`)\n }\n\n // ── Priority 3: Active Contexts (with attached signals) ──\n if (includeContexts && user.contexts.length > 0) {\n lines.push(` <active_contexts count=\"${user.contexts.length}\">`)\n for (const ctx of user.contexts) {\n const ctxSignals = findSignalsForFact(ctx, signalsByAbout)\n if (ctxSignals.length > 0) {\n lines.push(` <context predicate=\"${esc(ctx.predicate)}\" confidence=\"${fmtConf(ctx.confidence)}\">`)\n lines.push(` ${esc(String(ctx.value))}`)\n for (const sig of ctxSignals) {\n lines.push(` ${renderSignal(sig)}`)\n }\n lines.push(` </context>`)\n } else {\n lines.push(` <context predicate=\"${esc(ctx.predicate)}\" confidence=\"${fmtConf(ctx.confidence)}\">${esc(String(ctx.value))}</context>`)\n }\n }\n lines.push(` </active_contexts>`)\n }\n\n // ── Priority 4: Identity (with unattached signals + rapport trajectory) ──\n if (user.name) {\n const trajectoryAttr = user.rapportTrajectory ? ` rapport_trajectory=\"${user.rapportTrajectory}\"` : ''\n lines.push(` <identity name=\"${esc(String(user.name))}\" subject=\"${esc(user.subject)}\"${trajectoryAttr}>`)\n const identityPredicates = new Set(['name', 'full_name', 'role', 'title', 'department', 'team', 'email', 'start_date', 'communication_style'])\n const identityFacts = user.memories.filter(m => identityPredicates.has(m.predicate) && m.confidence >= minConfidence)\n for (const fact of identityFacts) {\n const factSignals = findSignalsForFact(fact, signalsByAbout)\n if (factSignals.length > 0) {\n lines.push(` <fact predicate=\"${esc(fact.predicate)}\" confidence=\"${fmtConf(fact.confidence)}\">`)\n lines.push(` ${esc(String(fact.value))}`)\n for (const sig of factSignals) {\n lines.push(` ${renderSignal(sig)}`)\n }\n lines.push(` </fact>`)\n } else {\n lines.push(` <fact predicate=\"${esc(fact.predicate)}\" confidence=\"${fmtConf(fact.confidence)}\">${esc(String(fact.value))}</fact>`)\n }\n }\n // Unattached signals go under identity (general mood)\n for (const sig of unattachedSignals) {\n lines.push(` ${renderSignal(sig)}`)\n }\n lines.push(` </identity>`)\n }\n\n // ── Priority 5: Knowledge (with attached signals) ──\n if (includeMemories) {\n const identityPredicates = new Set(['name', 'full_name', 'role', 'title', 'department', 'team', 'email', 'start_date', 'communication_style'])\n const knowledge = user.memories.filter(m =>\n !identityPredicates.has(m.predicate) && m.confidence >= minConfidence\n )\n if (knowledge.length > 0) {\n lines.push(` <knowledge count=\"${knowledge.length}\">`)\n for (const mem of knowledge) {\n const memSignals = findSignalsForFact(mem, signalsByAbout)\n if (memSignals.length > 0) {\n lines.push(` <fact predicate=\"${esc(mem.predicate)}\" confidence=\"${fmtConf(mem.confidence)}\">`)\n lines.push(` ${esc(String(mem.value))}`)\n for (const sig of memSignals) {\n lines.push(` ${renderSignal(sig)}`)\n }\n lines.push(` </fact>`)\n } else {\n lines.push(` <fact predicate=\"${esc(mem.predicate)}\" confidence=\"${fmtConf(mem.confidence)}\">${esc(String(mem.value))}</fact>`)\n }\n }\n lines.push(` </knowledge>`)\n }\n }\n\n // ── Priority 6: Relationships (with attached signals) ──\n if (includeRelationships && user.connectedPeople.length > 0) {\n lines.push(` <relationships count=\"${user.connectedPeople.length}\">`)\n for (const person of user.connectedPeople) {\n const personSignals = signalsByAbout.get(person.subject) || []\n const hasContent = person.facts.length > 0 || personSignals.length > 0\n if (!hasContent) {\n lines.push(` <person name=\"${esc(person.name)}\" relationship=\"${esc(person.relationship)}\" />`)\n } else {\n lines.push(` <person name=\"${esc(person.name)}\" relationship=\"${esc(person.relationship)}\">`)\n for (const fact of person.facts) {\n lines.push(` <fact predicate=\"${esc(fact.predicate)}\">${esc(String(fact.value))}</fact>`)\n }\n for (const sig of personSignals) {\n lines.push(` ${renderSignal(sig)}`)\n }\n lines.push(` </person>`)\n }\n }\n lines.push(` </relationships>`)\n }\n\n lines.push(`</subcortex_context>`)\n return lines.join('\\n')\n}\n\n// ─── Helpers ──────────────────────────────────────────\n\nfunction renderSignal(sig: SignalEntry): string {\n const aboutAttr = sig.aboutSubject ? ` about=\"${esc(sig.aboutSubject)}\"` : ''\n return `<signal type=\"${esc(sig.type)}\" intensity=\"${fmtConf(sig.intensity)}\" decayed=\"${fmtConf(sig.decayedIntensity)}\" age_hours=\"${sig.ageHours}\"${aboutAttr}>${esc(sig.content)}</signal>`\n}\n\n/**\n * Find signals that relate to a specific fact/memory.\n * Matches on predicate name or value content as subject references.\n */\nfunction findSignalsForFact(fact: UserMemory, signalsByAbout: Map<string, SignalEntry[]>): SignalEntry[] {\n const results: SignalEntry[] = []\n // Match by predicate (e.g., about_subject = \"context:current_project\" matches predicate \"current_project\")\n for (const [aboutSubject, signals] of signalsByAbout) {\n if (aboutSubject.includes(fact.predicate) || aboutSubject.includes(String(fact.value).toLowerCase().replace(/\\s+/g, '-').slice(0, 30))) {\n results.push(...signals)\n }\n }\n return results\n}\n\nfunction fmtConf(n: number): string {\n return n.toFixed(2)\n}\n\nfunction esc(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACiBO,IAAM,iBAAN,cAA6B,MAAM;AAAA;AAAA,EAE/B;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EAET,YACE,SACA,YACA,SAKA;AACA,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,SAAK,YAAY,SAAS;AAC1B,SAAK,YAAY,SAAS,aAAa;AACvC,SAAK,OAAO,SAAS;AAAA,EACvB;AACF;AAGO,IAAM,2BAAN,cAAuC,eAAe;AAAA;AAAA,EAElD;AAAA,EAET,YACE,SACA,SAKA;AACA,UAAM,SAAS,KAAK,EAAE,GAAG,SAAS,WAAW,MAAM,CAAC;AACpD,SAAK,OAAO;AACZ,SAAK,UAAU,SAAS;AAAA,EAC1B;AACF;AAGO,IAAM,+BAAN,cAA2C,eAAe;AAAA,EAC/D,YAAY,SAAiB,SAAiD;AAC5E,UAAM,SAAS,KAAK,EAAE,GAAG,SAAS,WAAW,MAAM,CAAC;AACpD,SAAK,OAAO;AAAA,EACd;AACF;AAGO,IAAM,8BAAN,cAA0C,eAAe;AAAA,EAC9D,YAAY,SAAiB,SAAiD;AAC5E,UAAM,SAAS,KAAK,EAAE,GAAG,SAAS,WAAW,MAAM,CAAC;AACpD,SAAK,OAAO;AAAA,EACd;AACF;AAGO,IAAM,yBAAN,cAAqC,eAAe;AAAA,EACzD,YAAY,SAAiB,SAAiD;AAC5E,UAAM,SAAS,KAAK,EAAE,GAAG,SAAS,WAAW,MAAM,CAAC;AACpD,SAAK,OAAO;AAAA,EACd;AACF;AAGO,IAAM,yBAAN,cAAqC,eAAe;AAAA,EACzD,YAAY,SAAiB,SAAiD;AAC5E,UAAM,SAAS,KAAK,EAAE,GAAG,SAAS,WAAW,MAAM,CAAC;AACpD,SAAK,OAAO;AAAA,EACd;AACF;AAGO,IAAM,0BAAN,cAAsC,eAAe;AAAA;AAAA,EAEjD;AAAA,EAET,YACE,SACA,SAKA;AACA,UAAM,SAAS,KAAK,EAAE,GAAG,SAAS,WAAW,KAAK,CAAC;AACnD,SAAK,OAAO;AACZ,SAAK,aAAa,SAAS;AAAA,EAC7B;AACF;AAGO,IAAM,uBAAN,cAAmC,eAAe;AAAA,EACvD,YACE,SACA,YACA,SACA;AACA,UAAM,SAAS,YAAY,EAAE,GAAG,SAAS,WAAW,KAAK,CAAC;AAC1D,SAAK,OAAO;AAAA,EACd;AACF;AAGO,IAAM,wBAAN,cAAoC,eAAe;AAAA,EAC/C;AAAA,EAET,YAAY,SAAiB,SAA6B;AACxD,UAAM,SAAS,GAAG,EAAE,WAAW,KAAK,CAAC;AACrC,SAAK,OAAO;AACZ,SAAK,QAAQ,SAAS;AAAA,EACxB;AACF;AAGO,IAAM,wBAAN,cAAoC,sBAAsB;AAAA,EAC/D,YAAY,WAAmB;AAC7B,UAAM,2BAA2B,SAAS,IAAI;AAC9C,SAAK,OAAO;AAAA,EACd;AACF;AA6BO,SAAS,cACd,YACA,MACA,WACA,gBACgB;AAEhB,MAAI,YAAY;AAChB,MAAI,UAAU;AACd,MAAI;AAEJ,MAAI;AACF,UAAM,SAAiC,KAAK,MAAM,IAAI;AACtD,QAAI,OAAO,OAAO;AAChB,kBAAY,OAAO,MAAM,QAAQ;AACjC,gBAAU,OAAO,MAAM,WAAW;AAClC,UAAI,OAAO,MAAM,SAAS;AACxB,kBAAU,OAAO,MAAM;AAAA,MACzB;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,MAAI,CAAC,SAAS;AACZ,cAAU,QAAQ,QAAQ,UAAU;AAAA,EACtC;AAEA,QAAM,OAAO,EAAE,WAAW,KAAK;AAE/B,UAAQ,YAAY;AAAA,IAClB,KAAK;AACH,aAAO,IAAI,yBAAyB,SAAS,EAAE,GAAG,MAAM,QAAQ,CAAC;AAAA,IACnE,KAAK;AACH,aAAO,IAAI,6BAA6B,SAAS,IAAI;AAAA,IACvD,KAAK;AACH,aAAO,IAAI,4BAA4B,SAAS,IAAI;AAAA,IACtD,KAAK;AACH,aAAO,IAAI,uBAAuB,SAAS,IAAI;AAAA,IACjD,KAAK;AACH,aAAO,IAAI,uBAAuB,SAAS,IAAI;AAAA,IACjD,KAAK,KAAK;AACR,UAAI,aAAiC;AACrC,UAAI,eAAe,QAAW;AAC5B,YAAI;AACF,gBAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,uBAAa,OAAO,cAAc,OAAO;AAAA,QAC3C,QAAQ;AAAA,QAER;AAAA,MACF;AACA,aAAO,IAAI,wBAAwB,SAAS,EAAE,GAAG,MAAM,WAAW,CAAC;AAAA,IACrE;AAAA,IACA;AACE,UAAI,cAAc,KAAK;AACrB,eAAO,IAAI,qBAAqB,SAAS,YAAY,IAAI;AAAA,MAC3D;AACA,aAAO,IAAI,eAAe,SAAS,YAAY,IAAI;AAAA,EACvD;AACF;;;AClMA,SAAS,aAAa,GAAmB;AACvC,SAAO,EAAE,QAAQ,aAAa,CAAC,GAAG,MAAM,EAAE,YAAY,CAAC;AACzD;AAEA,SAAS,aAAa,GAAmB;AACvC,SAAO,EAAE,QAAQ,UAAU,CAAC,MAAM,IAAI,EAAE,YAAY,CAAC,EAAE;AACzD;AAGO,SAAS,QAAQ,KAAc,QAAwC;AAC5E,MAAI,QAAQ,QAAQ,QAAQ,OAAW,QAAO;AAC9C,MAAI,MAAM,QAAQ,GAAG,EAAG,QAAO,IAAI,IAAI,CAAC,SAAS,QAAQ,MAAM,MAAM,CAAC;AACtE,MAAI,OAAO,QAAQ,UAAU;AAC3B,UAAM,SAAkC,CAAC;AACzC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAA8B,GAAG;AACzE,aAAO,OAAO,GAAG,CAAC,IAAI,QAAQ,OAAO,MAAM;AAAA,IAC7C;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAGO,SAAS,SAAY,MAAkB;AAC5C,SAAO,QAAQ,MAAM,YAAY;AACnC;AAGO,SAAS,OAAO,MAAwB;AAC7C,SAAO,QAAQ,MAAM,YAAY;AACnC;AAIA,IAAI,UAAU;AACd,SAAS,oBAA4B;AACnC,QAAM,KAAK,KAAK,IAAI,EAAE,SAAS,EAAE;AACjC,QAAM,OAAO,WAAW,SAAS,EAAE;AACnC,QAAM,OAAO,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC;AAClD,SAAO,OAAO,EAAE,IAAI,GAAG,IAAI,IAAI;AACjC;AAIA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;AAEA,SAAS,aAAa,SAAiB,QAA6B;AAClE,QAAM,cAAc,OAAO,cAAc,KAAK,IAAI,GAAG,OAAO;AAC5D,QAAM,SAAS,KAAK,IAAI,aAAa,OAAO,UAAU;AAEtD,QAAM,SAAS,UAAU,MAAM,KAAK,OAAO;AAC3C,SAAO,KAAK,MAAM,MAAM;AAC1B;AAEA,SAAS,YAAY,QAAyB;AAC5C,SAAO,WAAW,OAAO,UAAU;AACrC;AAIO,IAAM,gBAAN,MAAoB;AAAA,EACR;AAAA,EAEjB,YAAY,SAA+B;AACzC,SAAK,OAAO;AAAA,MACV,GAAG;AAAA,MACH,SAAS,QAAQ,QAAQ,QAAQ,OAAO,EAAE;AAAA,IAC5C;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,IAAO,MAAc,UAA+B;AACxD,WAAO,KAAK,QAAW,OAAO,MAAM,QAAW,QAAQ;AAAA,EACzD;AAAA;AAAA,EAGA,MAAM,KAAQ,MAAc,MAAe,UAA+B;AACxE,WAAO,KAAK,QAAW,QAAQ,MAAM,MAAM,QAAQ;AAAA,EACrD;AAAA;AAAA,EAGA,MAAM,IAAO,MAAc,MAAe,UAA+B;AACvE,WAAO,KAAK,QAAW,OAAO,MAAM,MAAM,QAAQ;AAAA,EACpD;AAAA;AAAA,EAGA,MAAM,OAAU,MAAc,UAA+B;AAC3D,WAAO,KAAK,QAAW,UAAU,MAAM,QAAW,QAAQ;AAAA,EAC5D;AAAA;AAAA,EAGA,MAAc,QACZ,QACA,MACA,MACA,kBACY;AACZ,UAAM,MAAM,GAAG,KAAK,KAAK,OAAO,GAAG,IAAI;AACvC,UAAM,YAAY,kBAAkB;AACpC,UAAM,WAAW,oBAAoB,KAAK,KAAK;AAE/C,UAAM,UAAkC;AAAA,MACtC,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,GAAG,KAAK,KAAK;AAAA,IACf;AAEA,QAAI,SAAS,QAAW;AACtB,cAAQ,cAAc,IAAI;AAAA,IAC5B;AAGA,QAAI,KAAK,KAAK,QAAQ;AACpB,cAAQ,eAAe,IAAI,UAAU,KAAK,KAAK,MAAM;AAAA,IACvD,WAAW,KAAK,KAAK,OAAO;AAC1B,cAAQ,eAAe,IAAI,UAAU,KAAK,KAAK,KAAK;AAAA,IACtD;AAEA,UAAM,YAAyB;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,MAAM,SAAS,SAAY,KAAK,UAAU,IAAI,IAAI;AAAA,IACpD;AAEA,QAAI;AAEJ,aAAS,UAAU,GAAG,WAAW,KAAK,KAAK,MAAM,YAAY,WAAW;AACtE,UAAI;AACF,cAAM,WAAW,MAAM,KAAK,iBAAiB,KAAK,SAAS;AAE3D,YAAI,SAAS,IAAI;AACf,gBAAM,OAAO,MAAM,SAAS,KAAK;AACjC,cAAI,CAAC,KAAM,QAAO;AAClB,gBAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,iBAAO,SAAY,MAAM;AAAA,QAC3B;AAGA,cAAM,eAAe,MAAM,SAAS,KAAK;AAGzC,YAAI,SAAS,WAAW,KAAK;AAC3B,gBAAM,gBAAgB,SAAS,QAAQ,IAAI,aAAa;AACxD,gBAAM,iBAAiB,gBAAgB,SAAS,eAAe,EAAE,IAAI;AACrE,cAAI,UAAU,KAAK,KAAK,MAAM,YAAY;AACxC,kBAAM,QAAQ,iBAAiB,IAC3B,iBAAiB,MACjB,aAAa,SAAS,KAAK,KAAK,KAAK;AACzC,kBAAM,MAAM,KAAK;AACjB,wBAAY,cAAc,SAAS,QAAQ,cAAc,WAAW,kBAAkB,MAAS;AAC/F;AAAA,UACF;AAEA,gBAAM,cAAc,SAAS,QAAQ,cAAc,WAAW,kBAAkB,MAAS;AAAA,QAC3F;AAGA,YAAI,YAAY,SAAS,MAAM,KAAK,UAAU,KAAK,KAAK,MAAM,YAAY;AACxE,sBAAY,cAAc,SAAS,QAAQ,cAAc,SAAS;AAClE,gBAAM,MAAM,aAAa,SAAS,KAAK,KAAK,KAAK,CAAC;AAClD;AAAA,QACF;AAGA,cAAM,cAAc,SAAS,QAAQ,cAAc,SAAS;AAAA,MAC9D,SAAS,OAAO;AAEd,YAAI,iBAAiB,SAAS,MAAM,KAAK,WAAW,WAAW,GAAG;AAChE,cACE,CAAE,MAAkC,aACpC,WAAW,KAAK,KAAK,MAAM,YAC3B;AACA,kBAAM;AAAA,UACR;AACA,sBAAY;AACZ,gBAAM,MAAM,aAAa,SAAS,KAAK,KAAK,KAAK,CAAC;AAClD;AAAA,QACF;AAGA,YAAI,iBAAiB,aAAa,iBAAiB,cAAc;AAC/D,sBAAY,IAAI;AAAA,YACd,kBAAmB,MAAgB,OAAO;AAAA,YAC1C,EAAE,OAAO,MAAe;AAAA,UAC1B;AACA,cAAI,UAAU,KAAK,KAAK,MAAM,YAAY;AACxC,kBAAM,MAAM,aAAa,SAAS,KAAK,KAAK,KAAK,CAAC;AAClD;AAAA,UACF;AACA,gBAAM;AAAA,QACR;AAGA,cAAM;AAAA,MACR;AAAA,IACF;AAGA,UAAM,aAAa,IAAI,sBAAsB,kCAAkC;AAAA,EACjF;AAAA;AAAA,EAGA,MAAc,iBACZ,KACA,MACmB;AACnB,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,YAAY;AAAA,MAChB,MAAM,WAAW,MAAM;AAAA,MACvB,KAAK,KAAK;AAAA,IACZ;AAGA,QAAI,KAAK,KAAK,QAAQ;AACpB,WAAK,KAAK,OAAO,iBAAiB,SAAS,MAAM,WAAW,MAAM,CAAC;AAAA,IACrE;AAEA,QAAI;AACF,aAAO,MAAM,KAAK,KAAK,UAAU,KAAK;AAAA,QACpC,GAAG;AAAA,QACH,QAAQ,WAAW;AAAA,MACrB,CAAC;AAAA,IACH,SAAS,OAAO;AACd,UACE,iBAAiB,gBACjB,MAAM,SAAS,gBACf,CAAC,KAAK,KAAK,QAAQ,SACnB;AACA,cAAM,IAAI,sBAAsB,KAAK,KAAK,SAAS;AAAA,MACrD;AACA,YAAM;AAAA,IACR,UAAE;AACA,mBAAa,SAAS;AAAA,IACxB;AAAA,EACF;AACF;;;ACnQO,IAAK,gBAAL,kBAAKA,mBAAL;AAEL,EAAAA,eAAA,UAAO;AAEP,EAAAA,eAAA,YAAS;AAET,EAAAA,eAAA,UAAO;AAEP,EAAAA,eAAA,YAAS;AAET,EAAAA,eAAA,cAAW;AAEX,EAAAA,eAAA,aAAU;AAEV,EAAAA,eAAA,WAAQ;AAER,EAAAA,eAAA,WAAQ;AAhBE,SAAAA;AAAA,GAAA;AA4BZ,IAAM,uBAA2C;AAAA,EAC/C,CAAC,YAAY,gBAAgB;AAAA,EAC7B,CAAC,aAAa,uBAAuB;AAAA,EACrC,CAAC,aAAa,0BAA0B;AAAA,EACxC,CAAC,aAAa,0BAA0B;AAAA,EACxC,CAAC,aAAa,yBAAyB;AAAA,EACvC,CAAC,aAAa,yBAAyB;AAAA,EACvC,CAAC,aAAa,yBAAyB;AAAA,EACvC,CAAC,aAAa,yBAAyB;AAAA,EACvC,CAAC,aAAa,uBAAuB;AAAA,EACrC,CAAC,aAAa,2BAA2B;AAAA,EACzC,CAAC,YAAY,qBAAqB;AAAA,EAClC,CAAC,YAAY,iBAAiB;AAAA,EAC9B,CAAC,aAAa,UAAU;AAAA,EACxB,CAAC,YAAY,QAAQ;AAAA,EACrB,CAAC,YAAY,QAAQ;AACvB;AAEO,SAAS,QAAQ,QAAgC,YAA4B;AAClF,MAAI,WAAW;AAEf,MAAI,WAAW,qBAAsB,WAAW,QAAQ;AACtD,eAAW,CAAC,SAAS,WAAW,KAAK,sBAAsB;AACzD,iBAAW,SAAS,QAAQ,SAAS,WAAW;AAAA,IAClD;AAAA,EACF;AACA,QAAM,aAAa,SAAS,YAAY,EAAE,QAAQ,QAAQ,GAAG;AAC7D,SAAO,GAAG,MAAM,IAAI,UAAU;AAChC;AAOO,IAAK,oBAAL,kBAAKC,uBAAL;AACL,EAAAA,mBAAA,UAAO;AACP,EAAAA,mBAAA,eAAY;AACZ,EAAAA,mBAAA,UAAO;AACP,EAAAA,mBAAA,WAAQ;AACR,EAAAA,mBAAA,gBAAa;AACb,EAAAA,mBAAA,UAAO;AACP,EAAAA,mBAAA,gBAAa;AACb,EAAAA,mBAAA,WAAQ;AARE,SAAAA;AAAA,GAAA;AAiBL,IAAK,gBAAL,kBAAKC,mBAAL;AACL,EAAAA,eAAA,eAAY;AACZ,EAAAA,eAAA,qBAAkB;AAClB,EAAAA,eAAA,gBAAa;AAHH,SAAAA;AAAA,GAAA;AASL,IAAK,iBAAL,kBAAKC,oBAAL;AACL,EAAAA,gBAAA,YAAS;AACT,EAAAA,gBAAA,mBAAgB;AAChB,EAAAA,gBAAA,WAAQ;AACR,EAAAA,gBAAA,cAAW;AACX,EAAAA,gBAAA,aAAU;AALA,SAAAA;AAAA,GAAA;AAWL,IAAK,mBAAL,kBAAKC,sBAAL;AACL,EAAAA,kBAAA,eAAY;AACZ,EAAAA,kBAAA,iBAAc;AACd,EAAAA,kBAAA,gBAAa;AACb,EAAAA,kBAAA,aAAU;AACV,EAAAA,kBAAA,UAAO;AACP,EAAAA,kBAAA,gBAAa;AACb,EAAAA,kBAAA,gBAAa;AACb,EAAAA,kBAAA,gBAAa;AACb,EAAAA,kBAAA,cAAW;AACX,EAAAA,kBAAA,yBAAsB;AAVZ,SAAAA;AAAA,GAAA;AAgBL,IAAK,kBAAL,kBAAKC,qBAAL;AACL,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,aAAU;AACV,EAAAA,iBAAA,kBAAe;AACf,EAAAA,iBAAA,qBAAkB;AAJR,SAAAA;AAAA,GAAA;AAUL,IAAK,kBAAL,kBAAKC,qBAAL;AACL,EAAAA,iBAAA,UAAO;AACP,EAAAA,iBAAA,iBAAc;AACd,EAAAA,iBAAA,gBAAa;AACb,EAAAA,iBAAA,cAAW;AACX,EAAAA,iBAAA,cAAW;AALD,SAAAA;AAAA,GAAA;AAYL,IAAM,aAAa;AAAA,EACxB,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAYO,IAAK,kBAAL,kBAAKC,qBAAL;AAEL,EAAAA,iBAAA,gBAAa;AAEb,EAAAA,iBAAA,aAAU;AAEV,EAAAA,iBAAA,eAAY;AAEZ,EAAAA,iBAAA,gBAAa;AAEb,EAAAA,iBAAA,gBAAa;AAEb,EAAAA,iBAAA,mBAAgB;AAEhB,EAAAA,iBAAA,uBAAoB;AAEpB,EAAAA,iBAAA,aAAU;AAEV,EAAAA,iBAAA,iBAAc;AAEd,EAAAA,iBAAA,oBAAiB;AApBP,SAAAA;AAAA,GAAA;AA0BL,IAAK,qBAAL,kBAAKC,wBAAL;AACL,EAAAA,oBAAA,kBAAe;AACf,EAAAA,oBAAA,gBAAa;AACb,EAAAA,oBAAA,cAAW;AACX,EAAAA,oBAAA,kBAAe;AACf,EAAAA,oBAAA,gBAAa;AALH,SAAAA;AAAA,GAAA;AAWL,IAAM,oBAAoB;AAAA,EAC/B,GAAG;AAAA,EACH,GAAG;AACL;AAQO,IAAK,kBAAL,kBAAKC,qBAAL;AAEL,EAAAA,iBAAA,eAAY;AAEZ,EAAAA,iBAAA,UAAO;AAEP,EAAAA,iBAAA,cAAW;AAEX,EAAAA,iBAAA,SAAM;AARI,SAAAA;AAAA,GAAA;AAYL,IAAM,mBAAoD;AAAA,EAC/D,CAAC,2BAAyB,GAAG;AAAA,EAC7B,CAAC,iBAAoB,GAAG;AAAA,EACxB,CAAC,yBAAwB,GAAG;AAAA,EAC5B,CAAC,eAAmB,GAAG;AACzB;AAGO,SAAS,kBAAkB,OAAyC;AACzE,SAAO,iBAAiB,KAAwB,KAAK;AACvD;AAGO,SAAS,kBAAkB,OAAgC;AAChE,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI,SAAS,IAAM,QAAO;AAC1B,MAAI,SAAS,IAAM,QAAO;AAC1B,SAAO;AACT;AAYO,IAAM,yBAAyB,oBAAI,IAAY;AAAA;AAAA,EAEpD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AACF,CAAC;AAMM,IAAM,wBAAgD;AAAA;AAAA,EAE3D,CAAC,6BAA0B,GAAG;AAAA,EAC9B,CAAC,uBAAuB,GAAG;AAAA,EAC3B,CAAC,2BAAyB,GAAG;AAAA,EAC7B,CAAC,6BAA0B,GAAG;AAAA,EAC9B,CAAC,uBAAuB,GAAG;AAAA,EAC3B,CAAC,+BAA2B,GAAG;AAAA,EAC/B,CAAC,2CAAiC,GAAG;AAAA,EACrC,CAAC,mCAA6B,GAAG;AAAA,EACjC,CAAC,qCAA8B,GAAG;AAAA;AAAA;AAAA,EAGlC,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,aAAa;AAAA,EACb,WAAW;AAAA,EACX,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,UAAU;AACZ;AAMO,IAAM,sBAA8C;AAAA,EACzD,CAAC,6BAA0B,GAAG;AAAA,EAC9B,CAAC,uBAAuB,GAAG;AAAA,EAC3B,CAAC,2BAAyB,GAAG;AAAA,EAC7B,CAAC,6BAA0B,GAAG;AAAA,EAC9B,CAAC,mCAA6B,GAAG;AAAA,EACjC,CAAC,2CAAiC,GAAG;AAAA,EACrC,CAAC,uBAAuB,GAAG;AAAA,EAC3B,CAAC,qCAA8B,GAAG;AACpC;;;AChTO,IAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAOO,SAAS,kBAAkB,MAAkC;AAClE,MAAI,oBAAoB,SAAS,IAAwB,EAAG,QAAO;AACnE,MAAI,KAAK,WAAW,SAAS,EAAG,QAAO;AACvC,SAAO;AACT;AAQO,IAAM,sBAA8C;AAAA,EACzD,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,cAAc;AAAA,EACd,WAAW;AAAA,EACX,WAAW;AAAA,EACX,SAAS;AAAA,EACT,WAAW;AAAA,EACX,UAAU;AACZ;AAEO,SAAS,iBAAiB,YAA4B;AAC3D,SAAO,oBAAoB,UAAU,KAAK,oBAAoB;AAChE;AA+CO,IAAM,mBAAmB,oBAAI,IAAY;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,mBAAmB,oBAAI,IAAY;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;;;AC7ED,IAAM,2BAA2B,oBAAI,IAAI;AAAA,EACvC;AAAA,EAAa;AAAA,EAAe;AAAA,EAAc;AAAA,EAC1C;AAAA,EAAQ;AAAA,EAAc;AAAA,EAAc;AACtC,CAAC;AAEM,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YACU,MACA,UACR;AAFQ;AACA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBH,MAAM,OAAO,OAAsE;AACjF,QAAI,CAAC,kBAAkB,MAAM,IAAI,GAAG;AAClC,YAAM,IAAI,MAAM,wBAAwB,MAAM,IAAI,iBAAiB,oBAAoB,KAAK,IAAI,CAAC,4BAA4B;AAAA,IAC/H;AAEA,UAAM,cAAc,2BAA4B,MAAM,MAAM;AAC5D,UAAM,YAAY,UAAU,MAAM,IAAI;AACtC,UAAM,QAAQ;AAAA,MACZ,SAAS,MAAM;AAAA,MACf,WAAW,MAAM,aAAa;AAAA,MAC9B,eAAe,MAAM,gBAAgB;AAAA,MACrC,YAAY,MAAM,aAAa;AAAA,IACjC;AAEA,UAAM,SAAS,MAAM,KAAK,KAAK,KAAgB,sBAAsB;AAAA,MACnE,WAAW,KAAK;AAAA,MAChB,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA,YAAY,MAAM,aAAa;AAAA,IACjC,CAAC;AAGD,QAAI,WAAW;AACf,QAAI,MAAM,sBAAsB,iBAAiB,IAAI,MAAM,IAAI,GAAG;AAChE,UAAI;AACF,cAAM,WAAW,MAAM,KAAK,MAAM,aAAa,EAAE,aAAa,GAAG,CAAC;AAClE,mBAAW,OAAO,SAAS,SAAS;AAClC,cAAI,CAAC,iBAAiB,IAAI,IAAI,IAAI,EAAG;AACrC,cAAI,IAAI,WAAY;AACpB,gBAAM,cAAc,MAAM,eACtB,IAAI,iBAAiB,MAAM,eAC3B,CAAC,IAAI;AACT,cAAI,aAAa;AACf,kBAAM,KAAK,QAAQ,EAAE,UAAU,IAAI,IAAI,oBAAoB,OAAO,GAAG,CAAC;AACtE;AAAA,UACF;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,WAAO,EAAE,IAAI,OAAO,IAAI,GAAI,WAAW,KAAK,EAAE,SAAS,EAAG;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,MAAM,aAAqB,UAA8B,CAAC,GAA4B;AAC1F,UAAM,cAAc,QAAQ,eAAe;AAE3C,UAAM,QAAgC,EAAE,QAAQ,OAAO,WAAW,EAAE;AACpE,QAAI,QAAQ,KAAM,OAAM,OAAO,QAAQ;AAEvC,UAAM,KAAK,IAAI,gBAAgB,KAAK,EAAE,SAAS;AAC/C,UAAM,WAAW,MAAM,KAAK,KAAK;AAAA,MAC/B,mBAAmB,IAAI,KAAK,QAAQ,CAAC,IAAI,IAAI,WAAW,CAAC,IAAI,EAAE;AAAA,IACjE;AAEA,UAAM,UAAyB,SAAS,QAAQ,IAAI,QAAM;AAAA,MACxD,IAAI,EAAE;AAAA,MACN,MAAM,EAAE;AAAA,MACR,SAAS,EAAE;AAAA,MACX,WAAW,EAAE;AAAA,MACb,kBAAkB,EAAE;AAAA,MACpB,UAAU,KAAK,MAAM,EAAE,YAAY,EAAE,IAAI;AAAA,MACzC,cAAc,EAAE,iBAAiB;AAAA,MACjC,YAAY,EAAE,eAAe;AAAA,MAC7B,WAAW,EAAE;AAAA,IACf,EAAE;AAEF,WAAO;AAAA,MACL;AAAA,MACA,YAAY,SAAS;AAAA,MACrB,oBAAoB,SAAS;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,QAAQ,OAA0D;AAEtE,UAAM,WAAW,MAAM,KAAK,KAAK;AAAA,MAC/B,sBAAsB,IAAI,KAAK,QAAQ,CAAC,IAAI,IAAI,MAAM,QAAQ,CAAC;AAAA,IACjE,EAAE,MAAM,MAAM,IAAI;AAElB,QAAI,CAAC,SAAU,QAAO,EAAE,SAAS,MAAM;AAEvC,UAAM,QAAQ,OAAO,SAAS,UAAU,YAAY,SAAS,UAAU,OACnE,EAAE,GAAI,SAAS,OAAmC,aAAa,MAAM,mBAAmB,IACxF,EAAE,SAAS,OAAO,SAAS,KAAK,GAAG,aAAa,MAAM,mBAAmB;AAE7E,UAAM,KAAK,KAAK,KAAK,gCAAgC;AAAA,MACnD,WAAW,KAAK;AAAA,MAChB,uBAAuB,MAAM;AAAA,MAC7B,SAAS,SAAS;AAAA,MAClB,WAAW,SAAS;AAAA,MACpB;AAAA,MACA,YAAY,SAAS;AAAA,IACvB,CAAC;AAED,WAAO,EAAE,SAAS,KAAK;AAAA,EACzB;AACF;AAWO,SAAS,aACd,WACA,UACA,eACA,aAAsB,OACd;AACR,QAAM,oBAAoB,aAAa,gBAAgB,IAAI;AAC3D,QAAM,UAAU,YAAY,KAAK,IAAI,GAAG,CAAC,WAAW,iBAAiB;AACrE,SAAO,KAAK,MAAM,UAAU,GAAG,IAAI;AACrC;AAQO,SAAS,eACd,YACA,cAAsB,IACP;AACf,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,WAAW,cAAc,KAAK,KAAK;AACzC,QAAM,UAAyB,CAAC;AAEhC,aAAW,KAAK,YAAY;AAC1B,QAAI,EAAE,aAAc;AACpB,UAAM,WAAW,EAAE,UAAU,WAAW,SAAS;AACjD,UAAM,WAAW,yBAAyB,IAAI,EAAE,SAAS;AACzD,QAAI,CAAC,YAAY,CAAC,SAAU;AAE5B,UAAM,YAAY,EAAE;AACpB,UAAM,QAAQ,MAAM,IAAI,KAAK,SAAS,EAAE,QAAQ;AAChD,QAAI,QAAQ,SAAU;AAEtB,UAAM,WAAW,SAAS,KAAK,KAAK;AACpC,UAAM,OAAO,WAAW,EAAE,UAAU,MAAM,CAAC,IAAI,EAAE;AACjD,UAAM,WAAW,iBAAiB,IAAI;AAEtC,QAAI,UAAU;AACd,QAAI,YAAY,EAAE,cAAc;AAChC,QAAI;AACJ,QAAI;AAEJ,QAAI,OAAO,EAAE,UAAU,YAAY,EAAE,UAAU,MAAM;AACnD,YAAM,IAAI,EAAE;AACZ,gBAAW,EAAE,WAAsB;AACnC,kBAAa,EAAE,aAAwB;AACvC,qBAAgB,EAAE,iBAA4B;AAC9C,mBAAc,EAAE,eAA0B;AAAA,IAC5C,OAAO;AACL,gBAAU,OAAO,EAAE,KAAK;AAAA,IAC1B;AAEA,YAAQ,KAAK;AAAA,MACX,IAAI,EAAE;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,kBAAkB,aAAa,WAAW,UAAU,UAAU,CAAC,CAAC,UAAU;AAAA,MAC1E,UAAU,KAAK,MAAM,WAAW,EAAE,IAAI;AAAA,MACtC;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,UAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ;AAC9C,SAAO;AACT;AAEA,SAAS,IAAI,GAAmB;AAC9B,SAAO,mBAAmB,CAAC;AAC7B;;;ACtPO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YACU,MACA,UACR;AAFQ;AACA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BH,MAAM,SAAS,OAAuD;AACpE,UAAM,cAAc,2BAA4B,MAAM,MAAM;AAG5D,UAAM,aAAa,MAAM,KAAK,KAAK;AAAA,MACjC,4BAA4BC,KAAI,KAAK,QAAQ,CAAC,IAAIA,KAAI,WAAW,CAAC;AAAA,IACpE;AAEA,UAAM,SAAS,WAAW,OAAO,OAAK,CAAC,EAAE,YAAY;AACrD,UAAM,UAAU,OAAO,SAAS;AAGhC,QAAI,MAAM,eAAe,CAAC,OAAO,KAAK,OAAK,EAAE,cAAc,UAAU,EAAE,cAAc,WAAW,GAAG;AACjG,UAAI;AACF,cAAM,KAAK,KAAK,KAAK,sBAAsB;AAAA,UACzC,WAAW,KAAK;AAAA,UAChB,SAAS;AAAA,UACT,WAAW;AAAA,UACX,OAAO,MAAM;AAAA,UACb,YAAY;AAAA,QACd,CAAC;AAAA,MACH,QAAQ;AAAA,MAAoB;AAAA,IAC9B;AAGA,UAAM,gBAAgB,OAAO,KAAK,OAAK,EAAE,cAAc,UAAU,EAAE,cAAc,WAAW;AAC5F,UAAM,OAAQ,eAAe,SAAoB,MAAM,eAAe;AAGtE,UAAM,YAA0B,OAC7B,OAAO,OAAK,EAAE,cAAc,UAAU,EACtC,IAAI,QAAM,EAAE,IAAI,EAAE,IAAI,WAAW,EAAE,WAAW,OAAO,EAAE,OAAO,YAAY,EAAE,YAAY,WAAW,EAAE,UAAU,EAAE;AAKpH,eAAW,YAAY,WAAW;AAChC,UAAI;AACF,cAAM,KAAK,KAAK;AAAA,UACd,8BAA8BA,KAAI,KAAK,QAAQ,CAAC,IAAIA,KAAI,SAAS,EAAE,CAAC;AAAA,UACpE,CAAC;AAAA,QACH;AAAA,MACF,QAAQ;AAAA,MAA0D;AAAA,IACpE;AAEA,UAAM,WAAyB,OAC5B,OAAO,OAAK,EAAE,cAAc,aAAa,EAAE,cAAc,cAAc,EACvE,IAAI,QAAM,EAAE,IAAI,EAAE,IAAI,WAAW,EAAE,WAAW,OAAO,EAAE,OAAO,YAAY,EAAE,YAAY,WAAW,EAAE,UAAU,EAAE;AAGpH,UAAM,UAAU,eAAe,UAAU;AACzC,UAAM,YAAY,IAAI,IAAI,QAAQ,IAAI,OAAK,EAAE,EAAE,CAAC;AAGhD,QAAI,oBAAgC;AACpC,QAAI;AACF,YAAM,KAAK,IAAI,gBAAgB,EAAE,QAAQ,KAAK,CAAC,EAAE,SAAS;AAC1D,YAAM,WAAW,MAAM,KAAK,KAAK;AAAA,QAC/B,mBAAmBA,KAAI,KAAK,QAAQ,CAAC,IAAIA,KAAI,WAAW,CAAC,IAAI,EAAE;AAAA,MACjE;AACA,0BAAoB,SAAS;AAAA,IAC/B,QAAQ;AAAA,IAA0C;AAElD,UAAM,WAAyB,OAC5B;AAAA,MAAO,OACN,EAAE,cAAc,cAChB,EAAE,cAAc,aAChB,EAAE,cAAc,kBAChB,CAAC,UAAU,IAAI,EAAE,EAAE;AAAA;AAAA,IACrB,EACC,IAAI,QAAM,EAAE,IAAI,EAAE,IAAI,WAAW,EAAE,WAAW,OAAO,EAAE,OAAO,YAAY,EAAE,YAAY,WAAW,EAAE,UAAU,EAAE;AAGpH,UAAM,kBAAqC,CAAC;AAC5C,QAAI;AACF,YAAM,gBAAgB,MAAM,KAAK,KAAK,IAElC,yBAAyBA,KAAI,KAAK,QAAQ,CAAC,IAAIA,KAAI,WAAW,CAAC,EAAE;AAErE,YAAM,UAAU,oBAAI,IAAY;AAChC,iBAAW,OAAO,eAAe;AAC/B,cAAM,QAAQ,IAAI,gBAAgB,cAAc,IAAI,YAAY,IAAI;AACpE,YAAI,CAAC,SAAS,UAAU,eAAe,QAAQ,IAAI,KAAK,EAAG;AAC3D,gBAAQ,IAAI,KAAK;AAEjB,cAAM,mBAAmB,MAAM,KAAK,KAAK;AAAA,UACvC,4BAA4BA,KAAI,KAAK,QAAQ,CAAC,IAAIA,KAAI,KAAK,CAAC;AAAA,QAC9D;AACA,cAAM,eAAe,iBAAiB,OAAO,OAAK,CAAC,EAAE,YAAY;AACjE,cAAM,aAAa,aAAa,KAAK,OAAK,EAAE,cAAc,MAAM;AAChE,cAAM,QAAQ,aACX,OAAO,OAAK,EAAE,cAAc,MAAM,EAClC,IAAI,QAAM,EAAE,WAAW,EAAE,WAAW,OAAO,EAAE,MAAM,EAAE;AAExD,wBAAgB,KAAK;AAAA,UACnB,SAAS;AAAA,UACT,MAAO,YAAY,SAAoB;AAAA,UACvC,cAAc,IAAI;AAAA,UAClB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,QAAQ;AAAA,IAAqB;AAG7B,UAAM,YAA4B,CAAC;AACnC,QAAI;AACF,UAAI,CAAC,MAAM,QAAS,OAAM,IAAI,MAAM,6DAA6D;AACjG,YAAM,UAAU,MAAM,KAAK,KAAK,IAG5B,0BAA0BA,KAAI,MAAM,OAAO,CAAC,2BAA2B;AAE3E,iBAAW,QAAQ,SAAS;AAC1B,YAAI,KAAK,aAAc;AAGvB,cAAM,OAAO,KAAK,iBAAiB;AACnC,cAAM,eAAe,KAAK,SAAS,WAAW,MACxC,KAAK,yBAAyB,CAAC,GAAG,KAAK,QAAM;AAE/C,gBAAM,IAAI,WAAW,KAAK,QAAM,GAAG,OAAO,EAAE;AAC5C,iBAAO,GAAG,YAAY;AAAA,QACxB,CAAC;AAEH,YAAI,CAAC,aAAc;AAEnB,YAAI,eAAe,QAAQ;AAC3B,YAAI,MAAM;AACR,yBAAe,aAAa;AAAA,YAC1B,IAAI,OAAO,YAAY,QAAQ,uBAAuB,MAAM,GAAG,GAAG;AAAA,YAChE;AAAA,UACF;AAAA,QACF;AACF,kBAAU,KAAK,EAAE,IAAI,KAAK,IAAI,MAAM,aAAa,CAAC;AAAA,MACpD;AAAA,IACF,QAAQ;AAAA,IAAqB;AAG7B,UAAM,QAAkB,CAAC;AACzB,QAAI,UAAU,SAAS,GAAG;AACxB,YAAM,KAAK,cAAc,UAAU,MAAM,+CAA0C,UAAU,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,KAAK,CAAC,EAAE;AAAA,IAC7H;AACA,QAAI,UAAU,SAAS,GAAG;AACxB,YAAM,KAAK,cAAc,UAAU,MAAM,MAAM,UAAU,IAAI,OAAK,IAAI,EAAE,KAAK,GAAG,EAAE,KAAK,IAAI,CAAC,iCAAiC;AAAA,IAC/H;AACA,QAAI,gBAAgB,SAAS,GAAG;AAC9B,YAAM,KAAK;AAAA,EAAsB,gBAAgB,IAAI,OAAK;AACxD,cAAM,WAAW,EAAE,MAAM,IAAI,OAAK,GAAG,EAAE,SAAS,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,IAAI;AACzE,eAAO,KAAK,EAAE,IAAI,KAAK,EAAE,YAAY,IAAI,WAAW,OAAO,WAAW,EAAE;AAAA,MAC1E,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,IACjB;AACA,QAAI,SAAS,SAAS,KAAK,MAAM,WAAW,GAAG;AAC7C,YAAM,KAAK,YAAY,SAAS,MAAM,0BAA0B;AAAA,IAClE;AACA,QAAI,MAAM,WAAW,GAAG;AACtB,YAAM,KAAK,8DAAyD;AAAA,IACtE;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,MAAM,KAAK,IAAI;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,eAAe,OAA2D;AAC9E,UAAM,cAAc,2BAA4B,MAAM,MAAM;AAC5D,UAAM,gBAAgB,+BAA8B,MAAM,IAAI;AAC9D,UAAM,OAAO,OAAO,MAAM,eAAe,WACrC,MAAM,aACN,kBAAkB,MAAM,yCAAuC;AAEnE,QAAI,oBAAoB;AACxB,QAAI,uBAAuB;AAC3B,UAAM,WAAqB,CAAC;AAG5B,UAAM,KAAK,KAAK,KAAK,sBAAsB;AAAA,MACzC,WAAW,KAAK;AAAA,MAAU,SAAS;AAAA,MAAe,WAAW;AAAA,MAAQ,OAAO,MAAM;AAAA,MAAM,YAAY;AAAA,IACtG,CAAC;AACD;AAGA,QAAI,MAAM,MAAM;AAEd,UAAI;AACF,cAAM,WAAW,MAAM,KAAK,KAAK;AAAA,UAC/B,4BAA4BA,KAAI,KAAK,QAAQ,CAAC,IAAIA,KAAI,aAAa,CAAC;AAAA,QACtE;AACA,cAAM,eAAe,SAAS,KAAK,OAAK,EAAE,cAAc,UAAU,CAAC,EAAE,YAAY;AACjF,YAAI,gBAAgB,aAAa,UAAU,MAAM,MAAM;AACrD,mBAAS,KAAK,GAAG,MAAM,IAAI,oBAAoB,aAAa,KAAK,8BAAyB,MAAM,IAAI,4BAA4B;AAChI,gBAAM,KAAK,KAAK,KAAK,gCAAgC;AAAA,YACnD,WAAW,KAAK;AAAA,YAAU,uBAAuB,aAAa;AAAA,YAC9D,SAAS;AAAA,YAAe,WAAW;AAAA,YAAQ,OAAO,MAAM;AAAA,YAAM,YAAY;AAAA,UAC5E,CAAC;AAAA,QACH,WAAW,CAAC,cAAc;AACxB,gBAAM,KAAK,KAAK,KAAK,sBAAsB;AAAA,YACzC,WAAW,KAAK;AAAA,YAAU,SAAS;AAAA,YAAe,WAAW;AAAA,YAAQ,OAAO,MAAM;AAAA,YAAM,YAAY;AAAA,UACtG,CAAC;AAAA,QACH;AAAA,MACF,QAAQ;AACN,cAAM,KAAK,KAAK,KAAK,sBAAsB;AAAA,UACzC,WAAW,KAAK;AAAA,UAAU,SAAS;AAAA,UAAe,WAAW;AAAA,UAAQ,OAAO,MAAM;AAAA,UAAM,YAAY;AAAA,QACtG,CAAC;AAAA,MACH;AACA;AAGA,UAAI;AACF,cAAM,gBAAgB,MAAM,KAAK,KAAK;AAAA,UACpC,2BAA2BA,KAAI,KAAK,QAAQ,CAAC;AAAA,QAC/C;AACA,cAAM,WAAW,cAAc;AAAA,UAAO,OACpC,EAAE,QAAQ,WAAW,SAAS,KAC9B,EAAE,YAAY,iBACd,EAAE,cAAc,UAChB,EAAE,UAAU,MAAM,QAClB,CAAC,EAAE;AAAA,QACL;AACA,YAAI,SAAS,SAAS,GAAG;AACvB,gBAAM,kBAAkB,MAAM,KAAK,KAAK;AAAA,YACtC,4BAA4BA,KAAI,KAAK,QAAQ,CAAC,IAAIA,KAAI,SAAS,CAAC,EAAE,OAAO,CAAC;AAAA,UAC5E;AACA,gBAAM,YAAY,gBAAgB,KAAK,OAAK,EAAE,cAAc,MAAM,GAAG,SAAS,SAAS,CAAC,EAAE;AAC1F,mBAAS,KAAK,IAAI,MAAM,IAAI,wBAAwB,SAAS,QAAQ,SAAS,0BAA0B;AAAA,QAC1G;AAAA,MACF,QAAQ;AAAA,MAAqB;AAG7B,YAAM,cAAc,2BAA4B,MAAM,IAAI;AAC1D,YAAM,KAAK,KAAK,KAAK,sBAAsB;AAAA,QACzC,WAAW,KAAK;AAAA,QAAU,SAAS;AAAA,QAAa,WAAW;AAAA,QAAQ,OAAO,MAAM;AAAA,QAAM,YAAY;AAAA,MACpG,CAAC;AACD,YAAM,KAAK,KAAK,KAAK,yBAAyB;AAAA,QAC5C,WAAW,KAAK;AAAA,QAAU,cAAc;AAAA,QAAe,YAAY;AAAA,QACnE;AAAA,QAA+C,YAAY;AAAA,MAC7D,CAAC;AACD;AACA;AAAA,IACF;AAGA,QAAI,MAAM,SAAS;AACjB,YAAM,KAAK,KAAK,KAAK,sBAAsB;AAAA,QACzC,WAAW,KAAK;AAAA,QAAU,SAAS;AAAA,QAAe,WAAW;AAAA,QAAW,OAAO,MAAM;AAAA,QAAS,YAAY;AAAA,MAC5G,CAAC;AACD;AAAA,IACF;AAGA,UAAM,KAAK,KAAK,KAAK,sBAAsB;AAAA,MACzC,WAAW,KAAK;AAAA,MAAU,SAAS;AAAA,MAAe,WAAW;AAAA,MAC7D,OAAO,MAAM,iBAAiB,cAAc,cAAc;AAAA,MAAU,YAAY;AAAA,IAClF,CAAC;AACD;AAIA,UAAM,cAAsC;AAAA,MAC1C;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,cAAc,YAAY,MAAM,YAAY,KAAK,MAAM;AAC7D,UAAM,cAAc,sBAAsB,MAAM,YAAY,KAAK,sBAAsB,WAAW,KAAK,MAAM;AAG7G,UAAM,KAAK,KAAK,KAAK,yBAAyB;AAAA,MAC5C,WAAW,KAAK;AAAA,MAAU,cAAc;AAAA,MAAa,YAAY;AAAA,MACjE,mBAAmB;AAAA,MAAa,YAAY;AAAA,IAC9C,CAAC;AACD;AAGA,UAAM,KAAK,KAAK,KAAK,yBAAyB;AAAA,MAC5C,WAAW,KAAK;AAAA,MAAU,cAAc;AAAA,MAAe,YAAY;AAAA,MACnE,mBAAmB;AAAA,MAAa,YAAY;AAAA,IAC9C,CAAC;AACD;AAEA,WAAO,EAAE,eAAe,mBAAmB,sBAAsB,SAAS;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,cAAc,OAA0D;AAC5E,UAAM,cAAc,2BAA4B,MAAM,MAAM;AAC5D,UAAM,OAAO,OAAO,MAAM,eAAe,WACrC,MAAM,aACN,kBAAkB,MAAM,+BAAkC;AAE9D,UAAM,KAAK,KAAK,KAAK,sBAAsB;AAAA,MACzC,WAAW,KAAK;AAAA,MAAU,SAAS;AAAA,MACnC,WAAW,MAAM;AAAA,MAAM,OAAO,MAAM;AAAA,MAAO,YAAY;AAAA,IACzD,CAAC;AAGD,QAAI,MAAM,aAAa;AACrB,YAAM,gBAAgB,+BAA8B,MAAM,WAAW;AACrE,UAAI;AAEF,cAAM,mBAAmB,MAAM,KAAK,KAAK;AAAA,UACvC,4BAA4BA,KAAI,KAAK,QAAQ,CAAC,IAAIA,KAAI,aAAa,CAAC;AAAA,QACtE;AACA,YAAI,iBAAiB,SAAS,GAAG;AAC/B,gBAAM,KAAK,KAAK,KAAK,sBAAsB;AAAA,YACzC,WAAW,KAAK;AAAA,YAAU,SAAS;AAAA,YACnC,WAAW;AAAA,YAAY,OAAO,MAAM;AAAA,YAAO,YAAY;AAAA,UACzD,CAAC;AAAA,QACH;AAAA,MACF,QAAQ;AAAA,MAAqB;AAAA,IAC/B;AAEA,WAAO,EAAE,SAAS,KAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,QAAgB,iBAAwD;AAC5F,UAAM,cAAc,2BAA4B,MAAM;AACtD,UAAM,aAAa,MAAM,KAAK,KAAK;AAAA,MACjC,4BAA4BA,KAAI,KAAK,QAAQ,CAAC,IAAIA,KAAI,WAAW,CAAC;AAAA,IACpE;AAEA,UAAM,WAAW,WAAW;AAAA,MAC1B,OAAK,EAAE,cAAc,cAAc,CAAC,EAAE,gBACnC,EAAE,MAAiB,YAAY,EAAE,SAAS,gBAAgB,YAAY,CAAC;AAAA,IAC5E;AAEA,QAAI,UAAU;AACZ,YAAM,KAAK,KAAK,KAAK,8BAA8BA,KAAI,KAAK,QAAQ,CAAC,IAAIA,KAAI,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC;AAC/F,aAAO,EAAE,SAAS,KAAK;AAAA,IACzB;AACA,WAAO,EAAE,SAAS,MAAM;AAAA,EAC1B;AACF;AAEA,SAASA,KAAI,GAAmB;AAC9B,SAAO,mBAAmB,CAAC;AAC7B;;;ACnQO,IAAM,sBAAN,MAA0B;AAAA,EAC/B,YACU,MACA,UACR;AAFQ;AACA;AAAA,EACP;AAAA;AAAA,EAGH,MAAM,OAAO,OAAiD;AAC5D,UAAM,WAAW,MAAM,YAAY,KAAK;AACxC,WAAO,KAAK,KAAK,KAAgB,sBAAsB;AAAA,MACrD,WAAW;AAAA,MACX,SAAS,MAAM;AAAA,MACf,WAAW,MAAM;AAAA,MACjB,OAAO,MAAM;AAAA,MACb,YAAY,MAAM;AAAA,IACpB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,IAAI,aAAqB,SAAqD;AAClF,UAAM,WAAW,SAAS,YAAY,KAAK;AAC3C,WAAO,KAAK,KAAK;AAAA,MACf,sBAAsBC,KAAI,QAAQ,CAAC,IAAIA,KAAI,WAAW,CAAC;AAAA,IACzD;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,MAAMC,UAAiB,SAAuD;AAClF,UAAM,WAAW,SAAS,YAAY,KAAK;AAC3C,WAAO,KAAK,KAAK;AAAA,MACf,4BAA4BD,KAAI,QAAQ,CAAC,IAAIA,KAAIC,QAAO,CAAC;AAAA,IAC3D;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,KAAK,SAAuD;AAChE,UAAM,WAAW,SAAS,YAAY,KAAK;AAC3C,WAAO,KAAK,KAAK;AAAA,MACf,2BAA2BD,KAAI,QAAQ,CAAC;AAAA,IAC1C;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,UAAU,OAAoD;AAClE,UAAM,WAAW,MAAM,YAAY,KAAK;AACxC,WAAO,KAAK,KAAK,KAAgB,gCAAgC;AAAA,MAC/D,WAAW;AAAA,MACX,uBAAuB,MAAM;AAAA,MAC7B,SAAS,MAAM;AAAA,MACf,WAAW,MAAM;AAAA,MACjB,OAAO,MAAM;AAAA,MACb,YAAY,MAAM;AAAA,IACpB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,QAAQ,aAAqB,SAAqD;AACtF,UAAM,WAAW,SAAS,YAAY,KAAK;AAC3C,WAAO,KAAK,KAAK;AAAA,MACf,8BAA8BA,KAAI,QAAQ,CAAC,IAAIA,KAAI,WAAW,CAAC;AAAA,MAC/D,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAGO,IAAM,yBAAN,MAA6B;AAAA,EAClC,YACU,MACA,UACR;AAFQ;AACA;AAAA,EACP;AAAA;AAAA,EAGH,MAAM,OAAO,OAAuD;AAClE,UAAM,WAAW,MAAM,YAAY,KAAK;AACxC,WAAO,KAAK,KAAK,KAAmB,yBAAyB;AAAA,MAC3D,WAAW;AAAA,MACX,cAAc,MAAM;AAAA,MACpB,YAAY,MAAM;AAAA,MAClB,mBAAmB,MAAM;AAAA,MACzB,YAAY,MAAM;AAAA,MAClB,QAAQ,MAAM;AAAA,MACd,YAAY,MAAM;AAAA,IACpB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,MAAMC,UAAiB,SAA0D;AACrF,UAAM,WAAW,SAAS,YAAY,KAAK;AAC3C,WAAO,KAAK,KAAK;AAAA,MACf,yBAAyBD,KAAI,QAAQ,CAAC,IAAIA,KAAIC,QAAO,CAAC;AAAA,IACxD;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,KAAK,SAA0D;AACnE,UAAM,WAAW,SAAS,YAAY,KAAK;AAC3C,WAAO,KAAK,KAAK;AAAA,MACf,8BAA8BD,KAAI,QAAQ,CAAC;AAAA,IAC7C;AAAA,EACF;AACF;AAmMO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YACU,MACA,UACR;AAFQ;AACA;AAAA,EACP;AAAA;AAAA,EAGH,MAAM,OAAO,OAA+C;AAC1D,UAAM,WAAW,MAAM,YAAY,KAAK;AACxC,WAAO,KAAK,KAAK,KAAkB,kBAAkB;AAAA,MACnD,WAAW;AAAA,MACX,MAAM,MAAM;AAAA,MACZ,aAAa,MAAM;AAAA,MACnB,aAAa,MAAM;AAAA,MACnB,cAAc,MAAM,eAAe,OAAO,MAAM,YAAY,IAAI;AAAA,MAChE,OAAO,MAAM,QAAQ,OAAO,MAAM,KAAK,IAAI;AAAA,MAC3C,cAAc,MAAM;AAAA,MACpB,eAAe,MAAM,eAAe,OAAO,MAAM,YAAY,IAAI;AAAA,IACnE,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,IAAI,SAAiB,SAAuD;AAChF,UAAM,WAAW,SAAS,YAAY,KAAK;AAC3C,WAAO,KAAK,KAAK;AAAA,MACf,kBAAkBA,KAAI,QAAQ,CAAC,IAAIA,KAAI,OAAO,CAAC;AAAA,IACjD;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,OAAO,SAAiB,OAAyB,SAAuD;AAC5G,UAAM,WAAW,SAAS,YAAY,KAAK;AAC3C,WAAO,KAAK,KAAK;AAAA,MACf,kBAAkBA,KAAI,QAAQ,CAAC,IAAIA,KAAI,OAAO,CAAC;AAAA,MAC/C;AAAA,QACE,WAAW;AAAA,QACX,MAAM,MAAM;AAAA,QACZ,aAAa,MAAM;AAAA,QACnB,aAAa,MAAM;AAAA,QACnB,cAAc,MAAM,eAAe,OAAO,MAAM,YAAY,IAAI;AAAA,QAChE,OAAO,MAAM,QAAQ,OAAO,MAAM,KAAK,IAAI;AAAA,QAC3C,cAAc,MAAM;AAAA,QACpB,eAAe,MAAM,eAAe,OAAO,MAAM,YAAY,IAAI;AAAA,QACjE,WAAW,MAAM;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,OAAO,SAAiB,SAAgD;AAC5E,UAAM,WAAW,SAAS,YAAY,KAAK;AAC3C,UAAM,KAAK,KAAK,OAAgB,kBAAkBA,KAAI,QAAQ,CAAC,IAAIA,KAAI,OAAO,CAAC,EAAE;AAAA,EACnF;AAAA;AAAA,EAGA,MAAM,KAAK,SAAyD;AAClE,UAAM,WAAW,SAAS,YAAY,KAAK;AAC3C,WAAO,KAAK,KAAK;AAAA,MACf,uBAAuBA,KAAI,QAAQ,CAAC;AAAA,IACtC;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,gBAAgB,SAAiB,SAAgE;AACrG,UAAM,WAAW,SAAS,YAAY,KAAK;AAC3C,WAAO,KAAK,KAAK;AAAA,MACf,kBAAkBA,KAAI,QAAQ,CAAC,IAAIA,KAAI,OAAO,CAAC;AAAA,IACjD;AAAA,EACF;AACF;AAwDO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YACU,MACA,UACR;AAFQ;AACA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYH,MAAM,MAAM,OAA4D;AACtE,UAAM,WAAW,MAAM,YAAY,KAAK;AAExC,QAAI,MAAM,KAAK;AAEb,aAAO,KAAK,KAAK,KAAgB,sBAAsB;AAAA,QACrD,WAAW;AAAA,QACX,SAAS,MAAM;AAAA,QACf,WAAW,MAAM;AAAA,QACjB,OAAO,MAAM;AAAA,QACb,YAAY,MAAM;AAAA,MACpB,CAAC;AAAA,IACH;AAGA,UAAM,gBAAgB,OAAO,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAC9F,WAAO,KAAK,KAAK,KAAmB,yBAAyB;AAAA,MAC3D,gBAAgB;AAAA,MAChB,UAAU,MAAM;AAAA,MAChB,WAAW;AAAA,MACX,YAAY,CAAC;AAAA,QACX,SAAS,MAAM;AAAA,QACf,WAAW,MAAM;AAAA,QACjB,OAAO,MAAM;AAAA,QACb,mBAAmB,MAAM,cAAc;AAAA,QACvC,YAAY;AAAA,QACZ,aAAa,MAAM;AAAA,MACrB,CAAC;AAAA,MACD,SAAS,MAAM;AAAA,IACjB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,OAAOC,UAAiB,SAAuD;AACnF,UAAM,WAAW,SAAS,YAAY,KAAK;AAC3C,WAAO,KAAK,KAAK;AAAA,MACf,4BAA4BD,KAAI,QAAQ,CAAC,IAAIA,KAAIC,QAAO,CAAC;AAAA,IAC3D;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,OAAO,aAAqB,SAAqD;AACrF,UAAM,WAAW,SAAS,YAAY,KAAK;AAC3C,WAAO,KAAK,KAAK;AAAA,MACf,8BAA8BD,KAAI,QAAQ,CAAC,IAAIA,KAAI,WAAW,CAAC;AAAA,MAC/D,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAoGO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YACU,MACA,UACR;AAFQ;AACA;AAAA,EACP;AAAA;AAAA,EAGH,MAAM,OAAO,OAAgD;AAC3D,UAAM,WAAW,MAAM,YAAY,KAAK;AACxC,WAAO,KAAK,KAAK,KAAmB,yBAAyB;AAAA,MAC3D,gBAAgB,MAAM;AAAA,MACtB,UAAU,MAAM;AAAA,MAChB,WAAW;AAAA,MACX,YAAY,MAAM,WAAW,IAAI,QAAM;AAAA,QACrC,SAAS,EAAE;AAAA,QACX,WAAW,EAAE;AAAA,QACb,OAAO,EAAE;AAAA,QACT,mBAAmB,EAAE;AAAA,QACrB,YAAY,EAAE;AAAA,QACd,aAAa,EAAE;AAAA,QACf,YAAY,EAAE;AAAA,QACd,aAAa,EAAE;AAAA,MACjB,EAAE;AAAA,MACF,SAAS,MAAM;AAAA,IACjB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,QAAQ,SAAiB,SAGG;AAChC,QAAI,OAAO,0BAA0BA,KAAI,OAAO,CAAC;AACjD,UAAM,SAAmB,CAAC;AAC1B,QAAI,SAAS,OAAQ,QAAO,KAAK,UAAU,QAAQ,OAAO,KAAK,GAAG,CAAC,EAAE;AACrE,QAAI,SAAS,MAAO,QAAO,KAAK,SAAS,QAAQ,KAAK,EAAE;AACxD,QAAI,OAAO,OAAQ,SAAQ,IAAI,OAAO,KAAK,GAAG,CAAC;AAE/C,WAAO,KAAK,KAAK,IAA0B,IAAI;AAAA,EACjD;AAAA;AAAA,EAGA,MAAM,YAAY,QAA+B;AAC/C,UAAM,KAAK,KAAK,KAAc,8BAA8BA,KAAI,MAAM,CAAC,IAAI,CAAC,CAAC;AAAA,EAC/E;AAAA;AAAA,EAGA,MAAM,eAAe,SAAoD;AACvE,WAAO,KAAK,KAAK;AAAA,MACf,kCAAkCA,KAAI,OAAO,CAAC;AAAA,MAC9C,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,MAAM,SAAuC;AACjD,WAAO,KAAK,KAAK,IAAiB,wBAAwBA,KAAI,OAAO,CAAC,EAAE;AAAA,EAC1E;AACF;AAIA,IAAM,gBAA6B;AAAA,EACjC,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,YAAY;AACd;AAEO,IAAM,kBAAN,MAAsB;AAAA;AAAA,EAElB;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EAEQ;AAAA,EAEjB,YAAY,SAAiC;AAC3C,QAAI,CAAC,QAAQ,UAAU,CAAC,QAAQ,OAAO;AACrC,cAAQ,KAAK,kFAA6E;AAAA,IAC5F;AAEA,SAAK,OAAO,IAAI,cAAc;AAAA,MAC5B,SAAS,QAAQ;AAAA,MACjB,UAAU,QAAQ;AAAA,MAClB,QAAQ,QAAQ;AAAA,MAChB,OAAO,QAAQ;AAAA,MACf,OAAO,EAAE,GAAG,eAAe,GAAG,QAAQ,MAAM;AAAA,MAC5C,WAAW,QAAQ,aAAa;AAAA,MAChC,WAAW,QAAQ,SAAS,WAAW;AAAA,MACvC,SAAS,QAAQ,WAAW,CAAC;AAAA,MAC7B,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAED,SAAK,aAAa,IAAI,oBAAoB,KAAK,MAAM,QAAQ,QAAQ;AACrE,SAAK,gBAAgB,IAAI,uBAAuB,KAAK,MAAM,QAAQ,QAAQ;AAC3E,SAAK,SAAS,IAAI,gBAAgB,KAAK,MAAM,QAAQ,QAAQ;AAC7D,SAAK,SAAS,IAAI,gBAAgB,KAAK,MAAM,QAAQ,QAAQ;AAC7D,SAAK,SAAS,IAAI,gBAAgB,KAAK,MAAM,QAAQ,QAAQ;AAC7D,SAAK,QAAQ,IAAI,eAAe,KAAK,MAAM,QAAQ,QAAQ;AAC3D,SAAK,UAAU,IAAI,iBAAiB,KAAK,MAAM,QAAQ,QAAQ;AAAA,EACjE;AAAA;AAAA,EAGA,MAAM,SAAkC;AACtC,WAAO,KAAK,KAAK,IAAoB,SAAS;AAAA,EAChD;AACF;AAKA,SAASA,KAAI,GAAmB;AAC9B,SAAO,mBAAmB,CAAC;AAC7B;;;AC52BO,IAAM,yBAAyB;AA0B/B,SAAS,cAAc,MAA0B,UAAgC,CAAC,GAAW;AAClG,QAAM,SAAS,QAAQ,UAAU;AACjC,UAAQ,QAAQ;AAAA,IACd,KAAK;AAAO,aAAO,aAAa,MAAM,OAAO;AAAA,IAC7C,KAAK;AAAQ,aAAO,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,IAChD,KAAK;AAAW,aAAO,KAAK;AAAA,EAC9B;AACF;AAMO,SAAS,aAAa,MAA0B,UAAgC,CAAC,GAAW;AACjG,QAAM;AAAA,IACJ,kBAAkB;AAAA,IAClB,uBAAuB;AAAA,IACvB,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,IAClB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,EAClB,IAAI;AAEJ,QAAM,MAAK,oBAAI,KAAK,GAAE,YAAY;AAClC,QAAM,QAAkB,CAAC;AAGzB,QAAM,iBAAiB,oBAAI,IAA2B;AACtD,QAAM,oBAAmC,CAAC;AAC1C,MAAI,kBAAkB,KAAK,SAAS;AAClC,eAAW,OAAO,KAAK,SAAS;AAC9B,UAAI,IAAI,cAAc;AACpB,cAAM,WAAW,eAAe,IAAI,IAAI,YAAY,KAAK,CAAC;AAC1D,iBAAS,KAAK,GAAG;AACjB,uBAAe,IAAI,IAAI,cAAc,QAAQ;AAAA,MAC/C,OAAO;AACL,0BAAkB,KAAK,GAAG;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,QAAM,KAAK,+BAA+B,sBAAsB,cAAc,IAAI,KAAK,OAAO,CAAC,YAAY,KAAK,OAAO,SAAS,EAAE,IAAI;AAGtI,MAAI,oBAAoB,KAAK,UAAU,SAAS,GAAG;AACjD,UAAM,KAAK,uBAAuB,KAAK,UAAU,MAAM,wBAAwB;AAC/E,eAAW,YAAY,KAAK,WAAW;AACrC,YAAM,KAAK,qBAAqB,IAAI,SAAS,EAAE,CAAC,KAAK,IAAI,SAAS,IAAI,CAAC,aAAa;AAAA,IACtF;AACA,UAAM,KAAK,gBAAgB;AAAA,EAC7B;AAGA,MAAI,oBAAoB,KAAK,UAAU,SAAS,GAAG;AACjD,UAAM,KAAK,uBAAuB,KAAK,UAAU,MAAM,oBAAoB;AAC3E,eAAW,YAAY,KAAK,WAAW;AACrC,YAAM,KAAK,qBAAqB,IAAI,SAAS,EAAE,CAAC,iBAAiB,QAAQ,SAAS,UAAU,CAAC,KAAK,IAAI,OAAO,SAAS,KAAK,CAAC,CAAC,aAAa;AAAA,IAC5I;AACA,UAAM,KAAK,gBAAgB;AAAA,EAC7B;AAGA,MAAI,mBAAmB,KAAK,SAAS,SAAS,GAAG;AAC/C,UAAM,KAAK,6BAA6B,KAAK,SAAS,MAAM,IAAI;AAChE,eAAW,OAAO,KAAK,UAAU;AAC/B,YAAM,aAAa,mBAAmB,KAAK,cAAc;AACzD,UAAI,WAAW,SAAS,GAAG;AACzB,cAAM,KAAK,2BAA2B,IAAI,IAAI,SAAS,CAAC,iBAAiB,QAAQ,IAAI,UAAU,CAAC,IAAI;AACpG,cAAM,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,CAAC,CAAC,EAAE;AAC5C,mBAAW,OAAO,YAAY;AAC5B,gBAAM,KAAK,SAAS,aAAa,GAAG,CAAC,EAAE;AAAA,QACzC;AACA,cAAM,KAAK,gBAAgB;AAAA,MAC7B,OAAO;AACL,cAAM,KAAK,2BAA2B,IAAI,IAAI,SAAS,CAAC,iBAAiB,QAAQ,IAAI,UAAU,CAAC,KAAK,IAAI,OAAO,IAAI,KAAK,CAAC,CAAC,YAAY;AAAA,MACzI;AAAA,IACF;AACA,UAAM,KAAK,sBAAsB;AAAA,EACnC;AAGA,MAAI,KAAK,MAAM;AACb,UAAM,iBAAiB,KAAK,oBAAoB,wBAAwB,KAAK,iBAAiB,MAAM;AACpG,UAAM,KAAK,qBAAqB,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC,cAAc,IAAI,KAAK,OAAO,CAAC,IAAI,cAAc,GAAG;AAC1G,UAAM,qBAAqB,oBAAI,IAAI,CAAC,QAAQ,aAAa,QAAQ,SAAS,cAAc,QAAQ,SAAS,cAAc,qBAAqB,CAAC;AAC7I,UAAM,gBAAgB,KAAK,SAAS,OAAO,OAAK,mBAAmB,IAAI,EAAE,SAAS,KAAK,EAAE,cAAc,aAAa;AACpH,eAAW,QAAQ,eAAe;AAChC,YAAM,cAAc,mBAAmB,MAAM,cAAc;AAC3D,UAAI,YAAY,SAAS,GAAG;AAC1B,cAAM,KAAK,wBAAwB,IAAI,KAAK,SAAS,CAAC,iBAAiB,QAAQ,KAAK,UAAU,CAAC,IAAI;AACnG,cAAM,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,CAAC,CAAC,EAAE;AAC7C,mBAAW,OAAO,aAAa;AAC7B,gBAAM,KAAK,SAAS,aAAa,GAAG,CAAC,EAAE;AAAA,QACzC;AACA,cAAM,KAAK,aAAa;AAAA,MAC1B,OAAO;AACL,cAAM,KAAK,wBAAwB,IAAI,KAAK,SAAS,CAAC,iBAAiB,QAAQ,KAAK,UAAU,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS;AAAA,MACtI;AAAA,IACF;AAEA,eAAW,OAAO,mBAAmB;AACnC,YAAM,KAAK,OAAO,aAAa,GAAG,CAAC,EAAE;AAAA,IACvC;AACA,UAAM,KAAK,eAAe;AAAA,EAC5B;AAGA,MAAI,iBAAiB;AACnB,UAAM,qBAAqB,oBAAI,IAAI,CAAC,QAAQ,aAAa,QAAQ,SAAS,cAAc,QAAQ,SAAS,cAAc,qBAAqB,CAAC;AAC7I,UAAM,YAAY,KAAK,SAAS;AAAA,MAAO,OACrC,CAAC,mBAAmB,IAAI,EAAE,SAAS,KAAK,EAAE,cAAc;AAAA,IAC1D;AACA,QAAI,UAAU,SAAS,GAAG;AACxB,YAAM,KAAK,uBAAuB,UAAU,MAAM,IAAI;AACtD,iBAAW,OAAO,WAAW;AAC3B,cAAM,aAAa,mBAAmB,KAAK,cAAc;AACzD,YAAI,WAAW,SAAS,GAAG;AACzB,gBAAM,KAAK,wBAAwB,IAAI,IAAI,SAAS,CAAC,iBAAiB,QAAQ,IAAI,UAAU,CAAC,IAAI;AACjG,gBAAM,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,CAAC,CAAC,EAAE;AAC5C,qBAAW,OAAO,YAAY;AAC5B,kBAAM,KAAK,SAAS,aAAa,GAAG,CAAC,EAAE;AAAA,UACzC;AACA,gBAAM,KAAK,aAAa;AAAA,QAC1B,OAAO;AACL,gBAAM,KAAK,wBAAwB,IAAI,IAAI,SAAS,CAAC,iBAAiB,QAAQ,IAAI,UAAU,CAAC,KAAK,IAAI,OAAO,IAAI,KAAK,CAAC,CAAC,SAAS;AAAA,QACnI;AAAA,MACF;AACA,YAAM,KAAK,gBAAgB;AAAA,IAC7B;AAAA,EACF;AAGA,MAAI,wBAAwB,KAAK,gBAAgB,SAAS,GAAG;AAC3D,UAAM,KAAK,2BAA2B,KAAK,gBAAgB,MAAM,IAAI;AACrE,eAAW,UAAU,KAAK,iBAAiB;AACzC,YAAM,gBAAgB,eAAe,IAAI,OAAO,OAAO,KAAK,CAAC;AAC7D,YAAM,aAAa,OAAO,MAAM,SAAS,KAAK,cAAc,SAAS;AACrE,UAAI,CAAC,YAAY;AACf,cAAM,KAAK,qBAAqB,IAAI,OAAO,IAAI,CAAC,mBAAmB,IAAI,OAAO,YAAY,CAAC,MAAM;AAAA,MACnG,OAAO;AACL,cAAM,KAAK,qBAAqB,IAAI,OAAO,IAAI,CAAC,mBAAmB,IAAI,OAAO,YAAY,CAAC,IAAI;AAC/F,mBAAW,QAAQ,OAAO,OAAO;AAC/B,gBAAM,KAAK,0BAA0B,IAAI,KAAK,SAAS,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS;AAAA,QAC/F;AACA,mBAAW,OAAO,eAAe;AAC/B,gBAAM,KAAK,SAAS,aAAa,GAAG,CAAC,EAAE;AAAA,QACzC;AACA,cAAM,KAAK,eAAe;AAAA,MAC5B;AAAA,IACF;AACA,UAAM,KAAK,oBAAoB;AAAA,EACjC;AAEA,QAAM,KAAK,sBAAsB;AACjC,SAAO,MAAM,KAAK,IAAI;AACxB;AAIA,SAAS,aAAa,KAA0B;AAC9C,QAAM,YAAY,IAAI,eAAe,WAAW,IAAI,IAAI,YAAY,CAAC,MAAM;AAC3E,SAAO,iBAAiB,IAAI,IAAI,IAAI,CAAC,gBAAgB,QAAQ,IAAI,SAAS,CAAC,cAAc,QAAQ,IAAI,gBAAgB,CAAC,gBAAgB,IAAI,QAAQ,IAAI,SAAS,IAAI,IAAI,IAAI,OAAO,CAAC;AACrL;AAMA,SAAS,mBAAmB,MAAkB,gBAA2D;AACvG,QAAM,UAAyB,CAAC;AAEhC,aAAW,CAAC,cAAc,OAAO,KAAK,gBAAgB;AACpD,QAAI,aAAa,SAAS,KAAK,SAAS,KAAK,aAAa,SAAS,OAAO,KAAK,KAAK,EAAE,YAAY,EAAE,QAAQ,QAAQ,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG;AACtI,cAAQ,KAAK,GAAG,OAAO;AAAA,IACzB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,QAAQ,GAAmB;AAClC,SAAO,EAAE,QAAQ,CAAC;AACpB;AAEA,SAAS,IAAI,GAAmB;AAC9B,SAAO,EACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ;AAC3B;","names":["SubjectPrefix","IdentityPredicate","WorkPredicate","EventPredicate","RapportPredicate","MemoryPredicate","EntityPredicate","OrgRelationship","EntityRelationship","ConfidenceLevel","enc","enc","subject"]}