pi-mega-compact 0.20.72 → 0.20.74

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.
Files changed (75) hide show
  1. package/dist/extensions/dashboard-server/routes-setup-cortex-actions.js +7 -0
  2. package/dist/extensions/dashboard-server/routes-setup-enc2a.js +21 -5
  3. package/dist/extensions/dashboard-server/routes-setup-enc2b.js +53 -2
  4. package/dist/extensions/dashboard-server/routes-vector-cortex-helpers.js +8 -0
  5. package/dist/src/vector-cortex/encoder/native-qualify-retest.js +25 -9
  6. package/dist/vector-cortex/encoder/native-qualify-retest.js +25 -9
  7. package/extensions/dashboard-client/dist/assets/{AdminTab-ZyVtgYrZ.js → AdminTab-CqhIxrlT.js} +2 -2
  8. package/extensions/dashboard-client/dist/assets/{AdminTab-ZyVtgYrZ.js.map → AdminTab-CqhIxrlT.js.map} +1 -1
  9. package/extensions/dashboard-client/dist/assets/{AreaChart-7ms8Hk1m.js → AreaChart-D4EY7yiY.js} +2 -2
  10. package/extensions/dashboard-client/dist/assets/{AreaChart-7ms8Hk1m.js.map → AreaChart-D4EY7yiY.js.map} +1 -1
  11. package/extensions/dashboard-client/dist/assets/{BarChart-DeTE0NXA.js → BarChart-r_BFpd7a.js} +2 -2
  12. package/extensions/dashboard-client/dist/assets/{BarChart-DeTE0NXA.js.map → BarChart-r_BFpd7a.js.map} +1 -1
  13. package/extensions/dashboard-client/dist/assets/{CacheTab-CpIrpr_X.js → CacheTab-Bf5rwce6.js} +2 -2
  14. package/extensions/dashboard-client/dist/assets/{CacheTab-CpIrpr_X.js.map → CacheTab-Bf5rwce6.js.map} +1 -1
  15. package/extensions/dashboard-client/dist/assets/{ConfigTab-BNMrO7uz.js → ConfigTab-RFUXAUIP.js} +2 -2
  16. package/extensions/dashboard-client/dist/assets/{ConfigTab-BNMrO7uz.js.map → ConfigTab-RFUXAUIP.js.map} +1 -1
  17. package/extensions/dashboard-client/dist/assets/{EventsTab-j42vDTjs.js → EventsTab-DEqHbSHf.js} +2 -2
  18. package/extensions/dashboard-client/dist/assets/{EventsTab-j42vDTjs.js.map → EventsTab-DEqHbSHf.js.map} +1 -1
  19. package/extensions/dashboard-client/dist/assets/{HealthTab-D0Tf8XM_.js → HealthTab-WGEwtqmO.js} +2 -2
  20. package/extensions/dashboard-client/dist/assets/{HealthTab-D0Tf8XM_.js.map → HealthTab-WGEwtqmO.js.map} +1 -1
  21. package/extensions/dashboard-client/dist/assets/{MaintenanceTab-CleWX_RM.js → MaintenanceTab-ClT1D4P9.js} +2 -2
  22. package/extensions/dashboard-client/dist/assets/{MaintenanceTab-CleWX_RM.js.map → MaintenanceTab-ClT1D4P9.js.map} +1 -1
  23. package/extensions/dashboard-client/dist/assets/{MemoryMapTab-LUpPJzNP.js → MemoryMapTab-DaAxLJ5x.js} +2 -2
  24. package/extensions/dashboard-client/dist/assets/{MemoryMapTab-LUpPJzNP.js.map → MemoryMapTab-DaAxLJ5x.js.map} +1 -1
  25. package/extensions/dashboard-client/dist/assets/{MetricsCards-G4_uynTE.js → MetricsCards-CprVx2Yq.js} +2 -2
  26. package/extensions/dashboard-client/dist/assets/{MetricsCards-G4_uynTE.js.map → MetricsCards-CprVx2Yq.js.map} +1 -1
  27. package/extensions/dashboard-client/dist/assets/MetricsTab-8WBHRpRp.js +2 -0
  28. package/extensions/dashboard-client/dist/assets/{MetricsTab-yypKMQXf.js.map → MetricsTab-8WBHRpRp.js.map} +1 -1
  29. package/extensions/dashboard-client/dist/assets/{OverviewTab-M47NMRaT.js → OverviewTab-C5ClXheK.js} +2 -2
  30. package/extensions/dashboard-client/dist/assets/{OverviewTab-M47NMRaT.js.map → OverviewTab-C5ClXheK.js.map} +1 -1
  31. package/extensions/dashboard-client/dist/assets/{ReposTab-BX3ZxrAI.js → ReposTab-BOX5sOBg.js} +2 -2
  32. package/extensions/dashboard-client/dist/assets/{ReposTab-BX3ZxrAI.js.map → ReposTab-BOX5sOBg.js.map} +1 -1
  33. package/extensions/dashboard-client/dist/assets/{SessionsTab-CSUmsNeZ.js → SessionsTab-DKUO5gCp.js} +2 -2
  34. package/extensions/dashboard-client/dist/assets/{SessionsTab-CSUmsNeZ.js.map → SessionsTab-DKUO5gCp.js.map} +1 -1
  35. package/extensions/dashboard-client/dist/assets/{SetupTab-jF9BsQjw.js → SetupTab-CeeRk5Rd.js} +3 -3
  36. package/extensions/dashboard-client/dist/assets/{SetupTab-jF9BsQjw.js.map → SetupTab-CeeRk5Rd.js.map} +1 -1
  37. package/extensions/dashboard-client/dist/assets/{TimeSavedCard-qfwO1WJ3.js → TimeSavedCard-Dlhljae9.js} +2 -2
  38. package/extensions/dashboard-client/dist/assets/{TimeSavedCard-qfwO1WJ3.js.map → TimeSavedCard-Dlhljae9.js.map} +1 -1
  39. package/extensions/dashboard-client/dist/assets/{TurnMemoryView-C7NQo_xi.js → TurnMemoryView-B8fWymMP.js} +2 -2
  40. package/extensions/dashboard-client/dist/assets/{TurnMemoryView-C7NQo_xi.js.map → TurnMemoryView-B8fWymMP.js.map} +1 -1
  41. package/extensions/dashboard-client/dist/assets/TurnsTab-kJ4sfWSd.js +2 -0
  42. package/extensions/dashboard-client/dist/assets/{TurnsTab-D-19giqQ.js.map → TurnsTab-kJ4sfWSd.js.map} +1 -1
  43. package/extensions/dashboard-client/dist/assets/{VcStatusBadge-DTHlwuUJ.js → VcStatusBadge-FJZlkrD7.js} +2 -2
  44. package/extensions/dashboard-client/dist/assets/{VcStatusBadge-DTHlwuUJ.js.map → VcStatusBadge-FJZlkrD7.js.map} +1 -1
  45. package/extensions/dashboard-client/dist/assets/{VectorCortexTab-Dvgdcwvs.js → VectorCortexTab-C1iE6z4c.js} +2 -2
  46. package/extensions/dashboard-client/dist/assets/{VectorCortexTab-Dvgdcwvs.js.map → VectorCortexTab-C1iE6z4c.js.map} +1 -1
  47. package/extensions/dashboard-client/dist/assets/{WikiTab-CYUEAQmZ.js → WikiTab-BXqRiTbt.js} +2 -2
  48. package/extensions/dashboard-client/dist/assets/{WikiTab-CYUEAQmZ.js.map → WikiTab-BXqRiTbt.js.map} +1 -1
  49. package/extensions/dashboard-client/dist/assets/{button-DPOwTRN8.js → button-CUeN3VyF.js} +2 -2
  50. package/extensions/dashboard-client/dist/assets/{button-DPOwTRN8.js.map → button-CUeN3VyF.js.map} +1 -1
  51. package/extensions/dashboard-client/dist/assets/{card-CUipkgi9.js → card-DtOD33bZ.js} +2 -2
  52. package/extensions/dashboard-client/dist/assets/{card-CUipkgi9.js.map → card-DtOD33bZ.js.map} +1 -1
  53. package/extensions/dashboard-client/dist/assets/{client-extra-9lcKX-iO.js → client-extra-_tIKSPZ3.js} +2 -2
  54. package/extensions/dashboard-client/dist/assets/{client-extra-9lcKX-iO.js.map → client-extra-_tIKSPZ3.js.map} +1 -1
  55. package/extensions/dashboard-client/dist/assets/{generateCategoricalChart-_WpiJebf.js → generateCategoricalChart-8AyWGIrK.js} +2 -2
  56. package/extensions/dashboard-client/dist/assets/{generateCategoricalChart-_WpiJebf.js.map → generateCategoricalChart-8AyWGIrK.js.map} +1 -1
  57. package/extensions/dashboard-client/dist/assets/{index-DlHJ7LBL.js → index-BBJ8LglL.js} +3 -3
  58. package/extensions/dashboard-client/dist/assets/{index-DlHJ7LBL.js.map → index-BBJ8LglL.js.map} +1 -1
  59. package/extensions/dashboard-client/dist/assets/{switch-Cx6-1wnT.js → switch-Drm0yRgr.js} +2 -2
  60. package/extensions/dashboard-client/dist/assets/{switch-Cx6-1wnT.js.map → switch-Drm0yRgr.js.map} +1 -1
  61. package/extensions/dashboard-client/dist/assets/{toggle-Y3vbE0NG.js → toggle-DnRtZDPW.js} +2 -2
  62. package/extensions/dashboard-client/dist/assets/{toggle-Y3vbE0NG.js.map → toggle-DnRtZDPW.js.map} +1 -1
  63. package/extensions/dashboard-client/dist/assets/{useSSE-CnJdk56R.js → useSSE-l_bpRt_v.js} +2 -2
  64. package/extensions/dashboard-client/dist/assets/{useSSE-CnJdk56R.js.map → useSSE-l_bpRt_v.js.map} +1 -1
  65. package/extensions/dashboard-client/dist/index.html +1 -1
  66. package/extensions/dashboard-client/src/tabs/SetupTab/CortexRuntimeCard.tsx +6 -11
  67. package/extensions/dashboard-server/api-contracts/setup.ts +4 -2
  68. package/extensions/dashboard-server/routes-setup-cortex-actions.ts +7 -0
  69. package/extensions/dashboard-server/routes-setup-enc2a.ts +20 -10
  70. package/extensions/dashboard-server/routes-setup-enc2b.ts +53 -2
  71. package/extensions/dashboard-server/routes-vector-cortex-helpers.ts +8 -0
  72. package/package.json +1 -1
  73. package/src/vector-cortex/encoder/native-qualify-retest.ts +26 -10
  74. package/extensions/dashboard-client/dist/assets/MetricsTab-yypKMQXf.js +0 -2
  75. package/extensions/dashboard-client/dist/assets/TurnsTab-D-19giqQ.js +0 -2
