pi-mega-compact 0.20.22 → 0.20.24

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 (104) hide show
  1. package/dist/extensions/dashboard-server/resolve-snapshot.js +42 -28
  2. package/dist/extensions/dashboard-server/routes-rag-settings-helpers.js +2 -0
  3. package/dist/extensions/dashboard-server/routes-setup.js +4 -1
  4. package/dist/extensions/dashboard-server/routes-vector-cortex-crystals.js +11 -3
  5. package/dist/extensions/dashboard-server/routes-vector-cortex-diagnostics.js +7 -2
  6. package/dist/extensions/dashboard-server/routes-vector-cortex-economics.js +1 -0
  7. package/dist/extensions/dashboard-server/routes-vector-cortex-heal.js +18 -6
  8. package/dist/extensions/dashboard-server/routes-vector-cortex-policy.js +1 -0
  9. package/dist/extensions/dashboard-server/routes-vector-cortex-reconstruct.js +10 -3
  10. package/dist/extensions/dashboard-server/routes-vector-cortex-repair.js +13 -5
  11. package/dist/extensions/dashboard-server/routes-vector-cortex-shards.js +12 -4
  12. package/dist/extensions/dashboard-server/vc-event-counts.js +63 -0
  13. package/dist/extensions/mega-events/agent-handlers/turnEndHandler/cacheStripe.js +15 -4
  14. package/dist/extensions/mega-events/context-handler/afterCompact.js +57 -4
  15. package/dist/extensions/mega-events/context-handler/dbMirrorAppend.js +35 -7
  16. package/dist/extensions/mega-events/context-handler/pipelineRun.js +33 -0
  17. package/dist/extensions/mega-events/context-handler/tailResult.js +45 -12
  18. package/dist/extensions/mega-runtime/dashboard-snapshot.js +9 -6
  19. package/dist/extensions/mega-runtime/runtime-snapshot.js +2 -0
  20. package/dist/extensions/mega-runtime/vc-observer.js +98 -0
  21. package/dist/src/cache-stripe-impl.js +52 -214
  22. package/dist/src/cache-stripe-score.js +115 -0
  23. package/extensions/dashboard-client/dist/assets/{AreaChart-BkfB-LSQ.js → AreaChart-BzEedilo.js} +2 -2
  24. package/extensions/dashboard-client/dist/assets/{AreaChart-BkfB-LSQ.js.map → AreaChart-BzEedilo.js.map} +1 -1
  25. package/extensions/dashboard-client/dist/assets/{BarChart-Cs1kogko.js → BarChart-CzAVg1_J.js} +2 -2
  26. package/extensions/dashboard-client/dist/assets/{BarChart-Cs1kogko.js.map → BarChart-CzAVg1_J.js.map} +1 -1
  27. package/extensions/dashboard-client/dist/assets/{CacheTab-BZgaguGr.js → CacheTab-D2-rzTuX.js} +2 -2
  28. package/extensions/dashboard-client/dist/assets/{CacheTab-BZgaguGr.js.map → CacheTab-D2-rzTuX.js.map} +1 -1
  29. package/extensions/dashboard-client/dist/assets/{EventsTab-BFbkI_MO.js → EventsTab-DB7g1Szy.js} +2 -2
  30. package/extensions/dashboard-client/dist/assets/{EventsTab-BFbkI_MO.js.map → EventsTab-DB7g1Szy.js.map} +1 -1
  31. package/extensions/dashboard-client/dist/assets/{HealthTab-CvlOENCX.js → HealthTab-Cvkmi-R3.js} +2 -2
  32. package/extensions/dashboard-client/dist/assets/{HealthTab-CvlOENCX.js.map → HealthTab-Cvkmi-R3.js.map} +1 -1
  33. package/extensions/dashboard-client/dist/assets/{MaintenanceTab-CtBuz2qL.js → MaintenanceTab-g_udcOO7.js} +2 -2
  34. package/extensions/dashboard-client/dist/assets/{MaintenanceTab-CtBuz2qL.js.map → MaintenanceTab-g_udcOO7.js.map} +1 -1
  35. package/extensions/dashboard-client/dist/assets/{MemoryMapTab-K4775S4d.js → MemoryMapTab-DAjBaf8P.js} +2 -2
  36. package/extensions/dashboard-client/dist/assets/{MemoryMapTab-K4775S4d.js.map → MemoryMapTab-DAjBaf8P.js.map} +1 -1
  37. package/extensions/dashboard-client/dist/assets/{MetricsTab-DVGcFInz.js → MetricsTab-13dYYocB.js} +2 -2
  38. package/extensions/dashboard-client/dist/assets/{MetricsTab-DVGcFInz.js.map → MetricsTab-13dYYocB.js.map} +1 -1
  39. package/extensions/dashboard-client/dist/assets/{OverviewTab-4LmW5ZCl.js → OverviewTab-CLpCyLvx.js} +2 -2
  40. package/extensions/dashboard-client/dist/assets/{OverviewTab-4LmW5ZCl.js.map → OverviewTab-CLpCyLvx.js.map} +1 -1
  41. package/extensions/dashboard-client/dist/assets/{ReposTab-StebchgQ.js → ReposTab-EdAqUrwG.js} +2 -2
  42. package/extensions/dashboard-client/dist/assets/{ReposTab-StebchgQ.js.map → ReposTab-EdAqUrwG.js.map} +1 -1
  43. package/extensions/dashboard-client/dist/assets/{SessionsTab-C3D_XAkX.js → SessionsTab-C21ZuOL_.js} +2 -2
  44. package/extensions/dashboard-client/dist/assets/{SessionsTab-C3D_XAkX.js.map → SessionsTab-C21ZuOL_.js.map} +1 -1
  45. package/extensions/dashboard-client/dist/assets/SetupTab-CP7lE3L_.js +2 -0
  46. package/extensions/dashboard-client/dist/assets/SetupTab-CP7lE3L_.js.map +1 -0
  47. package/extensions/dashboard-client/dist/assets/{TimeSavedCard-CTPi_AAW.js → TimeSavedCard-DZ3QR8qt.js} +2 -2
  48. package/extensions/dashboard-client/dist/assets/{TimeSavedCard-CTPi_AAW.js.map → TimeSavedCard-DZ3QR8qt.js.map} +1 -1
  49. package/extensions/dashboard-client/dist/assets/{TurnsTab-DSOGcY5Q.js → TurnsTab-CNchE5rD.js} +2 -2
  50. package/extensions/dashboard-client/dist/assets/{TurnsTab-DSOGcY5Q.js.map → TurnsTab-CNchE5rD.js.map} +1 -1
  51. package/extensions/dashboard-client/dist/assets/{VectorCortexTab-OMW8_RFf.js → VectorCortexTab-B3WuPeyn.js} +2 -2
  52. package/extensions/dashboard-client/dist/assets/{VectorCortexTab-OMW8_RFf.js.map → VectorCortexTab-B3WuPeyn.js.map} +1 -1
  53. package/extensions/dashboard-client/dist/assets/{WikiTab-Db-qFDdg.js → WikiTab-BIe5Z9Nc.js} +2 -2
  54. package/extensions/dashboard-client/dist/assets/{WikiTab-Db-qFDdg.js.map → WikiTab-BIe5Z9Nc.js.map} +1 -1
  55. package/extensions/dashboard-client/dist/assets/{button-BF4UgBAD.js → button-BrVreSt5.js} +2 -2
  56. package/extensions/dashboard-client/dist/assets/{button-BF4UgBAD.js.map → button-BrVreSt5.js.map} +1 -1
  57. package/extensions/dashboard-client/dist/assets/{card-XmXoYQqB.js → card-D9F4wbqs.js} +2 -2
  58. package/extensions/dashboard-client/dist/assets/{card-XmXoYQqB.js.map → card-D9F4wbqs.js.map} +1 -1
  59. package/extensions/dashboard-client/dist/assets/{generateCategoricalChart-Be8hM1aU.js → generateCategoricalChart-mkdzCnMP.js} +2 -2
  60. package/extensions/dashboard-client/dist/assets/{generateCategoricalChart-Be8hM1aU.js.map → generateCategoricalChart-mkdzCnMP.js.map} +1 -1
  61. package/extensions/dashboard-client/dist/assets/{index-NXDgILxv.js → index-CtlmOlj1.js} +3 -3
  62. package/extensions/dashboard-client/dist/assets/{index-NXDgILxv.js.map → index-CtlmOlj1.js.map} +1 -1
  63. package/extensions/dashboard-client/dist/assets/{switch-kUZCrbia.js → switch-BXmp5iwA.js} +2 -2
  64. package/extensions/dashboard-client/dist/assets/{switch-kUZCrbia.js.map → switch-BXmp5iwA.js.map} +1 -1
  65. package/extensions/dashboard-client/dist/assets/{toggle-DEe5mCwF.js → toggle-BgawNwW9.js} +2 -2
  66. package/extensions/dashboard-client/dist/assets/{toggle-DEe5mCwF.js.map → toggle-BgawNwW9.js.map} +1 -1
  67. package/extensions/dashboard-client/dist/assets/{useSSE-BlCyLqge.js → useSSE-DZKX73Ea.js} +2 -2
  68. package/extensions/dashboard-client/dist/assets/{useSSE-BlCyLqge.js.map → useSSE-DZKX73Ea.js.map} +1 -1
  69. package/extensions/dashboard-client/dist/index.html +1 -1
  70. package/extensions/dashboard-client/src/tabs/SetupTab/CustomEndpointSection.tsx +65 -0
  71. package/extensions/dashboard-client/src/tabs/SetupTab/EmbedderSetup.tsx +19 -108
  72. package/extensions/dashboard-client/src/tabs/SetupTab/EmbedderSetupStyles.ts +69 -0
  73. package/extensions/dashboard-client/src/tabs/VectorCortexTab.tsx +5 -3
  74. package/extensions/dashboard-server/api-contracts/setup.ts +4 -3
  75. package/extensions/dashboard-server/api-contracts/vector-cortex-cache.ts +5 -0
  76. package/extensions/dashboard-server/api-contracts/vector-cortex-diagnostics.ts +2 -0
  77. package/extensions/dashboard-server/api-contracts/vector-cortex-economics.ts +2 -0
  78. package/extensions/dashboard-server/api-contracts/vector-cortex-policy.ts +2 -0
  79. package/extensions/dashboard-server/resolve-snapshot.ts +42 -28
  80. package/extensions/dashboard-server/routes-rag-settings-helpers.ts +12 -0
  81. package/extensions/dashboard-server/routes-setup.ts +3 -1
  82. package/extensions/dashboard-server/routes-vector-cortex-crystals.ts +12 -3
  83. package/extensions/dashboard-server/routes-vector-cortex-diagnostics.ts +8 -2
  84. package/extensions/dashboard-server/routes-vector-cortex-economics.ts +1 -0
  85. package/extensions/dashboard-server/routes-vector-cortex-heal.ts +19 -6
  86. package/extensions/dashboard-server/routes-vector-cortex-policy.ts +1 -0
  87. package/extensions/dashboard-server/routes-vector-cortex-reconstruct.ts +11 -3
  88. package/extensions/dashboard-server/routes-vector-cortex-repair.ts +14 -5
  89. package/extensions/dashboard-server/routes-vector-cortex-shards.ts +13 -4
  90. package/extensions/dashboard-server/vc-event-counts.ts +67 -0
  91. package/extensions/mega-dashboard.ts +2 -0
  92. package/extensions/mega-events/agent-handlers/turnEndHandler/cacheStripe.ts +13 -4
  93. package/extensions/mega-events/context-handler/afterCompact.ts +69 -4
  94. package/extensions/mega-events/context-handler/dbMirrorAppend.ts +39 -7
  95. package/extensions/mega-events/context-handler/pipelineRun.ts +39 -0
  96. package/extensions/mega-events/context-handler/tailResult.ts +56 -15
  97. package/extensions/mega-runtime/dashboard-snapshot.ts +12 -6
  98. package/extensions/mega-runtime/runtime-snapshot.ts +6 -0
  99. package/extensions/mega-runtime/vc-observer.ts +120 -0
  100. package/package.json +1 -1
  101. package/src/cache-stripe-impl.ts +73 -277
  102. package/src/cache-stripe-score.ts +170 -0
  103. package/extensions/dashboard-client/dist/assets/SetupTab-BTBGyppF.js +0 -2
  104. package/extensions/dashboard-client/dist/assets/SetupTab-BTBGyppF.js.map +0 -1
