@ai-matrx/records 0.57.3 → 0.58.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.
@@ -1,7 +1,7 @@
1
- import { T as Timestamp, p as Uuid, R as RecordsErrorCode, q as RecordDocument, r as RecordsResult, s as RecordGraphWritten, t as RecordRead, u as ReadRow, v as Field, S as StoredRecord, w as NewFieldDeclaration, x as FieldPatch, y as RecordRevision, z as ReadValue, A as FieldProposal, C as TableProposal, D as RecordsError, W as WriteConflict, E as PgError, G as StaleWriteDetail, H as PredictedRefusal } from '../types-BpBSMhYq.cjs';
2
- export { I as ABSENCE_REASONS, J as ACTOR_VOCABULARY, K as AbsenceReason, L as Actor, M as COMPUTE_ON, O as CONTEXT_POLICIES, Q as ComputeOn, V as ContextPolicy, X as DECLARABLE_FIELD_KINDS, Y as DELIVERIES, Z as DeclarableFieldKind, _ as Delivery, $ as ENTITY_TOKENS, a0 as EntityToken, a1 as FIELD_SENSITIVITIES, a2 as FIELD_SOURCES, a3 as FRESHNESS, a4 as FieldBehavior, a5 as FieldRule, a6 as FieldSensitivity, a7 as FieldSource, a8 as FieldTypeWord, a9 as ForbiddenEnvelopeWord, aa as Freshness, ab as HiddenFieldNotice, ac as KERNEL_TABLES, ad as KernelTableName, ae as MERGE_FIELD_MODIFIERS, af as MERGE_FIELD_SEMANTIC_TYPES, ag as MERGE_FIELD_SOURCES, ah as MergeFieldModifier, ai as MergeFieldSemanticType, aj as MergeFieldSource, ak as ON_DELETE, al as OVERRIDE_POLICIES, am as OnDelete, an as OverridePolicy, ao as PARITY_FIELD_TYPES, ap as PER_VALUE_ACCESS_WORDS, aq as ParityFieldType, ar as ParityFieldTypeDescriptor, as as PerValueAccessWord, at as ProvenancePointer, au as RELATION_BINDINGS, av as RELATION_CARDINALITIES, aw as RELATION_FLAVORS, ax as RETIRED_ACTOR_WORDS, ay as RULE_NODE_KINDS, az as RULE_USES, aA as RelationBinding, aB as RelationCardinality, aC as RelationDisplay, aD as RelationFlavor, aE as RetiredActorWord, aF as RuleNodeKind, aG as RuleUse, aH as STORAGE_MODES, aI as STORE_DOORS, aJ as STORE_KNOBS, aK as STORE_REFUSAL_CODES, aL as StorageMode, aM as StoreDoorName, aN as StoreRefusalCode, aO as TABLE_DISPLAYS, aP as TABLE_ORIGINS, aQ as TABLE_TYPES, aR as TableDisplay, aS as TableOrigin, aT as TableType, aU as VALUE_ALTERNATE_KEYS, aV as VALUE_ENVELOPE_KEYS, aW as ValueAlternate, aX as ValueAlternateKey, aY as ValueEnvelope, aZ as ValueEnvelopeKey, a_ as ValueSource, a$ as allowsOtherValues, b0 as err, b1 as isRecordsErr, b2 as ok } from '../types-BpBSMhYq.cjs';
3
- import { RelationCoordinate, RecordsConfig, TableArchiveProgress, RecordFilter, ArchiveLane, ArchivedRow, Table, TableCapacity, RelationWordsManyArgs, EntityTableFacts, NewEntityFieldDeclaration, EntityFieldRights, EntityRecordRead, EntityRecordsFound, Pipeline, PipelineColumn, PipelineVerdict, PipelineMoveResult, PipelineSpec, PipelineDeclared, StageRuleOnFail, StageRuleEnforcement, StagePending, StagePendingOnBoard, PipelineGate, PipelineGatePreview, FormSummary, BookingSummary, BookingAvailability, BookingDeclared, ImportPlan, ImportPolicy, ImportOpened, ImportColumnsDeclared, ImportBatchResult, ImportFinished, ImportReport, ImportRun, InboundDeclared, InboundAddress, PortalSummary, PortalArchiveFilter, PortalArchiveAnswer, PortalTableRef, PortalCard, PortalInvitation, PortalRevocation, PortalPreviewRow, DashboardSummary, DashboardBlock, DashboardRunResult, StuckRow, CaptureSheetSummary, CaptureSheetFace, CaptureFileRef, CaptureOutcome, EnrichmentSummary, EnrichDeclared, EnrichDueRow, EnrichCell, EnrichRun, AggregateMeasure, AggregateBucket, AggregateRow, Subscription, MySubscription, SubscriptionSpec, DigestPreview, SavedViewRow, SavedViewSpecIn, DocToken, DocUnresolvedToken, DocTemplateRow, DocRenderRow, DocSignatureRow, RecordHistoryEntry, RecordScopeContext, ConversationScope, ConversationScopeContext, FieldHistoryEntry, RestorePreview, RestoreResult, CommentThreadRead, CommentWritten, AnonTokenBinding, ChecklistSpec, ChecklistDeclared, ChecklistTemplateSummary, ChecklistTemplateShape, ChecklistRunStarted, ChecklistRunStep, ChecklistRunSummary, ChecklistStepCompleted, WorkState, WorkGraph, WorkInstantiation, WorkTurn, WorkAssignmentField, WorkSlotHold, WorkInboxItem, WorkListFlavour, WorkListItem, WorkAssignment, WorkRecordState, WorkApprover, WorkChange, WorkApprovalFiled, WorkApprovalDecision, ExternalPrincipalCard, PublishBinding, ResolvedPublishBinding, MyLevel, DecorationPath, TableDecorations, GridLayout, FormulaParse, RowAction, ActionRunResult, RecordEvent, TableWebhookDeclared, TableWebhook, ExampleBuilt, IoExportPage, RecordsDataSource } from '../index.cjs';
4
- export { ARCHIVE_LANES, ARCHIVE_LANE_LABEL, ARCHIVE_LANE_MEANS, ActionRefusal, AggregateFilter, AggregateOperation, AggregateWindow, ArchivedDoorRow, BookingWindow, CaptureField, CaptureQuestion, CaptureQueue, CaptureQueueCounts, CaptureQueueOptions, CaptureQueuePorts, CaptureQueueStore, CaptureSyncReport, ChecklistRequirement, ChecklistRequirementKind, ChecklistRoleSpec, ChecklistStepSpec, ChecklistTrigger, ChecklistTriggerKind, ChoiceOption, ChoiceOptions, CoerceOptions, Coerced, CoercedAnswers, CoercibleField, CustomFieldTableType, DEFAULT_ARCHIVE_LANE, DEFAULT_PORTAL_ARCHIVE_FILTER, DashboardBlockKind, DashboardBlockResult, DecorationColor, DecorationRule, DecorationRuleOp, DecorationTarget, DocSignatureCheck, EnrichAlternate, EnrichSource, Enrichment, EntityFieldValue, EntityRecordMatch, ExampleSpec, FIELD_KINDS, FieldKind, GridLayoutMode, GridRowHeight, HistoryActor, HistoryActorKind, HistoryChange, Home, ImportColumnPlan, ImportOutcome, ImportProposal, KernelTargets, MergeField, MergeFieldProvenance, MergeFieldResolution, MergeFieldTransform, MissingBehavior, PERMISSION_LEVELS, PIPELINE_RULE_KINDS, PORTAL_ARCHIVE_FILTERS, PermissionLevel, PipelineMissingField, PipelineRule, PipelineRuleKind, PipelineStage, PortalPrincipal, PortalTableExposure, QueuedCapture, QueuedCaptureFile, QueuedCaptureState, QuietHours, REFUSALS_WORTH_REPEATING, RecordChangeAction, RecordComment, RecordScopeComment, RecordScopeField, RecordScopeHistoryEntry, RecordScopeRelation, RecordScopeWithheld, RecordsActor, RecordsChangeSink, RecordsErrorSink, RecordsFilter, RecordsRealtimePort, RecordsResolverPort, RecordsResponse, RecordsTableQuery, RegisteredTable, Relation, RelationCarries, RelationDisplaySpec, RelationProperties, RelationStore, RelationTarget, ResolutionTriple, RowActionStep, Rule, RuleAnswer, RuleExpression, STAGE_RULE_ENFORCEMENT, STAGE_RULE_ON_FAIL, StageRuleWarning, SubscriptionBlock, SubscriptionCadence, ViewLayout, WorkDueState, WorkInboxKind, WorkOrigin, WorkTemplateNode, WorkTemplateRelation, actionRefusals, archivedByLine, archivedWhen, asPermissionLevel, atLeast, bookingPath, choiceSlug, choiceValuesOf, choicesOf, coerceTypedAnswer, coerceTypedAnswers, coercionLabel, emptyArchiveLine, emptyPortalArchiveLine, exampleSpec, exportPageXlsx, fieldKindFor, forgetAllOps, highestLevel, holdsARetiredChoice, indexedDbStore, isArchiveLane, isDecided, isOwnOp, isPortalArchiveFilter, isTheChosen, looksLikeAnId, mayDrag, measureKey, memoryStore, mintClientKey, mintOpId, openCaptureQueue, optionKey, optionLabel, portalArchiveConsequence, portalConfirmLine, portalPath, portalTitleTypedBack, publicFormPath, recordChangeTrigger, rememberedOpCount, sameDocument, scopeChip, stableFilterKey } from '../index.cjs';
1
+ import { T as Timestamp, p as Uuid, R as RecordsErrorCode, q as RecordDocument, r as RecordsResult, s as RecordGraphWritten, t as RecordRead, u as ReadRow, v as Field, S as StoredRecord, w as NewFieldDeclaration, x as FieldPatch, y as RecordRevision, z as ReadValue, A as FieldProposal, C as TableProposal, D as RecordsError, W as WriteConflict, E as FieldTypeWord, G as PgError, H as StaleWriteDetail, I as PredictedRefusal } from '../types-NKSc_jZq.cjs';
2
+ export { J as ABSENCE_REASONS, K as ACTOR_VOCABULARY, L as AbsenceReason, M as Actor, O as COMPUTE_ON, Q as CONTEXT_POLICIES, V as ComputeOn, X as ContextPolicy, Y as DECLARABLE_FIELD_KINDS, Z as DELIVERIES, _ as DeclarableFieldKind, $ as Delivery, a0 as ENTITY_TOKENS, a1 as EntityToken, a2 as FIELD_SENSITIVITIES, a3 as FIELD_SOURCES, a4 as FRESHNESS, a5 as FieldBehavior, a6 as FieldRule, a7 as FieldSensitivity, a8 as FieldSource, a9 as ForbiddenEnvelopeWord, aa as Freshness, ab as HiddenFieldNotice, ac as KERNEL_TABLES, ad as KernelTableName, ae as MERGE_FIELD_MODIFIERS, af as MERGE_FIELD_SEMANTIC_TYPES, ag as MERGE_FIELD_SOURCES, ah as MergeFieldModifier, ai as MergeFieldSemanticType, aj as MergeFieldSource, ak as ON_DELETE, al as OVERRIDE_POLICIES, am as OnDelete, an as OverridePolicy, ao as PARITY_FIELD_TYPES, ap as PER_VALUE_ACCESS_WORDS, aq as ParityFieldType, ar as ParityFieldTypeDescriptor, as as PerValueAccessWord, at as ProvenancePointer, au as RELATION_BINDINGS, av as RELATION_CARDINALITIES, aw as RELATION_FLAVORS, ax as RETIRED_ACTOR_WORDS, ay as RULE_NODE_KINDS, az as RULE_USES, aA as RelationBinding, aB as RelationCardinality, aC as RelationDisplay, aD as RelationFlavor, aE as RetiredActorWord, aF as RuleNodeKind, aG as RuleUse, aH as STORAGE_MODES, aI as STORE_DOORS, aJ as STORE_KNOBS, aK as STORE_REFUSAL_CODES, aL as StorageMode, aM as StoreDoorName, aN as StoreRefusalCode, aO as TABLE_DISPLAYS, aP as TABLE_ORIGINS, aQ as TABLE_TYPES, aR as TableDisplay, aS as TableOrigin, aT as TableType, aU as VALUE_ALTERNATE_KEYS, aV as VALUE_ENVELOPE_KEYS, aW as ValueAlternate, aX as ValueAlternateKey, aY as ValueEnvelope, aZ as ValueEnvelopeKey, a_ as ValueSource, a$ as allowsOtherValues, b0 as err, b1 as isRecordsErr, b2 as ok } from '../types-NKSc_jZq.cjs';
3
+ import { RelationCoordinate, RecordsConfig, TableArchiveProgress, StoreFilter, ArchiveLane, ArchivedRow, Table, TableCapacity, RelationWordsManyArgs, EntityTableFacts, NewEntityFieldDeclaration, EntityFieldRights, EntityRecordRead, EntityRecordsFound, Pipeline, PipelineColumn, PipelineVerdict, PipelineMoveResult, PipelineMoveManyItem, PipelineMoveMany, PipelineSpec, PipelineDeclared, StageRuleOnFail, StageRuleEnforcement, StagePending, StagePendingOnBoard, PipelineGate, PipelineGatePreview, FormSummary, BookingSummary, BookingAvailability, BookingDeclared, ImportPlan, ImportPolicy, ImportOpened, ImportColumnsDeclared, ImportBatchResult, ImportFinished, ImportReport, ImportRun, InboundDeclared, InboundAddress, PortalSummary, PortalArchiveFilter, PortalArchiveAnswer, PortalTableRef, PortalCard, PortalConfigInput, PortalFormSpec, PortalFormAnswer, PortalInvitation, PortalRevocation, PortalPreviewRow, DashboardSummary, DashboardBlock, RecordFilter, AggregateCompare, AggregateBucket, DashboardRunResult, StuckRow, CaptureSheetSummary, CaptureSheetFace, CaptureFileRef, CaptureOutcome, EnrichmentSummary, EnrichDeclared, EnrichDueRow, EnrichCell, EnrichRun, AggregateMeasure, AggregateRow, Subscription, MySubscription, SubscriptionSpec, DigestPreview, SavedViewRow, SavedViewSpecIn, DocToken, DocUnresolvedToken, DocTemplateRow, DocRenderRow, DocSignatureRow, RecordHistoryEntry, RecordScopeContext, ConversationScope, ConversationScopeContext, FieldHistoryEntry, RestorePreview, RestoreResult, CommentThreadRead, CommentWritten, AnonTokenBinding, ChecklistSpec, ChecklistDeclared, ChecklistTemplateSummary, ChecklistTemplateShape, ChecklistRunStarted, ChecklistRunStep, ChecklistRunSummary, ChecklistStepCompleted, WorkState, WorkGraph, WorkInstantiation, WorkTurn, WorkAssignmentField, WorkSlotHold, WorkInboxItem, WorkListFlavour, WorkListItem, WorkAssignment, WorkRecordState, WorkApprover, WorkChange, WorkApprovalFiled, WorkApprovalDecision, WorkDecideManyItem, WorkDecideMany, ExternalPrincipalCard, PublishBinding, ResolvedPublishBinding, MyLevel, DecorationPath, TableDecorations, GridLayout, FormulaParse, RowAction, ActionRunResult, RecordEvent, TableWebhookDeclared, TableWebhook, ExampleBuilt, IoExportPage, TableListEntry, TableSyncSpec, TableSyncResult, TableRowCount, RecordHeader, OutsideShareAnswer, ViewOrderSet, RecordsDataSource } from '../index.cjs';
4
+ export { ARCHIVE_LANES, ARCHIVE_LANE_LABEL, ARCHIVE_LANE_MEANS, ActionRefusal, AggregateCompareKind, AggregateCompareWindows, AggregateDelta, AggregateFilter, AggregateOperation, AggregateWindow, ArchivedDoorRow, BookingWindow, CaptureField, CaptureQuestion, CaptureQueue, CaptureQueueCounts, CaptureQueueOptions, CaptureQueuePorts, CaptureQueueStore, CaptureSyncReport, ChecklistRequirement, ChecklistRequirementKind, ChecklistRoleSpec, ChecklistStepSpec, ChecklistTrigger, ChecklistTriggerKind, ChoiceOption, ChoiceOptions, CoerceOptions, Coerced, CoercedAnswers, CoercibleField, CustomFieldTableType, DEFAULT_ARCHIVE_LANE, DEFAULT_PORTAL_ARCHIVE_FILTER, DashboardBlockKind, DashboardBlockResult, DashboardTarget, DashboardTargetBase, DashboardTargetOp, DashboardTargetResult, DashboardTotals, DecorationColor, DecorationRule, DecorationRuleOp, DecorationTarget, DocSignatureCheck, EnrichAlternate, EnrichSource, Enrichment, EntityFieldValue, EntityRecordMatch, EntityRef, EntityRefWithWords, EntityReferenceKind, ExampleSpec, FIELD_KINDS, FieldKind, GridLayoutMode, GridRowHeight, HistoryActor, HistoryActorKind, HistoryChange, Home, ImportColumnPlan, ImportOutcome, ImportProposal, KernelTargets, MergeField, MergeFieldProvenance, MergeFieldResolution, MergeFieldTransform, MissingBehavior, PERMISSION_LEVELS, PIPELINE_RULE_KINDS, PORTAL_ACCENTS, PORTAL_ARCHIVE_FILTERS, PermissionLevel, PipelineMissingField, PipelineMoveManyResult, PipelineMoveVerdict, PipelineRule, PipelineRuleKind, PipelineStage, PortalAccent, PortalConfig, PortalFooterLink, PortalFormInput, PortalFormRef, PortalPrincipal, PortalStage, PortalStyle, PortalStyleInput, PortalTableExposure, QueuedCapture, QueuedCaptureFile, QueuedCaptureState, QuietHours, REFUSALS_WORTH_REPEATING, RecordChangeAction, RecordComment, RecordScopeComment, RecordScopeField, RecordScopeHistoryEntry, RecordScopeRelation, RecordScopeWithheld, RecordsActor, RecordsChangeSink, RecordsErrorSink, RecordsFilter, RecordsRealtimePort, RecordsResolverPort, RecordsResponse, RecordsTableQuery, RegisteredTable, Relation, RelationCarries, RelationDisplaySpec, RelationProperties, RelationStore, RelationTarget, ResolutionTriple, RowActionStep, Rule, RuleAnswer, RuleExpression, STAGE_RULE_ENFORCEMENT, STAGE_RULE_ON_FAIL, StageRuleWarning, SubscriptionBlock, SubscriptionCadence, TablePlacement, TablePlacementFact, TableSyncSource, ViewLayout, WorkDecideManyResult, WorkDecideVerdict, WorkDueState, WorkInboxKind, WorkOrigin, WorkTemplateNode, WorkTemplateRelation, actionRefusals, archivedByLine, archivedWhen, asPermissionLevel, atLeast, bookingPath, choiceSlug, choiceValuesOf, choicesOf, coerceTypedAnswer, coerceTypedAnswers, coercionLabel, emptyArchiveLine, emptyPortalArchiveLine, entityReferenceKinds, entityReferenceKindsOf, entityReferenceWords, entityRefsOf, entityRefsToWrite, exampleSpec, exportPageXlsx, fieldKindFor, forgetAllOps, highestLevel, holdsARetiredChoice, indexedDbStore, isArchiveLane, isDecided, isEntityReferenceConfig, isOwnOp, isPortalAccent, isPortalArchiveFilter, isRuleFilter, isTheChosen, keptGroups, keptOutOfSight, keptTableHref, looksLikeAnId, mayDrag, measureKey, memoryStore, mintClientKey, mintOpId, moveInOrder, offeredAsContext, openCaptureQueue, optionKey, optionLabel, portalArchiveConsequence, portalConfirmLine, portalPath, portalTitleTypedBack, publicFormPath, recordChangeTrigger, rememberedOpCount, sameDocument, scopeChip, sheetSyncSpec, stableFilterKey, withRowCounts, withTablePlacement } from '../index.cjs';
5
5
 
