@dzhechkov/harness-core 0.3.99 → 0.3.100

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/usage.js CHANGED
@@ -1,34 +1,29 @@
1
1
  /**
2
2
  * `dz usage` data source — a READONLY, never-throw, best-effort estimate of Claude SESSION
3
- * (active 5h-block) and WEEKLY (rolling 7d) token usage, aggregated from the local Claude Code
4
- * transcript files under `~/.claude/projects/<munged>/<session>.jsonl`.
3
+ * and WEEKLY token usage, aggregated from the local Claude Code transcript files under
4
+ * `~/.claude/projects/<munged>/<session>.jsonl`.
5
5
  *
6
- * ## Honest-uncertainty contract (LOAD-BEARING — NFR-4)
6
+ * ## Honest-uncertainty contract (LOAD-BEARING)
7
7
  *
8
- * These percentages are **ESTIMATES** derived by aggregating local transcript token counts against
9
- * a USER-CONFIGURED limit. There is **no official usage API** being consulted this is a fuel
10
- * gauge built from the flow meter, not a tank sensor. Therefore:
8
+ * These percentages are ESTIMATES derived by aggregating local transcript token counts against
9
+ * USER-CONFIGURED limits. There is no official Anthropic usage API being consulted; claude.ai is
10
+ * authoritative. Therefore:
11
11
  *
12
- * - Every payload carries `estimated: true` so a consumer can NEVER mistake it for ground truth.
13
- * - When a limit is **unconfigured** (`.dz/config.json` has no `memory.usage.sessionTokenLimit` /
14
- * `weeklyTokenLimit`), the corresponding `pct` is `null` **unknown, never 0, never a guess**.
15
- * - **Calibration protocol (observed-exhaustion):** when a real limit-hit occurs at an estimated
16
- * `X%`, scale the configured limit by `X/100` so the next estimate lines up with reality. The
17
- * 4 token fields are summed with equal weight; the relative weighting (cache-read tokens
18
- * dominate real transcripts) is absorbed into the calibrated limit value.
12
+ * - Every JSON payload emitted by the CLI carries `estimated: true`.
13
+ * - When a limit is unconfigured, the corresponding `pct` is `null` — unknown, never 0.
14
+ * - Weekly usage counts from a fixed configured reset anchor such as `Wed 08:59`, not from a
15
+ * rolling seven-day window.
16
+ * - Session usage counts from the active fixed-length transcript block, not from a rolling
17
+ * last-N-hours window.
19
18
  *
20
- * ## Statusline discipline (NFR-1)
19
+ * ## Statusline discipline
21
20
  *
22
21
  * Modeled on {@link ./statusline.ts} and {@link ./vector-tier.ts}'s `readVectorEngineMode`:
23
- * - **never-throw**any error (missing `~/.claude/projects`, corrupt jsonl line, missing/corrupt
24
- * config, garbled usage object) collapses to a value with `null` pcts, never an exception.
25
- * - **readonly** — zero writes/appends/mkdir/unlink anywhere (the optional aggregate cache in
26
- * arch §2.2(6) is DEFERRED v1 ships with zero writes so READONLY is trivially true).
27
- * - **<100ms steady-state** via an `mtime` prefilter: a file whose `mtime` is older than the weekly
28
- * window cannot contribute and is skipped WITHOUT opening it; only files touched inside the
29
- * session window are line-parsed for the active block.
30
- * - **injectable clock** — `computeUsage(root, now?)` takes an optional `now` (ms epoch) so all
31
- * window math is deterministic under test.
22
+ * - never-throw — missing/corrupt config, transcript directories, and jsonl lines collapse to
23
+ * best-effort zero/null values, never exceptions;
24
+ * - readonly — `computeUsage` performs zero writes;
25
+ * - bounded scanning via an mtime prefilter;
26
+ * - injectable clock `computeUsage(root, now?)` takes an optional epoch-ms clock.
32
27
  *
33
28
  * @packageDocumentation
34
29
  */
@@ -36,15 +31,99 @@ import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
36
31
  import { homedir } from 'node:os';
37
32
  import { join } from 'node:path';
38
33
  const HOUR_MS = 60 * 60 * 1000;
39
- const SESSION_BLOCK_MS = 5 * HOUR_MS; // ccusage 5h-block
40
- const WEEK_MS = 7 * 24 * HOUR_MS; // rolling 7-day weekly window
41
- // mtime prefilter slack (+1h) — guards against clock skew between the writer and this reader
42
- // (a file with a slightly-stale mtime that is actually in-window must not be dropped).
34
+ const DEFAULT_SESSION_BLOCK_HOURS = 5;
35
+ const DEFAULT_WEEKLY_RESET_ANCHOR = 'Wed 08:59';
36
+ // mtime prefilter slack (+1h) — guards against clock skew between the writer and this reader.
43
37
  const MTIME_SLACK_MS = HOUR_MS;