@@ -1,240 +1,82 @@
1
1
  /**
2
- * cache-stripe-impl.ts — Vector-Aware Cache Striping implementation.
2
+ * cache-stripe-impl.ts — Vector-Aware Cache Striping (PLAN_V2 Phase 3).
3
3
  *
4
- * Computes a stability score for each context chunk and assigns it to a
5
- * cache stripe / prompt-cache layer. Stable chunks (high recency + frequency +
6
- * semantic density) go to early layers (cached prefix); volatile chunks append
7
- * at Layer 4 (tail). Runs entirely offline no network, no LLM (PREVENT-PI-004).
4
+ * Owns refreshStripeAssignments: the DB-touching write path that scores each
5
+ * context chunk and UPSERTs its stripe row into cache_stripes. All pure math
6
+ * and scoring types live in cache-stripe-score.ts (extracted via the
7
+ * delegate-shell pattern to keep this file under the 300-line src/ soft
8
+ * limit). cache-stripe.ts re-exports the public surface.
8
9
  *
9
- * The stability score is a weighted composite:
10
- * stability = 0.5 * semanticSimilarity + 0.3 * recency + 0.2 * frequency
11
- *
12
- * - semanticSimilarity: cosine similarity of the chunk's embedding against the
13
- * running session embedding (from TrigramEmbedder). High similarity means the
14
- * chunk is topically relevant to current work.
15
- * - recency: how recently the chunk appeared (normalized to 0.0-1.0 across all
16
- * chunks in the epoch). Recent chunks are more likely to benefit from caching.
17
- * - frequency: how often the chunk's content has been referenced (0.0-1.0,
18
- * estimated from a simple access counter stored alongside).
19
- *
20
- * Reassignment happens at epoch boundaries via refreshStripeAssignments.
21
- * All SQL is parameterized (PREVENT-002). No pi runtime types are imported,
22
- * keeping this module pi-agnostic.
10
+ * Runs entirely offline no network, no LLM (PREVENT-PI-004). All SQL is
11
+ * parameterized (PREVENT-002). No pi runtime types are imported, keeping this
12
+ * module pi-agnostic.
23
13
  */