@@ -27,11 +27,16 @@
27
27
  * zero network — the retest NEVER fetches), PREVENT-011 (no `any`).
28
28
  */
29
29
 
30
+ import { writeFileSync, renameSync, mkdirSync } from "node:fs";
31
+ import { join } from "node:path";
30
32
  import { ENC_2B_ENABLED } from "../../src/config/vector-cortex.js";
31
33
  import {
32
34
  runNativeRetest,
33
35
  type RetestResult,
34
36
  } from "../../src/vector-cortex/encoder/native-qualify-retest.js";
37
+ import { Logger } from "../../src/log.js";
38
+ import type { QualificationV1 } from "../../src/vector-cortex/encoder/qualify.js";
39
+ import { encoderStateDir } from "./qualification-record.js";
35
40
  import type { SetupConfigureRequest } from "./api-contracts/setup.js";
36
41
 
37
42
  /**
@@ -50,6 +55,10 @@ export async function readEnc2bRetest(stateDir: string): Promise<{
50
55
  if (!ENC_2B_ENABLED()) return {};
51
56
  const result = await runNativeRetest(stateDir);
52
57
  if (result === null) return {};
58
+ // Auto-persist a qualified verdict so the ENC-0g read path + HG-5 pick up the
59
+ // native result automatically — the operator does not need to click "Retest
60
+ // now" for the record to update. Degraded/failed never overwrite.
61
+ if (result.verdict === "qualified") persistQualifiedRecord(result);
53
62
  return {
54
63
  nativeOrtRetestResult: result,
55
64
  nativeOrtBackendEffective: result.verdict === "qualified" ? "native" : "wasm",
@@ -71,12 +80,54 @@ export function enc2bRetestRequest(body: SetupConfigureRequest): "run" | "reject
71
80
  return null;
72
81
  }
73
82
 
83
+ /**
84
+ * Atomically write a fresh `qualified` QualificationV1 record back to
85
+ * <stateDir>/encoder-qualification.json. This closes the ENC-2b loop: native
86
+ * install → retest qualifies → the HG-5 source-of-truth record is overwritten
87
+ * so the runtime can select mode A. Best-effort (PREVENT-PI-004 local FS only;
88
+ * never throws into the route). Only ever invoked on a `qualified` verdict —
89
+ * a `degraded`/`failed` retest never sweeps into the record (the incumbent
90
+ * verdict stands).
91
+ */
92
+ export function persistQualifiedRecord(result: RetestResult): void {
93
+ const record: QualificationV1 = {
94
+ schema: "qualification-v1",
95
+ verdict: "qualified",
96
+ reasons: [],
97
+ platform: result.platform,
98
+ p95Ms: result.p95Ms,
99
+ rssMib: result.rssMiB,
100
+ opset: 21,
101
+ digest: "",
102
+ };
103
+ const dir = encoderStateDir();
104
+ const finalPath = join(dir, "encoder-qualification.json");
105
+ const tmpPath = join(dir, `encoder-qualification.json.tmp-${process.pid}`);
106
+ try {
107
+ // guardrails-allow PREVENT-PI-004: local qualification-record write (loopback)
108
+ mkdirSync(dir, { recursive: true });
109
+ writeFileSync(tmpPath, `${JSON.stringify(record, null, 2)}\n`, "utf8");
110
+ renameSync(tmpPath, finalPath);
111
+ } catch (err) {
112
+ // Best-effort: log + continue — a persist failure must never break the route.
113
+ new Logger().warn("enc2b_qualification_record_persist_failed", {
114
+ error: String(err),
115
+ verdict: result.verdict,
116
+ });
117
+ }
118
+ }
119
+
74
120
  /**
75
121
  * Run the ENC-2b retest now (bounded, synchronous on the request) and return
76
122
  * the fresh result. Flag-off or no binding → null. Used by the POST "run"
77
- * branch; the result is returned on the response body, never persisted.
123
+ * branch; the result is returned on the response body. When the retest
124
+ * qualifies, the qualification record is atomically updated (side-effect).
78
125
  */