38
+ export const CLAUDE_USAGE_MODELS = ['fable', 'opus', 'sonnet', 'haiku'];
39
+ const WEEKDAY_TO_DAY = {
40
+ sun: 0,
41
+ mon: 1,
42
+ tue: 2,
43
+ wed: 3,
44
+ thu: 4,
45
+ fri: 5,
46
+ sat: 6,
47
+ };
48
+ const DAY_TO_WEEKDAY = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
49
+ function isRecord(value) {
50
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
51
+ }
52
+ function positiveFiniteNumber(value) {
53
+ return typeof value === 'number' && isFinite(value) && value > 0 ? value : undefined;
54
+ }
55
+ function hasOwn(obj, key) {
56
+ return Object.prototype.hasOwnProperty.call(obj, key);
57
+ }
58
+ function canonicalWeeklyResetAnchor(anchor) {
59
+ return `${DAY_TO_WEEKDAY[anchor.weekday] ?? 'Wed'} ${String(anchor.hour).padStart(2, '0')}:${String(anchor.minute).padStart(2, '0')}`;
60
+ }
61
+ export function parseWeeklyResetAnchor(anchor) {
62
+ const m = /^\s*(sun|mon|tue|wed|thu|fri|sat)\s+(\d{1,2}):(\d{2})\s*$/i.exec(anchor);
63
+ if (!m)
64
+ return null;
65
+ const weekday = WEEKDAY_TO_DAY[m[1].toLowerCase()];
66
+ const hour = Number(m[2]);
67
+ const minute = Number(m[3]);
68
+ if (weekday === undefined || !Number.isInteger(hour) || !Number.isInteger(minute))
69
+ return null;
70
+ if (hour < 0 || hour > 23 || minute < 0 || minute > 59)
71
+ return null;
72
+ return { weekday, hour, minute };
73
+ }
74
+ export function weeklyWindowFor(nowMs, anchor) {
75
+ if (!isFinite(nowMs))
76
+ return null;
77
+ const parsed = parseWeeklyResetAnchor(anchor);
78
+ if (!parsed)
79
+ return null;
80
+ const now = new Date(nowMs);
81
+ const candidate = new Date(now.getFullYear(), now.getMonth(), now.getDate(), parsed.hour, parsed.minute, 0, 0);
82
+ candidate.setDate(candidate.getDate() + (parsed.weekday - now.getDay()));
83
+ if (candidate.getTime() > nowMs)
84
+ candidate.setDate(candidate.getDate() - 7);
85
+ const next = new Date(candidate.getTime());
86
+ next.setDate(next.getDate() + 7);
87
+ return { startedAtMs: candidate.getTime(), resetsAtMs: next.getTime() };
88
+ }
89
+ /**
90
+ * A simple fixed-duration grid helper kept exported for pure date-math tests. `computeUsage` uses
91
+ * transcript-established session blocks per the feature requirements because no account-specific
92
+ * session anchor is stored today.
93
+ */
94
+ export function fixedBlockWindowFor(nowMs, blockHours) {
95
+ if (!isFinite(nowMs))
96
+ return null;
97
+ const hours = positiveFiniteNumber(blockHours);
98
+ if (hours === undefined)
99
+ return null;
100
+ const blockMs = hours * HOUR_MS;
101
+ const startedAtMs = Math.floor(nowMs / blockMs) * blockMs;
102
+ return { startedAtMs, resetsAtMs: startedAtMs + blockMs };
103
+ }
104
+ export function normalizeClaudeUsageModel(raw) {
105
+ if (typeof raw !== 'string')
106
+ return null;
107
+ const s = raw.toLowerCase();
108
+ if (s.includes('fable'))
109
+ return 'fable';
110
+ if (s.includes('opus'))
111
+ return 'opus';
112
+ if (s.includes('sonnet'))
113
+ return 'sonnet';
114
+ if (s.includes('haiku'))
115
+ return 'haiku';
116
+ return null;
117
+ }
118
+ export function normalizeClaudeUsageModelKey(raw) {
119
+ if (typeof raw !== 'string')
120
+ return null;
121
+ const key = raw.trim().toLowerCase();
122
+ return CLAUDE_USAGE_MODELS.includes(key) ? key : null;
123
+ }
44
124
  /**
45
125
  * The `~/.claude/projects` root (the account-wide transcript store). Overridable via
46
- * `DZ_CLAUDE_PROJECTS_ROOT` — used by tests to point at a temp tree (and by any user who relocates
47
- * the Claude home). Never throws.
126
+ * `DZ_CLAUDE_PROJECTS_ROOT` — used by tests to point at a temp tree. Never throws.
48
127
  */
