pi-mega-compact 0.20.31 → 0.20.33

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 (91) hide show
  1. package/dist/config/vector-cortex-pcc.js +30 -0
  2. package/dist/config/vector-cortex.js +2 -2
  3. package/dist/config.js +1 -1
  4. package/dist/extensions/dashboard-server/api-contracts/endpoints/registry-ext.js +7 -0
  5. package/dist/extensions/dashboard-server/api-contracts/prefix-stability.js +8 -0
  6. package/dist/extensions/dashboard-server/route-dispatch.js +3 -1
  7. package/dist/extensions/dashboard-server/routes-prefix-stability.js +132 -0
  8. package/dist/extensions/dashboard-server/routes-rag-settings-helpers.js +1 -1
  9. package/dist/extensions/dashboard-server/routes-rag-settings-vector-cortex.js +1 -0
  10. package/dist/extensions/dashboard-server/routes.js +1 -0
  11. package/dist/extensions/mega-config.js +2 -1
  12. package/dist/extensions/mega-events/context-handler/tailResult.js +5 -1
  13. package/dist/extensions/mega-events/separated-prompt.js +4 -10
  14. package/dist/src/config/vector-cortex-pcc.js +30 -0
  15. package/dist/src/config/vector-cortex.js +2 -2
  16. package/dist/src/config.js +1 -1
  17. package/extensions/dashboard-client/dist/assets/{AreaChart-EL8l2Fcj.js → AreaChart-DjXp8u2Y.js} +2 -2
  18. package/extensions/dashboard-client/dist/assets/{AreaChart-EL8l2Fcj.js.map → AreaChart-DjXp8u2Y.js.map} +1 -1
  19. package/extensions/dashboard-client/dist/assets/{BarChart-TrwfSh0w.js → BarChart-BZbus-dR.js} +2 -2
  20. package/extensions/dashboard-client/dist/assets/{BarChart-TrwfSh0w.js.map → BarChart-BZbus-dR.js.map} +1 -1
  21. package/extensions/dashboard-client/dist/assets/CacheTab-DQ2CjxVW.js +2 -0
  22. package/extensions/dashboard-client/dist/assets/CacheTab-DQ2CjxVW.js.map +1 -0
  23. package/extensions/dashboard-client/dist/assets/{EventsTab-CNrT-b7t.js → EventsTab-DUpnOV1p.js} +2 -2
  24. package/extensions/dashboard-client/dist/assets/{EventsTab-CNrT-b7t.js.map → EventsTab-DUpnOV1p.js.map} +1 -1
  25. package/extensions/dashboard-client/dist/assets/{HealthTab-CkBCFPk6.js → HealthTab-Bul_xjcn.js} +2 -2
  26. package/extensions/dashboard-client/dist/assets/{HealthTab-CkBCFPk6.js.map → HealthTab-Bul_xjcn.js.map} +1 -1
  27. package/extensions/dashboard-client/dist/assets/{MaintenanceTab-CcbKszwx.js → MaintenanceTab-DLUjdKd3.js} +2 -2
  28. package/extensions/dashboard-client/dist/assets/{MaintenanceTab-CcbKszwx.js.map → MaintenanceTab-DLUjdKd3.js.map} +1 -1
  29. package/extensions/dashboard-client/dist/assets/{MemoryMapTab-B2LvwScj.js → MemoryMapTab-BFy0hb6F.js} +2 -2
  30. package/extensions/dashboard-client/dist/assets/{MemoryMapTab-B2LvwScj.js.map → MemoryMapTab-BFy0hb6F.js.map} +1 -1
  31. package/extensions/dashboard-client/dist/assets/{MetricsTab-Dv_xZtOG.js → MetricsTab-BpYuUkq3.js} +2 -2
  32. package/extensions/dashboard-client/dist/assets/{MetricsTab-Dv_xZtOG.js.map → MetricsTab-BpYuUkq3.js.map} +1 -1
  33. package/extensions/dashboard-client/dist/assets/{OverviewTab-D7xwhpOl.js → OverviewTab-z7yuT-uq.js} +2 -2
  34. package/extensions/dashboard-client/dist/assets/{OverviewTab-D7xwhpOl.js.map → OverviewTab-z7yuT-uq.js.map} +1 -1
  35. package/extensions/dashboard-client/dist/assets/{ReposTab-BfhiPXdA.js → ReposTab-ClORoDy_.js} +2 -2
  36. package/extensions/dashboard-client/dist/assets/{ReposTab-BfhiPXdA.js.map → ReposTab-ClORoDy_.js.map} +1 -1
  37. package/extensions/dashboard-client/dist/assets/{SessionsTab-tQM0TQLp.js → SessionsTab-CUpehIt9.js} +2 -2
  38. package/extensions/dashboard-client/dist/assets/{SessionsTab-tQM0TQLp.js.map → SessionsTab-CUpehIt9.js.map} +1 -1
  39. package/extensions/dashboard-client/dist/assets/SetupTab-Cii80Fdz.js +3 -0
  40. package/extensions/dashboard-client/dist/assets/{SetupTab-G-MkdQiR.js.map → SetupTab-Cii80Fdz.js.map} +1 -1
  41. package/extensions/dashboard-client/dist/assets/{TimeSavedCard-CYltysD3.js → TimeSavedCard-BV2iCSdV.js} +2 -2
  42. package/extensions/dashboard-client/dist/assets/{TimeSavedCard-CYltysD3.js.map → TimeSavedCard-BV2iCSdV.js.map} +1 -1
  43. package/extensions/dashboard-client/dist/assets/{TurnsTab-1Y_Lpxx-.js → TurnsTab-1T86rHnD.js} +2 -2
  44. package/extensions/dashboard-client/dist/assets/{TurnsTab-1Y_Lpxx-.js.map → TurnsTab-1T86rHnD.js.map} +1 -1
  45. package/extensions/dashboard-client/dist/assets/{VcStatusBadge-BNHVeTG7.js → VcStatusBadge-DKPleja8.js} +2 -2
  46. package/extensions/dashboard-client/dist/assets/{VcStatusBadge-BNHVeTG7.js.map → VcStatusBadge-DKPleja8.js.map} +1 -1
  47. package/extensions/dashboard-client/dist/assets/{VectorCortexTab-goacPxL1.js → VectorCortexTab-BRzvd_pU.js} +2 -2
  48. package/extensions/dashboard-client/dist/assets/{VectorCortexTab-goacPxL1.js.map → VectorCortexTab-BRzvd_pU.js.map} +1 -1
  49. package/extensions/dashboard-client/dist/assets/{WikiTab-DTOemYtE.js → WikiTab-DKTILa1M.js} +2 -2
  50. package/extensions/dashboard-client/dist/assets/{WikiTab-DTOemYtE.js.map → WikiTab-DKTILa1M.js.map} +1 -1
  51. package/extensions/dashboard-client/dist/assets/{button-B_4j_PVR.js → button-5fSU8BZj.js} +2 -2
  52. package/extensions/dashboard-client/dist/assets/{button-B_4j_PVR.js.map → button-5fSU8BZj.js.map} +1 -1
  53. package/extensions/dashboard-client/dist/assets/{card-Ce58rSXG.js → card-BFUnpXE_.js} +2 -2
  54. package/extensions/dashboard-client/dist/assets/{card-Ce58rSXG.js.map → card-BFUnpXE_.js.map} +1 -1
  55. package/extensions/dashboard-client/dist/assets/client-extra-BZbw21wu.js +2 -0
  56. package/extensions/dashboard-client/dist/assets/client-extra-BZbw21wu.js.map +1 -0
  57. package/extensions/dashboard-client/dist/assets/{generateCategoricalChart-DtNoJ6fZ.js → generateCategoricalChart-xCzi6pWn.js} +2 -2
  58. package/extensions/dashboard-client/dist/assets/{generateCategoricalChart-DtNoJ6fZ.js.map → generateCategoricalChart-xCzi6pWn.js.map} +1 -1
  59. package/extensions/dashboard-client/dist/assets/{index-eoCm0uxj.js → index-DqjmZ88m.js} +21 -21
  60. package/extensions/dashboard-client/dist/assets/index-DqjmZ88m.js.map +1 -0
  61. package/extensions/dashboard-client/dist/assets/{switch-B9kM0N7R.js → switch-CeZUPf_e.js} +2 -2
  62. package/extensions/dashboard-client/dist/assets/{switch-B9kM0N7R.js.map → switch-CeZUPf_e.js.map} +1 -1
  63. package/extensions/dashboard-client/dist/assets/{toggle-BwoHYpMa.js → toggle-MQQwdkwD.js} +2 -2
  64. package/extensions/dashboard-client/dist/assets/{toggle-BwoHYpMa.js.map → toggle-MQQwdkwD.js.map} +1 -1
  65. package/extensions/dashboard-client/dist/assets/{useSSE-DohG5AGv.js → useSSE-BetS7QHN.js} +2 -2
  66. package/extensions/dashboard-client/dist/assets/{useSSE-DohG5AGv.js.map → useSSE-BetS7QHN.js.map} +1 -1
  67. package/extensions/dashboard-client/dist/index.html +1 -1
  68. package/extensions/dashboard-client/src/api/client-extra.ts +53 -0
  69. package/extensions/dashboard-client/src/api/client-http.ts +81 -0
  70. package/extensions/dashboard-client/src/api/client.ts +11 -100
  71. package/extensions/dashboard-client/src/components/PrefixStabilityCard.tsx +98 -0
  72. package/extensions/dashboard-client/src/tabs/CacheTab.tsx +27 -0
  73. package/extensions/dashboard-server/api-contracts/endpoints/registry-ext.ts +15 -0
  74. package/extensions/dashboard-server/api-contracts/index.ts +6 -0
  75. package/extensions/dashboard-server/api-contracts/prefix-stability.ts +40 -0
  76. package/extensions/dashboard-server/route-dispatch.ts +2 -0
  77. package/extensions/dashboard-server/routes-prefix-stability.ts +142 -0
  78. package/extensions/dashboard-server/routes-rag-settings-helpers.ts +1 -1
  79. package/extensions/dashboard-server/routes-rag-settings-vector-cortex.ts +6 -0
  80. package/extensions/dashboard-server/routes.ts +1 -0
  81. package/extensions/mega-config.ts +2 -1
  82. package/extensions/mega-events/context-handler/tailResult.ts +5 -1
  83. package/extensions/mega-events/separated-prompt.ts +4 -11
  84. package/package.json +1 -1
  85. package/src/config/vector-cortex-pcc.ts +32 -0
  86. package/src/config/vector-cortex.ts +2 -2
  87. package/src/config.ts +1 -0
  88. package/extensions/dashboard-client/dist/assets/CacheTab-C3KWDFDm.js +0 -2
  89. package/extensions/dashboard-client/dist/assets/CacheTab-C3KWDFDm.js.map +0 -1
  90. package/extensions/dashboard-client/dist/assets/SetupTab-G-MkdQiR.js +0 -3
  91. package/extensions/dashboard-client/dist/assets/index-eoCm0uxj.js.map +0 -1
