@ai-matrx/records-ui 0.85.8 → 0.85.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,42 @@
1
1
  # Changelog — @ai-matrx/records-ui
2
2
 
3
+ ## 0.85.9
4
+
5
+ Automatic changed-only republish (docs/metadata drift since the last tag — see
6
+ `git diff npm/records-ui/v0.85.7..npm/records-ui/v0.85.9 -- apps/shared/records-ui`).
7
+ No source changes intended and no consumer action required.
8
+
9
+ ## Unreleased
10
+
11
+ ### Lane MOVE-AND-OUTSIDER (2026-09-24)
12
+
13
+ * **A refused move stays on the confirm and says why, with the store's remedy.** `WhereItLives`
14
+ dropped the confirm on a refusal and drew only the message, then re-read the table (the panel
15
+ flipped to "Asking…"); the store's hint was never shown, and on production the panel closed with
16
+ nothing on the screen (VERIFIER-19 #1). Now the refusal is drawn inside the confirm as
17
+ "Nothing moved. <the store's sentence> <its hint>", the button reads **Try again**, **Cancel**
18
+ goes back to the list and re-reads, and a focus shift outside the panel (a toast, the error pill)
19
+ never closes it — only the person does. The success answer is unchanged. Suite
20
+ `a-refused-move-keeps-the-panel-open.test.tsx`: RED on the prior bytes (hint missing, confirm
21
+ gone), GREEN. The store half (`custom.table_move` now finds or makes the destination's home) is
22
+ on production. **Consumer action:** none.
23
+
24
+ ### Lane UI-FIX-19 (2026-09-24)
25
+
26
+ * **An inbox kind is a noun.** `WORK_INBOX_KIND_LABEL` (and `ActionInbox.KIND_WORD`) read
27
+ `Approve` / `Yours` / `Agent`; the bordered kind badge at the left of every row therefore read as
28
+ a live **Approve** control on each withdrawn and decided item (VERIFIER-19 #6 — the closed row
29
+ already drew no Approve button). Now `Approval` / `Assigned` / `Agent proposal`. Suite
30
+ `inbox-groups-and-closed-items.test.tsx` gains "no element that reads as a decision on a closed
31
+ item": RED on the prior bytes, GREEN 7/7. **Consumer action:** none, unless a host matched the
32
+ old words.
33
+ * **A dashboard save is judged by value.** `whatTheStoreDidNotKeep` compared canonical strings, so
34
+ a target the store kept and filled with its own defaults (`per: "period"`, `measure`) was
35
+ reported as "The store did not keep its target" right above *Target 150,000* (VERIFIER-19 #7).
36
+ Every key that was SENT must be held at the same value; a key the store added is not a loss; a
37
+ setting removed must be held as nothing. Suite `a-dashboard-save-says-what-the-store-did-not-keep`:
38
+ RED 1 on the prior bytes, GREEN 7/7.
39
+
3
40
  ## 0.85.8
4
41
 
5
42
  Automatic changed-only republish (docs/metadata drift since the last tag — see
package/dist/index.cjs CHANGED
@@ -2535,9 +2535,9 @@ var DUE_STATE_LABEL = {
2535
2535
  };
2536
2536
  var WORK_INBOX_KINDS = exhaustiveValuesOf()(["assignment", "approval", "proposal"]);
2537
2537
  var WORK_INBOX_KIND_LABEL = {
2538
- assignment: "Yours",
2539
- approval: "Approve",
2540
- proposal: "Agent"
2538
+ assignment: "Assigned",
2539
+ approval: "Approval",
2540
+ proposal: "Agent proposal"
2541
2541
  };
2542
2542
  var WORK_INBOX_KIND_GROUP_LABEL = {
2543
2543
  approval: "Approvals",
@@ -19236,14 +19236,20 @@ var COMPARE_LABEL = {
19236
19236
  function compareKey(block, fields) {
19237
19237
  return block.bucket?.key ?? block.compare?.key ?? offerableFields(onePerKey(fields), "date")[0]?.key ?? null;
19238
19238
  }
19239
- function canonical(value) {
19240
- if (value === void 0 || value === null) return "null";
19241
- if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
19242
- if (typeof value === "object") {
19243
- const entries = Object.entries(value).filter(([, v]) => v !== void 0 && v !== null).sort(([a], [b]) => a.localeCompare(b));
19244
- return `{${entries.map(([k, v]) => `${JSON.stringify(k)}:${canonical(v)}`).join(",")}}`;
19239
+ function holds(sent, stored) {
19240
+ const absent = (v) => v === void 0 || v === null;
19241
+ if (absent(sent)) return absent(stored);
19242
+ if (absent(stored)) return false;
19243
+ if (Array.isArray(sent)) {
19244
+ return Array.isArray(stored) && stored.length === sent.length && sent.every((v, i) => holds(v, stored[i]));
19245
19245
  }
19246
- return JSON.stringify(value);
19246
+ if (typeof sent === "object") {
19247
+ if (typeof stored !== "object" || Array.isArray(stored)) return false;
19248
+ return Object.entries(sent).every(
19249
+ ([k, v]) => absent(v) || holds(v, stored[k])
19250
+ );
19251
+ }
19252
+ return Object.is(sent, stored);
19247
19253
  }
19248
19254
  var KEPT_SETTINGS = [
19249
19255
  ["kind", "its shape"],
@@ -19260,7 +19266,7 @@ function whatTheStoreDidNotKeep(sent, stored) {
19260
19266
  lost.push(`\u201C${block.title}\u201D`);
19261
19267
  return;
19262
19268
  }
19263
- const what = KEPT_SETTINGS.filter(([key]) => canonical(block[key]) !== canonical(kept[key])).map(([, words]) => words);
19269
+ const what = KEPT_SETTINGS.filter(([key]) => !holds(block[key], kept[key])).map(([, words]) => words);
19264
19270
  if (what.length) lost.push(`${what.join(" and ")} for \u201C${block.title}\u201D`);
19265
19271
  });
19266
19272
  if (lost.length === 0) return null;