@ai-matrx/records 0.39.0 → 0.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,58 @@
1
1
  # Changelog — @ai-matrx/records
2
2
 
3
+ ## 0.41.0
4
+
5
+ **`recordWriteMany` — the door for a paste that is bigger than a page.**
6
+
7
+ `custom.record_write_many` has existed since the store did; no method on
8
+ `RecordsClient` called it, so every bulk create went one `record_write` at a
9
+ time. A 120-line customer list pasted into a grid whose page ceiling is 50 was
10
+ 120 round trips, each re-asking the switch, the organization wall and the
11
+ Table's ladder for an answer that cannot have changed between rows.
12
+
13
+ * `recordWriteMany({ table_id, rows, ids? })` asks all three ONCE per call and
14
+ inserts the batch in one statement, returning the new ids IN THE ORDER THE
15
+ ROWS WERE HANDED IN — so a caller can tie each id back to the line of the
16
+ spreadsheet it came from.
17
+ * It CREATES only, and says so: an update carries a per-row optimistic version
18
+ and a batch would have to either drop that or fail a hundred rows for one
19
+ stale one.
20
+ * `store.generated.ts` regenerated against the live store (551 doors).
21
+
22
+ **Consumer action:** none. A caller writing rows one at a time still works;
23
+ `@ai-matrx/records-ui`'s grid paste now chunks through this instead.
24
+
25
+ ## 0.40.0
26
+
27
+ **The parity floor this package types is asserted against the one the store ships.**
28
+
29
+ `checkbox` landed as the fourteenth parity type and `store.generated.ts` picked it
30
+ up — but nothing made that agreement a test. Everything that spelled the floor out
31
+ by hand went stale in the same hour: three of the store's own refusal hints, the
32
+ `FieldTypeWord` doc comment, `UseCaseField.parityType`'s doc comment and the
33
+ use-case README's list, all still saying thirteen. A person who asked for a
34
+ checkbox could be told by the store that checkboxes do not exist.
35
+
36
+ * `src/__tests__/real-doors.test.ts` gains three cases, in the one suite that runs
37
+ against the live store: `PARITY_FIELD_TYPES` is exactly
38
+ `custom.parity_field_types()` name for name (a diff NAMES the missing type, it
39
+ never prints a count); every parity type and every behaviour the store ships is
40
+ a legal `parityType` word in `RESOLVABLE_FIELD_TYPE_WORDS`; and `checkbox` is
41
+ present with behaviour `boolean`, with a compile-time assertion that the
42
+ `ParityFieldType` union still admits it. Shown RED: with the `checkbox` row
43
+ removed from `store.generated.ts` all three fail and the first one says
44
+ "expected 'attachment, currency, …' to be 'attachment, checkbox, …'".
45
+ * The four places that wrote the count or the list out by hand now point at the
46
+ derived set instead. No number is written down anywhere in this package.
47
+ * `store.generated.ts` regenerated against the live store (542 doors, 1023 entity
48
+ tokens); `pnpm check:store-registry` was RED on that drift before this release.
49
+
50
+ **Consumer action:** none.
51
+
52
+ **Why 0.40.0 and not 0.38.0.** This work landed on `main` a few minutes after
53
+ 0.39.0 was tagged, so the published 0.39.0 does not contain it. The version number
54
+ moves rather than the tag.
55
+
3
56
  ## 0.39.0
4
57
 
5
58
  **Two things a records screen could not know: that a table's shape had changed,
@@ -45,33 +98,6 @@ of the set, and nothing else. `src/__tests__/page-truth.test.ts` asserts the
45
98
  refusal against the live store, so the day it softens into a silent shrink the
46
99
  suite goes red and names the inference that has to change with it.
47
100
 