@@ -0,0 +1,30 @@
1
+ /**
2
+ * config/vector-cortex-pcc.ts — PC-C dashboard prompt-cache visibility flag.
3
+ *
4
+ * Extracted from vector-cortex.ts so that file stays under the 300-line soft
5
+ * limit (soft-as-hard gate), exactly as the vector-cortex-vc9{a,b,c,d}.ts
6
+ * siblings were. This is the PC-C dashboard per-turn prefix-stability flag.
7
+ * vector-cortex.ts re-exports it below and root src/config.ts re-exports it,
8
+ * so no consumer import path changes.
9
+ *
10
+ * The split is purely mechanical: PCC_ENABLED is byte-identical in name,
11
+ * semantics, and default to the sprint-flag convention it follows, and
12
+ * vector-cortex.ts re-exports it so every existing `from
13
+ * "./config/vector-cortex.js"` import keeps resolving unchanged.
14
+ *
15
+ * Pi-agnostic, dependency-free (PREVENT-PI-004 / PREVENT-011).
16
+ */
17
+ import { sprintFlag } from "./vector-cortex-flag.js";
18
+ /**
19
+ * PC-C — dashboard per-turn prefix-stability visibility. Default ON.
20
+ * `MEGACOMPACT_PC_C=0` disables and is byte-identical to the predecessor
21
+ * (PC-B-era): /api/prefix-stability returns 404/disabled and the CacheTab
22
+ * renders exactly as before (stripe distribution + hit-rate trend only). When
23
+ * ON, the endpoint surfaces the per-turn stable-prefix ratio trend from the
24
+ * `prefix_stability` events in the monitoring log. The response contains
25
+ * aggregate ratios/counts only, never message content (EVAL-REDACT-002), and
26
+ * reads only the local events log (PREVENT-PI-004). This flag MUST also be a
27
+ * dashboard SETTINGS toggle (visible in config UI, never in EXCLUDED_SETTINGS),
28
+ * mirroring the other PC/VC flags.
29
+ */
30
+ export const PCC_ENABLED = () => sprintFlag("MEGACOMPACT_PC_C");
@@ -249,6 +249,6 @@ export { VC9A_ENABLED } from "./vector-cortex-vc9a.js";
249
249
  export { VC9B_ENABLED } from "./vector-cortex-vc9b.js";
250
250
  export { VC9C_ENABLED } from "./vector-cortex-vc9c.js";
251
251
  export { VC9D_ENABLED } from "./vector-cortex-vc9d.js";
252
- // Breaker state machine constants (TRIAD_RESILIENCE.md §breaker) extracted to
253
- // vector-cortex-breakers.ts to keep this file under the 300-line soft limit.
252
+ export { PCC_ENABLED } from "./vector-cortex-pcc.js";
253
+ // Breaker constants (TRIAD_RESILIENCE.md §breaker) extracted to vector-cortex-breakers.ts.
254
254
  export { BREAKER_WINDOW_MS, BREAKER_MIN_ATTEMPTS, BREAKER_PERF_FAILURES, BREAKER_PERF_FAILURE_RATE, BREAKER_CORRECTNESS_FAILURES, BREAKER_COOLDOWN_MS, BREAKER_PROBE_COUNT, BREAKER_RETRY_BASE_MS, BREAKER_RETRY_CAP_MS, BREAKER_RETRY_JITTER, BREAKER_HYSTERESIS_FAILURE_RATE, BREAKER_HYSTERESIS_BUDGET_P95_MS, BREAKER_MIN_HEALTHY_RESIDENCE_MS, } from "./vector-cortex-breakers.js";
package/dist/config.js CHANGED
@@ -114,4 +114,4 @@ export const NEW_UI = () => ragEnabled("MEGACOMPACT_NEW_UI");
114
114
  // default ON, `=0`/`_DISABLED` off. Re-exported from src/config/vector-cortex.ts
115
115
  // so root consumers share one source of truth.
116
116
  // ---------------------------------------------------------------------------
117
- export { VC0A_ENABLED, VC0B_ENABLED, VC1A_ENABLED, VC0C_ENABLED, VC1B_ENABLED, VC1C_ENABLED, VC2A_ENABLED, VC2B_ENABLED, VC2C_ENABLED, VC3A_ENABLED, VC3B_ENABLED, VC3C_ENABLED, VC4A_ENABLED, VC4B_ENABLED, VC4C_ENABLED, VC5A_ENABLED, VC5B_ENABLED, VC5C_ENABLED, VC6A_ENABLED, VC6B_ENABLED, VC6C_ENABLED, VC7A_ENABLED, VC7B_ENABLED, VC7C_ENABLED, VC8A_ENABLED, VC8B_ENABLED, VC8C_ENABLED, VC9A_ENABLED, VC9B_ENABLED, VC9C_ENABLED, VC9D_ENABLED, BREAKER_WINDOW_MS, BREAKER_MIN_ATTEMPTS, BREAKER_PERF_FAILURES, BREAKER_PERF_FAILURE_RATE, BREAKER_CORRECTNESS_FAILURES, BREAKER_COOLDOWN_MS, BREAKER_PROBE_COUNT, BREAKER_RETRY_BASE_MS, BREAKER_RETRY_CAP_MS, BREAKER_RETRY_JITTER, BREAKER_HYSTERESIS_FAILURE_RATE, BREAKER_HYSTERESIS_BUDGET_P95_MS, BREAKER_MIN_HEALTHY_RESIDENCE_MS, } from "./config/vector-cortex.js";
117
+ export { VC0A_ENABLED, VC0B_ENABLED, VC1A_ENABLED, VC0C_ENABLED, VC1B_ENABLED, VC1C_ENABLED, VC2A_ENABLED, VC2B_ENABLED, VC2C_ENABLED, VC3A_ENABLED, VC3B_ENABLED, VC3C_ENABLED, VC4A_ENABLED, VC4B_ENABLED, VC4C_ENABLED, VC5A_ENABLED, VC5B_ENABLED, VC5C_ENABLED, VC6A_ENABLED, VC6B_ENABLED, VC6C_ENABLED, VC7A_ENABLED, VC7B_ENABLED, VC7C_ENABLED, VC8A_ENABLED, VC8B_ENABLED, VC8C_ENABLED, VC9A_ENABLED, VC9B_ENABLED, VC9C_ENABLED, VC9D_ENABLED, PCC_ENABLED, BREAKER_WINDOW_MS, BREAKER_MIN_ATTEMPTS, BREAKER_PERF_FAILURES, BREAKER_PERF_FAILURE_RATE, BREAKER_CORRECTNESS_FAILURES, BREAKER_COOLDOWN_MS, BREAKER_PROBE_COUNT, BREAKER_RETRY_BASE_MS, BREAKER_RETRY_CAP_MS, BREAKER_RETRY_JITTER, BREAKER_HYSTERESIS_FAILURE_RATE, BREAKER_HYSTERESIS_BUDGET_P95_MS, BREAKER_MIN_HEALTHY_RESIDENCE_MS, } from "./config/vector-cortex.js";
@@ -47,4 +47,11 @@ export const EXTRA_ENDPOINTS = {
47
47
  path: "/api/setup-cortex-action-log",
48
48
  description: "Bounded (8 KiB) redacted tail of a VC9B action log under <stateDir>/logs/vc9b/; the name must be a validated basename (path traversal rejected).",
49
49
  },
