Appearance
@aletheia-dev/core
0.7.0
Minor Changes
- c7b166c: Self-service signup:
SignupInputandSignupResultare the body and answer ofPOST /signup, which makes a workspace (an organisation with its admin, and a tenant) and emails the admin a temporary password. Its errors areSignupExistsError(409signup_exists),TurnstileFailedError(403turnstile_failed),SignupCapacityError(429signup_capacity) andSignupUnavailableError(503signup_unavailable).EnvSchemagainsZITADEL_SIGNUP_PAT,RESEND_API_KEY,SIGNUP_EMAIL_FROM,SIGNUP_EMAIL_REPLY_TO,SIGNUP_CONSOLE_URL,TURNSTILE_SECRET_KEYandSIGNUP_MAX_PER_HOUR. - 6ef571a: Uploads are presigned PUTs, which every S3-compatible store serves, Cloudflare R2 among them.
DocumentUploadTicket.uploadis{ method: 'PUT', url, headers, expiresAt }: the URL is signed for the declaredContent-TypeandsizeBytes, andfieldsandmaxBytesare gone.uploadToStoragesends the file as the request body with the ticket's headers, andUploadXhrgainssetRequestHeader.
Patch Changes
- 250c4b6: The package ships without source maps. Its homepage is its page on the documentation site, issues go to the support page or
aletheia-dev@ajrd.net, and the changelog no longer links commits.
0.6.0
Minor Changes
7821afa:
StaleSubmissionError(412stale_submission):PATCH /collection-submissions/{id}withIf-Match: <updatedAt>saves only over that version, and answers with the stored one indetails.updatedAtotherwise. Submission links carry the token in the fragment (/flow/{id}#token=…);GET /collection-submissions/{id}/embedanswers a link that expired in the last 30 days withexpired: true; applicants and the public routes count againstAPI_RATE_LIMIT_PER_MINUTE; every API response isCache-Control: no-storeunless a route sets its own.c9d9f77: Fields take
autocomplete(AutocompleteToken, on text, email, number and date fields; a date takesbdayoroff) andinputMode(InputMode, on text and number fields).validateFlowBodyreportshint_on_other_type. Submit validation changes for flows already published: a required checkbox must betrue, and an empty string is no answer for every field type, so an optional field takes it as unanswered (an emptied optional number is no longer 0) and a required one answers"<label> is required".StepPreviewshows that message as the engine words it.8984323: The address guards (
isPrivateAddress,webhookUrlProblem,publicOnlyLookup) move from@aletheia-dev/webhooksto@aletheia-dev/core/node;EnvSchemagainsAPP_CATALOG_DIR.19af0f9:
EnvSchemacarries the app runner's settings (APP_RUNNER_URL,APP_RUNNER_TOKEN,APP_RUNNER_API_URL,APP_RUNNER_HOST,APP_RUNNER_PORT,APP_RUNNER_CONCURRENCY,APP_RUNNER_TENANT_CONCURRENCY,APP_RUNNER_CACHE_DIR,APP_RUNNER_CACHE_MODULES,APP_RUNNER_ALLOW_PRIVATE_NETWORKS).0b5f8ad: The apps contract: what a module answers (
AppManifest, its actions, secrets, hosts and handles;AppName, which refuses the apps API's own path segments inRESERVED_APP_NAMES), the envelopes and host requests between a module and the host, the app runner's HTTP contract (RunnerInvokeRequestand its siblings), and the platform's records:AppVersion,AppVersionApproval,AppInstall,AppCatalogEntry,AppUsage,AppInvocation,AppHealthReport,AppCallbackand theAppCallbackSignala vendor's webhook sends the waiting run. Workflows take acall_appstep (CallAppStep), rules theapptype and audit actors theapptype;EnvSchemagainsTEMPORAL_APP_TASK_QUEUE(defaultaletheia-apps).26474ac: Plugins are gone, apps having replaced them: the plugin schemas (
PluginDefinition,PluginInvocation,PluginHealthReport,PluginSummary,PluginCallbackand their kin), thecall_pluginstep (CallPluginStep), thepluginrule and actor types, theplugin_degradednotification, theplugin.circuit.openedwebhook event andTEMPORAL_PLUGIN_TASK_QUEUEare removed. The health summary, Home's attention items and setup checklist, and a case's vendor checks (VendorCheck) cover apps only.729209c: The secret cipher (
SecretCipher,SecretScopeand thestore:<id>referencesstoreRefandstoreIdOf) moves from@aletheia-dev/plugin-runtimeto@aletheia-dev/core/node.e2bef29:
CollectionSettings.locales: the languages a tenant's forms come in, asLocaleTags (BCP 47 in canonical case:fr,pt-BR,zh-Hant), the first being the one its flows are written in;collectionLocales(settings)reads them, English when unset.CollectionFlowBody.translations: the flow in other languages by tag (FlowTranslation, withStepTranslationandFieldTranslation): names, step titles and descriptions, field labels, help, placeholders, units, option labels and messages, and the welcome, thank-you and outcome copy.FlowPreview.localescarries the tenant's languages to previews.validateFlowBodywarns about translations of steps (translation_unknown_step), fields (translation_unknown_field) and options (translation_unknown_option) the flow does not have.d40d16f:
SubmissionEventInput(step_viewedwith astepId,upload_failedwith afieldKeyand a lowercasereasoncode) andMAX_SUBMISSION_EVENTS: what the collection terminal reports toPOST /collection-submissions/:id/events.FlowFunnelandFlowFunnelQuery: a flow's drop-off fromGET /stats/flows/:key/funnel(opened,submitted, per stepreachedandstoppedHere, anduploadFailures), which the API client reads withstats.flowFunnel(key, { days }).259e0b5: The webhook event
submission.link_requested(from the audit actioncollection.submission.link_requested): an applicant whose link expired asked for a new one, carrying ids only.LinkRequestsUnavailableError(409link_requests_unavailable) answers such a request where no enabled endpoint of the tenant takes the event.c05e741: File fields take several files (
Field.multiple,maxFilesup toMAX_FILES_PER_FIELD,fileLimit): the answer is an array ofFileFieldValue,validateSubmissiontakes one file to the limit when required,fileFieldValueslists each file with itsindex, andvalidateFlowBodyreportsfile_option_on_other_typeandmax_files_without_multiple. Fields takecapture(FileCapture) anddocumentKind(DocumentKind). A rejectedDocumentcarriesrejectionCode(DocumentRejectionCode) beside its reason.FieldInputrenders a field that takes several files withFileListField.e290fd4:
CollectionSettings.abandonAfterDays(1 to 365): forms nobody saved for that many days expire and a run waiting for one is cancelled; a request for information keeps its own expiry.75b54c5:
TenantSettings.branding(TenantBranding: name, logos and their text alternative, brand color, shape, font, color scheme, support contacts, privacy, terms and return addresses; https only) andHexColor.CollectionFlowBody.presentation(FlowPresentation: the welcome screen's heading, text and minutes, and the thank-you screen) andCollectionFlowBody.outcome(FlowOutcome:OutcomeVisibilityneutral,progressordecision, and the review, approved and rejected screens'ScreenCopy).FlowPreview.brandingcarries the tenant's branding to previews.1551100:
mergeBranding(defaults, tenant): a tenant's branding over the deployment's defaults, the name and logo, like the two support contacts, taken from one side only. The API environment takes the collection terminal's defaults (COLLECTION_TERMINAL_TENANT_NAME,_LOGO_URL,_PRIMARY_COLOR,_COLOR_SCHEME,_SUPPORT_URL,_SUPPORT_EMAIL,_PRIVACY_URL,_TERMS_URL,_RETURN_URL,_SHOW_DECISION; an empty value is unset), read withdefaultBrandingOf(env).78c68ac: An app whose asynchronous action starts a session the applicant takes part in (a liveness check, documents the vendor collects) declares
handles.handoff(anAppHandoffSdksuch assumsub) and hands the session to the applicant's browser as anAppHandoff(sdk, a short-livedtokenand itsexpiresAt), ornullonce the vendor has everything. The collection terminal shows the vendor's SDK with it after the submit.HandoffUnavailableError(409handoff_unavailable) says nothing waits for the applicant at a vendor, andSubmissionStatus.handoffis true while the run waits for such a check.
0.5.0
Minor Changes
4bbc905: Approvals: a requester (or an admin) withdraws an open request with
POST <prefix>/{key}/versions/{version}/withdraw, which closes it aswithdrawn(a newApprovalDecision) and returns the version to draft; anyone else gets 403not_requester(NotRequesterError). Requests carry an append-only discussion (GET/POST /approvals/{id}/comments,ApprovalComment).GET /approvalsfilters onstatus(openordecided),kind,mineandstale, pages, and returns atotal(ApprovalListQuery);GET /approvals/{id}returns the request with its version, published version, diff, latest backtest, dependencies, usage, eligible approvers and discussion (ApprovalDetail).POST /backtestsalso takes a workflow version (StartWorkflowBacktestInput,{ workflowKey, version? }): each recorded evaluation of its runs is replayed through the rule step of the same id, and the summary adds the replayed outcomes indecisions;BacktestcarriesworkflowKeyandworkflowVersion, withruleKeyandruleVersionnow optional. The client replacesgovernance.approvals.listOpenwithlistand addsapprovals.get,commentsandcomment,governance.withdrawandisNotRequester.40ee302: Audit: every row written during an API request records
meta(RequestMeta: request id, route, IP, user agent;TenantContext.request), included in exports as ametacolumn.GET /audit-events/{id}answers anAuditEventDetail: the event, itsneighborsunder the list filters it takes and therelatedcase, decision, run and subject.GET /audit-events/countpreviews an export (AuditExportPreview). The export takesfilenameand trailsX-Export-Rows. Saved views per user:GET,POST /audit-views,DELETE /audit-views/{id}(AuditView,AuditViewInput,AuditViewFilters). Scheduled exports:GET,POST /audit-export-schedules,GET,PUT,DELETE /audit-export-schedules/{id},GET /audit-export-schedules/{id}/runsandPOST /audit-export-runs/{id}/download(AuditExportSchedule,AuditExportScheduleInput,ScheduledExportFilter,CronExpression,AuditExportRun,AuditExportRunStatus,AuditExportDownload);AttentionItemgainsexport_failed. The client'saudit.gettakes the list filter and answers the detail,audit.countis new,audit.exportandaudit.exportUrltake a file name, andauditViewsandauditExportsare new.e236779: Requests for information.
POST /cases/:id/request-infosends the applicant the form the case's run collected again, pre-filled, with the reviewer's message; the case waits with its SLA paused (infoRequestedAt) and the run repeats its checks on the answers before handing the case back. An unanswered request expires with the case rejected (info_not_provided). Submissions gain thewithdrawnandexpiredstatuses andcaseId,requestMessageandexpiresAt; operators can re-issue a link (POST /collection-submissions/:id/link) or withdraw a submission (POST /collection-submissions/:id/withdraw), andGET /collection-submissions/:id/statusnames the form the run waits for next. The client addscases.requestInfo,collectionSubmissions.reissueLinkandcollectionSubmissions.withdraw.6d17f78: Cases:
GET /casesfilters onqueue(the routing label a run gives its case through thecreate_casestep'squeueFrom;priorityFromsets the priority the same way),reasonCode,countryandwaiting, searches the subject and the case id, applies a queue withqueueIdand names the assignee withexpand=assignee.GET /cases/{id}/evidencereturns the rule hits, documents, vendor checks (with a readableresultLabel), events and decisions in one response,GET /case-typesthe types in use, andGET/PUT /reason-codesa reason-code catalogue that decisions are then checked against (ReasonCode,CaseEvidence,CaseType). Every tenant has the system queues; queues carrysystemKey,visibility(everyone,admins,personal) andclaimNext, are reordered withPUT /case-queues/orderand previewed withPOST /case-queues/preview, andPOST /cases/claim-next {}draws from the claim-next queues. The client addscases.evidence,typesandreasonCodes, andcaseQueues.reorderandpreview.84e50a4: Definitions:
PATCH <prefix>/{key}/versions/{version}saves a draft version in place (the bodyPUTtakes, with an optional changenote; 409 once it is no longer a draft), and every definition entity andDefinitionVersionSummarycarriesnoteandupdatedBy(VersionNote,VersionNoteInput).POST /rule-definitions/validateandPOST /rule-sets/validateanswer aValidationReportwith warnings such aslist_staleandunpublished_rule. Dry runs takeversions(up to 5) and answer{ key, results: [{ version, status, type, result, explanation }], dataPaths }(DryRunInput,DryRunResponse); analysts withbacktests:runmay run them. A workflowDefinitionDiffaddssteps(DiffStep).GET /definitions/usagelists what names each rule, rule set and collection flow (DefinitionUsage,UsageLink).POST /workflow-definitions/context-pathslists the run-context paths a step can read (ContextPath).POST /collection-flows/{key}/versions/{version}/previewreturns a 15-minute preview link (FlowPreviewLink) that the collection terminal opens withGET /collection-flow-preview(FlowPreview).GET /definitions/packslists the starter packs (PolicyPackSummary) andPOST /definitions/import?pack=imports one. The client addsupdateDraftto every definition domain,ruleDefinitions.validate,ruleSets.validate,workflowDefinitions.contextPaths,collectionFlows.preview,definitions.usage,policyPacks.startersandimportStarter;dryRuntakesversions.6ba6815: Outbound webhooks:
GET,POST /webhook-endpoints,GET,PUT,DELETE /webhook-endpoints/{id}(the signing secret is returned once),POST /webhook-endpoints/{id}/test(a signedping),POST /webhook-endpoints/{id}/rotate-secret(the previous secret signs too for 24 hours),GET /webhook-deliverieswith endpoint, status, event, run and time filters,POST /webhook-deliveries/{id}/retryand the catalogueGET /webhook-events(WebhookEventType,WEBHOOK_EVENTS,webhookEventOf,WebhookPayload,WebhookEndpoint,WebhookEndpointInput,CreatedWebhookEndpoint,RotatedWebhookSecret,WebhookTestResult,WebhookDelivery,WebhookDeliveryStatus,WebhookDeliveryFilter,WEBHOOK_MAX_ATTEMPTS,WEBHOOK_RETRY_DELAYS_MS,WEBHOOK_SECRET_OVERLAP_MS). Notifications:GET /notificationsandPOST /notifications/read(Notification,NotificationKind,NotificationList,NotificationQuery,MarkNotificationsRead,NotificationsMarked).RunRelatedgainsdeliveries;AttentionItemgainswebhook_exhausted. New environment variableWEBHOOK_ALLOW_PRIVATE_NETWORKS. The client addswebhooksandnotifications.0019b2e: New permissions for the console routes to come:
runs:write,ops:read,webhooks:read,webhooks:writeandusers:manage(admins) andnotifications:read(admins and analysts). Named errorsqueue_name_taken(QueueNameTakenError),case_not_assigned(CaseNotAssignedError: deciding someone else's case; an unassigned case is claimed by the decision) andrate_limited(429 withRetry-After, per caller,API_RATE_LIMIT_PER_MINUTE). The client addsisQueueNameTaken,isCaseNotAssignedandisRateLimited.ff4da19: Plugins: a manifest may give
category,vendor,docsUrl(https) andpricingNote, whichGET /plugins/availablereturns withactionDetails, each action's timeout, retry policy, idempotency, webhook timeout and input and output JSON Schemas (PluginSummary,PluginActionSummary).GET /plugins/healthaddscircuits, the plugins whose circuit breaker the workers report open or half-open (PluginCircuit,PluginCircuitState); Home'splugin_failingattention item carriescircuit.POST /plugins/{name}/testcalls one synchronous action once with the tenant configuration (TestPluginInput,PluginTestResult).POST /plugins/{name}/secrets/{secret}stores a secret value sealed withSECRET_STORE_KEYand answers itsstore:reference (SetPluginSecretInput,PluginSecretRef);DELETErevokes it. Service users:GET,POST /service-users,PATCH /service-users/{id},POST /service-users/{id}/keys(the token is returned once) andDELETE /service-users/{id}/keys/{keyId}manage the tenant's machine users in Zitadel withZITADEL_MANAGEMENT_PAT(ServiceUser,ServiceUserKey,CreateServiceUserInput,UpdateServiceUserInput,CreateServiceUserKeyInput,IssuedServiceUserKey). New errors:secret_store_unavailableandservice_users_unavailable(503). The client addsplugins.test,plugins.setSecret,plugins.revokeSecretandserviceUsers; itsPluginSummaryis core's.f1b6377: Runs record what started them (
trigger:api,consoleorreplay) and the caller'scorrelationId, set onPOST /workflow-runs, filtered withtriggerand matched exactly bysearch. The worker traces every step visit:GET /workflow-runs/{id}/stepsreturns each visit's status, timings, summary, input and output and the rows it wrote (RunStep), andGET /workflow-runs/{id}/relatedthe run's cases, decision, replay links and, forops:read, a trace link (RunRelated,TRACE_URL_TEMPLATE). Admins cancel an active run (POST /workflow-runs/{id}/cancel, which closes its open cases and withdraws its forms) and replay a finished one from a step it reached (POST /workflow-runs/{id}/replay). New errorsrun_finished,run_activeandstep_not_reached(RunFinishedError,RunActiveError,StepNotReachedError); the client addsworkflowRuns.steps,related,cancelandreplayandisRunFinished,isRunActiveandisStepNotReached.dec5e57: Search, Home, health and document thumbnails.
GET /searchfinds subjects, cases, runs and definitions as far as the caller may read (SearchQuery,SearchResults,SearchGroup,SearchItem,SearchItemKind,SearchScope).GET /setup/checklistcomputes the setup steps (SetupChecklist,SetupItem,SetupItemId) andGET /activitytells recent decisions, breaches, publishes and approvals as sentences (ActivityFeed,ActivityItem,ActivityQuery).GET /health/summaryreports the dependencies, failing plugins and given-up webhooks (HealthSummary,HealthState,DependencyStatus). The scan renders a grayscale thumbnail of clean images and of a PDF's first page (Document.thumbnailKey), served byGET /documents/{id}/thumbnail(DocumentThumbnail). The client addshome.search,home.setupChecklist,home.activity,health.summaryanddocuments.thumbnail.bcce30e: Statistics:
GET /stats/overviewanswers Home's figures (StatsOverview: open, unassigned, breached and due cases, the last 24 hours of runs withautoDecidedPct, and theAttentionItems the caller may act on);GET /stats/definitions?kind=the activity per rule, workflow or collection flow over 1 to 90 days (DefinitionStats:RuleStats,WorkflowStats,FlowStats);GET /stats/slaSLA attainment, breaches and median time to decide, per workflow (SlaStats);GET /stats/rules/{key}/hitsa rule's recorded hits per UTC day and, withcompareVersion, that version's backtest beside them (RuleHits). A rule backtest's summary addsdaily(BacktestDay).GET /cases,/subjects,/audit-events,/workflow-runsand/plugin-invocationsstop counting at 100,000 and flag it withtotalIsEstimate.GET /workflow-runs/summarytakes every filter of the list and addsautoDecidedPct.GET /decisionspages (limit,offset,from,to) and returnstotal.GET /subjects/{id}/timelinepages bycursorand answersTimelinePage({ items, nextCursor }) in place ofoffset.GET /plugin-callbacksfilters bypluginNameand returnstotal. The client addsstats(overview,definitions,sla,ruleHits),pluginCallbacks.list,decisions.listPageandPage.totalIsEstimate;subjects.timelinereturns the page with its cursor, andworkflowRuns.summarytakes the list's filters. Core addspercentOf.774356c: Subjects can be changed with
PATCH /subjects/{id}(UpdateSubjectInput:dataas a JSON merge patch,tags,status), audited assubject.updatedwith the changed paths; core addsapplyMergePatch,diffMergePatchandchangedPaths.GET /subjects/{id}returnslastSeenAt(SubjectDetail),GET /subjects/{id}/linksthe subjects sharing a device, card, IP address, email, address or referral (SubjectLink), andGET /subjects/{id}/flagsthe derived signals (SubjectFlag).GET /subjectsfilters oncountryandlastDecision, andGET /subjects/exportreturns the filtered list as CSV. The client addssubjects.update,links,flagsandexportCsv.98d2fec: Tenant settings gain
cases.warnAtPct(the share of the SLA left when a new case turnsdue_soon, kept on the case asslaWarnPct),collection.defaultLinkTtlSeconds(the lifetime of links for flows that set none;CollectionFlowBody.linkTtlSecondsis optional andlinkLifetimeresolves it), andconsole.showRunContextToandconsole.maskForAnalysts, which decide what people see of run context and personal data (maskPersonalDatatakes the kinds to mask;PERSONAL_DATA_KINDS).TenantProfile.regionreportsDEPLOYMENT_REGION. Statistics count days in the tenant'sconsole.timeZone(RuleHits.timeZone;dayIn,midnightIn,daysIn).f4cfd62: Tenant settings gain namespaces:
cases.businessHours(BusinessHours, used byaddBusinessTimeto compute due times) andcases.onBreach(BreachActions),approvals.requiredFor(checked byapprovalRequired),collection.flowUrl(CollectionSettings) andconsole(ConsoleSettings);tenant.settings.updatedrecords thechangedpaths.Tenantgainsstatus,suspendedAt,suspendedReasonandlinksValidAfter. New routes:GET /tenants/me(TenantProfile),POST /tenants/me/suspend(SuspendTenantInput),POST /tenants/me/resumeandPOST /tenants/me/revoke-links(RevokedLinks), each behind a recent sign-in sent asX-Aletheia-Reauth;GET /roles(RoleDescription);GETandPUT /me/preferences(UserPreferences); and the team under/team(TeamUser,InviteUserInput,ChangeRoleInput). ErrorsTenantSuspendedError(tenant_suspended) andReauthRequiredError(reauth_required) are new. The client addstenants.profile,suspend,resume,revokeLinks,roles,preferences,updatePreferencesandtenants.team, theisTenantSuspendedandisReauthRequiredguards, and per-requestheaders.
0.4.0
Minor Changes
- 3282c50:
GET /collection-submissionslists submissions newest first, filtered bysubjectId,workflowRunIdandstatus, with the total.CollectionSubmissionFilterdescribes the filters, and the client'scollectionSubmissions.listandlistPagecall it.
0.3.0
Minor Changes
ffa9107:
API_CORS_ORIGINSnow defaults to empty. The admin console and the collection terminal call the API through their own origin, so a deployment lists only the other browser origins that call the API directly.eb2c640: Schemas for the case and subject list additions:
CaseListItemandCaseExpand(GET /cases?expand=subject),SubjectSummary,SubjectListItem,SubjectExpandandSubjectLastDecision(GET /subjects?expand=openCases&expand=lastDecision),CaseCountsInputandCaseCountswithMAX_CASE_COUNT_FILTERS,ClaimNextCaseInput, andBulkCaseInput,BulkCaseActionandBulkCaseResultwithMAX_BULK_CASES. New helperssubjectDisplayName,subjectCountryandtoSubjectSummaryderive a subject's display name and country from its free-formdata.7c5c045: Two optional collection-flow
Fieldproperties for applicant-facing copy:unit, a short unit (1 to 12 characters, such as%orGBP) shown after anumberinput, andmessages(FieldMessages), author-writtenrequiredandinvaliderror copy (1 to 200 characters each, trimmed) that replaces the generated messages. Both are display only: answers are validated exactly as before, and flows without them parse unchanged.eb2c640: New masking module:
maskEmail,maskPhone,maskDocumentNumber,maskDateOfBirth,personalDataKind(the key classifier),maskAttribute,maskPersonalData(deep, by key),redactValues(every leaf becomes[redacted], exported asREDACTED) andisHiddenValue. The API uses them to mask personal data for callers withoutsubjects:piiand to redact run context and plugin payloads for callers withoutruns:context.eb2c640: Schemas for the tenant-wide run list and the plugin figures:
WorkflowRunFilter,WorkflowRunExpandandWorkflowRunListItem(a run withdurationMs, theoutcomeof its decision and, withexpand=subject, itsSubjectSummary) forGET /workflow-runs;WorkflowRunSummaryQueryandWorkflowRunSummary(total,byStatuswith every status,p95DurationMs) forGET /workflow-runs/summary;PluginInvocationFilterforGET /plugin-invocations; andPluginHealthQuery,PluginHealth,PluginHealthReportandPLUGIN_HEALTH_WINDOW_MINUTESforGET /plugins/health.
0.2.0
Minor Changes
- 1b1c13f: New
PolicyPackschema and helpers (policy-pack.ts): a portable set of rules, rule sets, workflows, collection flows and lists (with rows, capped atPOLICY_PACK_MAX_LIST_ROWS) built from the same input schemas thePUTroutes accept, plusPolicyPackKeyRef(<kind>:<key>),parsePolicyPackKeyRef,policyPackKeyRefsandpolicyPackCounts. It is the body ofPOST /definitions/importand the response ofGET /definitions/export.
0.1.0
Minor Changes
- a783a44: First published release.
@aletheia-dev/api-clientand@aletheia-dev/collection-flow-uiare published for teams that embed collection flows or build their own back office;@aletheia-dev/coreand@aletheia-dev/collection-floware published as their dependencies and carry no stability promise before 1.0.