6
6
  /**
7
7
  * DOOR-8. As-of on EITHER clock, and they are different questions:
@@ -252,7 +252,7 @@ interface RecordsClient {
252
252
  * `recordAggregate` counts with, so the rows a drill-through opens are the
253
253
  * rows the number on the dashboard counted.
254
254
  */
255
- filter?: RecordFilter;
255
+ filter?: StoreFilter;
256
256
  limit?: number;
257
257
  offset?: number;
258
258
  }): Promise<RecordsResult<{
@@ -460,6 +460,12 @@ interface RecordsClient {
460
460
  pipelineBoard(args: {
461
461
  table_id: Uuid;
462
462
  measure?: string | null;
463
+ /**
464
+ * S2-PRIME — the view's question, either shape (`StoreFilter`). Given, the headings count and
465
+ * total exactly the cards the same filter puts on the board (`custom.pipeline_board`'s
466
+ * four-argument door); left out, the whole table this person may see, as before.
467
+ */
468
+ filter?: StoreFilter | null;
463
469
  }): Promise<RecordsResult<PipelineColumn[]>>;
464
470
  /** Whether this card may go to that column — asked BEFORE the finger lets go. */
465
471
  pipelineTransitionRefusal(args: {
@@ -480,6 +486,16 @@ interface RecordsClient {
480
486
  also?: Record<string, unknown>;
481
487
  expected_version?: number | null;
482
488
  }): Promise<RecordsResult<PipelineMoveResult>>;
489
+ /**
490
+ * MOVE MANY CARDS IN ONE CALL (lane S4, `custom.pipeline_move_many`). Each card is judged by
491
+ * `pipeline_move` exactly as one is, in its own savepoint: a refused card writes nothing and the
492
+ * others still land. `expected_version` is required per card — a card that changed since the
493
+ * board loaded answers `changed_since_loaded` and is never overwritten. A refusal of the WHOLE
494
+ * call (a stranger, an empty batch, more than the `custom/batch_items_max` knob) is the error.
495
+ */
496
+ pipelineMoveMany(args: {
497
+ moves: PipelineMoveManyItem[];
498
+ }): Promise<RecordsResult<PipelineMoveMany>>;
483
499
  /** Declare (or re-state) a pipeline: the stage column and its transition Rules. */
484
500
  pipelineDeclare(args: {
485
501
  table_id: Uuid;
@@ -522,9 +538,25 @@ interface RecordsClient {
522
538
  stage: string;
523
539
  gate: PipelineGate | Record<string, unknown>;
524
540
  }): Promise<RecordsResult<PipelineGatePreview>>;
541
+ /**
542
+ * SERVER LANE ONLY. `custom.rule_members` walks the whole scope table through the evaluator and
543
+ * returns STORED rows — no visibility ladder, no masking — so no browser role holds EXECUTE on it
544
+ * and it answers 42501 from a signed-in seat. A screen reads a Rule's members through
545
+ * `ruleMembersVisible`.
546
+ */
525
547
  ruleMembers(args: {
526
548
  rule_id: Uuid;
527
549
  }): Promise<RecordsResult<StoredRecord[]>>;
550
+ /**
551
+ * S2-PRIME — THE MEMBERS OF A MEMBERSHIP RULE THIS PERSON MAY SEE, a page at a time
552
+ * (`custom.rule_members_visible`): the list door asked the Rule's own test, so the rows are the
553
+ * read door's — the same ladder, masked documents, the same page ceiling.
554
+ */
555
+ ruleMembersVisible(args: {
556
+ rule_id: Uuid;
557
+ limit?: number;
558
+ offset?: number;
559
+ }): Promise<RecordsResult<ReadRow[]>>;
528
560
  /** Is this one record a member, and WHY — the store's own answer. */
529
561
  ruleMembership(args: {
530
562
  rule_id: Uuid;
@@ -602,6 +634,22 @@ interface RecordsClient {
602
634
  form_id?: Uuid | null;
603
635
  slug?: string | null;
604
636
  }): Promise<RecordsResult<Uuid>>;
637
+ /**
638
+ * WHICH OF A FORM'S QUESTIONS ARE ASKED, given the answers so far — for the OWNER's preview of
639
+ * a draft (`custom.form_preview_asks`). One row per question in order; `asked` is false only
640
+ * when the store's own Rule said so. Undecided and unworkable conditions are asked, the second
641
+ * with the store's sentence in `said`.
642
+ */
643
+ formPreviewAsks(args: {
644
+ table_id: Uuid;
645
+ questions: unknown[];
646
+ values: Record<string, unknown>;
647
+ }): Promise<RecordsResult<Array<{
648
+ field_key: string;
649
+ asked: boolean;
650
+ decided: boolean;
651
+ said: string | null;
652
+ }>>>;
605
653
  /**
606
654
  * What the store makes of a file's columns, before anything is written.
607
655
  * `columns` is `[{header, samples}]` — the first page of the file is plenty.
@@ -765,7 +813,35 @@ interface RecordsClient {
765
813
  portal_id?: Uuid | null;
766
814
  slug?: string | null;
767
815
  sign_in_method?: string | null;
816
+ /**
817
+ * S6 — the portal's own look and its forms. A key given REPLACES that key; a key not given
818
+ * is KEPT (leave `config` out and both stay exactly as they are). The store judges it and
819
+ * refuses by name: a logo that is not a public picture of this organization's Files, an
820
+ * accent that is not a design-system colour name, a form whose Table the portal does not show.
821
+ */
822
+ config?: PortalConfigInput | null;
768
823
  }): Promise<RecordsResult<Uuid>>;
824
+ /**
825
+ * S6 — THE CLIENT'S SIDE: one form of HER portal (`custom.portal_form`). Refused unless the
826
+ * caller is a live principal of that live portal and the form is on its list; the Field that
827
+ * names the client is never one of the questions — the portal fills it.
828
+ */
829
+ portalForm(args: {
830
+ portal_id: Uuid;
831
+ form_id: Uuid;
832
+ }): Promise<RecordsResult<PortalFormSpec>>;
833
+ /**
834
+ * S6 — send one form of her portal (`custom.portal_form_submit`). The store fills the Field
835
+ * that names the client with her own record, and the answer reaches her own list at once
836
+ * (`accepted`) or waits for the office (`held`, with the store's sentence). `client_key`
837
+ * makes a retry the same submission.
838
+ */
839
+ portalFormSubmit(args: {
840
+ portal_id: Uuid;
841
+ form_id: Uuid;
842
+ answers: Record<string, unknown>;
843
+ client_key?: string | null;
844
+ }): Promise<RecordsResult<PortalFormAnswer>>;
769
845
  /**
770
846
  * Invite one person, as one record of the portal's client Table.
771
847
  *
@@ -821,6 +897,14 @@ interface RecordsClient {
821
897
  dashboardRun(args: {
822
898
  dashboard_id: Uuid;
823
899
  filter?: RecordFilter;
900
+ /**
901
+ * S3 — compare every block that does not carry its own comparison (the
902
+ * block's own wins, as its own filter does). A block with no date to
903
+ * compare along answers alone and says so in `compare_refused`.
904
+ */
905
+ compare?: AggregateCompare | null;
906
+ /** S3 — re-cut every bucketed block to one date grain (the canvas's picker). */
907
+ grain?: AggregateBucket | null;
824
908
  }): Promise<RecordsResult<DashboardRunResult>>;
825
909
  /** The seventh block kind on its own: records that have sat on the same value too long. */
826
910
  dashboardStuck(args: {
@@ -946,8 +1030,15 @@ interface RecordsClient {
946
1030
  * A scalar is an equality and an object is a half-open moment window, and
947
1031
  * either way it lands in the SAME WHERE as visibility.
948
1032
  */
949
- filter?: RecordFilter;
1033
+ filter?: StoreFilter;
950
1034
  limit?: number;
1035
+ /**
1036
+ * S3 — answer the same question over a prior window too (previous period,
1037
+ * same period last year, or a fixed baseline). Each row then carries
1038
+ * `prior_measures`, `delta` and the two `compare` windows. Buckets are cut
1039
+ * in the organization's calendar (knobs `custom/time_zone`, `custom/week_start`).
1040
+ */
1041
+ compare?: AggregateCompare | null;
951
1042
  }): Promise<RecordsResult<AggregateRow[]>>;
952
1043
  /** The measures the store itself offers. Asked, never hardcoded in a picker. */
953
1044
  aggOperations(): Promise<RecordsResult<string[]>>;
@@ -1483,6 +1574,15 @@ interface RecordsClient {
1483
1574
  approve: boolean;
1484
1575
  note?: string | null;
1485
1576
  }): Promise<RecordsResult<WorkApprovalDecision>>;
1577
+ /**
1578
+ * DECIDE MANY INBOX ITEMS IN ONE CALL (lane S4, `custom.work_decide_many`). Each is judged by
1579
+ * `work_approval_decide` exactly as one is, in its own savepoint: a refused decision leaves that
1580
+ * item waiting and the others still stand. Verdicts: approved, declined, already_decided,
1581
+ * no_right, refused — each with the store's own sentence.
1582
+ */
1583
+ workDecideMany(args: {
1584
+ decisions: WorkDecideManyItem[];
1585
+ }): Promise<RecordsResult<WorkDecideMany>>;
1486
1586
  /** One waiting change in full, for the person deciding it or the one who asked. */
1487
1587
  workApprovalRead(args: {
1488
1588
  approval_id: Uuid;
@@ -1638,6 +1738,61 @@ interface RecordsClient {
1638
1738
  limit?: number;
1639
1739
  }): Promise<RecordsResult<IoExportPage>>;
1640
1740
  /** G5. That page as an .xlsx; a withheld column is named on its own sheet. */
1741
+ /** G9. Every table a picker may offer here, from BOTH stores, each saying which store opens it. */
1742
+ tableListEverywhere(): Promise<RecordsResult<{
1743
+ success: boolean;
1744
+ tables: TableListEntry[];
1745
+ }>>;
1746
+ /**
1747
+ * G10. Refresh a synced source (a sheet tab) into ONE Table under `home_id`: new rows added,
1748
+ * changed rows updated, rows the source dropped archived — never destroyed; columns the
1749
+ * person added in Matrx survive. Build the spec with `sheetSyncSpec`.
1750
+ */
1751
+ tableSync(args: {
1752
+ home_id: Uuid;
1753
+ spec: TableSyncSpec;
1754
+ }): Promise<RecordsResult<TableSyncResult>>;
1755
+ /**
1756
+ * G11. The record-store Table a context scope's template-bound item provisions — one per item
1757
+ * and scope. A scope provisioned before the move answers with its moved Table (same id); the
1758
+ * Home defaults to the organization's own.
1759
+ */
1760
+ scopeTableProvision(args: {
1761
+ item_id: Uuid;
1762
+ scope_id: Uuid;
1763
+ home_id?: Uuid | null;
1764
+ }): Promise<RecordsResult<Uuid>>;
1765
+ /** G12. The rows of each Table this reader may see, in one call (fold with `withRowCounts`). A Table she may not know gets no row. */
1766
+ tableRowCounts(args: {
1767
+ table_ids: Uuid[];
1768
+ }): Promise<RecordsResult<TableRowCount[]>>;
1769
+ /** G12. Each live record's own header (created, updated, version) that the read door does not answer. */
1770
+ recordHeaders(args: {
1771
+ ids: Uuid[];
1772
+ }): Promise<RecordsResult<RecordHeader[]>>;
1773
+ /**
1774
+ * G14. Share a Table with a person by email or account id: an existing account outside the
1775
+ * organization is granted at once and notified (never made a member); an address with no
1776
+ * account is invited. The organization's outside-sharing setting decides first.
1777
+ */
1778
+ tableShareOutsideGrant(args: {
1779
+ table_id: Uuid;
1780
+ person: string;
1781
+ level?: "viewer" | "commenter" | "editor" | "admin";
1782
+ }): Promise<RecordsResult<OutsideShareAnswer>>;
1783
+ /** G13. Keep a hand-set order on a saved view: the named rows first, in this order (build it with `moveInOrder`). */
1784
+ viewRecordOrderSet(args: {
1785
+ view_id: Uuid;
1786
+ record_ids: Uuid[];
1787
+ }): Promise<RecordsResult<ViewOrderSet>>;
1788
+ /** G13. A page of a hand-ordered view: placed rows by position, then the rest by created time. */
1789
+ readInViewOrder(args: {
1790
+ view_id: Uuid;
1791
+ limit?: number;
1792
+ offset?: number;
1793
+ }): Promise<RecordsResult<Array<ReadRow & {
1794
+ position: number | null;
1795
+ }>>>;
1641
1796
  exportXlsx(args: {
1642
1797
  table_id: Uuid;
1643
1798
  columns?: string[] | null;
@@ -1736,6 +1891,8 @@ declare const DOORS: {
1736
1891
  readonly pipelineBoard: "pipeline_board";
1737
1892
  readonly pipelineTransitionRefusal: "pipeline_transition_refusal";
1738
1893
  readonly pipelineMove: "pipeline_move";
1894
+ /** Lane S4: many cards, one call, a verdict and a version per card. */
1895
+ readonly pipelineMoveMany: "pipeline_move_many";
1739
1896
  readonly tableStageField: "table_stage_field";
1740
1897
  readonly stageRuleOnFailKinds: "stage_rule_on_fail_kinds";
1741
1898
  readonly stageRuleEnforcement: "stage_rule_enforcement";
@@ -1743,11 +1900,18 @@ declare const DOORS: {
1743
1900
  readonly pipelinePending: "pipeline_pending";
1744
1901
  readonly pipelineGatePreview: "pipeline_gate_preview";
1745
1902
  readonly ruleMembers: "rule_members";
1903
+ readonly ruleMembersVisible: "rule_members_visible";
1746
1904
  readonly ruleMembership: "rule_membership";
1747
1905
  readonly ruleRun: "rule_run";
1748
1906
  readonly ruleEval: "rule_eval";
1749
1907
  readonly forms: "forms";
1750
1908
  readonly formDeclare: "form_declare";
1909
+ /**
1910
+ * WHICH QUESTIONS THE OWNER'S PREVIEW ASKS NEXT (lane FORMS-FIX-1). The same store answer a
1911
+ * stranger's form gets (`custom._form_questions_asked` → `custom.rule_eval`), behind the
1912
+ * organization wall and the caller's own rung on the Table — never `rule_eval` from a browser.
1913
+ */
1914
+ readonly formPreviewAsks: "form_preview_asks";
1751
1915
  readonly bookings: "bookings";
1752
1916
  readonly bookingDeclare: "booking_declare";
1753
1917
  readonly importPlan: "io_import_plan";
@@ -1770,6 +1934,8 @@ declare const DOORS: {
1770
1934
  readonly portalInvite: "portal_invite";
1771
1935
  readonly portalRevoke: "portal_revoke";
1772
1936
  readonly portalPreview: "portal_preview";
1937
+ readonly portalForm: "portal_form";
1938
+ readonly portalFormSubmit: "portal_form_submit";
1773
1939
  readonly listPortals: "list_portals";
1774
1940
  readonly portalArchive: "portal_archive";
1775
1941
  readonly portalRestore: "portal_restore";
@@ -1863,6 +2029,8 @@ declare const DOORS: {
1863
2029
  readonly workApprovalRequest: "work_approval_request";
1864
2030
  readonly workApprovalMayDecide: "work_approval_may_decide";
1865
2031
  readonly workApprovalDecide: "work_approval_decide";
2032
+ /** Lane S4: many inbox decisions, one call, a verdict per item. */
2033
+ readonly workDecideMany: "work_decide_many";
1866
2034
  readonly workApprovalRead: "work_approval_read";
1867
2035
  readonly checklistRefusal: "checklist_refusal";
1868
2036
  readonly checklistDeclare: "checklist_declare";
@@ -1886,6 +2054,14 @@ declare const DOORS: {
1886
2054
  readonly tableFromExample: "table_from_example";
1887
2055
  readonly autonumberBackfill: "autonumber_backfill";
1888
2056
  readonly ioExport: "io_export";
2057
+ readonly tableListEverywhere: "table_list_everywhere";
2058
+ readonly tableSync: "table_sync";
2059
+ readonly scopeTableProvision: "scope_table_provision";
2060
+ readonly tableRowCounts: "table_row_counts";
2061
+ readonly recordHeaders: "record_headers";
2062
+ readonly viewRecordOrderSet: "view_record_order_set";
2063
+ readonly readRecordsInViewOrder: "read_records_in_view_order";
2064
+ readonly tableShareOutsideGrant: "table_share_outside_grant";
1889
2065
  readonly metadataSearch: "metadata_search";
1890
2066
  readonly ruleDeclare: "rule_declare";
1891
2067
  readonly fieldPropose: "field_propose";
@@ -1899,6 +2075,95 @@ declare function doorCensus(): {
1899
2075
  absent: string[];
1900
2076
  };
1901
2077
 
2078
+ /** One Field a person asked for, in the words a person uses (FLD-1 / FLD-11). */
2079
+ interface NewFieldSpec {
2080
+ key: string;
2081
+ label: string;
2082
+ /**
2083
+ * The word for what this column holds. One of the thirteen parity types, one
2084
+ * of the five behaviours, or a plain synonym (`text`, `long_text`, `number`)
2085
+ * — `custom._field_document_for` resolves all three and refuses a word that
2086
+ * means nothing, by name, with the list.
2087
+ */
2088
+ type: FieldTypeWord;
2089
+ sort?: number;
2090
+ required?: boolean;
2091
+ multi?: boolean;
2092
+ config?: Record<string, unknown>;
2093
+ /** A choice list's choices, as words. The store keeps them as a Table (FLD-5). */
2094
+ options?: string[];
2095
+ /** A column that points at another Table of this organization (FLD-11 / REL-8). */
2096
+ relationTarget?: Uuid;
2097
+ /** A currency column's symbol; a date column's day-or-day-and-time. */
2098
+ unit?: string;
2099
+ kind?: "date" | "datetime";
2100
+ }
2101
+ interface NewTableSpec {
2102
+ name: string;
2103
+ /** The token the Table is addressed by. Derived from the name when absent. */
2104
+ slug?: string;
2105
+ labelSingular?: string;
2106
+ labelPlural?: string;
2107
+ /** The Field whose value is the record's title (REC-2). Defaults to the first Field. */
2108
+ titleField?: string;
2109
+ fields?: NewFieldSpec[];
2110
+ }
2111
+ type DeclareResult =
2112
+ /**
2113
+ * The Table's id — and its HOME's, because REC-14 gives the Table exactly one
2114
+ * and the caller that made it is the only one that can tidy it up again. A
2115
+ * caller reading `data` alone is unaffected.
2116
+ */
2117
+ {
2118
+ ok: true;
2119
+ data: Uuid;
2120
+ homeId: Uuid;
2121
+ } | {
2122
+ ok: false;
2123
+ error: RecordsError;
2124
+ };
2125
+ /** `My Sales Pipeline` → `my_sales_pipeline`. A token, never a sentence. */
2126
+ declare function tokenFor(name: string): string;
2127
+ /** The one Field a Table cannot be declared without: something to call a record. */
2128
+ /**
2129
+ * WHY THE FIRST FIELD IS NOT REQUIRED.
2130
+ *
2131
+ * It was, and the cost showed up the moment the grid could add a row: "New
2132
+ * record" writes an empty record and puts you in the first cell, and the store
2133
+ * correctly refused every one of them — `REC-51: Title is required` — so the
2134
+ * one gesture that makes a grid feel like a grid never worked on a table a
2135
+ * person had just made. A title is what makes a record a CHIP (REC-2), which is
2136
+ * a fact about how it is shown, not a promise it can never be written without;
2137
+ * an organization that wants it demanded says so in the field editor, and the
2138
+ * store then enforces it for everyone.
2139
+ */
2140
+ declare const DEFAULT_FIELDS: NewFieldSpec[];
2141
+ /**
2142
+ * One column, in the shape `custom.field_declare` takes — and EVERYTHING a
2143
+ * person said about it. The keys after the type are not decoration: without
2144
+ * `options` the door refuses a choice list outright ("A list of choices needs
2145
+ * its choices"), without `unit` a money column is dollars whatever the person
2146
+ * picked, and without `relation_target` a column that points at another of this
2147
+ * organization's own tables cannot be declared at all.
2148
+ */
2149
+ declare function fieldDeclarationFor(field: NewFieldSpec): NewFieldDeclaration;
2150
+ declare function declareTable(client: RecordsClient, spec: NewTableSpec): Promise<DeclareResult>;
2151
+ /**
2152
+ * Columns for an existing Table, through the door that declares one. Used by
2153
+ * the create path and by import.
2154
+ *
2155
+ * A column the store refused STOPS the sequence and hands back the store's own
2156
+ * sentence: a Table that quietly lost a column is the silent failure this
2157
+ * package exists to prevent.
2158
+ */
2159
+ declare function addFields(client: RecordsClient, tableId: Uuid, fields: NewFieldSpec[]): Promise<{
2160
+ ok: true;
2161
+ data: Uuid;
2162
+ } | {
2163
+ ok: false;
2164
+ error: RecordsError;
2165
+ }>;
2166
+
1902
2167
  type Listener = (recordId: string) => void;
1903
2168
  /** Called by the client after a write door answered yes. */
1904
2169
  declare function announceRecordChanged(recordId: string): void;
@@ -2022,4 +2287,4 @@ declare function parseCsv(text: string): string[][];
2022
2287
  declare function importCsv(text: string): ParsedImport;
2023
2288
  declare function importXlsx(bytes: ArrayBuffer | Uint8Array): Promise<ParsedImport>;
2024
2289
 
2025
- export { A_PERSONS_REFUSAL, ActionRunResult, AggregateBucket, AggregateMeasure, AggregateRow, AnonTokenBinding, ArchiveLane, ArchivedRow, type AsOf, BookingAvailability, BookingDeclared, BookingSummary, CaptureFileRef, CaptureOutcome, CaptureSheetFace, CaptureSheetSummary, ChecklistDeclared, ChecklistRunStarted, ChecklistRunStep, ChecklistRunSummary, ChecklistSpec, ChecklistStepCompleted, ChecklistTemplateShape, ChecklistTemplateSummary, CommentThreadRead, CommentWritten, ConversationScope, ConversationScopeContext, DEFAULT_DOCUMENT_MAX_BYTES, DEFAULT_PAGE_SIZE, DEFAULT_VALUE_MAX_BYTES, DOORS, DashboardBlock, DashboardRunResult, DashboardSummary, DecorationPath, DigestPreview, DocRenderRow, DocSignatureRow, DocTemplateRow, DocToken, DocUnresolvedToken, type DoorKey, EnrichCell, EnrichDeclared, EnrichDueRow, EnrichRun, EnrichmentSummary, EntityFieldRights, EntityRecordRead, EntityRecordsFound, EntityTableFacts, ExampleBuilt, type ExportRow, ExternalPrincipalCard, Field, FieldHistoryEntry, FieldPatch, FieldProposal, FormSummary, FormulaParse, GridLayout, ImportBatchResult, ImportColumnsDeclared, ImportFinished, ImportOpened, ImportPlan, ImportPolicy, ImportReport, ImportRun, InboundAddress, InboundDeclared, IoExportPage, MAPPED_SQLSTATES, type MirrorLimits, MyLevel, MySubscription, NewEntityFieldDeclaration, NewFieldDeclaration, type ParsedImport, PgError, Pipeline, PipelineColumn, PipelineDeclared, PipelineGate, PipelineGatePreview, PipelineMoveResult, PipelineSpec, PipelineVerdict, PortalArchiveAnswer, PortalArchiveFilter, PortalCard, PortalInvitation, PortalPreviewRow, PortalRevocation, PortalSummary, PortalTableRef, PredictedRefusal, type PromotedPredicate, PublishBinding, type QueryPlan, ReadRow, ReadValue, RecordDocument, RecordEvent, RecordFilter, RecordGraphWritten, RecordHistoryEntry, type RecordQuery, RecordRead, RecordRevision, RecordScopeContext, type RecordsClient, RecordsConfig, RecordsDataSource, RecordsError, RecordsErrorCode, RecordsResult, RelationCoordinate, RelationWordsManyArgs, ResolvedPublishBinding, RestorePreview, RestoreResult, RowAction, SavedViewRow, SavedViewSpecIn, StagePending, StagePendingOnBoard, StageRuleEnforcement, StageRuleOnFail, StaleWriteDetail, StoredRecord, StuckRow, Subscription, SubscriptionSpec, type SupabaseLike, Table, TableArchiveProgress, TableCapacity, TableDecorations, type TableFact, TableProposal, TableWebhook, TableWebhookDeclared, Timestamp, Uuid, WorkApprovalDecision, WorkApprovalFiled, WorkApprover, WorkAssignment, WorkAssignmentField, WorkChange, WorkGraph, WorkInboxItem, WorkInstantiation, WorkListFlavour, WorkListItem, WorkRecordState, WorkSlotHold, WorkState, WorkTurn, WriteConflict, announceRecordChanged, asWriteConflict, cellText, createRecordsClient, doorAbsent, doorCensus, doorExists, exportCsv, exportXlsx, importCsv, importXlsx, intersectIds, isAPersonsRefusal, mapPgError, onRecordChanged, parseCsv, planQuery, predictEnvelopeRefusal, predictSizeRefusal, predictValueRefusals, predictWriteRefusals, staleWriteDetail, supabaseDataSource, toAoa, withTableFacts };
2290
+ export { A_PERSONS_REFUSAL, ActionRunResult, AggregateBucket, AggregateCompare, AggregateMeasure, AggregateRow, AnonTokenBinding, ArchiveLane, ArchivedRow, type AsOf, BookingAvailability, BookingDeclared, BookingSummary, CaptureFileRef, CaptureOutcome, CaptureSheetFace, CaptureSheetSummary, ChecklistDeclared, ChecklistRunStarted, ChecklistRunStep, ChecklistRunSummary, ChecklistSpec, ChecklistStepCompleted, ChecklistTemplateShape, ChecklistTemplateSummary, CommentThreadRead, CommentWritten, ConversationScope, ConversationScopeContext, DEFAULT_DOCUMENT_MAX_BYTES, DEFAULT_FIELDS, DEFAULT_PAGE_SIZE, DEFAULT_VALUE_MAX_BYTES, DOORS, DashboardBlock, DashboardRunResult, DashboardSummary, type DeclareResult, DecorationPath, DigestPreview, DocRenderRow, DocSignatureRow, DocTemplateRow, DocToken, DocUnresolvedToken, type DoorKey, EnrichCell, EnrichDeclared, EnrichDueRow, EnrichRun, EnrichmentSummary, EntityFieldRights, EntityRecordRead, EntityRecordsFound, EntityTableFacts, ExampleBuilt, type ExportRow, ExternalPrincipalCard, Field, FieldHistoryEntry, FieldPatch, FieldProposal, FieldTypeWord, FormSummary, FormulaParse, GridLayout, ImportBatchResult, ImportColumnsDeclared, ImportFinished, ImportOpened, ImportPlan, ImportPolicy, ImportReport, ImportRun, InboundAddress, InboundDeclared, IoExportPage, MAPPED_SQLSTATES, type MirrorLimits, MyLevel, MySubscription, NewEntityFieldDeclaration, NewFieldDeclaration, type NewFieldSpec, type NewTableSpec, OutsideShareAnswer, type ParsedImport, PgError, Pipeline, PipelineColumn, PipelineDeclared, PipelineGate, PipelineGatePreview, PipelineMoveMany, PipelineMoveManyItem, PipelineMoveResult, PipelineSpec, PipelineVerdict, PortalArchiveAnswer, PortalArchiveFilter, PortalCard, PortalConfigInput, PortalFormAnswer, PortalFormSpec, PortalInvitation, PortalPreviewRow, PortalRevocation, PortalSummary, PortalTableRef, PredictedRefusal, type PromotedPredicate, PublishBinding, type QueryPlan, ReadRow, ReadValue, RecordDocument, RecordEvent, RecordFilter, RecordGraphWritten, RecordHeader, RecordHistoryEntry, type RecordQuery, RecordRead, RecordRevision, RecordScopeContext, type RecordsClient, RecordsConfig, RecordsDataSource, RecordsError, RecordsErrorCode, RecordsResult, RelationCoordinate, RelationWordsManyArgs, ResolvedPublishBinding, RestorePreview, RestoreResult, RowAction, SavedViewRow, SavedViewSpecIn, StagePending, StagePendingOnBoard, StageRuleEnforcement, StageRuleOnFail, StaleWriteDetail, StoreFilter, StoredRecord, StuckRow, Subscription, SubscriptionSpec, type SupabaseLike, Table, TableArchiveProgress, TableCapacity, TableDecorations, type TableFact, TableListEntry, TableProposal, TableRowCount, TableSyncResult, TableSyncSpec, TableWebhook, TableWebhookDeclared, Timestamp, Uuid, ViewOrderSet, WorkApprovalDecision, WorkApprovalFiled, WorkApprover, WorkAssignment, WorkAssignmentField, WorkChange, WorkDecideMany, WorkDecideManyItem, WorkGraph, WorkInboxItem, WorkInstantiation, WorkListFlavour, WorkListItem, WorkRecordState, WorkSlotHold, WorkState, WorkTurn, WriteConflict, addFields, announceRecordChanged, asWriteConflict, cellText, createRecordsClient, declareTable, doorAbsent, doorCensus, doorExists, exportCsv, exportXlsx, fieldDeclarationFor, importCsv, importXlsx, intersectIds, isAPersonsRefusal, mapPgError, onRecordChanged, parseCsv, planQuery, predictEnvelopeRefusal, predictSizeRefusal, predictValueRefusals, predictWriteRefusals, staleWriteDetail, supabaseDataSource, toAoa, tokenFor, withTableFacts };