@ai-matrx/records 0.80.2 → 0.80.7

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.
Files changed (71) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +19 -0
  3. package/dist/app-table/index.cjs +100 -23
  4. package/dist/app-table/index.cjs.map +1 -1
  5. package/dist/app-table/index.d.cts +7 -7
  6. package/dist/app-table/index.d.ts +7 -7
  7. package/dist/app-table/index.js +100 -23
  8. package/dist/app-table/index.js.map +1 -1
  9. package/dist/{client-DKKRZKNw.d.ts → client-D1LTezMZ.d.ts} +10 -5
  10. package/dist/{client-BfNJEpar.d.cts → client-DLIKeBWF.d.cts} +10 -5
  11. package/dist/core/index.cjs +115 -31
  12. package/dist/core/index.cjs.map +1 -1
  13. package/dist/core/index.d.cts +22 -12
  14. package/dist/core/index.d.ts +22 -12
  15. package/dist/core/index.js +115 -31
  16. package/dist/core/index.js.map +1 -1
  17. package/dist/data/index.cjs +100 -23
  18. package/dist/data/index.cjs.map +1 -1
  19. package/dist/data/index.d.cts +7 -7
  20. package/dist/data/index.d.ts +7 -7
  21. package/dist/data/index.js +100 -23
  22. package/dist/data/index.js.map +1 -1
  23. package/dist/{declareTable-CzLMdOSy.d.cts → declareTable-02uao-5n.d.cts} +4 -4
  24. package/dist/{declareTable-Cg522Sk0.d.ts → declareTable-C5FlIS0z.d.ts} +4 -4
  25. package/dist/{field-DJAvDExi.d.ts → field-BIJiFPc0.d.ts} +1 -1
  26. package/dist/{field-DCXU6k9i.d.cts → field-snQG2jMq.d.cts} +1 -1
  27. package/dist/index.cjs +12 -0
  28. package/dist/index.cjs.map +1 -1
  29. package/dist/index.d.cts +7 -7
  30. package/dist/index.d.ts +7 -7
  31. package/dist/index.js +12 -0
  32. package/dist/index.js.map +1 -1
  33. package/dist/memory/index.cjs +5 -0
  34. package/dist/memory/index.cjs.map +1 -1
  35. package/dist/memory/index.d.cts +6 -6
  36. package/dist/memory/index.d.ts +6 -6
  37. package/dist/memory/index.js +5 -0
  38. package/dist/memory/index.js.map +1 -1
  39. package/dist/{ports-Kpc-RihV.d.ts → ports-Y5gLbCXe.d.ts} +1 -1
  40. package/dist/{ports-DaHUjVg7.d.cts → ports-y1QNfM80.d.cts} +1 -1
  41. package/dist/react/index.cjs +107 -27
  42. package/dist/react/index.cjs.map +1 -1
  43. package/dist/react/index.d.cts +31 -1
  44. package/dist/react/index.d.ts +31 -1
  45. package/dist/react/index.js +107 -27
  46. package/dist/react/index.js.map +1 -1
  47. package/dist/realtime/index.d.cts +2 -2
  48. package/dist/realtime/index.d.ts +2 -2
  49. package/dist/{record-DCaOJbhA.d.cts → record-1yDCn169.d.cts} +26 -1
  50. package/dist/{record-DCaOJbhA.d.ts → record-1yDCn169.d.ts} +26 -1
  51. package/dist/{subscription-C_hNjbaR.d.cts → subscription-B_WaT-kr.d.cts} +1 -1
  52. package/dist/{subscription-B9znK2dw.d.ts → subscription-CUok1vAm.d.ts} +1 -1
  53. package/dist/{table-kind-B9RBUmSb.d.ts → table-kind-COmkYYkc.d.ts} +3 -3
  54. package/dist/{table-kind-DXktQGzR.d.cts → table-kind-LodkBhCZ.d.cts} +3 -3
  55. package/dist/templates/index.cjs +70 -6
  56. package/dist/templates/index.cjs.map +1 -1
  57. package/dist/templates/index.d.cts +26 -10
  58. package/dist/templates/index.d.ts +26 -10
  59. package/dist/templates/index.js +70 -6
  60. package/dist/templates/index.js.map +1 -1
  61. package/dist/{types-DuyBN2im.d.cts → types-BJGTxu3Y.d.cts} +2 -2
  62. package/dist/{types-b-VGi15H.d.ts → types-C5-AaPa6.d.ts} +2 -2
  63. package/dist/{types-CHEFgCu1.d.ts → types-CU_Tn2Np.d.ts} +2 -2
  64. package/dist/{types-CD2HoaZt.d.cts → types-yBZLtxrZ.d.cts} +2 -2
  65. package/dist/use-cases/index.cjs.map +1 -1
  66. package/dist/use-cases/index.d.cts +5 -5
  67. package/dist/use-cases/index.d.ts +5 -5
  68. package/dist/use-cases/index.js.map +1 -1
  69. package/dist/{validate-CubFFxpu.d.cts → validate-CE6qpJIb.d.cts} +1 -1
  70. package/dist/{validate-BEfYwBpA.d.ts → validate-Rz9djP6H.d.ts} +1 -1
  71. package/package.json +1 -1