24
14
  import { randomBytes } from "node:crypto";
25
15
  import { openStore, withTx } from "./store/sqlite/utils.js";
26
- // ─── Constants ───────────────────────────────────────────────────────────────
27
- /** Semantic similarity weight in the composite score. */
28
- const WEIGHT_SEMANTIC = 0.5;
29
- /** Recency weight in the composite score. */
30
- const WEIGHT_RECENCY = 0.3;
31
- /** Frequency weight in the composite score. */
32
- const WEIGHT_FREQUENCY = 0.2;
33
- /** Stripes a chunk lands in based on its stability score. Thresholds define
34
- * the boundary between adjacent layers. */
35
- const STRIPE_THRESHOLDS = [
36
- { minStability: 0.90, stripe: 0 },
37
- { minStability: 0.70, stripe: 1 },
38
- { minStability: 0.50, stripe: 2 },
39
- { minStability: 0.30, stripe: 3 },
40
- { minStability: -Infinity, stripe: 4 },
41
- ];
42
- // ─── Embedding helpers (no external dep) ─────────────────────────────────────
43
- /**
44
- * FNV-1a 32-bit hash for the content-based embedding fallback. The production
45
- * path uses TrigramEmbedder from embedder.ts but we keep a self-contained hash
46
- * for the case where no embedder is passed in.
47
- */
48
- function fnv1a(text) {
49
- let hash = 0x811c9dc5;
50
- for (let i = 0; i < text.length; i++) {
51
- hash ^= text.charCodeAt(i);
52
- hash = Math.imul(hash, 0x01000193);
53
- }
54
- return (hash >>> 0) / 0x100000000;
55
- }
56
- /**
57
- * Produce a crude 128-dim pseudorandom embedding from text using hashed n-gram
58
- * bins. Matches the approach in TrigramEmbedder._embedRaw conceptually. Used
59
- * only as a fallback / test path; the caller should prefer TrigramEmbedder.
60
- */
61
- function fallbackEmbed(text) {
62
- const dim = 128;
63
- const vec = new Array(dim).fill(0);
64
- const norm = text.toLowerCase().replace(/\s+/g, " ");
65
- if (norm.length === 0)
66
- return vec;
67
- vec[Math.floor(fnv1a(norm) * dim)] += 1;
68
- for (const word of norm.split(" ")) {
69
- if (word.length === 0)
70
- continue;
71
- vec[Math.floor(fnv1a(word) * dim)] += 0.5;
72
- for (let i = 0; i < Math.max(1, word.length - 1); i++) {
73
- const trigram = word.slice(i, i + 3);
74
- if (trigram.length === 3) {
75
- vec[Math.floor(fnv1a(trigram) * dim)] += 0.25;
76
- }
77
- }
78
- }
79
- return l2Normalize(vec);
80
- }
81
- function l2Normalize(v) {
82
- let sumSq = 0;
83
- for (let i = 0; i < v.length; i++)
84
- sumSq += v[i] * v[i];
85
- if (sumSq === 0)
86
- return v;
87
- const norm = Math.sqrt(sumSq);
88
- for (let i = 0; i < v.length; i++)
89
- v[i] /= norm;
90
- return v;
91
- }
92
- /** Compute cosine similarity between two vectors of equal length. */
93
- function cosineSimilarity(a, b) {
94
- if (a.length !== b.length || a.length === 0)
95
- return 0;
96
- let dot = 0;
97
- let na = 0;
98
- let nb = 0;
99
- for (let i = 0; i < a.length; i++) {
100
- dot += a[i] * b[i];
101
- na += a[i] * a[i];
102
- nb += b[i] * b[i];
103
- }
104
- const denom = Math.sqrt(na) * Math.sqrt(nb);
105
- return denom === 0 ? 0 : dot / denom;
106
- }
107
- // ─── Stability Scoring ───────────────────────────────────────────────────────
108
- /**
109
- * Compute a composite stability score for a single chunk.
110
- *
111
- * @param chunk The chunk metadata + content to score.
112
- * @param allChunks All chunks in this epoch (used to compute relative recency).
113
- * @param embedder Optional embedder instance. If omitted, uses the
114
- * self-contained fallback (128-dim hashed n-gram).
115
- * @param sessionEmbed Pre-computed embedding for the current session (the
116
- * "query" vector). If omitted, computed on the fly from
117
- * the chunk content alone, which degrades semantic scoring
118
- * to a self-similarity baseline.
119
- * @returns A number in [0.0, 1.0] where 1.0 = most stable.
120
- */
121
- export function computeStabilityScore(chunk, allChunks, embedder, sessionEmbed) {
122
- // ── Semantic similarity (0.5 weight) ────────────────────────────────────
123
- const emb = embedder
124
- ? embedder.embed(chunk.content)
125
- : fallbackEmbed(chunk.content);
126
- // If no session embedding is provided, use the chunk's own embedding as
127
- // a self-similarity — this produces a baseline score based on content
128
- // density (chunks with more meaningful content get higher internal
129
- // similarity). Real deployments should pass the session embedding.
130
- const sem = cosineSimilarity(emb, sessionEmbed ?? emb);
131
- const semanticScore = isNaN(sem) ? 0 : sem;
132
- // ── Recency (0.3 weight) ────────────────────────────────────────────────
133
- // Relative recency: lastAccessedAt of this chunk vs. min/max across epoch.
134
- // Falls back to 0.5 if there's only one chunk or no timestamp data.
135
- let recencyScore = 0.5;
136
- const accessed = allChunks
137
- .map((c) => c.lastAccessedAt)
138
- .filter((t) => t > 0);
139
- if (accessed.length > 1) {
140
- const minT = Math.min(...accessed);
141
- const maxT = Math.max(...accessed);
142
- const range = maxT - minT;
143
- if (range > 0) {
144
- recencyScore = (chunk.lastAccessedAt - minT) / range;
145
- }
146
- else {
147
- recencyScore = 1.0;
148
- }
149
- }
150
- // ── Frequency (0.2 weight) ──────────────────────────────────────────────
151
- // Access count relative to the max across the epoch.
152
- const counts = allChunks.map((c) => c.accessCount);
153
- const maxCount = Math.max(...counts, 1);
154
- const freqScore = maxCount > 0 ? chunk.accessCount / maxCount : 0;
155
- // ── Composite ───────────────────────────────────────────────────────────
156
- const stability = WEIGHT_SEMANTIC * semanticScore +
157
- WEIGHT_RECENCY * recencyScore +
158
- WEIGHT_FREQUENCY * freqScore;
159
- // Clamp to [0.0, 1.0] as a safety net.
160
- return Math.max(0, Math.min(1, stability));
161
- }
162
- /**
163
- * Determine the cache stripe (layer) for a given stability score.
164
- *
165
- * @param stability Composite stability score in [0.0, 1.0].
166
- * @returns Stripe number 0-4.
167
- */
168
- export function stabilityToStripe(stability) {
169
- for (const t of STRIPE_THRESHOLDS) {
170
- if (stability >= t.minStability)
171
- return t.stripe;
172
- }
173
- return 4;
174
- }
16
+ import { computeStabilityScore, stabilityToStripe, fallbackEmbed, l2Normalize, } from "./cache-stripe-score.js";
17
+ export { computeStabilityScore, stabilityToStripe, fallbackEmbed, l2Normalize, } from "./cache-stripe-score.js";
175
18
  // ─── Stripe Reassignment ─────────────────────────────────────────────────────
