@ai-matrx/records-ui 0.63.0 → 0.66.0

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,119 @@
1
1
  # Changelog — @ai-matrx/records-ui
2
2
 
3
+ ## 0.66.0
4
+
5
+ **A screen stops talking to a developer.** (lane TAILS-6.)
6
+
7
+ Two sightings on ONE table's rail, watched from the admin seat by the GUIDE lane on 2026-09-21:
8
+
9
+ > Checklists — "Something went wrong at our end" ·
10
+ > `@ai-matrx/records did not recognise SQLSTATE from checklistTemplates`
11
+ >
12
+ > Dashboards — "… bind `openRecords` on `<RecordsUiProvider>` …"
13
+
14
+ Both are the same defect in two coats: a sentence written for whoever maintains the code,
15
+ printed to the person who owns the business.
16
+
17
+ * **`refusalForAPerson` no longer promotes an engineer's hint to the person's remedy.** It
18
+ prefers the door's own hint over its table, which is right — but it assumed every hint came
19
+ from the store, and the machine-identity filter only catches a five-character SQLSTATE.
20
+ New `isEngineerText` / `ENGINEER_TEXT` judge a sentence by SHAPE — a package name, the word
21
+ SQLSTATE, a `<Component>`, a camelCase identifier, a backticked token, "bind X on …" — and
22
+ send it to `forEngineers` wherever it came from. `error.diagnostic` from
23
+ `@ai-matrx/records` 0.47.0 joins the same line.
24
+ * **Titles and remedies for `unreachable`, `needs_approval`, `stale_read` and `timed_out`,**
25
+ which had none and fell through to "Something went wrong at our end". A call that never
26
+ reached the store now says so and says nothing was changed.
27
+ * **Every unbound-port sentence rewritten for the person it is shown to** — the nine of them,
28
+ not the two that were caught: `NO_OPEN_RECORDS_REASON`, `NO_REASK_REASON`,
29
+ `NO_SAVED_VIEWS_REASON`, `NO_MEMBERS_REASON`, `NO_SHARE_REASON`, `NO_UPLOAD_REASON`,
30
+ `NO_CHAT_REASON`, `NO_ENRICH_REASON`, `IN_MEMORY_QUEUE_REASON`. Each still says what is
31
+ missing and now says what to do instead; the instruction for whoever maintains the app moved
32
+ into the TSDoc above it, where it always belonged.
33
+ * **`TablePage` gains `activeGroupField` and `cameFrom`,** so a host CAN bind `openRecords`.
34
+ The store has no door that returns the rows behind an aggregate filter, so a click cannot
35
+ promise a narrowed list — what it can do is open this table's board with its columns set to
36
+ the field the chart grouped by, and `cameFromLine` says plainly that this is every record
37
+ grouped that way rather than only the ones the number counted.
38
+ * **Guard:** `src/no-developer-sentences.test.tsx` — shown failing on the pre-fix bytes with
39
+ the exact sentence the GUIDE lane read, then passing. It needs no server.
40
+
41
+ **Consumer action:** bind `openRecords` on your `RecordsUiProvider` and pass `activeGroupField`
42
+ / `cameFrom` through from the address, or leave it unbound and the canvas says so in plain
43
+ English. `matrx-frontend`'s `/data-v2/[tableId]` route is the worked example.
44
+
45
+ ## 0.65.0
46
+
47
+ **A condition about a relation column stops asking a person to type a uuid.**
48
+ (lane RELATION-DISPLAY-2.)
49
+
50
+ * **`ConditionField` carried no type, so the ONE condition builder could not know a
51
+ column points at another record.** It drew the same plain text box every other
52
+ clause gets — and a relation's stored value is the other record's id (FLD-6 /
53
+ REL-1), so the only way to write a true clause was to find and TYPE a uuid. The
54
+ dispatcher's actual house rule, *"a job for Harborview Property Group cannot
55
+ leave Scheduled without a purchase order"*, was unwritable by exactly the person
56
+ the builder exists for. A box that accepts anything and can only produce a rule
57
+ matching nothing is law 4's dead control.
58
+ * `ConditionField` now carries an OPTIONAL `field`. When it is a relation, the value
59
+ control is **`RelationPicker`** — the same picker the cell uses, on the same
60
+ `relation_words_many` the cell reads — so a filter offers the column's own joined
61
+ words ("Harborview Property Group, Carpinteria") and writes the ID. A filter and
62
+ the column it filters can no longer disagree about what a record is called.
63
+ * It is asked for ONE record even when the column holds several: a clause compares
64
+ against one value, and a picker that let somebody choose three would write an
65
+ expression this row cannot draw back.
66
+ * Both callers in this package already held the whole `Field` and were throwing it
67
+ away one line before handing it over — `StageRules` and `FormBuilder`. In the form
68
+ builder this is the OWNER's screen; a stranger is still never asked a relation
69
+ question (`publicQuestions.ts` is untouched).
70
+
71
+ **Consumer action:** none — `field` is optional and a caller passing only
72
+ `{id, key, label}` gets exactly the old behaviour, which has its own clause. A host
73
+ that wants the picker passes the `Field` it already has.
74
+
75
+ *Numbered 0.65.0, not 0.64.0: a peer lane claimed 0.64.0 for the coercion primitive
76
+ while this work was in flight and tagged it first. Two lanes bumping one package in
77
+ one afternoon is the cost of a shared checkout; the fix is to move, never to take a
78
+ version somebody else's tag already names.*
79
+
80
+ ## 0.64.0
81
+
82
+ > 🚨 **0.64.0 NEVER PUBLISHED, AND EVERYTHING IN IT SHIPPED INSIDE 0.65.0.** Its publish run
83
+ > (35638062219) was **cancelled — not failed** — because `npm/records/*` and `npm/records-ui/*`
84
+ > share ONE concurrency slot that keeps only the newest pending run, and `npm/records-ui/v0.65.0`
85
+ > displaced it. Nothing was lost: 0.65.0 is built from `origin/main`, which contains this
86
+ > commit, and the tarball carries `fieldKindFor`, `coerceTypedAnswer`, `valueFromPastedText`
87
+ > and `enumLabels` — verified by `npm pack`, not by version number. `npm view` goes
88
+ > 0.63.0 → 0.65.0 with no 0.64.0 in between. The entry is kept as written so the work is
89
+ > still findable by what it did. *(Recorded by lane RELATION-DISPLAY-2, whose tag did the
90
+ > displacing.)*
91
+
92
+ **The paste and the editor stop owning their own opinion of a column, and the capture sheet
93
+ stops minting NaN.**
94
+
95
+ - **`editorKindFor` is `fieldKindFor`** (`@ai-matrx/records` 0.45.0) with this package's
96
+ kernel File/Person ids bound. The classifier body lived here and was the only one.
97
+ - **`valueFromPastedText` is one call to `coerceTypedAnswer`**, keeping this package's label
98
+ so a refusal names the column the way the grid's header does. Its 150-line body WAS the
99
+ coercion — and while it sat here, the public booking page was unbookable over any table
100
+ with a number field.
101
+ - **`ChoiceOptions`** is re-exported from the core instead of declared twice.
102
+ - **`CaptureRun`** used `Number(raw)`, which answers NaN for "about twelve" — and a NaN
103
+ becomes null on the wire, so a reading taken in a yard could silently record nothing. It
104
+ coerces through the one body now and KEEPS the typed text when the value is refused.
105
+ - **`ViewSwitcher`**'s calendar offer tested `kind === "datetime" || kind === "date"`. FLD-11
106
+ has no "date" kind; it compiled only because the old `EditorKind` union carried two words
107
+ nothing produced.
108
+ - **`BuildOrAsk`** (landed 0.63.x→here): "Ask an agent" is ABSENT when `mayBuild` is false —
109
+ asking an agent is the same act as building by hand, through the same doors.
110
+ - **One label map per enum** (`enumLabels.ts`): no panel keeps its own copy, and the
111
+ "Done"/"Finished" split between `ChecklistRunner` and `ActionInbox` is gone.
112
+
113
+ *Consumer action:* none. `EditorKind` is now an alias of `FieldKind`; a host that compared a
114
+ kind against `"date"` or `"boolean"` was comparing against a value the classifier never
115
+ returned.
116
+
3
117
  ## 0.63.0
4
118
 
5
119
  **A relation cell finally SHOWS what its column was configured to show, and the