@ai-matrx/records 0.84.1 → 0.84.3

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.
@@ -281,6 +281,7 @@ __export(react_exports, {
281
281
  useRowActions: () => useRowActions,
282
282
  useSeededAggregate: () => useSeededAggregate,
283
283
  useSeededAnswer: () => useSeededAnswer,
284
+ useSeededAnswerAt: () => useSeededAnswerAt,
284
285
  useSeededSource: () => useSeededSource,
285
286
  useStoreTable: () => useStoreTable,
286
287
  useTable: () => useTable,
@@ -321,6 +322,40 @@ function takePrimedTablePageBundle(organizationId, tableId, viewId) {
321
322
  function primeRecordPageBundle(input) {
322
323
  primeTablePageBundle({ organizationId: input.organizationId, tableId: `record:${input.recordId}`, answer: input.answer });
323
324
  }
325
+ var DOOR_REGISTRY = /* @__PURE__ */ Symbol.for("@ai-matrx/records/primed-door-answers");
326
+ function doorRegistry() {
327
+ const g = globalThis;
328
+ return g[DOOR_REGISTRY] ??= /* @__PURE__ */ new Map();
329
+ }
330
+ var PRIMED_DOOR_TTL_MS = 1e4;
331
+ function primeDoorAnswer(key, data, at) {
332
+ doorRegistry().set(key, { data, at });
333
+ }
334
+ function takePrimedDoorAnswer(key) {
335
+ const registry2 = doorRegistry();
336
+ const held = registry2.get(key);
337
+ if (!held) return null;
338
+ if (Date.now() - held.at < PRIMED_DOOR_TTL_MS) return { data: held.data };
339
+ registry2.delete(key);
340
+ return null;
341
+ }
342
+ function dropPrimedDoorAnswers(doors) {
343
+ const registry2 = doorRegistry();
344
+ if (!doors) {
345
+ registry2.clear();
346
+ return;
347
+ }
348
+ for (const key of [...registry2.keys()]) if (doors.some((door) => key.startsWith(`${door}|`))) registry2.delete(key);
349
+ }
350
+ var LOOK_WRITES = {
351
+ view_declare: ["views", "view_look_read", "grid_layout", "table_page_bundle"],
352
+ view_designate: ["views", "view_look_read", "grid_layout", "table_page_bundle"],
353
+ view_look_set: ["views", "view_look_read", "grid_layout", "table_page_bundle"],
354
+ view_record_order_set: ["views", "view_look_read", "grid_layout", "table_page_bundle"]
355
+ };
356
+ function isWritingDoor(door) {
357
+ return /(_declare|_set(_|$)|_update|_write|_delete|_restore|_archive|_upsert|_reparent|_change|_duplicate|_move|_decide|_run$|_submit|_publish|_import_|_start$|_complete|_sign$|_add$|_retire|_propose|_promote|_land$|_pin$|_mute|_snooze|_unsnooze|_clear|_unclear|_revoke|_issue|_bind|_unbind|_apply|_backfill|_sync$|_decorate|_designate|_ensure|^migrate_|^home_add|^capture_|^claim_|^record_stage|^anon_|^io_import_|^io_comment_resolve|^enrich_(declare|land|pin)|^field_(declare|duplicate|propose|restore|retire|update)|^table_(declare|ensure|from_example|move|sync)|^value_restore|^relation_own)/.test(door);
358
+ }
324
359
 
325
360
  // src/core/recordChanges.ts
326
361
  var listeners = /* @__PURE__ */ new Set();
@@ -4518,7 +4553,21 @@ function createRecordsClient(given) {
4518
4553
  bundleAsked.delete(tableId);
4519
4554
  for (const key of [...bundleParts.keys()]) if (key.includes(tableId)) bundleParts.delete(key);
4520
4555
  }
4556
+ function primedFor(door, args) {
4557
+ const look = LOOK_WRITES[door];
4558
+ if (look) {
4559
+ dropPrimedDoorAnswers(look);
4560
+ return null;
4561
+ }
4562
+ if (isWritingDoor(door)) {
4563
+ dropPrimedDoorAnswers();
4564
+ return null;
4565
+ }
4566
+ return takePrimedDoorAnswer(`${door}|${canonicalArgs(args)}`);
4567
+ }
4521
4568
  async function callDoor(door, args, where) {
4569
+ const primed = primedFor(door, args);
4570
+ if (primed) return ok(primed.data);
4522
4571
  const bundled = await fromBundle(door, args);
4523
4572
  if (bundled) return ok(bundled.data);
4524
4573
  if (!doorReady(config, door)) {
@@ -4543,6 +4592,8 @@ function createRecordsClient(given) {
4543
4592
  }
4544
4593
  async function owedDoor(door, args, where) {
4545
4594
  if (doorExists(door)) return callDoor(door, args, where);
4595
+ const primed = primedFor(door, args);
4596
+ if (primed) return ok(primed.data);
4546
4597
  const response = await config.dataSource.rpc(door, args, { schema });
4547
4598
  if (response.error) {
4548
4599
  const code = response.error.code;
@@ -4608,6 +4659,8 @@ function createRecordsClient(given) {
4608
4659
  return ok(response.data);
4609
4660
  }
4610
4661
  async function drillDoor(door, args, where) {
4662
+ const primed = primedFor(door, args);
4663
+ if (primed) return ok(primed.data);
4611
4664
  const response = await config.dataSource.rpc(door, args, { schema: DRILL_SCHEMA });
4612
4665
  if (response.error) {
4613
4666
  const refusal3 = mapPgError(response.error, where);
@@ -8152,6 +8205,7 @@ function storeFor(seed) {
8152
8205
  };
8153
8206
  stores.set(seed, store);
8154
8207
  if (typeof window !== "undefined") {
8208
+ for (const [key, data] of index) primeDoorAnswer(key, data, typeof seed.at === "number" ? seed.at : Date.now());
8155
8209
  for (const a of seed.answers) {
8156
8210
  const org = a.args["p_organization_id"];
8157
8211
  if (typeof org !== "string") continue;
@@ -8255,11 +8309,14 @@ function useAsync(run, key, live) {
8255
8309
  return { ...shown, reload, setData };
8256
8310
  }
8257
8311
  function useSeededAnswer(key, run) {
8312
+ return useSeededAnswerAt(key, run)?.data;
8313
+ }
8314
+ function useSeededAnswerAt(key, run) {
8258
8315
  const client = useRecordsClient();
8259
8316
  const seed = useSeedStore();
8260
8317
  if (!seed || key === null) return void 0;
8261
8318
  const outcome = (0, import_react4.use)(seed.run(`${identityOf(client)}|own:${key}`, run, client.config));
8262
- return outcome.seeded ? outcome.data : void 0;
8319
+ return outcome.seeded ? { data: outcome.data, at: seed.at } : void 0;
8263
8320
  }
8264
8321
  function useSeededAggregate(tableId, spec) {
8265
8322
  return useSeededAnswer(