@ai-matrx/records 0.98.8 → 0.98.9

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 (92) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/{table-kind-CboiMJuE.d.cts → client-9fzhCPD5.d.cts} +2771 -4
  3. package/dist/{table-kind-B4sdlvHf.d.ts → client-DcWZjmg2.d.ts} +2771 -4
  4. package/dist/core/index.cjs +100 -3
  5. package/dist/core/index.cjs.map +1 -1
  6. package/dist/core/index.d.cts +19 -17
  7. package/dist/core/index.d.ts +19 -17
  8. package/dist/core/index.js +100 -3
  9. package/dist/core/index.js.map +1 -1
  10. package/dist/data/index.cjs +52 -0
  11. package/dist/data/index.cjs.map +1 -1
  12. package/dist/data/index.d.cts +11 -12
  13. package/dist/data/index.d.ts +11 -12
  14. package/dist/data/index.js +52 -0
  15. package/dist/data/index.js.map +1 -1
  16. package/dist/{declareTable-BIuPJ3Vj.d.ts → declareTable-B6ic3leL.d.ts} +3 -4
  17. package/dist/{declareTable-d-HxRmF0.d.cts → declareTable-_GwN-ERY.d.cts} +3 -4
  18. package/dist/{doors-Bx3Shs3z.d.cts → doors-Dm5q9H8Y.d.cts} +1 -1
  19. package/dist/{doors-BTifsjNv.d.ts → doors-t-Oc2l9E.d.ts} +1 -1
  20. package/dist/entity/index.d.cts +7 -7
  21. package/dist/entity/index.d.ts +7 -7
  22. package/dist/{field-CJtssH3q.d.ts → field-BIRNApm1.d.ts} +2 -2
  23. package/dist/{field-DoVl2I9K.d.cts → field-BLy8drjM.d.cts} +2 -2
  24. package/dist/forms/index.d.cts +3 -3
  25. package/dist/forms/index.d.ts +3 -3
  26. package/dist/index.cjs +45 -0
  27. package/dist/index.cjs.map +1 -1
  28. package/dist/index.d.cts +30 -13
  29. package/dist/index.d.ts +30 -13
  30. package/dist/index.js +45 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/memory/index.d.cts +7 -7
  33. package/dist/memory/index.d.ts +7 -7
  34. package/dist/{objectOrganization-Crk9gJUM.d.ts → objectOrganization-D5Ytjah7.d.ts} +1 -1
  35. package/dist/{objectOrganization-CUa6jjhV.d.cts → objectOrganization-zgpoUAH1.d.cts} +1 -1
  36. package/dist/{port-CRP5g9l9.d.cts → port-B9glCG2h.d.cts} +3 -3
  37. package/dist/{port-CtnELAJQ.d.ts → port-C-p-_lAu.d.ts} +3 -3
  38. package/dist/{portal-DW5NGBT0.d.ts → portal-B9HCNPTc.d.ts} +2 -2
  39. package/dist/{portal-C4N9ByaY.d.cts → portal-C_LgvDeh.d.cts} +2 -2
  40. package/dist/{ports-WwHHNwge.d.ts → ports-BE_5jz-c.d.ts} +2 -2
  41. package/dist/{ports-YIh9jrCZ.d.cts → ports-BIdYUS-C.d.cts} +2 -2
  42. package/dist/questions/index.d.cts +9 -10
  43. package/dist/questions/index.d.ts +9 -10
  44. package/dist/react/index.cjs +97 -0
  45. package/dist/react/index.cjs.map +1 -1
  46. package/dist/react/index.d.cts +86 -1
  47. package/dist/react/index.d.ts +86 -1
  48. package/dist/react/index.js +97 -0
  49. package/dist/react/index.js.map +1 -1
  50. package/dist/realtime/index.d.cts +3 -3
  51. package/dist/realtime/index.d.ts +3 -3
  52. package/dist/{record-CxGK1OEK.d.cts → record-BrJNCmH1.d.cts} +1 -1
  53. package/dist/{record-CxGK1OEK.d.ts → record-BrJNCmH1.d.ts} +1 -1
  54. package/dist/{relation-Dh-lCkkh.d.ts → relation-BxGXLRaG.d.ts} +3 -3
  55. package/dist/{relation-DSGhM3tO.d.cts → relation-R10qQyQU.d.cts} +3 -3
  56. package/dist/{rule-DQpC7WqT.d.cts → rule-BGtYd6Pf.d.cts} +2 -2
  57. package/dist/{rule-xNwJF6Qo.d.ts → rule-BtjrE42J.d.ts} +2 -2
  58. package/dist/scopes/index.d.cts +3 -3
  59. package/dist/scopes/index.d.ts +3 -3
  60. package/dist/search/index.d.cts +1 -1
  61. package/dist/search/index.d.ts +1 -1
  62. package/dist/setup/index.cjs +52 -0
  63. package/dist/setup/index.cjs.map +1 -1
  64. package/dist/setup/index.d.cts +12 -13
  65. package/dist/setup/index.d.ts +12 -13
  66. package/dist/setup/index.js +52 -0
  67. package/dist/setup/index.js.map +1 -1
  68. package/dist/{subscription-BVCn1PVe.d.cts → subscription-BEM4B4dR.d.cts} +3 -3
  69. package/dist/{subscription-DQzPVKBR.d.ts → subscription-Ca15Z7Gu.d.ts} +3 -3
  70. package/dist/templates/index.d.cts +10 -10
  71. package/dist/templates/index.d.ts +10 -10
  72. package/dist/typed-table/index.cjs +52 -0
  73. package/dist/typed-table/index.cjs.map +1 -1
  74. package/dist/typed-table/index.d.cts +10 -11
  75. package/dist/typed-table/index.d.ts +10 -11
  76. package/dist/typed-table/index.js +52 -0
  77. package/dist/typed-table/index.js.map +1 -1
  78. package/dist/{types-3lM5f6b0.d.cts → types-5ql9_q-o.d.cts} +2 -2
  79. package/dist/{types-04kFNi3-.d.ts → types-BALEbMc8.d.ts} +2 -2
  80. package/dist/{types-DKJO83lQ.d.cts → types-BhnjvJ8U.d.cts} +2 -2
  81. package/dist/{types-SUAmeBId.d.ts → types-CURw95qc.d.ts} +2 -2
  82. package/dist/{types-DKeGkHpE.d.cts → types-DRMeL0uW.d.cts} +2 -2
  83. package/dist/{types-DJVccwh0.d.ts → types-_odOqLOe.d.ts} +2 -2
  84. package/dist/use-cases/index.d.cts +5 -5
  85. package/dist/use-cases/index.d.ts +5 -5
  86. package/dist/{validate-BIJtP2KB.d.cts → validate-Cdtk0y18.d.cts} +1 -1
  87. package/dist/{validate--y-pPc-c.d.ts → validate-ChibJPPI.d.ts} +1 -1
  88. package/dist/views/index.d.cts +9 -10
  89. package/dist/views/index.d.ts +9 -10
  90. package/package.json +3 -3
  91. package/dist/client-C1B-MNzb.d.ts +0 -2704
  92. package/dist/client-D2jAgJNn.d.cts +0 -2704