48
- ## 0.38.0
49
-
50
- **The parity floor this package types is asserted against the one the store ships.**
51
-
52
- `checkbox` landed as the fourteenth parity type and `store.generated.ts` picked it
53
- up — but nothing made that agreement a test. Everything that spelled the floor out
54
- by hand went stale in the same hour: three of the store's own refusal hints, the
55
- `FieldTypeWord` doc comment, `UseCaseField.parityType`'s doc comment and the
56
- use-case README's list, all still saying thirteen. A person who asked for a
57
- checkbox could be told by the store that checkboxes do not exist.
58
-
59
- * `src/__tests__/real-doors.test.ts` gains three cases, in the one suite that runs
60
- against the live store: `PARITY_FIELD_TYPES` is exactly
61
- `custom.parity_field_types()` name for name (a diff NAMES the missing type, it
62
- never prints a count); every parity type and every behaviour the store ships is
63
- a legal `parityType` word in `RESOLVABLE_FIELD_TYPE_WORDS`; and `checkbox` is
64
- present with behaviour `boolean`, with a compile-time assertion that the
65
- `ParityFieldType` union still admits it. Shown RED: with the `checkbox` row
66
- removed from `store.generated.ts` all three fail and the first one says
67
- "expected 'attachment, currency, …' to be 'attachment, checkbox, …'".
68
- * The four places that wrote the count or the list out by hand now point at the
69
- derived set instead. No number is written down anywhere in this package.
70
- * `store.generated.ts` regenerated against the live store (542 doors, 1023 entity
71
- tokens); `pnpm check:store-registry` was RED on that drift before this release.
72
-
73
- **Consumer action:** none.
74
-
75
101
  ## 0.37.0
76
102
 
77
103
  **Three doors the store already had and this client could not reach.**