@@ -1,10 +1,10 @@
1
- import { N as NewFieldSpec } from '../declareTable-CzLMdOSy.cjs';
2
- import { U as Uuid, h as RecordsResult, n as RecordPageSort } from '../record-DCaOJbhA.cjs';
3
- import { R as RecordsClient } from '../client-BfNJEpar.cjs';
4
- import { F as FieldDrift, T as TableArchiveProgress } from '../table-kind-DXktQGzR.cjs';
5
- import '../field-DCXU6k9i.cjs';
6
- import '../subscription-C_hNjbaR.cjs';
7
- import '../ports-DaHUjVg7.cjs';
1
+ import { N as NewFieldSpec } from '../declareTable-02uao-5n.cjs';
2
+ import { U as Uuid, h as RecordsResult, n as RecordPageSort } from '../record-1yDCn169.cjs';
3
+ import { R as RecordsClient } from '../client-DLIKeBWF.cjs';
4
+ import { F as FieldDrift, T as TableArchiveProgress } from '../table-kind-LodkBhCZ.cjs';
5
+ import '../field-snQG2jMq.cjs';
6
+ import '../subscription-B_WaT-kr.cjs';
7
+ import '../ports-y1QNfM80.cjs';
8
8
 
9
9
  /** Where a declared field's value goes in the graduated table. */
10
10
  declare const TO_CUSTOM_FIELDS: "custom_fields";
@@ -1,10 +1,10 @@
1
- import { N as NewFieldSpec } from '../declareTable-Cg522Sk0.js';
2
- import { U as Uuid, h as RecordsResult, n as RecordPageSort } from '../record-DCaOJbhA.js';
3
- import { R as RecordsClient } from '../client-DKKRZKNw.js';
4
- import { F as FieldDrift, T as TableArchiveProgress } from '../table-kind-B9RBUmSb.js';
5
- import '../field-DJAvDExi.js';
6
- import '../subscription-B9znK2dw.js';
7
- import '../ports-Kpc-RihV.js';
1
+ import { N as NewFieldSpec } from '../declareTable-C5FlIS0z.js';
2
+ import { U as Uuid, h as RecordsResult, n as RecordPageSort } from '../record-1yDCn169.js';
3
+ import { R as RecordsClient } from '../client-D1LTezMZ.js';
4
+ import { F as FieldDrift, T as TableArchiveProgress } from '../table-kind-COmkYYkc.js';
5
+ import '../field-BIJiFPc0.js';
6
+ import '../subscription-CUok1vAm.js';
7
+ import '../ports-Y5gLbCXe.js';
8
8
 
9
9
  /** Where a declared field's value goes in the graduated table. */
10
10
  declare const TO_CUSTOM_FIELDS: "custom_fields";
@@ -377,6 +377,32 @@ function takePrimedTablePageBundle(organizationId, tableId, viewId) {
377
377
  return Date.now() - held.at < PRIMED_TTL_MS ? held.answer : null;
378
378
  }
379
379
 
380
+ // src/core/recordChanges.ts
381
+ var listeners = /* @__PURE__ */ new Set();
382
+ function announceRecordChanged(recordId) {
383
+ for (const listener of [...listeners]) {
384
+ try {
385
+ listener(recordId);
386
+ } catch (thrown) {
387
+ console.error("[@ai-matrx/records] a record-change listener threw", thrown);
388
+ }
389
+ }
390
+ }
391
+ function onRecordChanged(listener) {
392
+ listeners.add(listener);
393
+ return () => listeners.delete(listener);
394
+ }
395
+ var tableListeners = /* @__PURE__ */ new Set();
396
+ function announceTableStructureChanged(tableId) {
397
+ for (const listener of [...tableListeners]) {
398
+ try {
399
+ listener(tableId);
400
+ } catch (thrown) {
401
+ console.error("[@ai-matrx/records] a table-structure listener threw", thrown);
402
+ }
403
+ }
404
+ }
405
+
380
406
  // src/archive.ts
