@ai-matrx/records 0.58.117 → 0.58.118
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 +8 -0
- package/dist/core/index.cjs +98 -5
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.cts +55 -1
- package/dist/core/index.d.ts +55 -1
- package/dist/core/index.js +98 -5
- package/dist/core/index.js.map +1 -1
- package/dist/react/index.cjs +98 -5
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +55 -1
- package/dist/react/index.d.ts +55 -1
- package/dist/react/index.js +98 -5
- package/dist/react/index.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Changelog — @ai-matrx/records
|
|
2
2
|
|
|
3
|
+
## 0.58.118
|
|
4
|
+
|
|
5
|
+
Automatic changed-only republish (docs/metadata drift since the last tag — see
|
|
6
|
+
`git diff npm/records/v0.58.117..npm/records/v0.58.118 -- apps/shared/records`).
|
|
7
|
+
No source changes intended and no consumer action required.
|
|
8
|
+
|
|
3
9
|
## 0.58.117
|
|
4
10
|
|
|
5
11
|
Automatic changed-only republish (docs/metadata drift since the last tag — see
|
|
@@ -9,6 +15,8 @@ No source changes intended and no consumer action required.
|
|
|
9
15
|
## 0.58.116
|
|
10
16
|
### Unreleased
|
|
11
17
|
|
|
18
|
+
- **Metadata search, aggregate and owner lookup span organizations** (active-org law, 2026-09-30): new `organizationsOpen()` (which of the person's organizations can answer, unavailable ones WITH reason), `ownerOrganization({table_id|record_id})`; `metadataSearch({text, organization_id?})` now returns `{matches, organizations_covered, unavailable}` (each match carries `organization_id`; was a door-absent refusal typed `never`, still a refusal when no organization answers); `recordAggregate` takes optional `organization_id` and, with `config.organizationIds`, runs in the table's owning organization (rows carry `organization_id`). No `organizationIds` = unchanged. Consumer action: none required; matrx-extend drops its per-org fan-out.
|
|
19
|
+
|
|
12
20
|
- **`wholeValueSize` is kit's `formatFileSize`** (package-twins drain, 2026-09-30): `728 KB` unchanged; a pointer under 10 KB reads `5.0 KB` (was `5 KB`) and one under 1 KB reads `512 B` (was `1 KB`). New dependency: `@ai-matrx/kit` (`workspace:*`). Consumer action: none.
|
|
13
21
|
|
|
14
22
|
## 0.58.115
|
package/dist/core/index.cjs
CHANGED
|
@@ -40986,6 +40986,13 @@ function createRecordsClient(config) {
|
|
|
40986
40986
|
}
|
|
40987
40987
|
return last;
|
|
40988
40988
|
}
|
|
40989
|
+
const spans = (filter) => Boolean(filter) || (config.organizationIds?.length ?? 0) > 0;
|
|
40990
|
+
const metadataSearchDoor = () => {
|
|
40991
|
+
const refusal = doorAbsent(DOORS.metadataSearch);
|
|
40992
|
+
scream({ code: refusal.code, message: refusal.message, ...refusal.hint ? { hint: refusal.hint } : {}, where: "metadataSearch" });
|
|
40993
|
+
return err(refusal);
|
|
40994
|
+
};
|
|
40995
|
+
const unavailableReason = (error) => `${error.message}${error.hint ? ` ${error.hint}` : ""}`;
|
|
40989
40996
|
const client = {
|
|
40990
40997
|
config,
|
|
40991
40998
|
async recordWrite({ table_id, data }) {
|
|
@@ -42315,7 +42322,23 @@ function createRecordsClient(config) {
|
|
|
42315
42322
|
"dashboardDelete"
|
|
42316
42323
|
);
|
|
42317
42324
|
},
|
|
42318
|
-
async recordAggregate({ table_id, groupBy, measures, bucket, filter, limit, compare }) {
|
|
42325
|
+
async recordAggregate({ table_id, organization_id, groupBy, measures, bucket, filter, limit, compare }) {
|
|
42326
|
+
if (spans(organization_id)) {
|
|
42327
|
+
const owner = await client.ownerOrganization({ table_id, ...organization_id ? { organization_id } : {} });
|
|
42328
|
+
const target = owner.ok && owner.data ? owner.data : organization_id ?? org;
|
|
42329
|
+
if (target !== org) {
|
|
42330
|
+
const answered = await clientFor(target).recordAggregate({
|
|
42331
|
+
table_id,
|
|
42332
|
+
...groupBy ? { groupBy } : {},
|
|
42333
|
+
...measures ? { measures } : {},
|
|
42334
|
+
...bucket !== void 0 ? { bucket } : {},
|
|
42335
|
+
...filter ? { filter } : {},
|
|
42336
|
+
...limit !== void 0 ? { limit } : {},
|
|
42337
|
+
...compare !== void 0 ? { compare } : {}
|
|
42338
|
+
});
|
|
42339
|
+
return answered.ok ? ok(answered.data.map((row) => ({ ...row, organization_id: target }))) : answered;
|
|
42340
|
+
}
|
|
42341
|
+
}
|
|
42319
42342
|
return callDoor(
|
|
42320
42343
|
DOORS.recordAggregate,
|
|
42321
42344
|
{
|
|
@@ -43231,10 +43254,80 @@ function createRecordsClient(config) {
|
|
|
43231
43254
|
"ruleDeclare"
|
|
43232
43255
|
);
|
|
43233
43256
|
},
|
|
43234
|
-
async metadataSearch() {
|
|
43235
|
-
|
|
43236
|
-
|
|
43237
|
-
|
|
43257
|
+
async metadataSearch({ text, organization_id }) {
|
|
43258
|
+
if (spans(organization_id) && readOrgs(organization_id).length > 0) {
|
|
43259
|
+
const targets = readOrgs(organization_id).filter((t) => t !== null);
|
|
43260
|
+
const unavailable = [];
|
|
43261
|
+
const answers = await Promise.all(
|
|
43262
|
+
targets.map(async (t) => {
|
|
43263
|
+
const sub = clientFor(t);
|
|
43264
|
+
const open = await sub.storeIsOpen();
|
|
43265
|
+
if (!open.ok) {
|
|
43266
|
+
unavailable.push({ organization_id: t, reason: unavailableReason(open.error) });
|
|
43267
|
+
return null;
|
|
43268
|
+
}
|
|
43269
|
+
if (!open.data) {
|
|
43270
|
+
unavailable.push({ organization_id: t, reason: "The custom data store is switched off for this organization." });
|
|
43271
|
+
return null;
|
|
43272
|
+
}
|
|
43273
|
+
const found = metadataSearchDoor();
|
|
43274
|
+
if (!found.ok) {
|
|
43275
|
+
unavailable.push({ organization_id: t, reason: unavailableReason(found.error) });
|
|
43276
|
+
return { t, found };
|
|
43277
|
+
}
|
|
43278
|
+
return { t, found };
|
|
43279
|
+
})
|
|
43280
|
+
);
|
|
43281
|
+
const matches = [];
|
|
43282
|
+
const covered = [];
|
|
43283
|
+
let firstRefusal = null;
|
|
43284
|
+
for (const answer of answers) {
|
|
43285
|
+
if (!answer) continue;
|
|
43286
|
+
if (!answer.found.ok) {
|
|
43287
|
+
firstRefusal ??= answer.found.error;
|
|
43288
|
+
continue;
|
|
43289
|
+
}
|
|
43290
|
+
covered.push(answer.t);
|
|
43291
|
+
for (const m of answer.found.data.matches) matches.push({ ...m, organization_id: answer.t });
|
|
43292
|
+
}
|
|
43293
|
+
const inOrder = (a, b) => targets.indexOf(a.organization_id) - targets.indexOf(b.organization_id);
|
|
43294
|
+
unavailable.sort(inOrder);
|
|
43295
|
+
if (covered.length === 0 && firstRefusal) return err(firstRefusal);
|
|
43296
|
+
return ok({ matches, organizations_covered: covered, unavailable });
|
|
43297
|
+
}
|
|
43298
|
+
return metadataSearchDoor();
|
|
43299
|
+
},
|
|
43300
|
+
async organizationsOpen(args) {
|
|
43301
|
+
const targets = readOrgs(args?.organization_id).filter((t) => t !== null);
|
|
43302
|
+
const open = [];
|
|
43303
|
+
const unavailable = [];
|
|
43304
|
+
await Promise.all(
|
|
43305
|
+
targets.map(async (t) => {
|
|
43306
|
+
const result = await clientFor(t).storeIsOpen();
|
|
43307
|
+
if (!result.ok) unavailable.push({ organization_id: t, reason: unavailableReason(result.error) });
|
|
43308
|
+
else if (!result.data)
|
|
43309
|
+
unavailable.push({ organization_id: t, reason: "The custom data store is switched off for this organization." });
|
|
43310
|
+
else open.push(t);
|
|
43311
|
+
})
|
|
43312
|
+
);
|
|
43313
|
+
const position = (id) => targets.indexOf(id);
|
|
43314
|
+
open.sort((a, b) => position(a) - position(b));
|
|
43315
|
+
unavailable.sort((a, b) => position(a.organization_id) - position(b.organization_id));
|
|
43316
|
+
return ok({ open, unavailable });
|
|
43317
|
+
},
|
|
43318
|
+
async ownerOrganization({ table_id, record_id, organization_id }) {
|
|
43319
|
+
if (table_id) {
|
|
43320
|
+
const read = await client.tableRead({ table_id, ...organization_id ? { organization_id } : {} });
|
|
43321
|
+
if (!read.ok) return err(read.error);
|
|
43322
|
+
return ok(read.data ? read.data.organization_id ?? null : null);
|
|
43323
|
+
}
|
|
43324
|
+
if (record_id) {
|
|
43325
|
+
const read = await client.recordRead({ record_id, ...organization_id ? { organization_id } : {} });
|
|
43326
|
+
if (!read.ok) return ok(null);
|
|
43327
|
+
const targets = readOrgs(organization_id);
|
|
43328
|
+
return ok(recordOrgs.get(record_id) ?? organization_id ?? (targets.length === 1 ? targets[0] ?? null : null));
|
|
43329
|
+
}
|
|
43330
|
+
return ok(null);
|
|
43238
43331
|
},
|
|
43239
43332
|
async fieldPropose() {
|
|
43240
43333
|
const refusal = doorAbsent(DOORS.fieldPropose);
|