@@ -724,7 +724,7 @@ var STORE_DOORS = [
724
724
  { name: "comment_thread", args: "p_organization_id uuid, p_record_id uuid, p_include_resolved boolean DEFAULT false", returns: "jsonb", security: "definer" },
725
725
  { name: "comment_write", args: "p_organization_id uuid, p_record_id uuid, p_body text, p_anchor jsonb DEFAULT '{}'::jsonb, p_parent_comment_id uuid DEFAULT NULL::uuid, p_mentions uuid[] DEFAULT NULL::uuid[]", returns: "jsonb", security: "definer" },
726
726
  { name: "computed_block", args: "p_block jsonb", returns: "jsonb", security: "invoker" },
727
- { name: "computed_provenance", args: "p_organization_id uuid, p_record_id uuid", returns: "TABLE(field_key text, field_id uuid, value jsonb, rule_id uuid, rule_version integer, computed_at timestamp with time zone)", security: "invoker" },
727
+ { name: "computed_provenance", args: "p_organization_id uuid, p_record_id uuid", returns: "TABLE(field_key text, field_id uuid, value jsonb, rule_id uuid, rule_version integer, computed_at timestamp with time zone)", security: "definer" },
728
728
  { name: "containment_chain", args: "p_organization_id uuid, p_record_id uuid", returns: "TABLE(ancestor_id uuid, depth integer)", security: "invoker" },
729
729
  { name: "containment_depth_ceiling", args: "p_organization_id uuid DEFAULT NULL::uuid", returns: "integer", security: "invoker" },
730
730
  { name: "containment_edges", args: "p_organization_id uuid", returns: "TABLE(parent_id uuid, child_id uuid, via text)", security: "invoker" },
@@ -878,6 +878,7 @@ var STORE_DOORS = [
878
878
  { name: "io_infer_type", args: "p_samples jsonb", returns: "text", security: "invoker" },
879
879
  { name: "io_money_unit", args: "p_word text", returns: "text", security: "invoker" },
880
880
  { name: "io_outbox_announce", args: "", returns: "trigger", security: "definer" },
881
+ { name: "io_outbox_broadcast_stmt", args: "", returns: "trigger", security: "definer" },
881
882
  { name: "io_outbox_drain", args: "p_organization_id uuid, p_consumer text, p_limit integer DEFAULT 100, p_event_key text DEFAULT 'records.changed'::text", returns: "TABLE(outbox_id uuid, record_id uuid, table_id uuid, operation text, changed_field_ids jsonb, actor jsonb, occurred_at timestamp with time zone)", security: "definer" },
882
883
  { name: "io_outbox_release", args: "p_organization_id uuid, p_consumer text, p_older_than interval DEFAULT '00:15:00'::interval", returns: "integer", security: "definer" },
883
884
  { name: "io_proposal_accept", args: "p_organization_id uuid, p_import_id uuid, p_column text, p_type text DEFAULT NULL::text, p_label text DEFAULT NULL::text", returns: "uuid", security: "definer" },
@@ -903,6 +904,7 @@ var STORE_DOORS = [
903
904
  { 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" },
904
905
  { 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" },
905
906
  { name: "mask_says_withheld", args: "p_mask jsonb, p_key text", returns: "boolean", security: "invoker" },
907
+ { name: "may_invite_outside", args: "p_organization_id uuid, p_table_id uuid", returns: "boolean", security: "definer" },
906
908
  { name: "merge_field_kernel_id", args: "", returns: "uuid", security: "invoker" },
907
909
  { name: "migrate_choice_keys", args: "p_organization_id uuid, p_table_id uuid, p_dry_run boolean DEFAULT false", returns: "jsonb", security: "definer" },
908
910
  { name: "migrate_delete", args: "p_organization_id uuid, p_record_id uuid, p_note text DEFAULT NULL::text", returns: "jsonb", security: "definer" },
@@ -1000,6 +1002,7 @@ var STORE_DOORS = [
1000
1002
  { name: "read_paths_outside_the_door", args: "", returns: "TABLE(object_name text, why text)", security: "invoker" },
1001
1003
  { name: "read_record", args: "p_organization_id uuid, p_record_id uuid, p_by_id boolean DEFAULT false", returns: "jsonb", security: "definer" },
1002
1004
  { 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" },
1005
+ { name: "realtime_topic_admits", args: "p_topic text", returns: "boolean", security: "definer" },
1003
1006
  { 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" },
1004
1007
  { 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" },
1005
1008
  { 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" },
@@ -1102,6 +1105,12 @@ var STORE_DOORS = [
1102
1105
  { name: "table_record_ceiling", args: "", returns: "integer", security: "invoker" },
1103
1106
  { name: "table_record_ceiling", args: "p_organization_id uuid", returns: "integer", security: "invoker" },
1104
1107
  { name: "table_rules", args: "p_organization_id uuid, p_table_id uuid, p_use text, p_record_type text DEFAULT NULL::text", returns: "SETOF custom.record", security: "invoker" },
1108
+ { name: "table_share_outside", args: "p_organization_id uuid, p_table_id uuid", returns: "jsonb", security: "definer" },
1109
+ { name: "table_share_outside_accept", args: "p_token text", returns: "jsonb", security: "definer" },
1110
+ { name: "table_share_outside_for_me", args: "", returns: "TABLE(invitation_id uuid, organization_id uuid, organization text, table_id uuid, table_name text, level text, level_label text, token text, expires_at timestamp with time zone, say text)", security: "definer" },
1111
+ { name: "table_share_outside_invite", args: "p_organization_id uuid, p_table_id uuid, p_email text, p_level permission_level DEFAULT 'viewer'::permission_level", returns: "jsonb", security: "definer" },
1112
+ { name: "table_share_outside_resend", args: "p_organization_id uuid, p_invitation_id uuid", returns: "jsonb", security: "definer" },
1113
+ { name: "table_share_outside_revoke", args: "p_organization_id uuid, p_invitation_id uuid", returns: "jsonb", security: "definer" },
1105
1114
  { name: "table_stage_field", args: "p_organization_id uuid, p_table_id uuid", returns: "text", security: "definer" },
1106
1115
  { name: "table_storage", args: "p_organization_id uuid, p_table_id uuid", returns: "text", security: "invoker" },
1107
1116
  { name: "table_type_field", args: "p_organization_id uuid, p_table_id uuid", returns: "text", security: "definer" },
@@ -1200,6 +1209,7 @@ var STORE_KNOBS = [
1200
1209
  { key: "inbound_domain", value: '"inbound.matrxserver.com"', type: "string" },
1201
1210
  { key: "member_default_level", value: '"viewer"', type: "enum" },
1202
1211
  { key: "member_default_visibility", value: '"all_records"', type: "enum" },
1212
+ { key: "outside_invite_who", value: '"org_admins_and_table_owners"', type: "string" },
1203
1213
  { key: "page_size_ceiling", value: "1000", type: "integer" },
1204
1214
  { key: "provenance_retention_days", value: "30", type: "number" },
1205
1215
  { key: "records_tool_default", value: "true", type: "boolean" },
@@ -1216,18 +1226,18 @@ var STORE_KNOBS = [
1216
1226
  { key: "world_publish_enabled", value: "false", type: "boolean" }
1217
1227
  ];
1218
1228
  var STORE_REFUSAL_CODES = [
1219
- { code: "02000", raised_by: "_checklist_instantiate,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,visibility_as_of,work_approval_decide,work_approval_read,work_approval_request,work_assign,work_record_states,work_set_state" },
1229
+ { code: "02000", raised_by: "_checklist_instantiate,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" },
1220
1230
  { 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" },
1221
1231
  { code: "22003", raised_by: "context_resolve" },
1222
- { 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,value_restore,view_declare,work_approval_decide,work_approval_request,work_template_declare" },
1232
+ { 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" },
1223
1233
  { code: "22007", raised_by: "dashboard_window_sql" },
1224
1234
  { code: "22012", raised_by: "rule_eval" },
1225
1235
  { code: "22023", raised_by: "_booking_availability,_entity_custom_fields_guard,_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,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" },
1226
1236
  { code: "23503", raised_by: "_booking_availability,_checklist_instantiate,_containment_guard,_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" },
1227
- { 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,work_approval_decide,work_slot_hold" },
1237
+ { 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" },
1228
1238
  { code: "23514", raised_by: "_checklist_instantiate,_checklist_step_guard,_containment_guard,_dated_values_guard,_derived_fields,_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,_work_shape_guard,_workdoors_approval_guard,assert_columns_are_defined,assert_entity_is_organization_scoped,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" },
1229
1239
  { code: "40001", raised_by: "has_visibility_at" },
1230
- { 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,record_table,share_grant,subscription_mute,subscription_preview,visibility_as_of,work_approval_decide,work_approval_read,work_approval_request,work_person" },
1240
+ { 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,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" },
1231
1241
  { code: "42703", raised_by: "entity_table,portal_declare" },
1232
1242
  { code: "53400", raised_by: "anon_rate_take,delete_cascade_closure,enrich_due,enrich_land,promote_field" },
1233
1243
  { code: "54001", raised_by: "record_delete" },
@@ -2321,6 +2331,7 @@ var DOORS = {
2321
2331
  queryRecordAsOf: "query_record_as_of",
2322
2332
  queryTableAsOf: "query_table_as_of",
2323
2333
  recordWrite: "record_write",
2334
+ recordWriteMany: "record_write_many",
2324
2335
  recordUpdate: "record_update",
2325
2336
  recordDelete: "record_delete",
2326
2337
  recordRestore: "record_restore",
@@ -2902,6 +2913,18 @@ function createRecordsClient(config) {
2902
2913
  "recordWrite"
2903
2914
  );
2904
2915
  },
2916
+ async recordWriteMany({ table_id, rows, ids }) {
2917
+ return callDoor(
2918
+ DOORS.recordWriteMany,
2919
+ {
2920
+ p_organization_id: org,
2921
+ p_table_id: table_id,
2922
+ p_rows: rows,
2923
+ ...ids === void 0 ? {} : { p_ids: ids }
2924
+ },
2925
+ "recordWriteMany"
2926
+ );
2927
+ },
2905
2928
  async recordUpdate({ record_id, patch, expectedVersion }) {
2906
2929
  const result = await callDoor(
2907
2930
  DOORS.recordUpdate,