@ai-matrx/records 0.49.0 → 0.52.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.
@@ -24,8 +24,14 @@ var react_exports = {};
24
24
  __export(react_exports, {
25
25
  ABSENCE_REASONS: () => ABSENCE_REASONS,
26
26
  ACTOR_VOCABULARY: () => ACTOR_VOCABULARY,
27
+ ARCHIVE_LANES: () => ARCHIVE_LANES,
28
+ ARCHIVE_LANE_LABEL: () => ARCHIVE_LANE_LABEL,
29
+ ARCHIVE_LANE_MEANS: () => ARCHIVE_LANE_MEANS,
27
30
  COMPUTE_ON: () => COMPUTE_ON,
28
31
  CONTEXT_POLICIES: () => CONTEXT_POLICIES,
32
+ DECLARABLE_FIELD_KINDS: () => DECLARABLE_FIELD_KINDS,
33
+ DEFAULT_ARCHIVE_LANE: () => DEFAULT_ARCHIVE_LANE,
34
+ DEFAULT_PORTAL_ARCHIVE_FILTER: () => DEFAULT_PORTAL_ARCHIVE_FILTER,
29
35
  DELIVERIES: () => DELIVERIES,
30
36
  ENTITY_TOKENS: () => ENTITY_TOKENS,
31
37
  FIELD_KINDS: () => FIELD_KINDS,
@@ -42,6 +48,7 @@ __export(react_exports, {
42
48
  PERMISSION_LEVELS: () => PERMISSION_LEVELS,
43
49
  PER_VALUE_ACCESS_WORDS: () => PER_VALUE_ACCESS_WORDS,
44
50
  PIPELINE_RULE_KINDS: () => PIPELINE_RULE_KINDS,
51
+ PORTAL_ARCHIVE_FILTERS: () => PORTAL_ARCHIVE_FILTERS,
45
52
  REFUSALS_WORTH_REPEATING: () => REFUSALS_WORTH_REPEATING,
46
53
  RELATION_BINDINGS: () => RELATION_BINDINGS,
47
54
  RELATION_CARDINALITIES: () => RELATION_CARDINALITIES,
@@ -61,6 +68,8 @@ __export(react_exports, {
61
68
  TABLE_TYPES: () => TABLE_TYPES,
62
69
  VALUE_ALTERNATE_KEYS: () => VALUE_ALTERNATE_KEYS,
63
70
  VALUE_ENVELOPE_KEYS: () => VALUE_ENVELOPE_KEYS,
71
+ archivedByLine: () => archivedByLine,
72
+ archivedWhen: () => archivedWhen,
64
73
  asPermissionLevel: () => asPermissionLevel,
65
74
  atLeast: () => atLeast,
66
75
  bookingPath: () => bookingPath,
@@ -70,14 +79,18 @@ __export(react_exports, {
70
79
  coerceTypedAnswer: () => coerceTypedAnswer,
71
80
  coerceTypedAnswers: () => coerceTypedAnswers,
72
81
  coercionLabel: () => coercionLabel,
82
+ emptyArchiveLine: () => emptyArchiveLine,
83
+ emptyPortalArchiveLine: () => emptyPortalArchiveLine,
73
84
  err: () => err,
74
85
  fieldKindFor: () => fieldKindFor,
75
86
  forgetAllOps: () => forgetAllOps,
76
87
  highestLevel: () => highestLevel,
77
88
  holdsARetiredChoice: () => holdsARetiredChoice,
78
89
  indexedDbStore: () => indexedDbStore,
90
+ isArchiveLane: () => isArchiveLane,
79
91
  isDecided: () => isDecided,
80
92
  isOwnOp: () => isOwnOp,
93
+ isPortalArchiveFilter: () => isPortalArchiveFilter,
81
94
  isRecordsErr: () => isRecordsErr,
82
95
  isTheChosen: () => isTheChosen,
83
96
  looksLikeAnId: () => looksLikeAnId,
@@ -90,9 +103,13 @@ __export(react_exports, {
90
103
  openCaptureQueue: () => openCaptureQueue,
91
104
  optionKey: () => optionKey,
92
105
  optionLabel: () => optionLabel,
106
+ portalArchiveConsequence: () => portalArchiveConsequence,
107
+ portalConfirmLine: () => portalConfirmLine,
93
108
  portalPath: () => portalPath,
109
+ portalTitleTypedBack: () => portalTitleTypedBack,
94
110
  publicFormPath: () => publicFormPath,
95
111
  rememberedOpCount: () => rememberedOpCount,
112
+ sameDocument: () => sameDocument,
96
113
  scopeChip: () => scopeChip,
97
114
  stableFilterKey: () => stableFilterKey,
98
115
  tableShapeChanged: () => tableShapeChanged,
@@ -120,6 +137,46 @@ module.exports = __toCommonJS(react_exports);
120
137
  // src/react/context.tsx
121
138
  var import_react = require("react");
122
139
 
140
+ // src/archive.ts
141
+ var ARCHIVE_LANES = ["mine", "org"];
142
+ var DEFAULT_ARCHIVE_LANE = "org";
143
+ var ARCHIVE_LANE_LABEL = {
144
+ mine: "Archived by me",
145
+ org: "Archived by anyone"
146
+ };
147
+ var ARCHIVE_LANE_MEANS = {
148
+ mine: "The records you archived yourself.",
149
+ org: "Everything anybody in this organization archived, including you."
150
+ };
151
+ function isArchiveLane(word) {
152
+ return typeof word === "string" && ARCHIVE_LANES.includes(word);
153
+ }
154
+ function archivedWhen(at, locale = "en-GB") {
155
+ const when = new Date(at);
156
+ if (Number.isNaN(when.getTime())) return "a moment nobody recorded";
157
+ return new Intl.DateTimeFormat(locale, {
158
+ day: "numeric",
159
+ month: "long",
160
+ year: "numeric",
161
+ hour: "2-digit",
162
+ minute: "2-digit"
163
+ }).format(when);
164
+ }
165
+ function archivedByLine(row, locale = "en-GB") {
166
+ const when = archivedWhen(row.archivedAt, locale);
167
+ const who = (row.archivedByName ?? "").trim();
168
+ if (who === "") {
169
+ return `Archived on ${when}. The store does not know who archived it \u2014 whoever did is no longer in this organization, or it happened before this table kept that.`;
170
+ }
171
+ return `Archived by ${who} on ${when}.`;
172
+ }
173
+ function emptyArchiveLine(lane) {
174
+ return lane === "mine" ? "You have not archived anything in this table. Switch to \u201CArchived by anyone\u201D to see what the rest of the organization has." : "Nothing in this table has been archived. Records you remove from the grid arrive here, and nothing is ever destroyed.";
175
+ }
176
+ function sameDocument(a, b) {
177
+ return JSON.stringify(a) === JSON.stringify(b);
178
+ }
179
+
123
180
  // src/ops.ts
124
181
  var REMEMBER_MS = 3e4;
125
182
  var REMEMBER_MAX = 500;
@@ -218,6 +275,27 @@ var PARITY_FIELD_TYPES = [
218
275
  { parity_type: "select", behavior: "list", made_of: "one choice from a Table shown as a list (FLD-5/FLD-6)" },
219
276
  { parity_type: "url", behavior: "text", made_of: "text whose format is url, with the pattern Rule that makes the format enforceable" }
220
277
  ];
278
+ var DECLARABLE_FIELD_KINDS = [
279
+ { kind: "attachment", behavior: "relation", parity: true, made_of: "REC-31: a File record reached through a relation, target the kernel `File` Table" },
280
+ { kind: "checkbox", behavior: "boolean", parity: true, made_of: "a ticked or unticked answer, stored as a REAL boolean \u2014 and a record that never answered holds neither, so filters and group-by see three states, not two" },
281
+ { kind: "currency", behavior: "range", parity: true, made_of: "FLD-N-1: a number whose UNIT is the currency and whose format is currency \u2014 on the Field, never in presentation" },
282
+ { kind: "datetime", behavior: "range", parity: true, made_of: "a range of kind date or datetime \u2014 the dated modifier says the VALUES are dated, which is a different question" },
283
+ { kind: "email", behavior: "text", parity: true, made_of: "text whose format is email" },
284
+ { kind: "formula", behavior: "formula", parity: true, made_of: "FLD-9: a declared computation, on read or on write, evaluated by custom.rule_eval" },
285
+ { kind: "long_text", behavior: "text", parity: false, made_of: "behaviour text with format long and config.multiline, for several lines rather than one" },
286
+ { kind: "lookup", behavior: "formula", parity: true, made_of: "a Value read THROUGH a relation \u2014 config.via names the relation field, config.pick the Value on the far side" },
287
+ { kind: "member", behavior: "relation", parity: true, made_of: "a person: a relation whose target is the kernel `Person` Table" },
288
+ { kind: "multi_select", behavior: "list", parity: true, made_of: "many choices from the same Table \u2014 the multi modifier, never a second behaviour" },
289
+ { kind: "number", behavior: "range", parity: false, made_of: "a plain number: behaviour range with no date kind and neither the currency nor the percent format" },
290
+ { kind: "percent", behavior: "range", parity: true, made_of: "a number whose unit is % and whose format is percent" },
291
+ { kind: "phone", behavior: "text", parity: true, made_of: "text whose format is phone" },
292
+ { kind: "relation", behavior: "relation", parity: false, made_of: "REL / FLD-11: a relation a person aims themselves \u2014 relation_target names a Table of this organization, and it is a BEHAVIOUR, never a parity type of its own" },
293
+ { kind: "rollup", behavior: "formula", parity: true, made_of: "an aggregate ALONG a relation \u2014 config.via, config.of, config.agg; far-side ids are taken DISTINCT, so nothing is counted twice" },
294
+ { kind: "select", behavior: "list", parity: true, made_of: "one choice from a Table shown as a list (FLD-5/FLD-6)" },
295
+ { kind: "signature", behavior: "text", parity: false, made_of: "VAL-10: behaviour text whose format is signature \u2014 the one shape custom.doc_sign accepts, sealed by custom.doc_signature_write and checked by custom.doc_signature_intact" },
296
+ { kind: "text", behavior: "text", parity: false, made_of: "plain text: behaviour text with no format \u2014 it carries no parity type, which is exactly what custom.parity_type answers for it" },
297
+ { kind: "url", behavior: "text", parity: true, made_of: "text whose format is url, with the pattern Rule that makes the format enforceable" }
298
+ ];
221
299
  var RULE_NODE_KINDS = [
222
300
  { node: "actor_at_least", evaluated_by: "PIPELINES" },
223
301
  { node: "add", evaluated_by: "W1-RULE" },
@@ -453,6 +531,7 @@ var STORE_DOORS = [
453
531
  { name: "field_dependants", args: "p_organization_id uuid, p_field_id uuid", returns: "TABLE(kind text, dependant_id uuid, label text, how text)", security: "definer" },
454
532
  { name: "field_history", args: "p_organization_id uuid, p_table_id uuid, p_field_key text, p_limit integer DEFAULT 100, p_offset integer DEFAULT 0, p_record_id uuid DEFAULT NULL::uuid", returns: "TABLE(record_id uuid, record_title text, version integer, occurred_at timestamp with time zone, operation_label text, actor jsonb, before jsonb, after jsonb)", security: "definer" },
455
533
  { name: "field_kernel_id", args: "", returns: "uuid", security: "invoker" },
534
+ { name: "field_kinds", args: "", returns: "TABLE(kind text, behavior text, parity boolean, made_of text)", security: "invoker" },
456
535
  { name: "field_options", args: "p_organization_id uuid, p_field_id uuid", returns: "SETOF custom.record", security: "definer" },
457
536
  { name: "field_retire", args: "p_organization_id uuid, p_field_id uuid", returns: "boolean", security: "definer" },
458
537
  { name: "field_rules", args: "p_field_data jsonb", returns: "TABLE(kind text, spec jsonb)", security: "invoker" },
@@ -501,6 +580,7 @@ var STORE_DOORS = [
501
580
  { name: "io_export", args: "p_organization_id uuid, p_table_id uuid, p_columns text[] DEFAULT NULL::text[], p_limit integer DEFAULT 10000, p_required text DEFAULT 'viewer'::text", returns: "jsonb", security: "definer" },
502
581
  { name: "io_export_csv", args: "p_organization_id uuid, p_table_id uuid, p_columns text[] DEFAULT NULL::text[], p_limit integer DEFAULT 10000, p_delimiter text DEFAULT chr(44), p_required text DEFAULT 'viewer'::text", returns: "text", security: "definer" },
503
582
  { name: "io_import_begin", args: "p_organization_id uuid, p_table_id uuid, p_format text DEFAULT 'csv'::text, p_source_name text DEFAULT NULL::text, p_source_columns jsonb DEFAULT '[]'::jsonb, p_file_hash text DEFAULT NULL::text, p_policy jsonb DEFAULT '{}'::jsonb, p_dedupe_key text DEFAULT NULL::text, p_file_bytes bigint DEFAULT NULL::bigint, p_force boolean DEFAULT false", returns: "jsonb", security: "definer" },
583
+ { name: "io_import_declare_columns", args: "p_organization_id uuid, p_table_id uuid, p_rows jsonb, p_mapping jsonb DEFAULT '{}'::jsonb", returns: "jsonb", security: "definer" },
504
584
  { name: "io_import_finish", args: "p_organization_id uuid, p_import_id uuid, p_unmapped text DEFAULT NULL::text", returns: "jsonb", security: "definer" },
505
585
  { name: "io_import_forget", args: "p_organization_id uuid, p_import_id uuid", returns: "boolean", security: "definer" },
506
586
  { name: "io_import_open", args: "p_organization_id uuid, p_table_id uuid, p_format text DEFAULT 'csv'::text, p_source_name text DEFAULT NULL::text, p_source_columns jsonb DEFAULT '[]'::jsonb", returns: "uuid", security: "definer" },
@@ -534,6 +614,7 @@ var STORE_DOORS = [
534
614
  { name: "levels_raised_by_a_less_specific_rung", args: "", returns: "TABLE(organization_id uuid, organization_name text, member_id uuid, member_email text, record_id uuid, addressed_level permission_level, answered_level permission_level)", security: "definer" },
535
615
  { name: "list_door_disagreements", args: "p_pretend text DEFAULT NULL::text, p_only_organization uuid DEFAULT NULL::uuid, p_sample integer DEFAULT 200", returns: "TABLE(organization_id uuid, organization_name text, member_id uuid, table_id uuid, record_id uuid, door text, why text)", security: "invoker" },
536
616
  { name: "list_door_disagreements", args: "p_pretend text, p_only_organization uuid, p_sample integer, p_exhaustive boolean", returns: "TABLE(organization_id uuid, organization_name text, member_id uuid, table_id uuid, record_id uuid, door text, why text)", security: "invoker" },
617
+ { name: "list_portals", args: "p_organization_id uuid, p_archived text DEFAULT 'active'::text", returns: "TABLE(portal_id uuid, title text, slug text, client_table_id uuid, client_table text, is_active boolean, tables integer, invited integer, signed_in integer, sign_in_method text, opened_at timestamp with time zone)", security: "definer" },
537
618
  { name: "lookup_value", args: "p_organization_id uuid, p_record_id uuid, p_field_data jsonb", returns: "jsonb", security: "invoker" },
538
619
  { name: "mask_document", args: "p_document jsonb, p_visible_keys text[], p_notices jsonb, p_by_id boolean DEFAULT false, p_key_ids jsonb DEFAULT '{}'::jsonb", returns: "jsonb", security: "invoker" },
539
620
  { name: "mask_document", args: "p_document jsonb, p_visible_keys text[], p_notices jsonb, p_by_id boolean DEFAULT false, p_key_ids jsonb DEFAULT '{}'::jsonb, p_declared_keys text[] DEFAULT NULL::text[]", returns: "jsonb", security: "invoker" },
@@ -583,16 +664,19 @@ var STORE_DOORS = [
583
664
  { name: "pipeline_read", args: "p_organization_id uuid, p_table_id uuid", returns: "jsonb", security: "definer" },
584
665
  { name: "pipeline_transition_refusal", args: "p_organization_id uuid, p_record_id uuid, p_to text", returns: "jsonb", security: "definer" },
585
666
  { name: "portal_admits", args: "p_organization_id uuid, p_user_id uuid DEFAULT NULL::uuid", returns: "boolean", security: "definer" },
667
+ { name: "portal_archive", args: "p_organization_id uuid, p_portal_id uuid, p_confirm_title text, p_reason text DEFAULT NULL::text", returns: "jsonb", security: "definer" },
586
668
  { name: "portal_card", args: "p_organization_id uuid, p_portal_id uuid", returns: "jsonb", security: "definer" },
587
669
  { name: "portal_declare", args: "p_organization_id uuid, p_title text, p_client_table_id uuid, p_tables jsonb, p_portal_id uuid DEFAULT NULL::uuid, p_slug text DEFAULT NULL::text, p_sign_in_method text DEFAULT 'magic_link'::text", returns: "uuid", security: "definer" },
588
670
  { name: "portal_field_map", args: "p_organization_id uuid, p_table_id uuid", returns: "TABLE(field_id uuid, field_key text, field_type text, points_at uuid)", security: "definer" },
589
671
  { name: "portal_invitation", args: "p_slug text, p_email text", returns: "jsonb", security: "definer" },
590
672
  { name: "portal_invite", args: "p_organization_id uuid, p_portal_id uuid, p_client_record_id uuid, p_email text, p_user_id uuid DEFAULT NULL::uuid", returns: "jsonb", security: "definer" },
673
+ { name: "portal_invite_accept", args: "p_token text", returns: "jsonb", security: "definer" },
591
674
  { name: "portal_me", args: "", returns: "jsonb", security: "definer" },
592
675
  { name: "portal_preview", args: "p_organization_id uuid, p_portal_id uuid, p_principal_id uuid, p_table_id uuid", returns: "TABLE(record_id uuid, title text)", security: "definer" },
593
676
  { name: "portal_principal_bind", args: "p_organization_id uuid, p_principal_id uuid, p_user_id uuid", returns: "jsonb", security: "definer" },
594
677
  { name: "portal_public", args: "p_slug text", returns: "jsonb", security: "definer" },
595
678
  { name: "portal_record_title", args: "p_organization_id uuid, p_record_id uuid", returns: "text", security: "definer" },
679
+ { name: "portal_restore", args: "p_organization_id uuid, p_portal_id uuid, p_confirm_title text", returns: "jsonb", security: "definer" },
596
680
  { name: "portal_revoke", args: "p_organization_id uuid, p_portal_id uuid, p_principal_id uuid", returns: "jsonb", security: "definer" },
597
681
  { name: "portal_slug", args: "p_organization_id uuid, p_title text, p_portal_id uuid DEFAULT NULL::uuid", returns: "text", security: "definer" },
598
682
  { name: "portal_tables", args: "p_organization_id uuid", returns: "TABLE(portal_id uuid, table_id uuid, name text)", security: "definer" },
@@ -640,15 +724,18 @@ var STORE_DOORS = [
640
724
  { name: "read_paths_outside_the_door", args: "", returns: "TABLE(object_name text, why text)", security: "invoker" },
641
725
  { name: "read_record", args: "p_organization_id uuid, p_record_id uuid, p_by_id boolean DEFAULT false", returns: "jsonb", security: "definer" },
642
726
  { name: "read_records", args: "p_organization_id uuid, p_table_id uuid, p_by_id boolean DEFAULT false, p_limit integer DEFAULT 200, p_offset integer DEFAULT 0", returns: "TABLE(id uuid, document jsonb, level permission_level)", security: "definer" },
727
+ { name: "read_records_archived", args: "p_organization_id uuid, p_table_id uuid, p_lane text DEFAULT 'org'::text, p_by_id boolean DEFAULT false, p_limit integer DEFAULT 200, p_offset integer DEFAULT 0", returns: "TABLE(id uuid, document jsonb, level permission_level, archived_at timestamp with time zone, archived_by uuid, archived_by_name text)", security: "definer" },
643
728
  { name: "read_records_by_ids", args: "p_organization_id uuid, p_table_id uuid, p_record_ids uuid[], p_by_id boolean DEFAULT false", returns: "TABLE(id uuid, document jsonb, level permission_level)", security: "definer" },
644
729
  { name: "read_records_matching", args: "p_organization_id uuid, p_table_id uuid, p_filter jsonb DEFAULT '{}'::jsonb, p_by_id boolean DEFAULT false, p_limit integer DEFAULT 200, p_offset integer DEFAULT 0", returns: "TABLE(id uuid, document jsonb, level permission_level)", security: "definer" },
645
730
  { name: "realtime_topic_admits", args: "p_topic text", returns: "boolean", security: "definer" },
646
731
  { name: "record_aggregate", args: "p_organization_id uuid, p_table_id uuid, p_group_by jsonb DEFAULT '[]'::jsonb, p_measures jsonb DEFAULT '[]'::jsonb, p_bucket jsonb DEFAULT NULL::jsonb, p_filter jsonb DEFAULT '{}'::jsonb, p_limit integer DEFAULT 200, p_required text DEFAULT 'viewer'::text", returns: "TABLE(groups jsonb, measures jsonb, row_count bigint)", security: "definer" },
647
732
  { name: "record_applicability", args: "p_organization_id uuid, p_record_id uuid", returns: "TABLE(rule_id uuid, rule_name text, rule_version integer, applies boolean, answer jsonb)", security: "invoker" },
733
+ { name: "record_archiver", args: "p_organization_id uuid, p_record_id uuid", returns: "uuid", security: "definer" },
648
734
  { name: "record_as_of", args: "p_organization_id uuid, p_record_id uuid, p_at timestamp with time zone", returns: "TABLE(state jsonb, replayed boolean)", security: "definer" },
649
735
  { name: "record_card", args: "p_viewer uuid, p_organization_id uuid, p_record_id uuid", returns: "jsonb", security: "definer" },
650
736
  { name: "record_carrying_edges", args: "p_id uuid, p_data_class text, p_data jsonb, p_deleted_at timestamp with time zone", returns: "TABLE(container_id uuid, item_id uuid, edge_role text)", security: "invoker" },
651
737
  { name: "record_delete", args: "p_organization_id uuid, p_record_id uuid", returns: "timestamp with time zone", security: "definer" },
738
+ { name: "record_filter_sql", args: "p_filter jsonb", returns: "text", security: "invoker" },
652
739
  { name: "record_history", args: "p_organization_id uuid, p_record_id uuid, p_limit integer DEFAULT 200, p_offset integer DEFAULT 0", returns: "TABLE(version integer, occurred_at timestamp with time zone, operation text, operation_label text, actor jsonb, changes jsonb, migration_id uuid, undoable boolean)", security: "definer" },
653
740
  { name: "record_platform_keys", args: "", returns: "text[]", security: "invoker" },
654
741
  { name: "record_relation_edges", args: "p_organization_id uuid, p_id uuid, p_table_id uuid, p_data_class text, p_data jsonb, p_deleted_at timestamp with time zone", returns: "TABLE(target_id uuid, edge_role text, field_id uuid, ord integer)", security: "invoker" },
@@ -737,6 +824,7 @@ var STORE_DOORS = [
737
824
  { name: "subscription_mute", args: "p_organization_id uuid, p_rule_id uuid, p_muted boolean DEFAULT true", returns: "boolean", security: "definer" },
738
825
  { name: "subscription_preview", args: "p_organization_id uuid, p_rule_id uuid", returns: "jsonb", security: "definer" },
739
826
  { name: "subscriptions", args: "p_organization_id uuid, p_table_id uuid DEFAULT NULL::uuid", returns: "TABLE(rule_id uuid, name text, table_id uuid, saved_view_id uuid, cadence text, schedule text, quiet_hours jsonb, channel text, recipient_user_id uuid, event_key text, muted boolean, mine boolean, i_may_mute boolean, last_sent_at timestamp with time zone, next_digest_at timestamp with time zone)", security: "definer" },
827
+ { name: "table_archive", args: "p_organization_id uuid, p_table_id uuid, p_chunk integer DEFAULT 50, p_include_table boolean DEFAULT true", returns: "jsonb", security: "definer" },
740
828
  { name: "table_capacity", args: "p_organization_id uuid, p_table_id uuid", returns: "jsonb", security: "definer" },
741
829
  { name: "table_carries_its_rows", args: "p_user_id uuid, p_table_id uuid, p_required permission_level DEFAULT 'viewer'::permission_level", returns: "boolean", security: "definer" },
742
830
  { name: "table_column_source", args: "p_organization_id uuid, p_table_id uuid", returns: "text", security: "invoker" },
@@ -869,18 +957,18 @@ var STORE_KNOBS = [
869
957
  { key: "world_publish_enabled", value: "false", type: "boolean" }
870
958
  ];
871
959
  var STORE_REFUSAL_CODES = [
872
- { code: "02000", raised_by: "_checklist_instantiate,_table_share_invite_payload,checklist_declare,checklist_run,checklist_step_complete,checklist_step_refusal,checklist_template_shape,conversation_scope_bind,dashboard_delete,dashboard_run,doc_letterhead,doc_render_body,doc_render_document,doc_render_read,doc_sign,doc_signature_intact,doc_signature_read,doc_template_delete,doc_template_read,doc_template_save,enrich_pin,entity_field_retire,entity_field_update,entity_record_read,entity_value_write,external_history_event,external_rows,external_stub_upsert,external_writes_set,io_restore,migrate_delete,migrate_extract_parent,migrate_merge,migrate_reclass,migrate_rename,migrate_reparent,migrate_retype,migrate_split,migrate_undo,organization_clear,portal_card,portal_declare,portal_invite,portal_preview,portal_principal_bind,portal_revoke,read_record,record_delete,record_restore,record_restore_preview,record_table,record_update,relation_uncarry,share_access,share_grant,share_lane_set,share_people,share_revoke,sign_request_cancel,sign_request_create,sign_request_remind,sign_request_unchanged,table_share_outside_accept,table_share_outside_invite,table_share_outside_resend,table_share_outside_revoke,visibility_as_of,work_approval_decide,work_approval_read,work_approval_request,work_assign,work_record_states,work_set_state" },
960
+ { code: "02000", raised_by: "_checklist_instantiate,_portal_invite_payload,_share_write_person,_table_share_invite_payload,checklist_declare,checklist_run,checklist_step_complete,checklist_step_refusal,checklist_template_shape,conversation_scope_bind,dashboard_delete,dashboard_run,doc_letterhead,doc_render_body,doc_render_document,doc_render_read,doc_sign,doc_signature_intact,doc_signature_read,doc_template_delete,doc_template_read,doc_template_save,enrich_pin,entity_field_retire,entity_field_update,entity_record_read,entity_value_write,external_history_event,external_rows,external_stub_upsert,external_writes_set,io_restore,migrate_delete,migrate_extract_parent,migrate_merge,migrate_reclass,migrate_rename,migrate_reparent,migrate_retype,migrate_split,migrate_undo,organization_clear,portal_archive,portal_card,portal_declare,portal_invite,portal_invite_accept,portal_preview,portal_principal_bind,portal_restore,portal_revoke,read_record,record_delete,record_restore,record_restore_preview,record_table,record_update,relation_uncarry,share_access,share_grant,share_lane_set,share_people,share_revoke,sign_request_cancel,sign_request_create,sign_request_remind,sign_request_unchanged,table_archive,table_share_outside_accept,table_share_outside_invite,table_share_outside_resend,table_share_outside_revoke,visibility_as_of,work_approval_decide,work_approval_read,work_approval_request,work_assign,work_record_states,work_set_state" },
873
961
  { code: "0A000", raised_by: "checklist_step_complete,external_rows,external_source_declare,external_write_through,promote_field,promoted_index_expr,promoted_query_sql,promoted_read,rule_eval,work_assign" },
874
962
  { code: "22003", raised_by: "context_resolve" },
875
- { code: "22004", raised_by: "_entity_custom_fields_guard,_value_envelope,actor_word,agg_assert_key,agg_sql,anon_capture,anon_token_issue,anon_write,assert_client_may_reach,booking_declare,capture_submit,checklist_declare,context_resolve,dashboard_block_normalize,dashboard_declare,dashboard_window_sql,doc_render_write,doc_sign,doc_signature_write,doc_template_save,enrich_land,enrich_normalize,external_history_event,external_rows,external_source_declare,external_stub_upsert,external_write_through,external_writes_set,field_history,form_declare,form_submit,home_add,io_comment_write,io_import_begin,io_infer_column,io_outbox_drain,io_restore,migrate_choice_keys,migrate_purge,migrate_reclass,migrate_split,migrate_undo,organization_clear,organization_contents,pipeline_declare,pipeline_gate_preview,portal_declare,portal_invite,portal_principal_bind,provenance_retention_days,provenance_write,query_across_homes,query_by_coordinates,query_rollup,record_delete,record_reparent,record_resolve,record_restore,record_update,record_write,record_write_many,relation_carry,relation_own,rule_declare,share_grant,sign_request_create,sign_request_sign,subscription_declare,table_declare,table_share_outside_invite,value_restore,view_declare,work_approval_decide,work_approval_request,work_template_declare" },
963
+ { code: "22004", raised_by: "_entity_custom_fields_guard,_share_write_person,_value_envelope,actor_word,agg_assert_key,agg_sql,anon_capture,anon_token_issue,anon_write,assert_client_may_reach,booking_declare,capture_submit,checklist_declare,context_resolve,dashboard_block_normalize,dashboard_declare,dashboard_window_sql,doc_render_write,doc_sign,doc_signature_write,doc_template_save,enrich_land,enrich_normalize,external_history_event,external_rows,external_source_declare,external_stub_upsert,external_write_through,external_writes_set,field_history,form_declare,form_submit,home_add,io_comment_write,io_import_begin,io_infer_column,io_outbox_drain,io_restore,migrate_choice_keys,migrate_purge,migrate_reclass,migrate_split,migrate_undo,organization_clear,organization_contents,pipeline_declare,pipeline_gate_preview,portal_declare,portal_invite,portal_principal_bind,provenance_retention_days,provenance_write,query_across_homes,query_by_coordinates,query_rollup,record_delete,record_reparent,record_resolve,record_restore,record_update,record_write,record_write_many,relation_carry,relation_own,rule_declare,share_grant,sign_request_create,sign_request_sign,subscription_declare,table_archive,table_declare,table_share_outside_invite,value_restore,view_declare,work_approval_decide,work_approval_request,work_template_declare" },
876
964
  { code: "22007", raised_by: "dashboard_window_sql" },
877
965
  { code: "22012", raised_by: "rule_eval" },
878
- { code: "22023", raised_by: "_booking_availability,_entity_custom_fields_guard,_take_op_id,_value_envelope,_work_shape_guard,actor_word,agg_assert_key,agg_sql,anon_token_issue,booking_declare,containment_parent,dashboard_block_normalize,dashboard_window_sql,doc_render_body,doc_render_write,doc_signature_write,enrich_declare,enrich_land,enrich_normalize,enrich_pin,entity_value_write,external_history_event,external_source_declare,external_stub_upsert,external_write_through,field_history,field_update,io_export,io_import_begin,io_import_finish,io_import_plan,io_import_report,io_proposal_accept,migrate_merge,migrate_reclass,my_levels,organization_clear,page_size,pin_agent_cells,pipeline_move,portal_declare,provenance_write,query_by_coordinates,query_rollup,record_update,record_write_many,relation_carry,rule_eval,rule_members,share_grant,share_lane_set,sign_request_create,sign_request_sign,subscription_declare,table_rules,visibility_as_of,work_approval_request,work_list,work_slot_hold" },
879
- { code: "23503", raised_by: "_booking_availability,_checklist_instantiate,_containment_guard,_display_spec_for,_field_document_for,_pipeline_stage_key,_record_rule_uses,agg_digest_assemble,anon_publish,anon_rate_take,anon_token_issue,anon_write,assert_organization_wall,booking_cancel,booking_confirm,booking_declare,booking_hold,booking_reschedule,capture_publish,checklist_declare,checklist_steps_table,comment_write,dashboard_declare,delete_rule,doc_sign,doc_template_save,enrich_declare,enrich_due,enrich_land,form_declare,form_submit,home_add,inbound_declare,inbound_mail_land,inbound_set,io_comment_write,io_import_begin,io_import_finish,io_import_report,io_import_rows,io_proposal_accept,migrate_demote,migrate_promote,pipeline_board,pipeline_declare,pipeline_move,pipeline_read,pipeline_transition_refusal,promote_field,promote_table,record_applicability,record_reparent,relation_carry,relation_own,resolve_first_match,rule_applies,rule_declare,rule_eval,rule_members,rule_run,sign_request_create,subscription_mute,subscription_preview,view_declare,work_set_state,work_take_assignment,work_template_instantiate" },
880
- { code: "23505", raised_by: "_unique_rule_holds,doc_sign,doc_signature_write,entity_field_declare,field_declare,home_add,inbound_declare,io_proposal_accept,relation_carry,relation_own,share_grant,sign_request_cancel,sign_request_create,table_share_outside_invite,table_share_outside_resend,work_approval_decide,work_slot_hold" },
881
- { code: "23514", raised_by: "_checklist_instantiate,_checklist_step_guard,_containment_guard,_dated_values_guard,_derived_fields,_display_spec_for,_entity_custom_fields_guard,_field_class_guard,_field_document_for,_field_shape_guard,_field_type_parity_guard,_merge_field_shape_guard,_merge_field_temporal_guard,_promoted_field_cap_guard,_record_rule_uses,_resolve_choice_words,_rule_shape_guard,_rule_topology_guard,_store_relation_edge_names_its_field,_table_columns_word_guard,_table_shape_guard,_undeclared_key_guard,_value_envelope,_with_display,_work_shape_guard,_workdoors_approval_guard,assert_columns_are_defined,assert_entity_is_organization_scoped,booking_declare,capture_publish,capture_sheet_declare,checklist_declare,checklist_step_complete,doc_sign,doc_signature_write,doc_template_save,entity_field_declare,entity_field_retire,entity_field_update,entity_records_find,entity_table,field_declare,field_retire,field_update,home_add,io_import_rows,migrate_merge,relation_carry,relation_own,sign_request_create,sign_request_sign,table_declare,validate_value_envelope,validate_values,work_set_state,work_slots_declare,work_take_assignment,work_template_instantiate" },
966
+ { code: "22023", raised_by: "_booking_availability,_entity_custom_fields_guard,_take_op_id,_value_envelope,_work_shape_guard,actor_word,agg_assert_key,agg_sql,anon_token_issue,booking_declare,containment_parent,dashboard_block_normalize,dashboard_window_sql,doc_render_body,doc_render_write,doc_signature_write,enrich_declare,enrich_land,enrich_normalize,enrich_pin,entity_value_write,external_history_event,external_source_declare,external_stub_upsert,external_write_through,field_history,field_update,io_export,io_import_begin,io_import_finish,io_import_plan,io_import_report,io_proposal_accept,list_portals,migrate_merge,migrate_reclass,my_levels,organization_clear,page_size,pin_agent_cells,pipeline_move,portal_declare,provenance_write,query_by_coordinates,query_rollup,read_records_archived,record_update,record_write_many,relation_carry,rule_eval,rule_members,share_grant,share_lane_set,sign_request_create,sign_request_sign,subscription_declare,table_rules,visibility_as_of,work_approval_request,work_list,work_slot_hold" },
967
+ { code: "23503", raised_by: "_booking_availability,_checklist_instantiate,_containment_guard,_display_spec_for,_field_document_for,_field_type_parity_guard,_pipeline_stage_key,_record_rule_uses,agg_digest_assemble,anon_publish,anon_rate_take,anon_token_issue,anon_write,assert_organization_wall,booking_cancel,booking_confirm,booking_declare,booking_hold,booking_reschedule,capture_publish,checklist_declare,checklist_steps_table,comment_write,dashboard_declare,delete_rule,doc_sign,doc_template_save,enrich_declare,enrich_due,enrich_land,form_declare,form_submit,home_add,inbound_declare,inbound_mail_land,inbound_set,io_comment_write,io_import_begin,io_import_finish,io_import_report,io_import_rows,io_proposal_accept,migrate_demote,migrate_promote,pipeline_board,pipeline_declare,pipeline_move,pipeline_read,pipeline_transition_refusal,promote_field,promote_table,record_applicability,record_reparent,relation_carry,relation_own,resolve_first_match,rule_applies,rule_declare,rule_eval,rule_members,rule_run,sign_request_create,subscription_mute,subscription_preview,view_declare,work_set_state,work_take_assignment,work_template_instantiate" },
968
+ { code: "23505", raised_by: "_share_write_person,_unique_rule_holds,doc_sign,doc_signature_write,entity_field_declare,field_declare,home_add,inbound_declare,io_proposal_accept,relation_carry,relation_own,sign_request_cancel,sign_request_create,table_share_outside_resend,work_approval_decide,work_slot_hold" },
969
+ { code: "23514", raised_by: "_checklist_instantiate,_checklist_step_guard,_containment_guard,_dated_values_guard,_derived_fields,_display_spec_for,_entity_custom_fields_guard,_field_class_guard,_field_document_for,_field_shape_guard,_field_type_parity_guard,_merge_field_shape_guard,_merge_field_temporal_guard,_promoted_field_cap_guard,_record_rule_uses,_resolve_choice_words,_rule_shape_guard,_rule_topology_guard,_store_relation_edge_names_its_field,_table_columns_word_guard,_table_shape_guard,_undeclared_key_guard,_value_envelope,_with_display,_work_shape_guard,_workdoors_approval_guard,assert_columns_are_defined,assert_entity_is_organization_scoped,booking_declare,capture_publish,capture_sheet_declare,checklist_declare,checklist_step_complete,doc_sign,doc_signature_write,doc_template_save,entity_field_declare,entity_field_retire,entity_field_update,entity_records_find,entity_table,field_declare,field_retire,field_update,home_add,io_comment_write,io_import_rows,migrate_merge,portal_archive,portal_restore,relation_carry,relation_own,sign_request_create,sign_request_sign,table_declare,validate_value_envelope,validate_values,work_set_state,work_slots_declare,work_take_assignment,work_template_instantiate" },
882
970
  { code: "40001", raised_by: "has_visibility_at" },
883
- { code: "42501", raised_by: "_doc_render_immutable,_doc_signature_immutable,_field_definition_write,_field_write_door,_rule_definition_write,_store_door,anon_capture,anon_inbound_land,anon_publish,anon_token_issue,anon_token_verify,anon_write,assert_client_may_change,assert_client_may_open,assert_client_may_reach,assert_may_know_table,assert_organization_admin,assert_store_door,booking_confirm,booking_declare,booking_hold,capture_submit,checklist_run,comment_write,conversation_scope_bind,conversation_scope_unbind,enrich_declare,enrich_due,enrich_land,enrich_normalize,entity_field_declare,entity_field_retire,entity_field_update,entity_value_write,external_write_through,form_declare,form_submit,inbound_mail_land,io_comment_resolve,io_comment_write,io_import_begin,io_import_finish,io_restore,migrate_purge,migrate_reclass,my_levels,organization_clear,portal_declare,portal_invitation,portal_invite,portal_principal_bind,promote_table,query_visibility_parity,read_record,read_records,read_records_by_ids,record_table,share_grant,subscription_mute,subscription_preview,table_share_outside_accept,table_share_outside_invite,table_share_outside_resend,visibility_as_of,work_approval_decide,work_approval_read,work_approval_request,work_person" },
971
+ { code: "42501", raised_by: "_doc_render_immutable,_doc_signature_immutable,_field_definition_write,_field_write_door,_rule_definition_write,_store_door,agent_table_claim,anon_capture,anon_inbound_land,anon_publish,anon_token_issue,anon_token_verify,anon_write,assert_client_may_change,assert_client_may_open,assert_client_may_reach,assert_may_know_table,assert_organization_admin,assert_store_door,booking_confirm,booking_declare,booking_hold,capture_submit,checklist_run,comment_write,conversation_scope_bind,conversation_scope_unbind,doc_sign,enrich_declare,enrich_due,enrich_land,enrich_normalize,entity_field_declare,entity_field_retire,entity_field_update,entity_value_write,external_write_through,form_declare,form_submit,inbound_mail_land,io_comment_resolve,io_comment_write,io_import_begin,io_import_finish,io_restore,migrate_purge,migrate_reclass,my_levels,organization_clear,portal_declare,portal_invitation,portal_invite,portal_invite_accept,portal_principal_bind,promote_table,query_visibility_parity,read_record,read_records,read_records_archived,read_records_by_ids,read_records_matching,record_table,share_grant,subscription_mute,subscription_preview,table_share_outside_accept,table_share_outside_invite,table_share_outside_resend,visibility_as_of,work_approval_decide,work_approval_read,work_approval_request,work_person" },
884
972
  { code: "42703", raised_by: "entity_table,portal_declare" },
885
973
  { code: "53400", raised_by: "anon_rate_take,delete_cascade_closure,enrich_due,enrich_land,promote_field" },
886
974
  { code: "54001", raised_by: "record_delete" },
@@ -1776,6 +1864,7 @@ var ENTITY_TOKENS = [
1776
1864
  "template_scope_types",
1777
1865
  "templates",
1778
1866
  "test_handset_inbox",
1867
+ "test_handset_verification",
1779
1868
  "thread",
1780
1869
  "tool",
1781
1870
  "tool_binding",
@@ -1980,6 +2069,14 @@ var DOORS = {
1980
2069
  // `custom.record_filter_sql`, the one body `custom.agg_sql` also calls, so the
1981
2070
  // rows it opens are the rows the number counted.
1982
2071
  readRecordsMatching: "read_records_matching",
2072
+ // THE SAME READ DOOR, ADDRESSED BY ABSENCE. Every door above answers LIVE rows
2073
+ // only — each of them hard-codes `and r.deleted_at is null` — so until this one
2074
+ // existed no screen could list an archived record however it was written, and
2075
+ // `record_restore` below had nothing that could reach it (VERIFIER-10 F4).
2076
+ // `custom.read_records_archived` is that body with the sign of one comparison
2077
+ // flipped, plus the two facts only an archive needs: who archived it and when.
2078
+ // A separate NAME for the same reason as its two siblings above.
2079
+ readRecordsArchived: "read_records_archived",
1983
2080
  // DOOR-8, the two clocks. `p_recorded_at` is what the store SAID then;
1984
2081
  // `p_world_on` is what was TRUE of the world on that date, read out of dated
1985
2082
  // values. A client that answered either one itself would be guessing.
@@ -2126,6 +2223,7 @@ var DOORS = {
2126
2223
  // ways to start an import from one client is how they drift.
2127
2224
  importPlan: "io_import_plan",
2128
2225
  importBegin: "io_import_begin",
2226
+ importDeclareColumns: "io_import_declare_columns",
2129
2227
  importRows: "io_import_rows",
2130
2228
  importFinish: "io_import_finish",
2131
2229
  importReport: "io_import_report",
@@ -2162,6 +2260,17 @@ var DOORS = {
2162
2260
  portalInvite: "portal_invite",
2163
2261
  portalRevoke: "portal_revoke",
2164
2262
  portalPreview: "portal_preview",
2263
+ // ORG-CLEANUP, 2026-09-22 — A PORTAL IS ARCHIVED, NEVER DELETED.
2264
+ // `portals` keeps its signature and HIDES archived portals (the law's default
2265
+ // is to hide); `list_portals(org, 'active'|'archived'|'all')` is the
2266
+ // archive-aware reader, taking the platform archive filter's own three values
2267
+ // so one door serves both lanes and no screen has to invent a second control.
2268
+ // `portal_archive` / `portal_restore` are the way out and the way back; both
2269
+ // take the portal's own title typed back, because ten portals can carry one
2270
+ // title and the title alone is not what picks this one.
2271
+ listPortals: "list_portals",
2272
+ portalArchive: "portal_archive",
2273
+ portalRestore: "portal_restore",
2165
2274
  // SCR-16 — the canvas. A dashboard is a record in the presentation kernel
2166
2275
  // whose blocks are saved SPECS for the eighth verb; `dashboardRun` walks them
2167
2276
  // under the CALLER'S principal, so nothing here is precomputed and nothing is
@@ -2274,7 +2383,14 @@ var DOORS = {
2274
2383
  docTokens: "doc_tokens",
2275
2384
  docUnresolvedTokens: "doc_unresolved_tokens",
2276
2385
  docSign: "doc_sign",
2277
- docSignatureIntact: "doc_signature_intact",
2386
+ // THE SEAL IS ASKED THROUGH ITS OWN DOOR. `custom.doc_signature_intact` is the INTERNAL
2387
+ // half of this pair — SECURITY INVOKER over a doors-only table, so a browser that calls it
2388
+ // gets `42501 permission denied for table doc_signature`, which is what every SignBlock
2389
+ // seal check got until 2026-09-22 (FIX-10B). `custom.doc_signature_read` is the definer
2390
+ // door built for a client: it asks may_reach and may_open on the RECORD by name and
2391
+ // returns the seal AND the verdict in one answer, because a seal a person can read and a
2392
+ // verdict they cannot is how a changed agreement keeps wearing somebody's signature.
2393
+ docSignatureRead: "doc_signature_read",
2278
2394
  // THE PLURAL ACTS. Until 2026-09-20 this package read `custom.doc_template`,
2279
2395
  // `custom.doc_render` and `custom.doc_signature` with a direct PostgREST
2280
2396
  // `.from()`, and all three hold NO client SELECT — so every list in product #5
@@ -2671,6 +2787,34 @@ function createRecordsClient(config) {
2671
2787
  })
2672
2788
  );
2673
2789
  },
2790
+ async listArchived({ table_id, lane = DEFAULT_ARCHIVE_LANE, limit = 50, offset = 0 }) {
2791
+ const door = await callDoor(
2792
+ DOORS.readRecordsArchived,
2793
+ {
2794
+ p_organization_id: org,
2795
+ p_table_id: table_id,
2796
+ p_lane: lane,
2797
+ p_limit: limit,
2798
+ p_offset: offset
2799
+ },
2800
+ "listArchived"
2801
+ );
2802
+ if (!door.ok) return err(door.error);
2803
+ const rows = (door.data ?? []).map((row) => {
2804
+ const { document, hidden } = unfold(row.document);
2805
+ return {
2806
+ id: row.id,
2807
+ document,
2808
+ level: row.level,
2809
+ hidden,
2810
+ archivedAt: row.archived_at,
2811
+ archivedBy: row.archived_by ?? null,
2812
+ archivedByName: row.archived_by_name ?? null
2813
+ };
2814
+ });
2815
+ const total = rows.length < limit ? offset + rows.length : null;
2816
+ return ok({ rows, total });
2817
+ },
2674
2818
  async list({ table_id, filter, limit = 50, offset = 0 }) {
2675
2819
  const door = await callDoor(
2676
2820
  DOORS.readRecordsMatching,
@@ -3160,6 +3304,18 @@ function createRecordsClient(config) {
3160
3304
  "importBegin"
3161
3305
  );
3162
3306
  },
3307
+ async importDeclareColumns(args) {
3308
+ return callDoor(
3309
+ DOORS.importDeclareColumns,
3310
+ {
3311
+ p_organization_id: org,
3312
+ p_table_id: args.table_id,
3313
+ p_rows: args.rows,
3314
+ p_mapping: args.mapping ?? {}
3315
+ },
3316
+ "importDeclareColumns"
3317
+ );
3318
+ },
3163
3319
  async importRows(args) {
3164
3320
  return callDoor(
3165
3321
  DOORS.importRows,
@@ -3230,6 +3386,36 @@ function createRecordsClient(config) {
3230
3386
  async portals() {
3231
3387
  return callDoor(DOORS.portals, { p_organization_id: org }, "portals");
3232
3388
  },
3389
+ async listPortals(args) {
3390
+ return callDoor(
3391
+ DOORS.listPortals,
3392
+ { p_organization_id: org, p_archived: args?.archived ?? "active" },
3393
+ "listPortals"
3394
+ );
3395
+ },
3396
+ async portalArchive(args) {
3397
+ return callDoor(
3398
+ DOORS.portalArchive,
3399
+ {
3400
+ p_organization_id: org,
3401
+ p_portal_id: args.portal_id,
3402
+ p_confirm_title: args.confirm_title,
3403
+ p_reason: args.reason ?? null
3404
+ },
3405
+ "portalArchive"
3406
+ );
3407
+ },
3408
+ async portalRestore(args) {
3409
+ return callDoor(
3410
+ DOORS.portalRestore,
3411
+ {
3412
+ p_organization_id: org,
3413
+ p_portal_id: args.portal_id,
3414
+ p_confirm_title: args.confirm_title
3415
+ },
3416
+ "portalRestore"
3417
+ );
3418
+ },
3233
3419
  async portalTables() {
3234
3420
  return callDoor(DOORS.portalTables, { p_organization_id: org }, "portalTables");
3235
3421
  },
@@ -3818,11 +4004,11 @@ function createRecordsClient(config) {
3818
4004
  "commentResolve"
3819
4005
  );
3820
4006
  },
3821
- async docSignatureIntact({ signature_id }) {
4007
+ async docSignatureRead({ signature_id }) {
3822
4008
  return callDoor(
3823
- DOORS.docSignatureIntact,
4009
+ DOORS.docSignatureRead,
3824
4010
  { p_organization_id: org, p_signature_id: signature_id },
3825
- "docSignatureIntact"
4011
+ "docSignatureRead"
3826
4012
  );
3827
4013
  },
3828
4014
  // ── the anonymous lane ───────────────────────────────────────────────
@@ -5118,6 +5304,24 @@ function publicFormPath(formId) {
5118
5304
  function portalPath(slug) {
5119
5305
  return `/portal/c/${slug}`;
5120
5306
  }
5307
+ var PORTAL_ARCHIVE_FILTERS = ["active", "archived", "all"];
5308
+ var DEFAULT_PORTAL_ARCHIVE_FILTER = "active";
5309
+ function isPortalArchiveFilter(word) {
5310
+ return typeof word === "string" && PORTAL_ARCHIVE_FILTERS.includes(word);
5311
+ }
5312
+ function portalArchiveConsequence(title, signedIn, invited) {
5313
+ const people = invited === 0 ? "Nobody is invited to it" : signedIn === 0 ? `The ${invited} ${invited === 1 ? "person" : "people"} invited to it will not be able to sign in` : `The ${signedIn} ${signedIn === 1 ? "person" : "people"} signed in to it, and the ${invited - signedIn} still invited, will not be able to sign in`;
5314
+ return `\u201C${title}\u201D will leave your portal list. ${people}, and their invitation links will say this portal was archived and can be restored. Nothing is deleted \u2014 every Table it shows and everyone invited to it is kept exactly as it is, and you can restore it at any time.`;
5315
+ }
5316
+ function portalConfirmLine(title) {
5317
+ return `Type the portal\u2019s title \u2014 ${title} \u2014 to confirm you mean this one.`;
5318
+ }
5319
+ function portalTitleTypedBack(typed, title) {
5320
+ return typed.trim() === (title ?? "").trim();
5321
+ }
5322
+ function emptyPortalArchiveLine() {
5323
+ return "No portal of this organization has been archived. A portal you put away waits here until somebody restores it, and nothing is ever destroyed.";
5324
+ }
5121
5325
 
5122
5326
  // src/capture-queue.ts
5123
5327
  var DB_NAME = "matrx-capture";