176
19
  /**
177
- * Refresh stripe assignments for all chunks in the current epoch.
20
+ * Refresh stripe assignments for all chunks in an epoch.
178
21
  *
179
22
  * Steps:
180
- * 1. Read all context_chunks from the SQLite store that belong to the
181
- * current epoch (or all chunks if no epoch filter).
182
- * 2. For each chunk, compute a stability score via computeStabilityScore.
183
- * 3. Map stability -> stripe via stabilityToStripe.
184
- * 4. UPSERT into cache_stripes.
185
- * 5. (Stale entries for this epoch are implicitly overwritten by the UPSERT.)
186
- *
187
- * The optional embedder parameter allows injecting the production
188
- * TrigramEmbedder. If omitted, the fallback hashed n-gram embedder is used
189
- * (works offline in all scenarios).
23
+ * 1. Resolve target epochId: explicit string use it; '' no epoch filter
24
+ * (assign all chunks); undefined look up the most recently committed
25
+ * checkpoint_epochs row so the stripes we write are visible to the
26
+ * buildCacheOptimizedPrompt reader (`ORDER BY created_at DESC LIMIT 1`).
27
+ * If no epoch exists yet (pre-first-compaction), fall back to a random id
28
+ * the write succeeds and the rows are simply never read until an epoch
29
+ * lands.
30
+ * 2. Read context_chunks (chunk_id = c.id, NOT rowid — the read path joins
31
+ * on the TEXT id).
32
+ * 3. Score each chunk via computeStabilityScore (mean-pool embeddings for a
33
+ * session-level semantic "query" vector).
34
+ * 4. Atomic UPSERT into cache_stripes.
190
35
  *
191
- * Non-fatal: failures are logged via a provided logger callback and never
192
- * thrown. Returns the count of chunks reassigned.
193
- *
194
- * @param store An open SQLite DatabaseSync handle (or a stateDir string
195
- * to open lazily). Accepts either to match the caller's
196
- * convenience. When a string is passed, opens the store for
197
- * this call only (does not cache the connection).
198
- * @param epochId The epoch to reassign. If omitted, generates a new epoch
199
- * ID (random hex). Pass '' to reassign all chunks without
200
- * filtering by epoch.
201
- * @param embedder Optional TrigramEmbedder instance. When provided, uses it
202
- * for semantic similarity; otherwise uses the fallback.
203
- * @param logFn Optional logging callback (defaults to no-op).
204
- * @returns The number of chunks that were reassigned.
36
+ * Non-fatal: failures are logged via the provided logger and never thrown.
37
+ * Returns the count of chunks reassigned (0 on error).
205
38
  */