49
128
  function claudeProjectsRoot() {
50
129
  const override = process.env['DZ_CLAUDE_PROJECTS_ROOT'];
@@ -53,24 +132,52 @@ function claudeProjectsRoot() {
53
132
  return join(homedir(), '.claude', 'projects');
54
133
  }
55
134
  /**
56
- * Read `memory.usage.{sessionTokenLimit,weeklyTokenLimit}` from `<projectRoot>/.dz/config.json`.
57
- * NEVER throws — absent/corrupt/partial config ⇒ `{}` (⇒ pct `null`). Mirrors the
58
- * `readVectorEngineMode` never-throw shape exactly. `projectRoot` is the ONLY thing that scopes to
59
- * a project; the MEASUREMENT below is account-wide (FR-1.6).
135
+ * Read `memory.usage.*` from `<projectRoot>/.dz/config.json`. NEVER throws —
136
+ * absent/corrupt/partial config ⇒ `{}` or only valid fields.
60
137
  */
61
138
  export function readUsageLimits(projectRoot) {
62
139
  try {
63
140
  const cfg = JSON.parse(readFileSync(join(projectRoot, '.dz', 'config.json'), 'utf-8'));
64
- const u = cfg.memory?.usage;
65
- if (!u || typeof u !== 'object')
141
+ if (!isRecord(cfg))
142
+ return {};
143
+ const memory = cfg['memory'];
144
+ if (!isRecord(memory))
145
+ return {};
146
+ const u = memory['usage'];
147
+ if (!isRecord(u))
66
148
  return {};
67
149
  const out = {};
68
- const s = u.sessionTokenLimit;
69
- const w = u.weeklyTokenLimit;
70
- if (typeof s === 'number' && isFinite(s) && s > 0)
71
- out.sessionTokenLimit = s;
72
- if (typeof w === 'number' && isFinite(w) && w > 0)
73
- out.weeklyTokenLimit = w;
150
+ const sessionLimit = positiveFiniteNumber(u['sessionTokenLimit']);
151
+ const weeklyLimit = positiveFiniteNumber(u['weeklyTokenLimit']);
152
+ const sessionBlockHours = positiveFiniteNumber(u['sessionBlockHours']);
153
+ if (sessionLimit !== undefined)
154
+ out.sessionTokenLimit = sessionLimit;
155
+ if (weeklyLimit !== undefined)
156
+ out.weeklyTokenLimit = weeklyLimit;
157
+ if (sessionBlockHours !== undefined)
158
+ out.sessionBlockHours = sessionBlockHours;
159
+ const anchor = u['weeklyResetAnchor'];
160
+ if (typeof anchor === 'string') {
161
+ const parsed = parseWeeklyResetAnchor(anchor);
162
+ if (parsed)
163
+ out.weeklyResetAnchor = canonicalWeeklyResetAnchor(parsed);
164
+ }
165
+ const byModel = u['weeklyTokenLimitByModel'];
166
+ if (isRecord(byModel)) {
167
+ const modelLimits = {};
168
+ for (const [key, value] of Object.entries(byModel)) {
169
+ const model = normalizeClaudeUsageModelKey(key);
170
+ const limit = positiveFiniteNumber(value);
171
+ if (model && limit !== undefined)
172
+ modelLimits[model] = limit;
173
+ }
174
+ if (Object.keys(modelLimits).length > 0)
175
+ out.weeklyTokenLimitByModel = modelLimits;
176
+ }
177
+ if (typeof u['calibratedAt'] === 'string')
178
+ out.calibratedAt = u['calibratedAt'];
179
+ if (typeof u['source'] === 'string')
180
+ out.source = u['source'];
74
181
  return out;
75
182
  }
76
183
  catch {
@@ -112,18 +219,17 @@ function listTranscriptFiles(root) {
112
219
  out.push({ path: p, mtimeMs: statSync(p).mtimeMs });
113
220
  }
114
221
  catch {
115
- // skip a file we can't stat
222
+ // skip a file we cannot stat
116
223
  }
117
224
  }
118
225
  }
119
226
  return out;
120
227
  }
121
228
  /**
122
- * Extract usage samples from one transcript file. Never throws — a corrupt line is skipped
123
- * (statusline discipline). A cheap `"usage"` substring pre-filter avoids `JSON.parse` on lines
124
- * that cannot carry a token count. `weeklyCutoff` drops samples older than the rolling window.
229
+ * Extract usage samples from one transcript file. Never throws — a corrupt line is skipped.
230
+ * `scanCutoff` drops samples older than every window that could affect the estimate.
125
231
  */
