@ai-matrx/records 0.42.0 → 0.44.1
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 +41 -0
- package/dist/core/index.cjs +110 -8
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.cts +43 -3
- package/dist/core/index.d.ts +43 -3
- package/dist/core/index.js +110 -8
- package/dist/core/index.js.map +1 -1
- package/dist/{field-IOFl9Kvu.d.cts → field-D0Rr4Cqb.d.cts} +65 -6
- package/dist/{field-IOFl9Kvu.d.ts → field-D0Rr4Cqb.d.ts} +65 -6
- package/dist/index.cjs +52 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +85 -7
- package/dist/index.d.ts +85 -7
- package/dist/index.js +52 -5
- package/dist/index.js.map +1 -1
- package/dist/react/index.cjs +153 -12
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +191 -10
- package/dist/react/index.d.ts +191 -10
- package/dist/react/index.js +153 -12
- package/dist/react/index.js.map +1 -1
- package/dist/use-cases/index.cjs.map +1 -1
- package/dist/use-cases/index.d.cts +1 -1
- package/dist/use-cases/index.d.ts +1 -1
- package/dist/use-cases/index.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,46 @@
|
|
|
1
1
|
# Changelog — @ai-matrx/records
|
|
2
2
|
|
|
3
|
+
## 0.43.0
|
|
4
|
+
|
|
5
|
+
**The realtime port stops being half a contract, and a nudge re-reads only what moved.**
|
|
6
|
+
|
|
7
|
+
🚨 **BREAKING (one implementor):** `RecordsRealtimePort.subscribeRecords(args, onChange)` now
|
|
8
|
+
takes a `RecordsChangeSink` instead of `(recordId) => void`:
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
subscribeRecords(args, {
|
|
12
|
+
records(ids: readonly Uuid[] | null) { … }, // null = "I cannot name them" = read the page
|
|
13
|
+
shape() { … }, // a column moved, not a row
|
|
14
|
+
})
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
*Consumer action:* a host binding this port passes the two-call sink and **deletes its
|
|
18
|
+
`tableShapeChanged` import**. That import was the tell: a host that wanted to say "the SHAPE
|
|
19
|
+
moved" reached around the port into `@ai-matrx/records/react`, because the contract had no way
|
|
20
|
+
to say it. A column appearing is not a row changing and the package owns the difference now.
|
|
21
|
+
|
|
22
|
+
* **`listByIds({ table_id, ids })`** — DOOR-1 addressed by an id SET, through the new
|
|
23
|
+
`custom.read_records_by_ids`. The same ladder (`custom.visible_set`), the same level, the
|
|
24
|
+
same field masking and the same page ceiling as `list`; an id the reader may not see simply
|
|
25
|
+
does not come back. A separate door NAME rather than a sixth argument to `read_records`,
|
|
26
|
+
because a defaulted argument beside a live Postgres function makes every existing call
|
|
27
|
+
ambiguous — `function custom.read_records(uuid, uuid, boolean, integer, integer) is not
|
|
28
|
+
unique`.
|
|
29
|
+
* **`useRecords` re-reads only the ids it was nudged with.** A whole-page read is now reserved
|
|
30
|
+
for the three cases that need one: `records(null)`, a subset read the door refused, and a
|
|
31
|
+
named id that is NEW to this page (only the page door knows where it belongs in the order,
|
|
32
|
+
so the hook does not guess).
|
|
33
|
+
* **Echo suppression by op id.** Every `recordWrite` / `recordWriteMany` / `recordUpdate` mints
|
|
34
|
+
a uuid and sends it as the platform envelope key `_op_id`. The store lifts it out before its
|
|
35
|
+
undeclared-key guard and before storage — **it is never written onto the record** — and
|
|
36
|
+
carries it back in the realtime notice as `op_id`. `isOwnOp(opId)` (new, from `ops.ts`) tells
|
|
37
|
+
a port that a notice is this browser's own echo, so a host can delete
|
|
38
|
+
`acceptEchoFromSelf: true` and stop re-reading a page it has already updated. One call is one
|
|
39
|
+
operation: a `recordWriteMany` batch carries ONE id, and the store refuses a batch carrying
|
|
40
|
+
two by name.
|
|
41
|
+
* `useAsync` gained `setData`, so a caller that has just read fresher rows **through the same
|
|
42
|
+
door** can place them instead of throwing them away and reading the page again.
|
|
43
|
+
|
|
3
44
|
## 0.41.0
|
|
4
45
|
|
|
5
46
|
**`recordWriteMany` — the door for a paste that is bigger than a page.**
|
package/dist/core/index.cjs
CHANGED
|
@@ -87,6 +87,7 @@ __export(core_exports, {
|
|
|
87
87
|
err: () => err,
|
|
88
88
|
exportCsv: () => exportCsv,
|
|
89
89
|
exportXlsx: () => exportXlsx,
|
|
90
|
+
forgetAllOps: () => forgetAllOps,
|
|
90
91
|
highestLevel: () => highestLevel,
|
|
91
92
|
holdsARetiredChoice: () => holdsARetiredChoice,
|
|
92
93
|
importCsv: () => importCsv,
|
|
@@ -94,6 +95,7 @@ __export(core_exports, {
|
|
|
94
95
|
indexedDbStore: () => indexedDbStore,
|
|
95
96
|
intersectIds: () => intersectIds,
|
|
96
97
|
isDecided: () => isDecided,
|
|
98
|
+
isOwnOp: () => isOwnOp,
|
|
97
99
|
isRecordsErr: () => isRecordsErr,
|
|
98
100
|
isTheChosen: () => isTheChosen,
|
|
99
101
|
looksLikeAnId: () => looksLikeAnId,
|
|
@@ -102,6 +104,7 @@ __export(core_exports, {
|
|
|
102
104
|
measureKey: () => measureKey,
|
|
103
105
|
memoryStore: () => memoryStore,
|
|
104
106
|
mintClientKey: () => mintClientKey,
|
|
107
|
+
mintOpId: () => mintOpId,
|
|
105
108
|
ok: () => ok,
|
|
106
109
|
openCaptureQueue: () => openCaptureQueue,
|
|
107
110
|
optionKey: () => optionKey,
|
|
@@ -114,6 +117,7 @@ __export(core_exports, {
|
|
|
114
117
|
predictValueRefusals: () => predictValueRefusals,
|
|
115
118
|
predictWriteRefusals: () => predictWriteRefusals,
|
|
116
119
|
publicFormPath: () => publicFormPath,
|
|
120
|
+
rememberedOpCount: () => rememberedOpCount,
|
|
117
121
|
scopeChip: () => scopeChip,
|
|
118
122
|
staleWriteDetail: () => staleWriteDetail,
|
|
119
123
|
supabaseDataSource: () => supabaseDataSource,
|
|
@@ -559,6 +563,45 @@ function isRecordsErr(result) {
|
|
|
559
563
|
var ok = (data) => ({ ok: true, data });
|
|
560
564
|
var err = (error) => ({ ok: false, error });
|
|
561
565
|
|
|
566
|
+
// src/ops.ts
|
|
567
|
+
var REMEMBER_MS = 3e4;
|
|
568
|
+
var REMEMBER_MAX = 500;
|
|
569
|
+
var ours = /* @__PURE__ */ new Map();
|
|
570
|
+
function trim(now) {
|
|
571
|
+
for (const [id, at] of ours) {
|
|
572
|
+
if (now - at <= REMEMBER_MS) break;
|
|
573
|
+
ours.delete(id);
|
|
574
|
+
}
|
|
575
|
+
while (ours.size > REMEMBER_MAX) {
|
|
576
|
+
const oldest = ours.keys().next();
|
|
577
|
+
if (oldest.done === true) break;
|
|
578
|
+
ours.delete(oldest.value);
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
function mintOpId() {
|
|
582
|
+
const id = crypto.randomUUID();
|
|
583
|
+
const now = Date.now();
|
|
584
|
+
ours.set(id, now);
|
|
585
|
+
trim(now);
|
|
586
|
+
return id;
|
|
587
|
+
}
|
|
588
|
+
function isOwnOp(opId) {
|
|
589
|
+
if (!opId) return false;
|
|
590
|
+
const at = ours.get(opId);
|
|
591
|
+
if (at === void 0) return false;
|
|
592
|
+
if (Date.now() - at > REMEMBER_MS) {
|
|
593
|
+
ours.delete(opId);
|
|
594
|
+
return false;
|
|
595
|
+
}
|
|
596
|
+
return true;
|
|
597
|
+
}
|
|
598
|
+
function forgetAllOps() {
|
|
599
|
+
ours.clear();
|
|
600
|
+
}
|
|
601
|
+
function rememberedOpCount() {
|
|
602
|
+
return ours.size;
|
|
603
|
+
}
|
|
604
|
+
|
|
562
605
|
// src/store.generated.ts
|
|
563
606
|
var ACTOR_VOCABULARY = ["user", "agent", "system"];
|
|
564
607
|
var RETIRED_ACTOR_WORDS = { "ai": "agent", "code": "system", "human": "user" };
|
|
@@ -1002,6 +1045,7 @@ var STORE_DOORS = [
|
|
|
1002
1045
|
{ name: "read_paths_outside_the_door", args: "", returns: "TABLE(object_name text, why text)", security: "invoker" },
|
|
1003
1046
|
{ name: "read_record", args: "p_organization_id uuid, p_record_id uuid, p_by_id boolean DEFAULT false", returns: "jsonb", security: "definer" },
|
|
1004
1047
|
{ 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" },
|
|
1048
|
+
{ 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" },
|
|
1005
1049
|
{ name: "realtime_topic_admits", args: "p_topic text", returns: "boolean", security: "definer" },
|
|
1006
1050
|
{ 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" },
|
|
1007
1051
|
{ 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" },
|
|
@@ -1026,6 +1070,7 @@ var STORE_DOORS = [
|
|
|
1026
1070
|
{ name: "record_values", args: "p_organization_id uuid, p_record_id uuid", returns: "jsonb", security: "invoker" },
|
|
1027
1071
|
{ name: "record_values_of", args: "p_row custom.record", returns: "jsonb", security: "invoker" },
|
|
1028
1072
|
{ name: "record_values_versioned", args: "p_organization_id uuid, p_record_id uuid", returns: "TABLE(field_key text, field_id uuid, value jsonb, value_version integer, source jsonb, absent_reason text, actor text, on_behalf_of text, written_at timestamp with time zone, alternates jsonb)", security: "definer" },
|
|
1073
|
+
{ name: "record_words", args: "p_organization_id uuid, p_record_id uuid, p_noun text DEFAULT NULL::text", returns: "text", security: "definer" },
|
|
1029
1074
|
{ name: "record_write", args: "p_organization_id uuid, p_table_id uuid, p_data jsonb", returns: "uuid", security: "definer" },
|
|
1030
1075
|
{ name: "record_write_many", args: "p_organization_id uuid, p_table_id uuid, p_rows jsonb[], p_ids uuid[] DEFAULT NULL::uuid[]", returns: "uuid[]", security: "definer" },
|
|
1031
1076
|
{ name: "refusals_claiming_a_level_never_asked", args: "", returns: "TABLE(function_name text, identity_args text, why text)", security: "invoker" },
|
|
@@ -1037,6 +1082,8 @@ var STORE_DOORS = [
|
|
|
1037
1082
|
{ name: "relation_target_ours", args: "p_entity_token text, p_row_id uuid", returns: "jsonb", security: "definer" },
|
|
1038
1083
|
{ name: "relation_targets", args: "p_organization_id uuid, p_record_id uuid, p_via_key text", returns: "SETOF uuid", security: "definer" },
|
|
1039
1084
|
{ name: "relation_uncarry", args: "p_organization_id uuid, p_container_id uuid, p_item_id uuid", returns: "integer", security: "definer" },
|
|
1085
|
+
{ name: "relation_words", args: "p_organization_id uuid, p_field_id uuid, p_value text", returns: "text", security: "definer" },
|
|
1086
|
+
{ name: "relation_words_many", args: "p_organization_id uuid, p_field_id uuid, p_record_ids uuid[]", returns: "TABLE(record_id uuid, words text)", security: "definer" },
|
|
1040
1087
|
{ name: "reopen_declared_doors", args: "", returns: "TABLE(reopened text)", security: "definer" },
|
|
1041
1088
|
{ name: "required_epoch", args: "p_container_type text, p_container_id uuid, p_item_type text, p_item_id uuid", returns: "bigint", security: "definer" },
|
|
1042
1089
|
{ name: "resolve_first_match", args: "p_organization_id uuid, p_record_id uuid", returns: "jsonb", security: "invoker" },
|
|
@@ -1226,18 +1273,18 @@ var STORE_KNOBS = [
|
|
|
1226
1273
|
{ key: "world_publish_enabled", value: "false", type: "boolean" }
|
|
1227
1274
|
];
|
|
1228
1275
|
var STORE_REFUSAL_CODES = [
|
|
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" },
|
|
1276
|
+
{ 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" },
|
|
1230
1277
|
{ 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" },
|
|
1231
1278
|
{ code: "22003", raised_by: "context_resolve" },
|
|
1232
1279
|
{ 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" },
|
|
1233
1280
|
{ code: "22007", raised_by: "dashboard_window_sql" },
|
|
1234
1281
|
{ code: "22012", raised_by: "rule_eval" },
|
|
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" },
|
|
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" },
|
|
1282
|
+
{ 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,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" },
|
|
1283
|
+
{ 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" },
|
|
1237
1284
|
{ 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" },
|
|
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" },
|
|
1285
|
+
{ 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" },
|
|
1239
1286
|
{ code: "40001", raised_by: "has_visibility_at" },
|
|
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" },
|
|
1287
|
+
{ 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" },
|
|
1241
1288
|
{ code: "42703", raised_by: "entity_table,portal_declare" },
|
|
1242
1289
|
{ code: "53400", raised_by: "anon_rate_take,delete_cascade_closure,enrich_due,enrich_land,promote_field" },
|
|
1243
1290
|
{ code: "54001", raised_by: "record_delete" },
|
|
@@ -2325,6 +2372,13 @@ var DOORS = {
|
|
|
2325
2372
|
// this person could see.
|
|
2326
2373
|
readRecord: "read_record",
|
|
2327
2374
|
readRecords: "read_records",
|
|
2375
|
+
// THE SAME READ DOOR, ADDRESSED BY AN ID SET. A realtime notice names the exact ids that
|
|
2376
|
+
// moved; before this existed the only door that took them was the PAGE door, so a
|
|
2377
|
+
// three-cell change re-read fifty rows in every watching browser. It is a separate NAME
|
|
2378
|
+
// rather than a sixth argument to `read_records` because adding a defaulted argument to a
|
|
2379
|
+
// live Postgres function makes every existing call ambiguous — `is not unique`. Same
|
|
2380
|
+
// ladder, same level, same masking, same page ceiling.
|
|
2381
|
+
readRecordsByIds: "read_records_by_ids",
|
|
2328
2382
|
// DOOR-8, the two clocks. `p_recorded_at` is what the store SAID then;
|
|
2329
2383
|
// `p_world_on` is what was TRUE of the world on that date, read out of dated
|
|
2330
2384
|
// values. A client that answered either one itself would be guessing.
|
|
@@ -2384,6 +2438,18 @@ var DOORS = {
|
|
|
2384
2438
|
promotedRead: "promoted_read",
|
|
2385
2439
|
relationTargets: "relation_targets",
|
|
2386
2440
|
relationOwn: "relation_own",
|
|
2441
|
+
// REL-DISP, 2026-09-21. WHAT A RELATION CELL READS, through that column's own
|
|
2442
|
+
// display spec. `custom.record_words` is declared server_only — it takes a bare
|
|
2443
|
+
// record id with no field to scope it — so these are how a screen gets the
|
|
2444
|
+
// words, and they are the ONE way in: three separate copies of "read tableList,
|
|
2445
|
+
// find title_field, call rowName" lived in labels.tsx, RelationPicker.tsx and
|
|
2446
|
+
// PortalsPanel.tsx, and none of them could ever have shown two columns joined.
|
|
2447
|
+
// The `_many` door is the batch TAILS-2 recorded as missing ("there is still no
|
|
2448
|
+
// batch door on the store"), which is why the browser resolved labels one id at
|
|
2449
|
+
// a time. The ladder is NOT batched: the store asks it per record inside
|
|
2450
|
+
// `custom._words_for`, so batching buys a round trip and never a disclosure.
|
|
2451
|
+
relationWords: "relation_words",
|
|
2452
|
+
relationWordsMany: "relation_words_many",
|
|
2387
2453
|
homeAdd: "home_add",
|
|
2388
2454
|
recordReparent: "record_reparent",
|
|
2389
2455
|
containmentChain: "containment_chain",
|
|
@@ -2909,17 +2975,18 @@ function createRecordsClient(config) {
|
|
|
2909
2975
|
async recordWrite({ table_id, data }) {
|
|
2910
2976
|
return callDoor(
|
|
2911
2977
|
DOORS.recordWrite,
|
|
2912
|
-
{ p_organization_id: org, p_table_id: table_id, p_data: data },
|
|
2978
|
+
{ p_organization_id: org, p_table_id: table_id, p_data: { ...data, _op_id: mintOpId() } },
|
|
2913
2979
|
"recordWrite"
|
|
2914
2980
|
);
|
|
2915
2981
|
},
|
|
2916
2982
|
async recordWriteMany({ table_id, rows, ids }) {
|
|
2983
|
+
const opId = mintOpId();
|
|
2917
2984
|
return callDoor(
|
|
2918
2985
|
DOORS.recordWriteMany,
|
|
2919
2986
|
{
|
|
2920
2987
|
p_organization_id: org,
|
|
2921
2988
|
p_table_id: table_id,
|
|
2922
|
-
p_rows: rows,
|
|
2989
|
+
p_rows: rows.map((row) => ({ ...row, _op_id: opId })),
|
|
2923
2990
|
...ids === void 0 ? {} : { p_ids: ids }
|
|
2924
2991
|
},
|
|
2925
2992
|
"recordWriteMany"
|
|
@@ -2931,7 +2998,7 @@ function createRecordsClient(config) {
|
|
|
2931
2998
|
{
|
|
2932
2999
|
p_organization_id: org,
|
|
2933
3000
|
p_record_id: record_id,
|
|
2934
|
-
p_patch: patch,
|
|
3001
|
+
p_patch: { ...patch, _op_id: mintOpId() },
|
|
2935
3002
|
...expectedVersion === void 0 ? {} : { p_expected_version: expectedVersion }
|
|
2936
3003
|
},
|
|
2937
3004
|
"recordUpdate"
|
|
@@ -2973,6 +3040,21 @@ function createRecordsClient(config) {
|
|
|
2973
3040
|
}
|
|
2974
3041
|
return ok({ record_id, document, hidden, computed, computedUnavailable });
|
|
2975
3042
|
},
|
|
3043
|
+
async listByIds({ table_id, ids }) {
|
|
3044
|
+
if (ids.length === 0) return ok([]);
|
|
3045
|
+
const door = await callDoor(
|
|
3046
|
+
DOORS.readRecordsByIds,
|
|
3047
|
+
{ p_organization_id: org, p_table_id: table_id, p_record_ids: ids },
|
|
3048
|
+
"listByIds"
|
|
3049
|
+
);
|
|
3050
|
+
if (!door.ok) return err(door.error);
|
|
3051
|
+
return ok(
|
|
3052
|
+
(door.data ?? []).map((row) => {
|
|
3053
|
+
const { document, hidden } = unfold(row.document);
|
|
3054
|
+
return { id: row.id, document, level: row.level, hidden };
|
|
3055
|
+
})
|
|
3056
|
+
);
|
|
3057
|
+
},
|
|
2976
3058
|
async list({ table_id, limit = 50, offset = 0 }) {
|
|
2977
3059
|
const door = await callDoor(
|
|
2978
3060
|
DOORS.readRecords,
|
|
@@ -3247,6 +3329,26 @@ function createRecordsClient(config) {
|
|
|
3247
3329
|
"fieldRetire"
|
|
3248
3330
|
);
|
|
3249
3331
|
},
|
|
3332
|
+
async relationWords({ field_id, value }) {
|
|
3333
|
+
return callDoor(
|
|
3334
|
+
DOORS.relationWords,
|
|
3335
|
+
{ p_organization_id: org, p_field_id: field_id, p_value: value },
|
|
3336
|
+
"relationWords"
|
|
3337
|
+
);
|
|
3338
|
+
},
|
|
3339
|
+
async relationWordsMany({ field_id, record_ids }) {
|
|
3340
|
+
const result = await callDoor(
|
|
3341
|
+
DOORS.relationWordsMany,
|
|
3342
|
+
{ p_organization_id: org, p_field_id: field_id, p_record_ids: record_ids },
|
|
3343
|
+
"relationWordsMany"
|
|
3344
|
+
);
|
|
3345
|
+
if (!result.ok) return result;
|
|
3346
|
+
const map = {};
|
|
3347
|
+
for (const row of result.data ?? []) {
|
|
3348
|
+
if (row?.record_id && typeof row.words === "string") map[row.record_id] = row.words;
|
|
3349
|
+
}
|
|
3350
|
+
return { ok: true, data: map };
|
|
3351
|
+
},
|
|
3250
3352
|
async tableDeclare({ spec, homeId }) {
|
|
3251
3353
|
return callDoor(
|
|
3252
3354
|
DOORS.tableDeclare,
|