79
126
  export async function runEnc2bRetest(stateDir: string): Promise<RetestResult | null> {
80
127
  if (!ENC_2B_ENABLED()) return null;
81
- return runNativeRetest(stateDir);
128
+ const result = await runNativeRetest(stateDir);
129
+ if (result !== null && result.verdict === "qualified") {
130
+ persistQualifiedRecord(result);
131
+ }
132
+ return result;
82
133
  }
@@ -72,6 +72,14 @@ export async function withServer<T>(
72
72
  env: {
73
73
  ...process.env,
74
74
  MEGACOMPACT_INDEX_DIR: dir,
75
+ // Forward test-isolation overrides so the spawned server's readers
76
+ // resolve to the test temp dir, not the operator's global install.
77
+ ...(process.env.MEGACOMPACT_STATE_DIR !== undefined
78
+ ? { MEGACOMPACT_STATE_DIR: process.env.MEGACOMPACT_STATE_DIR }
79
+ : {}),
80
+ ...(process.env.MEGACOMPACT_NATIVE_ORT_ROOT !== undefined
81
+ ? { MEGACOMPACT_NATIVE_ORT_ROOT: process.env.MEGACOMPACT_NATIVE_ORT_ROOT }
82
+ : {}),
75
83
  },
76
84
  });