50
+ // ─── PC-C Prompt-cache prefix stability (dashboard Cache tab) ───────
51
+ /** GET /api/prefix-stability — per-turn stable-prefix ratio trend (PC-C). */
52
+ prefixStability: {
53
+ method: "GET",
54
+ path: "/api/prefix-stability",
55
+ description: "Per-turn prompt-cache stable-prefix ratio trend (GET /api/prefix-stability?limit=N) read from prefix_stability rows in the local events log. Flag-off (MEGACOMPACT_PC_C=0) returns 404.",
56
+ },
50
57
  };
@@ -0,0 +1,8 @@
1
+ /**
2
+ * api-contracts/prefix-stability.ts — Prompt-cache prefix-stability API contract (PC-C).
3
+ *
4
+ * Response shape for GET /api/prefix-stability?limit=50: per-turn stable-prefix
5
+ * ratio trend surfaced from the local monitoring events log (prefix_stability rows
6
+ * appended by tailResult.ts). Loopback-only data; zero network (PREVENT-PI-004).
7
+ */
8
+ export {};
@@ -8,7 +8,7 @@
8
8
  * PREVENT-PI-004: local filesystem read only, no network.
9
9
  * PREVENT-011: no `any` type.
10
10
  */
11
- import { handleIndex, handleRepoIndex, handleEvents, handleGameState, handleGameScores, handlePerfSamples, handlePerf, handleAchievements, handleSessions, handleTopics, handleTurns, handleMaintenance, handleProviderCache, handleMemoryStatus, handleCacheStripes, handleSetupStatus, handleSetupDetect, handleSetupConfigure, handleMemoryMap, handleRaptorTree, handleRaptorBuildHistory, handleContextHealth, handleCachePoison, handleHealthSettings, handleEmbedderHealth, handleRagSettings, handleRagMetrics, handleModelThresholds, handleWiki, handleVectorCortexEvaluation, handleVectorCortexHealth, handleVectorCortexBreakersReset, handleVectorCortexLedger, handleVectorCortexTopology, handleVectorCortexQuery, handleVectorCortexShards, handleVectorCortexResidual, handleVectorCortexReconstruct, handleVectorCortexPlans, handleVectorCortexRender, handleVectorCortexRollout, handleVectorCortexClosureProof, handleVectorCortexRestore, handleSetupCortexStatus, handleSetupCortexAction, handleSetupCortexActionLog, } from "./routes.js";
11
+ import { handleIndex, handleRepoIndex, handleEvents, handleGameState, handleGameScores, handlePerfSamples, handlePerf, handleAchievements, handleSessions, handleTopics, handleTurns, handleMaintenance, handleProviderCache, handleMemoryStatus, handleCacheStripes, handlePrefixStability, handleSetupStatus, handleSetupDetect, handleSetupConfigure, handleMemoryMap, handleRaptorTree, handleRaptorBuildHistory, handleContextHealth, handleCachePoison, handleHealthSettings, handleEmbedderHealth, handleRagSettings, handleRagMetrics, handleModelThresholds, handleWiki, handleVectorCortexEvaluation, handleVectorCortexHealth, handleVectorCortexBreakersReset, handleVectorCortexLedger, handleVectorCortexTopology, handleVectorCortexQuery, handleVectorCortexShards, handleVectorCortexResidual, handleVectorCortexReconstruct, handleVectorCortexPlans, handleVectorCortexRender, handleVectorCortexRollout, handleVectorCortexClosureProof, handleVectorCortexRestore, handleSetupCortexStatus, handleSetupCortexAction, handleSetupCortexActionLog, } from "./routes.js";
12
12
  // VC6C repair lives in its own module (routes-vector-cortex-repair.ts) so the
13
13
  // heal route file stays well under the 400-line extension soft limit.
14
14
  import { handleVectorCortexRepair } from "./routes-vector-cortex-repair.js";
