pi-mega-compact 0.12.2 → 0.12.3
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.
|
@@ -194,7 +194,12 @@ export function handlePerf(req, res, ctx) {
|
|
|
194
194
|
minutes = 30;
|
|
195
195
|
minutes = Math.min(minutes, 1440); // cap at 24h
|
|
196
196
|
const sinceTs = Date.now() - minutes * 60_000;
|
|
197
|
-
|
|
197
|
+
let rows = readPerfSamples(stateDir, sinceTs); // guardrails-allow PREVENT-PI-004: local SQLite read (loopback dashboard)
|
|
198
|
+
// Fallback: if the window is empty (stale data from a previous
|
|
199
|
+
// session), show the most recent 200 samples regardless of age.
|
|
200
|
+
if (rows.length === 0) {
|
|
201
|
+
rows = readPerfSamples(stateDir, 0).slice(-200);
|
|
202
|
+
}
|
|
198
203
|
const byKind = new Map();
|
|
199
204
|
for (const r of rows) {
|
|
200
205
|
let arr = byKind.get(r.kind);
|
|
@@ -48,10 +48,11 @@ export function buildCheckpointNodes(db, sessionId, nodes, edges) {
|
|
|
48
48
|
let prevId = null;
|
|
49
49
|
for (const row of rows) {
|
|
50
50
|
const id = String(row.id);
|
|
51
|
+
const rowSessionId = sessionId || String(row.session_id ?? "");
|
|
51
52
|
const summary = String(row.summary ?? "");
|
|
52
53
|
const node = {
|
|
53
54
|
id,
|
|
54
|
-
sessionId,
|
|
55
|
+
sessionId: rowSessionId,
|
|
55
56
|
label: id,
|
|
56
57
|
summaryTruncated: summary.length > 200 ? summary.slice(0, 197) + "..." : summary,
|
|
57
58
|
tokenEstimate: Number(row.token_estimate ?? 0),
|
|
@@ -107,14 +108,14 @@ export function buildTurnNodes(db, sessionId, nodes, edges) {
|
|
|
107
108
|
const existingIds = new Set(nodes.map((n) => n.id));
|
|
108
109
|
const rows = sessionId
|
|
109
110
|
? db
|
|
110
|
-
.prepare(`SELECT turn_index, role, pressure_band, ctx_tokens, ctx_percent,
|
|
111
|
+
.prepare(`SELECT turn_index, session_id, role, pressure_band, ctx_tokens, ctx_percent,
|
|
111
112
|
epoch_id, ended_at
|
|
112
113
|
FROM turns
|
|
113
114
|
WHERE session_id = ?
|
|
114
115
|
ORDER BY turn_index ASC`)
|
|
115
116
|
.all(sessionId)
|
|
116
117
|
: db
|
|
117
|
-
.prepare(`SELECT turn_index, role, pressure_band, ctx_tokens, ctx_percent,
|
|
118
|
+
.prepare(`SELECT turn_index, session_id, role, pressure_band, ctx_tokens, ctx_percent,
|
|
118
119
|
epoch_id, ended_at
|
|
119
120
|
FROM turns
|
|
120
121
|
ORDER BY turn_index ASC`)
|
|
@@ -124,7 +125,8 @@ export function buildTurnNodes(db, sessionId, nodes, edges) {
|
|
|
124
125
|
let prevId = null;
|
|
125
126
|
for (const row of rows) {
|
|
126
127
|
const ti = Number(row.turn_index);
|
|
127
|
-
const
|
|
128
|
+
const rowSessionId = sessionId || String(row.session_id ?? "");
|
|
129
|
+
const nodeId = `turn:${rowSessionId}:${ti}`;
|
|
128
130
|
if (existingIds.has(nodeId))
|
|
129
131
|
continue;
|
|
130
132
|
existingIds.add(nodeId);
|
|
@@ -132,7 +134,7 @@ export function buildTurnNodes(db, sessionId, nodes, edges) {
|
|
|
132
134
|
const endedAt = row.ended_at ? Number(row.ended_at) : Date.now();
|
|
133
135
|
const node = {
|
|
134
136
|
id: nodeId,
|
|
135
|
-
sessionId,
|
|
137
|
+
sessionId: rowSessionId,
|
|
136
138
|
label: `Turn ${ti}`,
|
|
137
139
|
summaryTruncated: `Turn ${ti}: ${role}${row.epoch_id ? ` (epoch: ${String(row.epoch_id)})` : ""}`,
|
|
138
140
|
tokenEstimate: row.ctx_tokens ? Number(row.ctx_tokens) : 0,
|
|
@@ -234,7 +234,12 @@ export function handlePerf(
|
|
|
234
234
|
if (!Number.isFinite(minutes) || minutes <= 0) minutes = 30;
|
|
235
235
|
minutes = Math.min(minutes, 1440); // cap at 24h
|
|
236
236
|
const sinceTs = Date.now() - minutes * 60_000;
|
|
237
|
-
|
|
237
|
+
let rows = readPerfSamples(stateDir, sinceTs); // guardrails-allow PREVENT-PI-004: local SQLite read (loopback dashboard)
|
|
238
|
+
// Fallback: if the window is empty (stale data from a previous
|
|
239
|
+
// session), show the most recent 200 samples regardless of age.
|
|
240
|
+
if (rows.length === 0) {
|
|
241
|
+
rows = readPerfSamples(stateDir, 0).slice(-200);
|
|
242
|
+
}
|
|
238
243
|
const byKind = new Map<string, number[]>();
|
|
239
244
|
for (const r of rows) {
|
|
240
245
|
let arr = byKind.get(r.kind);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-mega-compact",
|
|
3
|
-
"version": "0.12.
|
|
3
|
+
"version": "0.12.3",
|
|
4
4
|
"description": "Layered, local, vector-backed context compressor for pi — supersede/collapse/cluster compaction with deduped inline recall.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "BSD-3-Clause",
|
|
@@ -77,10 +77,11 @@ export function buildCheckpointNodes(
|
|
|
77
77
|
let prevId: string | null = null;
|
|
78
78
|
for (const row of rows) {
|
|
79
79
|
const id = String(row.id);
|
|
80
|
+
const rowSessionId = sessionId || String(row.session_id ?? "");
|
|
80
81
|
const summary = String(row.summary ?? "");
|
|
81
82
|
const node: MemoryGraphNode = {
|
|
82
83
|
id,
|
|
83
|
-
sessionId,
|
|
84
|
+
sessionId: rowSessionId,
|
|
84
85
|
label: id,
|
|
85
86
|
summaryTruncated: summary.length > 200 ? summary.slice(0, 197) + "..." : summary,
|
|
86
87
|
tokenEstimate: Number(row.token_estimate ?? 0),
|
|
@@ -149,7 +150,7 @@ export function buildTurnNodes(
|
|
|
149
150
|
const rows = sessionId
|
|
150
151
|
? (db
|
|
151
152
|
.prepare(
|
|
152
|
-
`SELECT turn_index, role, pressure_band, ctx_tokens, ctx_percent,
|
|
153
|
+
`SELECT turn_index, session_id, role, pressure_band, ctx_tokens, ctx_percent,
|
|
153
154
|
epoch_id, ended_at
|
|
154
155
|
FROM turns
|
|
155
156
|
WHERE session_id = ?
|
|
@@ -158,7 +159,7 @@ export function buildTurnNodes(
|
|
|
158
159
|
.all(sessionId) as Array<Record<string, unknown>>)
|
|
159
160
|
: (db
|
|
160
161
|
.prepare(
|
|
161
|
-
`SELECT turn_index, role, pressure_band, ctx_tokens, ctx_percent,
|
|
162
|
+
`SELECT turn_index, session_id, role, pressure_band, ctx_tokens, ctx_percent,
|
|
162
163
|
epoch_id, ended_at
|
|
163
164
|
FROM turns
|
|
164
165
|
ORDER BY turn_index ASC`,
|
|
@@ -170,7 +171,8 @@ export function buildTurnNodes(
|
|
|
170
171
|
let prevId: string | null = null;
|
|
171
172
|
for (const row of rows) {
|
|
172
173
|
const ti = Number(row.turn_index);
|
|
173
|
-
const
|
|
174
|
+
const rowSessionId = sessionId || String(row.session_id ?? "");
|
|
175
|
+
const nodeId = `turn:${rowSessionId}:${ti}`;
|
|
174
176
|
if (existingIds.has(nodeId)) continue;
|
|
175
177
|
existingIds.add(nodeId);
|
|
176
178
|
|
|
@@ -179,7 +181,7 @@ export function buildTurnNodes(
|
|
|
179
181
|
|
|
180
182
|
const node: MemoryGraphNode = {
|
|
181
183
|
id: nodeId,
|
|
182
|
-
sessionId,
|
|
184
|
+
sessionId: rowSessionId,
|
|
183
185
|
label: `Turn ${ti}`,
|
|
184
186
|
summaryTruncated: `Turn ${ti}: ${role}${row.epoch_id ? ` (epoch: ${String(row.epoch_id)})` : ""}`,
|
|
185
187
|
tokenEstimate: row.ctx_tokens ? Number(row.ctx_tokens) : 0,
|