206
39
  export function refreshStripeAssignments(store, epochId, embedder, logFn) {
207
40
  const db = typeof store === "string" ? openStore(store) : store;
208
41
  const log = logFn ?? (() => { });
209
- const actualEpochId = epochId ?? nextEpochId();
42
+ let actualEpochId;
43
+ if (epochId !== undefined) {
44
+ actualEpochId = epochId;
45
+ }
46
+ else {
47
+ try {
48
+ const latest = db
49
+ .prepare(`SELECT epoch_id FROM checkpoint_epochs ORDER BY created_at DESC LIMIT 1`)
50
+ .get();
51
+ actualEpochId = latest?.epoch_id ?? nextEpochId();
52
+ }
53
+ catch {
54
+ actualEpochId = nextEpochId();
55
+ }
56
+ }
210
57
  const now = Math.floor(Date.now() / 1000);
211
58
  try {
212
- // 1. Read all relevant context_chunks, using the summary as text content.
213
- // The summary field holds the compressed checkpoint content; for fresh
214
- // chunks that have no summary yet, fall back to normalized_text or
215
- // concatenated key_decisions.
59
+ // cache_stripes has no access_count / last_accessed_at columns (schema:
60
+ // chunk_id/stripe/stability/assigned_at/epoch_id) querying them throws.
61
+ // Score freshness/frequency to 0 here; stability derives from content +
62
+ // semantic similarity only until an access-tracking column is added.
216
63
  const rows = db
217
- .prepare(`SELECT c.rowid AS chunk_id,
218
- COALESCE(c.summary, c.normalized_text, c.key_decisions, '') AS content,
219
- COALESCE(s.access_count, 0) AS access_count,
220
- COALESCE(s.last_accessed_at, 0) AS last_accessed_at
64
+ .prepare(`SELECT c.id AS chunk_id,
65
+ COALESCE(c.summary, c.normalized_text, c.key_decisions, '') AS content
221
66
  FROM context_chunks c
222
- LEFT JOIN cache_stripes s ON s.chunk_id = CAST(c.rowid AS TEXT)
67
+ LEFT JOIN cache_stripes s ON s.chunk_id = c.id
223
68
  WHERE (? = '' OR s.epoch_id = ? OR s.epoch_id IS NULL)`)
224
69
  .all(actualEpochId, actualEpochId);
225
70
  if (rows.length === 0) {
226
71
  log("cache-stripe: no chunks to reassign");
227
72
  return 0;
228
73
  }
229
- // Build the allChunks array for relative scoring.
230
74
  const allChunks = rows.map((r) => ({
231
- chunkId: String(r.chunk_id),
75
+ chunkId: r.chunk_id,
232
76
  content: r.content,
233
- accessCount: r.access_count,
234
- lastAccessedAt: r.last_accessed_at,
77
+ accessCount: 0,
78
+ lastAccessedAt: 0,
235
79
  }));
236
- // Compute a session embedding (mean of all chunk embeddings) for semantic
237
- // similarity comparison.
238
80
  let sessionEmbed;
239
81
  try {
240
82
  const dim = embedder ? embedder.embed("").length : 128;
@@ -257,14 +99,12 @@ export function refreshStripeAssignments(store, epochId, embedder, logFn) {
257
99
  catch {
258
100
  log("cache-stripe: session embedding failed, skipping semantic weight");
259
101
  }
260
- // 2. Compute stability for each chunk.
261
102
  const results = [];
262
103
  for (const chunk of allChunks) {
263
104
  const stability = computeStabilityScore(chunk, allChunks, embedder, sessionEmbed);
264
105
  const stripe = stabilityToStripe(stability);
265
106
  results.push({ chunkId: chunk.chunkId, stripe, stability });
266
107
  }
267
- // 3. UPSERT into cache_stripes using a savepoint for atomicity.
268
108
  const upsert = db.prepare(`INSERT OR REPLACE INTO cache_stripes(chunk_id, stripe, stability, assigned_at, epoch_id)
269
109
  VALUES (?, ?, ?, ?, ?)`);
270
110
  withTx(db, () => {
@@ -280,9 +120,7 @@ export function refreshStripeAssignments(store, epochId, embedder, logFn) {
280
120
  return 0;
281
121
  }
282
122
  }
283
- /**
284
- * Generate a random epoch ID (16 hex chars) for tokenizing stripe cohorts.
285
- */
123
+ /** Generate a random epoch id (16 hex chars) for tokenizing stripe cohorts. */
286
124
  function nextEpochId() {
287
125
  return randomBytes(8).toString("hex");
288
126
  }
@@ -0,0 +1,115 @@
1
+ /**
2
+ * cache-stripe-score.ts — stability scoring + pure helpers for cache-striping.
3
+ *
4
+ * Extracted from cache-stripe-impl.ts (delegate-shell split) so the DB-touching
5
+ * refreshStripeAssignments lives apart from pure scoring math. No SQL, no pi
6
+ * runtime types (PREVENT-PI-004, PREVENT-002).
7
+ */
8
+ // ─── Constants ───────────────────────────────────────────────────────────────
9
+ const WEIGHT_SEMANTIC = 0.5;
10
+ const WEIGHT_RECENCY = 0.3;
11
+ const WEIGHT_FREQUENCY = 0.2;
12
+ const STRIPE_THRESHOLDS = [
13
+ { minStability: 0.90, stripe: 0 },
14
+ { minStability: 0.70, stripe: 1 },
15
+ { minStability: 0.50, stripe: 2 },
16
+ { minStability: 0.30, stripe: 3 },
17
+ { minStability: -Infinity, stripe: 4 },
18
+ ];
19
+ // ─── Embedding helpers (no external dep) ─────────────────────────────────────
20
+ /** FNV-1a 32-bit hash for the content-based embedding fallback. */
21
+ function fnv1a(text) {
22
+ let hash = 0x811c9dc5;
23
+ for (let i = 0; i < text.length; i++) {
24
+ hash ^= text.charCodeAt(i);
25
+ hash = Math.imul(hash, 0x01000193);
26
+ }
27
+ return (hash >>> 0) / 0x100000000;
28
+ }
29
+ /** Crude 128-dim hashed n-gram embedding fallback. Used when no embedder is
30
+ * injected (e.g. tests); production should pass TrigramEmbedder. */
31
+ export function fallbackEmbed(text) {
32
+ const dim = 128;
33
+ const vec = new Array(dim).fill(0);
34
+ const norm = text.toLowerCase().replace(/\s+/g, " ");
35
+ if (norm.length === 0)
36
+ return vec;
37
+ vec[Math.floor(fnv1a(norm) * dim)] += 1;
38
+ for (const word of norm.split(" ")) {
39
+ if (word.length === 0)
40
+ continue;
41
+ vec[Math.floor(fnv1a(word) * dim)] += 0.5;
42
+ for (let i = 0; i < Math.max(1, word.length - 1); i++) {
43
+ const trigram = word.slice(i, i + 3);
44
+ if (trigram.length === 3) {
45
+ vec[Math.floor(fnv1a(trigram) * dim)] += 0.25;
46
+ }
47
+ }
48
+ }
49
+ return l2Normalize(vec);
50
+ }
51
+ export function l2Normalize(v) {
52
+ let sumSq = 0;
53
+ for (let i = 0; i < v.length; i++)
54
+ sumSq += v[i] * v[i];
55
+ if (sumSq === 0)
56
+ return v;
57
+ const norm = Math.sqrt(sumSq);
58
+ for (let i = 0; i < v.length; i++)
59
+ v[i] /= norm;
60
+ return v;
61
+ }
62
+ /** Compute cosine similarity between two vectors of equal length. */
63
+ export function cosineSimilarity(a, b) {
64
+ if (a.length !== b.length || a.length === 0)
65
+ return 0;
66
+ let dot = 0;
67
+ let na = 0;
68
+ let nb = 0;
69
+ for (let i = 0; i < a.length; i++) {
70
+ dot += a[i] * b[i];
71
+ na += a[i] * a[i];
72
+ nb += b[i] * b[i];
73
+ }
74
+ const denom = Math.sqrt(na) * Math.sqrt(nb);
75
+ return denom === 0 ? 0 : dot / denom;
76
+ }
77
+ // ─── Stability Scoring ───────────────────────────────────────────────────────
78
+ /**
79
+ * Composite stability = 0.5*semantic + 0.3*recency + 0.2*frequency.
80
+ * Recency/frequency fall back to neutral scores when the epoch lacks
81
+ * access-tracking data (the current cache_stripes schema).
82
+ */
83
+ export function computeStabilityScore(chunk, allChunks, embedder, sessionEmbed) {
84
+ const emb = embedder
85
+ ? embedder.embed(chunk.content)
86
+ : fallbackEmbed(chunk.content);
87
+ // No session embedding → self-similarity baseline.
88
+ const sem = cosineSimilarity(emb, sessionEmbed ?? emb);
89
+ const semanticScore = isNaN(sem) ? 0 : sem;
90
+ let recencyScore = 0.5;
91
+ const accessed = allChunks
92
+ .map((c) => c.lastAccessedAt)
93
+ .filter((t) => t > 0);
94
+ if (accessed.length > 1) {
95
+ const minT = Math.min(...accessed);
96
+ const maxT = Math.max(...accessed);
97
+ const range = maxT - minT;
98
+ recencyScore = range > 0 ? (chunk.lastAccessedAt - minT) / range : 1.0;
99
+ }
100
+ const counts = allChunks.map((c) => c.accessCount);
101
+ const maxCount = Math.max(...counts, 1);
102
+ const freqScore = maxCount > 0 ? chunk.accessCount / maxCount : 0;
103
+ const stability = WEIGHT_SEMANTIC * semanticScore +
104
+ WEIGHT_RECENCY * recencyScore +
105
+ WEIGHT_FREQUENCY * freqScore;
106
+ return Math.max(0, Math.min(1, stability));
107
+ }
108
+ /** Map a stability score to its stripe (layer). */
109
+ export function stabilityToStripe(stability) {
110
+ for (const t of STRIPE_THRESHOLDS) {
111
+ if (stability >= t.minStability)
112
+ return t.stripe;
113
+ }
114
+ return 4;
115
+ }
@@ -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-Be8hM1aU.js";import{R as p,F as ee,r as ve}from"./index-NXDgILxv.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-BkfB-LSQ.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-mkdzCnMP.js";import{R as p,F as ee,r as ve}from"./index-CtlmOlj1.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-BzEedilo.js.map