126
- function extractSamples(path, weeklyCutoff, into, seen) {
232
+ function extractSamples(path, scanCutoff, into, seen) {
127
233
  let raw;
128
234
  try {
129
235
  raw = readFileSync(path, 'utf-8');
@@ -153,8 +259,8 @@ function extractSamples(path, weeklyCutoff, into, seen) {
153
259
  const ts = typeof tsRaw === 'number' ? tsRaw : Date.parse(tsRaw);
154
260
  if (!isFinite(ts))
155
261
  continue;
156
- if (ts < weeklyCutoff)
157
- continue; // outside the weekly window — cannot contribute
262
+ if (ts < scanCutoff)
263
+ continue;
158
264
  const n = (v) => (typeof v === 'number' && isFinite(v) && v > 0 ? v : 0);
159
265
  const tokens = n(usage.input_tokens) +
160
266
  n(usage.cache_creation_input_tokens) +
@@ -171,85 +277,215 @@ function extractSamples(path, weeklyCutoff, into, seen) {
171
277
  continue;
172
278
  seen.add(key);
173
279
  }
174
- into.push({ ts, tokens, key });
280
+ into.push({ ts, tokens, key, model: normalizeClaudeUsageModel(rec.message?.model ?? rec.model) });
175
281
  }
176
282
  }
177
- /**
178
- * Compute the SESSION active-block total using ccusage 5h-block semantics: walk samples in ts
179
- * order; a block starts at the first sample after the previous block ends, FLOORED to the hour;
180
- * `end = start + 5h`. The ACTIVE block is the one whose `[start, end)` contains `now`. No active
181
- * block ⇒ `{ tokens: 0, resetsAt: null }`.
182
- */
183
- function activeBlock(samplesAsc, now) {
283
+ function activeSessionBlock(samplesAsc, nowMs, blockHours) {
284
+ const hours = positiveFiniteNumber(blockHours) ?? DEFAULT_SESSION_BLOCK_HOURS;
285
+ const blockMs = hours * HOUR_MS;
184
286
  let blockStart = -1;
185
287
  let blockEnd = -1;
186
288
  let tokens = 0;
187
- let activeStart = -1;
289
+ let activeStart = null;
290
+ let activeEnd = null;
188
291
  let activeTokens = 0;
189
292
  for (const s of samplesAsc) {
293
+ if (s.ts > nowMs)
294
+ continue;
190
295
  if (blockStart === -1 || s.ts >= blockEnd) {
191
- // close the previous block, open a new one floored to the hour
192
- blockStart = Math.floor(s.ts / HOUR_MS) * HOUR_MS;
193
- blockEnd = blockStart + SESSION_BLOCK_MS;
296
+ blockStart = s.ts;
297
+ blockEnd = blockStart + blockMs;
194
298
  tokens = 0;
195
299
  }
196
300
  tokens += s.tokens;
197
- if (now >= blockStart && now < blockEnd) {
301
+ if (nowMs >= blockStart && nowMs < blockEnd) {
198
302
  activeStart = blockStart;
303
+ activeEnd = blockEnd;
199
304
  activeTokens = tokens;
200
305
  }
201
306
  }
202
- if (activeStart === -1)
203
- return { tokens: 0, resetsAt: null };
204
- return { tokens: activeTokens, resetsAt: new Date(activeStart + SESSION_BLOCK_MS).toISOString() };
307
+ return { tokens: activeTokens, startedAtMs: activeStart, resetsAtMs: activeEnd };
308
+ }
309
+ function pct(tokens, limit) {
310
+ return typeof limit === 'number' && limit > 0 ? Math.round((100 * tokens) / limit) : null;
311
+ }
312
+ function configuredModelLimits(limits) {
313
+ if (!limits)
314
+ return [];
315
+ const out = [];
316
+ for (const model of CLAUDE_USAGE_MODELS) {
317
+ const limit = limits[model];
318
+ if (typeof limit === 'number' && isFinite(limit) && limit > 0)
319
+ out.push([model, limit]);
320
+ }
321
+ return out;
205
322
  }
206
323
  /**
207
324
  * Estimate SESSION + WEEKLY token usage from the local Claude transcript store. NEVER throws;
208
- * READONLY; `<100ms` steady-state via the `mtime` prefilter. `projectRoot` scopes ONLY the config
209
- * (limits) read — measurement is account-wide (all projects). `now` is injectable for tests.
325
+ * READONLY; `projectRoot` scopes ONLY the config (limits) read measurement is account-wide
326
+ * (all projects). `now` is injectable for tests.
210
327
  */
211
328
  export function computeUsage(projectRoot, now) {
212
329
  const nowMs = typeof now === 'number' && isFinite(now) ? now : Date.now();
213
330
  const limits = readUsageLimits(projectRoot);
214
- const weeklyCutoff = nowMs - WEEK_MS - MTIME_SLACK_MS;
331
+ const sessionBlockHours = limits.sessionBlockHours ?? DEFAULT_SESSION_BLOCK_HOURS;
332
+ const weeklyAnchor = limits.weeklyResetAnchor ?? DEFAULT_WEEKLY_RESET_ANCHOR;
333
+ const weeklyWindow = weeklyWindowFor(nowMs, weeklyAnchor);
334
+ // For transcript-established blocks, one previous block may be needed to prove that an event just
335
+ // before the current boundary belongs to the prior block rather than opening the active one.
336
+ const sessionScanCutoff = nowMs - 2 * sessionBlockHours * HOUR_MS;
337
+ const weeklyScanCutoff = weeklyWindow?.startedAtMs ?? nowMs;
338
+ const scanCutoff = Math.min(sessionScanCutoff, weeklyScanCutoff) - MTIME_SLACK_MS;
215
339
  const samples = [];
216
340
  const seen = new Set();
217
341
  try {
218
342
  const files = listTranscriptFiles(claudeProjectsRoot());
219
343
  for (const f of files) {
220
- // mtime prefilter: a file last written before the weekly cutoff cannot hold in-window
221
- // samples — skip it WITHOUT opening it (the <100ms lever).
222
- if (f.mtimeMs < weeklyCutoff)
344
+ // mtime prefilter: a file last written before every relevant cutoff cannot contribute.
345
+ if (f.mtimeMs < scanCutoff)
223
346
  continue;
224
- extractSamples(f.path, weeklyCutoff, samples, seen);
347
+ extractSamples(f.path, scanCutoff, samples, seen);
225
348
  }
226
349
  }
227
350
  catch {
228
351
  // total scan failure ⇒ fall through with empty samples (nulls), never throw
229
352
  }
230
- // Weekly total: every sample inside the exact 7d window (the +slack was only a prefilter guard).
231
- const weeklyHardCutoff = nowMs - WEEK_MS;
232
353
  let weeklyTokens = 0;
233
- let oldestInWindow = -1;
234
- for (const s of samples) {
235
- if (s.ts < weeklyHardCutoff)
236
- continue;
237
- weeklyTokens += s.tokens;
238
- if (oldestInWindow === -1 || s.ts < oldestInWindow)
239
- oldestInWindow = s.ts;
354
+ const weeklyTokensByModel = {};
355
+ if (weeklyWindow) {
356
+ for (const s of samples) {
357
+ if (s.ts < weeklyWindow.startedAtMs || s.ts >= weeklyWindow.resetsAtMs || s.ts > nowMs)
358
+ continue;
359
+ weeklyTokens += s.tokens;
360
+ if (s.model)
361
+ weeklyTokensByModel[s.model] = (weeklyTokensByModel[s.model] ?? 0) + s.tokens;
362
+ }
240
363
  }
241
364
  const asc = samples.slice().sort((a, b) => a.ts - b.ts);
242
- const block = activeBlock(asc, nowMs);
243
- const pct = (tokens, limit) => typeof limit === 'number' && limit > 0 ? Math.round((100 * tokens) / limit) : null;
244
- const weeklyResetsAt = oldestInWindow === -1 ? null : new Date(oldestInWindow + WEEK_MS).toISOString();
365
+ const block = activeSessionBlock(asc, nowMs, sessionBlockHours);
366
+ const modelLimits = configuredModelLimits(limits.weeklyTokenLimitByModel);
367
+ let weeklyByModel;
368
+ let weeklyPct = pct(weeklyTokens, limits.weeklyTokenLimit);
369
+ let weeklyBindingModel;
370
+ if (modelLimits.length > 0) {
371
+ weeklyByModel = {};
372
+ weeklyPct = null;
373
+ for (const [model, limit] of modelLimits) {
374
+ const tokens = weeklyTokensByModel[model] ?? 0;
375
+ const modelPct = pct(tokens, limit);
376
+ weeklyByModel[model] = { tokens, pct: modelPct };
377
+ if (modelPct !== null && (weeklyPct === null || modelPct > weeklyPct)) {
378
+ weeklyPct = modelPct;
379
+ weeklyBindingModel = model;
380
+ }
381
+ }
382
+ }
245
383
  return {
246
384
  sessionTokens: block.tokens,
247
385
  weeklyTokens,
248
386
  sessionPct: pct(block.tokens, limits.sessionTokenLimit),
249
- weeklyPct: pct(weeklyTokens, limits.weeklyTokenLimit),
250
- sessionResetsAt: block.resetsAt,
251
- weeklyResetsAt,
387
+ weeklyPct,
388
+ sessionResetsAt: block.resetsAtMs === null ? null : new Date(block.resetsAtMs).toISOString(),
389
+ weeklyResetsAt: weeklyWindow === null ? null : new Date(weeklyWindow.resetsAtMs).toISOString(),
252
390
  estimated: true,
391
+ ...(weeklyByModel !== undefined ? { weeklyByModel } : {}),
392
+ weeklyTokensByModel,
393
+ ...(weeklyBindingModel !== undefined ? { weeklyBindingModel } : {}),
394
+ sessionStartedAt: block.startedAtMs === null ? null : new Date(block.startedAtMs).toISOString(),
395
+ weeklyStartedAt: weeklyWindow === null ? null : new Date(weeklyWindow.startedAtMs).toISOString(),
396
+ };
397
+ }
398
+ function validPct(label, value, skipped) {
399
+ const n = typeof value === 'number' ? value : typeof value === 'string' && value.trim() !== '' ? Number(value) : NaN;
400
+ if (!isFinite(n) || n <= 0 || n > 100) {
401
+ skipped.push(`${label}: skipped invalid percentage ${String(value)}`);
402
+ return null;
403
+ }
404
+ return n;
405
+ }
406
+ function applyCalibrationLimit(opts) {
407
+ const suppliedPct = validPct(opts.label, opts.rawPct, opts.skipped);
408
+ if (suppliedPct === null)
409
+ return;
410
+ if (!isFinite(opts.tokens) || opts.tokens <= 0) {
411
+ opts.skipped.push(`${opts.label}: skipped because current token count is 0`);
412
+ return;
413
+ }
414
+ const limit = Math.round(opts.tokens / (suppliedPct / 100));
415
+ if (!isFinite(limit) || limit <= 0) {
416
+ opts.skipped.push(`${opts.label}: skipped because derived limit is invalid`);
417
+ return;
418
+ }
419
+ opts.set(limit);
420
+ opts.changes.push({
421
+ key: opts.label,
422
+ before: opts.before ?? null,
423
+ after: limit,
424
+ tokens: opts.tokens,
425
+ pct: suppliedPct,
426
+ });
427
+ }
428
+ export function deriveUsageCalibration(current, before, input) {
429
+ const after = {
430
+ ...before,
431
+ ...(before.weeklyTokenLimitByModel !== undefined
432
+ ? { weeklyTokenLimitByModel: { ...before.weeklyTokenLimitByModel } }
433
+ : {}),
253
434
  };
435
+ const skipped = [];
436
+ const changes = [];
437
+ if (hasOwn(input, 'sessionPct')) {
438
+ applyCalibrationLimit({
439
+ label: 'session',
440
+ tokens: current.sessionTokens,
441
+ rawPct: input.sessionPct,
442
+ before: before.sessionTokenLimit,
443
+ set: (limit) => {
444
+ after.sessionTokenLimit = limit;
445
+ },
446
+ skipped,
447
+ changes,
448
+ });
449
+ }
450
+ if (hasOwn(input, 'weeklyPct')) {
451
+ applyCalibrationLimit({
452
+ label: 'weekly',
453
+ tokens: current.weeklyTokens,
454
+ rawPct: input.weeklyPct,
455
+ before: before.weeklyTokenLimit,
456
+ set: (limit) => {
457
+ after.weeklyTokenLimit = limit;
458
+ },
459
+ skipped,
460
+ changes,
461
+ });
462
+ }
463
+ if (input.modelPct !== undefined) {
464
+ for (const [key, rawPct] of Object.entries(input.modelPct)) {
465
+ const model = normalizeClaudeUsageModelKey(key);
466
+ if (!model) {
467
+ skipped.push(`model ${key}: skipped unknown model`);
468
+ continue;
469
+ }
470
+ applyCalibrationLimit({
471
+ label: model,
472
+ tokens: current.weeklyTokensByModel[model] ?? 0,
473
+ rawPct,
474
+ before: before.weeklyTokenLimitByModel?.[model],
475
+ set: (limit) => {
476
+ if (after.weeklyTokenLimitByModel === undefined)
477
+ after.weeklyTokenLimitByModel = {};
478
+ after.weeklyTokenLimitByModel[model] = limit;
479
+ },
480
+ skipped,
481
+ changes,
482
+ });
483
+ }
484
+ }
485
+ if (changes.length > 0) {
486
+ after.calibratedAt = input.calibratedAt;
487
+ after.source = input.source;
488
+ }
489
+ return { before, after, changes, skipped };
254
490
  }
255
491
  //# sourceMappingURL=usage.js.map
package/dist/usage.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"usage.js","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC/B,MAAM,2BAA2B,GAAG,CAAC,CAAC;AACtC,MAAM,2BAA2B,GAAG,WAAW,CAAC;AAChD,8FAA8F;AAC9F,MAAM,cAAc,GAAG,OAAO,CAAC;AAE/B,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAU,CAAC;AA0FjF,MAAM,cAAc,GAA2B;IAC7C,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;CACP,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAU,CAAC;AAElF,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvF,CAAC;AAED,SAAS,MAAM,CAAC,GAAW,EAAE,GAAW;IACtC,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,0BAA0B,CAAC,MAAyB;IAC3D,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AACxI,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAc;IACnD,MAAM,CAAC,GAAG,4DAA4D,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpF,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,MAAM,OAAO,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/F,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,EAAE;QAAE,OAAO,IAAI,CAAC;IACpE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,MAAc;IAC3D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,SAAS,GAAG,IAAI,IAAI,CACxB,GAAG,CAAC,WAAW,EAAE,EACjB,GAAG,CAAC,QAAQ,EAAE,EACd,GAAG,CAAC,OAAO,EAAE,EACb,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,MAAM,EACb,CAAC,EACD,CAAC,CACF,CAAC;IACF,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACzE,IAAI,SAAS,CAAC,OAAO,EAAE,GAAG,KAAK;QAAE,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAC5E,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IACjC,OAAO,EAAE,WAAW,EAAE,SAAS,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;AAC1E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAa,EAAE,UAAkB;IACnE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,KAAK,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;IAC/C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,OAAO,GAAG,KAAK,GAAG,OAAO,CAAC;IAChC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC;IAC1D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,GAAG,OAAO,EAAE,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,GAAY;IACpD,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,CAAC,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAC5B,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IACxC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IACtC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC1C,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IACxC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,GAAY;IACvD,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,OAAQ,mBAAyC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,GAAwB,CAAC,CAAC,CAAC,IAAI,CAAC;AACrG,CAAC;AAED;;;GAGG;AACH,SAAS,kBAAkB;IACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACxD,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IACzE,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAChD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,WAAmB;IACjD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,aAAa,CAAC,EAAE,OAAO,CAAC,CAAY,CAAC;QAClG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,EAAE,CAAC;QAE5B,MAAM,GAAG,GAAuB,EAAE,CAAC;QACnC,MAAM,YAAY,GAAG,oBAAoB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAClE,MAAM,WAAW,GAAG,oBAAoB,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAChE,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC;QACvE,IAAI,YAAY,KAAK,SAAS;YAAE,GAAG,CAAC,iBAAiB,GAAG,YAAY,CAAC;QACrE,IAAI,WAAW,KAAK,SAAS;YAAE,GAAG,CAAC,gBAAgB,GAAG,WAAW,CAAC;QAClE,IAAI,iBAAiB,KAAK,SAAS;YAAE,GAAG,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAE/E,MAAM,MAAM,GAAG,CAAC,CAAC,mBAAmB,CAAC,CAAC;QACtC,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;YAC9C,IAAI,MAAM;gBAAE,GAAG,CAAC,iBAAiB,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,OAAO,GAAG,CAAC,CAAC,yBAAyB,CAAC,CAAC;QAC7C,IAAI,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACtB,MAAM,WAAW,GAA8C,EAAE,CAAC;YAClE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnD,MAAM,KAAK,GAAG,4BAA4B,CAAC,GAAG,CAAC,CAAC;gBAChD,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;gBAC1C,IAAI,KAAK,IAAI,KAAK,KAAK,SAAS;oBAAE,WAAW,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;YAC/D,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC;gBAAE,GAAG,CAAC,uBAAuB,GAAG,WAAW,CAAC;QACrF,CAAC;QAED,IAAI,OAAO,CAAC,CAAC,cAAc,CAAC,KAAK,QAAQ;YAAE,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC;QAChF,IAAI,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,QAAQ;YAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC9D,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAUD;;;GAGG;AACH,SAAS,mBAAmB,CAAC,IAAY;IACvC,MAAM,GAAG,GAA6C,EAAE,CAAC;IACzD,IAAI,IAAc,CAAC;IACnB,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,GAAG,CAAC;QAClC,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9B,IAAI,KAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC7B,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE;gBAAE,SAAS;YAChC,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAE,SAAS;YACpC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC3B,IAAI,CAAC;gBACH,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YACtD,CAAC;YAAC,MAAM,CAAC;gBACP,6BAA6B;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,IAAY,EAAE,UAAkB,EAAE,IAAc,EAAE,IAAiB;IACzF,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAChC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAAE,SAAS,CAAC,oCAAoC;QAChF,IAAI,GAcH,CAAC;QACF,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAe,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,CAAC,mCAAmC;QAC/C,CAAC;QACD,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;QACjC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QAClD,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC;QAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QACrE,MAAM,EAAE,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAE,SAAS;QAC5B,IAAI,EAAE,GAAG,UAAU;YAAE,SAAS;QAC9B,MAAM,CAAC,GAAG,CAAC,CAAU,EAAU,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1F,MAAM,MAAM,GACV,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC;YACrB,CAAC,CAAC,KAAK,CAAC,2BAA2B,CAAC;YACpC,CAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC;YAChC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACzB,IAAI,MAAM,IAAI,CAAC;YAAE,SAAS;QAC1B,8EAA8E;QAC9E,MAAM,EAAE,GAAG,OAAO,GAAG,CAAC,OAAO,EAAE,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,MAAM,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC;QAC7B,IAAI,EAAE,KAAK,EAAE,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,yBAAyB,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACpG,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CACzB,UAAoB,EACpB,KAAa,EACb,UAAkB;IAElB,MAAM,KAAK,GAAG,oBAAoB,CAAC,UAAU,CAAC,IAAI,2BAA2B,CAAC;IAC9E,MAAM,OAAO,GAAG,KAAK,GAAG,OAAO,CAAC;IAChC,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC;IACpB,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC;IAClB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,WAAW,GAAkB,IAAI,CAAC;IACtC,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,CAAC,CAAC,EAAE,GAAG,KAAK;YAAE,SAAS;QAC3B,IAAI,UAAU,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,QAAQ,EAAE,CAAC;YAC1C,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC;YAClB,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;YAChC,MAAM,GAAG,CAAC,CAAC;QACb,CAAC;QACD,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC;QACnB,IAAI,KAAK,IAAI,UAAU,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;YAC5C,WAAW,GAAG,UAAU,CAAC;YACzB,SAAS,GAAG,QAAQ,CAAC;YACrB,YAAY,GAAG,MAAM,CAAC;QACxB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;AACnF,CAAC;AAED,SAAS,GAAG,CAAC,MAAc,EAAE,KAAc;IACzC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5F,CAAC;AAED,SAAS,qBAAqB,CAC5B,MAAkD;IAElD,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,MAAM,GAAG,GAAsC,EAAE,CAAC;IAClD,KAAK,MAAM,KAAK,IAAI,mBAAmB,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,WAAmB,EAAE,GAAY;IAC5D,MAAM,KAAK,GAAG,OAAO,GAAG,KAAK,QAAQ,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IAC1E,MAAM,MAAM,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,IAAI,2BAA2B,CAAC;IAClF,MAAM,YAAY,GAAG,MAAM,CAAC,iBAAiB,IAAI,2BAA2B,CAAC;IAC7E,MAAM,YAAY,GAAG,eAAe,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAC1D,kGAAkG;IAClG,6FAA6F;IAC7F,MAAM,iBAAiB,GAAG,KAAK,GAAG,CAAC,GAAG,iBAAiB,GAAG,OAAO,CAAC;IAClE,MAAM,gBAAgB,GAAG,YAAY,EAAE,WAAW,IAAI,KAAK,CAAC;IAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,GAAG,cAAc,CAAC;IAElF,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,mBAAmB,CAAC,kBAAkB,EAAE,CAAC,CAAC;QACxD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,uFAAuF;YACvF,IAAI,CAAC,CAAC,OAAO,GAAG,UAAU;gBAAE,SAAS;YACrC,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,4EAA4E;IAC9E,CAAC;IAED,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,MAAM,mBAAmB,GAA8C,EAAE,CAAC;IAC1E,IAAI,YAAY,EAAE,CAAC;QACjB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,CAAC,EAAE,GAAG,YAAY,CAAC,WAAW,IAAI,CAAC,CAAC,EAAE,IAAI,YAAY,CAAC,UAAU,IAAI,CAAC,CAAC,EAAE,GAAG,KAAK;gBAAE,SAAS;YACjG,YAAY,IAAI,CAAC,CAAC,MAAM,CAAC;YACzB,IAAI,CAAC,CAAC,KAAK;gBAAE,mBAAmB,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;QAC7F,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC;IAEhE,MAAM,WAAW,GAAG,qBAAqB,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;IAC1E,IAAI,aAAgF,CAAC;IACrF,IAAI,SAAS,GAAG,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAC3D,IAAI,kBAAgD,CAAC;IACrD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,aAAa,GAAG,EAAE,CAAC;QACnB,SAAS,GAAG,IAAI,CAAC;QACjB,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACpC,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;YACjD,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAC;gBACtE,SAAS,GAAG,QAAQ,CAAC;gBACrB,kBAAkB,GAAG,KAAK,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,aAAa,EAAE,KAAK,CAAC,MAAM;QAC3B,YAAY;QACZ,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,iBAAiB,CAAC;QACvD,SAAS;QACT,eAAe,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE;QAC5F,cAAc,EAAE,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE;QAC9F,SAAS,EAAE,IAAI;QACf,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,mBAAmB;QACnB,GAAG,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,gBAAgB,EAAE,KAAK,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE;QAC/F,eAAe,EAAE,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE;KACjG,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa,EAAE,KAAc,EAAE,OAAiB;IAChE,MAAM,CAAC,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACrH,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,gCAAgC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,qBAAqB,CAAC,IAQ9B;IACC,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACpE,IAAI,WAAW,KAAK,IAAI;QAAE,OAAO;IACjC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,4CAA4C,CAAC,CAAC;QAC7E,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC;IAC5D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,4CAA4C,CAAC,CAAC;QAC7E,OAAO;IACT,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAChB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;QAChB,GAAG,EAAE,IAAI,CAAC,KAAK;QACf,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;QAC3B,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,GAAG,EAAE,WAAW;KACjB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,OAAsB,EACtB,MAAmB,EACnB,KAA4B;IAE5B,MAAM,KAAK,GAAuB;QAChC,GAAG,MAAM;QACT,GAAG,CAAC,MAAM,CAAC,uBAAuB,KAAK,SAAS;YAC9C,CAAC,CAAC,EAAE,uBAAuB,EAAE,EAAE,GAAG,MAAM,CAAC,uBAAuB,EAAE,EAAE;YACpE,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IACF,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAA6B,EAAE,CAAC;IAE7C,IAAI,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE,CAAC;QAChC,qBAAqB,CAAC;YACpB,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,OAAO,CAAC,aAAa;YAC7B,MAAM,EAAE,KAAK,CAAC,UAAU;YACxB,MAAM,EAAE,MAAM,CAAC,iBAAiB;YAChC,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE;gBACb,KAAK,CAAC,iBAAiB,GAAG,KAAK,CAAC;YAClC,CAAC;YACD,OAAO;YACP,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC;QAC/B,qBAAqB,CAAC;YACpB,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,OAAO,CAAC,YAAY;YAC5B,MAAM,EAAE,KAAK,CAAC,SAAS;YACvB,MAAM,EAAE,MAAM,CAAC,gBAAgB;YAC/B,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE;gBACb,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC;YACjC,CAAC;YACD,OAAO;YACP,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACjC,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3D,MAAM,KAAK,GAAG,4BAA4B,CAAC,GAAG,CAAC,CAAC;YAChD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,SAAS,GAAG,yBAAyB,CAAC,CAAC;gBACpD,SAAS;YACX,CAAC;YACD,qBAAqB,CAAC;gBACpB,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC/C,MAAM;gBACN,MAAM,EAAE,MAAM,CAAC,uBAAuB,EAAE,CAAC,KAAK,CAAC;gBAC/C,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE;oBACb,IAAI,KAAK,CAAC,uBAAuB,KAAK,SAAS;wBAAE,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC;oBACpF,KAAK,CAAC,uBAAuB,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;gBAC/C,CAAC;gBACD,OAAO;gBACP,OAAO;aACR,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QACxC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC7C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dzhechkov/harness-core",
3
- "version": "0.3.99",
3
+ "version": "0.3.100",
4
4
  "description": "Shared harness logic - skill loading, additive apply, and the init/sync/verify/doctor operations.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -23,27 +23,20 @@
23
23
  "src",
24
24
  "README.md"
25
25
  ],
26
- "scripts": {
27
- "build": "tsc -p tsconfig.json",
28
- "test": "vitest run",
29
- "test:watch": "vitest",
30
- "typecheck": "tsc -p tsconfig.json --noEmit",
31
- "lint": "tsc -p tsconfig.json --noEmit"
32
- },
33
26
  "dependencies": {
34
- "@dzhechkov/adapter-agents-md": "workspace:*",
35
27
  "@dzhechkov/adapter-claude": "^0.2.0",
36
28
  "@dzhechkov/adapter-codex": "^0.2.0",
37
- "@dzhechkov/adapter-copilot": "workspace:*",
38
- "@dzhechkov/adapter-cursor": "workspace:*",
39
- "@dzhechkov/adapter-gemini": "workspace:*",
40
29
  "@dzhechkov/adapter-hermes": "^0.2.0",
41
30
  "@dzhechkov/adapter-openclaude": "^0.1.0",
42
31
  "@dzhechkov/adapter-opencode": "^0.2.0",
43
- "@dzhechkov/adapter-windsurf": "workspace:*",
44
- "@dzhechkov/core": "workspace:*",
45
- "@dzhechkov/memory": "workspace:*",
46
- "yaml": "^2.0.0"
32
+ "yaml": "^2.0.0",
33
+ "@dzhechkov/adapter-agents-md": "0.1.1",
34
+ "@dzhechkov/adapter-cursor": "0.1.1",
35
+ "@dzhechkov/adapter-gemini": "0.1.1",
36
+ "@dzhechkov/core": "0.2.14",
37
+ "@dzhechkov/adapter-windsurf": "0.1.1",
38
+ "@dzhechkov/memory": "0.2.9",
39
+ "@dzhechkov/adapter-copilot": "0.1.1"
47
40
  },
48
41
  "peerDependenciesMeta": {
49
42
  "@ruvector/rvf": {
@@ -67,5 +60,12 @@
67
60
  "url": "https://github.com/djd1m/dz-harness-hub.git",
68
61
  "directory": "packages/@dzhechkov/harness-core"
69
62
  },
70
- "homepage": "https://github.com/djd1m/dz-harness-hub/tree/main/packages/@dzhechkov/harness-core#readme"
71
- }
63
+ "homepage": "https://github.com/djd1m/dz-harness-hub/tree/main/packages/@dzhechkov/harness-core#readme",
64
+ "scripts": {
65
+ "build": "tsc -p tsconfig.json",
66
+ "test": "vitest run",
67
+ "test:watch": "vitest",
68
+ "typecheck": "tsc -p tsconfig.json --noEmit",
69
+ "lint": "tsc -p tsconfig.json --noEmit"
70
+ }
71
+ }
package/src/index.ts CHANGED
@@ -198,5 +198,25 @@ export {
198
198
  CODE_LANDED_BARRIER_SLEEPS_SECONDS,
199
199
  } from './feature-adr-routing.js';
200
200
  export type { StageOpts, RoutingEnv, UsageSignal, UsageAction } from './feature-adr-routing.js';
201
- export { computeUsage, readUsageLimits } from './usage.js';
202
- export type { UsageEstimate, UsageLimits } from './usage.js';
201
+ export {
202
+ CLAUDE_USAGE_MODELS,
203
+ computeUsage,
204
+ deriveUsageCalibration,
205
+ fixedBlockWindowFor,
206
+ normalizeClaudeUsageModel,
207
+ normalizeClaudeUsageModelKey,
208
+ parseWeeklyResetAnchor,
209
+ readUsageLimits,
210
+ weeklyWindowFor,
211
+ } from './usage.js';
212
+ export type {
213
+ ClaudeUsageModel,
214
+ UsageCalibrationChange,
215
+ UsageCalibrationInput,
216
+ UsageCalibrationPlan,
217
+ UsageEstimate,
218
+ UsageLimits,
219
+ UsageModelEstimate,
220
+ UsageWindow,
221
+ WeeklyResetAnchor,
222
+ } from './usage.js';