381
407
  var DEFAULT_ARCHIVE_LANE = "org";
382
408
 
@@ -1222,21 +1248,25 @@ var STORE_DOORS = [
1222
1248
  { name: "form_declare", args: "p_organization_id uuid, p_table_id uuid, p_title text, p_questions jsonb, p_presentation jsonb DEFAULT '{}'::jsonb, p_submission_cap integer DEFAULT NULL::integer, p_quarantine_rule_id uuid DEFAULT NULL::uuid, p_notify_rule_id uuid DEFAULT NULL::uuid, p_form_id uuid DEFAULT NULL::uuid, p_slug text DEFAULT NULL::text", returns: "uuid", security: "definer" },
1223
1249
  { name: "form_draft_read", args: "p_form_id uuid, p_secret text", returns: "TABLE(answers jsonb, saved_at timestamp with time zone, expires_at timestamp with time zone, state text, message text)", security: "definer" },
1224
1250
  { name: "form_draft_save", args: "p_form_id uuid, p_answers jsonb, p_secret text DEFAULT NULL::text, p_bucket text DEFAULT NULL::text, p_origin text DEFAULT NULL::text", returns: "TABLE(draft_secret text, saved_at timestamp with time zone, expires_at timestamp with time zone, state text, message text)", security: "definer" },
1251
+ { name: "form_knobs", args: "p_organization_id uuid", returns: "jsonb", security: "definer" },
1225
1252
  { name: "form_look_options", args: "p_organization_id uuid, p_presentation jsonb DEFAULT '{}'::jsonb", returns: "jsonb", security: "definer" },
1226
1253
  { name: "form_notify", args: "p_organization_id uuid, p_form_id uuid, p_record_id uuid, p_submission_id uuid", returns: "uuid", security: "invoker" },
1227
1254
  { name: "form_preview_asks", args: "p_organization_id uuid, p_table_id uuid, p_questions jsonb, p_values jsonb", returns: "TABLE(field_key text, asked boolean, decided boolean, said text)", security: "definer" },
1228
1255
  { name: "form_preview_route", args: "p_organization_id uuid, p_table_id uuid, p_questions jsonb, p_endings jsonb, p_values jsonb", returns: "jsonb", security: "definer" },
1229
1256
  { name: "form_public", args: "p_form_id uuid", returns: "TABLE(form_id uuid, organization_id uuid, table_id uuid, title text, presentation jsonb, fields jsonb, honeypot_key text, state text, message text)", security: "definer" },
1230
1257
  { name: "form_public_asks", args: "p_form_id uuid, p_values jsonb, p_secret text DEFAULT NULL::text, p_origin text DEFAULT NULL::text", returns: "TABLE(field_key text, asked boolean, decided boolean, said text)", security: "definer" },
1258
+ { name: "form_public_options", args: "p_form_id uuid", returns: "jsonb", security: "definer" },
1231
1259
  { name: "form_public_route", args: "p_form_id uuid, p_values jsonb", returns: "jsonb", security: "definer" },
1232
1260
  { name: "form_redirect_domains", args: "p_organization_id uuid", returns: "text[]", security: "invoker" },
1233
1261
  { name: "form_redirect_refusal", args: "p_organization_id uuid, p_url text", returns: "text", security: "invoker" },
1262
+ { name: "form_respondent_copy", args: "p_organization_id uuid, p_form_id uuid, p_record_id uuid, p_submission_id uuid", returns: "jsonb", security: "definer" },
1234
1263
  { name: "form_restore", args: "p_organization_id uuid, p_form_id uuid", returns: "jsonb", security: "definer" },
1235
1264
  { name: "form_results", args: "p_organization_id uuid, p_form_id uuid", returns: "jsonb", security: "definer" },
1236
1265
  { name: "form_slug", args: "p_organization_id uuid, p_title text, p_form_id uuid DEFAULT NULL::uuid", returns: "text", security: "invoker" },
1237
1266
  { name: "form_submit", args: "p_form_id uuid, p_origin text, p_payload jsonb, p_bucket text, p_honeypot text DEFAULT NULL::text, p_client_key text DEFAULT NULL::text", returns: "TABLE(submission_id uuid, record_id uuid, state text, message text)", security: "definer" },
1238
1267
  { name: "form_theme_options", args: "", returns: "jsonb", security: "invoker" },
1239
1268
  { name: "form_visit", args: "p_form_id uuid, p_visit text, p_event text, p_field text DEFAULT NULL::text", returns: "text", security: "definer" },
1269
+ { name: "form_visit_admit", args: "p_form_id uuid, p_bucket text", returns: "boolean", security: "definer" },
1240
1270
  { name: "forms", args: "p_organization_id uuid, p_table_id uuid DEFAULT NULL::uuid", returns: "TABLE(form_id uuid, table_id uuid, title text, slug text, published_at timestamp with time zone, closed_at timestamp with time zone, submission_cap integer, responses bigint, in_table bigint, held bigint, rejected bigint, state text, quarantine_rule_id uuid, notify_rule_id uuid, presentation jsonb)", security: "definer" },
1241
1271
  { name: "forms_archived", args: "p_organization_id uuid, p_table_id uuid DEFAULT NULL::uuid, p_limit integer DEFAULT 100", returns: "TABLE(form_id uuid, table_id uuid, table_name text, kind text, title text, slug text, archived_at timestamp with time zone, archived_by uuid, table_archived boolean, can_restore boolean)", security: "definer" },
1242
1272
  { name: "formula_compile_sql", args: "p_organization_id uuid, p_expr jsonb, p_values_sql text", returns: "text", security: "invoker" },
@@ -1504,6 +1534,7 @@ var STORE_DOORS = [
1504
1534
  { name: "record_filter_sql", args: "p_organization_id uuid, p_table_id uuid, p_filter jsonb", returns: "text", security: "invoker" },
1505
1535
  { name: "record_headers", args: "p_organization_id uuid, p_ids uuid[]", returns: "TABLE(id uuid, table_id uuid, created_at timestamp with time zone, updated_at timestamp with time zone, version integer, deleted_at timestamp with time zone, mine boolean, created_by uuid)", security: "definer" },
1506
1536
  { 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" },
1537
+ { name: "record_page_bundle", args: "p_organization_id uuid, p_record_id uuid", returns: "jsonb", security: "invoker" },
1507
1538
  { name: "record_platform_keys", args: "", returns: "text[]", security: "invoker" },
1508
1539
  { 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" },
1509
1540
  { name: "record_reparent", args: "p_organization_id uuid, p_record_id uuid, p_parent_id uuid", returns: "void", security: "definer" },
@@ -2169,6 +2200,7 @@ var DOORS = {
2169
2200
  formPreviewRoute: "form_preview_route",
2170
2201
  /** TYPEFORM-DUP: views, starts, completions, drop-off and answers per question. */
2171
2202
  formResults: "form_results",
2203
+ formKnobs: "form_knobs",
2172
2204
  formLookOptions: "form_look_options",
2173
2205
  // PRODUCTS row 14 — "let clients book a 30-minute consult". A booking page IS an
2174
2206
  // `anon_form`, so it is opened and closed by `anonPublish` like any other; this is
@@ -2600,28 +2632,6 @@ var DRILL_DOORS = {
2600
2632
  rows: "drill_rows"
2601
2633
  };
2602
2634
 
2603
- // src/core/recordChanges.ts
2604
- var listeners = /* @__PURE__ */ new Set();
2605
- function announceRecordChanged(recordId) {
2606
- for (const listener of [...listeners]) {
2607
- try {
2608
- listener(recordId);
2609
- } catch (thrown) {
2610
- console.error("[@ai-matrx/records] a record-change listener threw", thrown);
2611
- }
2612
- }
2613
- }
2614
- var tableListeners = /* @__PURE__ */ new Set();
2615
- function announceTableStructureChanged(tableId) {
2616
- for (const listener of [...tableListeners]) {
2617
- try {
2618
- listener(tableId);
2619
- } catch (thrown) {
2620
- console.error("[@ai-matrx/records] a table-structure listener threw", thrown);
2621
- }
2622
- }
2623
- }
2624
-
2625
2635
  // src/core/query.ts
2626
2636
  var DEFAULT_PAGE_SIZE = 50;
2627
2637
  function planQuery(query) {
@@ -2741,8 +2751,68 @@ function createRecordsClient(given) {
2741
2751
  } catch {
2742
2752
  }
2743
2753
  }
2754
+ const RECORD_OPENERS = /* @__PURE__ */ new Set(["read_record", "record_row_controls", "record_history", "comment_thread", "computed_provenance"]);
2755
+ const recordFlights = /* @__PURE__ */ new Map();
2756
+ const recordAsked = /* @__PURE__ */ new Map();
2757
+ let recordChangesHeard = false;
2758
+ function bundleRecordOf(door, args) {
2759
+ if (RECORD_OPENERS.has(door)) return typeof args["p_record_id"] === "string" ? args["p_record_id"] : null;
2760
+ const ids = args["p_ids"];
2761
+ const one = Array.isArray(ids) && ids.length === 1 && typeof ids[0] === "string" ? ids[0] : null;
2762
+ if (door === "record_headers") return one;
2763
+ if (door === "my_levels" && args["p_type"] === "record") return one;
2764
+ return null;
2765
+ }
2766
+ async function fillRecordBundle(recordId) {
2767
+ if (!recordChangesHeard) {
2768
+ recordChangesHeard = true;
2769
+ onRecordChanged((changed) => {
2770
+ recordAsked.delete(changed);
2771
+ for (const key of [...bundleParts.keys()]) if (key.includes(changed)) bundleParts.delete(key);
2772
+ });
2773
+ }
2774
+ try {
2775
+ const usable = (r) => r !== null && !r.error && r.data !== null && typeof r.data === "object" && Array.isArray(r.data.parts);
2776
+ const primedAnswer = takePrimedTablePageBundle(org, `record:${recordId}`, null);
2777
+ let response = primedAnswer ? await primedAnswer : null;
2778
+ if (!usable(response)) {
2779
+ response = await config.dataSource.rpc("record_page_bundle", { p_organization_id: org, p_record_id: recordId }, { schema });
2780
+ }
2781
+ if (!usable(response)) return;
2782
+ const now = Date.now();
2783
+ for (const part of response.data.parts) {
2784
+ if (part.error !== void 0 || part.data === void 0) continue;
2785
+ bundleParts.set(bundleKey(part.door, part.args), { data: part.data, at: now });
2786
+ }
2787
+ } catch {
2788
+ }
2789
+ }
2790
+ async function fromRecordBundle(door, args) {
2791
+ if (!doorReady(config, "record_page_bundle")) return void 0;
2792
+ const recordId = bundleRecordOf(door, args);
2793
+ if (!recordId) return void 0;
2794
+ const opener = RECORD_OPENERS.has(door);
2795
+ if (!opener && !recordFlights.has(recordId) && !recordAsked.has(recordId)) return void 0;
2796
+ const asked = recordAsked.get(recordId);
2797
+ const fresh = asked !== void 0 && Date.now() - asked < BUNDLE_TTL_MS;
2798
+ if (!fresh && opener) {
2799
+ recordAsked.set(recordId, Date.now());
2800
+ const flight2 = fillRecordBundle(recordId).finally(() => recordFlights.delete(recordId));
2801
+ recordFlights.set(recordId, flight2);
2802
+ }
2803
+ const flight = recordFlights.get(recordId);
2804
+ if (flight) await flight;
2805
+ const key = bundleKey(door, args);
2806
+ const held = bundleParts.get(key);
2807
+ if (!held) return opener ? null : void 0;
2808
+ bundleParts.delete(key);
2809
+ return Date.now() - held.at < BUNDLE_TTL_MS ? { data: held.data } : null;
2810
+ }
2744
2811
  async function fromBundle(door, args) {
2745
- if (!config.dataSource.opensInOneCall || !doorReady(config, "table_page_bundle")) return null;
2812
+ if (!config.dataSource.opensInOneCall) return null;
2813
+ const fromRecord = await fromRecordBundle(door, args);
2814
+ if (fromRecord !== void 0) return fromRecord;
2815
+ if (!doorReady(config, "table_page_bundle")) return null;
2746
2816
  const tableId = bundleTableOf(door, args);
2747
2817
  if (tableId) {
2748
2818
  const asked = bundleAsked.get(tableId);
@@ -4187,6 +4257,13 @@ function createRecordsClient(given) {
4187
4257
  "formResults"
4188
4258
  );
4189
4259
  },
4260
+ async formKnobs() {
4261
+ return callDoor(
4262
+ DOORS.formKnobs,
4263
+ { p_organization_id: org },
4264
+ "formKnobs"
4265
+ );
4266
+ },
4190
4267
  async formLookOptions(args) {
4191
4268
  return callDoor(
4192
4269
  DOORS.formLookOptions,