@aletheia-dev/api-client 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/dist/index.cjs +166 -136
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +33 -3
- package/dist/index.d.ts +33 -3
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/audit.ts","../src/http.ts","../src/governance.ts","../src/cases.ts","../src/documents.ts","../src/client.ts","../src/builder.ts","../src/tenants.ts","../src/workflow-runs.ts","../src/runtime-config.ts"],"sourcesContent":["export {\n ApiError,\n FORBIDDEN_CODES,\n isApiError,\n isApiErrorBody,\n isForbidden,\n isTenantNotProvisioned,\n isUnauthenticated,\n type ApiErrorBody,\n} from './errors.js';\nexport type { AccessTokenProvider, FetchLike, RawBody } from './http.js';\nexport type { TenantsClient } from './tenants.js';\nexport {\n auditFilterParams,\n verifyExport,\n type AuditClient,\n type AuditFilterQuery,\n type AuditListQuery,\n type ExportVerification,\n} from './audit.js';\nexport {\n ApprovalOutcome,\n type ApprovalListQuery,\n type DiffQuery,\n type GovernanceClient,\n} from './governance.js';\n// The audit and governance domains are re-exported so the back office and builder can build\n// their audit, history and approval screens from the client alone.\nexport {\n ActorType,\n ApprovalCommentInput,\n ApprovalDecision,\n AuditEvent,\n AuditExportFormat,\n AuditFilter,\n DEFINITION_PATHS,\n DefinitionApproval,\n DefinitionDiff,\n DefinitionKind,\n DefinitionVersionSummary,\n DiffChange,\n DiffOp,\n} from '@aletheia-dev/core';\nexport type { BuilderClient, ValidateCollectionFlowBody, ValidateWorkflowBody } from './builder.js';\n// Builder schema types are re-exported so the builder can drive its forms from the client alone.\nexport {\n Condition,\n ConditionOp,\n DefinitionIssue,\n FieldTypeDescription,\n FormUiHints,\n IssueSeverity,\n StepTypeDescription,\n ValidationReport,\n} from '@aletheia-dev/core';\nexport {\n CaseDetail,\n CaseQueueCount,\n DecideCaseResult,\n caseListParams,\n type AssignCaseBody,\n type CaseListQuery,\n type CaseNoteBody,\n type CaseQueuesClient,\n type CasesClient,\n type CloseCaseBody,\n type DecideCaseBody,\n type UpsertCaseQueueBody,\n type UserListQuery,\n type UsersClient,\n} from './cases.js';\n// The case domain is re-exported so the back office can build the workbench from the client alone.\nexport {\n AssignCaseInput,\n Case,\n CaseFilter,\n CaseNote,\n CaseNoteInput,\n CasePriority,\n CaseQueue,\n CaseSlaState,\n CaseSort,\n CaseStatus,\n CaseView,\n CloseCaseInput,\n DirectoryUser,\n SortOrder,\n UpsertCaseQueueInput,\n caseSlaState,\n} from '@aletheia-dev/core';\nexport {\n DocumentPollTimeoutError,\n UploadError,\n checkFileBeforeUpload,\n isTerminalDocumentStatus,\n pollDocument,\n uploadToStorage,\n type DocumentList,\n type DocumentListQuery,\n type DocumentScope,\n type DocumentsClient,\n type FileCheck,\n type PollOptions,\n type UploadOptions,\n type UploadProgressEvent,\n type UploadXhr,\n} from './documents.js';\n// The document domain is re-exported so the collection flow and back office can build their\n// upload and viewing screens from the client alone.\nexport {\n CreateDocumentInput,\n DOCUMENT_CONTENT_TYPES,\n DOCUMENT_MAX_BYTES,\n DOCUMENT_OPEN_STATUSES,\n Document,\n DocumentContentType,\n DocumentDownload,\n DocumentScan,\n DocumentStatus,\n DocumentUploadTicket,\n FileFieldValue,\n} from '@aletheia-dev/core';\n// The list, event, rule-set and backtest domains are re-exported so UIs can build their screens\n// from the client alone.\nexport {\n AggregationPolicy,\n AddListEntriesInput,\n Backtest,\n BacktestProgress,\n BacktestSample,\n BacktestSampleFailure,\n BacktestStatus,\n BacktestSummary,\n Event,\n EventKey,\n IngestEventsInput,\n IngestEventsResult,\n NewEvent,\n List,\n ListEntry,\n ListImportResult,\n ListKind,\n NewListEntry,\n RemoveListEntriesInput,\n RuleSetBody,\n RuleSetDefinition,\n RuleSetRule,\n RuleSetUseCase,\n ScoreBand,\n ScoreClamp,\n StartBacktestInput,\n UpsertListInput,\n UpsertRuleSetInput,\n bandFor,\n normalizeListValue,\n} from '@aletheia-dev/core';\n// Tenant settings are re-exported so the builder can validate origins before saving them.\nexport { TenantSettings, WebOrigin } from '@aletheia-dev/core';\n// The subject domain is re-exported so the back office can build the subject pages from the\n// client alone.\nexport {\n Subject,\n SubjectKind,\n SubjectListQuery,\n SubjectStatus,\n TimelineEntry,\n TimelineKind,\n TimelineQuery,\n} from '@aletheia-dev/core';\nexport {\n createApiClient,\n HealthStatus,\n Me,\n MePrincipal,\n ReadyStatus,\n DryRunResult,\n PluginSummary,\n RemovedCount,\n RuleTypeDescription,\n RuleUiHints,\n SubmissionDetail,\n SubmissionStatus,\n CreatedSubmission,\n SubmissionEmbed,\n type ApiClient,\n type ApiClientOptions,\n type CreateSubjectBody,\n type StartWorkflowRunBody,\n type DryRunBody,\n type DryRunInput,\n type UpsertWorkflowDefinitionBody,\n type UpsertRuleDefinitionBody,\n type UpsertRuleSetBody,\n type UpsertCollectionFlowBody,\n type CreateSubmissionBody,\n type SaveSubmissionBody,\n type UpsertListBody,\n type AddListEntriesBody,\n type RemoveListEntriesBody,\n type IngestEventsBody,\n type StartBacktestBody,\n type PageQuery,\n type EventListQuery,\n type ListEntryQuery,\n type AuditEventQuery,\n type PluginInvocationQuery,\n} from './client.js';\nexport {\n RUNTIME_CONFIG_PATH,\n RuntimeConfig,\n loadRuntimeConfig,\n resolveConfig,\n type ResolvedConfig,\n type RuntimeConfigKey,\n} from './runtime-config.js';\n","/** Shape of every non-2xx body returned by the API. */\nexport interface ApiErrorBody {\n error: { code: string; message: string; details?: unknown };\n}\n\n/** Thrown by the client for any non-2xx response. `status` is the HTTP status. */\nexport class ApiError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly code: string,\n public readonly details?: unknown,\n ) {\n super(message);\n this.name = 'ApiError';\n }\n\n /** Builds an ApiError from a response status and its (possibly non-JSON) body. */\n static fromResponse(status: number, statusText: string, body: unknown): ApiError {\n if (isApiErrorBody(body)) {\n return new ApiError(body.error.message, status, body.error.code, body.error.details);\n }\n const message = statusText ? `HTTP ${status} ${statusText}` : `HTTP ${status}`;\n return new ApiError(message, status, 'http_error', body);\n }\n}\n\nexport function isApiErrorBody(value: unknown): value is ApiErrorBody {\n if (typeof value !== 'object' || value === null) return false;\n const error = (value as { error?: unknown }).error;\n if (typeof error !== 'object' || error === null) return false;\n const { code, message } = error as { code?: unknown; message?: unknown };\n return typeof code === 'string' && typeof message === 'string';\n}\n\nexport function isApiError(value: unknown): value is ApiError {\n return value instanceof ApiError;\n}\n\n/** True for a 401 `unauthenticated` response: the caller must (re-)sign in. */\nexport function isUnauthenticated(value: unknown): value is ApiError {\n return isApiError(value) && value.code === 'unauthenticated';\n}\n\n/** Permission or provisioning failures: the caller is signed in but may not act. */\nexport const FORBIDDEN_CODES = ['forbidden', 'tenant_not_provisioned'] as const;\n\n/** True for a 403 response (`forbidden` or `tenant_not_provisioned`). */\nexport function isForbidden(value: unknown): value is ApiError {\n return isApiError(value) && (FORBIDDEN_CODES as readonly string[]).includes(value.code);\n}\n\n/** True when the signed-in organization has no tenant in Aletheia yet. */\nexport function isTenantNotProvisioned(value: unknown): value is ApiError {\n return isApiError(value) && value.code === 'tenant_not_provisioned';\n}\n","import { AuditEvent, type AuditExportFormat, type AuditFilter } from '@aletheia-dev/core';\nimport { z } from 'zod';\nimport { ApiError } from './errors.js';\nimport {\n buildUrl,\n type AccessTokenProvider,\n type FetchLike,\n type Http,\n type Query,\n} from './http.js';\n\n/**\n * Filters of `GET /audit-events` and its export. `action` is a prefix match (`case.` matches\n * `case.decided`); `from`/`to` bound `occurredAt` and are sent as ISO strings.\n */\nexport type AuditFilterQuery = Omit<AuditFilter, 'from' | 'to'> & {\n from?: Date | string;\n to?: Date | string;\n};\n\n/** `GET /audit-events` query: the filters plus offset paging (newest first). */\nexport type AuditListQuery = AuditFilterQuery & { limit?: number; offset?: number };\n\n/** What `audit.export` / `audit.exportUrl` need beyond the shared transport. */\nexport interface AuditTransport {\n baseUrl: string;\n getAccessToken: AccessTokenProvider;\n fetch: FetchLike;\n}\n\nexport interface AuditClient {\n /** Audit events matching `query`, newest first (`audit:read`). */\n list: (query?: AuditListQuery) => Promise<AuditEvent[]>;\n /** Absolute URL of the export endpoint for a filter (the request still needs the bearer token). */\n exportUrl: (format: AuditExportFormat, filter?: AuditFilterQuery) => string;\n /** Downloads the filtered export with the bearer token; the last line is the manifest. */\n export: (format: AuditExportFormat, filter?: AuditFilterQuery) => Promise<Blob>;\n}\n\nconst AuditEventList = z.object({ items: z.array(AuditEvent) });\n\nfunction isoOf(value: Date | string | undefined): string | undefined {\n return value instanceof Date ? value.toISOString() : value;\n}\n\n/** Flattens the filter into transport parameters (empty values are dropped by `buildUrl`). */\nexport function auditFilterParams(filter: AuditFilterQuery = {}): Query {\n return {\n action: filter.action,\n actorId: filter.actorId,\n actorType: filter.actorType,\n resourceType: filter.resourceType,\n resourceId: filter.resourceId,\n from: isoOf(filter.from),\n to: isoOf(filter.to),\n };\n}\n\nexport function auditDomain(http: Http, transport: AuditTransport): AuditClient {\n const exportUrl = (format: AuditExportFormat, filter?: AuditFilterQuery): string =>\n buildUrl(transport.baseUrl, '/audit-events/export', {\n format,\n ...auditFilterParams(filter),\n });\n\n return {\n list: async (query = {}) => {\n const { limit, offset, ...filter } = query;\n const body = await http.parsed(AuditEventList, '/audit-events', {\n query: { ...auditFilterParams(filter), limit, offset },\n });\n return body.items;\n },\n exportUrl,\n export: async (format, filter) => {\n const headers: Record<string, string> = { accept: '*/*' };\n const token = await transport.getAccessToken();\n if (token) headers.authorization = `Bearer ${token}`;\n const response = await transport.fetch(exportUrl(format, filter), {\n method: 'GET',\n headers,\n });\n if (!response.ok) {\n const text = await response.text();\n let body: unknown = text || undefined;\n try {\n body = text ? (JSON.parse(text) as unknown) : undefined;\n } catch {\n // Not JSON: keep the raw text as the error details.\n }\n throw ApiError.fromResponse(response.status, response.statusText, body);\n }\n return response.blob();\n },\n };\n}\n\n/** Outcome of checking an export against its trailing manifest. */\nexport interface ExportVerification {\n /** True when a manifest was found and its digest matches the body. */\n ok: boolean;\n /** Row count stated by the manifest (0 when there is none). */\n rows: number;\n /** Digest stated by the manifest, when present. */\n expected?: string;\n /** SHA-256 (hex) of the body before the manifest line. */\n actual: string;\n}\n\ninterface Manifest {\n sha256: string;\n rows: number;\n}\n\nconst CSV_MANIFEST = /^#\\s*sha256=([0-9a-fA-F]+)\\s+rows=(\\d+)\\s*$/;\nconst JsonlManifest = z.object({\n _manifest: z.object({ sha256: z.string(), rows: z.coerce.number().int().nonnegative() }),\n});\n\nfunction parseManifest(line: string, format: AuditExportFormat): Manifest | undefined {\n const trimmed = line.replace(/\\r$/, '');\n if (format === 'csv') {\n const match = CSV_MANIFEST.exec(trimmed);\n return match ? { sha256: match[1]!.toLowerCase(), rows: Number(match[2]) } : undefined;\n }\n try {\n const parsed = JsonlManifest.safeParse(JSON.parse(trimmed));\n if (!parsed.success) return undefined;\n return { sha256: parsed.data._manifest.sha256.toLowerCase(), rows: parsed.data._manifest.rows };\n } catch {\n return undefined;\n }\n}\n\nasync function sha256Hex(text: string): Promise<string> {\n const digest = await globalThis.crypto.subtle.digest('SHA-256', new TextEncoder().encode(text));\n return Array.from(new Uint8Array(digest), (b) => b.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Checks an exported file against its manifest (the last line: `# sha256=<hex> rows=<n>` for\n * CSV, `{\"_manifest\":{\"sha256\",\"rows\"}}` for JSONL). The digest covers every byte before the\n * manifest line, including the newline that ends the last data row, as the server hashes it.\n */\nexport async function verifyExport(\n text: string,\n format: AuditExportFormat,\n): Promise<ExportVerification> {\n // A single trailing newline after the manifest is not part of it.\n const content = text.endsWith('\\n') ? text.slice(0, -1) : text;\n const cut = content.lastIndexOf('\\n');\n const body = cut === -1 ? '' : content.slice(0, cut + 1);\n const manifest = parseManifest(content.slice(cut + 1), format);\n if (!manifest) {\n return { ok: false, rows: 0, actual: await sha256Hex(text) };\n }\n const actual = await sha256Hex(body);\n return { ok: actual === manifest.sha256, rows: manifest.rows, expected: manifest.sha256, actual };\n}\n","import type { z } from 'zod';\nimport { ApiError } from './errors.js';\n\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;\n\n/** Returns the current bearer token, or nothing when the caller is not signed in. */\nexport type AccessTokenProvider = () => Promise<string | undefined> | string | undefined;\n\nexport interface HttpOptions {\n baseUrl: string;\n getAccessToken: AccessTokenProvider;\n fetch: FetchLike;\n}\n\n/** One query value; arrays are serialised as repeated parameters (`status=a&status=b`). */\nexport type QueryValue = string | number | boolean | undefined | null | readonly string[];\nexport type Query = Record<string, QueryValue>;\n\n/** A body sent verbatim with an explicit content type (e.g. a CSV upload). */\nexport interface RawBody {\n content: string;\n contentType: string;\n}\n\nexport interface RequestOptions {\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n query?: Query;\n /** JSON-encoded request body. Ignored when `raw` is set. */\n body?: unknown;\n /** Raw text body; takes precedence over `body`. */\n raw?: RawBody;\n}\n\nexport function buildUrl(baseUrl: string, path: string, query?: Query): string {\n const url = `${baseUrl}${path}`;\n if (!query) return url;\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null || value === '') continue;\n if (typeof value === 'object') {\n // Repeated parameters: the API reads array filters with `getAll`.\n for (const item of value) params.append(key, item);\n continue;\n }\n params.set(key, String(value));\n }\n const qs = params.toString();\n return qs ? `${url}?${qs}` : url;\n}\n\nasync function readBody(response: Response): Promise<unknown> {\n const text = await response.text();\n if (!text) return undefined;\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return text;\n }\n}\n\n/** Minimal transport: sets the bearer header, encodes query & body (JSON or raw text), maps errors. */\nexport class Http {\n constructor(private readonly options: HttpOptions) {}\n\n async request(path: string, options: RequestOptions = {}): Promise<unknown> {\n const { baseUrl, getAccessToken, fetch } = this.options;\n const method = options.method ?? 'GET';\n const headers: Record<string, string> = { accept: 'application/json' };\n const token = await getAccessToken();\n if (token) headers.authorization = `Bearer ${token}`;\n const init: RequestInit = { method, headers };\n if (options.raw !== undefined) {\n headers['content-type'] = options.raw.contentType;\n init.body = options.raw.content;\n } else if (options.body !== undefined) {\n headers['content-type'] = 'application/json';\n init.body = JSON.stringify(options.body);\n }\n const response = await fetch(buildUrl(baseUrl, path, options.query), init);\n const body = await readBody(response);\n if (!response.ok) {\n throw ApiError.fromResponse(response.status, response.statusText, body);\n }\n return body;\n }\n\n /** Requests and parses the body with `schema` (dates are coerced by the core schemas). */\n async parsed<T extends z.ZodType>(\n schema: T,\n path: string,\n options?: RequestOptions,\n ): Promise<z.output<T>> {\n const body = await this.request(path, options);\n return schema.parse(body) as z.output<T>;\n }\n}\n\nexport function encodeSegment(value: string): string {\n return encodeURIComponent(value);\n}\n","import {\n DEFINITION_PATHS,\n DefinitionApproval,\n DefinitionDiff,\n DefinitionVersionSummary,\n type ApprovalCommentInput,\n type DefinitionKind,\n} from '@aletheia-dev/core';\nimport { z } from 'zod';\nimport { encodeSegment, type Http } from './http.js';\n\n/** Accepts the API's `{ items }` envelope (or a bare array) and yields the items. */\nconst itemsOf = <T extends z.ZodType>(item: T) =>\n z.union([z.object({ items: z.array(item) }).transform((body) => body.items), z.array(item)]);\n\n/** Response of `POST .../approve` and `.../reject`: the decided approval and the definition. */\nexport const ApprovalOutcome = z.object({\n approval: DefinitionApproval,\n definition: z.unknown(),\n});\nexport type ApprovalOutcome = z.infer<typeof ApprovalOutcome>;\n\n/** Version pair of a diff; `from` defaults to the published version, `to` to the latest. */\nexport interface DiffQuery {\n from?: number;\n to?: number;\n}\n\nexport interface ApprovalListQuery {\n kind?: DefinitionKind;\n}\n\nexport interface GovernanceClient {\n /** Every version of a definition, with status, author and approval (`definitions:read`). */\n versions: (kind: DefinitionKind, key: string) => Promise<DefinitionVersionSummary[]>;\n /** The full definition entity of one version, e.g. to restore it as a draft. */\n getVersion: (kind: DefinitionKind, key: string, version: number) => Promise<unknown>;\n /** Structured diff between two versions with a readable summary per change. */\n diff: (kind: DefinitionKind, key: string, query?: DiffQuery) => Promise<DefinitionDiff>;\n /** Moves a draft to `pending_approval` (`definitions:write`). */\n requestApproval: (\n kind: DefinitionKind,\n key: string,\n version: number,\n body?: ApprovalCommentInput,\n ) => Promise<DefinitionApproval>;\n /** Approves and publishes a pending version (`definitions:approve`). */\n approve: (\n kind: DefinitionKind,\n key: string,\n version: number,\n body?: ApprovalCommentInput,\n ) => Promise<ApprovalOutcome>;\n /** Sends a pending version back to draft (`definitions:approve`). */\n reject: (\n kind: DefinitionKind,\n key: string,\n version: number,\n body?: ApprovalCommentInput,\n ) => Promise<ApprovalOutcome>;\n approvals: {\n /** Approvals awaiting a decision, optionally for one definition kind. */\n listOpen: (query?: ApprovalListQuery) => Promise<DefinitionApproval[]>;\n };\n}\n\nfunction definitionPath(kind: DefinitionKind, key: string): string {\n return `${DEFINITION_PATHS[kind]}/${encodeSegment(key)}`;\n}\n\nfunction versionPath(kind: DefinitionKind, key: string, version: number): string {\n return `${definitionPath(kind, key)}/versions/${encodeSegment(String(version))}`;\n}\n\nexport function governanceDomain(http: Http): GovernanceClient {\n return {\n versions: (kind, key) =>\n http.parsed(itemsOf(DefinitionVersionSummary), `${definitionPath(kind, key)}/versions`),\n getVersion: (kind, key, version) => http.request(versionPath(kind, key, version)),\n diff: (kind, key, query = {}) =>\n http.parsed(DefinitionDiff, `${definitionPath(kind, key)}/diff`, {\n query: { from: query.from, to: query.to },\n }),\n requestApproval: (kind, key, version, body = {}) =>\n http.parsed(DefinitionApproval, `${versionPath(kind, key, version)}/request-approval`, {\n method: 'POST',\n body,\n }),\n approve: (kind, key, version, body = {}) =>\n http.parsed(ApprovalOutcome, `${versionPath(kind, key, version)}/approve`, {\n method: 'POST',\n body,\n }),\n reject: (kind, key, version, body = {}) =>\n http.parsed(ApprovalOutcome, `${versionPath(kind, key, version)}/reject`, {\n method: 'POST',\n body,\n }),\n approvals: {\n listOpen: (query = {}) =>\n http.parsed(itemsOf(DefinitionApproval), '/approvals', { query: { kind: query.kind } }),\n },\n };\n}\n","// Cases: the review workbench domain (list/detail/decide, assignment, closing, notes), the saved\n// filters analysts work from (`/case-queues`) and the reviewer directory (`/users`).\nimport {\n type AssignCaseInput,\n Case,\n CaseNote,\n type CaseNoteInput,\n type CasePriority,\n CaseQueue,\n type CaseSlaState,\n type CaseSort,\n type CaseStatus,\n CaseView,\n type CloseCaseInput,\n type DecideCaseInput,\n Decision,\n DirectoryUser,\n type SortOrder,\n Subject,\n type UpsertCaseQueueInput,\n WorkflowRun,\n} from '@aletheia-dev/core';\nimport { z } from 'zod';\nimport { encodeSegment, type Http, type Query } from './http.js';\n\nexport type DecideCaseBody = z.input<typeof DecideCaseInput>;\nexport type AssignCaseBody = z.input<typeof AssignCaseInput>;\nexport type CloseCaseBody = z.input<typeof CloseCaseInput>;\nexport type CaseNoteBody = z.input<typeof CaseNoteInput>;\n/** Body of `POST/PUT /case-queues`; `filter`, `sort`, `order` and `position` have defaults. */\nexport type UpsertCaseQueueBody = z.input<typeof UpsertCaseQueueInput>;\n\n/**\n * Filters of `GET /cases`. Array filters are sent as repeated parameters\n * (`status=open&status=in_review`); a single value is accepted for convenience.\n * `assignee` is `me`, `unassigned` or a directory user id.\n */\nexport type CaseListQuery = {\n status?: CaseStatus | CaseStatus[];\n priority?: CasePriority | CasePriority[];\n assignee?: string;\n type?: string;\n subjectId?: string;\n slaState?: CaseSlaState | CaseSlaState[];\n dueBefore?: Date | string;\n search?: string;\n sort?: CaseSort;\n order?: SortOrder;\n limit?: number;\n offset?: number;\n};\n\nexport type UserListQuery = {\n /** Only users holding this role (e.g. `analyst`, `admin`). */\n role?: string;\n};\n\nexport const CaseDetail = z.object({\n case: CaseView,\n subject: Subject,\n run: WorkflowRun.nullable(),\n decisions: z.array(Decision),\n});\nexport type CaseDetail = z.infer<typeof CaseDetail>;\n\nexport const DecideCaseResult = z.object({ case: Case, decision: Decision });\nexport type DecideCaseResult = z.infer<typeof DecideCaseResult>;\n\n/** One row of `GET /case-queues/counts`: how many cases match the queue's filter right now. */\nexport const CaseQueueCount = z.object({\n queueId: z.string(),\n count: z.number().int().nonnegative(),\n});\nexport type CaseQueueCount = z.infer<typeof CaseQueueCount>;\n\nconst listOf = <T extends z.ZodType>(item: T) => z.object({ items: z.array(item) });\n\nfunction arrayOf<T extends string>(value: T | T[] | undefined): T[] | undefined {\n if (value === undefined) return undefined;\n return Array.isArray(value) ? value : [value];\n}\n\nfunction isoOf(value: Date | string | undefined): string | undefined {\n return value instanceof Date ? value.toISOString() : value;\n}\n\n/** Flattens a `CaseListQuery` into transport parameters; arrays repeat, dates become ISO. */\nexport function caseListParams(query: CaseListQuery): Query {\n return {\n status: arrayOf(query.status),\n priority: arrayOf(query.priority),\n assignee: query.assignee,\n type: query.type,\n subjectId: query.subjectId,\n slaState: arrayOf(query.slaState),\n dueBefore: isoOf(query.dueBefore),\n search: query.search,\n sort: query.sort,\n order: query.order,\n limit: query.limit,\n offset: query.offset,\n };\n}\n\nexport function casesDomain(http: Http) {\n const casePath = (id: string, suffix = '') => `/cases/${encodeSegment(id)}${suffix}`;\n const notePath = (id: string, noteId: string) => casePath(id, `/notes/${encodeSegment(noteId)}`);\n const post = (path: string, body?: unknown) =>\n http.parsed(CaseView, path, body === undefined ? { method: 'POST' } : { method: 'POST', body });\n return {\n /** Cases matching `query`, in the requested order (`createdAt` desc by default). */\n list: async (query: CaseListQuery = {}): Promise<CaseView[]> =>\n (await http.parsed(listOf(CaseView), '/cases', { query: caseListParams(query) })).items,\n get: (id: string): Promise<CaseDetail> => http.parsed(CaseDetail, casePath(id)),\n decide: (id: string, body: DecideCaseBody): Promise<DecideCaseResult> =>\n http.parsed(DecideCaseResult, casePath(id, '/decide'), { method: 'POST', body }),\n /** Sets or clears (`assigneeId: null`) the assignee (`cases:assign`). */\n assign: (id: string, body: AssignCaseBody): Promise<CaseView> =>\n post(casePath(id, '/assign'), body),\n /** Assigns the case to the caller (`cases:claim`). */\n claim: (id: string): Promise<CaseView> => post(casePath(id, '/claim')),\n /**\n * Closes the case (`cases:decide`). An undecided case gets a `reject` decision with reason\n * code `case_closed` so its workflow run does not wait forever.\n */\n close: (id: string, body: CloseCaseBody = {}): Promise<CaseView> =>\n post(casePath(id, '/close'), body),\n /** Analyst notes on a case (`cases:notes`); edits and deletes are limited to the author or an admin. */\n notes: {\n list: async (id: string): Promise<CaseNote[]> =>\n (await http.parsed(listOf(CaseNote), casePath(id, '/notes'))).items,\n create: (id: string, body: CaseNoteBody): Promise<CaseNote> =>\n http.parsed(CaseNote, casePath(id, '/notes'), { method: 'POST', body }),\n update: (id: string, noteId: string, body: CaseNoteBody): Promise<CaseNote> =>\n http.parsed(CaseNote, notePath(id, noteId), { method: 'PATCH', body }),\n remove: async (id: string, noteId: string): Promise<void> => {\n await http.request(notePath(id, noteId), { method: 'DELETE' });\n },\n },\n };\n}\nexport type CasesClient = ReturnType<typeof casesDomain>;\n\n/** Saved case filters (`cases:read` to list, `cases:assign` to manage). */\nexport function caseQueuesDomain(http: Http) {\n const queuePath = (id: string) => `/case-queues/${encodeSegment(id)}`;\n return {\n list: async (): Promise<CaseQueue[]> =>\n (await http.parsed(listOf(CaseQueue), '/case-queues')).items,\n counts: async (): Promise<CaseQueueCount[]> =>\n (await http.parsed(listOf(CaseQueueCount), '/case-queues/counts')).items,\n create: (body: UpsertCaseQueueBody): Promise<CaseQueue> =>\n http.parsed(CaseQueue, '/case-queues', { method: 'POST', body }),\n update: (id: string, body: UpsertCaseQueueBody): Promise<CaseQueue> =>\n http.parsed(CaseQueue, queuePath(id), { method: 'PUT', body }),\n remove: async (id: string): Promise<void> => {\n await http.request(queuePath(id), { method: 'DELETE' });\n },\n };\n}\nexport type CaseQueuesClient = ReturnType<typeof caseQueuesDomain>;\n\n/** The reviewer directory (`cases:assign` or `cases:claim`); empty when none is configured. */\nexport function usersDomain(http: Http) {\n return {\n list: async (query: UserListQuery = {}): Promise<DirectoryUser[]> =>\n (await http.parsed(listOf(DirectoryUser), '/users', { query: { role: query.role } })).items,\n };\n}\nexport type UsersClient = ReturnType<typeof usersDomain>;\n","// Documents: direct-to-storage uploads, finalize/scan polling and presigned downloads.\nimport {\n type CreateDocumentInput,\n DOCUMENT_CONTENT_TYPES,\n DOCUMENT_MAX_BYTES,\n DOCUMENT_OPEN_STATUSES,\n Document,\n DocumentDownload,\n type DocumentStatus,\n DocumentUploadTicket,\n} from '@aletheia-dev/core';\nimport { z } from 'zod';\nimport { encodeSegment, type Http } from './http.js';\n\n/**\n * Applicants (submission-token clients) must name their submission on every `/documents/:id`\n * route; operators and integrations omit it.\n */\nexport interface DocumentScope {\n submissionId?: string;\n}\n\n/** Filters of `GET /documents` (`documents:read`). */\nexport interface DocumentListQuery {\n subjectId?: string;\n submissionId?: string;\n caseId?: string;\n status?: DocumentStatus;\n limit?: number;\n offset?: number;\n}\n\nconst DocumentList = z.object({ items: z.array(Document) });\nexport type DocumentList = z.infer<typeof DocumentList>;\n\nexport function documentsDomain(http: Http) {\n const idPath = (id: string, suffix = '') => `/documents/${encodeSegment(id)}${suffix}`;\n return {\n /**\n * Registers a pending document and returns the presigned POST to send the bytes with\n * (`uploadToStorage`). Applicants pass their `submissionId` and the `fieldKey`.\n */\n create: (input: CreateDocumentInput): Promise<DocumentUploadTicket> =>\n http.parsed(DocumentUploadTicket, '/documents', { method: 'POST', body: input }),\n /**\n * Verifies the uploaded object and starts the scan. Resolves with status `uploaded` or\n * `rejected` (see `rejectionReason`); throws a 409 `ApiError` when nothing was uploaded.\n */\n finalize: (id: string, opts: DocumentScope = {}): Promise<Document> =>\n http.parsed(Document, idPath(id, '/finalize'), { method: 'POST', query: { ...opts } }),\n get: (id: string, opts: DocumentScope = {}): Promise<Document> =>\n http.parsed(Document, idPath(id), { query: { ...opts } }),\n list: (filters: DocumentListQuery = {}): Promise<DocumentList> =>\n http.parsed(DocumentList, '/documents', { query: { ...filters } }),\n /** A 60-second presigned GET on the storage origin; open it directly, never via the API. */\n download: (id: string, opts: DocumentScope = {}): Promise<DocumentDownload> =>\n http.parsed(DocumentDownload, idPath(id, '/download'), { query: { ...opts } }),\n };\n}\n\nexport type DocumentsClient = ReturnType<typeof documentsDomain>;\n\n// ---- browser-side helpers ----\n\n/** Thrown by `uploadToStorage`; `status` is 0 for network errors, aborts and timeouts. */\nexport class UploadError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n ) {\n super(message);\n this.name = 'UploadError';\n }\n}\n\nexport interface UploadProgressEvent {\n lengthComputable: boolean;\n loaded: number;\n total: number;\n}\n\n/** The slice of `XMLHttpRequest` the uploader uses; injectable so tests need no network. */\nexport interface UploadXhr {\n readonly status: number;\n open(method: string, url: string): void;\n send(body: FormData): void;\n abort(): void;\n addEventListener(type: 'load' | 'error' | 'abort' | 'timeout', listener: () => void): void;\n upload: {\n addEventListener(type: 'progress', listener: (event: UploadProgressEvent) => void): void;\n };\n}\n\nexport interface UploadOptions {\n /** Called with 0..1 as bytes leave the browser; called with 1 once storage accepts the file. */\n onProgress?: (fraction: number) => void;\n signal?: AbortSignal;\n /** XMLHttpRequest factory; defaults to the global one. */\n xhr?: () => UploadXhr;\n}\n\nfunction defaultXhr(): UploadXhr {\n const ctor = (globalThis as { XMLHttpRequest?: new () => UploadXhr }).XMLHttpRequest;\n if (!ctor) throw new UploadError('XMLHttpRequest is not available in this environment', 0);\n return new ctor();\n}\n\n/**\n * Posts `file` to the presigned URL of `ticket` as multipart form data: the policy fields first,\n * in order, then the file under `file`. The browser sets the multipart content type itself.\n */\nexport function uploadToStorage(\n ticket: DocumentUploadTicket,\n file: Blob,\n opts: UploadOptions = {},\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (opts.signal?.aborted) {\n reject(new UploadError('Upload aborted', 0));\n return;\n }\n const xhr = (opts.xhr ?? defaultXhr)();\n const form = new FormData();\n for (const [name, value] of Object.entries(ticket.upload.fields)) form.append(name, value);\n form.append('file', file);\n\n const onAbort = () => xhr.abort();\n opts.signal?.addEventListener('abort', onAbort, { once: true });\n const settle = (fn: () => void) => {\n opts.signal?.removeEventListener('abort', onAbort);\n fn();\n };\n\n xhr.upload.addEventListener('progress', (event) => {\n if (event.lengthComputable && event.total > 0) {\n opts.onProgress?.(Math.min(1, event.loaded / event.total));\n }\n });\n xhr.addEventListener('load', () =>\n settle(() => {\n if (xhr.status >= 200 && xhr.status < 300) {\n opts.onProgress?.(1);\n resolve();\n } else {\n reject(new UploadError(`Storage refused the upload (HTTP ${xhr.status})`, xhr.status));\n }\n }),\n );\n xhr.addEventListener('error', () =>\n settle(() => reject(new UploadError('Network error while uploading the file', 0))),\n );\n xhr.addEventListener('abort', () => settle(() => reject(new UploadError('Upload aborted', 0))));\n xhr.addEventListener('timeout', () =>\n settle(() => reject(new UploadError('The upload timed out', 0))),\n );\n xhr.open('POST', ticket.upload.url);\n xhr.send(form);\n });\n}\n\nexport type FileCheck = { ok: true } | { ok: false; reason: string };\n\nconst TYPE_LABELS = 'JPEG, PNG, WebP or PDF';\n\n/** Client-side pre-check mirroring the policy storage enforces; saves a doomed round trip. */\nexport function checkFileBeforeUpload(file: {\n type: string;\n size: number;\n name: string;\n}): FileCheck {\n if (!file.name.trim()) return { ok: false, reason: 'The file has no name.' };\n if (!(DOCUMENT_CONTENT_TYPES as readonly string[]).includes(file.type)) {\n const got = file.type || 'unknown type';\n return { ok: false, reason: `Only ${TYPE_LABELS} files are accepted (this is ${got}).` };\n }\n if (file.size < 1) return { ok: false, reason: 'The file is empty.' };\n if (file.size > DOCUMENT_MAX_BYTES) {\n const mib = Math.round(DOCUMENT_MAX_BYTES / (1024 * 1024));\n return { ok: false, reason: `The file is larger than ${mib} MiB.` };\n }\n return { ok: true };\n}\n\nexport interface PollOptions extends DocumentScope {\n intervalMs?: number;\n timeoutMs?: number;\n signal?: AbortSignal;\n}\n\n/** Thrown by `pollDocument` when the scan does not settle within `timeoutMs`. */\nexport class DocumentPollTimeoutError extends Error {\n constructor(public readonly documentId: string) {\n super('Timed out waiting for the document scan to finish');\n this.name = 'DocumentPollTimeoutError';\n }\n}\n\nexport function isTerminalDocumentStatus(status: DocumentStatus): boolean {\n return !DOCUMENT_OPEN_STATUSES.includes(status);\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n function onAbort() {\n clearTimeout(timer);\n reject(new Error('Polling aborted'));\n }\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\n/**\n * Reads the document until its status is terminal (`clean`, `infected` or `rejected`). The first\n * read is immediate; later ones every `intervalMs` (750 ms) until `timeoutMs` (60 s).\n */\nexport async function pollDocument(\n client: { documents: Pick<DocumentsClient, 'get'> },\n id: string,\n opts: PollOptions = {},\n): Promise<Document> {\n const { intervalMs = 750, timeoutMs = 60_000, signal, submissionId } = opts;\n const deadline = Date.now() + timeoutMs;\n for (;;) {\n const document = await client.documents.get(id, { submissionId });\n if (isTerminalDocumentStatus(document.status)) return document;\n const remaining = deadline - Date.now();\n if (remaining <= 0) throw new DocumentPollTimeoutError(id);\n await sleep(Math.min(intervalMs, remaining), signal);\n }\n}\n","import { z } from 'zod';\nimport {\n type AddListEntriesInput,\n type AuditEvent,\n Backtest,\n CollectionFlowDefinition,\n CollectionSubmission,\n type ConfigurePluginInput,\n DefinitionStatus,\n type CreateSubjectInput,\n type CreateSubmissionInput,\n Decision,\n DecisionOutcome,\n Event,\n Id,\n type IngestEventsInput,\n IngestEventsResult,\n List,\n ListEntry,\n ListImportResult,\n PluginDefinition,\n PluginInvocation,\n RuleDefinition,\n RuleEvaluationResult,\n RuleSetDefinition,\n RuleType,\n type RemoveListEntriesInput,\n type SaveSubmissionInput,\n type StartBacktestInput,\n SubmissionStatus as CollectionSubmissionStatus,\n Subject,\n type SubjectListQuery,\n TimelineEntry,\n type TimelineQuery,\n type UpsertCollectionFlowInput,\n type UpsertListInput,\n type UpsertRuleDefinitionInput,\n type UpsertRuleSetInput,\n type UpsertWorkflowDefinitionInput,\n WorkflowDefinition,\n WorkflowRunStatus,\n} from '@aletheia-dev/core';\nimport { auditDomain, type AuditListQuery } from './audit.js';\nimport { builderDomain, validateCall } from './builder.js';\nimport { caseQueuesDomain, casesDomain, usersDomain } from './cases.js';\nimport { documentsDomain } from './documents.js';\nimport { governanceDomain } from './governance.js';\nimport { tenantsDomain } from './tenants.js';\nimport { workflowRunsDomain, type StartWorkflowRunBody } from './workflow-runs.js';\nimport {\n Http,\n encodeSegment,\n type AccessTokenProvider,\n type FetchLike,\n type Query,\n} from './http.js';\n\nexport interface ApiClientOptions {\n /** API origin, e.g. `http://localhost:4000`. A trailing slash is tolerated. */\n baseUrl: string;\n /**\n * Returns the bearer token for the current caller (a Zitadel access token, or an applicant\n * submission token). When it yields nothing the request is sent without `Authorization`.\n */\n getAccessToken: AccessTokenProvider;\n /** Injectable for tests; defaults to the global fetch. */\n fetch?: FetchLike;\n}\n\n// ---- request bodies (input side of the core schemas: defaults may be omitted) ----\nexport type CreateSubjectBody = z.input<typeof CreateSubjectInput>;\nexport type { StartWorkflowRunBody };\nexport type ConfigurePluginBody = z.input<typeof ConfigurePluginInput>;\nexport type UpsertWorkflowDefinitionBody = z.input<typeof UpsertWorkflowDefinitionInput>;\nexport type UpsertRuleDefinitionBody = z.input<typeof UpsertRuleDefinitionInput>;\n/** Body of `PUT /rule-sets/:key`; `enabled`/`shadow` on each rule and `useCase` may be omitted. */\nexport type UpsertRuleSetBody = z.input<typeof UpsertRuleSetInput>;\nexport type UpsertCollectionFlowBody = z.input<typeof UpsertCollectionFlowInput>;\nexport type CreateSubmissionBody = z.input<typeof CreateSubmissionInput>;\nexport type SaveSubmissionBody = z.input<typeof SaveSubmissionInput>;\nexport type UpsertListBody = z.input<typeof UpsertListInput>;\nexport type AddListEntriesBody = z.input<typeof AddListEntriesInput>;\nexport type RemoveListEntriesBody = z.input<typeof RemoveListEntriesInput>;\n/** Body of `POST /events`: up to 1 000 events; `occurredAt` may be a Date or ISO string. */\nexport type IngestEventsBody = z.input<typeof IngestEventsInput>;\n/**\n * Body of `POST /backtests`. `version` defaults to the latest version of the rule (drafts\n * included); `sample` defaults to the last 30 days, 1 000 subjects.\n */\nexport type StartBacktestBody = z.input<typeof StartBacktestInput>;\n\n/** Input of a dry run: a stored subject's id, or an inline data object (exactly one of the two). */\nexport type DryRunInput =\n | { subjectId: string; data?: undefined }\n | { data: Record<string, unknown>; subjectId?: undefined };\n\n/** Body of `POST /rule-definitions/:key/dry-run`. `version` defaults to the latest draft. */\nexport type DryRunBody = DryRunInput & { version?: number };\n\n// ---- response schemas ----\nexport const HealthStatus = z.object({ status: z.literal('ok') });\nexport type HealthStatus = z.infer<typeof HealthStatus>;\n\n/** Who the API resolved the bearer token to (`GET /me`). */\nexport const MePrincipal = z.object({\n kind: z.enum(['human', 'machine', 'applicant']),\n subject: z.string(),\n name: z.string().optional(),\n email: z.string().optional(),\n});\nexport type MePrincipal = z.infer<typeof MePrincipal>;\n\nexport const Me = z.object({\n principal: MePrincipal,\n tenantId: z.string(),\n orgId: z.string().optional(),\n permissions: z.array(z.string()),\n});\nexport type Me = z.infer<typeof Me>;\n\nexport const CheckStatus = z.enum(['ok', 'error']);\nexport const ReadyStatus = z.object({\n status: z.enum(['ok', 'degraded']),\n checks: z.object({ db: CheckStatus, temporal: CheckStatus }),\n});\nexport type ReadyStatus = z.infer<typeof ReadyStatus>;\n\n/** A plugin compiled into the deployment (`GET /plugins/available`). */\nexport const PluginSummary = z.object({\n name: z.string(),\n version: z.string(),\n description: z.string().optional(),\n capabilities: z.array(z.string()),\n secrets: z.array(z.string()),\n actions: z.array(z.string()),\n configSchema: z.unknown(),\n});\nexport type PluginSummary = z.infer<typeof PluginSummary>;\n\n/** Rendering hints for the builder's schema-driven config forms; every part is optional. */\nexport const RuleUiHints = z.object({\n /** Config fields in display order; unlisted fields follow in schema order. */\n fieldOrder: z.array(z.string()).optional(),\n labels: z.record(z.string(), z.string()).optional(),\n help: z.record(z.string(), z.string()).optional(),\n /** Config fields that hold a list key; the builder renders a list picker for them. */\n listPicker: z.array(z.string()).optional(),\n});\nexport type RuleUiHints = z.infer<typeof RuleUiHints>;\n\nexport const RuleTypeDescription = z.object({\n type: RuleType,\n description: z.string(),\n /** JSON Schema of the rule config, produced by `z.toJSONSchema` on the API. */\n configSchema: z.unknown(),\n /** Dot-path namespaces a rule config may reference, e.g. `subject.<field>`. */\n dataPaths: z.array(z.string()).default([]),\n uiHints: RuleUiHints.optional(),\n});\nexport type RuleTypeDescription = z.infer<typeof RuleTypeDescription>;\n\n/** Response of `POST /rule-definitions/:key/dry-run`: the evaluation plus what was evaluated. */\nexport const DryRunResult = z.object({\n result: RuleEvaluationResult,\n rule: z.object({\n key: z.string(),\n version: z.number().int(),\n status: DefinitionStatus,\n type: RuleType,\n }),\n /** Data namespaces the rule may reference, a hint for composing inline test data. */\n dataPaths: z.array(z.string()).default([]),\n});\nexport type DryRunResult = z.infer<typeof DryRunResult>;\n\n/** Response of `DELETE /lists/:key/entries`. */\nexport const RemovedCount = z.object({ removed: z.number().int().nonnegative() });\nexport type RemovedCount = z.infer<typeof RemovedCount>;\n\nexport const SubmissionDetail = z.object({\n submission: CollectionSubmission,\n flow: CollectionFlowDefinition,\n});\nexport type SubmissionDetail = z.infer<typeof SubmissionDetail>;\n\n/**\n * Response of `GET /collection-submissions/:id/status`: the applicant-readable view of a\n * submission and of where its workflow run is. The collection flow polls it after submit.\n */\nexport const SubmissionStatus = z.object({\n submission: z.object({\n id: Id,\n status: CollectionSubmissionStatus,\n submittedAt: z.coerce.date().nullable(),\n }),\n run: z\n .object({\n id: Id,\n status: WorkflowRunStatus,\n currentStepId: z.string().nullable(),\n decision: z.object({ outcome: DecisionOutcome }).nullable(),\n })\n .nullable(),\n});\nexport type SubmissionStatus = z.infer<typeof SubmissionStatus>;\n\n/**\n * Response of `POST /collection-submissions`. `link` is the collection-flow URL carrying the\n * applicant token (hand it to the applicant or the embed loader; never log it); it is `null` when\n * the API cannot mint applicant tokens.\n */\nexport const CreatedSubmission = z.object({\n submission: CollectionSubmission,\n link: z.string().nullable(),\n});\nexport type CreatedSubmission = z.infer<typeof CreatedSubmission>;\n\n/** Response of `GET /collection-submissions/:id/embed`: what the embedded flow may be framed by. */\nexport const SubmissionEmbed = z.object({\n embedOrigins: z.array(z.string()),\n flowName: z.string(),\n});\nexport type SubmissionEmbed = z.infer<typeof SubmissionEmbed>;\n\nconst listOf = <T extends z.ZodType>(item: T) => z.object({ items: z.array(item) });\n\n// ---- query params ----\nexport type PageQuery = {\n limit?: number;\n offset?: number;\n};\n/** @deprecated Use `AuditListQuery`; kept so existing `auditEvents.list` callers compile. */\nexport type AuditEventQuery = AuditListQuery;\nexport type PluginInvocationQuery = {\n workflowRunId?: string;\n limit?: number;\n};\nexport type ListEntryQuery = PageQuery & {\n /** Substring match on the entry value. */\n search?: string;\n};\n/** Filters of `GET /events`; `from`/`to` bound `occurredAt` and are sent as ISO strings. */\nexport type EventListQuery = PageQuery & {\n subjectId?: string;\n type?: string;\n from?: Date | string;\n to?: Date | string;\n};\n\nfunction isoOf(value: Date | string | undefined): string | undefined {\n return value instanceof Date ? value.toISOString() : value;\n}\n\n/** Flattens a `TimelineQuery` into transport parameters; `kinds` repeats, dates become ISO. */\nfunction timelineParams(query: TimelineQuery): Query {\n return {\n from: isoOf(query.from),\n to: isoOf(query.to),\n kinds: query.kinds,\n limit: query.limit,\n offset: query.offset,\n };\n}\n\n/** Builds a typed client for the Aletheia API. Methods throw `ApiError` on non-2xx responses. */\nexport function createApiClient(options: ApiClientOptions) {\n const fetchImpl: FetchLike = options.fetch ?? ((input, init) => globalThis.fetch(input, init));\n const transport = {\n baseUrl: options.baseUrl.replace(/\\/+$/, ''),\n getAccessToken: options.getAccessToken,\n fetch: fetchImpl,\n };\n const http = new Http(transport);\n const audit = auditDomain(http, transport);\n\n const list = async <T extends z.ZodType>(\n item: T,\n path: string,\n query?: Query,\n ): Promise<z.output<T>[]> => (await http.parsed(listOf(item), path, { query })).items;\n\n /** list / get(latest) / upsert(new draft version) / publish for the versioned definitions. */\n const definitions = <T extends z.ZodType, B>(entity: T, path: string) => ({\n list: (): Promise<z.output<T>[]> => list(entity, path),\n get: (key: string): Promise<z.output<T>> =>\n http.parsed(entity, `${path}/${encodeSegment(key)}`),\n upsert: (key: string, body: B): Promise<z.output<T>> =>\n http.parsed(entity, `${path}/${encodeSegment(key)}`, { method: 'PUT', body }),\n publish: (key: string): Promise<z.output<T>> =>\n http.parsed(entity, `${path}/${encodeSegment(key)}/publish`, { method: 'POST' }),\n });\n\n return {\n health: {\n check: (): Promise<HealthStatus> => http.parsed(HealthStatus, '/health'),\n ready: (): Promise<ReadyStatus> => http.parsed(ReadyStatus, '/health/ready'),\n },\n\n /** The caller's principal, tenant and permissions as the API sees the bearer token. */\n me: (): Promise<Me> => http.parsed(Me, '/me'),\n\n subjects: {\n create: (body: CreateSubjectBody): Promise<Subject> =>\n http.parsed(Subject, '/subjects', { method: 'POST', body }),\n /**\n * Subjects matching `query`: `search` matches the external id and `data.name` /\n * `data.legalName`; `riskScoreMin`/`riskScoreMax` bound the risk score (`subjects:read`).\n */\n list: (query: SubjectListQuery = {}): Promise<Subject[]> => list(Subject, '/subjects', query),\n get: (id: string): Promise<Subject> => http.parsed(Subject, `/subjects/${encodeSegment(id)}`),\n /**\n * The subject's history, newest first (`subjects:read`). Entries of kinds the caller may\n * not read are omitted by the API; page with `offset`.\n */\n timeline: (id: string, query: TimelineQuery = {}): Promise<TimelineEntry[]> =>\n list(TimelineEntry, `/subjects/${encodeSegment(id)}/timeline`, timelineParams(query)),\n },\n\n workflowRuns: workflowRunsDomain(http),\n\n /** Review cases: filtered lists, detail, decide, assign/claim/close and notes. See `cases.ts`. */\n cases: casesDomain(http),\n\n /** Saved case filters shown in the workbench rail, with live counts. */\n caseQueues: caseQueuesDomain(http),\n\n /** The reviewer directory, for assignment and resolving assignee names. */\n users: usersDomain(http),\n\n workflowDefinitions: {\n ...definitions<typeof WorkflowDefinition, UpsertWorkflowDefinitionBody>(\n WorkflowDefinition,\n '/workflow-definitions',\n ),\n /** Validates a draft body without saving; issues carry step ids. */\n validate: validateCall<UpsertWorkflowDefinitionBody>(http, '/workflow-definitions'),\n },\n\n /** Step and field type schemas behind the builder's forms. */\n builder: builderDomain(http),\n\n ruleDefinitions: {\n ...definitions<typeof RuleDefinition, UpsertRuleDefinitionBody>(\n RuleDefinition,\n '/rule-definitions',\n ),\n /** Evaluates one rule version against a subject or inline data; nothing is recorded. */\n dryRun: (key: string, body: DryRunBody): Promise<DryRunResult> =>\n http.parsed(DryRunResult, `/rule-definitions/${encodeSegment(key)}/dry-run`, {\n method: 'POST',\n body,\n }),\n },\n\n ruleTypes: {\n list: (): Promise<RuleTypeDescription[]> => list(RuleTypeDescription, '/rule-types'),\n },\n\n /** Versioned, ordered groups of rules with an aggregation policy (`/rule-sets`). */\n ruleSets: definitions<typeof RuleSetDefinition, UpsertRuleSetBody>(\n RuleSetDefinition,\n '/rule-sets',\n ),\n\n collectionFlows: {\n ...definitions<typeof CollectionFlowDefinition, UpsertCollectionFlowBody>(\n CollectionFlowDefinition,\n '/collection-flows',\n ),\n /** Validates a draft flow body without saving; issues carry step / field keys. */\n validate: validateCall<UpsertCollectionFlowBody>(http, '/collection-flows'),\n },\n\n collectionSubmissions: {\n /** Creates the submission and returns the applicant link alongside it. */\n create: (body: CreateSubmissionBody): Promise<CreatedSubmission> =>\n http.parsed(CreatedSubmission, '/collection-submissions', { method: 'POST', body }),\n get: (id: string): Promise<SubmissionDetail> =>\n http.parsed(SubmissionDetail, `/collection-submissions/${encodeSegment(id)}`),\n save: (id: string, body: SaveSubmissionBody): Promise<CollectionSubmission> =>\n http.parsed(CollectionSubmission, `/collection-submissions/${encodeSegment(id)}`, {\n method: 'PATCH',\n body,\n }),\n submit: (id: string): Promise<CollectionSubmission> =>\n http.parsed(CollectionSubmission, `/collection-submissions/${encodeSegment(id)}/submit`, {\n method: 'POST',\n }),\n /** Where the submission's workflow run is; readable with the applicant's token. */\n status: (id: string): Promise<SubmissionStatus> =>\n http.parsed(SubmissionStatus, `/collection-submissions/${encodeSegment(id)}/status`),\n /** Embed allow-list and flow name for the submission; readable with the applicant's token. */\n embed: (id: string): Promise<SubmissionEmbed> =>\n http.parsed(SubmissionEmbed, `/collection-submissions/${encodeSegment(id)}/embed`),\n },\n\n /** Subject events: the facts velocity rules aggregate over. */\n events: {\n /** Inserts events; re-sent idempotency keys are counted as `duplicates`, not errors. */\n ingest: (body: IngestEventsBody): Promise<IngestEventsResult> =>\n http.parsed(IngestEventsResult, '/events', { method: 'POST', body }),\n /** Newest first. */\n list: (query: EventListQuery = {}): Promise<Event[]> =>\n list(Event, '/events', { ...query, from: isoOf(query.from), to: isoOf(query.to) }),\n },\n\n /**\n * Replays recorded evaluations against a rule version (`backtests:run`). `start` returns the\n * queued job; poll `get` until its status is `completed` (with `summary`) or `failed`.\n */\n backtests: {\n start: (body: StartBacktestBody): Promise<Backtest> =>\n http.parsed(Backtest, '/backtests', { method: 'POST', body }),\n /** Newest first. */\n list: (query: PageQuery = {}): Promise<Backtest[]> => list(Backtest, '/backtests', query),\n get: (id: string): Promise<Backtest> =>\n http.parsed(Backtest, `/backtests/${encodeSegment(id)}`),\n },\n\n decisions: {\n listBySubject: (subjectId: string): Promise<Decision[]> =>\n list(Decision, '/decisions', { subjectId }),\n },\n\n /** Filtered audit trail, exports and manifest verification (`audit:read`). See `audit.ts`. */\n audit,\n\n /** @deprecated Alias of `audit`, kept for existing callers. */\n auditEvents: {\n list: (query: AuditEventQuery = {}): Promise<AuditEvent[]> => audit.list(query),\n },\n\n /** Version history, diffs and the approval workflow of definitions. See `governance.ts`. */\n governance: governanceDomain(http),\n\n plugins: {\n list: (): Promise<PluginDefinition[]> => list(PluginDefinition, '/plugins'),\n available: (): Promise<PluginSummary[]> => list(PluginSummary, '/plugins/available'),\n configure: (name: string, body: ConfigurePluginBody): Promise<PluginDefinition> =>\n http.parsed(PluginDefinition, `/plugins/${encodeSegment(name)}`, { method: 'PUT', body }),\n },\n\n pluginInvocations: {\n list: (query: PluginInvocationQuery = {}): Promise<PluginInvocation[]> =>\n list(PluginInvocation, '/plugin-invocations', query),\n },\n\n /**\n * Uploaded files: `create` -> `uploadToStorage` (helper) -> `finalize` -> `pollDocument`\n * (helper) until the scan settles. See `documents.ts`.\n */\n documents: documentsDomain(http),\n\n /** Tenant settings such as the embed origin allow-list (`tenants:settings`). */\n tenants: tenantsDomain(http),\n\n /** Tenant lists (blocklists / allowlists) and their entries. Lists are keyed, not versioned. */\n lists: {\n list: (): Promise<List[]> => list(List, '/lists'),\n get: (key: string): Promise<List> => http.parsed(List, `/lists/${encodeSegment(key)}`),\n /** Creates the list or updates its metadata; entries are untouched. */\n upsert: (key: string, body: UpsertListBody): Promise<List> =>\n http.parsed(List, `/lists/${encodeSegment(key)}`, { method: 'PUT', body }),\n remove: async (key: string): Promise<void> => {\n await http.request(`/lists/${encodeSegment(key)}`, { method: 'DELETE' });\n },\n entries: (key: string, query: ListEntryQuery = {}): Promise<ListEntry[]> =>\n list(ListEntry, `/lists/${encodeSegment(key)}/entries`, query),\n addEntries: (key: string, body: AddListEntriesBody): Promise<ListImportResult> =>\n http.parsed(ListImportResult, `/lists/${encodeSegment(key)}/entries`, {\n method: 'POST',\n body,\n }),\n removeEntries: (key: string, body: RemoveListEntriesBody): Promise<RemovedCount> =>\n http.parsed(RemovedCount, `/lists/${encodeSegment(key)}/entries`, {\n method: 'DELETE',\n body,\n }),\n /** Uploads a CSV (one value per line, optional `value,reason,expires_at` header). */\n importCsv: (key: string, csv: string): Promise<ListImportResult> =>\n http.parsed(ListImportResult, `/lists/${encodeSegment(key)}/import`, {\n method: 'POST',\n raw: { content: csv, contentType: 'text/csv' },\n }),\n },\n };\n}\n\nexport type ApiClient = ReturnType<typeof createApiClient>;\n","import {\n FieldTypeDescription,\n StepTypeDescription,\n ValidationReport,\n type UpsertCollectionFlowInput,\n type UpsertWorkflowDefinitionInput,\n} from '@aletheia-dev/core';\nimport { z } from 'zod';\nimport type { Http } from './http.js';\n\n/** Schema endpoints that drive the builder's forms (`definitions:read`). */\nexport interface BuilderClient {\n /** Every workflow step type with its config JSON Schema, ui hints and data paths. */\n stepTypes: () => Promise<StepTypeDescription[]>;\n /** Every collection-flow field type with its options and value schemas. */\n fieldTypes: () => Promise<FieldTypeDescription[]>;\n}\n\nconst itemsOf = <T extends z.ZodType>(item: T) => z.object({ items: z.array(item) });\n\nexport function builderDomain(http: Http): BuilderClient {\n return {\n stepTypes: async () =>\n (await http.parsed(itemsOf(StepTypeDescription), '/workflow-step-types')).items,\n fieldTypes: async () =>\n (await http.parsed(itemsOf(FieldTypeDescription), '/collection-field-types')).items,\n };\n}\n\n/**\n * `POST <path>/validate`: full validation of an upsert body without saving it (schema, dangling\n * references, unknown keys). The report lists issues with step / field ids; nothing is stored.\n */\nexport function validateCall<B>(http: Http, path: string) {\n return (body: B): Promise<ValidationReport> =>\n http.parsed(ValidationReport, `${path}/validate`, { method: 'POST', body });\n}\n\nexport type ValidateWorkflowBody = z.input<typeof UpsertWorkflowDefinitionInput>;\nexport type ValidateCollectionFlowBody = z.input<typeof UpsertCollectionFlowInput>;\n","import { TenantSettings } from '@aletheia-dev/core';\nimport type { z } from 'zod';\nimport type { Http } from './http.js';\n\n/** Tenant-level settings (`/tenants/me/settings`, `tenants:settings`). */\nexport interface TenantsClient {\n getSettings: () => Promise<TenantSettings>;\n /** Replaces the whole settings object; the API rejects malformed origins with a 400. */\n /** Full replace; omitted sections (e.g. `cases`) fall back to their defaults. */\n updateSettings: (body: z.input<typeof TenantSettings>) => Promise<TenantSettings>;\n}\n\nexport function tenantsDomain(http: Http): TenantsClient {\n return {\n getSettings: () => http.parsed(TenantSettings, '/tenants/me/settings'),\n updateSettings: (body) =>\n http.parsed(TenantSettings, '/tenants/me/settings', { method: 'PUT', body }),\n };\n}\n","import { WorkflowRun, type StartWorkflowRunInput } from '@aletheia-dev/core';\nimport { z } from 'zod';\nimport { encodeSegment, type Http } from './http.js';\n\nexport type StartWorkflowRunBody = z.input<typeof StartWorkflowRunInput>;\n\nconst RunList = z.object({ items: z.array(WorkflowRun) });\n\n/** Workflow runs: start, read, list by subject and the admin-only event history. */\nexport interface WorkflowRunsClient {\n start: (body: StartWorkflowRunBody) => Promise<WorkflowRun>;\n get: (id: string) => Promise<WorkflowRun>;\n listBySubject: (subjectId: string) => Promise<WorkflowRun[]>;\n /**\n * The run's Temporal event history as proto JSON, for replaying it against a new worker\n * bundle (`node dist/replay.js`). Admin only; 409 when the API has no Temporal client.\n */\n history: (id: string) => Promise<unknown>;\n}\n\nexport function workflowRunsDomain(http: Http): WorkflowRunsClient {\n return {\n start: (body) => http.parsed(WorkflowRun, '/workflow-runs', { method: 'POST', body }),\n get: (id) => http.parsed(WorkflowRun, `/workflow-runs/${encodeSegment(id)}`),\n listBySubject: async (subjectId) =>\n (await http.parsed(RunList, '/workflow-runs', { query: { subjectId } })).items,\n history: (id) => http.request(`/workflow-runs/${encodeSegment(id)}/history`),\n };\n}\n","import { z } from 'zod';\nimport type { FetchLike } from './http.js';\n\n/**\n * Runtime configuration for the UIs, served as `GET /config.json` from the same origin as the\n * app. The `web` image's entrypoint writes one file per app from environment variables, so one\n * image serves every environment. The dev servers serve `public/config.json`, an empty object,\n * so the `VITE_*` values from the root `.env` and the localhost defaults apply instead.\n *\n * Every key is optional and an empty string counts as absent, so a partially rendered file\n * falls through to the next source. `zitadelClientId` differs per app.\n */\nexport const RuntimeConfig = z\n .object({\n apiUrl: z.string(),\n zitadelIssuer: z.string(),\n zitadelProjectId: z.string(),\n zitadelClientId: z.string(),\n zitadelOrgDomain: z.string(),\n collectionFlowUrl: z.string(),\n })\n .partial();\nexport type RuntimeConfig = z.infer<typeof RuntimeConfig>;\n\nexport type RuntimeConfigKey = keyof RuntimeConfig;\n\n/** Every key resolved to a string (possibly empty when no source provides it). */\nexport type ResolvedConfig = Record<RuntimeConfigKey, string>;\n\nexport const RUNTIME_CONFIG_PATH = '/config.json';\n\n/**\n * Fetches `/config.json` without caching so a redeploy with new values takes effect on the next\n * load. A missing file, a non-JSON body, a body that fails the schema or a network error all\n * yield `{}`: the caller's fallbacks then apply.\n */\nexport async function loadRuntimeConfig(fetchImpl: FetchLike = fetch): Promise<RuntimeConfig> {\n try {\n // `cache` is a browser-only request option; the package compiles against Node's types.\n const init = { cache: 'no-store', headers: { accept: 'application/json' } } as RequestInit;\n const response = await fetchImpl(RUNTIME_CONFIG_PATH, init);\n if (!response.ok) return {};\n const parsed = RuntimeConfig.safeParse(await response.json());\n return parsed.success ? parsed.data : {};\n } catch {\n return {};\n }\n}\n\nfunction present(value: string | undefined): value is string {\n return value !== undefined && value !== '';\n}\n\n/**\n * Merges the three sources: the runtime file wins, then the build-time `VITE_*` values the app\n * maps onto the same keys, then the app's defaults. Empty strings never win over a later source.\n */\nexport function resolveConfig(\n runtime: RuntimeConfig,\n env: Partial<Record<RuntimeConfigKey, string | undefined>>,\n defaults: ResolvedConfig,\n): ResolvedConfig {\n const resolved = { ...defaults };\n for (const key of Object.keys(defaults) as RuntimeConfigKey[]) {\n const fromRuntime = runtime[key];\n const fromEnv = env[key];\n if (present(fromRuntime)) resolved[key] = fromRuntime;\n else if (present(fromEnv)) resolved[key] = fromEnv;\n }\n return resolved;\n}\n"],"mappings":"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","names":["fetch","import_core","import_zod","import_core","import_core","import_zod","isoOf","import_core","import_core","import_zod","import_core","import_zod","import_core","import_core","import_zod","itemsOf","import_core","import_core","import_zod","CollectionSubmissionStatus","listOf","isoOf","import_zod"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/audit.ts","../src/http.ts","../src/governance.ts","../src/cases.ts","../src/documents.ts","../src/client.ts","../src/builder.ts","../src/definitions-packs.ts","../src/tenants.ts","../src/workflow-runs.ts","../src/runtime-config.ts"],"sourcesContent":["export {\n ApiError,\n FORBIDDEN_CODES,\n isApiError,\n isApiErrorBody,\n isForbidden,\n isTenantNotProvisioned,\n isUnauthenticated,\n type ApiErrorBody,\n} from './errors.js';\nexport type { AccessTokenProvider, FetchLike, RawBody } from './http.js';\nexport type { TenantsClient } from './tenants.js';\nexport {\n auditFilterParams,\n verifyExport,\n type AuditClient,\n type AuditFilterQuery,\n type AuditListQuery,\n type ExportVerification,\n} from './audit.js';\nexport {\n ApprovalOutcome,\n type ApprovalListQuery,\n type DiffQuery,\n type GovernanceClient,\n} from './governance.js';\n// The audit and governance domains are re-exported so the back office and builder can build\n// their audit, history and approval screens from the client alone.\nexport {\n ActorType,\n ApprovalCommentInput,\n ApprovalDecision,\n AuditEvent,\n AuditExportFormat,\n AuditFilter,\n DEFINITION_PATHS,\n DefinitionApproval,\n DefinitionDiff,\n DefinitionKind,\n DefinitionVersionSummary,\n DiffChange,\n DiffOp,\n} from '@aletheia-dev/core';\nexport type {\n ExportPolicyPackOptions,\n ImportPolicyPackOptions,\n PolicyPackKeyLike,\n PolicyPacksClient,\n} from './definitions-packs.js';\n// Policy pack schemas are re-exported so a CLI or UI can validate a pack before sending it.\nexport {\n POLICY_PACK_MAX_LIST_ROWS,\n PolicyPack,\n PolicyPackImportResult,\n PolicyPackKeyRef,\n parsePolicyPackKeyRef,\n policyPackKeyRefs,\n type PolicyPackInput,\n} from '@aletheia-dev/core';\nexport type { BuilderClient, ValidateCollectionFlowBody, ValidateWorkflowBody } from './builder.js';\n// Builder schema types are re-exported so the builder can drive its forms from the client alone.\nexport {\n Condition,\n ConditionOp,\n DefinitionIssue,\n FieldTypeDescription,\n FormUiHints,\n IssueSeverity,\n StepTypeDescription,\n ValidationReport,\n} from '@aletheia-dev/core';\nexport {\n CaseDetail,\n CaseQueueCount,\n DecideCaseResult,\n caseListParams,\n type AssignCaseBody,\n type CaseListQuery,\n type CaseNoteBody,\n type CaseQueuesClient,\n type CasesClient,\n type CloseCaseBody,\n type DecideCaseBody,\n type UpsertCaseQueueBody,\n type UserListQuery,\n type UsersClient,\n} from './cases.js';\n// The case domain is re-exported so the back office can build the workbench from the client alone.\nexport {\n AssignCaseInput,\n Case,\n CaseFilter,\n CaseNote,\n CaseNoteInput,\n CasePriority,\n CaseQueue,\n CaseSlaState,\n CaseSort,\n CaseStatus,\n CaseView,\n CloseCaseInput,\n DirectoryUser,\n SortOrder,\n UpsertCaseQueueInput,\n caseSlaState,\n} from '@aletheia-dev/core';\nexport {\n DocumentPollTimeoutError,\n UploadError,\n checkFileBeforeUpload,\n isTerminalDocumentStatus,\n pollDocument,\n uploadToStorage,\n type DocumentList,\n type DocumentListQuery,\n type DocumentScope,\n type DocumentsClient,\n type FileCheck,\n type PollOptions,\n type UploadOptions,\n type UploadProgressEvent,\n type UploadXhr,\n} from './documents.js';\n// The document domain is re-exported so the collection flow and back office can build their\n// upload and viewing screens from the client alone.\nexport {\n CreateDocumentInput,\n DOCUMENT_CONTENT_TYPES,\n DOCUMENT_MAX_BYTES,\n DOCUMENT_OPEN_STATUSES,\n Document,\n DocumentContentType,\n DocumentDownload,\n DocumentScan,\n DocumentStatus,\n DocumentUploadTicket,\n FileFieldValue,\n} from '@aletheia-dev/core';\n// The list, event, rule-set and backtest domains are re-exported so UIs can build their screens\n// from the client alone.\nexport {\n AggregationPolicy,\n AddListEntriesInput,\n Backtest,\n BacktestProgress,\n BacktestSample,\n BacktestSampleFailure,\n BacktestStatus,\n BacktestSummary,\n Event,\n EventKey,\n IngestEventsInput,\n IngestEventsResult,\n NewEvent,\n List,\n ListEntry,\n ListImportResult,\n ListKind,\n NewListEntry,\n RemoveListEntriesInput,\n RuleSetBody,\n RuleSetDefinition,\n RuleSetRule,\n RuleSetUseCase,\n ScoreBand,\n ScoreClamp,\n StartBacktestInput,\n UpsertListInput,\n UpsertRuleSetInput,\n bandFor,\n normalizeListValue,\n} from '@aletheia-dev/core';\n// Tenant settings are re-exported so the builder can validate origins before saving them.\nexport { TenantSettings, WebOrigin } from '@aletheia-dev/core';\n// The subject domain is re-exported so the back office can build the subject pages from the\n// client alone.\nexport {\n Subject,\n SubjectKind,\n SubjectListQuery,\n SubjectStatus,\n TimelineEntry,\n TimelineKind,\n TimelineQuery,\n} from '@aletheia-dev/core';\nexport {\n createApiClient,\n HealthStatus,\n Me,\n MePrincipal,\n ReadyStatus,\n DryRunResult,\n PluginSummary,\n RemovedCount,\n RuleTypeDescription,\n RuleUiHints,\n SubmissionDetail,\n SubmissionStatus,\n CreatedSubmission,\n SubmissionEmbed,\n type ApiClient,\n type ApiClientOptions,\n type CreateSubjectBody,\n type StartWorkflowRunBody,\n type DryRunBody,\n type DryRunInput,\n type UpsertWorkflowDefinitionBody,\n type UpsertRuleDefinitionBody,\n type UpsertRuleSetBody,\n type UpsertCollectionFlowBody,\n type CreateSubmissionBody,\n type SaveSubmissionBody,\n type UpsertListBody,\n type AddListEntriesBody,\n type RemoveListEntriesBody,\n type IngestEventsBody,\n type StartBacktestBody,\n type PageQuery,\n type EventListQuery,\n type ListEntryQuery,\n type AuditEventQuery,\n type PluginInvocationQuery,\n} from './client.js';\nexport {\n RUNTIME_CONFIG_PATH,\n RuntimeConfig,\n loadRuntimeConfig,\n resolveConfig,\n type ResolvedConfig,\n type RuntimeConfigKey,\n} from './runtime-config.js';\n","/** Shape of every non-2xx body returned by the API. */\nexport interface ApiErrorBody {\n error: { code: string; message: string; details?: unknown };\n}\n\n/** Thrown by the client for any non-2xx response. `status` is the HTTP status. */\nexport class ApiError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly code: string,\n public readonly details?: unknown,\n ) {\n super(message);\n this.name = 'ApiError';\n }\n\n /** Builds an ApiError from a response status and its (possibly non-JSON) body. */\n static fromResponse(status: number, statusText: string, body: unknown): ApiError {\n if (isApiErrorBody(body)) {\n return new ApiError(body.error.message, status, body.error.code, body.error.details);\n }\n const message = statusText ? `HTTP ${status} ${statusText}` : `HTTP ${status}`;\n return new ApiError(message, status, 'http_error', body);\n }\n}\n\nexport function isApiErrorBody(value: unknown): value is ApiErrorBody {\n if (typeof value !== 'object' || value === null) return false;\n const error = (value as { error?: unknown }).error;\n if (typeof error !== 'object' || error === null) return false;\n const { code, message } = error as { code?: unknown; message?: unknown };\n return typeof code === 'string' && typeof message === 'string';\n}\n\nexport function isApiError(value: unknown): value is ApiError {\n return value instanceof ApiError;\n}\n\n/** True for a 401 `unauthenticated` response: the caller must (re-)sign in. */\nexport function isUnauthenticated(value: unknown): value is ApiError {\n return isApiError(value) && value.code === 'unauthenticated';\n}\n\n/** Permission or provisioning failures: the caller is signed in but may not act. */\nexport const FORBIDDEN_CODES = ['forbidden', 'tenant_not_provisioned'] as const;\n\n/** True for a 403 response (`forbidden` or `tenant_not_provisioned`). */\nexport function isForbidden(value: unknown): value is ApiError {\n return isApiError(value) && (FORBIDDEN_CODES as readonly string[]).includes(value.code);\n}\n\n/** True when the signed-in organization has no tenant in Aletheia yet. */\nexport function isTenantNotProvisioned(value: unknown): value is ApiError {\n return isApiError(value) && value.code === 'tenant_not_provisioned';\n}\n","import { AuditEvent, type AuditExportFormat, type AuditFilter } from '@aletheia-dev/core';\nimport { z } from 'zod';\nimport { ApiError } from './errors.js';\nimport {\n buildUrl,\n type AccessTokenProvider,\n type FetchLike,\n type Http,\n type Query,\n} from './http.js';\n\n/**\n * Filters of `GET /audit-events` and its export. `action` is a prefix match (`case.` matches\n * `case.decided`); `from`/`to` bound `occurredAt` and are sent as ISO strings.\n */\nexport type AuditFilterQuery = Omit<AuditFilter, 'from' | 'to'> & {\n from?: Date | string;\n to?: Date | string;\n};\n\n/** `GET /audit-events` query: the filters plus offset paging (newest first). */\nexport type AuditListQuery = AuditFilterQuery & { limit?: number; offset?: number };\n\n/** What `audit.export` / `audit.exportUrl` need beyond the shared transport. */\nexport interface AuditTransport {\n baseUrl: string;\n getAccessToken: AccessTokenProvider;\n fetch: FetchLike;\n}\n\nexport interface AuditClient {\n /** Audit events matching `query`, newest first (`audit:read`). */\n list: (query?: AuditListQuery) => Promise<AuditEvent[]>;\n /** Absolute URL of the export endpoint for a filter (the request still needs the bearer token). */\n exportUrl: (format: AuditExportFormat, filter?: AuditFilterQuery) => string;\n /** Downloads the filtered export with the bearer token; the last line is the manifest. */\n export: (format: AuditExportFormat, filter?: AuditFilterQuery) => Promise<Blob>;\n}\n\nconst AuditEventList = z.object({ items: z.array(AuditEvent) });\n\nfunction isoOf(value: Date | string | undefined): string | undefined {\n return value instanceof Date ? value.toISOString() : value;\n}\n\n/** Flattens the filter into transport parameters (empty values are dropped by `buildUrl`). */\nexport function auditFilterParams(filter: AuditFilterQuery = {}): Query {\n return {\n action: filter.action,\n actorId: filter.actorId,\n actorType: filter.actorType,\n resourceType: filter.resourceType,\n resourceId: filter.resourceId,\n from: isoOf(filter.from),\n to: isoOf(filter.to),\n };\n}\n\nexport function auditDomain(http: Http, transport: AuditTransport): AuditClient {\n const exportUrl = (format: AuditExportFormat, filter?: AuditFilterQuery): string =>\n buildUrl(transport.baseUrl, '/audit-events/export', {\n format,\n ...auditFilterParams(filter),\n });\n\n return {\n list: async (query = {}) => {\n const { limit, offset, ...filter } = query;\n const body = await http.parsed(AuditEventList, '/audit-events', {\n query: { ...auditFilterParams(filter), limit, offset },\n });\n return body.items;\n },\n exportUrl,\n export: async (format, filter) => {\n const headers: Record<string, string> = { accept: '*/*' };\n const token = await transport.getAccessToken();\n if (token) headers.authorization = `Bearer ${token}`;\n const response = await transport.fetch(exportUrl(format, filter), {\n method: 'GET',\n headers,\n });\n if (!response.ok) {\n const text = await response.text();\n let body: unknown = text || undefined;\n try {\n body = text ? (JSON.parse(text) as unknown) : undefined;\n } catch {\n // Not JSON: keep the raw text as the error details.\n }\n throw ApiError.fromResponse(response.status, response.statusText, body);\n }\n return response.blob();\n },\n };\n}\n\n/** Outcome of checking an export against its trailing manifest. */\nexport interface ExportVerification {\n /** True when a manifest was found and its digest matches the body. */\n ok: boolean;\n /** Row count stated by the manifest (0 when there is none). */\n rows: number;\n /** Digest stated by the manifest, when present. */\n expected?: string;\n /** SHA-256 (hex) of the body before the manifest line. */\n actual: string;\n}\n\ninterface Manifest {\n sha256: string;\n rows: number;\n}\n\nconst CSV_MANIFEST = /^#\\s*sha256=([0-9a-fA-F]+)\\s+rows=(\\d+)\\s*$/;\nconst JsonlManifest = z.object({\n _manifest: z.object({ sha256: z.string(), rows: z.coerce.number().int().nonnegative() }),\n});\n\nfunction parseManifest(line: string, format: AuditExportFormat): Manifest | undefined {\n const trimmed = line.replace(/\\r$/, '');\n if (format === 'csv') {\n const match = CSV_MANIFEST.exec(trimmed);\n return match ? { sha256: match[1]!.toLowerCase(), rows: Number(match[2]) } : undefined;\n }\n try {\n const parsed = JsonlManifest.safeParse(JSON.parse(trimmed));\n if (!parsed.success) return undefined;\n return { sha256: parsed.data._manifest.sha256.toLowerCase(), rows: parsed.data._manifest.rows };\n } catch {\n return undefined;\n }\n}\n\nasync function sha256Hex(text: string): Promise<string> {\n const digest = await globalThis.crypto.subtle.digest('SHA-256', new TextEncoder().encode(text));\n return Array.from(new Uint8Array(digest), (b) => b.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Checks an exported file against its manifest (the last line: `# sha256=<hex> rows=<n>` for\n * CSV, `{\"_manifest\":{\"sha256\",\"rows\"}}` for JSONL). The digest covers every byte before the\n * manifest line, including the newline that ends the last data row, as the server hashes it.\n */\nexport async function verifyExport(\n text: string,\n format: AuditExportFormat,\n): Promise<ExportVerification> {\n // A single trailing newline after the manifest is not part of it.\n const content = text.endsWith('\\n') ? text.slice(0, -1) : text;\n const cut = content.lastIndexOf('\\n');\n const body = cut === -1 ? '' : content.slice(0, cut + 1);\n const manifest = parseManifest(content.slice(cut + 1), format);\n if (!manifest) {\n return { ok: false, rows: 0, actual: await sha256Hex(text) };\n }\n const actual = await sha256Hex(body);\n return { ok: actual === manifest.sha256, rows: manifest.rows, expected: manifest.sha256, actual };\n}\n","import type { z } from 'zod';\nimport { ApiError } from './errors.js';\n\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;\n\n/** Returns the current bearer token, or nothing when the caller is not signed in. */\nexport type AccessTokenProvider = () => Promise<string | undefined> | string | undefined;\n\nexport interface HttpOptions {\n baseUrl: string;\n getAccessToken: AccessTokenProvider;\n fetch: FetchLike;\n}\n\n/** One query value; arrays are serialised as repeated parameters (`status=a&status=b`). */\nexport type QueryValue = string | number | boolean | undefined | null | readonly string[];\nexport type Query = Record<string, QueryValue>;\n\n/** A body sent verbatim with an explicit content type (e.g. a CSV upload). */\nexport interface RawBody {\n content: string;\n contentType: string;\n}\n\nexport interface RequestOptions {\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n query?: Query;\n /** JSON-encoded request body. Ignored when `raw` is set. */\n body?: unknown;\n /** Raw text body; takes precedence over `body`. */\n raw?: RawBody;\n}\n\nexport function buildUrl(baseUrl: string, path: string, query?: Query): string {\n const url = `${baseUrl}${path}`;\n if (!query) return url;\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null || value === '') continue;\n if (typeof value === 'object') {\n // Repeated parameters: the API reads array filters with `getAll`.\n for (const item of value) params.append(key, item);\n continue;\n }\n params.set(key, String(value));\n }\n const qs = params.toString();\n return qs ? `${url}?${qs}` : url;\n}\n\nasync function readBody(response: Response): Promise<unknown> {\n const text = await response.text();\n if (!text) return undefined;\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return text;\n }\n}\n\n/** Minimal transport: sets the bearer header, encodes query & body (JSON or raw text), maps errors. */\nexport class Http {\n constructor(private readonly options: HttpOptions) {}\n\n async request(path: string, options: RequestOptions = {}): Promise<unknown> {\n const { baseUrl, getAccessToken, fetch } = this.options;\n const method = options.method ?? 'GET';\n const headers: Record<string, string> = { accept: 'application/json' };\n const token = await getAccessToken();\n if (token) headers.authorization = `Bearer ${token}`;\n const init: RequestInit = { method, headers };\n if (options.raw !== undefined) {\n headers['content-type'] = options.raw.contentType;\n init.body = options.raw.content;\n } else if (options.body !== undefined) {\n headers['content-type'] = 'application/json';\n init.body = JSON.stringify(options.body);\n }\n const response = await fetch(buildUrl(baseUrl, path, options.query), init);\n const body = await readBody(response);\n if (!response.ok) {\n throw ApiError.fromResponse(response.status, response.statusText, body);\n }\n return body;\n }\n\n /** Requests and parses the body with `schema` (dates are coerced by the core schemas). */\n async parsed<T extends z.ZodType>(\n schema: T,\n path: string,\n options?: RequestOptions,\n ): Promise<z.output<T>> {\n const body = await this.request(path, options);\n return schema.parse(body) as z.output<T>;\n }\n}\n\nexport function encodeSegment(value: string): string {\n return encodeURIComponent(value);\n}\n","import {\n DEFINITION_PATHS,\n DefinitionApproval,\n DefinitionDiff,\n DefinitionVersionSummary,\n type ApprovalCommentInput,\n type DefinitionKind,\n} from '@aletheia-dev/core';\nimport { z } from 'zod';\nimport { encodeSegment, type Http } from './http.js';\n\n/** Accepts the API's `{ items }` envelope (or a bare array) and yields the items. */\nconst itemsOf = <T extends z.ZodType>(item: T) =>\n z.union([z.object({ items: z.array(item) }).transform((body) => body.items), z.array(item)]);\n\n/** Response of `POST .../approve` and `.../reject`: the decided approval and the definition. */\nexport const ApprovalOutcome = z.object({\n approval: DefinitionApproval,\n definition: z.unknown(),\n});\nexport type ApprovalOutcome = z.infer<typeof ApprovalOutcome>;\n\n/** Version pair of a diff; `from` defaults to the published version, `to` to the latest. */\nexport interface DiffQuery {\n from?: number;\n to?: number;\n}\n\nexport interface ApprovalListQuery {\n kind?: DefinitionKind;\n}\n\nexport interface GovernanceClient {\n /** Every version of a definition, with status, author and approval (`definitions:read`). */\n versions: (kind: DefinitionKind, key: string) => Promise<DefinitionVersionSummary[]>;\n /** The full definition entity of one version, e.g. to restore it as a draft. */\n getVersion: (kind: DefinitionKind, key: string, version: number) => Promise<unknown>;\n /** Structured diff between two versions with a readable summary per change. */\n diff: (kind: DefinitionKind, key: string, query?: DiffQuery) => Promise<DefinitionDiff>;\n /** Moves a draft to `pending_approval` (`definitions:write`). */\n requestApproval: (\n kind: DefinitionKind,\n key: string,\n version: number,\n body?: ApprovalCommentInput,\n ) => Promise<DefinitionApproval>;\n /** Approves and publishes a pending version (`definitions:approve`). */\n approve: (\n kind: DefinitionKind,\n key: string,\n version: number,\n body?: ApprovalCommentInput,\n ) => Promise<ApprovalOutcome>;\n /** Sends a pending version back to draft (`definitions:approve`). */\n reject: (\n kind: DefinitionKind,\n key: string,\n version: number,\n body?: ApprovalCommentInput,\n ) => Promise<ApprovalOutcome>;\n approvals: {\n /** Approvals awaiting a decision, optionally for one definition kind. */\n listOpen: (query?: ApprovalListQuery) => Promise<DefinitionApproval[]>;\n };\n}\n\nfunction definitionPath(kind: DefinitionKind, key: string): string {\n return `${DEFINITION_PATHS[kind]}/${encodeSegment(key)}`;\n}\n\nfunction versionPath(kind: DefinitionKind, key: string, version: number): string {\n return `${definitionPath(kind, key)}/versions/${encodeSegment(String(version))}`;\n}\n\nexport function governanceDomain(http: Http): GovernanceClient {\n return {\n versions: (kind, key) =>\n http.parsed(itemsOf(DefinitionVersionSummary), `${definitionPath(kind, key)}/versions`),\n getVersion: (kind, key, version) => http.request(versionPath(kind, key, version)),\n diff: (kind, key, query = {}) =>\n http.parsed(DefinitionDiff, `${definitionPath(kind, key)}/diff`, {\n query: { from: query.from, to: query.to },\n }),\n requestApproval: (kind, key, version, body = {}) =>\n http.parsed(DefinitionApproval, `${versionPath(kind, key, version)}/request-approval`, {\n method: 'POST',\n body,\n }),\n approve: (kind, key, version, body = {}) =>\n http.parsed(ApprovalOutcome, `${versionPath(kind, key, version)}/approve`, {\n method: 'POST',\n body,\n }),\n reject: (kind, key, version, body = {}) =>\n http.parsed(ApprovalOutcome, `${versionPath(kind, key, version)}/reject`, {\n method: 'POST',\n body,\n }),\n approvals: {\n listOpen: (query = {}) =>\n http.parsed(itemsOf(DefinitionApproval), '/approvals', { query: { kind: query.kind } }),\n },\n };\n}\n","// Cases: the review workbench domain (list/detail/decide, assignment, closing, notes), the saved\n// filters analysts work from (`/case-queues`) and the reviewer directory (`/users`).\nimport {\n type AssignCaseInput,\n Case,\n CaseNote,\n type CaseNoteInput,\n type CasePriority,\n CaseQueue,\n type CaseSlaState,\n type CaseSort,\n type CaseStatus,\n CaseView,\n type CloseCaseInput,\n type DecideCaseInput,\n Decision,\n DirectoryUser,\n type SortOrder,\n Subject,\n type UpsertCaseQueueInput,\n WorkflowRun,\n} from '@aletheia-dev/core';\nimport { z } from 'zod';\nimport { encodeSegment, type Http, type Query } from './http.js';\n\nexport type DecideCaseBody = z.input<typeof DecideCaseInput>;\nexport type AssignCaseBody = z.input<typeof AssignCaseInput>;\nexport type CloseCaseBody = z.input<typeof CloseCaseInput>;\nexport type CaseNoteBody = z.input<typeof CaseNoteInput>;\n/** Body of `POST/PUT /case-queues`; `filter`, `sort`, `order` and `position` have defaults. */\nexport type UpsertCaseQueueBody = z.input<typeof UpsertCaseQueueInput>;\n\n/**\n * Filters of `GET /cases`. Array filters are sent as repeated parameters\n * (`status=open&status=in_review`); a single value is accepted for convenience.\n * `assignee` is `me`, `unassigned` or a directory user id.\n */\nexport type CaseListQuery = {\n status?: CaseStatus | CaseStatus[];\n priority?: CasePriority | CasePriority[];\n assignee?: string;\n type?: string;\n subjectId?: string;\n slaState?: CaseSlaState | CaseSlaState[];\n dueBefore?: Date | string;\n search?: string;\n sort?: CaseSort;\n order?: SortOrder;\n limit?: number;\n offset?: number;\n};\n\nexport type UserListQuery = {\n /** Only users holding this role (e.g. `analyst`, `admin`). */\n role?: string;\n};\n\nexport const CaseDetail = z.object({\n case: CaseView,\n subject: Subject,\n run: WorkflowRun.nullable(),\n decisions: z.array(Decision),\n});\nexport type CaseDetail = z.infer<typeof CaseDetail>;\n\nexport const DecideCaseResult = z.object({ case: Case, decision: Decision });\nexport type DecideCaseResult = z.infer<typeof DecideCaseResult>;\n\n/** One row of `GET /case-queues/counts`: how many cases match the queue's filter right now. */\nexport const CaseQueueCount = z.object({\n queueId: z.string(),\n count: z.number().int().nonnegative(),\n});\nexport type CaseQueueCount = z.infer<typeof CaseQueueCount>;\n\nconst listOf = <T extends z.ZodType>(item: T) => z.object({ items: z.array(item) });\n\nfunction arrayOf<T extends string>(value: T | T[] | undefined): T[] | undefined {\n if (value === undefined) return undefined;\n return Array.isArray(value) ? value : [value];\n}\n\nfunction isoOf(value: Date | string | undefined): string | undefined {\n return value instanceof Date ? value.toISOString() : value;\n}\n\n/** Flattens a `CaseListQuery` into transport parameters; arrays repeat, dates become ISO. */\nexport function caseListParams(query: CaseListQuery): Query {\n return {\n status: arrayOf(query.status),\n priority: arrayOf(query.priority),\n assignee: query.assignee,\n type: query.type,\n subjectId: query.subjectId,\n slaState: arrayOf(query.slaState),\n dueBefore: isoOf(query.dueBefore),\n search: query.search,\n sort: query.sort,\n order: query.order,\n limit: query.limit,\n offset: query.offset,\n };\n}\n\nexport function casesDomain(http: Http) {\n const casePath = (id: string, suffix = '') => `/cases/${encodeSegment(id)}${suffix}`;\n const notePath = (id: string, noteId: string) => casePath(id, `/notes/${encodeSegment(noteId)}`);\n const post = (path: string, body?: unknown) =>\n http.parsed(CaseView, path, body === undefined ? { method: 'POST' } : { method: 'POST', body });\n return {\n /** Cases matching `query`, in the requested order (`createdAt` desc by default). */\n list: async (query: CaseListQuery = {}): Promise<CaseView[]> =>\n (await http.parsed(listOf(CaseView), '/cases', { query: caseListParams(query) })).items,\n get: (id: string): Promise<CaseDetail> => http.parsed(CaseDetail, casePath(id)),\n decide: (id: string, body: DecideCaseBody): Promise<DecideCaseResult> =>\n http.parsed(DecideCaseResult, casePath(id, '/decide'), { method: 'POST', body }),\n /** Sets or clears (`assigneeId: null`) the assignee (`cases:assign`). */\n assign: (id: string, body: AssignCaseBody): Promise<CaseView> =>\n post(casePath(id, '/assign'), body),\n /** Assigns the case to the caller (`cases:claim`). */\n claim: (id: string): Promise<CaseView> => post(casePath(id, '/claim')),\n /**\n * Closes the case (`cases:decide`). An undecided case gets a `reject` decision with reason\n * code `case_closed` so its workflow run does not wait forever.\n */\n close: (id: string, body: CloseCaseBody = {}): Promise<CaseView> =>\n post(casePath(id, '/close'), body),\n /** Analyst notes on a case (`cases:notes`); edits and deletes are limited to the author or an admin. */\n notes: {\n list: async (id: string): Promise<CaseNote[]> =>\n (await http.parsed(listOf(CaseNote), casePath(id, '/notes'))).items,\n create: (id: string, body: CaseNoteBody): Promise<CaseNote> =>\n http.parsed(CaseNote, casePath(id, '/notes'), { method: 'POST', body }),\n update: (id: string, noteId: string, body: CaseNoteBody): Promise<CaseNote> =>\n http.parsed(CaseNote, notePath(id, noteId), { method: 'PATCH', body }),\n remove: async (id: string, noteId: string): Promise<void> => {\n await http.request(notePath(id, noteId), { method: 'DELETE' });\n },\n },\n };\n}\nexport type CasesClient = ReturnType<typeof casesDomain>;\n\n/** Saved case filters (`cases:read` to list, `cases:assign` to manage). */\nexport function caseQueuesDomain(http: Http) {\n const queuePath = (id: string) => `/case-queues/${encodeSegment(id)}`;\n return {\n list: async (): Promise<CaseQueue[]> =>\n (await http.parsed(listOf(CaseQueue), '/case-queues')).items,\n counts: async (): Promise<CaseQueueCount[]> =>\n (await http.parsed(listOf(CaseQueueCount), '/case-queues/counts')).items,\n create: (body: UpsertCaseQueueBody): Promise<CaseQueue> =>\n http.parsed(CaseQueue, '/case-queues', { method: 'POST', body }),\n update: (id: string, body: UpsertCaseQueueBody): Promise<CaseQueue> =>\n http.parsed(CaseQueue, queuePath(id), { method: 'PUT', body }),\n remove: async (id: string): Promise<void> => {\n await http.request(queuePath(id), { method: 'DELETE' });\n },\n };\n}\nexport type CaseQueuesClient = ReturnType<typeof caseQueuesDomain>;\n\n/** The reviewer directory (`cases:assign` or `cases:claim`); empty when none is configured. */\nexport function usersDomain(http: Http) {\n return {\n list: async (query: UserListQuery = {}): Promise<DirectoryUser[]> =>\n (await http.parsed(listOf(DirectoryUser), '/users', { query: { role: query.role } })).items,\n };\n}\nexport type UsersClient = ReturnType<typeof usersDomain>;\n","// Documents: direct-to-storage uploads, finalize/scan polling and presigned downloads.\nimport {\n type CreateDocumentInput,\n DOCUMENT_CONTENT_TYPES,\n DOCUMENT_MAX_BYTES,\n DOCUMENT_OPEN_STATUSES,\n Document,\n DocumentDownload,\n type DocumentStatus,\n DocumentUploadTicket,\n} from '@aletheia-dev/core';\nimport { z } from 'zod';\nimport { encodeSegment, type Http } from './http.js';\n\n/**\n * Applicants (submission-token clients) must name their submission on every `/documents/:id`\n * route; operators and integrations omit it.\n */\nexport interface DocumentScope {\n submissionId?: string;\n}\n\n/** Filters of `GET /documents` (`documents:read`). */\nexport interface DocumentListQuery {\n subjectId?: string;\n submissionId?: string;\n caseId?: string;\n status?: DocumentStatus;\n limit?: number;\n offset?: number;\n}\n\nconst DocumentList = z.object({ items: z.array(Document) });\nexport type DocumentList = z.infer<typeof DocumentList>;\n\nexport function documentsDomain(http: Http) {\n const idPath = (id: string, suffix = '') => `/documents/${encodeSegment(id)}${suffix}`;\n return {\n /**\n * Registers a pending document and returns the presigned POST to send the bytes with\n * (`uploadToStorage`). Applicants pass their `submissionId` and the `fieldKey`.\n */\n create: (input: CreateDocumentInput): Promise<DocumentUploadTicket> =>\n http.parsed(DocumentUploadTicket, '/documents', { method: 'POST', body: input }),\n /**\n * Verifies the uploaded object and starts the scan. Resolves with status `uploaded` or\n * `rejected` (see `rejectionReason`); throws a 409 `ApiError` when nothing was uploaded.\n */\n finalize: (id: string, opts: DocumentScope = {}): Promise<Document> =>\n http.parsed(Document, idPath(id, '/finalize'), { method: 'POST', query: { ...opts } }),\n get: (id: string, opts: DocumentScope = {}): Promise<Document> =>\n http.parsed(Document, idPath(id), { query: { ...opts } }),\n list: (filters: DocumentListQuery = {}): Promise<DocumentList> =>\n http.parsed(DocumentList, '/documents', { query: { ...filters } }),\n /** A 60-second presigned GET on the storage origin; open it directly, never via the API. */\n download: (id: string, opts: DocumentScope = {}): Promise<DocumentDownload> =>\n http.parsed(DocumentDownload, idPath(id, '/download'), { query: { ...opts } }),\n };\n}\n\nexport type DocumentsClient = ReturnType<typeof documentsDomain>;\n\n// ---- browser-side helpers ----\n\n/** Thrown by `uploadToStorage`; `status` is 0 for network errors, aborts and timeouts. */\nexport class UploadError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n ) {\n super(message);\n this.name = 'UploadError';\n }\n}\n\nexport interface UploadProgressEvent {\n lengthComputable: boolean;\n loaded: number;\n total: number;\n}\n\n/** The slice of `XMLHttpRequest` the uploader uses; injectable so tests need no network. */\nexport interface UploadXhr {\n readonly status: number;\n open(method: string, url: string): void;\n send(body: FormData): void;\n abort(): void;\n addEventListener(type: 'load' | 'error' | 'abort' | 'timeout', listener: () => void): void;\n upload: {\n addEventListener(type: 'progress', listener: (event: UploadProgressEvent) => void): void;\n };\n}\n\nexport interface UploadOptions {\n /** Called with 0..1 as bytes leave the browser; called with 1 once storage accepts the file. */\n onProgress?: (fraction: number) => void;\n signal?: AbortSignal;\n /** XMLHttpRequest factory; defaults to the global one. */\n xhr?: () => UploadXhr;\n}\n\nfunction defaultXhr(): UploadXhr {\n const ctor = (globalThis as { XMLHttpRequest?: new () => UploadXhr }).XMLHttpRequest;\n if (!ctor) throw new UploadError('XMLHttpRequest is not available in this environment', 0);\n return new ctor();\n}\n\n/**\n * Posts `file` to the presigned URL of `ticket` as multipart form data: the policy fields first,\n * in order, then the file under `file`. The browser sets the multipart content type itself.\n */\nexport function uploadToStorage(\n ticket: DocumentUploadTicket,\n file: Blob,\n opts: UploadOptions = {},\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (opts.signal?.aborted) {\n reject(new UploadError('Upload aborted', 0));\n return;\n }\n const xhr = (opts.xhr ?? defaultXhr)();\n const form = new FormData();\n for (const [name, value] of Object.entries(ticket.upload.fields)) form.append(name, value);\n form.append('file', file);\n\n const onAbort = () => xhr.abort();\n opts.signal?.addEventListener('abort', onAbort, { once: true });\n const settle = (fn: () => void) => {\n opts.signal?.removeEventListener('abort', onAbort);\n fn();\n };\n\n xhr.upload.addEventListener('progress', (event) => {\n if (event.lengthComputable && event.total > 0) {\n opts.onProgress?.(Math.min(1, event.loaded / event.total));\n }\n });\n xhr.addEventListener('load', () =>\n settle(() => {\n if (xhr.status >= 200 && xhr.status < 300) {\n opts.onProgress?.(1);\n resolve();\n } else {\n reject(new UploadError(`Storage refused the upload (HTTP ${xhr.status})`, xhr.status));\n }\n }),\n );\n xhr.addEventListener('error', () =>\n settle(() => reject(new UploadError('Network error while uploading the file', 0))),\n );\n xhr.addEventListener('abort', () => settle(() => reject(new UploadError('Upload aborted', 0))));\n xhr.addEventListener('timeout', () =>\n settle(() => reject(new UploadError('The upload timed out', 0))),\n );\n xhr.open('POST', ticket.upload.url);\n xhr.send(form);\n });\n}\n\nexport type FileCheck = { ok: true } | { ok: false; reason: string };\n\nconst TYPE_LABELS = 'JPEG, PNG, WebP or PDF';\n\n/** Client-side pre-check mirroring the policy storage enforces; saves a doomed round trip. */\nexport function checkFileBeforeUpload(file: {\n type: string;\n size: number;\n name: string;\n}): FileCheck {\n if (!file.name.trim()) return { ok: false, reason: 'The file has no name.' };\n if (!(DOCUMENT_CONTENT_TYPES as readonly string[]).includes(file.type)) {\n const got = file.type || 'unknown type';\n return { ok: false, reason: `Only ${TYPE_LABELS} files are accepted (this is ${got}).` };\n }\n if (file.size < 1) return { ok: false, reason: 'The file is empty.' };\n if (file.size > DOCUMENT_MAX_BYTES) {\n const mib = Math.round(DOCUMENT_MAX_BYTES / (1024 * 1024));\n return { ok: false, reason: `The file is larger than ${mib} MiB.` };\n }\n return { ok: true };\n}\n\nexport interface PollOptions extends DocumentScope {\n intervalMs?: number;\n timeoutMs?: number;\n signal?: AbortSignal;\n}\n\n/** Thrown by `pollDocument` when the scan does not settle within `timeoutMs`. */\nexport class DocumentPollTimeoutError extends Error {\n constructor(public readonly documentId: string) {\n super('Timed out waiting for the document scan to finish');\n this.name = 'DocumentPollTimeoutError';\n }\n}\n\nexport function isTerminalDocumentStatus(status: DocumentStatus): boolean {\n return !DOCUMENT_OPEN_STATUSES.includes(status);\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n function onAbort() {\n clearTimeout(timer);\n reject(new Error('Polling aborted'));\n }\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\n/**\n * Reads the document until its status is terminal (`clean`, `infected` or `rejected`). The first\n * read is immediate; later ones every `intervalMs` (750 ms) until `timeoutMs` (60 s).\n */\nexport async function pollDocument(\n client: { documents: Pick<DocumentsClient, 'get'> },\n id: string,\n opts: PollOptions = {},\n): Promise<Document> {\n const { intervalMs = 750, timeoutMs = 60_000, signal, submissionId } = opts;\n const deadline = Date.now() + timeoutMs;\n for (;;) {\n const document = await client.documents.get(id, { submissionId });\n if (isTerminalDocumentStatus(document.status)) return document;\n const remaining = deadline - Date.now();\n if (remaining <= 0) throw new DocumentPollTimeoutError(id);\n await sleep(Math.min(intervalMs, remaining), signal);\n }\n}\n","import { z } from 'zod';\nimport {\n type AddListEntriesInput,\n type AuditEvent,\n Backtest,\n CollectionFlowDefinition,\n CollectionSubmission,\n type ConfigurePluginInput,\n DefinitionStatus,\n type CreateSubjectInput,\n type CreateSubmissionInput,\n Decision,\n DecisionOutcome,\n Event,\n Id,\n type IngestEventsInput,\n IngestEventsResult,\n List,\n ListEntry,\n ListImportResult,\n PluginDefinition,\n PluginInvocation,\n RuleDefinition,\n RuleEvaluationResult,\n RuleSetDefinition,\n RuleType,\n type RemoveListEntriesInput,\n type SaveSubmissionInput,\n type StartBacktestInput,\n SubmissionStatus as CollectionSubmissionStatus,\n Subject,\n type SubjectListQuery,\n TimelineEntry,\n type TimelineQuery,\n type UpsertCollectionFlowInput,\n type UpsertListInput,\n type UpsertRuleDefinitionInput,\n type UpsertRuleSetInput,\n type UpsertWorkflowDefinitionInput,\n WorkflowDefinition,\n WorkflowRunStatus,\n} from '@aletheia-dev/core';\nimport { auditDomain, type AuditListQuery } from './audit.js';\nimport { builderDomain, validateCall } from './builder.js';\nimport { caseQueuesDomain, casesDomain, usersDomain } from './cases.js';\nimport { policyPacksDomain } from './definitions-packs.js';\nimport { documentsDomain } from './documents.js';\nimport { governanceDomain } from './governance.js';\nimport { tenantsDomain } from './tenants.js';\nimport { workflowRunsDomain, type StartWorkflowRunBody } from './workflow-runs.js';\nimport {\n Http,\n encodeSegment,\n type AccessTokenProvider,\n type FetchLike,\n type Query,\n} from './http.js';\n\nexport interface ApiClientOptions {\n /** API origin, e.g. `http://localhost:4000`. A trailing slash is tolerated. */\n baseUrl: string;\n /**\n * Returns the bearer token for the current caller (a Zitadel access token, or an applicant\n * submission token). When it yields nothing the request is sent without `Authorization`.\n */\n getAccessToken: AccessTokenProvider;\n /** Injectable for tests; defaults to the global fetch. */\n fetch?: FetchLike;\n}\n\n// ---- request bodies (input side of the core schemas: defaults may be omitted) ----\nexport type CreateSubjectBody = z.input<typeof CreateSubjectInput>;\nexport type { StartWorkflowRunBody };\nexport type ConfigurePluginBody = z.input<typeof ConfigurePluginInput>;\nexport type UpsertWorkflowDefinitionBody = z.input<typeof UpsertWorkflowDefinitionInput>;\nexport type UpsertRuleDefinitionBody = z.input<typeof UpsertRuleDefinitionInput>;\n/** Body of `PUT /rule-sets/:key`; `enabled`/`shadow` on each rule and `useCase` may be omitted. */\nexport type UpsertRuleSetBody = z.input<typeof UpsertRuleSetInput>;\nexport type UpsertCollectionFlowBody = z.input<typeof UpsertCollectionFlowInput>;\nexport type CreateSubmissionBody = z.input<typeof CreateSubmissionInput>;\nexport type SaveSubmissionBody = z.input<typeof SaveSubmissionInput>;\nexport type UpsertListBody = z.input<typeof UpsertListInput>;\nexport type AddListEntriesBody = z.input<typeof AddListEntriesInput>;\nexport type RemoveListEntriesBody = z.input<typeof RemoveListEntriesInput>;\n/** Body of `POST /events`: up to 1 000 events; `occurredAt` may be a Date or ISO string. */\nexport type IngestEventsBody = z.input<typeof IngestEventsInput>;\n/**\n * Body of `POST /backtests`. `version` defaults to the latest version of the rule (drafts\n * included); `sample` defaults to the last 30 days, 1 000 subjects.\n */\nexport type StartBacktestBody = z.input<typeof StartBacktestInput>;\n\n/** Input of a dry run: a stored subject's id, or an inline data object (exactly one of the two). */\nexport type DryRunInput =\n | { subjectId: string; data?: undefined }\n | { data: Record<string, unknown>; subjectId?: undefined };\n\n/** Body of `POST /rule-definitions/:key/dry-run`. `version` defaults to the latest draft. */\nexport type DryRunBody = DryRunInput & { version?: number };\n\n// ---- response schemas ----\nexport const HealthStatus = z.object({ status: z.literal('ok') });\nexport type HealthStatus = z.infer<typeof HealthStatus>;\n\n/** Who the API resolved the bearer token to (`GET /me`). */\nexport const MePrincipal = z.object({\n kind: z.enum(['human', 'machine', 'applicant']),\n subject: z.string(),\n name: z.string().optional(),\n email: z.string().optional(),\n});\nexport type MePrincipal = z.infer<typeof MePrincipal>;\n\nexport const Me = z.object({\n principal: MePrincipal,\n tenantId: z.string(),\n orgId: z.string().optional(),\n permissions: z.array(z.string()),\n});\nexport type Me = z.infer<typeof Me>;\n\nexport const CheckStatus = z.enum(['ok', 'error']);\nexport const ReadyStatus = z.object({\n status: z.enum(['ok', 'degraded']),\n checks: z.object({ db: CheckStatus, temporal: CheckStatus }),\n});\nexport type ReadyStatus = z.infer<typeof ReadyStatus>;\n\n/** A plugin compiled into the deployment (`GET /plugins/available`). */\nexport const PluginSummary = z.object({\n name: z.string(),\n version: z.string(),\n description: z.string().optional(),\n capabilities: z.array(z.string()),\n secrets: z.array(z.string()),\n actions: z.array(z.string()),\n configSchema: z.unknown(),\n});\nexport type PluginSummary = z.infer<typeof PluginSummary>;\n\n/** Rendering hints for the builder's schema-driven config forms; every part is optional. */\nexport const RuleUiHints = z.object({\n /** Config fields in display order; unlisted fields follow in schema order. */\n fieldOrder: z.array(z.string()).optional(),\n labels: z.record(z.string(), z.string()).optional(),\n help: z.record(z.string(), z.string()).optional(),\n /** Config fields that hold a list key; the builder renders a list picker for them. */\n listPicker: z.array(z.string()).optional(),\n});\nexport type RuleUiHints = z.infer<typeof RuleUiHints>;\n\nexport const RuleTypeDescription = z.object({\n type: RuleType,\n description: z.string(),\n /** JSON Schema of the rule config, produced by `z.toJSONSchema` on the API. */\n configSchema: z.unknown(),\n /** Dot-path namespaces a rule config may reference, e.g. `subject.<field>`. */\n dataPaths: z.array(z.string()).default([]),\n uiHints: RuleUiHints.optional(),\n});\nexport type RuleTypeDescription = z.infer<typeof RuleTypeDescription>;\n\n/** Response of `POST /rule-definitions/:key/dry-run`: the evaluation plus what was evaluated. */\nexport const DryRunResult = z.object({\n result: RuleEvaluationResult,\n rule: z.object({\n key: z.string(),\n version: z.number().int(),\n status: DefinitionStatus,\n type: RuleType,\n }),\n /** Data namespaces the rule may reference, a hint for composing inline test data. */\n dataPaths: z.array(z.string()).default([]),\n});\nexport type DryRunResult = z.infer<typeof DryRunResult>;\n\n/** Response of `DELETE /lists/:key/entries`. */\nexport const RemovedCount = z.object({ removed: z.number().int().nonnegative() });\nexport type RemovedCount = z.infer<typeof RemovedCount>;\n\nexport const SubmissionDetail = z.object({\n submission: CollectionSubmission,\n flow: CollectionFlowDefinition,\n});\nexport type SubmissionDetail = z.infer<typeof SubmissionDetail>;\n\n/**\n * Response of `GET /collection-submissions/:id/status`: the applicant-readable view of a\n * submission and of where its workflow run is. The collection flow polls it after submit.\n */\nexport const SubmissionStatus = z.object({\n submission: z.object({\n id: Id,\n status: CollectionSubmissionStatus,\n submittedAt: z.coerce.date().nullable(),\n }),\n run: z\n .object({\n id: Id,\n status: WorkflowRunStatus,\n currentStepId: z.string().nullable(),\n decision: z.object({ outcome: DecisionOutcome }).nullable(),\n })\n .nullable(),\n});\nexport type SubmissionStatus = z.infer<typeof SubmissionStatus>;\n\n/**\n * Response of `POST /collection-submissions`. `link` is the collection-flow URL carrying the\n * applicant token (hand it to the applicant or the embed loader; never log it); it is `null` when\n * the API cannot mint applicant tokens.\n */\nexport const CreatedSubmission = z.object({\n submission: CollectionSubmission,\n link: z.string().nullable(),\n});\nexport type CreatedSubmission = z.infer<typeof CreatedSubmission>;\n\n/** Response of `GET /collection-submissions/:id/embed`: what the embedded flow may be framed by. */\nexport const SubmissionEmbed = z.object({\n embedOrigins: z.array(z.string()),\n flowName: z.string(),\n});\nexport type SubmissionEmbed = z.infer<typeof SubmissionEmbed>;\n\nconst listOf = <T extends z.ZodType>(item: T) => z.object({ items: z.array(item) });\n\n// ---- query params ----\nexport type PageQuery = {\n limit?: number;\n offset?: number;\n};\n/** @deprecated Use `AuditListQuery`; kept so existing `auditEvents.list` callers compile. */\nexport type AuditEventQuery = AuditListQuery;\nexport type PluginInvocationQuery = {\n workflowRunId?: string;\n limit?: number;\n};\nexport type ListEntryQuery = PageQuery & {\n /** Substring match on the entry value. */\n search?: string;\n};\n/** Filters of `GET /events`; `from`/`to` bound `occurredAt` and are sent as ISO strings. */\nexport type EventListQuery = PageQuery & {\n subjectId?: string;\n type?: string;\n from?: Date | string;\n to?: Date | string;\n};\n\nfunction isoOf(value: Date | string | undefined): string | undefined {\n return value instanceof Date ? value.toISOString() : value;\n}\n\n/** Flattens a `TimelineQuery` into transport parameters; `kinds` repeats, dates become ISO. */\nfunction timelineParams(query: TimelineQuery): Query {\n return {\n from: isoOf(query.from),\n to: isoOf(query.to),\n kinds: query.kinds,\n limit: query.limit,\n offset: query.offset,\n };\n}\n\n/** Builds a typed client for the Aletheia API. Methods throw `ApiError` on non-2xx responses. */\nexport function createApiClient(options: ApiClientOptions) {\n const fetchImpl: FetchLike = options.fetch ?? ((input, init) => globalThis.fetch(input, init));\n const transport = {\n baseUrl: options.baseUrl.replace(/\\/+$/, ''),\n getAccessToken: options.getAccessToken,\n fetch: fetchImpl,\n };\n const http = new Http(transport);\n const audit = auditDomain(http, transport);\n\n const list = async <T extends z.ZodType>(\n item: T,\n path: string,\n query?: Query,\n ): Promise<z.output<T>[]> => (await http.parsed(listOf(item), path, { query })).items;\n\n /** list / get(latest) / upsert(new draft version) / publish for the versioned definitions. */\n const definitions = <T extends z.ZodType, B>(entity: T, path: string) => ({\n list: (): Promise<z.output<T>[]> => list(entity, path),\n get: (key: string): Promise<z.output<T>> =>\n http.parsed(entity, `${path}/${encodeSegment(key)}`),\n upsert: (key: string, body: B): Promise<z.output<T>> =>\n http.parsed(entity, `${path}/${encodeSegment(key)}`, { method: 'PUT', body }),\n publish: (key: string): Promise<z.output<T>> =>\n http.parsed(entity, `${path}/${encodeSegment(key)}/publish`, { method: 'POST' }),\n });\n\n return {\n health: {\n check: (): Promise<HealthStatus> => http.parsed(HealthStatus, '/health'),\n ready: (): Promise<ReadyStatus> => http.parsed(ReadyStatus, '/health/ready'),\n },\n\n /** The caller's principal, tenant and permissions as the API sees the bearer token. */\n me: (): Promise<Me> => http.parsed(Me, '/me'),\n\n subjects: {\n create: (body: CreateSubjectBody): Promise<Subject> =>\n http.parsed(Subject, '/subjects', { method: 'POST', body }),\n /**\n * Subjects matching `query`: `search` matches the external id and `data.name` /\n * `data.legalName`; `riskScoreMin`/`riskScoreMax` bound the risk score (`subjects:read`).\n */\n list: (query: SubjectListQuery = {}): Promise<Subject[]> => list(Subject, '/subjects', query),\n get: (id: string): Promise<Subject> => http.parsed(Subject, `/subjects/${encodeSegment(id)}`),\n /**\n * The subject's history, newest first (`subjects:read`). Entries of kinds the caller may\n * not read are omitted by the API; page with `offset`.\n */\n timeline: (id: string, query: TimelineQuery = {}): Promise<TimelineEntry[]> =>\n list(TimelineEntry, `/subjects/${encodeSegment(id)}/timeline`, timelineParams(query)),\n },\n\n workflowRuns: workflowRunsDomain(http),\n\n /** Review cases: filtered lists, detail, decide, assign/claim/close and notes. See `cases.ts`. */\n cases: casesDomain(http),\n\n /** Saved case filters shown in the workbench rail, with live counts. */\n caseQueues: caseQueuesDomain(http),\n\n /** The reviewer directory, for assignment and resolving assignee names. */\n users: usersDomain(http),\n\n workflowDefinitions: {\n ...definitions<typeof WorkflowDefinition, UpsertWorkflowDefinitionBody>(\n WorkflowDefinition,\n '/workflow-definitions',\n ),\n /** Validates a draft body without saving; issues carry step ids. */\n validate: validateCall<UpsertWorkflowDefinitionBody>(http, '/workflow-definitions'),\n },\n\n /** Step and field type schemas behind the builder's forms. */\n builder: builderDomain(http),\n\n ruleDefinitions: {\n ...definitions<typeof RuleDefinition, UpsertRuleDefinitionBody>(\n RuleDefinition,\n '/rule-definitions',\n ),\n /** Evaluates one rule version against a subject or inline data; nothing is recorded. */\n dryRun: (key: string, body: DryRunBody): Promise<DryRunResult> =>\n http.parsed(DryRunResult, `/rule-definitions/${encodeSegment(key)}/dry-run`, {\n method: 'POST',\n body,\n }),\n },\n\n ruleTypes: {\n list: (): Promise<RuleTypeDescription[]> => list(RuleTypeDescription, '/rule-types'),\n },\n\n /** Import and export sets of definitions as policy packs. See `definitions-packs.ts`. */\n policyPacks: policyPacksDomain(http),\n\n /** Versioned, ordered groups of rules with an aggregation policy (`/rule-sets`). */\n ruleSets: definitions<typeof RuleSetDefinition, UpsertRuleSetBody>(\n RuleSetDefinition,\n '/rule-sets',\n ),\n\n collectionFlows: {\n ...definitions<typeof CollectionFlowDefinition, UpsertCollectionFlowBody>(\n CollectionFlowDefinition,\n '/collection-flows',\n ),\n /** Validates a draft flow body without saving; issues carry step / field keys. */\n validate: validateCall<UpsertCollectionFlowBody>(http, '/collection-flows'),\n },\n\n collectionSubmissions: {\n /** Creates the submission and returns the applicant link alongside it. */\n create: (body: CreateSubmissionBody): Promise<CreatedSubmission> =>\n http.parsed(CreatedSubmission, '/collection-submissions', { method: 'POST', body }),\n get: (id: string): Promise<SubmissionDetail> =>\n http.parsed(SubmissionDetail, `/collection-submissions/${encodeSegment(id)}`),\n save: (id: string, body: SaveSubmissionBody): Promise<CollectionSubmission> =>\n http.parsed(CollectionSubmission, `/collection-submissions/${encodeSegment(id)}`, {\n method: 'PATCH',\n body,\n }),\n submit: (id: string): Promise<CollectionSubmission> =>\n http.parsed(CollectionSubmission, `/collection-submissions/${encodeSegment(id)}/submit`, {\n method: 'POST',\n }),\n /** Where the submission's workflow run is; readable with the applicant's token. */\n status: (id: string): Promise<SubmissionStatus> =>\n http.parsed(SubmissionStatus, `/collection-submissions/${encodeSegment(id)}/status`),\n /** Embed allow-list and flow name for the submission; readable with the applicant's token. */\n embed: (id: string): Promise<SubmissionEmbed> =>\n http.parsed(SubmissionEmbed, `/collection-submissions/${encodeSegment(id)}/embed`),\n },\n\n /** Subject events: the facts velocity rules aggregate over. */\n events: {\n /** Inserts events; re-sent idempotency keys are counted as `duplicates`, not errors. */\n ingest: (body: IngestEventsBody): Promise<IngestEventsResult> =>\n http.parsed(IngestEventsResult, '/events', { method: 'POST', body }),\n /** Newest first. */\n list: (query: EventListQuery = {}): Promise<Event[]> =>\n list(Event, '/events', { ...query, from: isoOf(query.from), to: isoOf(query.to) }),\n },\n\n /**\n * Replays recorded evaluations against a rule version (`backtests:run`). `start` returns the\n * queued job; poll `get` until its status is `completed` (with `summary`) or `failed`.\n */\n backtests: {\n start: (body: StartBacktestBody): Promise<Backtest> =>\n http.parsed(Backtest, '/backtests', { method: 'POST', body }),\n /** Newest first. */\n list: (query: PageQuery = {}): Promise<Backtest[]> => list(Backtest, '/backtests', query),\n get: (id: string): Promise<Backtest> =>\n http.parsed(Backtest, `/backtests/${encodeSegment(id)}`),\n },\n\n decisions: {\n listBySubject: (subjectId: string): Promise<Decision[]> =>\n list(Decision, '/decisions', { subjectId }),\n },\n\n /** Filtered audit trail, exports and manifest verification (`audit:read`). See `audit.ts`. */\n audit,\n\n /** @deprecated Alias of `audit`, kept for existing callers. */\n auditEvents: {\n list: (query: AuditEventQuery = {}): Promise<AuditEvent[]> => audit.list(query),\n },\n\n /** Version history, diffs and the approval workflow of definitions. See `governance.ts`. */\n governance: governanceDomain(http),\n\n plugins: {\n list: (): Promise<PluginDefinition[]> => list(PluginDefinition, '/plugins'),\n available: (): Promise<PluginSummary[]> => list(PluginSummary, '/plugins/available'),\n configure: (name: string, body: ConfigurePluginBody): Promise<PluginDefinition> =>\n http.parsed(PluginDefinition, `/plugins/${encodeSegment(name)}`, { method: 'PUT', body }),\n },\n\n pluginInvocations: {\n list: (query: PluginInvocationQuery = {}): Promise<PluginInvocation[]> =>\n list(PluginInvocation, '/plugin-invocations', query),\n },\n\n /**\n * Uploaded files: `create` -> `uploadToStorage` (helper) -> `finalize` -> `pollDocument`\n * (helper) until the scan settles. See `documents.ts`.\n */\n documents: documentsDomain(http),\n\n /** Tenant settings such as the embed origin allow-list (`tenants:settings`). */\n tenants: tenantsDomain(http),\n\n /** Tenant lists (blocklists / allowlists) and their entries. Lists are keyed, not versioned. */\n lists: {\n list: (): Promise<List[]> => list(List, '/lists'),\n get: (key: string): Promise<List> => http.parsed(List, `/lists/${encodeSegment(key)}`),\n /** Creates the list or updates its metadata; entries are untouched. */\n upsert: (key: string, body: UpsertListBody): Promise<List> =>\n http.parsed(List, `/lists/${encodeSegment(key)}`, { method: 'PUT', body }),\n remove: async (key: string): Promise<void> => {\n await http.request(`/lists/${encodeSegment(key)}`, { method: 'DELETE' });\n },\n entries: (key: string, query: ListEntryQuery = {}): Promise<ListEntry[]> =>\n list(ListEntry, `/lists/${encodeSegment(key)}/entries`, query),\n addEntries: (key: string, body: AddListEntriesBody): Promise<ListImportResult> =>\n http.parsed(ListImportResult, `/lists/${encodeSegment(key)}/entries`, {\n method: 'POST',\n body,\n }),\n removeEntries: (key: string, body: RemoveListEntriesBody): Promise<RemovedCount> =>\n http.parsed(RemovedCount, `/lists/${encodeSegment(key)}/entries`, {\n method: 'DELETE',\n body,\n }),\n /** Uploads a CSV (one value per line, optional `value,reason,expires_at` header). */\n importCsv: (key: string, csv: string): Promise<ListImportResult> =>\n http.parsed(ListImportResult, `/lists/${encodeSegment(key)}/import`, {\n method: 'POST',\n raw: { content: csv, contentType: 'text/csv' },\n }),\n },\n };\n}\n\nexport type ApiClient = ReturnType<typeof createApiClient>;\n","import {\n FieldTypeDescription,\n StepTypeDescription,\n ValidationReport,\n type UpsertCollectionFlowInput,\n type UpsertWorkflowDefinitionInput,\n} from '@aletheia-dev/core';\nimport { z } from 'zod';\nimport type { Http } from './http.js';\n\n/** Schema endpoints that drive the builder's forms (`definitions:read`). */\nexport interface BuilderClient {\n /** Every workflow step type with its config JSON Schema, ui hints and data paths. */\n stepTypes: () => Promise<StepTypeDescription[]>;\n /** Every collection-flow field type with its options and value schemas. */\n fieldTypes: () => Promise<FieldTypeDescription[]>;\n}\n\nconst itemsOf = <T extends z.ZodType>(item: T) => z.object({ items: z.array(item) });\n\nexport function builderDomain(http: Http): BuilderClient {\n return {\n stepTypes: async () =>\n (await http.parsed(itemsOf(StepTypeDescription), '/workflow-step-types')).items,\n fieldTypes: async () =>\n (await http.parsed(itemsOf(FieldTypeDescription), '/collection-field-types')).items,\n };\n}\n\n/**\n * `POST <path>/validate`: full validation of an upsert body without saving it (schema, dangling\n * references, unknown keys). The report lists issues with step / field ids; nothing is stored.\n */\nexport function validateCall<B>(http: Http, path: string) {\n return (body: B): Promise<ValidationReport> =>\n http.parsed(ValidationReport, `${path}/validate`, { method: 'POST', body });\n}\n\nexport type ValidateWorkflowBody = z.input<typeof UpsertWorkflowDefinitionInput>;\nexport type ValidateCollectionFlowBody = z.input<typeof UpsertCollectionFlowInput>;\n","import {\n PolicyPack,\n PolicyPackImportResult,\n type PolicyPackInput,\n type PolicyPackKeyRef,\n} from '@aletheia-dev/core';\nimport type { Http } from './http.js';\n\nexport interface ImportPolicyPackOptions {\n /**\n * Publish every created version through the tenant's publish rules (needs\n * `definitions:publish`); with approvals required the versions end `pending_approval`.\n */\n publish?: boolean;\n}\n\nexport interface ExportPolicyPackOptions {\n /** Pack name (a slug); the API defaults to `export`. */\n name?: string;\n /** Pack version; the API defaults to today's date. */\n version?: string;\n description?: string;\n}\n\n/** An item to export: `{ kind, key }` or the `<kind>:<key>` string the API takes. */\nexport type PolicyPackKeyLike = PolicyPackKeyRef | string;\n\n/**\n * Policy packs (`POST /definitions/import`, `GET /definitions/export`): load a set of rules,\n * rule sets, workflows, collection flows and lists into the tenant, or read the published\n * versions back as one. See docs/integrate/policies.md.\n */\nexport interface PolicyPacksClient {\n /** Validates every item first and creates one draft version per definition (`definitions:write`). */\n import: (\n pack: PolicyPackInput,\n options?: ImportPolicyPackOptions,\n ) => Promise<PolicyPackImportResult>;\n /** The published versions of `keys` as a pack (`definitions:read`; lists need `lists:read`). */\n export: (\n keys: readonly PolicyPackKeyLike[],\n options?: ExportPolicyPackOptions,\n ) => Promise<PolicyPack>;\n}\n\nconst keyRef = (key: PolicyPackKeyLike): string =>\n typeof key === 'string' ? key : `${key.kind}:${key.key}`;\n\nexport function policyPacksDomain(http: Http): PolicyPacksClient {\n return {\n import: (pack, options = {}) =>\n http.parsed(PolicyPackImportResult, '/definitions/import', {\n method: 'POST',\n body: pack,\n query: { publish: options.publish ? 'true' : undefined },\n }),\n export: (keys, options = {}) =>\n http.parsed(PolicyPack, '/definitions/export', {\n query: {\n keys: keys.map(keyRef),\n name: options.name,\n version: options.version,\n description: options.description,\n },\n }),\n };\n}\n","import { TenantSettings } from '@aletheia-dev/core';\nimport type { z } from 'zod';\nimport type { Http } from './http.js';\n\n/** Tenant-level settings (`/tenants/me/settings`, `tenants:settings`). */\nexport interface TenantsClient {\n getSettings: () => Promise<TenantSettings>;\n /** Replaces the whole settings object; the API rejects malformed origins with a 400. */\n /** Full replace; omitted sections (e.g. `cases`) fall back to their defaults. */\n updateSettings: (body: z.input<typeof TenantSettings>) => Promise<TenantSettings>;\n}\n\nexport function tenantsDomain(http: Http): TenantsClient {\n return {\n getSettings: () => http.parsed(TenantSettings, '/tenants/me/settings'),\n updateSettings: (body) =>\n http.parsed(TenantSettings, '/tenants/me/settings', { method: 'PUT', body }),\n };\n}\n","import { WorkflowRun, type StartWorkflowRunInput } from '@aletheia-dev/core';\nimport { z } from 'zod';\nimport { encodeSegment, type Http } from './http.js';\n\nexport type StartWorkflowRunBody = z.input<typeof StartWorkflowRunInput>;\n\nconst RunList = z.object({ items: z.array(WorkflowRun) });\n\n/** Workflow runs: start, read, list by subject and the admin-only event history. */\nexport interface WorkflowRunsClient {\n start: (body: StartWorkflowRunBody) => Promise<WorkflowRun>;\n get: (id: string) => Promise<WorkflowRun>;\n listBySubject: (subjectId: string) => Promise<WorkflowRun[]>;\n /**\n * The run's Temporal event history as proto JSON, for replaying it against a new worker\n * bundle (`node dist/replay.js`). Admin only; 409 when the API has no Temporal client.\n */\n history: (id: string) => Promise<unknown>;\n}\n\nexport function workflowRunsDomain(http: Http): WorkflowRunsClient {\n return {\n start: (body) => http.parsed(WorkflowRun, '/workflow-runs', { method: 'POST', body }),\n get: (id) => http.parsed(WorkflowRun, `/workflow-runs/${encodeSegment(id)}`),\n listBySubject: async (subjectId) =>\n (await http.parsed(RunList, '/workflow-runs', { query: { subjectId } })).items,\n history: (id) => http.request(`/workflow-runs/${encodeSegment(id)}/history`),\n };\n}\n","import { z } from 'zod';\nimport type { FetchLike } from './http.js';\n\n/**\n * Runtime configuration for the UIs, served as `GET /config.json` from the same origin as the\n * app. The `web` image's entrypoint writes one file per app from environment variables, so one\n * image serves every environment. The dev servers serve `public/config.json`, an empty object,\n * so the `VITE_*` values from the root `.env` and the localhost defaults apply instead.\n *\n * Every key is optional and an empty string counts as absent, so a partially rendered file\n * falls through to the next source. `zitadelClientId` differs per app.\n */\nexport const RuntimeConfig = z\n .object({\n apiUrl: z.string(),\n zitadelIssuer: z.string(),\n zitadelProjectId: z.string(),\n zitadelClientId: z.string(),\n zitadelOrgDomain: z.string(),\n collectionFlowUrl: z.string(),\n })\n .partial();\nexport type RuntimeConfig = z.infer<typeof RuntimeConfig>;\n\nexport type RuntimeConfigKey = keyof RuntimeConfig;\n\n/** Every key resolved to a string (possibly empty when no source provides it). */\nexport type ResolvedConfig = Record<RuntimeConfigKey, string>;\n\nexport const RUNTIME_CONFIG_PATH = '/config.json';\n\n/**\n * Fetches `/config.json` without caching so a redeploy with new values takes effect on the next\n * load. A missing file, a non-JSON body, a body that fails the schema or a network error all\n * yield `{}`: the caller's fallbacks then apply.\n */\nexport async function loadRuntimeConfig(fetchImpl: FetchLike = fetch): Promise<RuntimeConfig> {\n try {\n // `cache` is a browser-only request option; the package compiles against Node's types.\n const init = { cache: 'no-store', headers: { accept: 'application/json' } } as RequestInit;\n const response = await fetchImpl(RUNTIME_CONFIG_PATH, init);\n if (!response.ok) return {};\n const parsed = RuntimeConfig.safeParse(await response.json());\n return parsed.success ? parsed.data : {};\n } catch {\n return {};\n }\n}\n\nfunction present(value: string | undefined): value is string {\n return value !== undefined && value !== '';\n}\n\n/**\n * Merges the three sources: the runtime file wins, then the build-time `VITE_*` values the app\n * maps onto the same keys, then the app's defaults. Empty strings never win over a later source.\n */\nexport function resolveConfig(\n runtime: RuntimeConfig,\n env: Partial<Record<RuntimeConfigKey, string | undefined>>,\n defaults: ResolvedConfig,\n): ResolvedConfig {\n const resolved = { ...defaults };\n for (const key of Object.keys(defaults) as RuntimeConfigKey[]) {\n const fromRuntime = runtime[key];\n const fromEnv = env[key];\n if (present(fromRuntime)) resolved[key] = fromRuntime;\n else if (present(fromEnv)) resolved[key] = fromEnv;\n }\n return resolved;\n}\n"],"mappings":"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","names":["fetch","import_core","import_zod","import_core","import_core","import_zod","isoOf","import_core","import_core","import_zod","import_core","import_zod","import_core","import_core","import_zod","itemsOf","import_core","import_core","import_core","import_zod","CollectionSubmissionStatus","listOf","isoOf","import_zod"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import * as _aletheia_dev_core from '@aletheia-dev/core';
|
|
3
|
-
import { TenantSettings, AuditFilter, AuditEvent, AuditExportFormat, DefinitionKind, DefinitionVersionSummary, DefinitionDiff, ApprovalCommentInput, DefinitionApproval, StepTypeDescription, FieldTypeDescription, UpsertCollectionFlowInput, UpsertWorkflowDefinitionInput, CaseStatus, CasePriority, CaseSlaState, CaseSort, SortOrder, DecideCaseInput, AssignCaseInput, CloseCaseInput, CaseNoteInput, UpsertCaseQueueInput, CaseQueue, CaseView, CaseNote, DirectoryUser, DocumentStatus, CreateDocumentInput, DocumentUploadTicket, Document, DocumentDownload, StartWorkflowRunInput, WorkflowRun, AddListEntriesInput, CreateSubjectInput, Subject, SubjectListQuery, TimelineQuery, TimelineEntry, CreateSubmissionInput, SaveSubmissionInput, CollectionSubmission, IngestEventsInput, IngestEventsResult, Event, StartBacktestInput, Backtest, Decision, PluginDefinition, ConfigurePluginInput, PluginInvocation, List, UpsertListInput, ListEntry, ListImportResult, RemoveListEntriesInput, UpsertRuleDefinitionInput, UpsertRuleSetInput } from '@aletheia-dev/core';
|
|
4
|
-
export { ActorType, AddListEntriesInput, AggregationPolicy, ApprovalCommentInput, ApprovalDecision, AssignCaseInput, AuditEvent, AuditExportFormat, AuditFilter, Backtest, BacktestProgress, BacktestSample, BacktestSampleFailure, BacktestStatus, BacktestSummary, Case, CaseFilter, CaseNote, CaseNoteInput, CasePriority, CaseQueue, CaseSlaState, CaseSort, CaseStatus, CaseView, CloseCaseInput, Condition, ConditionOp, CreateDocumentInput, DEFINITION_PATHS, DOCUMENT_CONTENT_TYPES, DOCUMENT_MAX_BYTES, DOCUMENT_OPEN_STATUSES, DefinitionApproval, DefinitionDiff, DefinitionIssue, DefinitionKind, DefinitionVersionSummary, DiffChange, DiffOp, DirectoryUser, Document, DocumentContentType, DocumentDownload, DocumentScan, DocumentStatus, DocumentUploadTicket, Event, EventKey, FieldTypeDescription, FileFieldValue, FormUiHints, IngestEventsInput, IngestEventsResult, IssueSeverity, List, ListEntry, ListImportResult, ListKind, NewEvent, NewListEntry, RemoveListEntriesInput, RuleSetBody, RuleSetDefinition, RuleSetRule, RuleSetUseCase, ScoreBand, ScoreClamp, SortOrder, StartBacktestInput, StepTypeDescription, Subject, SubjectKind, SubjectListQuery, SubjectStatus, TenantSettings, TimelineEntry, TimelineKind, TimelineQuery, UpsertCaseQueueInput, UpsertListInput, UpsertRuleSetInput, ValidationReport, WebOrigin, bandFor, caseSlaState, normalizeListValue } from '@aletheia-dev/core';
|
|
3
|
+
import { TenantSettings, AuditFilter, AuditEvent, AuditExportFormat, DefinitionKind, DefinitionVersionSummary, DefinitionDiff, ApprovalCommentInput, DefinitionApproval, PolicyPackInput, PolicyPackImportResult, PolicyPackKeyRef, PolicyPack, StepTypeDescription, FieldTypeDescription, UpsertCollectionFlowInput, UpsertWorkflowDefinitionInput, CaseStatus, CasePriority, CaseSlaState, CaseSort, SortOrder, DecideCaseInput, AssignCaseInput, CloseCaseInput, CaseNoteInput, UpsertCaseQueueInput, CaseQueue, CaseView, CaseNote, DirectoryUser, DocumentStatus, CreateDocumentInput, DocumentUploadTicket, Document, DocumentDownload, StartWorkflowRunInput, WorkflowRun, AddListEntriesInput, CreateSubjectInput, Subject, SubjectListQuery, TimelineQuery, TimelineEntry, CreateSubmissionInput, SaveSubmissionInput, CollectionSubmission, IngestEventsInput, IngestEventsResult, Event, StartBacktestInput, Backtest, Decision, PluginDefinition, ConfigurePluginInput, PluginInvocation, List, UpsertListInput, ListEntry, ListImportResult, RemoveListEntriesInput, UpsertRuleDefinitionInput, UpsertRuleSetInput } from '@aletheia-dev/core';
|
|
4
|
+
export { ActorType, AddListEntriesInput, AggregationPolicy, ApprovalCommentInput, ApprovalDecision, AssignCaseInput, AuditEvent, AuditExportFormat, AuditFilter, Backtest, BacktestProgress, BacktestSample, BacktestSampleFailure, BacktestStatus, BacktestSummary, Case, CaseFilter, CaseNote, CaseNoteInput, CasePriority, CaseQueue, CaseSlaState, CaseSort, CaseStatus, CaseView, CloseCaseInput, Condition, ConditionOp, CreateDocumentInput, DEFINITION_PATHS, DOCUMENT_CONTENT_TYPES, DOCUMENT_MAX_BYTES, DOCUMENT_OPEN_STATUSES, DefinitionApproval, DefinitionDiff, DefinitionIssue, DefinitionKind, DefinitionVersionSummary, DiffChange, DiffOp, DirectoryUser, Document, DocumentContentType, DocumentDownload, DocumentScan, DocumentStatus, DocumentUploadTicket, Event, EventKey, FieldTypeDescription, FileFieldValue, FormUiHints, IngestEventsInput, IngestEventsResult, IssueSeverity, List, ListEntry, ListImportResult, ListKind, NewEvent, NewListEntry, POLICY_PACK_MAX_LIST_ROWS, PolicyPack, PolicyPackImportResult, PolicyPackInput, PolicyPackKeyRef, RemoveListEntriesInput, RuleSetBody, RuleSetDefinition, RuleSetRule, RuleSetUseCase, ScoreBand, ScoreClamp, SortOrder, StartBacktestInput, StepTypeDescription, Subject, SubjectKind, SubjectListQuery, SubjectStatus, TenantSettings, TimelineEntry, TimelineKind, TimelineQuery, UpsertCaseQueueInput, UpsertListInput, UpsertRuleSetInput, ValidationReport, WebOrigin, bandFor, caseSlaState, normalizeListValue, parsePolicyPackKeyRef, policyPackKeyRefs } from '@aletheia-dev/core';
|
|
5
5
|
|
|
6
6
|
/** Shape of every non-2xx body returned by the API. */
|
|
7
7
|
interface ApiErrorBody {
|
|
@@ -167,6 +167,34 @@ interface GovernanceClient {
|
|
|
167
167
|
};
|
|
168
168
|
}
|
|
169
169
|
|
|
170
|
+
interface ImportPolicyPackOptions {
|
|
171
|
+
/**
|
|
172
|
+
* Publish every created version through the tenant's publish rules (needs
|
|
173
|
+
* `definitions:publish`); with approvals required the versions end `pending_approval`.
|
|
174
|
+
*/
|
|
175
|
+
publish?: boolean;
|
|
176
|
+
}
|
|
177
|
+
interface ExportPolicyPackOptions {
|
|
178
|
+
/** Pack name (a slug); the API defaults to `export`. */
|
|
179
|
+
name?: string;
|
|
180
|
+
/** Pack version; the API defaults to today's date. */
|
|
181
|
+
version?: string;
|
|
182
|
+
description?: string;
|
|
183
|
+
}
|
|
184
|
+
/** An item to export: `{ kind, key }` or the `<kind>:<key>` string the API takes. */
|
|
185
|
+
type PolicyPackKeyLike = PolicyPackKeyRef | string;
|
|
186
|
+
/**
|
|
187
|
+
* Policy packs (`POST /definitions/import`, `GET /definitions/export`): load a set of rules,
|
|
188
|
+
* rule sets, workflows, collection flows and lists into the tenant, or read the published
|
|
189
|
+
* versions back as one. See docs/integrate/policies.md.
|
|
190
|
+
*/
|
|
191
|
+
interface PolicyPacksClient {
|
|
192
|
+
/** Validates every item first and creates one draft version per definition (`definitions:write`). */
|
|
193
|
+
import: (pack: PolicyPackInput, options?: ImportPolicyPackOptions) => Promise<PolicyPackImportResult>;
|
|
194
|
+
/** The published versions of `keys` as a pack (`definitions:read`; lists need `lists:read`). */
|
|
195
|
+
export: (keys: readonly PolicyPackKeyLike[], options?: ExportPolicyPackOptions) => Promise<PolicyPack>;
|
|
196
|
+
}
|
|
197
|
+
|
|
170
198
|
/** Schema endpoints that drive the builder's forms (`definitions:read`). */
|
|
171
199
|
interface BuilderClient {
|
|
172
200
|
/** Every workflow step type with its config JSON Schema, ui hints and data paths. */
|
|
@@ -1620,6 +1648,8 @@ declare function createApiClient(options: ApiClientOptions): {
|
|
|
1620
1648
|
ruleTypes: {
|
|
1621
1649
|
list: () => Promise<RuleTypeDescription[]>;
|
|
1622
1650
|
};
|
|
1651
|
+
/** Import and export sets of definitions as policy packs. See `definitions-packs.ts`. */
|
|
1652
|
+
policyPacks: PolicyPacksClient;
|
|
1623
1653
|
/** Versioned, ordered groups of rules with an aggregation policy (`/rule-sets`). */
|
|
1624
1654
|
ruleSets: {
|
|
1625
1655
|
list: () => Promise<{
|
|
@@ -2212,4 +2242,4 @@ declare function loadRuntimeConfig(fetchImpl?: FetchLike): Promise<RuntimeConfig
|
|
|
2212
2242
|
*/
|
|
2213
2243
|
declare function resolveConfig(runtime: RuntimeConfig, env: Partial<Record<RuntimeConfigKey, string | undefined>>, defaults: ResolvedConfig): ResolvedConfig;
|
|
2214
2244
|
|
|
2215
|
-
export { type AccessTokenProvider, type AddListEntriesBody, type ApiClient, type ApiClientOptions, ApiError, type ApiErrorBody, type ApprovalListQuery, ApprovalOutcome, type AssignCaseBody, type AuditClient, type AuditEventQuery, type AuditFilterQuery, type AuditListQuery, type BuilderClient, CaseDetail, type CaseListQuery, type CaseNoteBody, CaseQueueCount, type CaseQueuesClient, type CasesClient, type CloseCaseBody, type CreateSubjectBody, type CreateSubmissionBody, CreatedSubmission, type DecideCaseBody, DecideCaseResult, type DiffQuery, DocumentList, type DocumentListQuery, DocumentPollTimeoutError, type DocumentScope, type DocumentsClient, type DryRunBody, type DryRunInput, DryRunResult, type EventListQuery, type ExportVerification, FORBIDDEN_CODES, type FetchLike, type FileCheck, type GovernanceClient, HealthStatus, type IngestEventsBody, type ListEntryQuery, Me, MePrincipal, type PageQuery, type PluginInvocationQuery, PluginSummary, type PollOptions, RUNTIME_CONFIG_PATH, type RawBody, ReadyStatus, type RemoveListEntriesBody, RemovedCount, type ResolvedConfig, RuleTypeDescription, RuleUiHints, RuntimeConfig, type RuntimeConfigKey, type SaveSubmissionBody, type StartBacktestBody, type StartWorkflowRunBody, SubmissionDetail, SubmissionEmbed, SubmissionStatus, type TenantsClient, UploadError, type UploadOptions, type UploadProgressEvent, type UploadXhr, type UpsertCaseQueueBody, type UpsertCollectionFlowBody, type UpsertListBody, type UpsertRuleDefinitionBody, type UpsertRuleSetBody, type UpsertWorkflowDefinitionBody, type UserListQuery, type UsersClient, type ValidateCollectionFlowBody, type ValidateWorkflowBody, auditFilterParams, caseListParams, checkFileBeforeUpload, createApiClient, isApiError, isApiErrorBody, isForbidden, isTenantNotProvisioned, isTerminalDocumentStatus, isUnauthenticated, loadRuntimeConfig, pollDocument, resolveConfig, uploadToStorage, verifyExport };
|
|
2245
|
+
export { type AccessTokenProvider, type AddListEntriesBody, type ApiClient, type ApiClientOptions, ApiError, type ApiErrorBody, type ApprovalListQuery, ApprovalOutcome, type AssignCaseBody, type AuditClient, type AuditEventQuery, type AuditFilterQuery, type AuditListQuery, type BuilderClient, CaseDetail, type CaseListQuery, type CaseNoteBody, CaseQueueCount, type CaseQueuesClient, type CasesClient, type CloseCaseBody, type CreateSubjectBody, type CreateSubmissionBody, CreatedSubmission, type DecideCaseBody, DecideCaseResult, type DiffQuery, DocumentList, type DocumentListQuery, DocumentPollTimeoutError, type DocumentScope, type DocumentsClient, type DryRunBody, type DryRunInput, DryRunResult, type EventListQuery, type ExportPolicyPackOptions, type ExportVerification, FORBIDDEN_CODES, type FetchLike, type FileCheck, type GovernanceClient, HealthStatus, type ImportPolicyPackOptions, type IngestEventsBody, type ListEntryQuery, Me, MePrincipal, type PageQuery, type PluginInvocationQuery, PluginSummary, type PolicyPackKeyLike, type PolicyPacksClient, type PollOptions, RUNTIME_CONFIG_PATH, type RawBody, ReadyStatus, type RemoveListEntriesBody, RemovedCount, type ResolvedConfig, RuleTypeDescription, RuleUiHints, RuntimeConfig, type RuntimeConfigKey, type SaveSubmissionBody, type StartBacktestBody, type StartWorkflowRunBody, SubmissionDetail, SubmissionEmbed, SubmissionStatus, type TenantsClient, UploadError, type UploadOptions, type UploadProgressEvent, type UploadXhr, type UpsertCaseQueueBody, type UpsertCollectionFlowBody, type UpsertListBody, type UpsertRuleDefinitionBody, type UpsertRuleSetBody, type UpsertWorkflowDefinitionBody, type UserListQuery, type UsersClient, type ValidateCollectionFlowBody, type ValidateWorkflowBody, auditFilterParams, caseListParams, checkFileBeforeUpload, createApiClient, isApiError, isApiErrorBody, isForbidden, isTenantNotProvisioned, isTerminalDocumentStatus, isUnauthenticated, loadRuntimeConfig, pollDocument, resolveConfig, uploadToStorage, verifyExport };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import * as _aletheia_dev_core from '@aletheia-dev/core';
|
|
3
|
-
import { TenantSettings, AuditFilter, AuditEvent, AuditExportFormat, DefinitionKind, DefinitionVersionSummary, DefinitionDiff, ApprovalCommentInput, DefinitionApproval, StepTypeDescription, FieldTypeDescription, UpsertCollectionFlowInput, UpsertWorkflowDefinitionInput, CaseStatus, CasePriority, CaseSlaState, CaseSort, SortOrder, DecideCaseInput, AssignCaseInput, CloseCaseInput, CaseNoteInput, UpsertCaseQueueInput, CaseQueue, CaseView, CaseNote, DirectoryUser, DocumentStatus, CreateDocumentInput, DocumentUploadTicket, Document, DocumentDownload, StartWorkflowRunInput, WorkflowRun, AddListEntriesInput, CreateSubjectInput, Subject, SubjectListQuery, TimelineQuery, TimelineEntry, CreateSubmissionInput, SaveSubmissionInput, CollectionSubmission, IngestEventsInput, IngestEventsResult, Event, StartBacktestInput, Backtest, Decision, PluginDefinition, ConfigurePluginInput, PluginInvocation, List, UpsertListInput, ListEntry, ListImportResult, RemoveListEntriesInput, UpsertRuleDefinitionInput, UpsertRuleSetInput } from '@aletheia-dev/core';
|
|
4
|
-
export { ActorType, AddListEntriesInput, AggregationPolicy, ApprovalCommentInput, ApprovalDecision, AssignCaseInput, AuditEvent, AuditExportFormat, AuditFilter, Backtest, BacktestProgress, BacktestSample, BacktestSampleFailure, BacktestStatus, BacktestSummary, Case, CaseFilter, CaseNote, CaseNoteInput, CasePriority, CaseQueue, CaseSlaState, CaseSort, CaseStatus, CaseView, CloseCaseInput, Condition, ConditionOp, CreateDocumentInput, DEFINITION_PATHS, DOCUMENT_CONTENT_TYPES, DOCUMENT_MAX_BYTES, DOCUMENT_OPEN_STATUSES, DefinitionApproval, DefinitionDiff, DefinitionIssue, DefinitionKind, DefinitionVersionSummary, DiffChange, DiffOp, DirectoryUser, Document, DocumentContentType, DocumentDownload, DocumentScan, DocumentStatus, DocumentUploadTicket, Event, EventKey, FieldTypeDescription, FileFieldValue, FormUiHints, IngestEventsInput, IngestEventsResult, IssueSeverity, List, ListEntry, ListImportResult, ListKind, NewEvent, NewListEntry, RemoveListEntriesInput, RuleSetBody, RuleSetDefinition, RuleSetRule, RuleSetUseCase, ScoreBand, ScoreClamp, SortOrder, StartBacktestInput, StepTypeDescription, Subject, SubjectKind, SubjectListQuery, SubjectStatus, TenantSettings, TimelineEntry, TimelineKind, TimelineQuery, UpsertCaseQueueInput, UpsertListInput, UpsertRuleSetInput, ValidationReport, WebOrigin, bandFor, caseSlaState, normalizeListValue } from '@aletheia-dev/core';
|
|
3
|
+
import { TenantSettings, AuditFilter, AuditEvent, AuditExportFormat, DefinitionKind, DefinitionVersionSummary, DefinitionDiff, ApprovalCommentInput, DefinitionApproval, PolicyPackInput, PolicyPackImportResult, PolicyPackKeyRef, PolicyPack, StepTypeDescription, FieldTypeDescription, UpsertCollectionFlowInput, UpsertWorkflowDefinitionInput, CaseStatus, CasePriority, CaseSlaState, CaseSort, SortOrder, DecideCaseInput, AssignCaseInput, CloseCaseInput, CaseNoteInput, UpsertCaseQueueInput, CaseQueue, CaseView, CaseNote, DirectoryUser, DocumentStatus, CreateDocumentInput, DocumentUploadTicket, Document, DocumentDownload, StartWorkflowRunInput, WorkflowRun, AddListEntriesInput, CreateSubjectInput, Subject, SubjectListQuery, TimelineQuery, TimelineEntry, CreateSubmissionInput, SaveSubmissionInput, CollectionSubmission, IngestEventsInput, IngestEventsResult, Event, StartBacktestInput, Backtest, Decision, PluginDefinition, ConfigurePluginInput, PluginInvocation, List, UpsertListInput, ListEntry, ListImportResult, RemoveListEntriesInput, UpsertRuleDefinitionInput, UpsertRuleSetInput } from '@aletheia-dev/core';
|
|
4
|
+
export { ActorType, AddListEntriesInput, AggregationPolicy, ApprovalCommentInput, ApprovalDecision, AssignCaseInput, AuditEvent, AuditExportFormat, AuditFilter, Backtest, BacktestProgress, BacktestSample, BacktestSampleFailure, BacktestStatus, BacktestSummary, Case, CaseFilter, CaseNote, CaseNoteInput, CasePriority, CaseQueue, CaseSlaState, CaseSort, CaseStatus, CaseView, CloseCaseInput, Condition, ConditionOp, CreateDocumentInput, DEFINITION_PATHS, DOCUMENT_CONTENT_TYPES, DOCUMENT_MAX_BYTES, DOCUMENT_OPEN_STATUSES, DefinitionApproval, DefinitionDiff, DefinitionIssue, DefinitionKind, DefinitionVersionSummary, DiffChange, DiffOp, DirectoryUser, Document, DocumentContentType, DocumentDownload, DocumentScan, DocumentStatus, DocumentUploadTicket, Event, EventKey, FieldTypeDescription, FileFieldValue, FormUiHints, IngestEventsInput, IngestEventsResult, IssueSeverity, List, ListEntry, ListImportResult, ListKind, NewEvent, NewListEntry, POLICY_PACK_MAX_LIST_ROWS, PolicyPack, PolicyPackImportResult, PolicyPackInput, PolicyPackKeyRef, RemoveListEntriesInput, RuleSetBody, RuleSetDefinition, RuleSetRule, RuleSetUseCase, ScoreBand, ScoreClamp, SortOrder, StartBacktestInput, StepTypeDescription, Subject, SubjectKind, SubjectListQuery, SubjectStatus, TenantSettings, TimelineEntry, TimelineKind, TimelineQuery, UpsertCaseQueueInput, UpsertListInput, UpsertRuleSetInput, ValidationReport, WebOrigin, bandFor, caseSlaState, normalizeListValue, parsePolicyPackKeyRef, policyPackKeyRefs } from '@aletheia-dev/core';
|
|
5
5
|
|
|
6
6
|
/** Shape of every non-2xx body returned by the API. */
|
|
7
7
|
interface ApiErrorBody {
|
|
@@ -167,6 +167,34 @@ interface GovernanceClient {
|
|
|
167
167
|
};
|
|
168
168
|
}
|
|
169
169
|
|
|
170
|
+
interface ImportPolicyPackOptions {
|
|
171
|
+
/**
|
|
172
|
+
* Publish every created version through the tenant's publish rules (needs
|
|
173
|
+
* `definitions:publish`); with approvals required the versions end `pending_approval`.
|
|
174
|
+
*/
|
|
175
|
+
publish?: boolean;
|
|
176
|
+
}
|
|
177
|
+
interface ExportPolicyPackOptions {
|
|
178
|
+
/** Pack name (a slug); the API defaults to `export`. */
|
|
179
|
+
name?: string;
|
|
180
|
+
/** Pack version; the API defaults to today's date. */
|
|
181
|
+
version?: string;
|
|
182
|
+
description?: string;
|
|
183
|
+
}
|
|
184
|
+
/** An item to export: `{ kind, key }` or the `<kind>:<key>` string the API takes. */
|
|
185
|
+
type PolicyPackKeyLike = PolicyPackKeyRef | string;
|
|
186
|
+
/**
|
|
187
|
+
* Policy packs (`POST /definitions/import`, `GET /definitions/export`): load a set of rules,
|
|
188
|
+
* rule sets, workflows, collection flows and lists into the tenant, or read the published
|
|
189
|
+
* versions back as one. See docs/integrate/policies.md.
|
|
190
|
+
*/
|
|
191
|
+
interface PolicyPacksClient {
|
|
192
|
+
/** Validates every item first and creates one draft version per definition (`definitions:write`). */
|
|
193
|
+
import: (pack: PolicyPackInput, options?: ImportPolicyPackOptions) => Promise<PolicyPackImportResult>;
|
|
194
|
+
/** The published versions of `keys` as a pack (`definitions:read`; lists need `lists:read`). */
|
|
195
|
+
export: (keys: readonly PolicyPackKeyLike[], options?: ExportPolicyPackOptions) => Promise<PolicyPack>;
|
|
196
|
+
}
|
|
197
|
+
|
|
170
198
|
/** Schema endpoints that drive the builder's forms (`definitions:read`). */
|
|
171
199
|
interface BuilderClient {
|
|
172
200
|
/** Every workflow step type with its config JSON Schema, ui hints and data paths. */
|
|
@@ -1620,6 +1648,8 @@ declare function createApiClient(options: ApiClientOptions): {
|
|
|
1620
1648
|
ruleTypes: {
|
|
1621
1649
|
list: () => Promise<RuleTypeDescription[]>;
|
|
1622
1650
|
};
|
|
1651
|
+
/** Import and export sets of definitions as policy packs. See `definitions-packs.ts`. */
|
|
1652
|
+
policyPacks: PolicyPacksClient;
|
|
1623
1653
|
/** Versioned, ordered groups of rules with an aggregation policy (`/rule-sets`). */
|
|
1624
1654
|
ruleSets: {
|
|
1625
1655
|
list: () => Promise<{
|
|
@@ -2212,4 +2242,4 @@ declare function loadRuntimeConfig(fetchImpl?: FetchLike): Promise<RuntimeConfig
|
|
|
2212
2242
|
*/
|
|
2213
2243
|
declare function resolveConfig(runtime: RuntimeConfig, env: Partial<Record<RuntimeConfigKey, string | undefined>>, defaults: ResolvedConfig): ResolvedConfig;
|
|
2214
2244
|
|
|
2215
|
-
export { type AccessTokenProvider, type AddListEntriesBody, type ApiClient, type ApiClientOptions, ApiError, type ApiErrorBody, type ApprovalListQuery, ApprovalOutcome, type AssignCaseBody, type AuditClient, type AuditEventQuery, type AuditFilterQuery, type AuditListQuery, type BuilderClient, CaseDetail, type CaseListQuery, type CaseNoteBody, CaseQueueCount, type CaseQueuesClient, type CasesClient, type CloseCaseBody, type CreateSubjectBody, type CreateSubmissionBody, CreatedSubmission, type DecideCaseBody, DecideCaseResult, type DiffQuery, DocumentList, type DocumentListQuery, DocumentPollTimeoutError, type DocumentScope, type DocumentsClient, type DryRunBody, type DryRunInput, DryRunResult, type EventListQuery, type ExportVerification, FORBIDDEN_CODES, type FetchLike, type FileCheck, type GovernanceClient, HealthStatus, type IngestEventsBody, type ListEntryQuery, Me, MePrincipal, type PageQuery, type PluginInvocationQuery, PluginSummary, type PollOptions, RUNTIME_CONFIG_PATH, type RawBody, ReadyStatus, type RemoveListEntriesBody, RemovedCount, type ResolvedConfig, RuleTypeDescription, RuleUiHints, RuntimeConfig, type RuntimeConfigKey, type SaveSubmissionBody, type StartBacktestBody, type StartWorkflowRunBody, SubmissionDetail, SubmissionEmbed, SubmissionStatus, type TenantsClient, UploadError, type UploadOptions, type UploadProgressEvent, type UploadXhr, type UpsertCaseQueueBody, type UpsertCollectionFlowBody, type UpsertListBody, type UpsertRuleDefinitionBody, type UpsertRuleSetBody, type UpsertWorkflowDefinitionBody, type UserListQuery, type UsersClient, type ValidateCollectionFlowBody, type ValidateWorkflowBody, auditFilterParams, caseListParams, checkFileBeforeUpload, createApiClient, isApiError, isApiErrorBody, isForbidden, isTenantNotProvisioned, isTerminalDocumentStatus, isUnauthenticated, loadRuntimeConfig, pollDocument, resolveConfig, uploadToStorage, verifyExport };
|
|
2245
|
+
export { type AccessTokenProvider, type AddListEntriesBody, type ApiClient, type ApiClientOptions, ApiError, type ApiErrorBody, type ApprovalListQuery, ApprovalOutcome, type AssignCaseBody, type AuditClient, type AuditEventQuery, type AuditFilterQuery, type AuditListQuery, type BuilderClient, CaseDetail, type CaseListQuery, type CaseNoteBody, CaseQueueCount, type CaseQueuesClient, type CasesClient, type CloseCaseBody, type CreateSubjectBody, type CreateSubmissionBody, CreatedSubmission, type DecideCaseBody, DecideCaseResult, type DiffQuery, DocumentList, type DocumentListQuery, DocumentPollTimeoutError, type DocumentScope, type DocumentsClient, type DryRunBody, type DryRunInput, DryRunResult, type EventListQuery, type ExportPolicyPackOptions, type ExportVerification, FORBIDDEN_CODES, type FetchLike, type FileCheck, type GovernanceClient, HealthStatus, type ImportPolicyPackOptions, type IngestEventsBody, type ListEntryQuery, Me, MePrincipal, type PageQuery, type PluginInvocationQuery, PluginSummary, type PolicyPackKeyLike, type PolicyPacksClient, type PollOptions, RUNTIME_CONFIG_PATH, type RawBody, ReadyStatus, type RemoveListEntriesBody, RemovedCount, type ResolvedConfig, RuleTypeDescription, RuleUiHints, RuntimeConfig, type RuntimeConfigKey, type SaveSubmissionBody, type StartBacktestBody, type StartWorkflowRunBody, SubmissionDetail, SubmissionEmbed, SubmissionStatus, type TenantsClient, UploadError, type UploadOptions, type UploadProgressEvent, type UploadXhr, type UpsertCaseQueueBody, type UpsertCollectionFlowBody, type UpsertListBody, type UpsertRuleDefinitionBody, type UpsertRuleSetBody, type UpsertWorkflowDefinitionBody, type UserListQuery, type UsersClient, type ValidateCollectionFlowBody, type ValidateWorkflowBody, auditFilterParams, caseListParams, checkFileBeforeUpload, createApiClient, isApiError, isApiErrorBody, isForbidden, isTenantNotProvisioned, isTerminalDocumentStatus, isUnauthenticated, loadRuntimeConfig, pollDocument, resolveConfig, uploadToStorage, verifyExport };
|