77
85
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-mega-compact",
3
- "version": "0.20.72",
3
+ "version": "0.20.74",
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",
@@ -29,7 +29,9 @@
29
29
  */
30
30
 
31
31
  import { readFileSync, existsSync } from "node:fs";
32
- import { join } from "node:path";
32
+ import { join, dirname } from "node:path";
33
+ import { homedir, cpus } from "node:os";
34
+ import { fileURLToPath } from "node:url";
33
35
  import { ENCODER_LATENCY_P95_MS, ENCODER_MAX_TOKENS } from "./types.js";
34
36
  import { installBudgetMib } from "./decision.js";
35
37
  import { detectPlatform } from "./asset.js";
@@ -122,13 +124,24 @@ function readInstalledVersion(pkgJsonPath: string): string | null {
122
124
  }
123
125
  }
124
126
 
125
- /** Locate a LOCAL onnx model to probe against, under the native-ort roots.
126
- * Null when none exists (the retest cannot qualify without a probe target). */
127
+ /** Locate a LOCAL onnx model to probe against. Probes the native-ort root, the
128
+ * stateDir, the repo asset dir (walk-up from this module), and the installed
129
+ * extension dir. Null when none exists. */
127
130
  function findLocalModel(stateDir: string): string | null {
128
- const candidates = [
131
+ const candidates: string[] = [
129
132
  join(nativeOrtRootCandidates(stateDir)[0], "model.onnx"),
130
133
  join(stateDir, "model.onnx"),
134
+ join(homedir(), ".pi", "agent", "npm", "node_modules", "pi-mega-compact",
135
+ "assets", "vector-cortex", "encoder-v1", "model.onnx"),
131
136
  ];
137
+ // Walk up from this module's location looking for the repo asset dir.
138
+ let dir = dirname(fileURLToPath(import.meta.url));
139
+ for (let i = 0; i < 8; i++) {
140
+ candidates.push(join(dir, "assets", "vector-cortex", "encoder-v1", "model.onnx"));
141
+ const next = dirname(dir);
142
+ if (next === dir) break;
143
+ dir = next;
144
+ }
132
145
  for (const c of candidates) {
133
146
  if (existsSync(c)) return c;
134
147
  }
@@ -172,12 +185,15 @@ export async function runNativeRetest(stateDir: string): Promise<RetestResult |
172
185
  }
173
186
 
174
187
  // Load the LOCAL binding via dynamic import. Load failure -> failed verdict.
188
+ // onnxruntime-node's package.json "main" is "dist/index.js" (the compiled JS
189
+ // that loads the native .node binding). Fall back to the bare package import
190
+ // (resolves via the installed node_modules resolution) as a secondary path.
175
191
  let ort: unknown;
176
192
  try {
177
- ort = await import(join(rootDir, "lib", "index.js"));
193
+ ort = await import(join(rootDir, "dist", "index.js"));
178
194
  } catch {
179
195
  try {
180
- ort = await import(join(rootDir, "dist", "ort.node.mjs"));
196
+ ort = await import(join(rootDir));
181
197
  } catch {
182
198
  return {
183
199
  platform: platformStr,
@@ -215,7 +231,7 @@ export async function runNativeRetest(stateDir: string): Promise<RetestResult |
215
231
  };
216
232
  const session = await factory.InferenceSession.create(modelPath, {
217
233
  executionProviders: ["cpu"],
218
- intraOpNumThreads: 4,
234
+ intraOpNumThreads: Math.min(8, Math.max(1, cpus().length - 1)),
219
235
  graphOptimizationLevel: "all",
220
236
  });
221
237
  const n = ENCODER_MAX_TOKENS;
@@ -225,10 +241,10 @@ export async function runNativeRetest(stateDir: string): Promise<RetestResult |
225
241
  const mask = BigInt64Array.from({ length: n }, () => 1n);
226
242
  const types = new BigInt64Array(n);
227
243
 
228
- // Bounded warmup (3 passes) + 10 timed passes.
229
- for (let i = 0; i < 3; i++) await timedPass(ort, session, ids, mask, types);
244
+ // Bounded warmup (10 passes) + 30 timed passes for a stable p95.
245
+ for (let i = 0; i < 10; i++) await timedPass(ort, session, ids, mask, types);
230
246
  const lat: number[] = [];
231
- for (let i = 0; i < 10; i++) {
247
+ for (let i = 0; i < 30; i++) {
232
248
  const ms = await timedPass(ort, session, ids, mask, types);
233
249
  if (ms === null) break;
234
250
  lat.push(ms);
@@ -1,2 +0,0 @@
1
- import{j as r}from"./index-DlHJ7LBL.js";import{M as t}from"./MetricsCards-G4_uynTE.js";import"./card-CUipkgi9.js";import"./generateCategoricalChart-_WpiJebf.js";import"./BarChart-DeTE0NXA.js";import"./AreaChart-7ms8Hk1m.js";function e(){return r.jsx(t,{})}export{e as default};
2
- //# sourceMappingURL=MetricsTab-yypKMQXf.js.map
@@ -1,2 +0,0 @@
1
- import{j as r}from"./index-DlHJ7LBL.js";import{T as o}from"./TurnMemoryView-C7NQo_xi.js";import"./card-CUipkgi9.js";import"./button-DPOwTRN8.js";function e(){return r.jsx(o,{})}export{e as default};
2
- //# sourceMappingURL=TurnsTab-D-19giqQ.js.map