@@ -71,6 +71,8 @@ export function dispatchRoutes(req, res, ctx) {
71
71
  return true;
72
72
  if (handleCacheStripes(req, res, ctx))
73
73
  return true;
74
+ if (handlePrefixStability(req, res, ctx))
75
+ return true;
74
76
  if (handleSetupStatus(req, res, ctx))
75
77
  return true;
76
78
  if (handleSetupDetect(req, res, ctx))
@@ -0,0 +1,132 @@
1
+ /**
2
+ * dashboard-server/routes-prefix-stability.ts — Prompt-cache prefix-stability route (PC-C).
3
+ *
4
+ * GET /api/prefix-stability?limit=50 — reads recent prefix_stability rows from the
5
+ * local monitoring events log (ctx.eventsPath) and returns the per-turn stable-prefix
6
+ * ratio trend. Flag-off (MEGACOMPACT_PC_C=0) → 404, byte-identical to PC-B predecessor.
7
+ *
8
+ * Guardrails: PREVENT-PI-004 (loopback-only local dashboard), PREVENT-001 (null-safe
9
+ * JSON.parse), PREVENT-011 (no `any`). Zero network reads.
10
+ */
11
+ import { readFileSync } from "node:fs";
12
+ /** Parse one events.log line into a generic JSON object, null-safe (PREVENT-001). */
13
+ function parseEventLine(line) {
14
+ try {
15
+ const parsed = JSON.parse(line);
16
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
17
+ return parsed;
18
+ }
19
+ return null;
20
+ }
21
+ catch {
22
+ return null;
23
+ }
24
+ }
25
+ /** Read the tail of events.log and return only prefix_stability rows, newest last. */
26
+ function readPrefixStabilityEvents(eventsPath, limit) {
27
+ const samples = [];
28
+ let raw = "";
29
+ try {
30
+ raw = readFileSync(eventsPath, "utf-8"); // guardrails-allow PREVENT-PI-004: local events.log read (loopback dashboard)
31
+ }
32
+ catch {
33
+ return samples;
34
+ }
35
+ for (const line of raw.split("\n")) {
36
+ if (!line.includes('"prefix_stability"'))
37
+ continue;
38
+ const obj = parseEventLine(line);
39
+ if (!obj)
40
+ continue;
41
+ // Only rows we appended (event === "prefix_stability").
42
+ if (obj.event !== "prefix_stability")
43
+ continue;
44
+ const ts = typeof obj.ts === "number" ? obj.ts : 0;
45
+ const stablePrefix = typeof obj.stablePrefix === "number" ? obj.stablePrefix : 0;
46
+ const totalMessages = typeof obj.totalMessages === "number" ? obj.totalMessages : 0;
47
+ const striping = typeof obj.striping === "string" ? obj.striping : "off";
48
+ const separation = typeof obj.separation === "string" ? obj.separation : "off";
49
+ samples.push({ ts, stablePrefix, totalMessages, separation, striping });
50
+ }
51
+ return samples.slice(-limit);
52
+ }
53
+ /** Classify the three-point trend across the returned window (head-mean vs tail-mean). */
54
+ function classifyTrend(ratios) {
55
+ if (ratios.length < 3)
56
+ return "stable";
57
+ const third = Math.max(1, Math.floor(ratios.length / 3));
58
+ const head = ratios.slice(0, third).reduce((a, b) => a + b, 0) / third;
59
+ const tail = ratios.slice(-third).reduce((a, b) => a + b, 0) / third;
60
+ const delta = tail - head;
61
+ if (delta > 0.05)
62
+ return "improving";
63
+ if (delta < -0.05)
64
+ return "degrading";
65
+ return "stable";
66
+ }
67
+ /** Positive sprint-flag check (matches sprintFlag: `=0`/`=false`/`_DISABLED=true` → OFF). */
68
+ function prefixStabilityEnabled() {
69
+ const v = process.env.MEGACOMPACT_PC_C;
70
+ if (v === "0" || v === "false")
71
+ return false;
72
+ const disabled = process.env.MEGACOMPACT_PC_C_DISABLED;
73
+ if (disabled === "true" || disabled === "1")
74
+ return false;
75
+ return true;
76
+ }
77
+ export function handlePrefixStability(req, res, ctx) {
78
+ if (!req.url?.startsWith("/api/prefix-stability"))
79
+ return false;
80
+ if (!prefixStabilityEnabled()) {
81
+ // guardrails-allow PREVENT-PI-004: loopback dashboard response (local)
82
+ res.writeHead(404, { "Content-Type": "application/json" });
83
+ res.end(JSON.stringify({ error: "not_found" }));
84
+ return true;
85
+ }
86
+ if (req.method !== "GET") {
87
+ // guardrails-allow PREVENT-PI-004: loopback dashboard response (local)
88
+ res.writeHead(405, { "Content-Type": "application/json" });
89
+ res.end(JSON.stringify({ error: "method_not_allowed" }));
90
+ return true;
91
+ }
92
+ let limit = 50;
93
+ if (req.url.includes("?")) {
94
+ const params = new URLSearchParams(req.url.slice(req.url.indexOf("?")));
95
+ const l = params.get("limit");
96
+ if (l != null) {
97
+ const n = parseInt(l, 10);
98
+ if (Number.isFinite(n) && n > 0)
99
+ limit = Math.min(n, 500);
100
+ }
101
+ }
102
+ try {
103
+ const events = readPrefixStabilityEvents(ctx.eventsPath, limit);
104
+ const turns = events.map((e, i) => ({
105
+ turnIndex: i,
106
+ stablePrefix: e.stablePrefix,
107
+ totalMessages: e.totalMessages,
108
+ ratio: e.totalMessages > 0 ? e.stablePrefix / e.totalMessages : 0,
109
+ striping: e.striping,
110
+ timestamp: new Date(e.ts).toISOString(),
111
+ }));
112
+ const avgRatio = turns.length
113
+ ? turns.reduce((a, t) => a + t.ratio, 0) / turns.length
114
+ : 0;
115
+ const body = {
116
+ turns,
117
+ avgRatio: Math.round(avgRatio * 1000) / 1000,
118
+ trend: classifyTrend(turns.map((t) => t.ratio)),
119
+ count: turns.length,
120
+ lastScanAt: Date.now(),
121
+ };
122
+ // guardrails-allow PREVENT-PI-004: loopback dashboard response (local)
123
+ res.writeHead(200, { "Content-Type": "application/json" });
124
+ res.end(JSON.stringify(body));
125
+ }
126
+ catch (e) {
127
+ // guardrails-allow PREVENT-PI-004: loopback dashboard response (local)
128
+ res.writeHead(500, { "Content-Type": "application/json" });
129
+ res.end(JSON.stringify({ error: "prefix_stability_unavailable", detail: String(e) }));
130
+ }
131
+ return true;
132
+ }
@@ -51,7 +51,7 @@ export const SETTINGS = [
51
51
  boolFlag("MEGACOMPACT_HYDE", "HyDE", "Generate hypothetical answer via LLM, embed it, RRF-fuse", true, true),
52
52
  boolFlag("MEGACOMPACT_NEW_UI", "New Dashboard UI", "Tailwind + shadcn visual design (sidebar, glass panels)", true),
53
53
  boolDirect("MEGACOMPACT_MESSAGE_SEPARATION", "Message Separation (P2)", "PLAN_V2: split conversation thread from tool results to grow stable cache prefix", true),
54
- boolDirect("MEGACOMPACT_CACHE_STRIPING", "Cache Striping (P3)", "PLAN_V2: order stable context by stability score so durable chunks lead the prompt", false),
54
+ boolDirect("MEGACOMPACT_CACHE_STRIPING", "Cache Striping (P3)", "PLAN_V2: order stable context by stability score so durable chunks lead the prompt", true),
55
55
  ],
56
56
  },
57
57
  {
@@ -52,5 +52,6 @@ export const VECTOR_CORTEX_SETTINGS = {
52
52
  boolDirect("MEGACOMPACT_VC9B", "VC9B Setup Cortex Actions", "Setup Cortex action drivers (POST /api/setup-cortex-action + GET /api/setup-cortex-action-log): confirmation-gated wrappers that fetch-model / bench / verify-asset by spawning only the committed local scripts (scripts/vc2-model-prep/fetch-model.sh, bench-onnx.mjs) or re-reading the committed encoder assets — never payload bytes, no network. Actions gated by an OPEN hard-gate item (HG-1/HG-3) return action_blocked_by_open_item and do NOT spawn. OFF = byte-identical predecessor (VC9A-era): the action POST returns a disabled/404 shape and flag-off bytes are unchanged.", true),
53
53
  boolDirect("MEGACOMPACT_VC9C", "VC9C SetupTab Cortex Sub-tab", "SetupTab Cortex sub-tab (client UI): a Cortex sub-tab inside SetupTab that consumes the VC9A status endpoint (GET /api/setup-cortex-status) + the VC9B action endpoints. It surfaces the encoder mode A/B/C, asset digest prefix, qualification verdict + threshold failures, the open hard-gate blockers, and the confirmation-gated fetch/bench/verify actions. OFF = byte-identical predecessor (VC9B-era): the Cortex sub-tab is filtered from SUB_TABS and the Setup tab renders exactly as before.", true),
54
54
  boolDirect("MEGACOMPACT_VC9D", "VC9D Embedder Detect Consolidation", "Embedder-detect consolidation + VC9 workstream roll-up: memoizes /api/setup-detect against the mutable input (resolved binary path + mtime) so consecutive requests reuse the result without re-spawning, and unifies the embedder + cortex sub-tabs' 5s poll contract. OFF = byte-identical predecessor (VC9C-era): detect spawns fresh per request and the embedder poll keeps its previous cadence.", true),
55
+ boolDirect("MEGACOMPACT_PC_C", "PC-C Dashboard Cache Visibility", "Dashboard per-turn prompt-cache visibility: surfaces the per-turn stable-prefix ratio trend (GET /api/prefix-stability) in the CacheTab PrefixStabilityCard. Reads aggregate ratios/counts from the local monitoring events log only — no payload bytes. OFF = byte-identical predecessor (PC-B-era): /api/prefix-stability returns 404 and the CacheTab omits the PrefixStabilityCard.", true),
55
56
  ],
56
57
  };
@@ -17,6 +17,7 @@ export { handleSetupStatus, handleSetupDetect, handleSetupConfigure, } from "./r
17
17
  export { handleMemoryMap } from "./routes-memory-map.js";
18
18
  export { handleRaptorTree, handleRaptorBuildHistory } from "./routes-raptor.js";
19
19
  export { handleCacheStripes } from "./routes-cache.js";
20
+ export { handlePrefixStability } from "./routes-prefix-stability.js";
20
21
  export { handleContextHealth, handleCachePoison, handleHealthSettings, } from "./routes-health.js";
21
22
  export { handleEmbedderHealth } from "./routes-embedder-health.js";
22
23
  export { handleRagSettings } from "./routes-rag-settings.js";
@@ -170,7 +170,8 @@ export function loadConfig() {
170
170
  // PC-A: positive sprint flag, default ON. =0 byte-identical to the
171
171
  // pre-change OFF state (single gate lives at the call site in tailResult.ts).
172
172
  messageSeparation: envBool("MEGACOMPACT_MESSAGE_SEPARATION", true),
173
- cacheStriping: envBool("MEGACOMPACT_CACHE_STRIPING", false),
173
+ // positive sprint flag: default ON, =0 byte-identical to OFF
174
+ cacheStriping: envBool("MEGACOMPACT_CACHE_STRIPING", true),
174
175
  tuiWidget: envBool("MEGACOMPACT_TUI_WIDGET", true),
175
176
  ragQueryReformulation: envBool("MEGACOMPACT_QUERY_REFORMULATION", false),
176
177
  ragTieredRouter: envBool("MEGACOMPACT_TIERED_ROUTER", false),
@@ -61,7 +61,11 @@ export function buildTailResult(runtime, config, messages) {
61
61
  }
62
62
  }
63
63
  lastTurnPrefix.set(runtime, { sessionId, turn, fingerprints });
