| import { type FileSystem } from "../lib/fs.js"; | ||
| import { type Clock } from "../lib/clock.js"; | ||
| import { type ProcessEnv } from "../lib/process.js"; | ||
| export interface ForecastOptions { | ||
| json?: boolean; | ||
| agent?: string; | ||
| cwd?: string; | ||
| } | ||
| export interface ForecastDeps { | ||
| fs?: FileSystem; | ||
| clock?: Clock; | ||
| env?: ProcessEnv; | ||
| stdout?: (s: string) => void; | ||
| stderr?: (s: string) => void; | ||
| } | ||
| export interface ForecastExit { | ||
| readonly exitCode: 0 | 1; | ||
| } | ||
| export declare function runForecastCmd(opts?: ForecastOptions, deps?: ForecastDeps): Promise<ForecastExit>; | ||
| //# sourceMappingURL=forecast.d.ts.map |
| {"version":3,"file":"forecast.d.ts","sourceRoot":"","sources":["../../src/commands/forecast.ts"],"names":[],"mappings":"AAMA,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAa,KAAK,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AASpE,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,CAAC,EAAE,UAAU,CAAC;IAChB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;CAC1B;AAED,wBAAsB,cAAc,CAClC,IAAI,GAAE,eAAoB,EAC1B,IAAI,GAAE,YAAiB,GACtB,OAAO,CAAC,YAAY,CAAC,CAwCvB"} |
| /** | ||
| * `sipcode forecast` — projected month-end spend. | ||
| * Mirrors `today.ts` orchestration. | ||
| */ | ||
| import { ASSERT_NO_NETWORK } from "../lib/privacy.js"; | ||
| void ASSERT_NO_NETWORK; | ||
| import { RealFileSystem } from "../lib/fs.js"; | ||
| import { RealClock } from "../lib/clock.js"; | ||
| import { RealProcessEnv } from "../lib/process.js"; | ||
| import { getAgentById } from "../modules/agents/registry.js"; | ||
| import { loadPricingForDate } from "../lib/pricing/load.js"; | ||
| import { analyzeTokens } from "../modules/transcript/analyzers/tokens.js"; | ||
| import { runForecast } from "../modules/forecast/runForecast.js"; | ||
| import { formatForecastTerminal } from "../modules/forecast/format-terminal.js"; | ||
| import { formatForecastJson } from "../modules/forecast/format-json.js"; | ||
| export async function runForecastCmd(opts = {}, deps = {}) { | ||
| const fs = deps.fs ?? new RealFileSystem(); | ||
| const clock = deps.clock ?? new RealClock(); | ||
| const env = deps.env ?? new RealProcessEnv(); | ||
| const stdout = deps.stdout ?? ((s) => process.stdout.write(s + "\n")); | ||
| const stderr = deps.stderr ?? ((s) => process.stderr.write(s + "\n")); | ||
| const agent = getAgentById((opts.agent ?? "claude-code")); | ||
| const now = clock.now(); | ||
| const pricing = loadPricingForDate(now); | ||
| const discovery = await agent.discoverSessions({ fs, env, clock }); | ||
| if (!discovery.ok) { | ||
| stderr(discovery.error.map((e) => e.message).join("\n")); | ||
| return { exitCode: 1 }; | ||
| } | ||
| const sessions = []; | ||
| for (const meta of discovery.value) { | ||
| let content; | ||
| try { | ||
| content = await fs.readFile(meta.filePath); | ||
| } | ||
| catch { | ||
| continue; | ||
| } | ||
| const parseResult = agent.parseTranscript(content); | ||
| if (!parseResult.ok) | ||
| continue; | ||
| const parsed = parseResult.value; | ||
| const startedAt = parsed.startedAt ?? new Date(meta.mtimeMs).toISOString(); | ||
| const tokens = analyzeTokens(parsed, pricing); | ||
| sessions.push({ startedAt, estCostUSD: tokens.estCostUSD }); | ||
| } | ||
| const report = runForecast({ sessions, now }); | ||
| if (opts.json) { | ||
| stdout(formatForecastJson(report)); | ||
| } | ||
| else { | ||
| stdout(formatForecastTerminal(report)); | ||
| } | ||
| return { exitCode: 0 }; | ||
| } | ||
| //# sourceMappingURL=forecast.js.map |
| {"version":3,"file":"forecast.js","sourceRoot":"","sources":["../../src/commands/forecast.ts"],"names":[],"mappings":"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"} |
| import { type FileSystem } from "../lib/fs.js"; | ||
| import { type Clock } from "../lib/clock.js"; | ||
| import { type ProcessEnv } from "../lib/process.js"; | ||
| export interface TodayOptions { | ||
| json?: boolean; | ||
| agent?: string; | ||
| cwd?: string; | ||
| } | ||
| export interface TodayDeps { | ||
| fs?: FileSystem; | ||
| clock?: Clock; | ||
| env?: ProcessEnv; | ||
| stdout?: (s: string) => void; | ||
| stderr?: (s: string) => void; | ||
| } | ||
| export interface TodayExit { | ||
| readonly exitCode: 0 | 1; | ||
| } | ||
| export declare function runTodayCmd(opts?: TodayOptions, deps?: TodayDeps): Promise<TodayExit>; | ||
| //# sourceMappingURL=today.d.ts.map |
| {"version":3,"file":"today.d.ts","sourceRoot":"","sources":["../../src/commands/today.ts"],"names":[],"mappings":"AAQA,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAa,KAAK,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAUpE,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,CAAC,EAAE,UAAU,CAAC;IAChB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;CAC1B;AAED,wBAAsB,WAAW,CAC/B,IAAI,GAAE,YAAiB,EACvB,IAAI,GAAE,SAAc,GACnB,OAAO,CAAC,SAAS,CAAC,CAgEpB"} |
| /** | ||
| * `sipcode today` — daily dashboard. | ||
| * | ||
| * Thin orchestrator: discover sessions → parse → analyze → aggregate → runToday. | ||
| * Mirrors the pattern in `stats.ts` and `trend.ts`. | ||
| */ | ||
| import { ASSERT_NO_NETWORK } from "../lib/privacy.js"; | ||
| void ASSERT_NO_NETWORK; | ||
| import { RealFileSystem } from "../lib/fs.js"; | ||
| import { RealClock } from "../lib/clock.js"; | ||
| import { RealProcessEnv } from "../lib/process.js"; | ||
| import { getAgentById } from "../modules/agents/registry.js"; | ||
| import { loadPricingForDate } from "../lib/pricing/load.js"; | ||
| import { analyzeTokens } from "../modules/transcript/analyzers/tokens.js"; | ||
| import { analyzeDuplicateReads } from "../modules/transcript/analyzers/duplicateReads.js"; | ||
| import { runToday } from "../modules/today/runToday.js"; | ||
| import { formatTodayTerminal } from "../modules/today/format-terminal.js"; | ||
| import { formatTodayJson } from "../modules/today/format-json.js"; | ||
| export async function runTodayCmd(opts = {}, deps = {}) { | ||
| const fs = deps.fs ?? new RealFileSystem(); | ||
| const clock = deps.clock ?? new RealClock(); | ||
| const env = deps.env ?? new RealProcessEnv(); | ||
| const stdout = deps.stdout ?? ((s) => process.stdout.write(s + "\n")); | ||
| const stderr = deps.stderr ?? ((s) => process.stderr.write(s + "\n")); | ||
| const agent = getAgentById((opts.agent ?? "claude-code")); | ||
| const now = clock.now(); | ||
| const pricing = loadPricingForDate(now); | ||
| const discovery = await agent.discoverSessions({ fs, env, clock }); | ||
| if (!discovery.ok) { | ||
| stderr(discovery.error.map((e) => e.message).join("\n")); | ||
| return { exitCode: 1 }; | ||
| } | ||
| const sessions = []; | ||
| for (const meta of discovery.value) { | ||
| let content; | ||
| try { | ||
| content = await fs.readFile(meta.filePath); | ||
| } | ||
| catch { | ||
| continue; | ||
| } | ||
| const parseResult = agent.parseTranscript(content); | ||
| if (!parseResult.ok) | ||
| continue; | ||
| const parsed = parseResult.value; | ||
| const startedAt = parsed.startedAt ?? new Date(meta.mtimeMs).toISOString(); | ||
| const tokens = analyzeTokens(parsed, pricing); | ||
| const dups = analyzeDuplicateReads(parsed); | ||
| const totalTokens = tokens.inputTokens + | ||
| tokens.outputTokens + | ||
| tokens.cacheReadTokens + | ||
| tokens.cacheCreationTokens; | ||
| const top = dups.topOffenders[0]; | ||
| const session = { | ||
| sessionId: meta.sessionId, | ||
| startedAt, | ||
| totalTokens, | ||
| outputTokens: tokens.outputTokens, | ||
| estCostUSD: tokens.estCostUSD, | ||
| duplicateReadTokenCost: dups.duplicateReadTokenCost, | ||
| topDuplicateReadFile: top | ||
| ? { | ||
| path: top.filePath, | ||
| count: top.readCount, | ||
| // Convert tokens to USD using session's average $/token (rough but fine for a "top leak" headline). | ||
| costUSD: totalTokens > 0 ? (top.duplicateTokenCost / totalTokens) * tokens.estCostUSD : 0, | ||
| } | ||
| : undefined, | ||
| }; | ||
| sessions.push(session); | ||
| } | ||
| const report = runToday({ sessions, now }); | ||
| if (opts.json) { | ||
| stdout(formatTodayJson(report)); | ||
| } | ||
| else { | ||
| stdout(formatTodayTerminal(report)); | ||
| } | ||
| return { exitCode: 0 }; | ||
| } | ||
| //# sourceMappingURL=today.js.map |
| {"version":3,"file":"today.js","sourceRoot":"","sources":["../../src/commands/today.ts"],"names":[],"mappings":"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"} |
| import { type FileSystem } from "../lib/fs.js"; | ||
| import { type Clock } from "../lib/clock.js"; | ||
| import { type ProcessEnv } from "../lib/process.js"; | ||
| export interface TrendOptions { | ||
| metric?: string; | ||
| since?: string; | ||
| json?: boolean; | ||
| agent?: string; | ||
| cwd?: string; | ||
| } | ||
| export interface TrendDeps { | ||
| fs?: FileSystem; | ||
| clock?: Clock; | ||
| env?: ProcessEnv; | ||
| stdout?: (s: string) => void; | ||
| stderr?: (s: string) => void; | ||
| } | ||
| export interface TrendResultExit { | ||
| readonly exitCode: 0 | 1; | ||
| } | ||
| export declare function runTrend(opts?: TrendOptions, deps?: TrendDeps): Promise<TrendResultExit>; | ||
| /** Parse "30d" / "4w" / "3m" into a day count. Returns null on invalid input. */ | ||
| export declare function parseSinceWindow(s: string): number | null; | ||
| //# sourceMappingURL=trend.d.ts.map |
| {"version":3,"file":"trend.d.ts","sourceRoot":"","sources":["../../src/commands/trend.ts"],"names":[],"mappings":"AAYA,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAa,KAAK,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAepE,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,CAAC,EAAE,UAAU,CAAC;IAChB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;CAC1B;AAQD,wBAAsB,QAAQ,CAC5B,IAAI,GAAE,YAAiB,EACvB,IAAI,GAAE,SAAc,GACnB,OAAO,CAAC,eAAe,CAAC,CAkF1B;AAED,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAezD"} |
| /** | ||
| * `sipcode trend` — single-metric time-series across a window. | ||
| * | ||
| * Thin orchestrator: enumerate transcripts → parse → analyze → bucket per day | ||
| * via the pure compute module → render. | ||
| * | ||
| * Uses the same transcript discovery + parse path as `sipcode stats`. Where | ||
| * stats shows totals (cost, savings, top-N tasks), trend shows ONE metric | ||
| * over time — the question is "is this getting better?", not "how much?". | ||
| */ | ||
| import { ASSERT_NO_NETWORK } from "../lib/privacy.js"; | ||
| void ASSERT_NO_NETWORK; | ||
| import { RealFileSystem } from "../lib/fs.js"; | ||
| import { RealClock } from "../lib/clock.js"; | ||
| import { RealProcessEnv } from "../lib/process.js"; | ||
| import { getAgentById } from "../modules/agents/registry.js"; | ||
| import { loadPricingForDate } from "../lib/pricing/load.js"; | ||
| import { analyzeTokens } from "../modules/transcript/analyzers/tokens.js"; | ||
| import { analyzeDuplicateReads } from "../modules/transcript/analyzers/duplicateReads.js"; | ||
| import { computeTrend, } from "../modules/trend/compute.js"; | ||
| import { formatTrendTerminal } from "../modules/trend/format-terminal.js"; | ||
| import { formatTrendJson } from "../modules/trend/format-json.js"; | ||
| import path from "node:path"; | ||
| const VALID_METRICS = new Set([ | ||
| "output-ratio", | ||
| "cost-per-session", | ||
| "recoverable-tokens-per-session", | ||
| ]); | ||
| export async function runTrend(opts = {}, deps = {}) { | ||
| const fs = deps.fs ?? new RealFileSystem(); | ||
| const clock = deps.clock ?? new RealClock(); | ||
| const env = deps.env ?? new RealProcessEnv(); | ||
| const stdout = deps.stdout ?? ((s) => process.stdout.write(s + "\n")); | ||
| const stderr = deps.stderr ?? ((s) => process.stderr.write(s + "\n")); | ||
| const metric = (opts.metric ?? "output-ratio"); | ||
| if (!VALID_METRICS.has(metric)) { | ||
| stderr(`unknown metric '${metric}'. valid: output-ratio, cost-per-session, recoverable-tokens-per-session.`); | ||
| return { exitCode: 1 }; | ||
| } | ||
| const sinceDays = parseSinceWindow(opts.since ?? "30d"); | ||
| if (sinceDays === null) { | ||
| stderr(`unrecognized --since '${opts.since}'. use NNd / NNw / NNm (e.g. 30d, 4w, 3m).`); | ||
| return { exitCode: 1 }; | ||
| } | ||
| const until = clock.now(); | ||
| const since = new Date(until.getTime() - sinceDays * 86_400_000); | ||
| const sinceIso = since.toISOString().slice(0, 10); | ||
| const untilIso = until.toISOString().slice(0, 10); | ||
| const agent = getAgentById((opts.agent ?? "claude-code")); | ||
| // Pricing — keyed off the window upper bound. | ||
| const pricing = loadPricingForDate(until); | ||
| // Discover transcripts via the agent layer (mirrors stats). | ||
| const metasResult = await agent.discoverSessions({ fs, env, clock }); | ||
| if (!metasResult.ok) { | ||
| stderr(metasResult.error.map((e) => e.message).join("\n")); | ||
| return { exitCode: 1 }; | ||
| } | ||
| const metas = metasResult.value; | ||
| // Pre-filter by mtime then parse and aggregate. | ||
| const sessions = []; | ||
| for (const meta of metas) { | ||
| const mtimeIso = new Date(meta.mtimeMs).toISOString().slice(0, 10); | ||
| if (mtimeIso < sinceIso) | ||
| continue; | ||
| let content; | ||
| try { | ||
| content = await fs.readFile(meta.filePath); | ||
| } | ||
| catch { | ||
| continue; | ||
| } | ||
| const parseResult = agent.parseTranscript(content); | ||
| if (!parseResult.ok) | ||
| continue; | ||
| const parsed = parseResult.value; | ||
| const startedAt = parsed.startedAt ?? new Date(meta.mtimeMs).toISOString(); | ||
| const startedDay = startedAt.slice(0, 10); | ||
| if (startedDay < sinceIso || startedDay > untilIso) | ||
| continue; | ||
| const totals = analyzeTokens(parsed, pricing); | ||
| const dups = analyzeDuplicateReads(parsed); | ||
| const totalTokens = totals.inputTokens + | ||
| totals.outputTokens + | ||
| totals.cacheReadTokens + | ||
| totals.cacheCreationTokens; | ||
| sessions.push({ | ||
| startedAt, | ||
| totalTokens, | ||
| outputTokens: totals.outputTokens, | ||
| estCostUSD: totals.estCostUSD, | ||
| duplicateReadTokens: dups.duplicateReadTokenCost, | ||
| }); | ||
| } | ||
| const result = computeTrend(sessions, metric, sinceIso, untilIso); | ||
| if (opts.json) { | ||
| stdout(formatTrendJson(result)); | ||
| } | ||
| else { | ||
| stdout(formatTrendTerminal(result)); | ||
| } | ||
| return { exitCode: 0 }; | ||
| } | ||
| /** Parse "30d" / "4w" / "3m" into a day count. Returns null on invalid input. */ | ||
| export function parseSinceWindow(s) { | ||
| const m = s.trim().toLowerCase().match(/^(\d+)([dwm])$/); | ||
| if (!m) | ||
| return null; | ||
| const n = Number(m[1]); | ||
| if (!Number.isFinite(n) || n <= 0) | ||
| return null; | ||
| switch (m[2]) { | ||
| case "d": | ||
| return n; | ||
| case "w": | ||
| return n * 7; | ||
| case "m": | ||
| return n * 30; | ||
| default: | ||
| return null; | ||
| } | ||
| } | ||
| // Used so unused imports don't warn during the path-only build copy step. | ||
| void path; | ||
| //# sourceMappingURL=trend.js.map |
| {"version":3,"file":"trend.js","sourceRoot":"","sources":["../../src/commands/trend.ts"],"names":[],"mappings":"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"} |
| /** | ||
| * Adaptive baseline window resolver — shared by `today` and `forecast`. | ||
| * | ||
| * Strategy: cascade 30→14→7→3 days. Each tier requires at least that many | ||
| * days of available history (where "available" = (now - earliestSession) ≥ | ||
| * tier). If none of the tiers match, return "insufficient". | ||
| * | ||
| * Pure — takes a list of session-start ISO timestamps + `now`, returns the | ||
| * resolved window. No I/O. | ||
| */ | ||
| export interface BaselineWindow { | ||
| readonly windowDays: number; | ||
| readonly isPartial: boolean; | ||
| /** Human-readable, e.g. "last 30 days" or "last 12 days (all you have so far)". */ | ||
| readonly label: string; | ||
| /** ISO date (YYYY-MM-DD) at the start of the window, inclusive. */ | ||
| readonly sliceStartIso: string; | ||
| } | ||
| export type BaselineResolution = { | ||
| kind: "ok"; | ||
| window: BaselineWindow; | ||
| } | { | ||
| kind: "insufficient"; | ||
| daysAvailable: number; | ||
| }; | ||
| /** Minimum days of history to consider ANY baseline. */ | ||
| export declare const MIN_DAYS_FOR_BASELINE = 3; | ||
| /** | ||
| * Resolve the best baseline window for the given session history. | ||
| * | ||
| * @param sessionStarts ISO timestamps of session start. Order doesn't matter. | ||
| * @param now wall-clock used to compute "how many days of history." | ||
| */ | ||
| export declare function resolveBaseline(sessionStarts: ReadonlyArray<string>, now: Date): BaselineResolution; | ||
| //# sourceMappingURL=baseline-window.d.ts.map |
| {"version":3,"file":"baseline-window.d.ts","sourceRoot":"","sources":["../../src/lib/baseline-window.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,mFAAmF;IACnF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,mEAAmE;IACnE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,MAAM,kBAAkB,GAC1B;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,cAAc,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC;AAIpD,wDAAwD;AACxD,eAAO,MAAM,qBAAqB,IAAI,CAAC;AAEvC;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,EACpC,GAAG,EAAE,IAAI,GACR,kBAAkB,CA8BpB"} |
| /** | ||
| * Adaptive baseline window resolver — shared by `today` and `forecast`. | ||
| * | ||
| * Strategy: cascade 30→14→7→3 days. Each tier requires at least that many | ||
| * days of available history (where "available" = (now - earliestSession) ≥ | ||
| * tier). If none of the tiers match, return "insufficient". | ||
| * | ||
| * Pure — takes a list of session-start ISO timestamps + `now`, returns the | ||
| * resolved window. No I/O. | ||
| */ | ||
| const TIERS = [30, 14, 7, 3]; | ||
| /** Minimum days of history to consider ANY baseline. */ | ||
| export const MIN_DAYS_FOR_BASELINE = 3; | ||
| /** | ||
| * Resolve the best baseline window for the given session history. | ||
| * | ||
| * @param sessionStarts ISO timestamps of session start. Order doesn't matter. | ||
| * @param now wall-clock used to compute "how many days of history." | ||
| */ | ||
| export function resolveBaseline(sessionStarts, now) { | ||
| if (sessionStarts.length === 0) | ||
| return { kind: "insufficient", daysAvailable: 0 }; | ||
| let earliestMs = Infinity; | ||
| for (const iso of sessionStarts) { | ||
| const t = Date.parse(iso); | ||
| if (Number.isFinite(t) && t < earliestMs) | ||
| earliestMs = t; | ||
| } | ||
| if (!Number.isFinite(earliestMs)) { | ||
| return { kind: "insufficient", daysAvailable: 0 }; | ||
| } | ||
| const daysAvailable = Math.floor((now.getTime() - earliestMs) / 86_400_000); | ||
| if (daysAvailable < MIN_DAYS_FOR_BASELINE) { | ||
| return { kind: "insufficient", daysAvailable }; | ||
| } | ||
| for (const tier of TIERS) { | ||
| if (daysAvailable >= tier) { | ||
| const isPartial = tier < 30 && daysAvailable < 30; | ||
| const label = isPartial | ||
| ? `last ${tier} days (all you have so far)` | ||
| : `last ${tier} days`; | ||
| const sliceStartIso = toIsoDay(now.getTime() - tier * 86_400_000); | ||
| return { | ||
| kind: "ok", | ||
| window: { windowDays: tier, isPartial, label, sliceStartIso }, | ||
| }; | ||
| } | ||
| } | ||
| return { kind: "insufficient", daysAvailable }; | ||
| } | ||
| function toIsoDay(ms) { | ||
| return new Date(ms).toISOString().slice(0, 10); | ||
| } | ||
| //# sourceMappingURL=baseline-window.js.map |
| {"version":3,"file":"baseline-window.js","sourceRoot":"","sources":["../../src/lib/baseline-window.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAeH,MAAM,KAAK,GAAsB,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAEhD,wDAAwD;AACxD,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAEvC;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC7B,aAAoC,EACpC,GAAS;IAET,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC;IAElF,IAAI,UAAU,GAAG,QAAQ,CAAC;IAC1B,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,UAAU;YAAE,UAAU,GAAG,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACjC,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC;IACpD,CAAC;IACD,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,GAAG,UAAU,CAAC,CAAC;IAC5E,IAAI,aAAa,GAAG,qBAAqB,EAAE,CAAC;QAC1C,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC;IACjD,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,aAAa,IAAI,IAAI,EAAE,CAAC;YAC1B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAE,IAAI,aAAa,GAAG,EAAE,CAAC;YAClD,MAAM,KAAK,GAAG,SAAS;gBACrB,CAAC,CAAC,QAAQ,IAAI,6BAA6B;gBAC3C,CAAC,CAAC,QAAQ,IAAI,OAAO,CAAC;YACxB,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,GAAG,UAAU,CAAC,CAAC;YAClE,OAAO;gBACL,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE;aAC9D,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC;AACjD,CAAC;AAED,SAAS,QAAQ,CAAC,EAAU;IAC1B,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACjD,CAAC"} |
| { | ||
| "as_of": "2026-06-11", | ||
| "source_url": "https://www.anthropic.com/pricing", | ||
| "models": { | ||
| "claude-opus-4": { | ||
| "input_per_mtok": 15.00, | ||
| "output_per_mtok": 75.00, | ||
| "cache_read_per_mtok": 1.50, | ||
| "cache_creation_per_mtok": 18.75 | ||
| }, | ||
| "claude-opus-4-6": { | ||
| "input_per_mtok": 15.00, | ||
| "output_per_mtok": 75.00, | ||
| "cache_read_per_mtok": 1.50, | ||
| "cache_creation_per_mtok": 18.75 | ||
| }, | ||
| "claude-opus-4-7": { | ||
| "input_per_mtok": 15.00, | ||
| "output_per_mtok": 75.00, | ||
| "cache_read_per_mtok": 1.50, | ||
| "cache_creation_per_mtok": 18.75 | ||
| }, | ||
| "claude-opus-4-8": { | ||
| "input_per_mtok": 15.00, | ||
| "output_per_mtok": 75.00, | ||
| "cache_read_per_mtok": 1.50, | ||
| "cache_creation_per_mtok": 18.75 | ||
| }, | ||
| "claude-sonnet-4": { | ||
| "input_per_mtok": 3.00, | ||
| "output_per_mtok": 15.00, | ||
| "cache_read_per_mtok": 0.30, | ||
| "cache_creation_per_mtok": 3.75 | ||
| }, | ||
| "claude-sonnet-4-6": { | ||
| "input_per_mtok": 3.00, | ||
| "output_per_mtok": 15.00, | ||
| "cache_read_per_mtok": 0.30, | ||
| "cache_creation_per_mtok": 3.75 | ||
| }, | ||
| "claude-haiku-4": { | ||
| "input_per_mtok": 0.80, | ||
| "output_per_mtok": 4.00, | ||
| "cache_read_per_mtok": 0.08, | ||
| "cache_creation_per_mtok": 1.00 | ||
| }, | ||
| "claude-haiku-4-5": { | ||
| "input_per_mtok": 0.80, | ||
| "output_per_mtok": 4.00, | ||
| "cache_read_per_mtok": 0.08, | ||
| "cache_creation_per_mtok": 1.00 | ||
| } | ||
| } | ||
| } |
| /** | ||
| * JSON renderer for `sipcode forecast --json` / `forecast_monthly_spend` MCP tool. | ||
| */ | ||
| import type { ForecastReport } from "./types.js"; | ||
| export declare function formatForecastJson(report: ForecastReport): string; | ||
| //# sourceMappingURL=format-json.d.ts.map |
| {"version":3,"file":"format-json.d.ts","sourceRoot":"","sources":["../../../src/modules/forecast/format-json.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAEjE"} |
| export function formatForecastJson(report) { | ||
| return JSON.stringify(report, null, 2); | ||
| } | ||
| //# sourceMappingURL=format-json.js.map |
| {"version":3,"file":"format-json.js","sourceRoot":"","sources":["../../../src/modules/forecast/format-json.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,kBAAkB,CAAC,MAAsB;IACvD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC"} |
| /** | ||
| * Terminal renderer for `sipcode forecast`. Pure. | ||
| */ | ||
| import type { ForecastReport } from "./types.js"; | ||
| export declare function formatForecastTerminal(report: ForecastReport): string; | ||
| //# sourceMappingURL=format-terminal.d.ts.map |
| {"version":3,"file":"format-terminal.d.ts","sourceRoot":"","sources":["../../../src/modules/forecast/format-terminal.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAsCrE"} |
| export function formatForecastTerminal(report) { | ||
| const lines = []; | ||
| const monthLabel = report.monthEnd?.monthLabel ?? "this month"; | ||
| const daysRemainingNote = report.monthEnd | ||
| ? ` (${report.monthEnd.daysRemaining} day${report.monthEnd.daysRemaining === 1 ? "" : "s"} remaining)` | ||
| : ""; | ||
| lines.push(`sipcode forecast · projection to end of ${monthLabel}${daysRemainingNote}`); | ||
| lines.push(""); | ||
| if (report.status !== "ok" || report.trajectoryInput === null || report.monthEnd === null) { | ||
| lines.push(" " + report.headline); | ||
| return lines.join("\n"); | ||
| } | ||
| const t = report.trajectoryInput; | ||
| const me = report.monthEnd; | ||
| const partial = t.isPartial ? ` (partial — all you have so far)` : ""; | ||
| lines.push(` current pace (last ${t.windowDays} days${partial})`); | ||
| lines.push(` avg daily spend $${t.avgDailySpendUSD.toFixed(2)} across ${t.sessionsSampled} sessions`); | ||
| lines.push(` median daily spend $${t.medianDailySpendUSD.toFixed(2)}`); | ||
| lines.push(""); | ||
| lines.push(` projected month-end`); | ||
| lines.push(` spend $${me.projectedSpendUSD.toFixed(2)} (range: $${me.confidenceLowUSD.toFixed(0)} – $${me.confidenceHighUSD.toFixed(0)})`); | ||
| if (report.comparison !== null && | ||
| report.comparison.lastMonthSpendUSD !== null && | ||
| report.comparison.vsLastMonthPct !== null) { | ||
| const dir = report.comparison.vsLastMonthPct < 0 ? "less" : "more"; | ||
| lines.push(` vs last month ${Math.abs(report.comparison.vsLastMonthPct).toFixed(1)}% ${dir} than ${dropPrev(me.monthLabel)} ($${report.comparison.lastMonthSpendUSD.toFixed(2)})`); | ||
| } | ||
| lines.push(""); | ||
| lines.push(" " + report.headline); | ||
| return lines.join("\n"); | ||
| } | ||
| function dropPrev(monthLabel) { | ||
| return "previous month"; | ||
| } | ||
| //# sourceMappingURL=format-terminal.js.map |
| {"version":3,"file":"format-terminal.js","sourceRoot":"","sources":["../../../src/modules/forecast/format-terminal.ts"],"names":[],"mappings":"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"} |
| /** | ||
| * Pure runner for `sipcode forecast` / `forecast_monthly_spend` MCP tool. | ||
| * | ||
| * Logic: | ||
| * - trajectory window = adaptive 14d → 7d (forecast NEEDS ≥7 days to be useful). | ||
| * - projected spend = avgDailySpend × daysRemainingInMonth + spendSoFarThisMonth. | ||
| * - confidence band = ±min(stdev(dailySpend) × daysRemaining, 0.20 × projected). | ||
| * - vs last month comparison if ≥1 session in previous calendar month. | ||
| * | ||
| * All five ForecastStatus branches handled with structured output. Never throws. | ||
| */ | ||
| import type { ForecastReport } from "./types.js"; | ||
| /** Same session shape as today's runner. */ | ||
| export interface ForecastSession { | ||
| readonly startedAt: string; | ||
| readonly estCostUSD: number; | ||
| } | ||
| export interface RunForecastInput { | ||
| readonly sessions: ReadonlyArray<ForecastSession>; | ||
| readonly now: Date; | ||
| } | ||
| export declare function runForecast(input: RunForecastInput): ForecastReport; | ||
| //# sourceMappingURL=runForecast.d.ts.map |
| {"version":3,"file":"runForecast.d.ts","sourceRoot":"","sources":["../../../src/modules/forecast/runForecast.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EACV,cAAc,EAKf,MAAM,YAAY,CAAC;AAEpB,4CAA4C;AAC5C,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;IAClD,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;CACpB;AAID,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,cAAc,CAgGnE"} |
| const FORECAST_MIN_DAYS_HISTORY = 7; | ||
| export function runForecast(input) { | ||
| const { sessions, now } = input; | ||
| if (sessions.length === 0) { | ||
| return empty("no-data", "No Claude Code sessions found yet. Run `claude` in any project to start."); | ||
| } | ||
| const daysRemaining = daysRemainingInMonth(now); | ||
| if (daysRemaining <= 1) { | ||
| const monthLabel = monthLabelFor(now); | ||
| return empty("near-month-end", `${monthLabel} ${daysRemaining <= 0 ? "ended" : "ends tomorrow"}. Forecast not meaningful at this point.`); | ||
| } | ||
| // Recent activity check: any session in the last 14 days. | ||
| const lookbackMs = now.getTime() - 14 * 86_400_000; | ||
| const hasRecent = sessions.some((s) => Date.parse(s.startedAt) >= lookbackMs); | ||
| if (!hasRecent) { | ||
| return empty("no-recent-activity", "No sessions in your last 14 days — can't forecast a trajectory."); | ||
| } | ||
| // Adaptive trajectory window: 14 → 7, requires enough history. | ||
| const earliestMs = Math.min(...sessions.map((s) => Date.parse(s.startedAt)).filter(Number.isFinite)); | ||
| const daysAvailable = Math.floor((now.getTime() - earliestMs) / 86_400_000); | ||
| if (daysAvailable < FORECAST_MIN_DAYS_HISTORY) { | ||
| return empty("insufficient-data", `Forecast needs at least 7 days of session history. Currently have ${daysAvailable}.`); | ||
| } | ||
| const windowDays = daysAvailable >= 14 ? 14 : 7; | ||
| const isPartial = daysAvailable < 14; | ||
| const trajectoryStartMs = now.getTime() - windowDays * 86_400_000; | ||
| const sampled = sessions.filter((s) => Date.parse(s.startedAt) >= trajectoryStartMs); | ||
| const dailySpend = bucketDailySpend(sampled, windowDays, now); | ||
| const avgDailySpendUSD = mean(dailySpend); | ||
| const medianDailySpendUSD = median(dailySpend); | ||
| const sigma = stdev(dailySpend); | ||
| const monthStart = startOfMonth(now); | ||
| const spendSoFarUSD = sessions | ||
| .filter((s) => Date.parse(s.startedAt) >= monthStart.getTime()) | ||
| .reduce((sum, s) => sum + s.estCostUSD, 0); | ||
| const projectedExtra = avgDailySpendUSD * daysRemaining; | ||
| const projectedSpendUSD = spendSoFarUSD + projectedExtra; | ||
| const bandRaw = sigma * daysRemaining; | ||
| const bandCap = Math.max(0, 0.2 * projectedSpendUSD); | ||
| const band = Math.max(0, Math.min(bandRaw, bandCap)); | ||
| const confidenceLowUSD = Math.max(0, projectedSpendUSD - band); | ||
| const confidenceHighUSD = projectedSpendUSD + band; | ||
| const trajectoryInput = { | ||
| windowDays, | ||
| isPartial, | ||
| sessionsSampled: sampled.length, | ||
| avgDailySpendUSD, | ||
| medianDailySpendUSD, | ||
| }; | ||
| const monthEnd = { | ||
| monthLabel: monthLabelFor(now), | ||
| daysRemaining, | ||
| projectedSpendUSD, | ||
| confidenceLowUSD, | ||
| confidenceHighUSD, | ||
| spendSoFarUSD, | ||
| }; | ||
| const comparison = buildLastMonthComparison(sessions, now, projectedSpendUSD); | ||
| const headline = buildHeadline(trajectoryInput, monthEnd, comparison); | ||
| return { | ||
| schemaVersion: "sipcode-forecast/1", | ||
| status: "ok", | ||
| trajectoryInput, | ||
| monthEnd, | ||
| comparison, | ||
| headline, | ||
| }; | ||
| } | ||
| function empty(status, headline) { | ||
| return { | ||
| schemaVersion: "sipcode-forecast/1", | ||
| status, | ||
| trajectoryInput: null, | ||
| monthEnd: null, | ||
| comparison: null, | ||
| headline, | ||
| }; | ||
| } | ||
| function daysRemainingInMonth(now) { | ||
| const lastDay = new Date(now.getFullYear(), now.getMonth() + 1, 0).getDate(); | ||
| return lastDay - now.getDate(); | ||
| } | ||
| function monthLabelFor(now) { | ||
| const months = [ | ||
| "January", | ||
| "February", | ||
| "March", | ||
| "April", | ||
| "May", | ||
| "June", | ||
| "July", | ||
| "August", | ||
| "September", | ||
| "October", | ||
| "November", | ||
| "December", | ||
| ]; | ||
| return `${months[now.getMonth()]} ${now.getFullYear()}`; | ||
| } | ||
| function startOfMonth(d) { | ||
| return new Date(d.getFullYear(), d.getMonth(), 1); | ||
| } | ||
| function bucketDailySpend(sessions, windowDays, now) { | ||
| const buckets = new Array(windowDays).fill(0); | ||
| const baseMs = now.getTime() - windowDays * 86_400_000; | ||
| for (const s of sessions) { | ||
| const t = Date.parse(s.startedAt); | ||
| if (!Number.isFinite(t) || t < baseMs) | ||
| continue; | ||
| const idx = Math.min(windowDays - 1, Math.max(0, Math.floor((t - baseMs) / 86_400_000))); | ||
| buckets[idx] = (buckets[idx] ?? 0) + s.estCostUSD; | ||
| } | ||
| return buckets; | ||
| } | ||
| function mean(xs) { | ||
| if (xs.length === 0) | ||
| return 0; | ||
| let s = 0; | ||
| for (const x of xs) | ||
| s += x; | ||
| return s / xs.length; | ||
| } | ||
| function median(xs) { | ||
| if (xs.length === 0) | ||
| return 0; | ||
| const s = [...xs].sort((a, b) => a - b); | ||
| const mid = Math.floor(s.length / 2); | ||
| return s.length % 2 === 0 ? ((s[mid - 1] ?? 0) + (s[mid] ?? 0)) / 2 : (s[mid] ?? 0); | ||
| } | ||
| function stdev(xs) { | ||
| if (xs.length < 2) | ||
| return 0; | ||
| const m = mean(xs); | ||
| let sq = 0; | ||
| for (const x of xs) | ||
| sq += (x - m) * (x - m); | ||
| return Math.sqrt(sq / (xs.length - 1)); | ||
| } | ||
| function buildLastMonthComparison(sessions, now, projectedSpendUSD) { | ||
| const lastMonthStart = new Date(now.getFullYear(), now.getMonth() - 1, 1); | ||
| const thisMonthStart = new Date(now.getFullYear(), now.getMonth(), 1); | ||
| let lastMonthSpend = 0; | ||
| let any = false; | ||
| for (const s of sessions) { | ||
| const t = Date.parse(s.startedAt); | ||
| if (t >= lastMonthStart.getTime() && t < thisMonthStart.getTime()) { | ||
| lastMonthSpend += s.estCostUSD; | ||
| any = true; | ||
| } | ||
| } | ||
| if (!any) { | ||
| return { lastMonthSpendUSD: null, vsLastMonthPct: null }; | ||
| } | ||
| const pct = lastMonthSpend > 0 | ||
| ? ((projectedSpendUSD - lastMonthSpend) / lastMonthSpend) * 100 | ||
| : 0; | ||
| return { lastMonthSpendUSD: lastMonthSpend, vsLastMonthPct: pct }; | ||
| } | ||
| function buildHeadline(trajectory, monthEnd, comparison) { | ||
| const parts = []; | ||
| parts.push(`At your current pace ($${trajectory.avgDailySpendUSD.toFixed(2)}/day across ${trajectory.windowDays} days of recent sessions), you're on track to spend about $${Math.round(monthEnd.projectedSpendUSD)} by month-end.`); | ||
| if (comparison.lastMonthSpendUSD !== null && comparison.vsLastMonthPct !== null) { | ||
| const dir = comparison.vsLastMonthPct < 0 ? "less than" : "more than"; | ||
| parts.push(`${Math.abs(comparison.vsLastMonthPct).toFixed(1)}% ${dir} last month ($${comparison.lastMonthSpendUSD.toFixed(2)}).`); | ||
| } | ||
| parts.push(`Confidence range: $${monthEnd.confidenceLowUSD.toFixed(0)}–$${monthEnd.confidenceHighUSD.toFixed(0)}.`); | ||
| return parts.join(" "); | ||
| } | ||
| //# sourceMappingURL=runForecast.js.map |
| {"version":3,"file":"runForecast.js","sourceRoot":"","sources":["../../../src/modules/forecast/runForecast.ts"],"names":[],"mappings":"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"} |
| /** | ||
| * `forecast_monthly_spend` / `sipcode forecast` — public types. | ||
| * | ||
| * Schema pinned at `sipcode-forecast/1`. | ||
| */ | ||
| export type ForecastStatus = "ok" | "insufficient-data" | "near-month-end" | "no-recent-activity" | "no-data"; | ||
| export interface ForecastTrajectoryInput { | ||
| readonly windowDays: number; | ||
| readonly isPartial: boolean; | ||
| readonly sessionsSampled: number; | ||
| readonly avgDailySpendUSD: number; | ||
| readonly medianDailySpendUSD: number; | ||
| } | ||
| export interface ForecastMonthEnd { | ||
| readonly monthLabel: string; | ||
| readonly daysRemaining: number; | ||
| readonly projectedSpendUSD: number; | ||
| readonly confidenceLowUSD: number; | ||
| readonly confidenceHighUSD: number; | ||
| readonly spendSoFarUSD: number; | ||
| } | ||
| export interface ForecastComparison { | ||
| readonly lastMonthSpendUSD: number | null; | ||
| /** Positive = current month projected higher than last. */ | ||
| readonly vsLastMonthPct: number | null; | ||
| } | ||
| export interface ForecastReport { | ||
| readonly schemaVersion: "sipcode-forecast/1"; | ||
| readonly status: ForecastStatus; | ||
| readonly trajectoryInput: ForecastTrajectoryInput | null; | ||
| readonly monthEnd: ForecastMonthEnd | null; | ||
| readonly comparison: ForecastComparison | null; | ||
| readonly headline: string; | ||
| } | ||
| //# sourceMappingURL=types.d.ts.map |
| {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/modules/forecast/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,cAAc,GACtB,IAAI,GACJ,mBAAmB,GACnB,gBAAgB,GAChB,oBAAoB,GACpB,SAAS,CAAC;AAEd,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;CACtC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,2DAA2D;IAC3D,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,aAAa,EAAE,oBAAoB,CAAC;IAC7C,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,eAAe,EAAE,uBAAuB,GAAG,IAAI,CAAC;IACzD,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC/C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B"} |
| /** | ||
| * `forecast_monthly_spend` / `sipcode forecast` — public types. | ||
| * | ||
| * Schema pinned at `sipcode-forecast/1`. | ||
| */ | ||
| export {}; | ||
| //# sourceMappingURL=types.js.map |
| {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/modules/forecast/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"} |
| /** | ||
| * Extract top-level Python symbols via tree-sitter-python. | ||
| * | ||
| * Mirrors `ts-symbols.ts`. Returns the same `ExtractedSymbol[]` shape so the | ||
| * orchestrator can treat both languages uniformly. | ||
| * | ||
| * Impure (depends on tree-sitter native binding). Loader is wrapped so an | ||
| * environment without the binding falls through to "pass through full file." | ||
| */ | ||
| import type { ExtractedSymbol } from "./ts-symbols.js"; | ||
| export declare function isPyFile(filePath: string): boolean; | ||
| export declare function extractPySymbols(_filePath: string, content: string): ExtractedSymbol[]; | ||
| //# sourceMappingURL=py-symbols.d.ts.map |
| {"version":3,"file":"py-symbols.d.ts","sourceRoot":"","sources":["../../../../src/modules/proxy/ast/py-symbols.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,eAAe,EAAc,MAAM,iBAAiB,CAAC;AAkCnE,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,eAAe,EAAE,CAWnB"} |
| import { createRequire } from "node:module"; | ||
| let cached; | ||
| function loadParser() { | ||
| if (cached !== undefined) | ||
| return cached; | ||
| try { | ||
| const localRequire = createRequire(import.meta.url); | ||
| const Parser = localRequire("tree-sitter"); | ||
| const Py = localRequire("tree-sitter-python"); | ||
| cached = { Parser, langPy: Py }; | ||
| } | ||
| catch { | ||
| cached = null; | ||
| } | ||
| return cached; | ||
| } | ||
| export function isPyFile(filePath) { | ||
| return /\.pyi?$/i.test(filePath); | ||
| } | ||
| export function extractPySymbols(_filePath, content) { | ||
| const bundle = loadParser(); | ||
| if (!bundle) | ||
| return []; | ||
| try { | ||
| const parser = new bundle.Parser(); | ||
| parser.setLanguage(bundle.langPy); | ||
| const tree = parser.parse(content); | ||
| return collectSymbols(tree.rootNode); | ||
| } | ||
| catch { | ||
| return []; | ||
| } | ||
| } | ||
| function collectSymbols(root) { | ||
| const out = []; | ||
| for (const child of root.children) { | ||
| pushSymbol(child, out); | ||
| } | ||
| return out; | ||
| } | ||
| function pushSymbol(node, out) { | ||
| const startLine = node.startPosition.row + 1; | ||
| const endLine = node.endPosition.row + 1; | ||
| switch (node.type) { | ||
| case "function_definition": | ||
| case "async_function_definition": { | ||
| const name = nameOf(node); | ||
| if (name) { | ||
| out.push(buildSymbol(name, "function", startLine, endLine)); | ||
| } | ||
| return; | ||
| } | ||
| case "decorated_definition": { | ||
| // Walk the wrapped definition; treat as same kind, decoration adds lines. | ||
| const inner = node.children.find((c) => c.type === "function_definition" || | ||
| c.type === "async_function_definition" || | ||
| c.type === "class_definition"); | ||
| if (inner) { | ||
| const name = nameOf(inner); | ||
| if (name) { | ||
| const kind = inner.type === "class_definition" ? "class" : "function"; | ||
| out.push(buildSymbol(name, kind, startLine, endLine)); | ||
| } | ||
| } | ||
| return; | ||
| } | ||
| case "class_definition": { | ||
| const name = nameOf(node); | ||
| if (name) { | ||
| out.push(buildSymbol(name, "class", startLine, endLine)); | ||
| } | ||
| return; | ||
| } | ||
| case "expression_statement": { | ||
| // Module-level assignment: NAME = ... | ||
| const assign = node.children[0]; | ||
| if (assign && assign.type === "assignment") { | ||
| const left = assign.children[0]; | ||
| if (left && left.type === "identifier" && left.text) { | ||
| out.push(buildSymbol(left.text, "const", startLine, endLine)); | ||
| } | ||
| } | ||
| return; | ||
| } | ||
| default: | ||
| return; | ||
| } | ||
| } | ||
| function nameOf(node) { | ||
| const id = node.childForFieldName("name"); | ||
| if (id && id.text) | ||
| return id.text; | ||
| for (const c of node.children) { | ||
| if (c.type === "identifier") | ||
| return c.text; | ||
| } | ||
| return null; | ||
| } | ||
| function buildSymbol(name, kind, startLine, endLine) { | ||
| return { | ||
| name, | ||
| kind, | ||
| startLine, | ||
| endLine, | ||
| isTopLevel: true, | ||
| // Python doesn't distinguish "exported" at parse time; treat all top-level | ||
| // names as exported unless they start with underscore (PEP 8 convention). | ||
| isExported: !name.startsWith("_"), | ||
| }; | ||
| } | ||
| //# sourceMappingURL=py-symbols.js.map |
| {"version":3,"file":"py-symbols.js","sourceRoot":"","sources":["../../../../src/modules/proxy/ast/py-symbols.ts"],"names":[],"mappings":"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"} |
| /** | ||
| * Score extracted symbols against recent session signals. | ||
| * | ||
| * Pure. No I/O. Takes the symbols extracted from a file plus the signal | ||
| * cache loaded by the orchestrator, returns each symbol with a 0-1 | ||
| * confidence score. | ||
| * | ||
| * Match types (highest score wins): | ||
| * - exact: symbol name === signal pattern → 1.0 | ||
| * - substring: symbol name contains pattern (or vice versa) → 0.8 | ||
| * - word-bdry: pattern is a CamelCase / snake_case word in symbol → 0.7 | ||
| * - regex-match: pattern (as regex) matches symbol → 0.7 | ||
| * - no match: 0.0 | ||
| * | ||
| * The orchestrator's confidence gate (default 0.7) means only exact and | ||
| * substring matches reliably trigger AST trim — word-boundary and regex | ||
| * land right at the threshold so the orchestrator can still pass through | ||
| * the full file if it wants extra caution. | ||
| * | ||
| * Glob patterns are explicitly NOT scored — they tell us file types of | ||
| * interest, not symbol names. They're recorded for future use. | ||
| */ | ||
| import type { ExtractedSymbol } from "./ts-symbols.js"; | ||
| import type { Signal } from "../signal-cache.js"; | ||
| export interface ScoredSymbol { | ||
| readonly symbol: ExtractedSymbol; | ||
| /** Match confidence 0-1. */ | ||
| readonly confidence: number; | ||
| /** Which signal pattern produced the best score (for debug/reasoning). */ | ||
| readonly matchedPattern?: string; | ||
| } | ||
| /** Default minimum confidence for "safe to use this symbol for trim." */ | ||
| export declare const DEFAULT_CONFIDENCE_THRESHOLD = 0.7; | ||
| /** | ||
| * Score each symbol against the signals. Symbols with no match score 0 | ||
| * and are still returned (caller decides what to do with low-confidence | ||
| * symbols). | ||
| */ | ||
| export declare function scoreSymbols(symbols: ReadonlyArray<ExtractedSymbol>, signals: ReadonlyArray<Signal>): ScoredSymbol[]; | ||
| /** | ||
| * Pick symbols above the confidence threshold to use for AST trim. Returns | ||
| * empty when nothing crosses the bar — caller should pass through the full | ||
| * file. | ||
| */ | ||
| export declare function pickRelevantSymbols(scored: ReadonlyArray<ScoredSymbol>, threshold?: number): ScoredSymbol[]; | ||
| /** | ||
| * Compute a 0-1 score for how well symbol matches pattern. | ||
| * Pure helper, exported for tests. | ||
| */ | ||
| export declare function matchScore(symbol: string, pattern: string): number; | ||
| //# sourceMappingURL=relevance.d.ts.map |
| {"version":3,"file":"relevance.d.ts","sourceRoot":"","sources":["../../../../src/modules/proxy/ast/relevance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,4BAA4B;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,0EAA0E;IAC1E,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,yEAAyE;AACzE,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAEhD;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,aAAa,CAAC,eAAe,CAAC,EACvC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAC7B,YAAY,EAAE,CAmBhB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,EACnC,SAAS,GAAE,MAAqC,GAC/C,YAAY,EAAE,CAIhB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAyBlE"} |
| /** Default minimum confidence for "safe to use this symbol for trim." */ | ||
| export const DEFAULT_CONFIDENCE_THRESHOLD = 0.7; | ||
| /** | ||
| * Score each symbol against the signals. Symbols with no match score 0 | ||
| * and are still returned (caller decides what to do with low-confidence | ||
| * symbols). | ||
| */ | ||
| export function scoreSymbols(symbols, signals) { | ||
| const grepPatterns = signals | ||
| .filter((s) => s.kind === "grep-pattern") | ||
| .map((s) => s.pattern); | ||
| return symbols.map((symbol) => { | ||
| let best = 0; | ||
| let bestPattern; | ||
| for (const pattern of grepPatterns) { | ||
| const score = matchScore(symbol.name, pattern); | ||
| if (score > best) { | ||
| best = score; | ||
| bestPattern = pattern; | ||
| } | ||
| } | ||
| return bestPattern !== undefined | ||
| ? { symbol, confidence: best, matchedPattern: bestPattern } | ||
| : { symbol, confidence: best }; | ||
| }); | ||
| } | ||
| /** | ||
| * Pick symbols above the confidence threshold to use for AST trim. Returns | ||
| * empty when nothing crosses the bar — caller should pass through the full | ||
| * file. | ||
| */ | ||
| export function pickRelevantSymbols(scored, threshold = DEFAULT_CONFIDENCE_THRESHOLD) { | ||
| return scored | ||
| .filter((s) => s.confidence >= threshold) | ||
| .sort((a, b) => b.confidence - a.confidence); | ||
| } | ||
| /** | ||
| * Compute a 0-1 score for how well symbol matches pattern. | ||
| * Pure helper, exported for tests. | ||
| */ | ||
| export function matchScore(symbol, pattern) { | ||
| if (!symbol || !pattern) | ||
| return 0; | ||
| if (symbol === pattern) | ||
| return 1.0; | ||
| const symLower = symbol.toLowerCase(); | ||
| const patLower = pattern.toLowerCase(); | ||
| if (symLower === patLower) | ||
| return 0.95; | ||
| if (symLower.includes(patLower) || patLower.includes(symLower)) { | ||
| // Length-aware: short pattern matching a long symbol is less reliable. | ||
| // E.g. pattern "id" inside symbol "validateUserId" — match but not perfect. | ||
| const ratio = Math.min(patLower.length, symLower.length) / Math.max(patLower.length, symLower.length); | ||
| return 0.7 + 0.1 * ratio; | ||
| } | ||
| // Word-boundary on CamelCase / snake_case. | ||
| const words = splitIdentifier(symbol); | ||
| for (const w of words) { | ||
| if (w.toLowerCase() === patLower) | ||
| return 0.7; | ||
| } | ||
| // Regex attempt — patterns from Grep can be valid regex. | ||
| try { | ||
| const re = new RegExp(pattern); | ||
| if (re.test(symbol)) | ||
| return 0.7; | ||
| } | ||
| catch { | ||
| // not a valid regex; ignore | ||
| } | ||
| return 0; | ||
| } | ||
| /** Split CamelCase / snake_case / kebab-case into lowercase words. */ | ||
| function splitIdentifier(s) { | ||
| return s | ||
| .replace(/([a-z])([A-Z])/g, "$1_$2") | ||
| .replace(/([A-Z]+)([A-Z][a-z])/g, "$1_$2") | ||
| .split(/[_\-]+/) | ||
| .filter(Boolean); | ||
| } | ||
| //# sourceMappingURL=relevance.js.map |
| {"version":3,"file":"relevance.js","sourceRoot":"","sources":["../../../../src/modules/proxy/ast/relevance.ts"],"names":[],"mappings":"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"} |
| /** | ||
| * Extract top-level symbols from a TypeScript/JavaScript file via tree-sitter. | ||
| * | ||
| * Impure: depends on tree-sitter native bindings. Loader is wrapped in | ||
| * try/catch — if the binding fails to load (Bun, Alpine, broken install), | ||
| * the orchestrator falls back to "pass through full file" so Claude Code | ||
| * is never broken. | ||
| * | ||
| * Returns symbols ordered by appearance. Each has 1-indexed startLine and | ||
| * endLine matching the `offset` semantics of Claude Code's Read tool. | ||
| * | ||
| * Lives outside `rewriters/` so the rewriter-purity guard doesn't apply. | ||
| */ | ||
| export type SymbolKind = "function" | "class" | "interface" | "type" | "const" | "let" | "var" | "enum"; | ||
| export interface ExtractedSymbol { | ||
| readonly name: string; | ||
| readonly kind: SymbolKind; | ||
| /** 1-indexed line where the declaration starts. */ | ||
| readonly startLine: number; | ||
| /** 1-indexed line where the declaration ends. */ | ||
| readonly endLine: number; | ||
| /** True if this is at the top level of the file (vs nested). */ | ||
| readonly isTopLevel: true; | ||
| /** True if exported (export keyword present). */ | ||
| readonly isExported: boolean; | ||
| } | ||
| /** Returns true iff the file extension is supported by this extractor. */ | ||
| export declare function isTsLikeFile(filePath: string): boolean; | ||
| /** | ||
| * Extract top-level symbols. Returns empty array on parser-load failure or | ||
| * a parse error so the orchestrator falls through to "pass through full file." | ||
| */ | ||
| export declare function extractTsSymbols(filePath: string, content: string): ExtractedSymbol[]; | ||
| //# sourceMappingURL=ts-symbols.d.ts.map |
| {"version":3,"file":"ts-symbols.d.ts","sourceRoot":"","sources":["../../../../src/modules/proxy/ast/ts-symbols.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,UAAU,GAClB,UAAU,GACV,OAAO,GACP,WAAW,GACX,MAAM,GACN,OAAO,GACP,KAAK,GACL,KAAK,GACL,MAAM,CAAC;AAEX,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,mDAAmD;IACnD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,iDAAiD;IACjD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,gEAAgE;IAChE,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC;IAC1B,iDAAiD;IACjD,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAyCD,0EAA0E;AAC1E,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEtD;AAOD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,eAAe,EAAE,CAWnB"} |
| import { createRequire } from "node:module"; | ||
| let cached; // undefined = not tried, null = tried and failed | ||
| function loadParser() { | ||
| if (cached !== undefined) | ||
| return cached; | ||
| try { | ||
| // createRequire from this module's URL so we resolve tree-sitter | ||
| // against the install where dist/modules/proxy/ast/ts-symbols.js lives | ||
| // (the user's node_modules), not the spawning process's cwd. | ||
| const localRequire = createRequire(import.meta.url); | ||
| const Parser = localRequire("tree-sitter"); | ||
| const TS = localRequire("tree-sitter-typescript"); | ||
| cached = { Parser, langTs: TS.typescript, langTsx: TS.tsx }; | ||
| } | ||
| catch { | ||
| cached = null; | ||
| } | ||
| return cached; | ||
| } | ||
| /** Returns true iff the file extension is supported by this extractor. */ | ||
| export function isTsLikeFile(filePath) { | ||
| return /\.(ts|tsx|js|jsx|mjs|cjs|mts|cts)$/i.test(filePath); | ||
| } | ||
| /** True iff this filePath is TSX/JSX (needs the tsx grammar). */ | ||
| function isJsxLike(filePath) { | ||
| return /\.(tsx|jsx)$/i.test(filePath); | ||
| } | ||
| /** | ||
| * Extract top-level symbols. Returns empty array on parser-load failure or | ||
| * a parse error so the orchestrator falls through to "pass through full file." | ||
| */ | ||
| export function extractTsSymbols(filePath, content) { | ||
| const bundle = loadParser(); | ||
| if (!bundle) | ||
| return []; | ||
| try { | ||
| const parser = new bundle.Parser(); | ||
| parser.setLanguage(isJsxLike(filePath) ? bundle.langTsx : bundle.langTs); | ||
| const tree = parser.parse(content); | ||
| return collectSymbols(tree.rootNode); | ||
| } | ||
| catch { | ||
| return []; | ||
| } | ||
| } | ||
| function collectSymbols(root) { | ||
| const out = []; | ||
| for (const child of root.children) { | ||
| pushSymbol(child, out, /*exported=*/ false); | ||
| } | ||
| return out; | ||
| } | ||
| function pushSymbol(node, out, exportedContext) { | ||
| const startLine = node.startPosition.row + 1; | ||
| const endLine = node.endPosition.row + 1; | ||
| switch (node.type) { | ||
| case "export_statement": { | ||
| // Walk into the wrapped declaration with exportedContext=true. | ||
| for (const c of node.children) { | ||
| if (c.type === "export" || c.type === "default") | ||
| continue; | ||
| pushSymbol(c, out, /*exported=*/ true); | ||
| } | ||
| return; | ||
| } | ||
| case "function_declaration": { | ||
| const name = nameOf(node); | ||
| if (name) { | ||
| out.push({ | ||
| name, | ||
| kind: "function", | ||
| startLine, | ||
| endLine, | ||
| isTopLevel: true, | ||
| isExported: exportedContext, | ||
| }); | ||
| } | ||
| return; | ||
| } | ||
| case "class_declaration": { | ||
| const name = nameOf(node); | ||
| if (name) { | ||
| out.push({ | ||
| name, | ||
| kind: "class", | ||
| startLine, | ||
| endLine, | ||
| isTopLevel: true, | ||
| isExported: exportedContext, | ||
| }); | ||
| } | ||
| return; | ||
| } | ||
| case "interface_declaration": { | ||
| const name = nameOf(node); | ||
| if (name) { | ||
| out.push({ | ||
| name, | ||
| kind: "interface", | ||
| startLine, | ||
| endLine, | ||
| isTopLevel: true, | ||
| isExported: exportedContext, | ||
| }); | ||
| } | ||
| return; | ||
| } | ||
| case "type_alias_declaration": { | ||
| const name = nameOf(node); | ||
| if (name) { | ||
| out.push({ | ||
| name, | ||
| kind: "type", | ||
| startLine, | ||
| endLine, | ||
| isTopLevel: true, | ||
| isExported: exportedContext, | ||
| }); | ||
| } | ||
| return; | ||
| } | ||
| case "enum_declaration": { | ||
| const name = nameOf(node); | ||
| if (name) { | ||
| out.push({ | ||
| name, | ||
| kind: "enum", | ||
| startLine, | ||
| endLine, | ||
| isTopLevel: true, | ||
| isExported: exportedContext, | ||
| }); | ||
| } | ||
| return; | ||
| } | ||
| case "lexical_declaration": | ||
| case "variable_declaration": { | ||
| // const|let|var x = ... ; possibly multiple declarators. | ||
| const kindWord = firstChildText(node); | ||
| const kind = kindWord === "const" ? "const" : kindWord === "let" ? "let" : "var"; | ||
| for (const c of node.children) { | ||
| if (c.type === "variable_declarator") { | ||
| const name = nameOf(c); | ||
| if (name) { | ||
| out.push({ | ||
| name, | ||
| kind, | ||
| startLine, | ||
| endLine, | ||
| isTopLevel: true, | ||
| isExported: exportedContext, | ||
| }); | ||
| } | ||
| } | ||
| } | ||
| return; | ||
| } | ||
| default: | ||
| return; | ||
| } | ||
| } | ||
| function nameOf(node) { | ||
| const id = node.childForFieldName("name"); | ||
| if (id && id.text) | ||
| return id.text; | ||
| // Fallback: scan children for an identifier-like node. | ||
| for (const c of node.children) { | ||
| if (c.type === "identifier" || c.type === "type_identifier") { | ||
| return c.text; | ||
| } | ||
| } | ||
| return null; | ||
| } | ||
| function firstChildText(node) { | ||
| return node.children[0]?.text ?? null; | ||
| } | ||
| //# sourceMappingURL=ts-symbols.js.map |
| {"version":3,"file":"ts-symbols.js","sourceRoot":"","sources":["../../../../src/modules/proxy/ast/ts-symbols.ts"],"names":[],"mappings":"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"} |
| import { type StoreIO } from "./signal-cache.js"; | ||
| import type { PreToolUseInput, HookSpecificOutput, ProxyStatsEntry } from "./types.js"; | ||
| export interface HookAstReadResult { | ||
| readonly hookOutput: HookSpecificOutput | null; | ||
| readonly statsEntry: ProxyStatsEntry | null; | ||
| } | ||
| /** | ||
| * Files smaller than this (in lines) aren't worth trimming. We'd save at most | ||
| * MIN_LINES_TO_TRIM tokens; not worth the overhead of injecting a slice | ||
| * + risk of missing context. | ||
| */ | ||
| export declare const MIN_LINES_TO_TRIM = 200; | ||
| /** Lines of context around each picked symbol. */ | ||
| export declare const CONTEXT_LINES = 5; | ||
| export interface AstIO extends StoreIO { | ||
| readFile(p: string): Promise<string | null>; | ||
| now(): Date; | ||
| } | ||
| export declare const realAstIO: AstIO; | ||
| /** | ||
| * Side-effect: record a signal derived from this tool call (Grep/Glob/Bash). | ||
| * Fire-and-forget; failures don't block anything. Use this for every tool | ||
| * call routed by the hook script. | ||
| */ | ||
| export declare function recordSignal(input: PreToolUseInput, homeDir: string, io?: AstIO): Promise<void>; | ||
| export declare function hookAstRead(input: PreToolUseInput, homeDir: string, io?: AstIO): Promise<HookAstReadResult>; | ||
| //# sourceMappingURL=hookAstRead.d.ts.map |
| {"version":3,"file":"hookAstRead.d.ts","sourceRoot":"","sources":["../../../src/modules/proxy/hookAstRead.ts"],"names":[],"mappings":"AAiCA,OAAO,EAML,KAAK,OAAO,EACb,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EAClB,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,UAAU,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC/C,QAAQ,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI,CAAC;CAC7C;AAID;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC,kDAAkD;AAClD,eAAO,MAAM,aAAa,IAAI,CAAC;AAE/B,MAAM,WAAW,KAAM,SAAQ,OAAO;IACpC,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC5C,GAAG,IAAI,IAAI,CAAC;CACb;AAED,eAAO,MAAM,SAAS,EAAE,KAYvB,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,eAAe,EACtB,OAAO,EAAE,MAAM,EACf,EAAE,GAAE,KAAiB,GACpB,OAAO,CAAC,IAAI,CAAC,CAcf;AAED,wBAAsB,WAAW,CAC/B,KAAK,EAAE,eAAe,EACtB,OAAO,EAAE,MAAM,EACf,EAAE,GAAE,KAAiB,GACpB,OAAO,CAAC,iBAAiB,CAAC,CAoE5B"} |
| /** | ||
| * Hook-side orchestrator for B3 AST-aware symbol reads. | ||
| * | ||
| * For TS/JS Read calls without offset/limit: | ||
| * 1. Read the file | ||
| * 2. Extract top-level symbols via tree-sitter | ||
| * 3. Load the per-session signal cache | ||
| * 4. Score each symbol against recent grep patterns | ||
| * 5. If any symbol's confidence ≥ threshold AND the file is large enough | ||
| * to bother trimming, inject offset/limit to read just the picked | ||
| * symbol(s) plus a small surrounding buffer | ||
| * 6. Otherwise, pass through the full file (Claude reads as normal) | ||
| * | ||
| * Safety: when ANY of (file too small, no signals, no confident match, | ||
| * parser error) holds, we pass through. The cost of a missed trim is just | ||
| * "tokens we could have saved." The cost of a wrong trim is "Claude can't | ||
| * see the line it needed" — which is far worse. Bias hard toward pass-through. | ||
| * | ||
| * Lives outside `rewriters/` so the rewriter-purity guard doesn't apply. | ||
| */ | ||
| import { promises as fs } from "node:fs"; | ||
| import { extractTsSymbols, isTsLikeFile, } from "./ast/ts-symbols.js"; | ||
| import { extractPySymbols, isPyFile } from "./ast/py-symbols.js"; | ||
| import { scoreSymbols, pickRelevantSymbols, DEFAULT_CONFIDENCE_THRESHOLD, } from "./ast/relevance.js"; | ||
| import { loadSignals, appendSignal, sessionSignalsPath, deriveSignalFromInput, realStoreIO, } from "./signal-cache.js"; | ||
| const EMPTY = { hookOutput: null, statsEntry: null }; | ||
| /** | ||
| * Files smaller than this (in lines) aren't worth trimming. We'd save at most | ||
| * MIN_LINES_TO_TRIM tokens; not worth the overhead of injecting a slice | ||
| * + risk of missing context. | ||
| */ | ||
| export const MIN_LINES_TO_TRIM = 200; | ||
| /** Lines of context around each picked symbol. */ | ||
| export const CONTEXT_LINES = 5; | ||
| export const realAstIO = { | ||
| ...realStoreIO, | ||
| async readFile(p) { | ||
| try { | ||
| return await fs.readFile(p, "utf-8"); | ||
| } | ||
| catch { | ||
| return null; | ||
| } | ||
| }, | ||
| now() { | ||
| return new Date(); | ||
| }, | ||
| }; | ||
| /** | ||
| * Side-effect: record a signal derived from this tool call (Grep/Glob/Bash). | ||
| * Fire-and-forget; failures don't block anything. Use this for every tool | ||
| * call routed by the hook script. | ||
| */ | ||
| export async function recordSignal(input, homeDir, io = realAstIO) { | ||
| try { | ||
| if (!input.session_id) | ||
| return; | ||
| const signal = deriveSignalFromInput(input.tool_name, input.tool_input, io.now().getTime()); | ||
| if (!signal) | ||
| return; | ||
| const p = sessionSignalsPath(homeDir, input.session_id); | ||
| await appendSignal(p, signal, io); | ||
| } | ||
| catch { | ||
| // never throw from a signal-write | ||
| } | ||
| } | ||
| export async function hookAstRead(input, homeDir, io = realAstIO) { | ||
| try { | ||
| if (input.tool_name !== "Read") | ||
| return EMPTY; | ||
| const filePath = input.tool_input.file_path; | ||
| if (typeof filePath !== "string" || filePath.length === 0) | ||
| return EMPTY; | ||
| // Supported: TS/JS family and Python. | ||
| const ext = isTsLikeFile(filePath) | ||
| ? "ts" | ||
| : isPyFile(filePath) | ||
| ? "py" | ||
| : null; | ||
| if (ext === null) | ||
| return EMPTY; | ||
| // Bail if the model asked for a slice — they have intent, don't override. | ||
| if (input.tool_input.offset !== undefined || input.tool_input.limit !== undefined) { | ||
| return EMPTY; | ||
| } | ||
| if (!input.session_id) | ||
| return EMPTY; | ||
| const content = await io.readFile(filePath); | ||
| if (content === null) | ||
| return EMPTY; | ||
| const lineCount = countLines(content); | ||
| if (lineCount < MIN_LINES_TO_TRIM) | ||
| return EMPTY; | ||
| const symbols = ext === "py" ? extractPySymbols(filePath, content) : extractTsSymbols(filePath, content); | ||
| if (symbols.length === 0) | ||
| return EMPTY; // parser failed or empty | ||
| const signalsPath = sessionSignalsPath(homeDir, input.session_id); | ||
| const signals = await loadSignals(signalsPath, io); | ||
| if (signals.length === 0) | ||
| return EMPTY; // no signal to trim by | ||
| const scored = scoreSymbols(symbols, signals); | ||
| const picked = pickRelevantSymbols(scored, DEFAULT_CONFIDENCE_THRESHOLD); | ||
| if (picked.length === 0) | ||
| return EMPTY; | ||
| const slice = computeSlice(picked, lineCount); | ||
| // If our slice ends up covering ~the whole file, there's no point. | ||
| if (slice.limit >= Math.floor(lineCount * 0.8)) | ||
| return EMPTY; | ||
| const savedTokensEstimate = estimateSavedTokens(lineCount, slice.limit); | ||
| const note = `ast-trim: returning lines ${slice.offset + 1}-${slice.offset + slice.limit} ` + | ||
| `(symbols ${picked.map((p) => p.symbol.name).join(", ")}; ` + | ||
| `confidence ${picked[0].confidence.toFixed(2)})`; | ||
| return { | ||
| hookOutput: { | ||
| hookSpecificOutput: { | ||
| hookEventName: "PreToolUse", | ||
| permissionDecision: "allow", | ||
| updatedInput: { | ||
| ...input.tool_input, | ||
| offset: slice.offset, | ||
| limit: slice.limit, | ||
| }, | ||
| }, | ||
| }, | ||
| statsEntry: { | ||
| timestamp: io.now().toISOString(), | ||
| toolName: "Read", | ||
| rewriterName: "ast-read", | ||
| savedTokensEstimate, | ||
| integrityScore: 0.7, // we kept the symbol(s) Claude searched for; bias to conservative | ||
| }, | ||
| }; | ||
| } | ||
| catch { | ||
| return EMPTY; | ||
| } | ||
| } | ||
| function countLines(s) { | ||
| let n = 1; | ||
| for (let i = 0; i < s.length; i++) { | ||
| if (s.charCodeAt(i) === 10 /* \n */) | ||
| n++; | ||
| } | ||
| return n; | ||
| } | ||
| /** Pick a window covering the picked symbols + CONTEXT_LINES on each side. */ | ||
| function computeSlice(picked, totalLines) { | ||
| let minStart = Infinity; | ||
| let maxEnd = -Infinity; | ||
| for (const p of picked) { | ||
| if (p.symbol.startLine < minStart) | ||
| minStart = p.symbol.startLine; | ||
| if (p.symbol.endLine > maxEnd) | ||
| maxEnd = p.symbol.endLine; | ||
| } | ||
| const start = Math.max(1, minStart - CONTEXT_LINES); | ||
| const end = Math.min(totalLines, maxEnd + CONTEXT_LINES); | ||
| return { | ||
| offset: start - 1, // Claude Code's offset is 0-indexed | ||
| limit: end - start + 1, | ||
| }; | ||
| } | ||
| /** Heuristic: ~4 chars/line average, ~4 chars/token. Treat 1 line ≈ 12 tokens. */ | ||
| function estimateSavedTokens(totalLines, keptLines) { | ||
| const droppedLines = Math.max(0, totalLines - keptLines); | ||
| return droppedLines * 12; | ||
| } | ||
| //# sourceMappingURL=hookAstRead.js.map |
| {"version":3,"file":"hookAstRead.js","sourceRoot":"","sources":["../../../src/modules/proxy/hookAstRead.ts"],"names":[],"mappings":"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"} |
| export type SignalKind = "grep-pattern" | "glob-pattern"; | ||
| export interface Signal { | ||
| /** Tool name that produced this signal (Bash/Grep/Glob). */ | ||
| readonly tool: string; | ||
| /** What kind of signal this is. */ | ||
| readonly kind: SignalKind; | ||
| /** The raw query/pattern Claude sent. */ | ||
| readonly pattern: string; | ||
| /** When this signal was captured (epoch ms). */ | ||
| readonly capturedAtMs: number; | ||
| } | ||
| export interface StoreIO { | ||
| read(p: string): Promise<string | null>; | ||
| append(p: string, content: string): Promise<void>; | ||
| } | ||
| export declare const realStoreIO: StoreIO; | ||
| export declare function sessionSignalsPath(home: string, sessionId: string): string; | ||
| /** | ||
| * Load signals for a session, newest-first. Caps the load at MAX_SIGNALS to | ||
| * keep relevance scoring fast even on long sessions. | ||
| */ | ||
| export declare const MAX_SIGNALS = 200; | ||
| export declare function loadSignals(filePath: string, io?: StoreIO): Promise<Signal[]>; | ||
| export declare function appendSignal(filePath: string, signal: Signal, io?: StoreIO): Promise<void>; | ||
| /** | ||
| * Pull search patterns from a PreToolUse input. Returns null when the tool | ||
| * doesn't carry any usable signal. Pure. | ||
| */ | ||
| export declare function deriveSignalFromInput(toolName: string, toolInput: Record<string, unknown>, nowMs: number): Signal | null; | ||
| //# sourceMappingURL=signal-cache.d.ts.map |
| {"version":3,"file":"signal-cache.d.ts","sourceRoot":"","sources":["../../../src/modules/proxy/signal-cache.ts"],"names":[],"mappings":"AAiBA,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG,cAAc,CAAC;AAEzD,MAAM,WAAW,MAAM;IACrB,4DAA4D;IAC5D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,mCAAmC;IACnC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,yCAAyC;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,gDAAgD;IAChD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACxC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD;AAED,eAAO,MAAM,WAAW,EAAE,OAczB,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,MAAM,CAAC;AAE/B,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,EAAE,GAAE,OAAqB,GACxB,OAAO,CAAC,MAAM,EAAE,CAAC,CAuBnB;AAED,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,EAAE,GAAE,OAAqB,GACxB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,KAAK,EAAE,MAAM,GACZ,MAAM,GAAG,IAAI,CAmCf"} |
| /** | ||
| * Per-session signal cache for B3 AST-aware reads. | ||
| * | ||
| * Records Grep/Glob patterns Claude has searched for. The AST-read | ||
| * orchestrator uses these as the relevance signal: when Claude later Reads a | ||
| * .ts file, symbols whose name matches any recent grep pattern get a high | ||
| * relevance score and the orchestrator can inject offset/limit to return only | ||
| * those symbols' line ranges instead of the full file. | ||
| * | ||
| * Cache file: `~/.sipcode/proxy-signals/<session-id>.jsonl`. Session-keyed | ||
| * because each Claude Code session has its own search intent. | ||
| * | ||
| * StoreIO seam mirrors read-cache.ts so tests can inject in-memory I/O. | ||
| */ | ||
| import { promises as fs } from "node:fs"; | ||
| import path from "node:path"; | ||
| export const realStoreIO = { | ||
| async read(p) { | ||
| try { | ||
| return await fs.readFile(p, "utf-8"); | ||
| } | ||
| catch (err) { | ||
| const code = err.code; | ||
| if (code === "ENOENT") | ||
| return null; | ||
| throw err; | ||
| } | ||
| }, | ||
| async append(p, content) { | ||
| await fs.mkdir(path.dirname(p), { recursive: true }); | ||
| await fs.appendFile(p, content, "utf-8"); | ||
| }, | ||
| }; | ||
| export function sessionSignalsPath(home, sessionId) { | ||
| return path.join(home, ".sipcode", "proxy-signals", `${sessionId}.jsonl`); | ||
| } | ||
| /** | ||
| * Load signals for a session, newest-first. Caps the load at MAX_SIGNALS to | ||
| * keep relevance scoring fast even on long sessions. | ||
| */ | ||
| export const MAX_SIGNALS = 200; | ||
| export async function loadSignals(filePath, io = realStoreIO) { | ||
| const raw = await io.read(filePath); | ||
| if (raw === null) | ||
| return []; | ||
| const out = []; | ||
| for (const line of raw.split("\n")) { | ||
| const trimmed = line.trim(); | ||
| if (!trimmed) | ||
| continue; | ||
| try { | ||
| const e = JSON.parse(trimmed); | ||
| if (e && | ||
| typeof e === "object" && | ||
| typeof e.pattern === "string" && | ||
| typeof e.capturedAtMs === "number") { | ||
| out.push(e); | ||
| } | ||
| } | ||
| catch { | ||
| // skip malformed line | ||
| } | ||
| } | ||
| out.sort((a, b) => b.capturedAtMs - a.capturedAtMs); | ||
| return out.slice(0, MAX_SIGNALS); | ||
| } | ||
| export async function appendSignal(filePath, signal, io = realStoreIO) { | ||
| await io.append(filePath, JSON.stringify(signal) + "\n"); | ||
| } | ||
| /** | ||
| * Pull search patterns from a PreToolUse input. Returns null when the tool | ||
| * doesn't carry any usable signal. Pure. | ||
| */ | ||
| export function deriveSignalFromInput(toolName, toolInput, nowMs) { | ||
| // Native Grep | ||
| if (toolName === "Grep") { | ||
| const pattern = toolInput.pattern; | ||
| if (typeof pattern === "string" && pattern.length > 0) { | ||
| return { tool: "Grep", kind: "grep-pattern", pattern, capturedAtMs: nowMs }; | ||
| } | ||
| return null; | ||
| } | ||
| // Native Glob | ||
| if (toolName === "Glob") { | ||
| const pattern = toolInput.pattern; | ||
| if (typeof pattern === "string" && pattern.length > 0) { | ||
| return { tool: "Glob", kind: "glob-pattern", pattern, capturedAtMs: nowMs }; | ||
| } | ||
| return null; | ||
| } | ||
| // Bash grep — best-effort pattern extraction. | ||
| if (toolName === "Bash") { | ||
| const command = toolInput.command; | ||
| if (typeof command !== "string") | ||
| return null; | ||
| const m = command.match(/^\s*(?:grep|rg|ag)\s+(?:--?[a-zA-Z][a-zA-Z0-9-]*(?:=\S+)?\s+)*['"]?([^\s'"]+)['"]?/); | ||
| if (m && m[1]) { | ||
| return { | ||
| tool: "Bash", | ||
| kind: "grep-pattern", | ||
| pattern: m[1], | ||
| capturedAtMs: nowMs, | ||
| }; | ||
| } | ||
| return null; | ||
| } | ||
| return null; | ||
| } | ||
| //# sourceMappingURL=signal-cache.js.map |
| {"version":3,"file":"signal-cache.js","sourceRoot":"","sources":["../../../src/modules/proxy/signal-cache.ts"],"names":[],"mappings":"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"} |
| /** | ||
| * JSON renderer for `sipcode today --json` / `get_today_summary` MCP tool. Pure. | ||
| * | ||
| * The schema is the public contract from v1.6.10+. Pinned schemaVersion. | ||
| */ | ||
| import type { TodayReport } from "./types.js"; | ||
| export declare function formatTodayJson(report: TodayReport): string; | ||
| //# sourceMappingURL=format-json.d.ts.map |
| {"version":3,"file":"format-json.d.ts","sourceRoot":"","sources":["../../../src/modules/today/format-json.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAE3D"} |
| export function formatTodayJson(report) { | ||
| return JSON.stringify(report, null, 2); | ||
| } | ||
| //# sourceMappingURL=format-json.js.map |
| {"version":3,"file":"format-json.js","sourceRoot":"","sources":["../../../src/modules/today/format-json.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,eAAe,CAAC,MAAmB;IACjD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC"} |
| /** | ||
| * Terminal renderer for `sipcode today`. Pure. | ||
| */ | ||
| import type { TodayReport } from "./types.js"; | ||
| export declare function formatTodayTerminal(report: TodayReport): string; | ||
| //# sourceMappingURL=format-terminal.d.ts.map |
| {"version":3,"file":"format-terminal.d.ts","sourceRoot":"","sources":["../../../src/modules/today/format-terminal.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAoD/D"} |
| export function formatTodayTerminal(report) { | ||
| const lines = []; | ||
| const dateLabel = report.today?.dateLocal ?? "today"; | ||
| lines.push(`sipcode today · ${dateLabel}`); | ||
| lines.push(""); | ||
| if (report.status === "no-data") { | ||
| lines.push(" " + report.headline); | ||
| return lines.join("\n"); | ||
| } | ||
| if (report.today !== null) { | ||
| const t = report.today; | ||
| lines.push(` spend so far $${fmt(t.totalSpendUSD)} across ${t.sessionCount} session${t.sessionCount === 1 ? "" : "s"}`); | ||
| lines.push(` tokens so far ${fmtTokens(t.totalTokens)} output ratio ${t.outputRatioPct.toFixed(1)}%`); | ||
| if (t.topLeak !== null) { | ||
| lines.push(` top leak $${fmt(t.topLeak.costUSD)} ${t.topLeak.description}`); | ||
| } | ||
| lines.push(""); | ||
| } | ||
| if (report.baseline !== null && report.comparison !== null) { | ||
| const b = report.baseline; | ||
| const c = report.comparison; | ||
| const label = b.isPartial | ||
| ? `vs your last ${b.windowDays} days (all you have so far)` | ||
| : `vs your last ${b.windowDays} days (median)`; | ||
| lines.push(`${label}:`); | ||
| lines.push(` spend / day $${fmt(b.medianSpendPerDayUSD)} → today is ${fmtDelta(c.spendDeltaPct, "%")} ${arrow(c.spendDeltaPct, /*lowerIsBetter=*/ true)}`); | ||
| lines.push(` tokens / day ${fmtTokens(b.medianTokensPerDay)} → today is ${fmtDelta(c.tokenDeltaPct, "%")} ${arrow(c.tokenDeltaPct, /*lowerIsBetter=*/ true)}`); | ||
| lines.push(` output ratio ${b.medianOutputRatioPct.toFixed(1)}% → today is ${fmtDeltaPp(c.outputRatioDeltaPp)} ${arrow(-c.outputRatioDeltaPp, /*lowerIsBetter=*/ true)}`); | ||
| } | ||
| else if (report.baseline !== null && report.comparison === null) { | ||
| lines.push(`(no sessions today — baseline ${report.baseline.windowDays}d still shown above headline)`); | ||
| } | ||
| else { | ||
| lines.push("(no baseline yet — need ≥3 days of session history)"); | ||
| } | ||
| lines.push(""); | ||
| lines.push(report.headline); | ||
| return lines.join("\n"); | ||
| } | ||
| function fmt(v) { | ||
| return v.toFixed(2); | ||
| } | ||
| function fmtTokens(v) { | ||
| if (v >= 1000) | ||
| return `${(v / 1000).toFixed(1)}K`; | ||
| return v.toLocaleString("en-US"); | ||
| } | ||
| function fmtDelta(pct, unit) { | ||
| const abs = Math.abs(pct); | ||
| if (abs < 0.5) | ||
| return `even with baseline`; | ||
| return `${abs.toFixed(0)}${unit} ${pct < 0 ? "lower" : "higher"}`; | ||
| } | ||
| function fmtDeltaPp(pp) { | ||
| const abs = Math.abs(pp); | ||
| if (abs < 0.05) | ||
| return "even with baseline"; | ||
| const sign = pp >= 0 ? "+" : "−"; | ||
| return `${sign}${abs.toFixed(1)}pp`; | ||
| } | ||
| function arrow(pctChange, lowerIsBetter) { | ||
| if (Math.abs(pctChange) < 0.5) | ||
| return "·"; | ||
| const better = lowerIsBetter ? pctChange < 0 : pctChange > 0; | ||
| return better ? "↓" : "↑"; | ||
| } | ||
| //# sourceMappingURL=format-terminal.js.map |
| {"version":3,"file":"format-terminal.js","sourceRoot":"","sources":["../../../src/modules/today/format-terminal.ts"],"names":[],"mappings":"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"} |
| import type { TodayReport } from "./types.js"; | ||
| /** Shape we accept from upstream. Subset of stats AggregatedSession. */ | ||
| export interface TodaySession { | ||
| readonly sessionId: string; | ||
| readonly startedAt: string; | ||
| readonly totalTokens: number; | ||
| readonly outputTokens: number; | ||
| readonly estCostUSD: number; | ||
| readonly duplicateReadTokenCost: number; | ||
| /** Optional cost-USD attributed to the top duplicate-read file. */ | ||
| readonly topDuplicateReadFile?: { | ||
| path: string; | ||
| count: number; | ||
| costUSD: number; | ||
| } | undefined; | ||
| } | ||
| export interface RunTodayInput { | ||
| readonly sessions: ReadonlyArray<TodaySession>; | ||
| readonly now: Date; | ||
| } | ||
| export declare function runToday(input: RunTodayInput): TodayReport; | ||
| //# sourceMappingURL=runToday.d.ts.map |
| {"version":3,"file":"runToday.d.ts","sourceRoot":"","sources":["../../../src/modules/today/runToday.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,WAAW,EAKZ,MAAM,YAAY,CAAC;AAEpB,wEAAwE;AACxE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,mEAAmE;IACnE,QAAQ,CAAC,oBAAoB,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC9F;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;IAC/C,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;CACpB;AAKD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,WAAW,CA4E1D"} |
| /** | ||
| * Pure runner for `sipcode today` / `get_today_summary` MCP tool. | ||
| * | ||
| * Takes a pre-aggregated session list + `now`, returns a TodayReport. No I/O. | ||
| * All four TodayStatus branches handled with structured output — never throws. | ||
| */ | ||
| import { resolveBaseline } from "../../lib/baseline-window.js"; | ||
| /** Minimum sessions today to render the full headline. */ | ||
| const MIN_SESSIONS_FOR_OK = 1; | ||
| export function runToday(input) { | ||
| const { sessions, now } = input; | ||
| if (sessions.length === 0) { | ||
| return { | ||
| schemaVersion: "sipcode-today/1", | ||
| status: "no-data", | ||
| today: null, | ||
| baseline: null, | ||
| comparison: null, | ||
| headline: "No Claude Code sessions found yet. Run `claude` in any project to start.", | ||
| }; | ||
| } | ||
| const todayIso = toLocalDay(now); | ||
| const todaySessions = sessions.filter((s) => toLocalDay(new Date(s.startedAt)) === todayIso); | ||
| // Compute today's block (may be null when no sessions today). | ||
| const todayBlock = todaySessions.length >= MIN_SESSIONS_FOR_OK | ||
| ? buildTodayBlock(todayIso, todaySessions) | ||
| : null; | ||
| const baselineResolution = resolveBaseline(sessions.map((s) => s.startedAt), now); | ||
| // no-data already handled above. From here we either have: | ||
| // - baseline ok + sessions today → "ok" | ||
| // - baseline ok + no sessions today → "no-sessions-today" | ||
| // - baseline insufficient → "no-baseline" (today rendered if present) | ||
| if (baselineResolution.kind === "insufficient") { | ||
| return { | ||
| schemaVersion: "sipcode-today/1", | ||
| status: "no-baseline", | ||
| today: todayBlock, | ||
| baseline: null, | ||
| comparison: null, | ||
| headline: todayBlock !== null | ||
| ? `Showing today only ($${fmtUsd(todayBlock.totalSpendUSD)}). Need 3+ days of history to compute a baseline.` | ||
| : "No sessions today yet. Need 3+ days of history to compute a baseline.", | ||
| }; | ||
| } | ||
| const baselineSessions = sessions.filter((s) => s.startedAt.slice(0, 10) >= baselineResolution.window.sliceStartIso); | ||
| const baseline = buildBaseline(baselineResolution.window, baselineSessions); | ||
| if (todayBlock === null) { | ||
| return { | ||
| schemaVersion: "sipcode-today/1", | ||
| status: "no-sessions-today", | ||
| today: null, | ||
| baseline, | ||
| comparison: null, | ||
| headline: `No sessions today yet. Your ${baseline.windowDays}-day median is $${fmtUsd(baseline.medianSpendPerDayUSD)}/day — go build something.`, | ||
| }; | ||
| } | ||
| const comparison = buildComparison(todayBlock, baseline); | ||
| const headline = buildHeadline(todayBlock, baseline, comparison); | ||
| return { | ||
| schemaVersion: "sipcode-today/1", | ||
| status: "ok", | ||
| today: todayBlock, | ||
| baseline, | ||
| comparison, | ||
| headline, | ||
| }; | ||
| } | ||
| function buildTodayBlock(dateLocal, todaySessions) { | ||
| let totalSpendUSD = 0; | ||
| let totalTokens = 0; | ||
| let outputTokens = 0; | ||
| let topLeak = null; | ||
| for (const s of todaySessions) { | ||
| totalSpendUSD += s.estCostUSD; | ||
| totalTokens += s.totalTokens; | ||
| outputTokens += s.outputTokens; | ||
| if (s.topDuplicateReadFile !== undefined && | ||
| (topLeak === null || s.topDuplicateReadFile.costUSD > topLeak.costUSD)) { | ||
| topLeak = { | ||
| kind: "duplicate-reads", | ||
| description: `${s.topDuplicateReadFile.count} re-reads of ${shortPath(s.topDuplicateReadFile.path)}`, | ||
| costUSD: s.topDuplicateReadFile.costUSD, | ||
| }; | ||
| } | ||
| } | ||
| return { | ||
| dateLocal, | ||
| sessionCount: todaySessions.length, | ||
| totalSpendUSD, | ||
| totalTokens, | ||
| outputRatioPct: totalTokens > 0 ? (outputTokens / totalTokens) * 100 : 0, | ||
| topLeak, | ||
| }; | ||
| } | ||
| function buildBaseline(window, baselineSessions) { | ||
| const perDay = new Map(); | ||
| for (const s of baselineSessions) { | ||
| const day = s.startedAt.slice(0, 10); | ||
| const cur = perDay.get(day) ?? { spend: 0, tokens: 0, outRatio: 0, sessions: 0 }; | ||
| cur.spend += s.estCostUSD; | ||
| cur.tokens += s.totalTokens; | ||
| cur.outRatio += s.totalTokens > 0 ? s.outputTokens / s.totalTokens : 0; | ||
| cur.sessions += 1; | ||
| perDay.set(day, cur); | ||
| } | ||
| const spendDays = []; | ||
| const tokenDays = []; | ||
| const outRatioDays = []; | ||
| for (const v of perDay.values()) { | ||
| spendDays.push(v.spend); | ||
| tokenDays.push(v.tokens); | ||
| outRatioDays.push((v.outRatio / v.sessions) * 100); | ||
| } | ||
| return { | ||
| windowDays: window.windowDays, | ||
| isPartial: window.isPartial, | ||
| medianSpendPerDayUSD: median(spendDays), | ||
| medianTokensPerDay: median(tokenDays), | ||
| medianOutputRatioPct: median(outRatioDays), | ||
| }; | ||
| } | ||
| function buildComparison(today, baseline) { | ||
| return { | ||
| spendDeltaPct: pctChange(baseline.medianSpendPerDayUSD, today.totalSpendUSD), | ||
| tokenDeltaPct: pctChange(baseline.medianTokensPerDay, today.totalTokens), | ||
| outputRatioDeltaPp: today.outputRatioPct - baseline.medianOutputRatioPct, | ||
| }; | ||
| } | ||
| function buildHeadline(today, baseline, comparison) { | ||
| const parts = []; | ||
| const direction = comparison.spendDeltaPct < 0 ? "below" : "above"; | ||
| const magnitude = Math.round(Math.abs(comparison.spendDeltaPct)); | ||
| parts.push(`You've spent $${fmtUsd(today.totalSpendUSD)} today across ${today.sessionCount} session${today.sessionCount === 1 ? "" : "s"} — ${magnitude}% ${direction} your ${baseline.windowDays}-day median.`); | ||
| parts.push(`Output ratio ${today.outputRatioPct.toFixed(1)}% (vs ${baseline.medianOutputRatioPct.toFixed(1)}% baseline).`); | ||
| if (today.topLeak !== null) { | ||
| parts.push(`Top leak: ${today.topLeak.description} ($${fmtUsd(today.topLeak.costUSD)}).`); | ||
| } | ||
| return parts.join(" "); | ||
| } | ||
| function toLocalDay(d) { | ||
| const y = d.getFullYear(); | ||
| const m = String(d.getMonth() + 1).padStart(2, "0"); | ||
| const day = String(d.getDate()).padStart(2, "0"); | ||
| return `${y}-${m}-${day}`; | ||
| } | ||
| function median(xs) { | ||
| if (xs.length === 0) | ||
| return 0; | ||
| const s = [...xs].sort((a, b) => a - b); | ||
| const mid = Math.floor(s.length / 2); | ||
| return s.length % 2 === 0 ? ((s[mid - 1] ?? 0) + (s[mid] ?? 0)) / 2 : (s[mid] ?? 0); | ||
| } | ||
| function pctChange(base, value) { | ||
| if (base === 0) | ||
| return 0; | ||
| return ((value - base) / base) * 100; | ||
| } | ||
| function fmtUsd(v) { | ||
| return v.toFixed(2); | ||
| } | ||
| function shortPath(p) { | ||
| const parts = p.split(/[\\/]/); | ||
| return parts.slice(-2).join("/"); | ||
| } | ||
| //# sourceMappingURL=runToday.js.map |
| {"version":3,"file":"runToday.js","sourceRoot":"","sources":["../../../src/modules/today/runToday.ts"],"names":[],"mappings":"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"} |
| /** | ||
| * `get_today_summary` / `sipcode today` — public types. | ||
| * | ||
| * Schema is part of the public contract from v1.6.10 (or whatever patch this | ||
| * lands in). Renames are breaking changes. | ||
| */ | ||
| export type TodayStatus = "ok" | "no-sessions-today" | "no-baseline" | "no-data"; | ||
| export interface TodayLeak { | ||
| readonly kind: "duplicate-reads" | "idle-context" | "other"; | ||
| readonly description: string; | ||
| readonly costUSD: number; | ||
| } | ||
| export interface TodayBlock { | ||
| readonly dateLocal: string; | ||
| readonly sessionCount: number; | ||
| readonly totalSpendUSD: number; | ||
| readonly totalTokens: number; | ||
| readonly outputRatioPct: number; | ||
| readonly topLeak: TodayLeak | null; | ||
| } | ||
| export interface TodayBaseline { | ||
| readonly windowDays: number; | ||
| readonly isPartial: boolean; | ||
| readonly medianSpendPerDayUSD: number; | ||
| readonly medianTokensPerDay: number; | ||
| readonly medianOutputRatioPct: number; | ||
| } | ||
| export interface TodayComparison { | ||
| readonly spendDeltaPct: number; | ||
| readonly tokenDeltaPct: number; | ||
| /** Points (NOT percent): outputRatioPct(today) - outputRatioPct(baseline). */ | ||
| readonly outputRatioDeltaPp: number; | ||
| } | ||
| export interface TodayReport { | ||
| readonly schemaVersion: "sipcode-today/1"; | ||
| readonly status: TodayStatus; | ||
| readonly today: TodayBlock | null; | ||
| readonly baseline: TodayBaseline | null; | ||
| readonly comparison: TodayComparison | null; | ||
| readonly headline: string; | ||
| } | ||
| //# sourceMappingURL=types.d.ts.map |
| {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/modules/today/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,WAAW,GACnB,IAAI,GACJ,mBAAmB,GACnB,aAAa,GACb,SAAS,CAAC;AAEd,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,iBAAiB,GAAG,cAAc,GAAG,OAAO,CAAC;IAC5D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,SAAS,GAAG,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;CACvC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,8EAA8E;IAC9E,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B"} |
| /** | ||
| * `get_today_summary` / `sipcode today` — public types. | ||
| * | ||
| * Schema is part of the public contract from v1.6.10 (or whatever patch this | ||
| * lands in). Renames are breaking changes. | ||
| */ | ||
| export {}; | ||
| //# sourceMappingURL=types.js.map |
| {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/modules/today/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"} |
| /** | ||
| * `sipcode trend` — single-metric time-series across a window. | ||
| * | ||
| * Different from `sipcode stats` (which shows totals): trend tracks ONE | ||
| * metric per day, designed to be robust to session-length variance and | ||
| * project-mix variance. The single most-useful metric per the v1.2.2 | ||
| * post-launch reader: `output_ratio` (output_tokens / total_tokens). If | ||
| * Sipcode is working, this trends UP across the next month even as your | ||
| * project mix changes. | ||
| * | ||
| * Pure compute. Loaders, formatters, and the CLI handler live in sibling | ||
| * files. Mirrors stats/ module layout. | ||
| */ | ||
| export type TrendMetric = "output-ratio" | "cost-per-session" | "recoverable-tokens-per-session"; | ||
| export interface TrendSession { | ||
| /** ISO date when the session started (used to bucket by day). */ | ||
| readonly startedAt: string; | ||
| readonly totalTokens: number; | ||
| readonly outputTokens: number; | ||
| readonly estCostUSD: number; | ||
| /** Tokens that could have been recovered by re-read dedup. */ | ||
| readonly duplicateReadTokens: number; | ||
| } | ||
| export interface TrendDay { | ||
| readonly date: string; | ||
| readonly sessions: number; | ||
| readonly value: number; | ||
| /** Sum of the metric numerator (e.g. output tokens) for inspection. */ | ||
| readonly numerator: number; | ||
| /** Sum of the metric denominator (e.g. total tokens) for inspection. */ | ||
| readonly denominator: number; | ||
| } | ||
| export interface TrendResult { | ||
| readonly metric: TrendMetric; | ||
| readonly window: { | ||
| since: string; | ||
| until: string; | ||
| }; | ||
| readonly days: TrendDay[]; | ||
| /** Median value across days, ignoring empty days. */ | ||
| readonly median: number; | ||
| /** Sloped %/day (positive = improving for ratio, negative for cost). */ | ||
| readonly slopePerDay: number; | ||
| /** Plain-language verdict for terminal display. */ | ||
| readonly verdict: TrendVerdict; | ||
| } | ||
| export type TrendVerdict = "insufficient-data" | "improving" | "stable" | "regressing"; | ||
| /** Minimum non-empty days needed to compute a slope. */ | ||
| export declare const MIN_DAYS_FOR_SLOPE = 5; | ||
| export declare function computeTrend(sessions: ReadonlyArray<TrendSession>, metric: TrendMetric, since: string, until: string): TrendResult; | ||
| /** Inclusive ISO day enumeration. Pure. */ | ||
| export declare function enumerateDays(since: string, until: string): string[]; | ||
| //# sourceMappingURL=compute.d.ts.map |
| {"version":3,"file":"compute.d.ts","sourceRoot":"","sources":["../../../src/modules/trend/compute.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,WAAW,GACnB,cAAc,GACd,kBAAkB,GAClB,gCAAgC,CAAC;AAErC,MAAM,WAAW,YAAY;IAC3B,iEAAiE;IACjE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,8DAA8D;IAC9D,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;CACtC;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,uEAAuE;IACvE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,wEAAwE;IACxE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC1B,qDAAqD;IACrD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,wEAAwE;IACxE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,mDAAmD;IACnD,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;CAChC;AAED,MAAM,MAAM,YAAY,GACpB,mBAAmB,GACnB,WAAW,GACX,QAAQ,GACR,YAAY,CAAC;AAEjB,wDAAwD;AACxD,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAKpC,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAC,EACrC,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,WAAW,CAeb;AAkDD,2CAA2C;AAC3C,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CASpE"} |
| /** | ||
| * `sipcode trend` — single-metric time-series across a window. | ||
| * | ||
| * Different from `sipcode stats` (which shows totals): trend tracks ONE | ||
| * metric per day, designed to be robust to session-length variance and | ||
| * project-mix variance. The single most-useful metric per the v1.2.2 | ||
| * post-launch reader: `output_ratio` (output_tokens / total_tokens). If | ||
| * Sipcode is working, this trends UP across the next month even as your | ||
| * project mix changes. | ||
| * | ||
| * Pure compute. Loaders, formatters, and the CLI handler live in sibling | ||
| * files. Mirrors stats/ module layout. | ||
| */ | ||
| /** Minimum non-empty days needed to compute a slope. */ | ||
| export const MIN_DAYS_FOR_SLOPE = 5; | ||
| /** Window threshold (in absolute value of slopePerDay) for stable verdict. */ | ||
| const STABLE_SLOPE_MAGNITUDE = 0.001; | ||
| export function computeTrend(sessions, metric, since, until) { | ||
| const days = bucketByDay(sessions, metric, since, until); | ||
| const nonEmpty = days.filter((d) => d.sessions > 0); | ||
| const median = computeMedian(nonEmpty.map((d) => d.value)); | ||
| const slopePerDay = nonEmpty.length >= MIN_DAYS_FOR_SLOPE ? linearSlope(nonEmpty) : 0; | ||
| const verdict = decideVerdict(nonEmpty.length, slopePerDay, metric); | ||
| return { | ||
| metric, | ||
| window: { since, until }, | ||
| days, | ||
| median, | ||
| slopePerDay, | ||
| verdict, | ||
| }; | ||
| } | ||
| function bucketByDay(sessions, metric, since, until) { | ||
| const buckets = new Map(); | ||
| for (const day of enumerateDays(since, until)) { | ||
| buckets.set(day, { num: 0, den: 0, sessions: 0 }); | ||
| } | ||
| for (const s of sessions) { | ||
| const day = s.startedAt.slice(0, 10); | ||
| const b = buckets.get(day); | ||
| if (!b) | ||
| continue; | ||
| b.sessions += 1; | ||
| switch (metric) { | ||
| case "output-ratio": | ||
| b.num += s.outputTokens; | ||
| b.den += s.totalTokens; | ||
| break; | ||
| case "cost-per-session": | ||
| b.num += s.estCostUSD; | ||
| b.den += 1; // per session | ||
| break; | ||
| case "recoverable-tokens-per-session": | ||
| b.num += s.duplicateReadTokens; | ||
| b.den += 1; | ||
| break; | ||
| } | ||
| } | ||
| const out = []; | ||
| for (const [date, b] of buckets) { | ||
| const value = b.den > 0 ? b.num / b.den : 0; | ||
| out.push({ | ||
| date, | ||
| sessions: b.sessions, | ||
| value, | ||
| numerator: b.num, | ||
| denominator: b.den, | ||
| }); | ||
| } | ||
| out.sort((a, b) => a.date.localeCompare(b.date)); | ||
| return out; | ||
| } | ||
| /** Inclusive ISO day enumeration. Pure. */ | ||
| export function enumerateDays(since, until) { | ||
| const out = []; | ||
| const s = isoToTime(since); | ||
| const u = isoToTime(until); | ||
| if (s > u) | ||
| return out; | ||
| for (let t = s; t <= u; t += 86_400_000) { | ||
| out.push(toIso(t)); | ||
| } | ||
| return out; | ||
| } | ||
| function isoToTime(iso) { | ||
| return Date.parse(iso + "T00:00:00Z"); | ||
| } | ||
| function toIso(ms) { | ||
| return new Date(ms).toISOString().slice(0, 10); | ||
| } | ||
| function computeMedian(xs) { | ||
| if (xs.length === 0) | ||
| return 0; | ||
| const s = [...xs].sort((a, b) => a - b); | ||
| const mid = Math.floor(s.length / 2); | ||
| return s.length % 2 === 0 ? ((s[mid - 1] ?? 0) + (s[mid] ?? 0)) / 2 : s[mid] ?? 0; | ||
| } | ||
| /** Linear-regression slope using least squares. Pure. */ | ||
| function linearSlope(days) { | ||
| const n = days.length; | ||
| if (n < 2) | ||
| return 0; | ||
| let sumX = 0; | ||
| let sumY = 0; | ||
| let sumXY = 0; | ||
| let sumXX = 0; | ||
| for (let i = 0; i < n; i++) { | ||
| const x = i; | ||
| const y = days[i].value; | ||
| sumX += x; | ||
| sumY += y; | ||
| sumXY += x * y; | ||
| sumXX += x * x; | ||
| } | ||
| const meanX = sumX / n; | ||
| const meanY = sumY / n; | ||
| const denom = sumXX - n * meanX * meanX; | ||
| if (denom === 0) | ||
| return 0; | ||
| return (sumXY - n * meanX * meanY) / denom; | ||
| } | ||
| function decideVerdict(daysWithData, slope, metric) { | ||
| if (daysWithData < MIN_DAYS_FOR_SLOPE) | ||
| return "insufficient-data"; | ||
| if (Math.abs(slope) < STABLE_SLOPE_MAGNITUDE) | ||
| return "stable"; | ||
| // For output-ratio: higher = better (more output per total). Positive slope = improving. | ||
| // For cost-per-session: lower = better. Negative slope = improving. | ||
| // For recoverable-tokens-per-session: lower = better. Negative slope = improving. | ||
| const higherIsBetter = metric === "output-ratio"; | ||
| if (higherIsBetter) | ||
| return slope > 0 ? "improving" : "regressing"; | ||
| return slope < 0 ? "improving" : "regressing"; | ||
| } | ||
| //# sourceMappingURL=compute.js.map |
| {"version":3,"file":"compute.js","sourceRoot":"","sources":["../../../src/modules/trend/compute.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AA6CH,wDAAwD;AACxD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAEpC,8EAA8E;AAC9E,MAAM,sBAAsB,GAAG,KAAK,CAAC;AAErC,MAAM,UAAU,YAAY,CAC1B,QAAqC,EACrC,MAAmB,EACnB,KAAa,EACb,KAAa;IAEb,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,kBAAkB,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtF,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAEpE,OAAO;QACL,MAAM;QACN,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;QACxB,IAAI;QACJ,MAAM;QACN,WAAW;QACX,OAAO;KACR,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAClB,QAAqC,EACrC,MAAmB,EACnB,KAAa,EACb,KAAa;IAEb,MAAM,OAAO,GAAG,IAAI,GAAG,EAGpB,CAAC;IACJ,KAAK,MAAM,GAAG,IAAI,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACrC,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC;QAChB,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,cAAc;gBACjB,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,YAAY,CAAC;gBACxB,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,WAAW,CAAC;gBACvB,MAAM;YACR,KAAK,kBAAkB;gBACrB,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,UAAU,CAAC;gBACtB,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,cAAc;gBAC1B,MAAM;YACR,KAAK,gCAAgC;gBACnC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,mBAAmB,CAAC;gBAC/B,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;gBACX,MAAM;QACV,CAAC;IACH,CAAC;IACD,MAAM,GAAG,GAAe,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,GAAG,CAAC,IAAI,CAAC;YACP,IAAI;YACJ,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,KAAK;YACL,SAAS,EAAE,CAAC,CAAC,GAAG;YAChB,WAAW,EAAE,CAAC,CAAC,GAAG;SACnB,CAAC,CAAC;IACL,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACjD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,KAAa;IACxD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC3B,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC3B,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC;QACxC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,YAAY,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,aAAa,CAAC,EAAY;IACjC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACpF,CAAC;AAED,yDAAyD;AACzD,SAAS,WAAW,CAAC,IAA6B;IAChD,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACtB,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACpB,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,CAAC;QACZ,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC;QACzB,IAAI,IAAI,CAAC,CAAC;QACV,IAAI,IAAI,CAAC,CAAC;QACV,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC;IACvB,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC;IACvB,MAAM,KAAK,GAAG,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC;IACxC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1B,OAAO,CAAC,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC;AAC7C,CAAC;AAED,SAAS,aAAa,CACpB,YAAoB,EACpB,KAAa,EACb,MAAmB;IAEnB,IAAI,YAAY,GAAG,kBAAkB;QAAE,OAAO,mBAAmB,CAAC;IAClE,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,sBAAsB;QAAE,OAAO,QAAQ,CAAC;IAC9D,yFAAyF;IACzF,oEAAoE;IACpE,kFAAkF;IAClF,MAAM,cAAc,GAAG,MAAM,KAAK,cAAc,CAAC;IACjD,IAAI,cAAc;QAAE,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC;IAClE,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC;AAChD,CAAC"} |
| /** | ||
| * JSON renderer for `sipcode trend --json`. Pure. | ||
| * | ||
| * Schema is part of the public contract from v1.6.9 onward. Versioned. | ||
| */ | ||
| import type { TrendResult } from "./compute.js"; | ||
| export declare function formatTrendJson(result: TrendResult): string; | ||
| //# sourceMappingURL=format-json.d.ts.map |
| {"version":3,"file":"format-json.d.ts","sourceRoot":"","sources":["../../../src/modules/trend/format-json.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAc3D"} |
| export function formatTrendJson(result) { | ||
| return JSON.stringify({ | ||
| schemaVersion: "sipcode-trend/1", | ||
| metric: result.metric, | ||
| window: result.window, | ||
| verdict: result.verdict, | ||
| median: result.median, | ||
| slopePerDay: result.slopePerDay, | ||
| days: result.days, | ||
| }, null, 2); | ||
| } | ||
| //# sourceMappingURL=format-json.js.map |
| {"version":3,"file":"format-json.js","sourceRoot":"","sources":["../../../src/modules/trend/format-json.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,eAAe,CAAC,MAAmB;IACjD,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,aAAa,EAAE,iBAAiB;QAChC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,IAAI,EAAE,MAAM,CAAC,IAAI;KAClB,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC"} |
| import type { TrendResult } from "./compute.js"; | ||
| export declare function formatTrendTerminal(result: TrendResult): string; | ||
| //# sourceMappingURL=format-terminal.d.ts.map |
| {"version":3,"file":"format-terminal.d.ts","sourceRoot":"","sources":["../../../src/modules/trend/format-terminal.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAA6B,MAAM,cAAc,CAAC;AAE3E,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAoB/D"} |
| /** | ||
| * Terminal renderer for `sipcode trend`. Pure. | ||
| * | ||
| * Shows: title, plain-language verdict, sparkline, per-day stats footer. | ||
| * No color/emoji in the test path; we add chalk in the command handler. | ||
| */ | ||
| import { sparkline, sparklineStats } from "../stats/sparkline.js"; | ||
| export function formatTrendTerminal(result) { | ||
| const lines = []; | ||
| const title = metricTitle(result.metric); | ||
| lines.push(`sipcode trend · ${title}`); | ||
| lines.push(""); | ||
| const verdictLine = verdictSentence(result.verdict, result.metric, result.slopePerDay); | ||
| lines.push(` ${verdictLine}`); | ||
| lines.push(""); | ||
| const values = result.days.map((d) => d.value); | ||
| const spark = sparkline(values, 30); | ||
| lines.push(` ${result.window.since} → ${result.window.until}`); | ||
| lines.push(` ${spark}`); | ||
| const stats = sparklineStats(values); | ||
| lines.push(` min ${fmtMetric(stats.min, result.metric)} · median ${fmtMetric(stats.median, result.metric)} · max ${fmtMetric(stats.max, result.metric)}`); | ||
| lines.push(""); | ||
| lines.push(` total sessions across window: ${result.days.reduce((a, d) => a + d.sessions, 0)}`); | ||
| return lines.join("\n"); | ||
| } | ||
| function metricTitle(m) { | ||
| switch (m) { | ||
| case "output-ratio": | ||
| return "output ratio (output tokens / total tokens, higher = leaner context)"; | ||
| case "cost-per-session": | ||
| return "cost per session (USD, lower = better)"; | ||
| case "recoverable-tokens-per-session": | ||
| return "recoverable tokens per session (duplicate reads, lower = better)"; | ||
| } | ||
| } | ||
| function verdictSentence(verdict, metric, slopePerDay) { | ||
| switch (verdict) { | ||
| case "insufficient-data": | ||
| return "insufficient data — need at least 5 days with sessions to compute a trend."; | ||
| case "stable": | ||
| return "stable — no measurable change in the window."; | ||
| case "improving": { | ||
| const direction = metric === "output-ratio" ? "up" : "down"; | ||
| return `improving — trending ${direction} ${fmtSlope(slopePerDay, metric)} per day.`; | ||
| } | ||
| case "regressing": { | ||
| const direction = metric === "output-ratio" ? "down" : "up"; | ||
| return `regressing — trending ${direction} ${fmtSlope(slopePerDay, metric)} per day.`; | ||
| } | ||
| } | ||
| } | ||
| function fmtMetric(v, m) { | ||
| switch (m) { | ||
| case "output-ratio": | ||
| return `${(v * 100).toFixed(1)}%`; | ||
| case "cost-per-session": | ||
| return `$${v.toFixed(4)}`; | ||
| case "recoverable-tokens-per-session": | ||
| return v.toLocaleString("en-US"); | ||
| } | ||
| } | ||
| function fmtSlope(slope, m) { | ||
| const abs = Math.abs(slope); | ||
| switch (m) { | ||
| case "output-ratio": | ||
| return `${(abs * 100).toFixed(2)} pp`; | ||
| case "cost-per-session": | ||
| return `$${abs.toFixed(4)}`; | ||
| case "recoverable-tokens-per-session": | ||
| return Math.round(abs).toLocaleString("en-US") + " tokens"; | ||
| } | ||
| } | ||
| //# sourceMappingURL=format-terminal.js.map |
| {"version":3,"file":"format-terminal.js","sourceRoot":"","sources":["../../../src/modules/trend/format-terminal.ts"],"names":[],"mappings":"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"} |
+35
-0
@@ -123,2 +123,37 @@ #!/usr/bin/env node | ||
| program | ||
| .command("today") | ||
| .description("Daily dashboard: spend so far + vs your N-day median (adaptive 30/14/7/3).") | ||
| .option("--json", "machine-readable output") | ||
| .option("--agent <id>", "claude-code | cursor | auto") | ||
| .action(async (opts) => { | ||
| const { runTodayCmd } = await import("./commands/today.js"); | ||
| const r = await runTodayCmd(opts); | ||
| if (r?.exitCode) | ||
| process.exit(r.exitCode); | ||
| }); | ||
| program | ||
| .command("forecast") | ||
| .description("Projected month-end spend with confidence band + last-month comparison.") | ||
| .option("--json", "machine-readable output") | ||
| .option("--agent <id>", "claude-code | cursor | auto") | ||
| .action(async (opts) => { | ||
| const { runForecastCmd } = await import("./commands/forecast.js"); | ||
| const r = await runForecastCmd(opts); | ||
| if (r?.exitCode) | ||
| process.exit(r.exitCode); | ||
| }); | ||
| program | ||
| .command("trend") | ||
| .description("Track ONE metric over time (output ratio, cost/session, recoverable tokens) — answers 'is this getting better?'.") | ||
| .option("--metric <name>", "output-ratio | cost-per-session | recoverable-tokens-per-session", "output-ratio") | ||
| .option("--since <window>", "time window: NNd | NNw | NNm (e.g. 30d, 4w, 3m)", "30d") | ||
| .option("--json", "machine-readable output") | ||
| .option("--agent <id>", "which agent to source transcripts from: claude-code | cursor | auto") | ||
| .action(async (opts) => { | ||
| const { runTrend } = await import("./commands/trend.js"); | ||
| const r = await runTrend(opts); | ||
| if (r?.exitCode) | ||
| process.exit(r.exitCode); | ||
| }); | ||
| program | ||
| .command("score") | ||
@@ -125,0 +160,0 @@ .description("Audit how agent-friendly this codebase is (0-100, tiered badge).") |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/commands/proxy.ts"],"names":[],"mappings":"AA8BA,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC5D,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;CAC1B;AAED,wBAAsB,QAAQ,CAC5B,IAAI,GAAE,YAAiB,EACvB,IAAI,GAAE,SAAc,GACnB,OAAO,CAAC,WAAW,CAAC,CA2GtB"} | ||
| {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/commands/proxy.ts"],"names":[],"mappings":"AA+BA,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC5D,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;CAC1B;AAED,wBAAsB,QAAQ,CAC5B,IAAI,GAAE,YAAiB,EACvB,IAAI,GAAE,SAAc,GACnB,OAAO,CAAC,WAAW,CAAC,CA4GtB"} |
@@ -20,3 +20,3 @@ /** | ||
| import { parseSettings, renderSettings } from "../modules/hygiene/settingsJson.js"; | ||
| import { installProxyHook, uninstallProxyHook, proxyHookScriptPath, runRewriterModuleUrl, hookReadDedupModuleUrl, } from "../modules/proxy/install.js"; | ||
| import { installProxyHook, uninstallProxyHook, proxyHookScriptPath, runRewriterModuleUrl, hookReadDedupModuleUrl, hookAstReadModuleUrl, } from "../modules/proxy/install.js"; | ||
| import { generateProxyHookScript } from "../modules/proxy/proxyHookScript.js"; | ||
@@ -85,3 +85,3 @@ import { readReport } from "../modules/proxy/stats-store.js"; | ||
| const nextSettings = renderSettings(nextObj); | ||
| const newScript = generateProxyHookScript(runRewriterModuleUrl(), hookReadDedupModuleUrl()); | ||
| const newScript = generateProxyHookScript(runRewriterModuleUrl(), hookReadDedupModuleUrl(), hookAstReadModuleUrl()); | ||
| const existingScript = await readFile(scriptPath); | ||
@@ -88,0 +88,0 @@ const settingsChanged = existingRaw !== nextSettings; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/commands/proxy.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/commands/proxy.ts"],"names":[],"mappings":"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"} |
+42
-0
@@ -299,2 +299,20 @@ #!/usr/bin/env node | ||
| } | ||
| async function toolGetTodaySummary() { | ||
| const { runTodayCmd } = await import("../commands/today.js"); | ||
| const buf = []; | ||
| const errs = []; | ||
| const r = await runTodayCmd({ json: true }, { stdout: (s) => buf.push(s), stderr: (s) => errs.push(s) }); | ||
| if (r.exitCode !== 0) | ||
| return fail(errs.join("\n") || "today failed"); | ||
| return ok(buf.join("\n")); | ||
| } | ||
| async function toolForecastMonthlySpend() { | ||
| const { runForecastCmd } = await import("../commands/forecast.js"); | ||
| const buf = []; | ||
| const errs = []; | ||
| const r = await runForecastCmd({ json: true }, { stdout: (s) => buf.push(s), stderr: (s) => errs.push(s) }); | ||
| if (r.exitCode !== 0) | ||
| return fail(errs.join("\n") || "forecast failed"); | ||
| return ok(buf.join("\n")); | ||
| } | ||
| async function toolGetAgentScore(cwd) { | ||
@@ -492,2 +510,20 @@ const { runScoreCmd } = await import("../commands/score.js"); | ||
| { | ||
| name: "get_today_summary", | ||
| description: "Daily dashboard — answers 'how am I doing today?' Returns spend so far today, sessions count, output ratio, and a comparison to the user's adaptive N-day median (cascades 30→14→7→3 based on available history). Includes a one-paragraph headline plus structured fields. Status field: ok | no-sessions-today | no-baseline | no-data. Use this when the user asks 'how am I doing today?', 'what have I spent today?', or 'how's my Claude usage looking?'.", | ||
| inputSchema: { | ||
| type: "object", | ||
| properties: {}, | ||
| }, | ||
| schema: z.object({}), | ||
| }, | ||
| { | ||
| name: "forecast_monthly_spend", | ||
| description: "Projects month-end Claude spend at the user's current trajectory (last 14 or 7 days, adaptive). Returns avg + median daily spend, projected month-end total with an honest confidence band (±1σ daily-spend stdev, capped at ±20% of projection), spend-so-far this month, and an optional comparison to last month's actual spend. Status field: ok | insufficient-data | near-month-end | no-recent-activity | no-data. Use this when the user asks 'how much will I spend this month?', 'am I on track?', or 'how does this month compare to last?'.", | ||
| inputSchema: { | ||
| type: "object", | ||
| properties: {}, | ||
| }, | ||
| schema: z.object({}), | ||
| }, | ||
| { | ||
| name: "get_drift_report", | ||
@@ -592,2 +628,8 @@ description: "Detect context/cost drift: whether the user's recent Claude Code sessions regressed (cost/turn up, cache-hit-rate down, re-read waste up) vs their own baseline. Returns JSON. Use when the user asks 'is my agent getting more expensive / sloppier?' or 'has anything regressed?'.", | ||
| } | ||
| case "get_today_summary": { | ||
| return await withTimeout(name, 10_000, toolGetTodaySummary()); | ||
| } | ||
| case "forecast_monthly_spend": { | ||
| return await withTimeout(name, 10_000, toolForecastMonthlySpend()); | ||
| } | ||
| default: | ||
@@ -594,0 +636,0 @@ return fail(`Tool ${name} is registered but has no handler.`); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAClE,KAAK,iBAAiB,CAAC;AAEvB,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GAEvB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EACL,eAAe,EACf,eAAe,EACf,kBAAkB,GACnB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,mDAAmD,CAAC;AAC1F,OAAO,EAAE,kBAAkB,EAAE,MAAM,gDAAgD,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAC;AACtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,mDAAmD,CAAC;AAC1F,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,UAAU,IAAI,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAE5E,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,4BAA4B;AAE5B,OAAO,EAAE,YAAY,IAAI,aAAa,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,EAAE,aAAa,IAAI,cAAc,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,IAAI,IAAI,KAAK,EAAE,MAAM,WAAW,CAAC;AAE/D,MAAM,WAAW,GAAG,SAAS,CAAC;AAC9B,MAAM,UAAU,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7D,MAAM,cAAc,GAAI,IAAI,CAAC,KAAK,CAChC,aAAa,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAC9C,CAAC,OAAO,CAAC;AAElC,oBAAoB;AAEpB,KAAK,UAAU,cAAc,CAAC,EAAkB,EAAE,QAAgB;IAChE,OAAO,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,EAAE,CAAC,IAAY;IACtB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED,SAAS,IAAI,CAAC,OAAe;IAC3B,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC1C,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAED,iCAAiC;AAEjC,KAAK,UAAU,uBAAuB,CAAC,IAAsC;IAC3E,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;IACnE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IAC5D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IAE5C,sEAAsE;IACtE,yEAAyE;IACzE,wDAAwD;IACxD,oEAAoE;IACpE,+DAA+D;IAC/D,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,SAAS,SAAS,CAAC,CAAS;QAC1B,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,WAAW,GAAuB,IAAI,CAAC,GAAG,CAAC;IAC/C,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,6DAA6D;QAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC3B,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,sEAAsE;YACtE,oEAAoE;YACpE,qEAAqE;YACrE,mEAAmE;YACnE,oEAAoE;YACpE,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;YAC3D,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC5B,IAAI,OAAO,GAAa,EAAE,CAAC;gBAC3B,IAAI,CAAC;oBACH,OAAO,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;gBACrC,CAAC;gBAAC,MAAM,CAAC;oBACP,uBAAuB;gBACzB,CAAC;gBACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;oBAC5B,iEAAiE;oBACjE,iEAAiE;oBACjE,oCAAoC;oBACpC,MAAM,OAAO,GACX,OAAO,CAAC,QAAQ,KAAK,OAAO;wBAC1B,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC;wBAC7D,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;oBACrC,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;wBACvB,WAAW,GAAG,OAAO,CAAC;wBACtB,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,gEAAgE;IAChE,gEAAgE;IAChE,8CAA8C;IAC9C,MAAM,QAAQ,GAAG,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAE9C,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,MAAM,OAAO,GAAgD;QAC3D,IAAI,EAAE,IAAI;QACV,GAAG,EAAE,QAAQ;KACd,CAAC;IACF,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACzD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE;QAC7C,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE;YACZ,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC;QACvB,CAAC;QACD,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE;YACZ,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC;QACvB,CAAC;KACF,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAExD,0EAA0E;IAC1E,wEAAwE;IACxE,8CAA8C;IAC9C,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG;YACjB,EAAE;YACF,KAAK;YACL,2DAA2D;YAC3D,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,EAAE;YACF,cAAc;YACd,mFAAmF;YACnF,kGAAkG;YAClG,uFAAuF;SACxF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,UAAU,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,KAAK,UAAU,kBAAkB;IAC/B,MAAM,KAAK,GAAG;QACZ,YAAY,cAAc,EAAE;QAC5B,eAAe,WAAW,EAAE;QAC5B,SAAS,OAAO,CAAC,OAAO,EAAE;QAC1B,aAAa,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE;QAC/C,qBAAqB,SAAS,CAAC,MAAM,EAAE;QACvC,EAAE;QACF,kBAAkB;QAClB,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACxC,EAAE;QACF,4CAA4C;QAC5C,6CAA6C;KAC9C,CAAC;IACF,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,KAAa;IACjD,MAAM,EAAE,GAAG,IAAI,cAAc,EAAE,CAAC;IAChC,MAAM,GAAG,GAAG,IAAI,cAAc,EAAE,CAAC;IACjC,MAAM,WAAW,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC,uCAAuC,WAAW,GAAG,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACrC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC,oBAAoB,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC1B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/C,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACtC,OAAO,GAAG,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,WAAW,KAAK,EAAE,IAAI,CAAC;IAC1E,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,CACP,SAAS,QAAQ,CAAC,MAAM,wBAAwB,GAAG,CAAC,MAAM,oBAAoB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACjG,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,IAA4B;IAE5B,MAAM,EAAE,GAAG,IAAI,cAAc,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,IAAI,SAAS,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,cAAc,EAAE,CAAC;IAEjC,MAAM,WAAW,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC,uCAAuC,WAAW,GAAG,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IACxD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAEhE,IAAI,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACrE,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,uBAAuB,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;QACnE,MAAM,GAAG,KAAK,CAAC;IACjB,CAAC;IACD,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAElD,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,cAAc,CAAC,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,+BAA+B,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAE7D,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS;QACnC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;QAC7B,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IAChB,MAAM,OAAO,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;IAErD,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAErD,MAAM,MAAM,GAAG,YAAY,CAAC;QAC1B,OAAO;QACP,MAAM;QACN,UAAU,EAAE,IAAI;QAChB,IAAI;QACJ,YAAY,EAAE,KAAK;QACnB,cAAc,EAAE,OAAO;QACvB,MAAM;QACN,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,WAAW,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE;KAC9C,CAAC,CAAC;IAEH,OAAO,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,IAErC;IACC,MAAM,EAAE,GAAG,IAAI,cAAc,EAAE,CAAC;IAChC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC;IAC3B,MAAM,YAAY,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,uBAAuB,CAAC;IAC/E,IAAI,MAAM,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAChD,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;QAChC,CAAC;IACH,CAAC;IAED,oEAAoE;IACpE,sEAAsE;IACtE,4DAA4D;IAC5D,OAAO,IAAI,CACT,kBAAkB,YAAY,iFAAiF,CAChH,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,IAGnC;IACC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,OAAO,IAAI,CAAC,iDAAiD,CAAC,CAAC;IACjE,CAAC;IACD,oEAAoE;IACpE,mEAAmE;IACnE,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,MAAM,WAAW,CAC9B,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAC9C;QACE,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAClC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;KACpC,CACF,CAAC;IACF,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED,KAAK,UAAU,iBAAiB;IAC9B,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,iCAAiC,CAAC,CAAC;IACvE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;IACrC,OAAO,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,KAAK,UAAU,kBAAkB;IAC/B,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IACjE,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,eAAe,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9E,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,GAAW;IAC1C,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAC7D,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,CAAC,GAAG,MAAM,WAAW,CACzB,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAChC,EAAE,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,EAAE,CACvG,CAAC;IACF,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,CAAC;IACrE,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED,KAAK,UAAU,mBAAmB;IAChC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,CAAC,GAAG,MAAM,QAAQ,CACtB,EAAE,IAAI,EAAE,IAAI,EAAE,EACd,EAAE,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,EAAE,CACvG,CAAC;IACF,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,CAAC;IACrE,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC7B,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1E,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,0BAA0B,CAAC,CAAC;AAC1D,CAAC;AAED,KAAK,UAAU,kBAAkB;IAC/B,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,QAAQ,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC5E,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,4BAA4B,CAAC,CAAC;AAC5D,CAAC;AAED,KAAK,UAAU,kBAAkB;IAC/B,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,QAAQ,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC3D,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,iCAAiC,CAAC,CAAC;IACvE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;IAC5E,OAAO,EAAE,CACP,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,MAAM,CAAC,gBAAgB,0BAA0B,MAAM,CAAC,oBAAoB,cAAc,CACpI,CAAC;AACJ,CAAC;AAED,0BAA0B;AAE1B,MAAM,SAAS,GAAG;IAChB;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EACT,oRAAoR;QACtR,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE;SACf;QACD,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;KACrB;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EACT,iaAAia;QACna,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,GAAG,EAAE;oBACH,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,oHAAoH;iBACvH;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,iGAAiG;iBACpG;aACF;SACF;QACD,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;YACjC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,QAAQ,EAAE;SAC1D,CAAC;KACH;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EACT,uSAAuS;QACzS,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,yCAAyC;iBACvD;aACF;SACF;QACD,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;SACvD,CAAC;KACH;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EACT,8jBAA8jB;QAChkB,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,2HAA2H;iBAC9H;aACF;SACF;QACD,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;SACzC,CAAC;KACH;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EACT,+YAA+Y;QACjZ,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,GAAG,EAAE;oBACH,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,mFAAmF;iBACtF;aACF;YACD,QAAQ,EAAE,CAAC,KAAK,CAAC;SAClB;QACD,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;SACvB,CAAC;KACH;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EACT,8QAA8Q;QAChR,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,iGAAiG;iBACpG;gBACD,GAAG,EAAE;oBACH,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,8FAA8F;iBACjG;aACF;YACD,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;SAC1B;QACD,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACvB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;SACvB,CAAC;KACH;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACT,kNAAkN;QACpN,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE;SACf;QACD,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;KACrB;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACT,mNAAmN;QACrN,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,GAAG,EAAE;oBACH,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,6CAA6C;iBAC3D;aACF;YACD,QAAQ,EAAE,CAAC,KAAK,CAAC;SAClB;QACD,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7C;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,WAAW,EACT,qPAAqP;QACvP,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;QAC/C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;KACrB;IACD;QACE,IAAI,EAAE,eAAe;QACrB,WAAW,EACT,sSAAsS;QACxS,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;QAC/C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;KACrB;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACT,iKAAiK;QACnK,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;QAC/C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;KACrB;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EACT,yIAAyI;QAC3I,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;QAC/C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;KACrB;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EACT,sRAAsR;QACxR,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;QAC/C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;KACrB;CACO,CAAC;AAEX,+BAA+B;AAE/B,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;IACE,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,cAAc;CACxB,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;CACF,CACF,CAAC;AAEF,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;IAC1D,OAAO;QACL,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3B,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,WAAW,EAAE,CAAC,CAAC,WAAW;SAC3B,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;IAC5D,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;IAChD,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACnD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,IAAI,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IACnD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,IAAI,CACT,yBAAyB,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,MAAM;aAClD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;aAC/C,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAA+B,CAAC;IAEpD,IAAI,CAAC;QACH,+DAA+D;QAC/D,+DAA+D;QAC/D,8DAA8D;QAC9D,+DAA+D;QAC/D,6DAA6D;QAC7D,6BAA6B;QAC7B,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACxB,OAAO,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC9D,CAAC;YACD,KAAK,uBAAuB,CAAC,CAAC,CAAC;gBAC7B,MAAM,UAAU,GAAqC,EAAE,CAAC;gBACxD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAuB,CAAC;gBACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAuB,CAAC;gBACrD,IAAI,MAAM,KAAK,SAAS;oBAAE,UAAU,CAAC,GAAG,GAAG,MAAM,CAAC;gBAClD,IAAI,QAAQ,KAAK,SAAS;oBAAE,UAAU,CAAC,KAAK,GAAG,QAAQ,CAAC;gBACxD,OAAO,MAAM,WAAW,CACtB,IAAI,EACJ,MAAM,EACN,uBAAuB,CAAC,UAAU,CAAC,EACnC,iMAAiM,CAClM,CAAC;YACJ,CAAC;YACD,KAAK,sBAAsB,CAAC,CAAC,CAAC;gBAC5B,MAAM,KAAK,GAAI,IAAI,CAAC,OAAO,CAAwB,IAAI,EAAE,CAAC;gBAC1D,OAAO,MAAM,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC;YACxE,CAAC;YACD,KAAK,sBAAsB,CAAC,CAAC,CAAC;gBAC5B,MAAM,IAAI,GAA2B,EAAE,CAAC;gBACxC,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAuB,CAAC;gBACrD,IAAI,GAAG,KAAK,SAAS;oBAAE,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;gBAC5C,OAAO,MAAM,WAAW,CACtB,IAAI,EACJ,MAAM,EACN,sBAAsB,CAAC,IAAI,CAAC,EAC5B,sIAAsI,CACvI,CAAC;YACJ,CAAC;YACD,KAAK,sBAAsB,CAAC,CAAC,CAAC;gBAC5B,OAAO,MAAM,WAAW,CACtB,IAAI,EACJ,MAAM,EACN,sBAAsB,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAW,EAAE,CAAC,EACtD,4GAA4G,CAC7G,CAAC;YACJ,CAAC;YACD,KAAK,oBAAoB,CAAC,CAAC,CAAC;gBAC1B,OAAO,MAAM,WAAW,CACtB,IAAI,EACJ,MAAM,EACN,oBAAoB,CAAC;oBACnB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAW;oBAC5B,GAAG,EAAE,IAAI,CAAC,KAAK,CAAW;iBAC3B,CAAC,CACH,CAAC;YACJ,CAAC;YACD,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,OAAO,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;YAC7D,CAAC;YACD,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,OAAO,MAAM,WAAW,CACtB,IAAI,EACJ,MAAM,EACN,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAW,CAAC,EACxC,iHAAiH,CAClH,CAAC;YACJ,CAAC;YACD,KAAK,mBAAmB,CAAC,CAAC,CAAC;gBACzB,OAAO,MAAM,WAAW,CACtB,IAAI,EACJ,MAAM,EACN,mBAAmB,EAAE,EACrB,uHAAuH,CACxH,CAAC;YACJ,CAAC;YACD,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,OAAO,MAAM,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;YAC7D,CAAC;YACD,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,OAAO,MAAM,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC/D,CAAC;YACD,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACxB,OAAO,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC9D,CAAC;YACD,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACxB,OAAO,MAAM,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC/D,CAAC;YACD;gBACE,OAAO,IAAI,CAAC,QAAQ,IAAI,oCAAoC,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,kEAAkE;QAClE,mEAAmE;QACnE,IAAI,CAAC,YAAY,gBAAgB,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;QACD,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,mBAAmB,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC;IACjD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,iBAAiB;AACjB,EAAE;AACF,uEAAuE;AACvE,qEAAqE;AACrE,qEAAqE;AACrE,wEAAwE;AACxE,sEAAsE;AACtE,kEAAkE;AAClE,0EAA0E;AAC1E,sEAAsE;AAEtE,SAAS,QAAQ,CAAC,KAAa,EAAE,GAAY;IAC3C,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC5E,2DAA2D;IAC3D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,KAAK,KAAK,GAAG,IAAI,CAAC,CAAC;AAC3D,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE;IACtC,QAAQ,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;IAC1C,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;IACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAU,EAAE,CAAC;IAC3D,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE;QACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,GAAG,mBAAmB,CAAC,CAAC;QACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,oEAAoE;AACpE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;IAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AACH,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;IAChC,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;IAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,kEAAkE;IAClE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,4BAA4B,WAAW,KAAK,cAAc,KAAK,SAAS,CAAC,MAAM,WAAW,CAC3F,CAAC;AACJ,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,QAAQ,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"} | ||
| {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"} |
@@ -14,2 +14,4 @@ import { HOOK_PROXY_ID } from "../hygiene/types.js"; | ||
| export declare function hookReadDedupModuleUrl(): string; | ||
| /** `file://` URL of the compiled `hookAstRead.js`. v1.7.0+. */ | ||
| export declare function hookAstReadModuleUrl(): string; | ||
| /** Add (or replace) the proxy PreToolUse hook entry. Idempotent. */ | ||
@@ -16,0 +18,0 @@ export declare function installProxyHook(settings: JsonObj, scriptPath: string): JsonObj; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/modules/proxy/install.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,CAAC;AAEzB,KAAK,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEvC,6DAA6D;AAC7D,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,0EAA0E;AAC1E,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAO/E;AAED,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAE7D"} | ||
| {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/modules/proxy/install.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,CAAC;AAEzB,KAAK,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEvC,6DAA6D;AAC7D,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,0EAA0E;AAC1E,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,+DAA+D;AAC/D,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAO/E;AAED,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAE7D"} |
@@ -28,2 +28,6 @@ /** | ||
| } | ||
| /** `file://` URL of the compiled `hookAstRead.js`. v1.7.0+. */ | ||
| export function hookAstReadModuleUrl() { | ||
| return new URL("./hookAstRead.js", import.meta.url).href; | ||
| } | ||
| /** Add (or replace) the proxy PreToolUse hook entry. Idempotent. */ | ||
@@ -30,0 +34,0 @@ export function installProxyHook(settings, scriptPath) { |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/modules/proxy/install.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,CAAC;AAIzB,6DAA6D;AAC7D,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,OAAO,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC;AAChE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,IAAI,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;AAC3D,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,sBAAsB;IACpC,OAAO,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;AAC7D,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,gBAAgB,CAAC,QAAiB,EAAE,UAAkB;IACpE,OAAO,iBAAiB,CAAC,QAAQ,EAAE;QACjC,KAAK,EAAE,YAAY;QACnB,OAAO,EAAE,GAAG;QACZ,UAAU;QACV,EAAE,EAAE,aAAa;KAClB,CAAC,CAAC;AACL,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,kBAAkB,CAAC,QAAiB;IAClD,OAAO,kBAAkB,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;AACvD,CAAC"} | ||
| {"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/modules/proxy/install.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,CAAC;AAIzB,6DAA6D;AAC7D,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,OAAO,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC;AAChE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,IAAI,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;AAC3D,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,sBAAsB;IACpC,OAAO,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;AAC7D,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,oBAAoB;IAClC,OAAO,IAAI,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;AAC3D,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,gBAAgB,CAAC,QAAiB,EAAE,UAAkB;IACpE,OAAO,iBAAiB,CAAC,QAAQ,EAAE;QACjC,KAAK,EAAE,YAAY;QACnB,OAAO,EAAE,GAAG;QACZ,UAAU;QACV,EAAE,EAAE,aAAa;KAClB,CAAC,CAAC;AACL,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,kBAAkB,CAAC,QAAiB;IAClD,OAAO,kBAAkB,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;AACvD,CAAC"} |
@@ -16,11 +16,12 @@ /** | ||
| /** Marker used to detect/upgrade/uninstall a Sipcode-generated hook safely. */ | ||
| export declare const SIPCODE_PROXY_HOOK_SIGNATURE = "SIPCODE_PROXY_HOOK_SIGNATURE/v3"; | ||
| export declare const SIPCODE_PROXY_HOOK_SIGNATURE = "SIPCODE_PROXY_HOOK_SIGNATURE/v4"; | ||
| /** | ||
| * @param runRewriterUrl absolute `file://` URL to the compiled `runRewriter.js`. | ||
| * @param hookReadDedupUrl absolute `file://` URL to the compiled `hookReadDedup.js`. | ||
| * Added in v3 (v1.6.6). Routes Read tool calls through | ||
| * the re-read dedup orchestrator before falling back | ||
| * to the rewriter registry. | ||
| * @param hookReadDedupUrl absolute `file://` URL to the compiled `hookReadDedup.js` (v3). | ||
| * @param hookAstReadUrl absolute `file://` URL to the compiled `hookAstRead.js` (v4, v1.7.0+). | ||
| * AST-aware symbol trim for TS/JS files. Records search | ||
| * signals on every Grep/Glob/Bash call and uses them to | ||
| * inject offset+limit on subsequent Read calls. | ||
| */ | ||
| export declare function generateProxyHookScript(runRewriterUrl: string, hookReadDedupUrl: string): string; | ||
| export declare function generateProxyHookScript(runRewriterUrl: string, hookReadDedupUrl: string, hookAstReadUrl: string): string; | ||
| //# sourceMappingURL=proxyHookScript.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"proxyHookScript.d.ts","sourceRoot":"","sources":["../../../src/modules/proxy/proxyHookScript.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,+EAA+E;AAC/E,eAAO,MAAM,4BAA4B,oCAAoC,CAAC;AAE9E;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,MAAM,EACtB,gBAAgB,EAAE,MAAM,GACvB,MAAM,CA4ER"} | ||
| {"version":3,"file":"proxyHookScript.d.ts","sourceRoot":"","sources":["../../../src/modules/proxy/proxyHookScript.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,+EAA+E;AAC/E,eAAO,MAAM,4BAA4B,oCAAoC,CAAC;AAE9E;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,MAAM,EACtB,gBAAgB,EAAE,MAAM,EACxB,cAAc,EAAE,MAAM,GACrB,MAAM,CAmGR"} |
@@ -16,11 +16,12 @@ /** | ||
| /** Marker used to detect/upgrade/uninstall a Sipcode-generated hook safely. */ | ||
| export const SIPCODE_PROXY_HOOK_SIGNATURE = "SIPCODE_PROXY_HOOK_SIGNATURE/v3"; | ||
| export const SIPCODE_PROXY_HOOK_SIGNATURE = "SIPCODE_PROXY_HOOK_SIGNATURE/v4"; | ||
| /** | ||
| * @param runRewriterUrl absolute `file://` URL to the compiled `runRewriter.js`. | ||
| * @param hookReadDedupUrl absolute `file://` URL to the compiled `hookReadDedup.js`. | ||
| * Added in v3 (v1.6.6). Routes Read tool calls through | ||
| * the re-read dedup orchestrator before falling back | ||
| * to the rewriter registry. | ||
| * @param hookReadDedupUrl absolute `file://` URL to the compiled `hookReadDedup.js` (v3). | ||
| * @param hookAstReadUrl absolute `file://` URL to the compiled `hookAstRead.js` (v4, v1.7.0+). | ||
| * AST-aware symbol trim for TS/JS files. Records search | ||
| * signals on every Grep/Glob/Bash call and uses them to | ||
| * inject offset+limit on subsequent Read calls. | ||
| */ | ||
| export function generateProxyHookScript(runRewriterUrl, hookReadDedupUrl) { | ||
| export function generateProxyHookScript(runRewriterUrl, hookReadDedupUrl, hookAstReadUrl) { | ||
| return `#!/usr/bin/env node | ||
@@ -30,8 +31,6 @@ // ${SIPCODE_PROXY_HOOK_SIGNATURE} | ||
| // | ||
| // Reads a PreToolUse event on stdin. Two paths: | ||
| // 1) tool_name === "Read" → ask hookReadDedup whether the file is unchanged | ||
| // since an earlier turn in this session; if so, emit a deny+reason | ||
| // output so Claude knows the content is already in its context. | ||
| // 2) anything else → ask runRewriter whether the input should be rewritten | ||
| // to produce naturally-compact output; if so, emit updatedInput. | ||
| // PreToolUse routing: | ||
| // - All calls: record search signal (Grep/Glob/Bash grep patterns) for AST relevance. | ||
| // - Read calls: try AST trim first; if no trim, try re-read dedup. | ||
| // - Non-Read calls: try the rewriter registry. | ||
| // Never throws — any failure degrades to a no-op so Claude Code is never disrupted. | ||
@@ -44,2 +43,4 @@ import { readFileSync, writeFileSync, mkdirSync } from "node:fs"; | ||
| let hookReadDedup; | ||
| let hookAstRead; | ||
| let recordSignal; | ||
| try { | ||
@@ -55,2 +56,8 @@ ({ runRewriter } = await import(${JSON.stringify(runRewriterUrl)})); | ||
| } | ||
| try { | ||
| ({ hookAstRead, recordSignal } = await import(${JSON.stringify(hookAstReadUrl)})); | ||
| } catch { | ||
| hookAstRead = null; | ||
| recordSignal = null; | ||
| } | ||
@@ -71,10 +78,27 @@ let raw = ""; | ||
| // Record search signal on every applicable tool call (Grep/Glob/Bash grep). | ||
| // Fire-and-forget; failures swallowed inside recordSignal. | ||
| if (input && recordSignal) { | ||
| try { | ||
| await recordSignal(input, homedir()); | ||
| } catch {} | ||
| } | ||
| let result = null; | ||
| if (input && input.tool_name === "Read" && hookReadDedup) { | ||
| try { | ||
| result = await hookReadDedup(input, homedir()); | ||
| } catch { | ||
| result = null; | ||
| if (input && input.tool_name === "Read") { | ||
| if (hookAstRead) { | ||
| try { | ||
| result = await hookAstRead(input, homedir()); | ||
| } catch { | ||
| result = null; | ||
| } | ||
| } | ||
| if ((!result || !result.hookOutput) && hookReadDedup) { | ||
| try { | ||
| result = await hookReadDedup(input, homedir()); | ||
| } catch { | ||
| result = null; | ||
| } | ||
| } | ||
| } | ||
@@ -81,0 +105,0 @@ |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"proxyHookScript.js","sourceRoot":"","sources":["../../../src/modules/proxy/proxyHookScript.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,+EAA+E;AAC/E,MAAM,CAAC,MAAM,4BAA4B,GAAG,iCAAiC,CAAC;AAE9E;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CACrC,cAAsB,EACtB,gBAAwB;IAExB,OAAO;KACJ,4BAA4B;;;;;;;;;;;;;;;;;oCAiBG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;;;;;sCAK5B,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmDrE,CAAC;AACF,CAAC"} | ||
| {"version":3,"file":"proxyHookScript.js","sourceRoot":"","sources":["../../../src/modules/proxy/proxyHookScript.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,+EAA+E;AAC/E,MAAM,CAAC,MAAM,4BAA4B,GAAG,iCAAiC,CAAC;AAE9E;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB,CACrC,cAAsB,EACtB,gBAAwB,EACxB,cAAsB;IAEtB,OAAO;KACJ,4BAA4B;;;;;;;;;;;;;;;;;oCAiBG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;;;;;sCAK5B,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC;;;;;kDAKpB,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqE/E,CAAC;AACF,CAAC"} |
@@ -16,6 +16,16 @@ export interface ProxyEstimate { | ||
| * | ||
| * Also counts B5 dedup credit: when the same `Read(file_path)` appears twice | ||
| * or more in the same transcript, each subsequent re-read counts as a | ||
| * dedup-saved 2000 tokens. The heuristic without this was undercounting the | ||
| * proxy's biggest single feature (B5, shipped v1.6.6). | ||
| * Credits three classes of savings: | ||
| * - Registry rewriters (git/npm/grep/cat/etc.) — actual savedTokensEstimate | ||
| * - B5 dedup (re-read of same file_path) — DEDUP_TOKENS_PER_REREAD | ||
| * - B3 AST trim (first read of an AST-eligible file after any prior Grep) — | ||
| * AST_TRIM_TOKENS_PER_HIT | ||
| * | ||
| * The B3 credit is conservative: we only count a Read as AST-eligible if | ||
| * (a) it's the FIRST read of that file (so we don't double-count with dedup), | ||
| * (b) the file extension is TS/JS/Python, and (c) any Grep has fired earlier | ||
| * in the same transcript (the signal cache would have a pattern to match). | ||
| * We do NOT verify that the grep pattern actually matches a symbol in the | ||
| * file — that requires reading the file, which violates the pure-walker | ||
| * contract this function maintains. The result is a credible upper bound, | ||
| * not a measured number, which is the contract `--vs-rtk` advertises. | ||
| */ | ||
@@ -22,0 +32,0 @@ export declare function estimateProxyOverToolCalls(calls: ReadonlyArray<{ |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"vsRtk.d.ts","sourceRoot":"","sources":["../../../src/modules/proxy/vsRtk.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,aAAa;IAC5B,uBAAuB;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,iDAAiD;IACjD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,mDAAmD;IACnD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;CAClC;AAUD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,aAAa,CAAC;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,GACvE,aAAa,CA8Bf;AAMD,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC,GAAG,MAAM,CA2BtE"} | ||
| {"version":3,"file":"vsRtk.d.ts","sourceRoot":"","sources":["../../../src/modules/proxy/vsRtk.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,aAAa;IAC5B,uBAAuB;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,iDAAiD;IACjD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,mDAAmD;IACnD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;CAClC;AAoBD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,aAAa,CAAC;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,GACvE,aAAa,CAiDf;AAMD,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC,GAAG,MAAM,CA2BtE"} |
@@ -17,13 +17,31 @@ /** | ||
| * Per-re-read estimated tokens. Conservative: a typical source file in the | ||
| * corpus is ~6-15 KB → ~1500-3750 tokens. We credit 2000 per dedup. Matches | ||
| * the savedTokensEstimate floor used by other rewriters so the preview stays | ||
| * internally consistent. | ||
| * corpus is ~6-15 KB → ~1500-3750 tokens. We credit 2000 per dedup. | ||
| */ | ||
| const DEDUP_TOKENS_PER_REREAD = 2000; | ||
| /** | ||
| * Per-AST-trim estimated tokens. A first read of a TS/JS/Python file that | ||
| * comes AFTER a Grep is the textbook B3 scenario: AST extracts the symbol | ||
| * matching the grep pattern, returns just that symbol's line range + buffer. | ||
| * Conservative: typical file is ~3-8 KB, symbol slice ~500-1500 tokens kept, | ||
| * so saving ~2500-3500 tokens. We credit 3000. | ||
| */ | ||
| const AST_TRIM_TOKENS_PER_HIT = 3000; | ||
| /** File extensions where AST trim can fire. */ | ||
| const AST_ELIGIBLE_RE = /\.(ts|tsx|js|jsx|mjs|cjs|mts|cts|pyi?)$/i; | ||
| /** Replay the rewriter registry over a transcript's tool calls. Pure. | ||
| * | ||
| * Also counts B5 dedup credit: when the same `Read(file_path)` appears twice | ||
| * or more in the same transcript, each subsequent re-read counts as a | ||
| * dedup-saved 2000 tokens. The heuristic without this was undercounting the | ||
| * proxy's biggest single feature (B5, shipped v1.6.6). | ||
| * Credits three classes of savings: | ||
| * - Registry rewriters (git/npm/grep/cat/etc.) — actual savedTokensEstimate | ||
| * - B5 dedup (re-read of same file_path) — DEDUP_TOKENS_PER_REREAD | ||
| * - B3 AST trim (first read of an AST-eligible file after any prior Grep) — | ||
| * AST_TRIM_TOKENS_PER_HIT | ||
| * | ||
| * The B3 credit is conservative: we only count a Read as AST-eligible if | ||
| * (a) it's the FIRST read of that file (so we don't double-count with dedup), | ||
| * (b) the file extension is TS/JS/Python, and (c) any Grep has fired earlier | ||
| * in the same transcript (the signal cache would have a pattern to match). | ||
| * We do NOT verify that the grep pattern actually matches a symbol in the | ||
| * file — that requires reading the file, which violates the pure-walker | ||
| * contract this function maintains. The result is a credible upper bound, | ||
| * not a measured number, which is the contract `--vs-rtk` advertises. | ||
| */ | ||
@@ -35,5 +53,18 @@ export function estimateProxyOverToolCalls(calls) { | ||
| const seenReadFiles = new Set(); | ||
| let anyGrepSeen = false; | ||
| for (const c of calls) { | ||
| toolCalls++; | ||
| // B5 dedup credit (pure detection: file_path seen before in this transcript). | ||
| // Track grep activity for B3 credit eligibility. | ||
| if (c.name === "Grep" && typeof c.input === "object" && c.input !== null) { | ||
| const pat = c.input.pattern; | ||
| if (typeof pat === "string" && pat.length > 0) | ||
| anyGrepSeen = true; | ||
| } | ||
| else if (c.name === "Bash" && typeof c.input === "object" && c.input !== null) { | ||
| const cmd = c.input.command; | ||
| if (typeof cmd === "string" && /^\s*(?:grep|rg|ag)\b/.test(cmd)) { | ||
| anyGrepSeen = true; | ||
| } | ||
| } | ||
| // Read tool: track first-read for B3 credit, re-reads for B5 credit. | ||
| if (c.name === "Read" && typeof c.input === "object" && c.input !== null) { | ||
@@ -48,2 +79,7 @@ const fp = c.input.file_path; | ||
| seenReadFiles.add(fp); | ||
| // B3 AST trim credit (first read of an AST-eligible file post-grep). | ||
| if (anyGrepSeen && AST_ELIGIBLE_RE.test(fp)) { | ||
| rewrites++; | ||
| estSavedTokens += AST_TRIM_TOKENS_PER_HIT; | ||
| } | ||
| } | ||
@@ -50,0 +86,0 @@ continue; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"vsRtk.js","sourceRoot":"","sources":["../../../src/modules/proxy/vsRtk.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"vsRtk.js","sourceRoot":"","sources":["../../../src/modules/proxy/vsRtk.ts"],"names":[],"mappings":"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"} |
+1
-1
| { | ||
| "name": "sipcode", | ||
| "version": "1.6.8", | ||
| "version": "1.6.10", | ||
| "description": "Sip your tokens. Don't gulp them. — Unified token optimization for AI coding agents.", | ||
@@ -5,0 +5,0 @@ "keywords": [ |
+1
-1
@@ -7,3 +7,3 @@ <div align="center"> | ||
| ### [**Visit the site →**](https://anuj7411.github.io/sipcode/) · [npm](https://www.npmjs.com/package/sipcode) · [benchmark methodology](benchmark/METHODOLOGY.md) | ||
| ### [**Visit the site →**](https://anuj7411.github.io/sipcode/) · [npm](https://www.npmjs.com/package/sipcode) · [benchmark methodology](benchmark/METHODOLOGY.md) · [changelog](CHANGELOG.md) | ||
@@ -10,0 +10,0 @@ [](https://www.npmjs.com/package/sipcode) |
Debug access
Supply chain riskUses debug, reflection and dynamic code execution features.
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
3127246
5.56%1007
8.75%22053
11.51%39
14.71%