@@ -119,6 +119,7 @@ __export(core_exports, {
119
119
  addressMapUrl: () => addressMapUrl,
120
120
  addressText: () => addressText,
121
121
  allowsOtherValues: () => allowsOtherValues,
122
+ alternatePatch: () => alternatePatch,
122
123
  announceRecordChanged: () => announceRecordChanged,
123
124
  announceTableStructureChanged: () => announceTableStructureChanged,
124
125
  archivedByLine: () => archivedByLine,
@@ -143,6 +144,7 @@ __export(core_exports, {
143
144
  choiceSlug: () => choiceSlug,
144
145
  choiceValuesOf: () => choiceValuesOf,
145
146
  choicesOf: () => choicesOf,
147
+ chooseAlternate: () => chooseAlternate,
146
148
  coerceTypedAnswer: () => coerceTypedAnswer,
147
149
  coerceTypedAnswers: () => coerceTypedAnswers,
148
150
  coercionLabel: () => coercionLabel,
@@ -5457,6 +5459,49 @@ function tableRenderSchema(facts) {
5457
5459
  return { kind: slug, fields: out };
5458
5460
  }
5459
5461
 
5462
+ // src/alternates.ts
5463
+ function refuse(code, message, hint) {
5464
+ return { ok: false, error: { code, message, hint, ours: true } };
5465
+ }
5466
+ function alternatePatch(document, field_key, alternate_index) {
5467
+ const block = document._values ?? {};
5468
+ const envelope = block[field_key];
5469
+ const alternates = Array.isArray(envelope?.alternates) ? envelope.alternates : [];
5470
+ const chosen = alternates[alternate_index];
5471
+ if (!envelope || !chosen) return { ok: false, message: "That other value is no longer on this record." };
5472
+ const kept = alternates.filter((_, i) => i !== alternate_index);
5473
+ const current = document[field_key];
5474
+ const next = [...kept];
5475
+ if (current !== null && current !== void 0) {
5476
+ const taken = new Set(kept.map((a) => a.rank));
5477
+ let rank = 1;
5478
+ while (taken.has(rank)) rank += 1;
5479
+ next.push({ value: current, ...envelope.src ? { src: envelope.src } : {}, rank });
5480
+ }
5481
+ const { ver: _ver, actor: _actor, at: _at, on_behalf_of: _on, absent: _absent, alternates: _alts, src: _src, ...rest } = envelope;
5482
+ const changed = { ...rest, ...chosen.src ? { src: chosen.src } : {} };
5483
+ if (next.length > 0) changed["alternates"] = next;
5484
+ return {
5485
+ ok: true,
5486
+ patch: {
5487
+ [field_key]: chosen.value,
5488
+ // THE WHOLE BLOCK — every other field's envelope and alternates travel with it.
5489
+ _values: { ...block, [field_key]: changed }
5490
+ }
5491
+ };
5492
+ }
5493
+ async function chooseAlternate(client, { record_id, field_key, alternate_index }) {
5494
+ const read = await client.recordRead({ record_id, withVersion: true });
5495
+ if (!read.ok) return read;
5496
+ const version = read.data.version;
5497
+ if (version === null || version === void 0) {
5498
+ return refuse("stale_read", "Nothing was saved: this record's latest changes could not be checked.", "Reload, then try again.");
5499
+ }
5500
+ const built = alternatePatch(read.data.document, field_key, alternate_index);
5501
+ if (!built.ok) return refuse("not_found", built.message, "Reload, then look again.");
5502
+ return client.recordUpdate({ record_id, patch: built.patch, expectedVersion: version });
5503
+ }
5504
+
5460
5505
  // src/core/primedBundle.ts
5461
5506
  var PRIMED_TTL_MS = 15e3;
5462
5507
  var REGISTRY = /* @__PURE__ */ Symbol.for("@ai-matrx/records/primed-table-page-bundles");
@@ -6491,6 +6536,14 @@ var DOORS = {
6491
6536
  // archived and aliased), and put any recorded Migration back.
6492
6537
  migrateMerge: "migrate_merge",
6493
6538
  migrateUndo: "migrate_undo",
6539
+ // CORE-VISION (2026-10-10): the structural Migrations a person runs on ONE record from its menu.
6540
+ // Split moves the named values to a new record of the same Table (the original keeps its id);
6541
+ // extract parent copies the named values up into a new record of another Table and puts this
6542
+ // record under it. Both answer a `migration_id` that `migrateUndo` takes. `migrations` lists
6543
+ // the Migration log for one target, newest first.
6544
+ migrateSplit: "migrate_split",
6545
+ migrateExtractParent: "migrate_extract_parent",
6546
+ migrations: "migrations",
6494
6547
  recordValues: "record_values",
6495
6548
  recordValuesVersioned: "record_values_versioned",
6496
6549
  valueRead: "value_read",
@@ -7045,7 +7098,7 @@ function doorCensus() {
7045
7098
  }
7046
7099
 
7047
7100
  // src/core/supabase.ts
7048
- function refuse(code, message, hint) {
7101
+ function refuse2(code, message, hint) {
7049
7102
  return { data: null, error: { code, message, hint, details: "" } };
7050
7103
  }
7051
7104
  function supabaseDataSource(client) {
@@ -7058,7 +7111,7 @@ function supabaseDataSource(client) {
7058
7111
  rpc(fn, args, options) {
7059
7112
  if (!hasSchema) {
7060
7113
  return Promise.resolve(
7061
- refuse(
7114
+ refuse2(
7062
7115
  "data_source_unbound",
7063
7116
  `The records client was given something that is not a supabase client: it has no schema() method, so the door ${fn} cannot be called in the schema it lives in.`,
7064
7117
  "Pass a supabase-js v2 client (createClient(...)) to supabaseDataSource()."
@@ -7068,7 +7121,7 @@ function supabaseDataSource(client) {
7068
7121
  const name = options?.schema;
7069
7122
  if (!name) {
7070
7123
  return Promise.resolve(
7071
- refuse(
7124
+ refuse2(
7072
7125
  "schema_unsaid",
7073
7126
  `The door ${fn} was called without saying which schema it lives in. Every door of this store is custom.${fn} and every trust door is iam.${fn}; an unqualified call reaches PostgREST's default profile (public) and is refused there.`,
7074
7127
  "This is a bug in the caller, not in your data: /core says the schema on every call."
@@ -8419,6 +8472,49 @@ function createRecordsClient(given) {
8419
8472
  }
8420
8473
  return result;
8421
8474
  },
8475
+ async migrateSplit({ record_id, moved_keys, note }) {
8476
+ const result = await callDoor(
8477
+ DOORS.migrateSplit,
8478
+ { p_organization_id: org, p_record_id: record_id, p_moved_keys: moved_keys, p_note: note ?? null },
8479
+ "migrateSplit"
8480
+ );
8481
+ if (result.ok) {
8482
+ announceRecordChanged(record_id);
8483
+ announceRecordChanged(result.data.new_record);
8484
+ }
8485
+ return result;
8486
+ },
8487
+ async migrateExtractParent({ record_id, parent_table_id, moved_keys, note }) {
8488
+ const result = await callDoor(
8489
+ DOORS.migrateExtractParent,
8490
+ { p_organization_id: org, p_id: record_id, p_parent_table_id: parent_table_id, p_moved_keys: moved_keys, p_note: note ?? null },
8491
+ "migrateExtractParent"
8492
+ );
8493
+ if (result.ok) {
8494
+ announceRecordChanged(record_id);
8495
+ announceRecordChanged(result.data.parent);
8496
+ }
8497
+ return result;
8498
+ },
8499
+ async migrations({ target_id, limit }) {
8500
+ return callDoor(
8501
+ DOORS.migrations,
8502
+ { p_organization_id: org, p_target_id: target_id ?? null, p_limit: limit ?? 100 },
8503
+ "migrations"
8504
+ );
8505
+ },
8506
+ async recordAsOf({ record_id, recorded_at, world_on }) {
8507
+ return callDoor(
8508
+ DOORS.queryRecordAsOf,
8509
+ {
8510
+ p_organization_id: org,
8511
+ p_record_id: record_id,
8512
+ ...recorded_at ? { p_recorded_at: recorded_at } : {},
8513
+ ...world_on ? { p_world_on: world_on.slice(0, 10) } : {}
8514
+ },
8515
+ "recordAsOf"
8516
+ );
8517
+ },
8422
8518
  async migrateUndo({ migration_id }) {
8423
8519
  const result = await callDoor(
8424
8520
  DOORS.migrateUndo,
@@ -8426,6 +8522,7 @@ function createRecordsClient(given) {
8426
8522
  "migrateUndo"
8427
8523
  );
8428
8524
  if (result.ok && result.data.record_id) announceRecordChanged(result.data.record_id);
8525
+ if (result.ok && result.data.removed) announceRecordChanged(result.data.removed);
8429
8526
  return result;
8430
8527
  },
8431
8528
  async fieldUpdate({ field_id, patch }) {