64
- runtime.logger.info("prefix_stability", {
64
+ // PC-C: write to the always-on monitoring events log (appendEvent),
65
+ // not the debug-gated runtime logger (mega-compact.log), so the
66
+ // dashboard /api/prefix-stability endpoint can read this per-turn
67
+ // stable-prefix ratio from ctx.eventsPath. Same field shape.
68
+ runtime.appendEvent("prefix_stability", {
65
69
  stablePrefix,
66
70
  totalMessages: result.length,
67
71
  separation: config.messageSeparation ? "v2" : "off",
@@ -169,18 +169,12 @@ export function refreshStripeAssignments(stateDir, epochId, limit = DEFAULT_STRI
169
169
  * Build a cache-optimized prompt with 5 layers:
170
170
  * 0 (system) -> 1 (summary) -> 2 (cache stripes) -> 3 (thread) -> 4 (tool)
171
171
  *
172
- * Feature gate: MEGACOMPACT_CACHE_STRIPING (default OFF). When OFF, delegates
173
- * to buildSeparatedPrompt (byte-identical to Phase 2 behavior).
174
- *
175
- * When ON but MEGACOMPACT_MESSAGE_SEPARATION is OFF, also delegates to
176
- * buildSeparatedPrompt (which returns messages unchanged).
172
+ * Positive sprint flag driven by config.cacheStriping at the call site
173
+ * (tailResult.ts); this function is pure and never reads process.env.
174
+ * With flag ON but no stripe rows for the epoch, it returns the base
175
+ * separated prompt unchanged (byte-identical to buildSeparatedPrompt).
177
176
  */
178
177
  export function buildCacheOptimizedPrompt(messages, opts) {
179
- const flag = process.env.MEGACOMPACT_CACHE_STRIPING;
180
- if (flag === "0" || flag === "false" || flag === undefined || flag === "") {
181
- // Flag OFF: delegate to buildSeparatedPrompt (byte-identical).
182
- return buildSeparatedPrompt(messages, opts);
183
- }
184
178
  // Build the base 4-layer structure first.
185
179
  const base = buildSeparatedPrompt(messages, opts);
186
180
  // If base equals messages, separation is OFF — return unchanged.
@@ -0,0 +1,30 @@
1
+ /**
2
+ * config/vector-cortex-pcc.ts — PC-C dashboard prompt-cache visibility flag.
3
+ *
4
+ * Extracted from vector-cortex.ts so that file stays under the 300-line soft
5
+ * limit (soft-as-hard gate), exactly as the vector-cortex-vc9{a,b,c,d}.ts
6
+ * siblings were. This is the PC-C dashboard per-turn prefix-stability flag.
7
+ * vector-cortex.ts re-exports it below and root src/config.ts re-exports it,
8
+ * so no consumer import path changes.
9
+ *
10
+ * The split is purely mechanical: PCC_ENABLED is byte-identical in name,
11
+ * semantics, and default to the sprint-flag convention it follows, and
12
+ * vector-cortex.ts re-exports it so every existing `from
13
+ * "./config/vector-cortex.js"` import keeps resolving unchanged.
14
+ *
15
+ * Pi-agnostic, dependency-free (PREVENT-PI-004 / PREVENT-011).
16
+ */
17
+ import { sprintFlag } from "./vector-cortex-flag.js";
18
+ /**
19
+ * PC-C — dashboard per-turn prefix-stability visibility. Default ON.
20
+ * `MEGACOMPACT_PC_C=0` disables and is byte-identical to the predecessor
21
+ * (PC-B-era): /api/prefix-stability returns 404/disabled and the CacheTab
22
+ * renders exactly as before (stripe distribution + hit-rate trend only). When
23
+ * ON, the endpoint surfaces the per-turn stable-prefix ratio trend from the
24
+ * `prefix_stability` events in the monitoring log. The response contains
25
+ * aggregate ratios/counts only, never message content (EVAL-REDACT-002), and
26
+ * reads only the local events log (PREVENT-PI-004). This flag MUST also be a
27
+ * dashboard SETTINGS toggle (visible in config UI, never in EXCLUDED_SETTINGS),
28
+ * mirroring the other PC/VC flags.
29
+ */
30
+ export const PCC_ENABLED = () => sprintFlag("MEGACOMPACT_PC_C");
@@ -249,6 +249,6 @@ export { VC9A_ENABLED } from "./vector-cortex-vc9a.js";
249
249
  export { VC9B_ENABLED } from "./vector-cortex-vc9b.js";
250
250
  export { VC9C_ENABLED } from "./vector-cortex-vc9c.js";
251
251
  export { VC9D_ENABLED } from "./vector-cortex-vc9d.js";
252
- // Breaker state machine constants (TRIAD_RESILIENCE.md §breaker) extracted to
253
- // vector-cortex-breakers.ts to keep this file under the 300-line soft limit.
252
+ export { PCC_ENABLED } from "./vector-cortex-pcc.js";
253
+ // Breaker constants (TRIAD_RESILIENCE.md §breaker) extracted to vector-cortex-breakers.ts.
254
254
  export { BREAKER_WINDOW_MS, BREAKER_MIN_ATTEMPTS, BREAKER_PERF_FAILURES, BREAKER_PERF_FAILURE_RATE, BREAKER_CORRECTNESS_FAILURES, BREAKER_COOLDOWN_MS, BREAKER_PROBE_COUNT, BREAKER_RETRY_BASE_MS, BREAKER_RETRY_CAP_MS, BREAKER_RETRY_JITTER, BREAKER_HYSTERESIS_FAILURE_RATE, BREAKER_HYSTERESIS_BUDGET_P95_MS, BREAKER_MIN_HEALTHY_RESIDENCE_MS, } from "./vector-cortex-breakers.js";
@@ -114,4 +114,4 @@ export const NEW_UI = () => ragEnabled("MEGACOMPACT_NEW_UI");
114
114
  // default ON, `=0`/`_DISABLED` off. Re-exported from src/config/vector-cortex.ts
115
115
  // so root consumers share one source of truth.
116
116
  // ---------------------------------------------------------------------------
117
- export { VC0A_ENABLED, VC0B_ENABLED, VC1A_ENABLED, VC0C_ENABLED, VC1B_ENABLED, VC1C_ENABLED, VC2A_ENABLED, VC2B_ENABLED, VC2C_ENABLED, VC3A_ENABLED, VC3B_ENABLED, VC3C_ENABLED, VC4A_ENABLED, VC4B_ENABLED, VC4C_ENABLED, VC5A_ENABLED, VC5B_ENABLED, VC5C_ENABLED, VC6A_ENABLED, VC6B_ENABLED, VC6C_ENABLED, VC7A_ENABLED, VC7B_ENABLED, VC7C_ENABLED, VC8A_ENABLED, VC8B_ENABLED, VC8C_ENABLED, VC9A_ENABLED, VC9B_ENABLED, VC9C_ENABLED, VC9D_ENABLED, BREAKER_WINDOW_MS, BREAKER_MIN_ATTEMPTS, BREAKER_PERF_FAILURES, BREAKER_PERF_FAILURE_RATE, BREAKER_CORRECTNESS_FAILURES, BREAKER_COOLDOWN_MS, BREAKER_PROBE_COUNT, BREAKER_RETRY_BASE_MS, BREAKER_RETRY_CAP_MS, BREAKER_RETRY_JITTER, BREAKER_HYSTERESIS_FAILURE_RATE, BREAKER_HYSTERESIS_BUDGET_P95_MS, BREAKER_MIN_HEALTHY_RESIDENCE_MS, } from "./config/vector-cortex.js";
117
+ export { VC0A_ENABLED, VC0B_ENABLED, VC1A_ENABLED, VC0C_ENABLED, VC1B_ENABLED, VC1C_ENABLED, VC2A_ENABLED, VC2B_ENABLED, VC2C_ENABLED, VC3A_ENABLED, VC3B_ENABLED, VC3C_ENABLED, VC4A_ENABLED, VC4B_ENABLED, VC4C_ENABLED, VC5A_ENABLED, VC5B_ENABLED, VC5C_ENABLED, VC6A_ENABLED, VC6B_ENABLED, VC6C_ENABLED, VC7A_ENABLED, VC7B_ENABLED, VC7C_ENABLED, VC8A_ENABLED, VC8B_ENABLED, VC8C_ENABLED, VC9A_ENABLED, VC9B_ENABLED, VC9C_ENABLED, VC9D_ENABLED, PCC_ENABLED, BREAKER_WINDOW_MS, BREAKER_MIN_ATTEMPTS, BREAKER_PERF_FAILURES, BREAKER_PERF_FAILURE_RATE, BREAKER_CORRECTNESS_FAILURES, BREAKER_COOLDOWN_MS, BREAKER_PROBE_COUNT, BREAKER_RETRY_BASE_MS, BREAKER_RETRY_CAP_MS, BREAKER_RETRY_JITTER, BREAKER_HYSTERESIS_FAILURE_RATE, BREAKER_HYSTERESIS_BUDGET_P95_MS, BREAKER_MIN_HEALTHY_RESIDENCE_MS, } from "./config/vector-cortex.js";
@@ -1,2 +1,2 @@
1
- import{b as R,c as W,m as T,i as C,d as F,A as ie,e as B,h as q,j as oe,k as G,l as se,n as le,u as ue,o as K,G as ce,p as J,q as Q,D as fe,g as pe,X as he,Y as de,f as me}from"./generateCategoricalChart-DtNoJ6fZ.js";import{R as p,F as ee,r as ve}from"./index-eoCm0uxj.js";var ye=["layout","type","stroke","connectNulls","isRange","ref"],be=["key"],te;function M(e){"@babel/helpers - typeof";return M=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},M(e)}function ae(e,t){if(e==null)return{};var r=Ae(e,t),a,n;if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)a=i[n],!(t.indexOf(a)>=0)&&Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}function Ae(e,t){if(e==null)return{};var r={};for(var a in e)if(Object.prototype.hasOwnProperty.call(e,a)){if(t.indexOf(a)>=0)continue;r[a]=e[a]}return r}function D(){return D=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e},D.apply(this,arguments)}function U(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter(function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable})),r.push.apply(r,a)}return r}function S(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?U(Object(r),!0).forEach(function(a){E(e,a,r[a])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):U(Object(r)).forEach(function(a){Object.defineProperty(e,a,Object.getOwnPropertyDescriptor(r,a))})}return e}function ge(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Z(e,t){for(var r=0;r<t.length;r++){var a=t[r];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,ne(a.key),a)}}function xe(e,t,r){return t&&Z(e.prototype,t),r&&Z(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function Pe(e,t,r){return t=$(t),Oe(e,re()?Reflect.construct(t,r||[],$(e).constructor):t.apply(e,r))}function Oe(e,t){if(t&&(M(t)==="object"||typeof t=="function"))return t;if(t!==void 0)throw new TypeError("Derived constructors may only return object or undefined");return Ee(e)}function Ee(e){if(e===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function re(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch{}return(re=function(){return!!e})()}function $(e){return $=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(r){return r.__proto__||Object.getPrototypeOf(r)},$(e)}function we(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&X(e,t)}function X(e,t){return X=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(a,n){return a.__proto__=n,a},X(e,t)}function E(e,t,r){return t=ne(t),t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function ne(e){var t=_e(e,"string");return M(t)=="symbol"?t:t+""}function _e(e,t){if(M(e)!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var a=r.call(e,t);if(M(a)!="object")return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}var L=function(e){function t(){var r;ge(this,t);for(var a=arguments.length,n=new Array(a),i=0;i<a;i++)n[i]=arguments[i];return r=Pe(this,t,[].concat(n)),E(r,"state",{isAnimationFinished:!0}),E(r,"id",ue("recharts-area-")),E(r,"handleAnimationEnd",function(){var o=r.props.onAnimationEnd;r.setState({isAnimationFinished:!0}),K(o)&&o()}),E(r,"handleAnimationStart",function(){var o=r.props.onAnimationStart;r.setState({isAnimationFinished:!1}),K(o)&&o()}),r}return we(t,e),xe(t,[{key:"renderDots",value:function(a,n,i){var o=this.props.isAnimationActive,s=this.state.isAnimationFinished;if(o&&!s)return null;var u=this.props,l=u.dot,f=u.points,c=u.dataKey,h=R(this.props,!1),A=R(l,!0),g=f.map(function(v,O){var y=S(S(S({key:"dot-".concat(O),r:3},h),A),{},{index:O,cx:v.x,cy:v.y,dataKey:c,value:v.value,payload:v.payload,points:f});return t.renderDotItem(l,y)}),x={clipPath:a?"url(#clipPath-".concat(n?"":"dots-").concat(i,")"):null};return p.createElement(W,D({className:"recharts-area-dots"},x),g)}},{key:"renderHorizontalRect",value:function(a){var n=this.props,i=n.baseLine,o=n.points,s=n.strokeWidth,u=o[0].x,l=o[o.length-1].x,f=a*Math.abs(u-l),c=T(o.map(function(h){return h.y||0}));return C(i)&&typeof i=="number"?c=Math.max(i,c):i&&Array.isArray(i)&&i.length&&(c=Math.max(T(i.map(function(h){return h.y||0})),c)),C(c)?p.createElement("rect",{x:u<l?u:u-f,y:0,width:f,height:Math.floor(c+(s?parseInt("".concat(s),10):1))}):null}},{key:"renderVerticalRect",value:function(a){var n=this.props,i=n.baseLine,o=n.points,s=n.strokeWidth,u=o[0].y,l=o[o.length-1].y,f=a*Math.abs(u-l),c=T(o.map(function(h){return h.x||0}));return C(i)&&typeof i=="number"?c=Math.max(i,c):i&&Array.isArray(i)&&i.length&&(c=Math.max(T(i.map(function(h){return h.x||0})),c)),C(c)?p.createElement("rect",{x:0,y:u<l?u:u-f,width:c+(s?parseInt("".concat(s),10):1),height:Math.floor(f)}):null}},{key:"renderClipRect",value:function(a){var n=this.props.layout;return n==="vertical"?this.renderVerticalRect(a):this.renderHorizontalRect(a)}},{key:"renderAreaStatically",value:function(a,n,i,o){var s=this.props,u=s.layout,l=s.type,f=s.stroke,c=s.connectNulls,h=s.isRange;s.ref;var A=ae(s,ye);return p.createElement(W,{clipPath:i?"url(#clipPath-".concat(o,")"):null},p.createElement(F,D({},R(A,!0),{points:a,connectNulls:c,type:l,baseLine:n,layout:u,stroke:"none",className:"recharts-area-area"})),f!=="none"&&p.createElement(F,D({},R(this.props,!1),{className:"recharts-area-curve",layout:u,type:l,connectNulls:c,fill:"none",points:a})),f!=="none"&&h&&p.createElement(F,D({},R(this.props,!1),{className:"recharts-area-curve",layout:u,type:l,connectNulls:c,fill:"none",points:n})))}},{key:"renderAreaWithAnimation",value:function(a,n){var i=this,o=this.props,s=o.points,u=o.baseLine,l=o.isAnimationActive,f=o.animationBegin,c=o.animationDuration,h=o.animationEasing,A=o.animationId,g=this.state,x=g.prevPoints,v=g.prevBaseLine;return p.createElement(ie,{begin:f,duration:c,isActive:l,easing:h,from:{t:0},to:{t:1},key:"area-".concat(A),onAnimationEnd:this.handleAnimationEnd,onAnimationStart:this.handleAnimationStart},function(O){var y=O.t;if(x){var _=x.length/s.length,d=s.map(function(P,N){var k=Math.floor(N*_);if(x[k]){var j=x[k],I=B(j.x,P.x),V=B(j.y,P.y);return S(S({},P),{},{x:I(y),y:V(y)})}return P}),m;if(C(u)&&typeof u=="number"){var b=B(v,u);m=b(y)}else if(q(u)||oe(u)){var w=B(v,0);m=w(y)}else m=u.map(function(P,N){var k=Math.floor(N*_);if(v[k]){var j=v[k],I=B(j.x,P.x),V=B(j.y,P.y);return S(S({},P),{},{x:I(y),y:V(y)})}return P});return i.renderAreaStatically(d,m,a,n)}return p.createElement(W,null,p.createElement("defs",null,p.createElement("clipPath",{id:"animationClipPath-".concat(n)},i.renderClipRect(y))),p.createElement(W,{clipPath:"url(#animationClipPath-".concat(n,")")},i.renderAreaStatically(s,u,a,n)))})}},{key:"renderArea",value:function(a,n){var i=this.props,o=i.points,s=i.baseLine,u=i.isAnimationActive,l=this.state,f=l.prevPoints,c=l.prevBaseLine,h=l.totalLength;return u&&o&&o.length&&(!f&&h>0||!G(f,o)||!G(c,s))?this.renderAreaWithAnimation(a,n):this.renderAreaStatically(o,s,a,n)}},{key:"render",value:function(){var a,n=this.props,i=n.hide,o=n.dot,s=n.points,u=n.className,l=n.top,f=n.left,c=n.xAxis,h=n.yAxis,A=n.width,g=n.height,x=n.isAnimationActive,v=n.id;if(i||!s||!s.length)return null;var O=this.state.isAnimationFinished,y=s.length===1,_=ee("recharts-area",u),d=c&&c.allowDataOverflow,m=h&&h.allowDataOverflow,b=d||m,w=q(v)?this.id:v,P=(a=R(o,!1))!==null&&a!==void 0?a:{r:3,strokeWidth:2},N=P.r,k=N===void 0?3:N,j=P.strokeWidth,I=j===void 0?2:j,V=se(o)?o:{},Y=V.clipDot,H=Y===void 0?!0:Y,z=k*2+I;return p.createElement(W,{className:_},d||m?p.createElement("defs",null,p.createElement("clipPath",{id:"clipPath-".concat(w)},p.createElement("rect",{x:d?f:f-A/2,y:m?l:l-g/2,width:d?A:A*2,height:m?g:g*2})),!H&&p.createElement("clipPath",{id:"clipPath-dots-".concat(w)},p.createElement("rect",{x:f-z/2,y:l-z/2,width:A+z,height:g+z}))):null,y?null:this.renderArea(b,w),(o||y)&&this.renderDots(b,H,w),(!x||O)&&le.renderCallByParent(this.props,s))}}],[{key:"getDerivedStateFromProps",value:function(a,n){return a.animationId!==n.prevAnimationId?{prevAnimationId:a.animationId,curPoints:a.points,curBaseLine:a.baseLine,prevPoints:n.curPoints,prevBaseLine:n.curBaseLine}:a.points!==n.curPoints||a.baseLine!==n.curBaseLine?{curPoints:a.points,curBaseLine:a.baseLine}:null}}])}(ve.PureComponent);te=L;E(L,"displayName","Area");E(L,"defaultProps",{stroke:"#3182bd",fill:"#3182bd",fillOpacity:.6,xAxisId:0,yAxisId:0,legendType:"line",connectNulls:!1,points:[],dot:!1,activeDot:!0,hide:!1,isAnimationActive:!ce.isSsr,animationBegin:0,animationDuration:1500,animationEasing:"ease"});E(L,"getBaseValue",function(e,t,r,a){var n=e.layout,i=e.baseValue,o=t.props.baseValue,s=o??i;if(C(s)&&typeof s=="number")return s;var u=n==="horizontal"?a:r,l=u.scale.domain();if(u.type==="number"){var f=Math.max(l[0],l[1]),c=Math.min(l[0],l[1]);return s==="dataMin"?c:s==="dataMax"||f<0?f:Math.max(Math.min(l[0],l[1]),0)}return s==="dataMin"?l[0]:s==="dataMax"?l[1]:l[0]});E(L,"getComposedData",function(e){var t=e.props,r=e.item,a=e.xAxis,n=e.yAxis,i=e.xAxisTicks,o=e.yAxisTicks,s=e.bandSize,u=e.dataKey,l=e.stackedData,f=e.dataStartIndex,c=e.displayedData,h=e.offset,A=t.layout,g=l&&l.length,x=te.getBaseValue(t,r,a,n),v=A==="horizontal",O=!1,y=c.map(function(d,m){var b;g?b=l[f+m]:(b=J(d,u),Array.isArray(b)?O=!0:b=[x,b]);var w=b[1]==null||g&&J(d,u)==null;return v?{x:Q({axis:a,ticks:i,bandSize:s,entry:d,index:m}),y:w?null:n.scale(b[1]),value:b,payload:d}:{x:w?null:a.scale(b[1]),y:Q({axis:n,ticks:o,bandSize:s,entry:d,index:m}),value:b,payload:d}}),_;return g||O?_=y.map(function(d){var m=Array.isArray(d.value)?d.value[0]:null;return v?{x:d.x,y:m!=null&&d.y!=null?n.scale(m):null}:{x:m!=null?a.scale(m):null,y:d.y}}):_=v?n.scale(x):a.scale(x),S({points:y,baseLine:_,layout:A,isRange:O},h)});E(L,"renderDotItem",function(e,t){var r;if(p.isValidElement(e))r=p.cloneElement(e,t);else if(K(e))r=e(t);else{var a=ee("recharts-area-dot",typeof e!="boolean"?e.className:""),n=t.key,i=ae(t,be);r=p.createElement(fe,D({},i,{key:n,className:a}))}return r});var ke=pe({chartName:"AreaChart",GraphicalChild:L,axisComponents:[{axisType:"xAxis",AxisComp:he},{axisType:"yAxis",AxisComp:de}],formatAxisMap:me});export{ke as A,L as a};
2
- //# sourceMappingURL=AreaChart-EL8l2Fcj.js.map
1
+ import{b as R,c as W,m as T,i as C,d as F,A as ie,e as B,h as q,j as oe,k as G,l as se,n as le,u as ue,o as K,G as ce,p as J,q as Q,D as fe,g as pe,X as he,Y as de,f as me}from"./generateCategoricalChart-xCzi6pWn.js";import{R as p,F as ee,r as ve}from"./index-DqjmZ88m.js";var ye=["layout","type","stroke","connectNulls","isRange","ref"],be=["key"],te;function M(e){"@babel/helpers - typeof";return M=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},M(e)}function ae(e,t){if(e==null)return{};var r=Ae(e,t),a,n;if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)a=i[n],!(t.indexOf(a)>=0)&&Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}function Ae(e,t){if(e==null)return{};var r={};for(var a in e)if(Object.prototype.hasOwnProperty.call(e,a)){if(t.indexOf(a)>=0)continue;r[a]=e[a]}return r}function D(){return D=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e},D.apply(this,arguments)}function U(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter(function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable})),r.push.apply(r,a)}return r}function S(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?U(Object(r),!0).forEach(function(a){E(e,a,r[a])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):U(Object(r)).forEach(function(a){Object.defineProperty(e,a,Object.getOwnPropertyDescriptor(r,a))})}return e}function ge(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Z(e,t){for(var r=0;r<t.length;r++){var a=t[r];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,ne(a.key),a)}}function xe(e,t,r){return t&&Z(e.prototype,t),r&&Z(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function Pe(e,t,r){return t=$(t),Oe(e,re()?Reflect.construct(t,r||[],$(e).constructor):t.apply(e,r))}function Oe(e,t){if(t&&(M(t)==="object"||typeof t=="function"))return t;if(t!==void 0)throw new TypeError("Derived constructors may only return object or undefined");return Ee(e)}function Ee(e){if(e===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function re(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch{}return(re=function(){return!!e})()}function $(e){return $=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(r){return r.__proto__||Object.getPrototypeOf(r)},$(e)}function we(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&X(e,t)}function X(e,t){return X=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(a,n){return a.__proto__=n,a},X(e,t)}function E(e,t,r){return t=ne(t),t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function ne(e){var t=_e(e,"string");return M(t)=="symbol"?t:t+""}function _e(e,t){if(M(e)!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var a=r.call(e,t);if(M(a)!="object")return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}var L=function(e){function t(){var r;ge(this,t);for(var a=arguments.length,n=new Array(a),i=0;i<a;i++)n[i]=arguments[i];return r=Pe(this,t,[].concat(n)),E(r,"state",{isAnimationFinished:!0}),E(r,"id",ue("recharts-area-")),E(r,"handleAnimationEnd",function(){var o=r.props.onAnimationEnd;r.setState({isAnimationFinished:!0}),K(o)&&o()}),E(r,"handleAnimationStart",function(){var o=r.props.onAnimationStart;r.setState({isAnimationFinished:!1}),K(o)&&o()}),r}return we(t,e),xe(t,[{key:"renderDots",value:function(a,n,i){var o=this.props.isAnimationActive,s=this.state.isAnimationFinished;if(o&&!s)return null;var u=this.props,l=u.dot,f=u.points,c=u.dataKey,h=R(this.props,!1),A=R(l,!0),g=f.map(function(v,O){var y=S(S(S({key:"dot-".concat(O),r:3},h),A),{},{index:O,cx:v.x,cy:v.y,dataKey:c,value:v.value,payload:v.payload,points:f});return t.renderDotItem(l,y)}),x={clipPath:a?"url(#clipPath-".concat(n?"":"dots-").concat(i,")"):null};return p.createElement(W,D({className:"recharts-area-dots"},x),g)}},{key:"renderHorizontalRect",value:function(a){var n=this.props,i=n.baseLine,o=n.points,s=n.strokeWidth,u=o[0].x,l=o[o.length-1].x,f=a*Math.abs(u-l),c=T(o.map(function(h){return h.y||0}));return C(i)&&typeof i=="number"?c=Math.max(i,c):i&&Array.isArray(i)&&i.length&&(c=Math.max(T(i.map(function(h){return h.y||0})),c)),C(c)?p.createElement("rect",{x:u<l?u:u-f,y:0,width:f,height:Math.floor(c+(s?parseInt("".concat(s),10):1))}):null}},{key:"renderVerticalRect",value:function(a){var n=this.props,i=n.baseLine,o=n.points,s=n.strokeWidth,u=o[0].y,l=o[o.length-1].y,f=a*Math.abs(u-l),c=T(o.map(function(h){return h.x||0}));return C(i)&&typeof i=="number"?c=Math.max(i,c):i&&Array.isArray(i)&&i.length&&(c=Math.max(T(i.map(function(h){return h.x||0})),c)),C(c)?p.createElement("rect",{x:0,y:u<l?u:u-f,width:c+(s?parseInt("".concat(s),10):1),height:Math.floor(f)}):null}},{key:"renderClipRect",value:function(a){var n=this.props.layout;return n==="vertical"?this.renderVerticalRect(a):this.renderHorizontalRect(a)}},{key:"renderAreaStatically",value:function(a,n,i,o){var s=this.props,u=s.layout,l=s.type,f=s.stroke,c=s.connectNulls,h=s.isRange;s.ref;var A=ae(s,ye);return p.createElement(W,{clipPath:i?"url(#clipPath-".concat(o,")"):null},p.createElement(F,D({},R(A,!0),{points:a,connectNulls:c,type:l,baseLine:n,layout:u,stroke:"none",className:"recharts-area-area"})),f!=="none"&&p.createElement(F,D({},R(this.props,!1),{className:"recharts-area-curve",layout:u,type:l,connectNulls:c,fill:"none",points:a})),f!=="none"&&h&&p.createElement(F,D({},R(this.props,!1),{className:"recharts-area-curve",layout:u,type:l,connectNulls:c,fill:"none",points:n})))}},{key:"renderAreaWithAnimation",value:function(a,n){var i=this,o=this.props,s=o.points,u=o.baseLine,l=o.isAnimationActive,f=o.animationBegin,c=o.animationDuration,h=o.animationEasing,A=o.animationId,g=this.state,x=g.prevPoints,v=g.prevBaseLine;return p.createElement(ie,{begin:f,duration:c,isActive:l,easing:h,from:{t:0},to:{t:1},key:"area-".concat(A),onAnimationEnd:this.handleAnimationEnd,onAnimationStart:this.handleAnimationStart},function(O){var y=O.t;if(x){var _=x.length/s.length,d=s.map(function(P,N){var k=Math.floor(N*_);if(x[k]){var j=x[k],I=B(j.x,P.x),V=B(j.y,P.y);return S(S({},P),{},{x:I(y),y:V(y)})}return P}),m;if(C(u)&&typeof u=="number"){var b=B(v,u);m=b(y)}else if(q(u)||oe(u)){var w=B(v,0);m=w(y)}else m=u.map(function(P,N){var k=Math.floor(N*_);if(v[k]){var j=v[k],I=B(j.x,P.x),V=B(j.y,P.y);return S(S({},P),{},{x:I(y),y:V(y)})}return P});return i.renderAreaStatically(d,m,a,n)}return p.createElement(W,null,p.createElement("defs",null,p.createElement("clipPath",{id:"animationClipPath-".concat(n)},i.renderClipRect(y))),p.createElement(W,{clipPath:"url(#animationClipPath-".concat(n,")")},i.renderAreaStatically(s,u,a,n)))})}},{key:"renderArea",value:function(a,n){var i=this.props,o=i.points,s=i.baseLine,u=i.isAnimationActive,l=this.state,f=l.prevPoints,c=l.prevBaseLine,h=l.totalLength;return u&&o&&o.length&&(!f&&h>0||!G(f,o)||!G(c,s))?this.renderAreaWithAnimation(a,n):this.renderAreaStatically(o,s,a,n)}},{key:"render",value:function(){var a,n=this.props,i=n.hide,o=n.dot,s=n.points,u=n.className,l=n.top,f=n.left,c=n.xAxis,h=n.yAxis,A=n.width,g=n.height,x=n.isAnimationActive,v=n.id;if(i||!s||!s.length)return null;var O=this.state.isAnimationFinished,y=s.length===1,_=ee("recharts-area",u),d=c&&c.allowDataOverflow,m=h&&h.allowDataOverflow,b=d||m,w=q(v)?this.id:v,P=(a=R(o,!1))!==null&&a!==void 0?a:{r:3,strokeWidth:2},N=P.r,k=N===void 0?3:N,j=P.strokeWidth,I=j===void 0?2:j,V=se(o)?o:{},Y=V.clipDot,H=Y===void 0?!0:Y,z=k*2+I;return p.createElement(W,{className:_},d||m?p.createElement("defs",null,p.createElement("clipPath",{id:"clipPath-".concat(w)},p.createElement("rect",{x:d?f:f-A/2,y:m?l:l-g/2,width:d?A:A*2,height:m?g:g*2})),!H&&p.createElement("clipPath",{id:"clipPath-dots-".concat(w)},p.createElement("rect",{x:f-z/2,y:l-z/2,width:A+z,height:g+z}))):null,y?null:this.renderArea(b,w),(o||y)&&this.renderDots(b,H,w),(!x||O)&&le.renderCallByParent(this.props,s))}}],[{key:"getDerivedStateFromProps",value:function(a,n){return a.animationId!==n.prevAnimationId?{prevAnimationId:a.animationId,curPoints:a.points,curBaseLine:a.baseLine,prevPoints:n.curPoints,prevBaseLine:n.curBaseLine}:a.points!==n.curPoints||a.baseLine!==n.curBaseLine?{curPoints:a.points,curBaseLine:a.baseLine}:null}}])}(ve.PureComponent);te=L;E(L,"displayName","Area");E(L,"defaultProps",{stroke:"#3182bd",fill:"#3182bd",fillOpacity:.6,xAxisId:0,yAxisId:0,legendType:"line",connectNulls:!1,points:[],dot:!1,activeDot:!0,hide:!1,isAnimationActive:!ce.isSsr,animationBegin:0,animationDuration:1500,animationEasing:"ease"});E(L,"getBaseValue",function(e,t,r,a){var n=e.layout,i=e.baseValue,o=t.props.baseValue,s=o??i;if(C(s)&&typeof s=="number")return s;var u=n==="horizontal"?a:r,l=u.scale.domain();if(u.type==="number"){var f=Math.max(l[0],l[1]),c=Math.min(l[0],l[1]);return s==="dataMin"?c:s==="dataMax"||f<0?f:Math.max(Math.min(l[0],l[1]),0)}return s==="dataMin"?l[0]:s==="dataMax"?l[1]:l[0]});E(L,"getComposedData",function(e){var t=e.props,r=e.item,a=e.xAxis,n=e.yAxis,i=e.xAxisTicks,o=e.yAxisTicks,s=e.bandSize,u=e.dataKey,l=e.stackedData,f=e.dataStartIndex,c=e.displayedData,h=e.offset,A=t.layout,g=l&&l.length,x=te.getBaseValue(t,r,a,n),v=A==="horizontal",O=!1,y=c.map(function(d,m){var b;g?b=l[f+m]:(b=J(d,u),Array.isArray(b)?O=!0:b=[x,b]);var w=b[1]==null||g&&J(d,u)==null;return v?{x:Q({axis:a,ticks:i,bandSize:s,entry:d,index:m}),y:w?null:n.scale(b[1]),value:b,payload:d}:{x:w?null:a.scale(b[1]),y:Q({axis:n,ticks:o,bandSize:s,entry:d,index:m}),value:b,payload:d}}),_;return g||O?_=y.map(function(d){var m=Array.isArray(d.value)?d.value[0]:null;return v?{x:d.x,y:m!=null&&d.y!=null?n.scale(m):null}:{x:m!=null?a.scale(m):null,y:d.y}}):_=v?n.scale(x):a.scale(x),S({points:y,baseLine:_,layout:A,isRange:O},h)});E(L,"renderDotItem",function(e,t){var r;if(p.isValidElement(e))r=p.cloneElement(e,t);else if(K(e))r=e(t);else{var a=ee("recharts-area-dot",typeof e!="boolean"?e.className:""),n=t.key,i=ae(t,be);r=p.createElement(fe,D({},i,{key:n,className:a}))}return r});var ke=pe({chartName:"AreaChart",GraphicalChild:L,axisComponents:[{axisType:"xAxis",AxisComp:he},{axisType:"yAxis",AxisComp:de}],formatAxisMap:me});export{ke as A,L as a};
2
+ //# sourceMappingURL=AreaChart-DjXp8u2Y.js.map