@ai-matrx/records 0.48.0 → 0.51.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.
@@ -9,6 +9,46 @@ import {
9
9
  useMemo
10
10
  } from "react";
11
11
 
12
+ // src/archive.ts
13
+ var ARCHIVE_LANES = ["mine", "org"];
14
+ var DEFAULT_ARCHIVE_LANE = "org";
15
+ var ARCHIVE_LANE_LABEL = {
16
+ mine: "Archived by me",
17
+ org: "Archived by anyone"
18
+ };
19
+ var ARCHIVE_LANE_MEANS = {
20
+ mine: "The records you archived yourself.",
21
+ org: "Everything anybody in this organization archived, including you."
22
+ };
23
+ function isArchiveLane(word) {
24
+ return typeof word === "string" && ARCHIVE_LANES.includes(word);
25
+ }
26
+ function archivedWhen(at, locale = "en-GB") {
27
+ const when = new Date(at);
28
+ if (Number.isNaN(when.getTime())) return "a moment nobody recorded";
29
+ return new Intl.DateTimeFormat(locale, {
30
+ day: "numeric",
31
+ month: "long",
32
+ year: "numeric",
33
+ hour: "2-digit",
34
+ minute: "2-digit"
35
+ }).format(when);
36
+ }
37
+ function archivedByLine(row, locale = "en-GB") {
38
+ const when = archivedWhen(row.archivedAt, locale);
39
+ const who = (row.archivedByName ?? "").trim();
40
+ if (who === "") {
41
+ 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.`;
42
+ }
43
+ return `Archived by ${who} on ${when}.`;
44
+ }
45
+ function emptyArchiveLine(lane) {
46
+ 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.";
47
+ }
48
+ function sameDocument(a, b) {
49
+ return JSON.stringify(a) === JSON.stringify(b);
50
+ }
51
+
12
52
  // src/ops.ts
13
53
  var REMEMBER_MS = 3e4;
14
54
  var REMEMBER_MAX = 500;
@@ -107,6 +147,27 @@ var PARITY_FIELD_TYPES = [
107
147
  { parity_type: "select", behavior: "list", made_of: "one choice from a Table shown as a list (FLD-5/FLD-6)" },
108
148
  { parity_type: "url", behavior: "text", made_of: "text whose format is url, with the pattern Rule that makes the format enforceable" }
109
149
  ];
150
+ var DECLARABLE_FIELD_KINDS = [
151
+ { kind: "attachment", behavior: "relation", parity: true, made_of: "REC-31: a File record reached through a relation, target the kernel `File` Table" },
152
+ { 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" },
153
+ { 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" },
154
+ { 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" },
155
+ { kind: "email", behavior: "text", parity: true, made_of: "text whose format is email" },
156
+ { kind: "formula", behavior: "formula", parity: true, made_of: "FLD-9: a declared computation, on read or on write, evaluated by custom.rule_eval" },
157
+ { kind: "long_text", behavior: "text", parity: false, made_of: "behaviour text with format long and config.multiline, for several lines rather than one" },
158
+ { 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" },
159
+ { kind: "member", behavior: "relation", parity: true, made_of: "a person: a relation whose target is the kernel `Person` Table" },
160
+ { kind: "multi_select", behavior: "list", parity: true, made_of: "many choices from the same Table \u2014 the multi modifier, never a second behaviour" },
161
+ { 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" },
162
+ { kind: "percent", behavior: "range", parity: true, made_of: "a number whose unit is % and whose format is percent" },
163
+ { kind: "phone", behavior: "text", parity: true, made_of: "text whose format is phone" },
164
+ { 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" },
165
+ { 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" },
166
+ { kind: "select", behavior: "list", parity: true, made_of: "one choice from a Table shown as a list (FLD-5/FLD-6)" },
167
+ { 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" },
168
+ { 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" },
169
+ { kind: "url", behavior: "text", parity: true, made_of: "text whose format is url, with the pattern Rule that makes the format enforceable" }
170
+ ];
110
171
  var RULE_NODE_KINDS = [
111
172
  { node: "actor_at_least", evaluated_by: "PIPELINES" },
112
173
  { node: "add", evaluated_by: "W1-RULE" },
@@ -342,6 +403,7 @@ var STORE_DOORS = [
342
403
  { 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" },
343
404
  { 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" },
344
405
  { name: "field_kernel_id", args: "", returns: "uuid", security: "invoker" },
406
+ { name: "field_kinds", args: "", returns: "TABLE(kind text, behavior text, parity boolean, made_of text)", security: "invoker" },
345
407
  { name: "field_options", args: "p_organization_id uuid, p_field_id uuid", returns: "SETOF custom.record", security: "definer" },
346
408
  { name: "field_retire", args: "p_organization_id uuid, p_field_id uuid", returns: "boolean", security: "definer" },
347
409
  { name: "field_rules", args: "p_field_data jsonb", returns: "TABLE(kind text, spec jsonb)", security: "invoker" },
@@ -477,6 +539,7 @@ var STORE_DOORS = [
477
539
  { 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" },
478
540
  { name: "portal_invitation", args: "p_slug text, p_email text", returns: "jsonb", security: "definer" },
479
541
  { 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" },
542
+ { name: "portal_invite_accept", args: "p_token text", returns: "jsonb", security: "definer" },
480
543
  { name: "portal_me", args: "", returns: "jsonb", security: "definer" },
481
544
  { 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" },
482
545
  { name: "portal_principal_bind", args: "p_organization_id uuid, p_principal_id uuid, p_user_id uuid", returns: "jsonb", security: "definer" },
@@ -529,14 +592,18 @@ var STORE_DOORS = [
529
592
  { name: "read_paths_outside_the_door", args: "", returns: "TABLE(object_name text, why text)", security: "invoker" },
530
593
  { name: "read_record", args: "p_organization_id uuid, p_record_id uuid, p_by_id boolean DEFAULT false", returns: "jsonb", security: "definer" },
531
594
  { 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" },
595
+ { 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" },
532
596
  { 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" },
597
+ { 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" },
533
598
  { name: "realtime_topic_admits", args: "p_topic text", returns: "boolean", security: "definer" },
534
599
  { 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" },
535
600
  { 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" },
601
+ { name: "record_archiver", args: "p_organization_id uuid, p_record_id uuid", returns: "uuid", security: "definer" },
536
602
  { 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" },
537
603
  { name: "record_card", args: "p_viewer uuid, p_organization_id uuid, p_record_id uuid", returns: "jsonb", security: "definer" },
538
604
  { 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" },
539
605
  { name: "record_delete", args: "p_organization_id uuid, p_record_id uuid", returns: "timestamp with time zone", security: "definer" },
606
+ { name: "record_filter_sql", args: "p_filter jsonb", returns: "text", security: "invoker" },
540
607
  { 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" },
541
608
  { name: "record_platform_keys", args: "", returns: "text[]", security: "invoker" },
542
609
  { 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" },
@@ -625,6 +692,7 @@ var STORE_DOORS = [
625
692
  { name: "subscription_mute", args: "p_organization_id uuid, p_rule_id uuid, p_muted boolean DEFAULT true", returns: "boolean", security: "definer" },
626
693
  { name: "subscription_preview", args: "p_organization_id uuid, p_rule_id uuid", returns: "jsonb", security: "definer" },
627
694
  { 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" },
695
+ { 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" },
628
696
  { name: "table_capacity", args: "p_organization_id uuid, p_table_id uuid", returns: "jsonb", security: "definer" },
629
697
  { 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" },
630
698
  { name: "table_column_source", args: "p_organization_id uuid, p_table_id uuid", returns: "text", security: "invoker" },
@@ -757,18 +825,18 @@ var STORE_KNOBS = [
757
825
  { key: "world_publish_enabled", value: "false", type: "boolean" }
758
826
  ];
759
827
  var STORE_REFUSAL_CODES = [
760
- { 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" },
828
+ { 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_card,portal_declare,portal_invite,portal_invite_accept,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_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" },
761
829
  { 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" },
762
830
  { code: "22003", raised_by: "context_resolve" },
763
- { 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" },
831
+ { 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" },
764
832
  { code: "22007", raised_by: "dashboard_window_sql" },
765
833
  { code: "22012", raised_by: "rule_eval" },
766
- { 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" },
767
- { 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" },
768
- { 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" },
769
- { 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" },
834
+ { 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,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" },
835
+ { 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" },
836
+ { 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" },
837
+ { 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,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" },
770
838
  { code: "40001", raised_by: "has_visibility_at" },
771
- { 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" },
839
+ { 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" },
772
840
  { code: "42703", raised_by: "entity_table,portal_declare" },
773
841
  { code: "53400", raised_by: "anon_rate_take,delete_cascade_closure,enrich_due,enrich_land,promote_field" },
774
842
  { code: "54001", raised_by: "record_delete" },
@@ -1664,6 +1732,7 @@ var ENTITY_TOKENS = [
1664
1732
  "template_scope_types",
1665
1733
  "templates",
1666
1734
  "test_handset_inbox",
1735
+ "test_handset_verification",
1667
1736
  "thread",
1668
1737
  "tool",
1669
1738
  "tool_binding",
@@ -1859,6 +1928,23 @@ var DOORS = {
1859
1928
  // live Postgres function makes every existing call ambiguous — `is not unique`. Same
1860
1929
  // ladder, same level, same masking, same page ceiling.
1861
1930
  readRecordsByIds: "read_records_by_ids",
1931
+ // THE SAME READ DOOR, ADDRESSED BY A QUESTION. `custom.read_records_matching`
1932
+ // takes the store's one filter shape (`RecordFilter` — the object
1933
+ // `platform.saved_view` carries as `filters` and `custom.record_aggregate`
1934
+ // takes as `p_filter`) and narrows the page INSIDE its own query, in the same
1935
+ // WHERE as Visibility. A separate NAME for the same reason as above. It is
1936
+ // what makes a number on a dashboard walkable: the filter is evaluated by
1937
+ // `custom.record_filter_sql`, the one body `custom.agg_sql` also calls, so the
1938
+ // rows it opens are the rows the number counted.
1939
+ readRecordsMatching: "read_records_matching",
1940
+ // THE SAME READ DOOR, ADDRESSED BY ABSENCE. Every door above answers LIVE rows
1941
+ // only — each of them hard-codes `and r.deleted_at is null` — so until this one
1942
+ // existed no screen could list an archived record however it was written, and
1943
+ // `record_restore` below had nothing that could reach it (VERIFIER-10 F4).
1944
+ // `custom.read_records_archived` is that body with the sign of one comparison
1945
+ // flipped, plus the two facts only an archive needs: who archived it and when.
1946
+ // A separate NAME for the same reason as its two siblings above.
1947
+ readRecordsArchived: "read_records_archived",
1862
1948
  // DOOR-8, the two clocks. `p_recorded_at` is what the store SAID then;
1863
1949
  // `p_world_on` is what was TRUE of the world on that date, read out of dated
1864
1950
  // values. A client that answered either one itself would be guessing.
@@ -2153,7 +2239,14 @@ var DOORS = {
2153
2239
  docTokens: "doc_tokens",
2154
2240
  docUnresolvedTokens: "doc_unresolved_tokens",
2155
2241
  docSign: "doc_sign",
2156
- docSignatureIntact: "doc_signature_intact",
2242
+ // THE SEAL IS ASKED THROUGH ITS OWN DOOR. `custom.doc_signature_intact` is the INTERNAL
2243
+ // half of this pair — SECURITY INVOKER over a doors-only table, so a browser that calls it
2244
+ // gets `42501 permission denied for table doc_signature`, which is what every SignBlock
2245
+ // seal check got until 2026-09-22 (FIX-10B). `custom.doc_signature_read` is the definer
2246
+ // door built for a client: it asks may_reach and may_open on the RECORD by name and
2247
+ // returns the seal AND the verdict in one answer, because a seal a person can read and a
2248
+ // verdict they cannot is how a changed agreement keeps wearing somebody's signature.
2249
+ docSignatureRead: "doc_signature_read",
2157
2250
  // THE PLURAL ACTS. Until 2026-09-20 this package read `custom.doc_template`,
2158
2251
  // `custom.doc_render` and `custom.doc_signature` with a direct PostgREST
2159
2252
  // `.from()`, and all three hold NO client SELECT — so every list in product #5
@@ -2550,12 +2643,41 @@ function createRecordsClient(config) {
2550
2643
  })
2551
2644
  );
2552
2645
  },
2553
- async list({ table_id, limit = 50, offset = 0 }) {
2646
+ async listArchived({ table_id, lane = DEFAULT_ARCHIVE_LANE, limit = 50, offset = 0 }) {
2554
2647
  const door = await callDoor(
2555
- DOORS.readRecords,
2648
+ DOORS.readRecordsArchived,
2649
+ {
2650
+ p_organization_id: org,
2651
+ p_table_id: table_id,
2652
+ p_lane: lane,
2653
+ p_limit: limit,
2654
+ p_offset: offset
2655
+ },
2656
+ "listArchived"
2657
+ );
2658
+ if (!door.ok) return err(door.error);
2659
+ const rows = (door.data ?? []).map((row) => {
2660
+ const { document, hidden } = unfold(row.document);
2661
+ return {
2662
+ id: row.id,
2663
+ document,
2664
+ level: row.level,
2665
+ hidden,
2666
+ archivedAt: row.archived_at,
2667
+ archivedBy: row.archived_by ?? null,
2668
+ archivedByName: row.archived_by_name ?? null
2669
+ };
2670
+ });
2671
+ const total = rows.length < limit ? offset + rows.length : null;
2672
+ return ok({ rows, total });
2673
+ },
2674
+ async list({ table_id, filter, limit = 50, offset = 0 }) {
2675
+ const door = await callDoor(
2676
+ DOORS.readRecordsMatching,
2556
2677
  {
2557
2678
  p_organization_id: org,
2558
2679
  p_table_id: table_id,
2680
+ p_filter: filter ?? {},
2559
2681
  p_limit: limit,
2560
2682
  p_offset: offset
2561
2683
  },
@@ -3696,11 +3818,11 @@ function createRecordsClient(config) {
3696
3818
  "commentResolve"
3697
3819
  );
3698
3820
  },
3699
- async docSignatureIntact({ signature_id }) {
3821
+ async docSignatureRead({ signature_id }) {
3700
3822
  return callDoor(
3701
- DOORS.docSignatureIntact,
3823
+ DOORS.docSignatureRead,
3702
3824
  { p_organization_id: org, p_signature_id: signature_id },
3703
- "docSignatureIntact"
3825
+ "docSignatureRead"
3704
3826
  );
3705
3827
  },
3706
3828
  // ── the anonymous lane ───────────────────────────────────────────────
@@ -4264,6 +4386,27 @@ function useRecordsActor() {
4264
4386
 
4265
4387
  // src/react/hooks.ts
4266
4388
  import { useCallback, useEffect, useMemo as useMemo2, useRef, useState, useSyncExternalStore } from "react";
4389
+
4390
+ // src/aggregate.ts
4391
+ function measureKey(measure) {
4392
+ return measure.op === "count" ? "count" : `${measure.op}_${measure.key ?? ""}`;
4393
+ }
4394
+ function stableFilterKey(filter) {
4395
+ if (!filter) return "{}";
4396
+ const keys = Object.keys(filter).sort();
4397
+ if (keys.length === 0) return "{}";
4398
+ const parts = keys.map((key) => {
4399
+ const value = filter[key];
4400
+ if (value !== null && typeof value === "object") {
4401
+ const window2 = value;
4402
+ return `${JSON.stringify(key)}:{"from":${JSON.stringify(window2.from ?? null)},"to":${JSON.stringify(window2.to ?? null)}}`;
4403
+ }
4404
+ return `${JSON.stringify(key)}:${JSON.stringify(value ?? null)}`;
4405
+ });
4406
+ return `{${parts.join(",")}}`;
4407
+ }
4408
+
4409
+ // src/react/hooks.ts
4267
4410
  function useAsync(run, deps) {
4268
4411
  const client = useRecordsClient();
4269
4412
  const [state, setState] = useState(
@@ -4372,16 +4515,21 @@ function useRecords(tableId, options = {}) {
4372
4515
  const client = useRecordsClient();
4373
4516
  const pageSize = options.pageSize ?? 50;
4374
4517
  const page = options.page ?? 0;
4518
+ const filterKey = stableFilterKey(options.filter);
4375
4519
  const base = useAsync(
4376
4520
  async (c) => {
4377
4521
  if (!tableId) return { ok: true, data: { rows: [], total: null } };
4378
4522
  return c.list({
4379
4523
  table_id: tableId,
4524
+ ...filterKey === "{}" ? {} : { filter: options.filter },
4380
4525
  limit: pageSize,
4381
4526
  offset: page * pageSize
4382
4527
  });
4383
4528
  },
4384
- [tableId, pageSize, page]
4529
+ // The QUESTION, not the object: a parent that rebuilds `{status: "Cancelled"}`
4530
+ // on every render must not re-read the page on every render, and a parent
4531
+ // that changes the question must re-read on the first one.
4532
+ [tableId, pageSize, page, filterKey]
4385
4533
  );
4386
4534
  const realtime = client.config.realtime;
4387
4535
  const { reload, setData } = base;
@@ -4971,11 +5119,6 @@ function portalPath(slug) {
4971
5119
  return `/portal/c/${slug}`;
4972
5120
  }
4973
5121
 
4974
- // src/aggregate.ts
4975
- function measureKey(measure) {
4976
- return measure.op === "count" ? "count" : `${measure.op}_${measure.key ?? ""}`;
4977
- }
4978
-
4979
5122
  // src/capture-queue.ts
4980
5123
  var DB_NAME = "matrx-capture";
4981
5124
  var DB_VERSION = 1;
@@ -5262,8 +5405,13 @@ function scopeChip(scope) {
5262
5405
  export {
5263
5406
  ABSENCE_REASONS,
5264
5407
  ACTOR_VOCABULARY,
5408
+ ARCHIVE_LANES,
5409
+ ARCHIVE_LANE_LABEL,
5410
+ ARCHIVE_LANE_MEANS,
5265
5411
  COMPUTE_ON,
5266
5412
  CONTEXT_POLICIES,
5413
+ DECLARABLE_FIELD_KINDS,
5414
+ DEFAULT_ARCHIVE_LANE,
5267
5415
  DELIVERIES,
5268
5416
  ENTITY_TOKENS,
5269
5417
  FIELD_KINDS,
@@ -5299,6 +5447,8 @@ export {
5299
5447
  TABLE_TYPES,
5300
5448
  VALUE_ALTERNATE_KEYS,
5301
5449
  VALUE_ENVELOPE_KEYS,
5450
+ archivedByLine,
5451
+ archivedWhen,
5302
5452
  asPermissionLevel,
5303
5453
  atLeast,
5304
5454
  bookingPath,
@@ -5308,12 +5458,14 @@ export {
5308
5458
  coerceTypedAnswer,
5309
5459
  coerceTypedAnswers,
5310
5460
  coercionLabel,
5461
+ emptyArchiveLine,
5311
5462
  err,
5312
5463
  fieldKindFor,
5313
5464
  forgetAllOps,
5314
5465
  highestLevel,
5315
5466
  holdsARetiredChoice,
5316
5467
  indexedDbStore,
5468
+ isArchiveLane,
5317
5469
  isDecided,
5318
5470
  isOwnOp,
5319
5471
  isRecordsErr,
@@ -5331,7 +5483,9 @@ export {
5331
5483
  portalPath,
5332
5484
  publicFormPath,
5333
5485
  rememberedOpCount,
5486
+ sameDocument,
5334
5487
  scopeChip,
5488
+ stableFilterKey,
5335
5489
  tableShapeChanged,
5336
5490
  useEntityFieldMutation,
5337
5491
  useEntityFieldRights,