@substrat-run/kernel 0.109.0 → 0.110.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/dist/timeline.d.ts +4 -0
- package/dist/timeline.d.ts.map +1 -1
- package/dist/timeline.js +18 -5
- package/dist/timeline.js.map +1 -1
- package/package.json +2 -2
package/dist/timeline.d.ts
CHANGED
|
@@ -88,6 +88,10 @@ export declare function readTimeline(ctx: TimelineReader, entity: EntityRef, pag
|
|
|
88
88
|
* which most systems cannot answer at all and this one gets for free.
|
|
89
89
|
* - **`piiClass` / `subjectId`** — so the caller can decide what is safe to
|
|
90
90
|
* render before it renders it.
|
|
91
|
+
* - **`causedBy`** (#1237) — the event this one was emitted in reaction to, which
|
|
92
|
+
* is what makes a backwards walk possible: `authorization` says under what
|
|
93
|
+
* authority and `operation` says under what invocation, but neither says
|
|
94
|
+
* BECAUSE OF WHAT, and a consumer emit has no operation at all.
|
|
91
95
|
*
|
|
92
96
|
* Same permission posture as `readTimeline`: the caller checks, this does not.
|
|
93
97
|
* The payload makes that more load-bearing here, not less — this is the read that
|
package/dist/timeline.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,SAAS,EAGd,KAAK,YAAY,EAGjB,KAAK,QAAQ,EACb,KAAK,IAAI,EAET,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,SAAS,EAAY,MAAM,iBAAiB,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAEH,oFAAoF;AACpF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;CACxC;
|
|
1
|
+
{"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,SAAS,EAGd,KAAK,YAAY,EAGjB,KAAK,QAAQ,EACb,KAAK,IAAI,EAET,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,SAAS,EAAY,MAAM,iBAAiB,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAEH,oFAAoF;AACpF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;CACxC;AA+GD;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,SAAS,EACjB,IAAI,CAAC,EAAE,QAAQ,GACd,IAAI,CAAC,aAAa,CAAC,CAKrB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,WAAW,CACzB,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,SAAS,EACjB,IAAI,CAAC,EAAE,QAAQ,GACd,IAAI,CAAC,YAAY,CAAC,CAKpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,eAAe,GAAG,gBAAgB,CAqEzF"}
|
package/dist/timeline.js
CHANGED
|
@@ -2,7 +2,7 @@ import { listLimitOf, pageOf, } from '@substrat-run/contracts';
|
|
|
2
2
|
/** The envelope columns, in the order `mapTimelineRow` expects. */
|
|
3
3
|
const TIMELINE_COLUMNS = 'id, type, occurred_at, actor';
|
|
4
4
|
/** …plus what a history VIEW needs. See `historyEntry` for why two are nullable. */
|
|
5
|
-
const HISTORY_COLUMNS = `${TIMELINE_COLUMNS}, payload, authorization, impersonation, pii_class, subject_id, operation, version`;
|
|
5
|
+
const HISTORY_COLUMNS = `${TIMELINE_COLUMNS}, payload, authorization, impersonation, pii_class, subject_id, operation, version, caused_by`;
|
|
6
6
|
/**
|
|
7
7
|
* The one SELECT behind both reads, for the reason `entityVersionQuery` is one
|
|
8
8
|
* function: two surfaces answering the same question from one table must not
|
|
@@ -69,6 +69,11 @@ function mapHistoryRow(row) {
|
|
|
69
69
|
operation: row.operation,
|
|
70
70
|
// #1242: from the column, never the envelope — historyEntry's doc owns why.
|
|
71
71
|
version: row.version,
|
|
72
|
+
// #1237: the event this one reacted to. Null means nothing was being
|
|
73
|
+
// delivered, or the row predates the column — historyEntry's doc owns the
|
|
74
|
+
// distinction, and the pair (operation null + this set) is what finally
|
|
75
|
+
// identifies a consumer emit, which neither field could do alone.
|
|
76
|
+
causedBy: row.caused_by,
|
|
72
77
|
};
|
|
73
78
|
}
|
|
74
79
|
/**
|
|
@@ -104,6 +109,10 @@ export function readTimeline(ctx, entity, page) {
|
|
|
104
109
|
* which most systems cannot answer at all and this one gets for free.
|
|
105
110
|
* - **`piiClass` / `subjectId`** — so the caller can decide what is safe to
|
|
106
111
|
* render before it renders it.
|
|
112
|
+
* - **`causedBy`** (#1237) — the event this one was emitted in reaction to, which
|
|
113
|
+
* is what makes a backwards walk possible: `authorization` says under what
|
|
114
|
+
* authority and `operation` says under what invocation, but neither says
|
|
115
|
+
* BECAUSE OF WHAT, and a consumer emit has no operation at all.
|
|
107
116
|
*
|
|
108
117
|
* Same permission posture as `readTimeline`: the caller checks, this does not.
|
|
109
118
|
* The payload makes that more load-bearing here, not less — this is the read that
|
|
@@ -169,10 +178,10 @@ export function facetEvents(ctx, input) {
|
|
|
169
178
|
// and every matching row is groupable.
|
|
170
179
|
if (input.groupBy.kind !== 'payload') {
|
|
171
180
|
const column = ENVELOPE_COLUMN[input.groupBy.kind];
|
|
172
|
-
const rows = ctx.sql.query(`SELECT ${column} AS value, COUNT(*) AS n FROM _substrat_outbox${filter}
|
|
181
|
+
const rows = ctx.sql.query(`SELECT ${column} AS value, COUNT(*) AS n, MAX(occurred_at) AS last FROM _substrat_outbox${filter}
|
|
173
182
|
GROUP BY ${column} ORDER BY n DESC, value LIMIT ?`, [...params, limit + 1]);
|
|
174
183
|
return {
|
|
175
|
-
buckets: rows.slice(0, limit).map((r) => ({ value: r.value, count: r.n })),
|
|
184
|
+
buckets: rows.slice(0, limit).map((r) => ({ value: r.value, count: r.n, lastSeen: r.last })),
|
|
176
185
|
erased: 0,
|
|
177
186
|
total,
|
|
178
187
|
truncated: rows.length > limit,
|
|
@@ -192,10 +201,14 @@ export function facetEvents(ctx, input) {
|
|
|
192
201
|
// the two groups into two buckets with the same `value` and split counts. Casting in
|
|
193
202
|
// SQL makes the group key the rendered value, so one bucket per rendered value is a
|
|
194
203
|
// property of the query rather than a hope about the data.
|
|
195
|
-
const rows = ctx.sql.query(`SELECT CAST(json_extract(payload, ?) AS TEXT) AS value, COUNT(*) AS n
|
|
204
|
+
const rows = ctx.sql.query(`SELECT CAST(json_extract(payload, ?) AS TEXT) AS value, COUNT(*) AS n, MAX(occurred_at) AS last
|
|
205
|
+
FROM _substrat_outbox${liveFilter}
|
|
196
206
|
GROUP BY value ORDER BY n DESC, value LIMIT ?`, [`$.${input.groupBy.field}`, ...params, limit + 1]);
|
|
207
|
+
// Over LIVE rows only, like the count beside it: an erased row is excluded from the
|
|
208
|
+
// bucket entirely, so this is "when this value was last seen in an event that still
|
|
209
|
+
// carries its payload" — the erased total above is where the rest is accounted for.
|
|
197
210
|
return {
|
|
198
|
-
buckets: rows.slice(0, limit).map((r) => ({ value: r.value, count: r.n })),
|
|
211
|
+
buckets: rows.slice(0, limit).map((r) => ({ value: r.value, count: r.n, lastSeen: r.last })),
|
|
199
212
|
erased,
|
|
200
213
|
total,
|
|
201
214
|
truncated: rows.length > limit,
|
package/dist/timeline.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeline.js","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,MAAM,GAeP,MAAM,yBAAyB,CAAC;AAiEjC,mEAAmE;AACnE,MAAM,gBAAgB,GAAG,8BAA8B,CAAC;AACxD,oFAAoF;AACpF,MAAM,eAAe,GAAG,GAAG,gBAAgB,
|
|
1
|
+
{"version":3,"file":"timeline.js","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@substrat-run/kernel",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.110.0",
|
|
4
4
|
"description": "Substrat kernel contracts and services — pure TypeScript, no platform imports (D-14)",
|
|
5
5
|
"license": "AGPL-3.0-only",
|
|
6
6
|
"repository": {
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"dist"
|
|
23
23
|
],
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@substrat-run/contracts": "^0.
|
|
25
|
+
"@substrat-run/contracts": "^0.110.0"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@types/node": "^22.0.0",
|