source dump of claude code
at main 220 lines 22 kB view raw
1import { c as _c } from "react/compiler-runtime"; 2import React, { createContext, useCallback, useContext, useEffect, useMemo } from 'react'; 3import { saveCurrentProjectConfig } from '../utils/config.js'; 4export type StatsStore = { 5 increment(name: string, value?: number): void; 6 set(name: string, value: number): void; 7 observe(name: string, value: number): void; 8 add(name: string, value: string): void; 9 getAll(): Record<string, number>; 10}; 11function percentile(sorted: number[], p: number): number { 12 const index = p / 100 * (sorted.length - 1); 13 const lower = Math.floor(index); 14 const upper = Math.ceil(index); 15 if (lower === upper) { 16 return sorted[lower]!; 17 } 18 return sorted[lower]! + (sorted[upper]! - sorted[lower]!) * (index - lower); 19} 20const RESERVOIR_SIZE = 1024; 21type Histogram = { 22 reservoir: number[]; 23 count: number; 24 sum: number; 25 min: number; 26 max: number; 27}; 28export function createStatsStore(): StatsStore { 29 const metrics = new Map<string, number>(); 30 const histograms = new Map<string, Histogram>(); 31 const sets = new Map<string, Set<string>>(); 32 return { 33 increment(name: string, value = 1) { 34 metrics.set(name, (metrics.get(name) ?? 0) + value); 35 }, 36 set(name: string, value: number) { 37 metrics.set(name, value); 38 }, 39 observe(name: string, value: number) { 40 let h = histograms.get(name); 41 if (!h) { 42 h = { 43 reservoir: [], 44 count: 0, 45 sum: 0, 46 min: value, 47 max: value 48 }; 49 histograms.set(name, h); 50 } 51 h.count++; 52 h.sum += value; 53 if (value < h.min) { 54 h.min = value; 55 } 56 if (value > h.max) { 57 h.max = value; 58 } 59 // Reservoir sampling (Algorithm R) 60 if (h.reservoir.length < RESERVOIR_SIZE) { 61 h.reservoir.push(value); 62 } else { 63 const j = Math.floor(Math.random() * h.count); 64 if (j < RESERVOIR_SIZE) { 65 h.reservoir[j] = value; 66 } 67 } 68 }, 69 add(name: string, value: string) { 70 let s = sets.get(name); 71 if (!s) { 72 s = new Set(); 73 sets.set(name, s); 74 } 75 s.add(value); 76 }, 77 getAll() { 78 const result: Record<string, number> = Object.fromEntries(metrics); 79 for (const [name, h] of histograms) { 80 if (h.count === 0) { 81 continue; 82 } 83 result[`${name}_count`] = h.count; 84 result[`${name}_min`] = h.min; 85 result[`${name}_max`] = h.max; 86 result[`${name}_avg`] = h.sum / h.count; 87 const sorted = [...h.reservoir].sort((a, b) => a - b); 88 result[`${name}_p50`] = percentile(sorted, 50); 89 result[`${name}_p95`] = percentile(sorted, 95); 90 result[`${name}_p99`] = percentile(sorted, 99); 91 } 92 for (const [name, s] of sets) { 93 result[name] = s.size; 94 } 95 return result; 96 } 97 }; 98} 99export const StatsContext = createContext<StatsStore | null>(null); 100type Props = { 101 store?: StatsStore; 102 children: React.ReactNode; 103}; 104export function StatsProvider(t0) { 105 const $ = _c(7); 106 const { 107 store: externalStore, 108 children 109 } = t0; 110 let t1; 111 if ($[0] === Symbol.for("react.memo_cache_sentinel")) { 112 t1 = createStatsStore(); 113 $[0] = t1; 114 } else { 115 t1 = $[0]; 116 } 117 const internalStore = t1; 118 const store = externalStore ?? internalStore; 119 let t2; 120 let t3; 121 if ($[1] !== store) { 122 t2 = () => { 123 const flush = () => { 124 const metrics = store.getAll(); 125 if (Object.keys(metrics).length > 0) { 126 saveCurrentProjectConfig(current => ({ 127 ...current, 128 lastSessionMetrics: metrics 129 })); 130 } 131 }; 132 process.on("exit", flush); 133 return () => { 134 process.off("exit", flush); 135 }; 136 }; 137 t3 = [store]; 138 $[1] = store; 139 $[2] = t2; 140 $[3] = t3; 141 } else { 142 t2 = $[2]; 143 t3 = $[3]; 144 } 145 useEffect(t2, t3); 146 let t4; 147 if ($[4] !== children || $[5] !== store) { 148 t4 = <StatsContext.Provider value={store}>{children}</StatsContext.Provider>; 149 $[4] = children; 150 $[5] = store; 151 $[6] = t4; 152 } else { 153 t4 = $[6]; 154 } 155 return t4; 156} 157export function useStats() { 158 const store = useContext(StatsContext); 159 if (!store) { 160 throw new Error("useStats must be used within a StatsProvider"); 161 } 162 return store; 163} 164export function useCounter(name) { 165 const $ = _c(3); 166 const store = useStats(); 167 let t0; 168 if ($[0] !== name || $[1] !== store) { 169 t0 = value => store.increment(name, value); 170 $[0] = name; 171 $[1] = store; 172 $[2] = t0; 173 } else { 174 t0 = $[2]; 175 } 176 return t0; 177} 178export function useGauge(name) { 179 const $ = _c(3); 180 const store = useStats(); 181 let t0; 182 if ($[0] !== name || $[1] !== store) { 183 t0 = value => store.set(name, value); 184 $[0] = name; 185 $[1] = store; 186 $[2] = t0; 187 } else { 188 t0 = $[2]; 189 } 190 return t0; 191} 192export function useTimer(name) { 193 const $ = _c(3); 194 const store = useStats(); 195 let t0; 196 if ($[0] !== name || $[1] !== store) { 197 t0 = value => store.observe(name, value); 198 $[0] = name; 199 $[1] = store; 200 $[2] = t0; 201 } else { 202 t0 = $[2]; 203 } 204 return t0; 205} 206export function useSet(name) { 207 const $ = _c(3); 208 const store = useStats(); 209 let t0; 210 if ($[0] !== name || $[1] !== store) { 211 t0 = value => store.add(name, value); 212 $[0] = name; 213 $[1] = store; 214 $[2] = t0; 215 } else { 216 t0 = $[2]; 217 } 218 return t0; 219} 220//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsImNyZWF0ZUNvbnRleHQiLCJ1c2VDYWxsYmFjayIsInVzZUNvbnRleHQiLCJ1c2VFZmZlY3QiLCJ1c2VNZW1vIiwic2F2ZUN1cnJlbnRQcm9qZWN0Q29uZmlnIiwiU3RhdHNTdG9yZSIsImluY3JlbWVudCIsIm5hbWUiLCJ2YWx1ZSIsInNldCIsIm9ic2VydmUiLCJhZGQiLCJnZXRBbGwiLCJSZWNvcmQiLCJwZXJjZW50aWxlIiwic29ydGVkIiwicCIsImluZGV4IiwibGVuZ3RoIiwibG93ZXIiLCJNYXRoIiwiZmxvb3IiLCJ1cHBlciIsImNlaWwiLCJSRVNFUlZPSVJfU0laRSIsIkhpc3RvZ3JhbSIsInJlc2Vydm9pciIsImNvdW50Iiwic3VtIiwibWluIiwibWF4IiwiY3JlYXRlU3RhdHNTdG9yZSIsIm1ldHJpY3MiLCJNYXAiLCJoaXN0b2dyYW1zIiwic2V0cyIsIlNldCIsImdldCIsImgiLCJwdXNoIiwiaiIsInJhbmRvbSIsInMiLCJyZXN1bHQiLCJPYmplY3QiLCJmcm9tRW50cmllcyIsInNvcnQiLCJhIiwiYiIsInNpemUiLCJTdGF0c0NvbnRleHQiLCJQcm9wcyIsInN0b3JlIiwiY2hpbGRyZW4iLCJSZWFjdE5vZGUiLCJTdGF0c1Byb3ZpZGVyIiwidDAiLCIkIiwiX2MiLCJleHRlcm5hbFN0b3JlIiwidDEiLCJTeW1ib2wiLCJmb3IiLCJpbnRlcm5hbFN0b3JlIiwidDIiLCJ0MyIsImZsdXNoIiwia2V5cyIsImN1cnJlbnQiLCJsYXN0U2Vzc2lvbk1ldHJpY3MiLCJwcm9jZXNzIiwib24iLCJvZmYiLCJ0NCIsInVzZVN0YXRzIiwiRXJyb3IiLCJ1c2VDb3VudGVyIiwidXNlR2F1Z2UiLCJ1c2VUaW1lciIsInVzZVNldCJdLCJzb3VyY2VzIjpbInN0YXRzLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHtcbiAgY3JlYXRlQ29udGV4dCxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUNvbnRleHQsXG4gIHVzZUVmZmVjdCxcbiAgdXNlTWVtbyxcbn0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBzYXZlQ3VycmVudFByb2plY3RDb25maWcgfSBmcm9tICcuLi91dGlscy9jb25maWcuanMnXG5cbmV4cG9ydCB0eXBlIFN0YXRzU3RvcmUgPSB7XG4gIGluY3JlbWVudChuYW1lOiBzdHJpbmcsIHZhbHVlPzogbnVtYmVyKTogdm9pZFxuICBzZXQobmFtZTogc3RyaW5nLCB2YWx1ZTogbnVtYmVyKTogdm9pZFxuICBvYnNlcnZlKG5hbWU6IHN0cmluZywgdmFsdWU6IG51bWJlcik6IHZvaWRcbiAgYWRkKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWRcbiAgZ2V0QWxsKCk6IFJlY29yZDxzdHJpbmcsIG51bWJlcj5cbn1cblxuZnVuY3Rpb24gcGVyY2VudGlsZShzb3J0ZWQ6IG51bWJlcltdLCBwOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBpbmRleCA9IChwIC8gMTAwKSAqIChzb3J0ZWQubGVuZ3RoIC0gMSlcbiAgY29uc3QgbG93ZXIgPSBNYXRoLmZsb29yKGluZGV4KVxuICBjb25zdCB1cHBlciA9IE1hdGguY2VpbChpbmRleClcbiAgaWYgKGxvd2VyID09PSB1cHBlcikge1xuICAgIHJldHVybiBzb3J0ZWRbbG93ZXJdIVxuICB9XG4gIHJldHVybiBzb3J0ZWRbbG93ZXJdISArIChzb3J0ZWRbdXBwZXJdISAtIHNvcnRlZFtsb3dlcl0hKSAqIChpbmRleCAtIGxvd2VyKVxufVxuXG5jb25zdCBSRVNFUlZPSVJfU0laRSA9IDEwMjRcblxudHlwZSBIaXN0b2dyYW0gPSB7XG4gIHJlc2Vydm9pcjogbnVtYmVyW11cbiAgY291bnQ6IG51bWJlclxuICBzdW06IG51bWJlclxuICBtaW46IG51bWJlclxuICBtYXg6IG51bWJlclxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3RhdHNTdG9yZSgpOiBTdGF0c1N0b3JlIHtcbiAgY29uc3QgbWV0cmljcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KClcbiAgY29uc3QgaGlzdG9ncmFtcyA9IG5ldyBNYXA8c3RyaW5nLCBIaXN0b2dyYW0+KClcbiAgY29uc3Qgc2V0cyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKVxuXG4gIHJldHVybiB7XG4gICAgaW5jcmVtZW50KG5hbWU6IHN0cmluZywgdmFsdWUgPSAxKSB7XG4gICAgICBtZXRyaWNzLnNldChuYW1lLCAobWV0cmljcy5nZXQobmFtZSkgPz8gMCkgKyB2YWx1ZSlcbiAgICB9LFxuICAgIHNldChuYW1lOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIpIHtcbiAgICAgIG1ldHJpY3Muc2V0KG5hbWUsIHZhbHVlKVxuICAgIH0sXG4gICAgb2JzZXJ2ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIpIHtcbiAgICAgIGxldCBoID0gaGlzdG9ncmFtcy5nZXQobmFtZSlcbiAgICAgIGlmICghaCkge1xuICAgICAgICBoID0geyByZXNlcnZvaXI6IFtdLCBjb3VudDogMCwgc3VtOiAwLCBtaW46IHZhbHVlLCBtYXg6IHZhbHVlIH1cbiAgICAgICAgaGlzdG9ncmFtcy5zZXQobmFtZSwgaClcbiAgICAgIH1cbiAgICAgIGguY291bnQrK1xuICAgICAgaC5zdW0gKz0gdmFsdWVcbiAgICAgIGlmICh2YWx1ZSA8IGgubWluKSB7XG4gICAgICAgIGgubWluID0gdmFsdWVcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSA+IGgubWF4KSB7XG4gICAgICAgIGgubWF4ID0gdmFsdWVcbiAgICAgIH1cbiAgICAgIC8vIFJlc2Vydm9pciBzYW1wbGluZyAoQWxnb3JpdGhtIFIpXG4gICAgICBpZiAoaC5yZXNlcnZvaXIubGVuZ3RoIDwgUkVTRVJWT0lSX1NJWkUpIHtcbiAgICAgICAgaC5yZXNlcnZvaXIucHVzaCh2YWx1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGogPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBoLmNvdW50KVxuICAgICAgICBpZiAoaiA8IFJFU0VSVk9JUl9TSVpFKSB7XG4gICAgICAgICAgaC5yZXNlcnZvaXJbal0gPSB2YWx1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBhZGQobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgICBsZXQgcyA9IHNldHMuZ2V0KG5hbWUpXG4gICAgICBpZiAoIXMpIHtcbiAgICAgICAgcyA9IG5ldyBTZXQoKVxuICAgICAgICBzZXRzLnNldChuYW1lLCBzKVxuICAgICAgfVxuICAgICAgcy5hZGQodmFsdWUpXG4gICAgfSxcbiAgICBnZXRBbGwoKSB7XG4gICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSBPYmplY3QuZnJvbUVudHJpZXMobWV0cmljcylcblxuICAgICAgZm9yIChjb25zdCBbbmFtZSwgaF0gb2YgaGlzdG9ncmFtcykge1xuICAgICAgICBpZiAoaC5jb3VudCA9PT0gMCkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0W2Ake25hbWV9X2NvdW50YF0gPSBoLmNvdW50XG4gICAgICAgIHJlc3VsdFtgJHtuYW1lfV9taW5gXSA9IGgubWluXG4gICAgICAgIHJlc3VsdFtgJHtuYW1lfV9tYXhgXSA9IGgubWF4XG4gICAgICAgIHJlc3VsdFtgJHtuYW1lfV9hdmdgXSA9IGguc3VtIC8gaC5jb3VudFxuICAgICAgICBjb25zdCBzb3J0ZWQgPSBbLi4uaC5yZXNlcnZvaXJdLnNvcnQoKGEsIGIpID0+IGEgLSBiKVxuICAgICAgICByZXN1bHRbYCR7bmFtZX1fcDUwYF0gPSBwZXJjZW50aWxlKHNvcnRlZCwgNTApXG4gICAgICAgIHJlc3VsdFtgJHtuYW1lfV9wOTVgXSA9IHBlcmNlbnRpbGUoc29ydGVkLCA5NSlcbiAgICAgICAgcmVzdWx0W2Ake25hbWV9X3A5OWBdID0gcGVyY2VudGlsZShzb3J0ZWQsIDk5KVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBzXSBvZiBzZXRzKSB7XG4gICAgICAgIHJlc3VsdFtuYW1lXSA9IHMuc2l6ZVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfSxcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgU3RhdHNDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxTdGF0c1N0b3JlIHwgbnVsbD4obnVsbClcblxudHlwZSBQcm9wcyA9IHtcbiAgc3RvcmU/OiBTdGF0c1N0b3JlXG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFN0YXRzUHJvdmlkZXIoe1xuICBzdG9yZTogZXh0ZXJuYWxTdG9yZSxcbiAgY2hpbGRyZW4sXG59OiBQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IGludGVybmFsU3RvcmUgPSB1c2VNZW1vKCgpID0+IGNyZWF0ZVN0YXRzU3RvcmUoKSwgW10pXG4gIGNvbnN0IHN0b3JlID0gZXh0ZXJuYWxTdG9yZSA/PyBpbnRlcm5hbFN0b3JlXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBmbHVzaCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IG1ldHJpY3MgPSBzdG9yZS5nZXRBbGwoKVxuICAgICAgaWYgKE9iamVjdC5rZXlzKG1ldHJpY3MpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc2F2ZUN1cnJlbnRQcm9qZWN0Q29uZmlnKGN1cnJlbnQgPT4gKHtcbiAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgIGxhc3RTZXNzaW9uTWV0cmljczogbWV0cmljcyxcbiAgICAgICAgfSkpXG4gICAgICB9XG4gICAgfVxuICAgIHByb2Nlc3Mub24oJ2V4aXQnLCBmbHVzaClcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgcHJvY2Vzcy5vZmYoJ2V4aXQnLCBmbHVzaClcbiAgICB9XG4gIH0sIFtzdG9yZV0pXG5cbiAgcmV0dXJuIDxTdGF0c0NvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3N0b3JlfT57Y2hpbGRyZW59PC9TdGF0c0NvbnRleHQuUHJvdmlkZXI+XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VTdGF0cygpOiBTdGF0c1N0b3JlIHtcbiAgY29uc3Qgc3RvcmUgPSB1c2VDb250ZXh0KFN0YXRzQ29udGV4dClcbiAgaWYgKCFzdG9yZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndXNlU3RhdHMgbXVzdCBiZSB1c2VkIHdpdGhpbiBhIFN0YXRzUHJvdmlkZXInKVxuICB9XG4gIHJldHVybiBzdG9yZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlQ291bnRlcihuYW1lOiBzdHJpbmcpOiAodmFsdWU/OiBudW1iZXIpID0+IHZvaWQge1xuICBjb25zdCBzdG9yZSA9IHVzZVN0YXRzKClcbiAgcmV0dXJuIHVzZUNhbGxiYWNrKFxuICAgICh2YWx1ZT86IG51bWJlcikgPT4gc3RvcmUuaW5jcmVtZW50KG5hbWUsIHZhbHVlKSxcbiAgICBbc3RvcmUsIG5hbWVdLFxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VHYXVnZShuYW1lOiBzdHJpbmcpOiAodmFsdWU6IG51bWJlcikgPT4gdm9pZCB7XG4gIGNvbnN0IHN0b3JlID0gdXNlU3RhdHMoKVxuICByZXR1cm4gdXNlQ2FsbGJhY2soKHZhbHVlOiBudW1iZXIpID0+IHN0b3JlLnNldChuYW1lLCB2YWx1ZSksIFtzdG9yZSwgbmFtZV0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VUaW1lcihuYW1lOiBzdHJpbmcpOiAodmFsdWU6IG51bWJlcikgPT4gdm9pZCB7XG4gIGNvbnN0IHN0b3JlID0gdXNlU3RhdHMoKVxuICByZXR1cm4gdXNlQ2FsbGJhY2soXG4gICAgKHZhbHVlOiBudW1iZXIpID0+IHN0b3JlLm9ic2VydmUobmFtZSwgdmFsdWUpLFxuICAgIFtzdG9yZSwgbmFtZV0sXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVNldChuYW1lOiBzdHJpbmcpOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZCB7XG4gIGNvbnN0IHN0b3JlID0gdXNlU3RhdHMoKVxuICByZXR1cm4gdXNlQ2FsbGJhY2soKHZhbHVlOiBz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