@x12i/memorix-service 3.12.3 → 3.12.4
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/README.md +1 -1
- package/dist/activity-ui.js +1 -1
- package/dist/agent-catalog.d.ts +32 -0
- package/dist/agent-catalog.d.ts.map +1 -0
- package/dist/agent-catalog.js +80 -0
- package/dist/agent-catalog.js.map +1 -0
- package/dist/analytics/engine.d.ts.map +1 -1
- package/dist/analytics/engine.js +2 -1
- package/dist/analytics/engine.js.map +1 -1
- package/dist/analytics/state.d.ts +1 -1
- package/dist/analytics/tracker.d.ts +2 -0
- package/dist/analytics/tracker.d.ts.map +1 -1
- package/dist/analytics/tracker.js +15 -8
- package/dist/analytics/tracker.js.map +1 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +22 -1
- package/dist/app.js.map +1 -1
- package/dist/arrivals-backfill.d.ts +23 -0
- package/dist/arrivals-backfill.d.ts.map +1 -0
- package/dist/arrivals-backfill.js +132 -0
- package/dist/arrivals-backfill.js.map +1 -0
- package/dist/arrivals-routes.d.ts +8 -0
- package/dist/arrivals-routes.d.ts.map +1 -0
- package/dist/arrivals-routes.js +17 -0
- package/dist/arrivals-routes.js.map +1 -0
- package/dist/arrivals-ui.d.ts +3 -0
- package/dist/arrivals-ui.d.ts.map +1 -0
- package/dist/arrivals-ui.js +277 -0
- package/dist/arrivals-ui.js.map +1 -0
- package/dist/catalog-bridge.d.ts.map +1 -1
- package/dist/catalog-bridge.js +32 -9
- package/dist/catalog-bridge.js.map +1 -1
- package/dist/catalog-live-ui.js +1 -1
- package/dist/content-arrivals-countex.d.ts +90 -0
- package/dist/content-arrivals-countex.d.ts.map +1 -0
- package/dist/content-arrivals-countex.js +252 -0
- package/dist/content-arrivals-countex.js.map +1 -0
- package/dist/data-changes-ui.js +1 -1
- package/dist/data-changes.d.ts +3 -0
- package/dist/data-changes.d.ts.map +1 -1
- package/dist/data-changes.js +22 -21
- package/dist/data-changes.js.map +1 -1
- package/dist/errors.d.ts +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +4 -2
- package/dist/errors.js.map +1 -1
- package/dist/hooks-live-ui.js +1 -1
- package/dist/land-v2-guards.d.ts +5 -12
- package/dist/land-v2-guards.d.ts.map +1 -1
- package/dist/land-v2-guards.js +10 -33
- package/dist/land-v2-guards.js.map +1 -1
- package/dist/live-ops-nav.d.ts.map +1 -1
- package/dist/live-ops-nav.js +4 -0
- package/dist/live-ops-nav.js.map +1 -1
- package/dist/nexum-analysis/outbox.d.ts +1 -1
- package/dist/nexum-analysis/reconcile.d.ts.map +1 -1
- package/dist/nexum-analysis/reconcile.js +3 -2
- package/dist/nexum-analysis/reconcile.js.map +1 -1
- package/dist/openapi/openapi.json +47 -2
- package/dist/operational-db.d.ts +2 -2
- package/dist/operational-db.d.ts.map +1 -1
- package/dist/operational-db.js +8 -11
- package/dist/operational-db.js.map +1 -1
- package/dist/platform.d.ts +9 -3
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +16 -7
- package/dist/platform.js.map +1 -1
- package/dist/routes/data.d.ts.map +1 -1
- package/dist/routes/data.js +66 -12
- package/dist/routes/data.js.map +1 -1
- package/dist/routes/memory.d.ts.map +1 -1
- package/dist/routes/memory.js +2 -4
- package/dist/routes/memory.js.map +1 -1
- package/dist/routes/metadata.d.ts.map +1 -1
- package/dist/routes/metadata.js +12 -0
- package/dist/routes/metadata.js.map +1 -1
- package/dist/routes/mgc-landing.d.ts.map +1 -1
- package/dist/routes/mgc-landing.js +64 -94
- package/dist/routes/mgc-landing.js.map +1 -1
- package/dist/routes/workflow.d.ts.map +1 -1
- package/dist/routes/workflow.js +4 -10
- package/dist/routes/workflow.js.map +1 -1
- package/openapi/openapi.json +47 -2
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arrivals-routes.d.ts","sourceRoot":"","sources":["../src/arrivals-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAGrE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,eAAe,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACtC,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAe1F"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { arrivalsHtml } from "./arrivals-ui.js";
|
|
2
|
+
export function registerArrivalsRoutes(app, deps) {
|
|
3
|
+
app.get("/_live/arrivals", async (_req, reply) => {
|
|
4
|
+
return reply.header("cache-control", "no-store").type("text/html; charset=utf-8").send(arrivalsHtml());
|
|
5
|
+
});
|
|
6
|
+
app.get("/_live/api/arrivals", async (req) => {
|
|
7
|
+
const q = req.query;
|
|
8
|
+
const hours = Number(q.hours);
|
|
9
|
+
const extra = deps.listOrgIds ? await deps.listOrgIds().catch(() => []) : [];
|
|
10
|
+
return deps.arrivals.query({
|
|
11
|
+
orgId: q.orgId,
|
|
12
|
+
hours: Number.isFinite(hours) ? hours : undefined,
|
|
13
|
+
orgIds: extra,
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=arrivals-routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arrivals-routes.js","sourceRoot":"","sources":["../src/arrivals-routes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAOhD,MAAM,UAAU,sBAAsB,CAAC,GAAoB,EAAE,IAAuB;IAClF,GAAG,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;QAC/C,OAAO,KAAK,CAAC,MAAM,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IACzG,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,qBAAqB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC3C,MAAM,CAAC,GAAG,GAAG,CAAC,KAA2C,CAAC;QAC1D,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YACzB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;YACjD,MAAM,EAAE,KAAK;SACd,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arrivals-ui.d.ts","sourceRoot":"","sources":["../src/arrivals-ui.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,wBAAgB,YAAY,IAAI,MAAM,CAkRrC"}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
/** HTML for GET /_live/arrivals — hourly new content by object type and content type. */
|
|
2
|
+
export function arrivalsHtml() {
|
|
3
|
+
return `<!DOCTYPE html>
|
|
4
|
+
<html lang="en">
|
|
5
|
+
<head>
|
|
6
|
+
<meta charset="utf-8" />
|
|
7
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
8
|
+
<title>Memorix · Arrivals</title>
|
|
9
|
+
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
10
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
11
|
+
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500;600;700&family=IBM+Plex+Mono:wght@400;500&display=swap" rel="stylesheet" />
|
|
12
|
+
<style>
|
|
13
|
+
:root {
|
|
14
|
+
--bg: #0a0c10; --bg-elev: #10141b; --bg-row: #141922; --line: #242b38;
|
|
15
|
+
--text: #e8ebe6; --muted: #8a9288; --dim: #5c645c;
|
|
16
|
+
--ok: #3dba7a; --accent: #c8f082; --accent-ink: #0a0c10;
|
|
17
|
+
--sans: "IBM Plex Sans", system-ui, sans-serif;
|
|
18
|
+
--mono: "IBM Plex Mono", ui-monospace, monospace;
|
|
19
|
+
}
|
|
20
|
+
* { box-sizing: border-box; }
|
|
21
|
+
html, body { height: 100%; margin: 0; }
|
|
22
|
+
body {
|
|
23
|
+
font-family: var(--sans);
|
|
24
|
+
background:
|
|
25
|
+
radial-gradient(1200px 600px at 10% -10%, #1a2214 0%, transparent 55%),
|
|
26
|
+
radial-gradient(900px 500px at 100% 0%, #121820 0%, transparent 50%),
|
|
27
|
+
var(--bg);
|
|
28
|
+
color: var(--text); font-size: 14px; line-height: 1.45;
|
|
29
|
+
}
|
|
30
|
+
a { color: var(--accent); }
|
|
31
|
+
.shell { max-width: 1200px; margin: 0 auto; padding: 36px 28px 64px; }
|
|
32
|
+
header {
|
|
33
|
+
display: flex; align-items: flex-end; justify-content: space-between; gap: 24px;
|
|
34
|
+
margin-bottom: 22px; padding-bottom: 18px; border-bottom: 1px solid var(--line);
|
|
35
|
+
}
|
|
36
|
+
.brand { font-size: 26px; font-weight: 700; letter-spacing: -0.03em; }
|
|
37
|
+
.brand span { color: var(--accent); }
|
|
38
|
+
.sub { margin-top: 8px; color: var(--muted); font-size: 13px; max-width: 68ch; }
|
|
39
|
+
.meta { text-align: right; font-family: var(--mono); font-size: 11px; color: var(--dim); display: grid; gap: 4px; }
|
|
40
|
+
.toolbar { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; margin-bottom: 16px; }
|
|
41
|
+
.tabs { display: flex; gap: 6px; flex-wrap: wrap; }
|
|
42
|
+
.tab, .btn, select {
|
|
43
|
+
appearance: none; border: 1px solid var(--line); background: var(--bg-row); color: var(--text);
|
|
44
|
+
font: 500 12px/1 var(--sans); padding: 10px 14px; border-radius: 2px;
|
|
45
|
+
}
|
|
46
|
+
.tab { cursor: pointer; text-transform: uppercase; letter-spacing: 0.04em; color: var(--muted); background: transparent; }
|
|
47
|
+
.tab[aria-selected="true"] { background: var(--accent); color: var(--accent-ink); border-color: var(--accent); }
|
|
48
|
+
.btn { cursor: pointer; }
|
|
49
|
+
.btn:hover { border-color: var(--accent); }
|
|
50
|
+
select { min-width: 140px; }
|
|
51
|
+
.summary { display: flex; flex-wrap: wrap; gap: 16px; margin-bottom: 14px; font-family: var(--mono); font-size: 12px; color: var(--muted); }
|
|
52
|
+
.summary strong { color: var(--text); font-weight: 500; }
|
|
53
|
+
.chart {
|
|
54
|
+
display: flex; align-items: flex-end; gap: 3px; height: 72px;
|
|
55
|
+
padding: 8px; margin-bottom: 8px; overflow-x: auto;
|
|
56
|
+
background: var(--bg-elev); border: 1px solid var(--line);
|
|
57
|
+
}
|
|
58
|
+
.bar { flex: 1 0 6px; min-width: 6px; background: var(--accent); opacity: 0.85; }
|
|
59
|
+
.bar.empty { background: var(--line); opacity: 1; height: 2px !important; }
|
|
60
|
+
.chart-caption { font-family: var(--mono); font-size: 11px; color: var(--dim); margin-bottom: 18px; }
|
|
61
|
+
.hour { margin: 0 0 14px; background: var(--bg-elev); border: 1px solid var(--line); }
|
|
62
|
+
.hour h2 {
|
|
63
|
+
margin: 0; padding: 12px 14px; font-size: 14px; font-weight: 600;
|
|
64
|
+
display: flex; justify-content: space-between; gap: 12px;
|
|
65
|
+
border-bottom: 1px solid var(--line);
|
|
66
|
+
}
|
|
67
|
+
.hour h2 span { font-family: var(--mono); font-size: 12px; color: var(--muted); font-weight: 500; }
|
|
68
|
+
.org-label { padding: 8px 14px 0; font-family: var(--mono); font-size: 11px; color: var(--accent); }
|
|
69
|
+
details { border-top: 1px solid var(--line); }
|
|
70
|
+
details summary { cursor: pointer; padding: 10px 14px; list-style: none; display: flex; justify-content: space-between; gap: 12px; }
|
|
71
|
+
details summary::-webkit-details-marker { display: none; }
|
|
72
|
+
details summary:hover { background: var(--bg-row); }
|
|
73
|
+
.ot { font-weight: 600; }
|
|
74
|
+
.counts { font-family: var(--mono); font-size: 12px; color: var(--muted); }
|
|
75
|
+
table { width: 100%; border-collapse: collapse; }
|
|
76
|
+
th, td { text-align: left; padding: 8px 14px; border-top: 1px solid var(--line); }
|
|
77
|
+
th { font-family: var(--mono); font-size: 10px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--dim); font-weight: 500; }
|
|
78
|
+
.num { font-family: var(--mono); font-size: 12px; text-align: right; white-space: nowrap; }
|
|
79
|
+
.mono { font-family: var(--mono); font-size: 12px; }
|
|
80
|
+
.muted { color: var(--muted); }
|
|
81
|
+
.err { color: #e25a5a; margin: 12px 0; }
|
|
82
|
+
footer { margin-top: 28px; color: var(--dim); font-size: 12px; max-width: 78ch; }
|
|
83
|
+
</style>
|
|
84
|
+
</head>
|
|
85
|
+
<body>
|
|
86
|
+
<div class="shell">
|
|
87
|
+
<header>
|
|
88
|
+
<div>
|
|
89
|
+
<div class="brand">Memorix <span>arrivals</span></div>
|
|
90
|
+
<p class="sub">New content by the hour. Each hour lists the object types that received data, and under each object type the content types and how many records were created or updated.</p>
|
|
91
|
+
</div>
|
|
92
|
+
<div class="meta">
|
|
93
|
+
<div><strong>UI</strong> /_live/arrivals</div>
|
|
94
|
+
<div><strong>API</strong> /_live/api/arrivals</div>
|
|
95
|
+
<div><a href="/_live">← live view</a> · <a href="/_live/changes">data changes</a> · <a href="/_live/activity">activity</a></div>
|
|
96
|
+
</div>
|
|
97
|
+
</header>
|
|
98
|
+
<div class="toolbar">
|
|
99
|
+
<nav class="tabs" role="tablist">
|
|
100
|
+
<button class="tab" role="tab" aria-selected="true" data-hours="24">24 hours</button>
|
|
101
|
+
<button class="tab" role="tab" aria-selected="false" data-hours="48">48 hours</button>
|
|
102
|
+
<button class="tab" role="tab" aria-selected="false" data-hours="168">7 days</button>
|
|
103
|
+
</nav>
|
|
104
|
+
<label class="muted">Org
|
|
105
|
+
<select id="org"></select>
|
|
106
|
+
</label>
|
|
107
|
+
<button class="btn" id="refresh" type="button">Refresh</button>
|
|
108
|
+
</div>
|
|
109
|
+
<div class="summary" id="summary"></div>
|
|
110
|
+
<div id="error" class="err" hidden></div>
|
|
111
|
+
<div class="chart" id="chart" hidden></div>
|
|
112
|
+
<div class="chart-caption" id="chart-caption"></div>
|
|
113
|
+
<div id="hours"></div>
|
|
114
|
+
<footer>
|
|
115
|
+
Created is a new record. Updated is a write to a record that already existed. Deletes are omitted.
|
|
116
|
+
Analytics rollup writes are omitted. Earlier hours are filled once from stored timestamps
|
|
117
|
+
(<span class="mono">MEMORIX_ARRIVALS_BACKFILL_HOURS</span>, default 168). That fill can see the latest
|
|
118
|
+
modified hour, so a create and an update in the same hour show as one create.
|
|
119
|
+
<span class="mono">MEMORIX_ARRIVALS_BACKFILL=0</span> counts only writes after this process starts.
|
|
120
|
+
Hours are UTC.
|
|
121
|
+
</footer>
|
|
122
|
+
</div>
|
|
123
|
+
<script>
|
|
124
|
+
const $ = (id) => document.getElementById(id);
|
|
125
|
+
let report = null;
|
|
126
|
+
let hours = 24;
|
|
127
|
+
let timer = null;
|
|
128
|
+
|
|
129
|
+
document.querySelectorAll(".tab").forEach((tab) => {
|
|
130
|
+
tab.addEventListener("click", () => {
|
|
131
|
+
document.querySelectorAll(".tab").forEach((t) => t.setAttribute("aria-selected", "false"));
|
|
132
|
+
tab.setAttribute("aria-selected", "true");
|
|
133
|
+
hours = Number(tab.dataset.hours);
|
|
134
|
+
load();
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
$("refresh").onclick = () => load();
|
|
138
|
+
$("org").onchange = () => load();
|
|
139
|
+
|
|
140
|
+
function fmt(n) { return new Intl.NumberFormat().format(n ?? 0); }
|
|
141
|
+
function escapeHtml(s) {
|
|
142
|
+
return String(s ?? "").replace(/[&<>"']/g, (c) => ({
|
|
143
|
+
"&": "&", "<": "<", ">": ">", '"': """, "'": "'"
|
|
144
|
+
})[c]);
|
|
145
|
+
}
|
|
146
|
+
function hourLabel(key) {
|
|
147
|
+
return key.slice(0, 10) + " " + key.slice(11, 13) + ":00 UTC";
|
|
148
|
+
}
|
|
149
|
+
function writes(row) { return (row.created || 0) + (row.updated || 0); }
|
|
150
|
+
|
|
151
|
+
async function load() {
|
|
152
|
+
$("error").hidden = true;
|
|
153
|
+
const params = new URLSearchParams();
|
|
154
|
+
params.set("hours", String(hours));
|
|
155
|
+
const org = $("org").value;
|
|
156
|
+
if (org && org !== "*") params.set("orgId", org);
|
|
157
|
+
try {
|
|
158
|
+
const res = await fetch("/_live/api/arrivals?" + params.toString());
|
|
159
|
+
const body = await res.json();
|
|
160
|
+
if (!res.ok || body.ok === false) throw new Error(body?.error?.message || ("HTTP " + res.status));
|
|
161
|
+
report = body;
|
|
162
|
+
fillOrgs(body.orgIds || [], org);
|
|
163
|
+
render();
|
|
164
|
+
schedule();
|
|
165
|
+
} catch (e) {
|
|
166
|
+
$("summary").textContent = "";
|
|
167
|
+
$("error").hidden = false;
|
|
168
|
+
$("error").textContent = e.message || String(e);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function schedule() {
|
|
173
|
+
if (timer) clearTimeout(timer);
|
|
174
|
+
const wait = report?.backfill?.status === "running" ? 5000 : 30000;
|
|
175
|
+
timer = setTimeout(load, wait);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function fillOrgs(orgIds, selected) {
|
|
179
|
+
const sel = $("org");
|
|
180
|
+
const keep = selected || sel.value || "*";
|
|
181
|
+
sel.innerHTML = "";
|
|
182
|
+
const all = document.createElement("option");
|
|
183
|
+
all.value = "*";
|
|
184
|
+
all.textContent = "All orgs";
|
|
185
|
+
sel.appendChild(all);
|
|
186
|
+
for (const id of orgIds) {
|
|
187
|
+
const o = document.createElement("option");
|
|
188
|
+
o.value = id;
|
|
189
|
+
o.textContent = id;
|
|
190
|
+
sel.appendChild(o);
|
|
191
|
+
}
|
|
192
|
+
sel.value = [...sel.options].some((o) => o.value === keep) ? keep : "*";
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function render() {
|
|
196
|
+
if (!report) return;
|
|
197
|
+
const series = report.series || [];
|
|
198
|
+
let created = 0, updated = 0;
|
|
199
|
+
const ots = new Set();
|
|
200
|
+
const cts = new Set();
|
|
201
|
+
for (const hour of series) {
|
|
202
|
+
created += hour.created || 0;
|
|
203
|
+
updated += hour.updated || 0;
|
|
204
|
+
for (const org of hour.orgs || []) {
|
|
205
|
+
for (const ot of org.objectTypes || []) {
|
|
206
|
+
ots.add(ot.objectType);
|
|
207
|
+
for (const ct of ot.contentTypes || []) cts.add(ot.objectType + "/" + ct.contentType);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
const bf = report.backfill || {};
|
|
212
|
+
const bfText = bf.status === "running"
|
|
213
|
+
? "history fill running"
|
|
214
|
+
: bf.status === "error"
|
|
215
|
+
? "history fill incomplete"
|
|
216
|
+
: bf.status === "done"
|
|
217
|
+
? "history filled through " + (bf.cutoff || "").slice(0, 16) + "Z"
|
|
218
|
+
: bf.status === "skipped"
|
|
219
|
+
? "history fill off"
|
|
220
|
+
: "history fill idle";
|
|
221
|
+
$("summary").innerHTML =
|
|
222
|
+
"<span>writes <strong>" + fmt(created + updated) + "</strong></span>" +
|
|
223
|
+
"<span>created <strong>" + fmt(created) + "</strong></span>" +
|
|
224
|
+
"<span>updated <strong>" + fmt(updated) + "</strong></span>" +
|
|
225
|
+
"<span>object types <strong>" + fmt(ots.size) + "</strong></span>" +
|
|
226
|
+
"<span>content types <strong>" + fmt(cts.size) + "</strong></span>" +
|
|
227
|
+
"<span>" + escapeHtml(bfText) + "</span>" +
|
|
228
|
+
(report.truncated ? "<span>truncated</span>" : "");
|
|
229
|
+
|
|
230
|
+
const max = Math.max(1, ...series.map(writes));
|
|
231
|
+
const chart = $("chart");
|
|
232
|
+
chart.hidden = series.length === 0;
|
|
233
|
+
chart.innerHTML = series.map((hour) => {
|
|
234
|
+
const n = writes(hour);
|
|
235
|
+
const h = n === 0 ? 2 : Math.max(4, Math.round((n / max) * 56));
|
|
236
|
+
return "<div class='bar" + (n ? "" : " empty") + "' style='height:" + h + "px' title='" +
|
|
237
|
+
escapeHtml(hourLabel(hour.hour) + " · " + n + " writes") + "'></div>";
|
|
238
|
+
}).join("");
|
|
239
|
+
$("chart-caption").textContent = series.length
|
|
240
|
+
? hourLabel(series[0].hour) + " → " + hourLabel(series[series.length - 1].hour) + " · bar height is writes"
|
|
241
|
+
: "";
|
|
242
|
+
|
|
243
|
+
const active = series.filter((hour) => writes(hour) > 0).reverse();
|
|
244
|
+
const root = $("hours");
|
|
245
|
+
if (!active.length) {
|
|
246
|
+
root.innerHTML = "<p class='muted'>No arrivals in this window yet.</p>";
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
const showOrg = (report.orgId == null) && (report.orgIds || []).length > 1;
|
|
250
|
+
root.innerHTML = active.map((hour) => {
|
|
251
|
+
const body = (hour.orgs || []).map((org) => {
|
|
252
|
+
const label = showOrg ? "<div class='org-label'>" + escapeHtml(org.orgId) + "</div>" : "";
|
|
253
|
+
const blocks = (org.objectTypes || []).map((ot) => {
|
|
254
|
+
const rows = (ot.contentTypes || []).map((ct) =>
|
|
255
|
+
"<tr><td class='mono'>" + escapeHtml(ct.contentType) + "</td>" +
|
|
256
|
+
"<td class='num'>" + fmt(ct.created) + "</td>" +
|
|
257
|
+
"<td class='num'>" + fmt(ct.updated) + "</td>" +
|
|
258
|
+
"<td class='num'>" + fmt(writes(ct)) + "</td></tr>"
|
|
259
|
+
).join("");
|
|
260
|
+
return "<details open><summary><span class='ot'>" + escapeHtml(ot.objectType) + "</span>" +
|
|
261
|
+
"<span class='counts'>" + fmt(ot.created) + " created · " + fmt(ot.updated) + " updated</span></summary>" +
|
|
262
|
+
"<table><thead><tr><th>Content type</th><th class='num'>Created</th><th class='num'>Updated</th><th class='num'>Writes</th></tr></thead><tbody>" +
|
|
263
|
+
rows + "</tbody></table></details>";
|
|
264
|
+
}).join("");
|
|
265
|
+
return label + blocks;
|
|
266
|
+
}).join("");
|
|
267
|
+
return "<section class='hour'><h2>" + escapeHtml(hourLabel(hour.hour)) +
|
|
268
|
+
"<span>" + fmt(writes(hour)) + " writes</span></h2>" + body + "</section>";
|
|
269
|
+
}).join("");
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
load();
|
|
273
|
+
</script>
|
|
274
|
+
</body>
|
|
275
|
+
</html>`;
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=arrivals-ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arrivals-ui.js","sourceRoot":"","sources":["../src/arrivals-ui.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,MAAM,UAAU,YAAY;IAC1B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAgRD,CAAC;AACT,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog-bridge.d.ts","sourceRoot":"","sources":["../src/catalog-bridge.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"catalog-bridge.d.ts","sourceRoot":"","sources":["../src/catalog-bridge.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC5E,OAAO,KAAK,EAEV,oBAAoB,EAGpB,qBAAqB,EACrB,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAEhF,MAAM,MAAM,cAAc,GAAG,qBAAqB,GAChD,qBAAqB,GACrB,oBAAoB,CAAC;AAsJvB,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,qBAAqB,EAC/B,QAAQ,EAAE,MAAM,EAAE,GACjB,cAAc,CAiFhB;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,qBAAqB,GAC9B,4BAA4B,CAuB9B"}
|
package/dist/catalog-bridge.js
CHANGED
|
@@ -1,11 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Bridge UnifiedMetadataClient → data-plane catalogs for ops wiring.
|
|
3
|
-
*
|
|
4
|
-
* Catalog lookups resolve against live installed metadata on every call so
|
|
5
|
-
* OrgPorts cache hits do not freeze a pre-install empty object-type map
|
|
6
|
-
* (e.g. agent alone after pack install must see new objectTypes).
|
|
7
|
-
*/
|
|
8
|
-
import { BUILTIN_CONTENT_PROFILES } from "@x12i/memorix-format/v2";
|
|
9
1
|
function asCategory(v) {
|
|
10
2
|
if (v === "event" || v === "knowledge" || v === "entity")
|
|
11
3
|
return v;
|
|
@@ -126,7 +118,38 @@ export function catalogFromMetadataClient(metadata, agentIds) {
|
|
|
126
118
|
return buildObjectTypes(metadata, agentIds).get(objectType) ?? null;
|
|
127
119
|
},
|
|
128
120
|
getContentProfile(contentType) {
|
|
129
|
-
|
|
121
|
+
const effective = metadata.resolveEffective(agentIds);
|
|
122
|
+
for (const entry of effective.effective ?? []) {
|
|
123
|
+
if (entry.kind !== "object-types")
|
|
124
|
+
continue;
|
|
125
|
+
const raw = entry.definition.contentTypes;
|
|
126
|
+
if (!Array.isArray(raw))
|
|
127
|
+
continue;
|
|
128
|
+
for (const item of raw) {
|
|
129
|
+
if (!item || typeof item !== "object")
|
|
130
|
+
continue;
|
|
131
|
+
const ct = item;
|
|
132
|
+
if (ct.id !== contentType || typeof ct.profile?.allowSnapshotBuckets !== "boolean")
|
|
133
|
+
continue;
|
|
134
|
+
const disc = ct.discriminator;
|
|
135
|
+
return {
|
|
136
|
+
contentType,
|
|
137
|
+
allowSnapshotBuckets: ct.profile.allowSnapshotBuckets,
|
|
138
|
+
...(disc?.path
|
|
139
|
+
? {
|
|
140
|
+
discriminator: {
|
|
141
|
+
path: disc.path,
|
|
142
|
+
required: disc.required === true,
|
|
143
|
+
...(typeof disc.defaultValue === "string" && disc.defaultValue
|
|
144
|
+
? { defaultValue: disc.defaultValue }
|
|
145
|
+
: {}),
|
|
146
|
+
},
|
|
147
|
+
}
|
|
148
|
+
: {}),
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return undefined;
|
|
130
153
|
},
|
|
131
154
|
getAllowedQueryPaths(_objectType, _contentType) {
|
|
132
155
|
return [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog-bridge.js","sourceRoot":"","sources":["../src/catalog-bridge.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"catalog-bridge.js","sourceRoot":"","sources":["../src/catalog-bridge.ts"],"names":[],"mappings":"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"}
|
package/dist/catalog-live-ui.js
CHANGED
|
@@ -91,7 +91,7 @@ export function catalogLiveHtml() {
|
|
|
91
91
|
<div class="meta">
|
|
92
92
|
<div><strong>UI</strong> /_live/catalog</div>
|
|
93
93
|
<div><strong>API</strong> /_live/api/catalog</div>
|
|
94
|
-
<div><a href="/_live">← live view</a> · <a href="/_live/activity">activity</a> · <a href="/_live/changes">data changes</a></div>
|
|
94
|
+
<div><a href="/_live">← live view</a> · <a href="/_live/activity">activity</a> · <a href="/_live/arrivals">arrivals</a> · <a href="/_live/changes">data changes</a></div>
|
|
95
95
|
</div>
|
|
96
96
|
</header>
|
|
97
97
|
<div class="toolbar">
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hourly content arrivals via @x12i/countex.
|
|
3
|
+
*
|
|
4
|
+
* One cell is an org × hour × object type × content type × created|updated.
|
|
5
|
+
* The live writer increments it. A one-time backfill fills earlier hours from
|
|
6
|
+
* stored timestamps. Deletes and analytics rollup writes are not counted.
|
|
7
|
+
*/
|
|
8
|
+
import type { MongoClient } from "mongodb";
|
|
9
|
+
import { type WriteEvent } from "./analytics/tracker.js";
|
|
10
|
+
export declare const CONTENT_ARRIVALS_COUNTER_ID = "content_arrivals";
|
|
11
|
+
export declare const CONTENT_ARRIVALS_DB = "memorix_content_arrivals";
|
|
12
|
+
export type ArrivalOp = "created" | "updated";
|
|
13
|
+
export type ArrivalEvent = {
|
|
14
|
+
orgId: string;
|
|
15
|
+
objectType: string;
|
|
16
|
+
contentType: string;
|
|
17
|
+
op: ArrivalOp;
|
|
18
|
+
/** ISO time. The hour bucket is taken from this instant. */
|
|
19
|
+
at: string;
|
|
20
|
+
delta?: number;
|
|
21
|
+
datasourceService?: string;
|
|
22
|
+
};
|
|
23
|
+
export type ArrivalContentType = {
|
|
24
|
+
contentType: string;
|
|
25
|
+
created: number;
|
|
26
|
+
updated: number;
|
|
27
|
+
};
|
|
28
|
+
export type ArrivalObjectType = {
|
|
29
|
+
objectType: string;
|
|
30
|
+
created: number;
|
|
31
|
+
updated: number;
|
|
32
|
+
contentTypes: ArrivalContentType[];
|
|
33
|
+
};
|
|
34
|
+
export type ArrivalOrgHour = {
|
|
35
|
+
orgId: string;
|
|
36
|
+
created: number;
|
|
37
|
+
updated: number;
|
|
38
|
+
objectTypes: ArrivalObjectType[];
|
|
39
|
+
};
|
|
40
|
+
export type ArrivalHour = {
|
|
41
|
+
/** UTC hour key, `YYYY-MM-DDTHH`. */
|
|
42
|
+
hour: string;
|
|
43
|
+
created: number;
|
|
44
|
+
updated: number;
|
|
45
|
+
orgs: ArrivalOrgHour[];
|
|
46
|
+
};
|
|
47
|
+
export type ArrivalsBackfillStatus = {
|
|
48
|
+
status: "idle" | "running" | "done" | "skipped" | "error";
|
|
49
|
+
cutoff: string | null;
|
|
50
|
+
hours: number | null;
|
|
51
|
+
error?: string;
|
|
52
|
+
};
|
|
53
|
+
export type ArrivalsReport = {
|
|
54
|
+
ok: true;
|
|
55
|
+
storage: "memory" | "mongo";
|
|
56
|
+
generatedAt: string;
|
|
57
|
+
hours: number;
|
|
58
|
+
from: string;
|
|
59
|
+
to: string;
|
|
60
|
+
orgId: string | null;
|
|
61
|
+
orgIds: string[];
|
|
62
|
+
truncated: boolean;
|
|
63
|
+
backfill: ArrivalsBackfillStatus;
|
|
64
|
+
series: ArrivalHour[];
|
|
65
|
+
};
|
|
66
|
+
export type ContentArrivals = {
|
|
67
|
+
readonly storage: "memory" | "mongo";
|
|
68
|
+
readonly cutoff: string;
|
|
69
|
+
knownOrgIds(): string[];
|
|
70
|
+
backfillStatus(): ArrivalsBackfillStatus;
|
|
71
|
+
setBackfillStatus(next: ArrivalsBackfillStatus): void;
|
|
72
|
+
/** True after shutdown. Backfill stops between collections. */
|
|
73
|
+
isClosed(): boolean;
|
|
74
|
+
observeWrite(orgId: string, event: WriteEvent): void;
|
|
75
|
+
record(event: ArrivalEvent): void;
|
|
76
|
+
ingestMany(events: ArrivalEvent[]): Promise<void>;
|
|
77
|
+
query(opts?: {
|
|
78
|
+
orgId?: string;
|
|
79
|
+
hours?: number;
|
|
80
|
+
now?: Date;
|
|
81
|
+
orgIds?: string[];
|
|
82
|
+
}): Promise<ArrivalsReport>;
|
|
83
|
+
flush(): Promise<void>;
|
|
84
|
+
shutdown(): Promise<void>;
|
|
85
|
+
};
|
|
86
|
+
export declare function hourKeysEnding(now: Date, hours: number): string[];
|
|
87
|
+
export declare function createContentArrivals(opts?: {
|
|
88
|
+
mongoClient?: MongoClient | null;
|
|
89
|
+
}): Promise<ContentArrivals>;
|
|
90
|
+
//# sourceMappingURL=content-arrivals-countex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-arrivals-countex.d.ts","sourceRoot":"","sources":["../src/content-arrivals-countex.ts"],"names":[],"mappings":"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"}
|