@integrity-labs/agt-cli 0.28.694 → 0.28.695

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/dist/bin/agt.js +5 -5
  2. package/dist/{chunk-7F4RC4PU.js → chunk-A2W4K7IH.js} +4 -4
  3. package/dist/{chunk-YLADZNC5.js → chunk-OUERGATQ.js} +2 -2
  4. package/dist/{chunk-NYWCE5JH.js → chunk-XB2RCS5S.js} +254 -79
  5. package/dist/chunk-XB2RCS5S.js.map +1 -0
  6. package/dist/{claude-pair-runtime-WRVD63Q7.js → claude-pair-runtime-MRA4KSDR.js} +2 -2
  7. package/dist/lib/manager-worker.js +271 -144
  8. package/dist/lib/manager-worker.js.map +1 -1
  9. package/dist/mcp/direct-chat-channel.js +113 -78
  10. package/dist/mcp/index.js +48 -3
  11. package/dist/mcp/origami.js +48 -3
  12. package/dist/mcp/slack-channel.js +113 -78
  13. package/dist/mcp/telegram-channel.js +113 -78
  14. package/dist/{persistent-session-WC27KXJE.js → persistent-session-PEY2TMJI.js} +3 -3
  15. package/dist/{responsiveness-probe-V5M5OXNB.js → responsiveness-probe-VJP2AHNR.js} +3 -3
  16. package/dist/{session-auth-dead-TVTRCTJR.js → session-auth-dead-QCZ2EOVS.js} +2 -2
  17. package/package.json +1 -1
  18. package/dist/chunk-NYWCE5JH.js.map +0 -1
  19. /package/dist/{chunk-7F4RC4PU.js.map → chunk-A2W4K7IH.js.map} +0 -0
  20. /package/dist/{chunk-YLADZNC5.js.map → chunk-OUERGATQ.js.map} +0 -0
  21. /package/dist/{claude-pair-runtime-WRVD63Q7.js.map → claude-pair-runtime-MRA4KSDR.js.map} +0 -0
  22. /package/dist/{persistent-session-WC27KXJE.js.map → persistent-session-PEY2TMJI.js.map} +0 -0
  23. /package/dist/{responsiveness-probe-V5M5OXNB.js.map → responsiveness-probe-VJP2AHNR.js.map} +0 -0
  24. /package/dist/{session-auth-dead-TVTRCTJR.js.map → session-auth-dead-QCZ2EOVS.js.map} +0 -0
package/dist/bin/agt.js CHANGED
@@ -40,10 +40,10 @@ import {
40
40
  success,
41
41
  table,
42
42
  warn
43
- } from "../chunk-7F4RC4PU.js";
43
+ } from "../chunk-A2W4K7IH.js";
44
44
  import {
45
45
  readDirectChatSessionState
46
- } from "../chunk-YLADZNC5.js";
46
+ } from "../chunk-OUERGATQ.js";
47
47
  import {
48
48
  AnchorSessionClient,
49
49
  CHANNEL_REGISTRY,
@@ -73,7 +73,7 @@ import {
73
73
  requiredMcpWildcard,
74
74
  resolveChannels,
75
75
  serializeManifestForSlackCli
76
- } from "../chunk-NYWCE5JH.js";
76
+ } from "../chunk-XB2RCS5S.js";
77
77
  import "../chunk-XWVM4KPK.js";
78
78
 
79
79
  // src/bin/agt.ts
@@ -4909,7 +4909,7 @@ import { execFileSync, execSync } from "child_process";
4909
4909
  import { existsSync as existsSync10, realpathSync as realpathSync2 } from "fs";
4910
4910
  import chalk18 from "chalk";
4911
4911
  import ora16 from "ora";
4912
- var cliVersion = true ? "0.28.694" : "dev";
4912
+ var cliVersion = true ? "0.28.695" : "dev";
4913
4913
  async function fetchLatestVersion() {
4914
4914
  const host2 = getHost();
4915
4915
  if (!host2) return null;
@@ -6089,7 +6089,7 @@ function handleError(err) {
6089
6089
  }
6090
6090
 
6091
6091
  // src/bin/agt.ts
6092
- var cliVersion2 = true ? "0.28.694" : "dev";
6092
+ var cliVersion2 = true ? "0.28.695" : "dev";
6093
6093
  var program = new Command();
6094
6094
  program.name("agt").description("Augmented CLI \u2014 agent provisioning and management").version(cliVersion2).option("--json", "Emit machine-readable JSON output (suppress spinners and colors)").option("--skip-update-check", "Skip the automatic update check on startup");
6095
6095
  program.hook("preAction", async (thisCommand, actionCommand) => {
@@ -12,7 +12,7 @@ import {
12
12
  parseEnvFileEntries,
13
13
  parseEnvIntegrations,
14
14
  shellQuote
15
- } from "./chunk-YLADZNC5.js";
15
+ } from "./chunk-OUERGATQ.js";
16
16
  import {
17
17
  BIND_FAILURE_QUARANTINE_THRESHOLD,
18
18
  INTEGRATIONS_SECTION_END,
@@ -59,7 +59,7 @@ import {
59
59
  resolveConnectivityProbe,
60
60
  worseConnectivityOutcome,
61
61
  wrapScheduledTaskPrompt
62
- } from "./chunk-NYWCE5JH.js";
62
+ } from "./chunk-XB2RCS5S.js";
63
63
  import {
64
64
  parsePsRows
65
65
  } from "./chunk-XWVM4KPK.js";
@@ -6329,7 +6329,7 @@ function exchangeFailureKind(err) {
6329
6329
  }
6330
6330
 
6331
6331
  // src/lib/api-client.ts
6332
- var agtCliVersion = true ? "0.28.694" : "dev";
6332
+ var agtCliVersion = true ? "0.28.695" : "dev";
6333
6333
  var lastConfigHash = null;
6334
6334
  function setConfigHash(hash) {
6335
6335
  lastConfigHash = hash && hash.length > 0 ? hash : null;
@@ -10070,4 +10070,4 @@ export {
10070
10070
  managerInstallSystemUnitCommand,
10071
10071
  managerUninstallSystemUnitCommand
10072
10072
  };
10073
- //# sourceMappingURL=chunk-7F4RC4PU.js.map
10073
+ //# sourceMappingURL=chunk-A2W4K7IH.js.map
@@ -17,7 +17,7 @@ import {
17
17
  rotateDailySession,
18
18
  sessionFileExists,
19
19
  todayLocalIso
20
- } from "./chunk-NYWCE5JH.js";
20
+ } from "./chunk-XB2RCS5S.js";
21
21
  import {
22
22
  reapOrphanChannelMcps
23
23
  } from "./chunk-XWVM4KPK.js";
@@ -4531,4 +4531,4 @@ export {
4531
4531
  stopAllSessionsAndWait,
4532
4532
  getProjectDir
4533
4533
  };
4534
- //# sourceMappingURL=chunk-YLADZNC5.js.map
4534
+ //# sourceMappingURL=chunk-OUERGATQ.js.map
@@ -11129,6 +11129,111 @@ var SCHEDULED_TURN_MARKER_FILENAME = ".current-scheduled-turn.json";
11129
11129
  // ../../packages/core/dist/liveness/agent-liveness.js
11130
11130
  var FRESH_HEARTBEAT_THRESHOLD_MS = 2 * 60 * 1e3;
11131
11131
 
11132
+ // ../../packages/core/dist/claude-code-usage/reset-time.js
11133
+ var MONTHS = [
11134
+ "jan",
11135
+ "feb",
11136
+ "mar",
11137
+ "apr",
11138
+ "may",
11139
+ "jun",
11140
+ "jul",
11141
+ "aug",
11142
+ "sep",
11143
+ "oct",
11144
+ "nov",
11145
+ "dec"
11146
+ ];
11147
+ var FULL_MONTHS = [
11148
+ "january",
11149
+ "february",
11150
+ "march",
11151
+ "april",
11152
+ "may",
11153
+ "june",
11154
+ "july",
11155
+ "august",
11156
+ "september",
11157
+ "october",
11158
+ "november",
11159
+ "december"
11160
+ ];
11161
+ var MONTH_TOKENS = new Map([
11162
+ ...MONTHS.map((m, i) => [m, i]),
11163
+ ...FULL_MONTHS.map((m, i) => [m, i]),
11164
+ // "Sept" is the one four-letter abbreviation in common use and is inside the
11165
+ // {3,9} the grammar accepts, so it is reachable and must resolve.
11166
+ ["sept", 8]
11167
+ ]);
11168
+ var TIME_OF_DAY_SOURCE = /\d{1,2}(?::\d{2})?\s*(?:am|pm)(?:\s*\(?UTC\)?)?/.source;
11169
+ var RESET_DATE_SOURCE = `(?:[A-Za-z]{3,9}\\s+\\d{1,2}(?:\\s*,\\s*${TIME_OF_DAY_SOURCE})?|${TIME_OF_DAY_SOURCE})`;
11170
+ var TIME_TAIL = /,\s*(\d{1,2})(?::(\d{2}))?\s*(am|pm)(?:\s*\(?UTC\)?)?\s*$/i;
11171
+ var TIME_ONLY = /^(\d{1,2})(?::(\d{2}))?\s*(am|pm)(?:\s*\(?UTC\)?)?$/i;
11172
+ var MS_PER_DAY = 24 * 60 * 60 * 1e3;
11173
+ function parseAmPm(hourStr, minStr, ampm) {
11174
+ const rawHour = Number.parseInt(hourStr, 10);
11175
+ if (!Number.isFinite(rawHour) || rawHour < 1 || rawHour > 12)
11176
+ return null;
11177
+ let minute = 0;
11178
+ if (minStr) {
11179
+ minute = Number.parseInt(minStr, 10);
11180
+ if (!Number.isFinite(minute) || minute < 0 || minute > 59)
11181
+ return null;
11182
+ }
11183
+ const isPm = ampm.toLowerCase() === "pm";
11184
+ return { hour: rawHour % 12 + (isPm ? 12 : 0), minute };
11185
+ }
11186
+ function parseResetDateTime(humanDate, now) {
11187
+ const trimmed = humanDate.trim();
11188
+ const timeOnly = trimmed.match(TIME_ONLY);
11189
+ if (timeOnly) {
11190
+ const hm = parseAmPm(timeOnly[1], timeOnly[2], timeOnly[3]);
11191
+ if (!hm)
11192
+ return null;
11193
+ const todayAt = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), hm.hour, hm.minute);
11194
+ return {
11195
+ at: new Date(todayAt <= now.getTime() ? todayAt + MS_PER_DAY : todayAt),
11196
+ precision: "hour_only"
11197
+ };
11198
+ }
11199
+ const timeMatch = trimmed.match(TIME_TAIL);
11200
+ const dateOnly = timeMatch ? trimmed.slice(0, timeMatch.index).trim() : trimmed;
11201
+ const parts = dateOnly.split(/\s+/);
11202
+ if (parts.length !== 2)
11203
+ return null;
11204
+ const lookedUpMonth = MONTH_TOKENS.get(parts[0].toLowerCase());
11205
+ if (lookedUpMonth === void 0)
11206
+ return null;
11207
+ const month = lookedUpMonth;
11208
+ const day = Number.parseInt(parts[1], 10);
11209
+ if (!Number.isFinite(day) || day < 1 || day > 31)
11210
+ return null;
11211
+ let hour = 0;
11212
+ let minute = 0;
11213
+ if (timeMatch) {
11214
+ const hm = parseAmPm(timeMatch[1], timeMatch[2], timeMatch[3]);
11215
+ if (!hm)
11216
+ return null;
11217
+ hour = hm.hour;
11218
+ minute = hm.minute;
11219
+ }
11220
+ const baseYear = now.getUTCFullYear();
11221
+ let resolved = null;
11222
+ let bestDelta = Number.POSITIVE_INFINITY;
11223
+ for (const y of [baseYear - 1, baseYear, baseYear + 1]) {
11224
+ const candidate = new Date(Date.UTC(y, month, day, hour, minute));
11225
+ if (candidate.getUTCFullYear() !== y || candidate.getUTCMonth() !== month || candidate.getUTCDate() !== day) {
11226
+ continue;
11227
+ }
11228
+ const delta = Math.abs(candidate.getTime() - now.getTime());
11229
+ if (delta < bestDelta) {
11230
+ bestDelta = delta;
11231
+ resolved = candidate;
11232
+ }
11233
+ }
11234
+ return resolved ? { at: resolved, precision: "dated" } : null;
11235
+ }
11236
+
11132
11237
  // ../../packages/core/dist/claude-code-usage/banner-parser.js
11133
11238
  var SESSION_QUALIFIER = /^(?:session|\d{1,2}\s*-?\s*hours?|\d{1,2}h)$/i;
11134
11239
  function classifyLimitScope(qualifier) {
@@ -11143,8 +11248,7 @@ function classifyLimitScope(qualifier) {
11143
11248
  }
11144
11249
  var SEP = /[\s·\-–—]+/.source;
11145
11250
  var SUBJECT = /(?:You(?:['’]ve|\s+have)?\s+)?/.source;
11146
- var TIME_OF_DAY = /\d{1,2}(?::\d{2})?\s*(?:am|pm)(?:\s*\(?UTC\)?)?/.source;
11147
- var RESET_DATE = `(?:[A-Za-z]{3,9}\\s+\\d{1,2}(?:\\s*,\\s*${TIME_OF_DAY})?|${TIME_OF_DAY})`;
11251
+ var RESET_DATE = RESET_DATE_SOURCE;
11148
11252
  var BANNER_PATTERNS = [
11149
11253
  // Percentage form — pct in group 1, reset in group 2.
11150
11254
  new RegExp(`${SUBJECT}used\\s+(\\d{1,3})%\\s+of\\s+your\\s+weekly\\s+limit${SEP}resets\\s+(${RESET_DATE})`, "i"),
@@ -11219,82 +11323,6 @@ function parseUsageBanner(text, now = /* @__PURE__ */ new Date()) {
11219
11323
  }
11220
11324
  return best;
11221
11325
  }
11222
- var MONTHS = [
11223
- "jan",
11224
- "feb",
11225
- "mar",
11226
- "apr",
11227
- "may",
11228
- "jun",
11229
- "jul",
11230
- "aug",
11231
- "sep",
11232
- "oct",
11233
- "nov",
11234
- "dec"
11235
- ];
11236
- var TIME_TAIL = /,\s*(\d{1,2})(?::(\d{2}))?\s*(am|pm)(?:\s*\(?UTC\)?)?\s*$/i;
11237
- var TIME_ONLY = /^(\d{1,2})(?::(\d{2}))?\s*(am|pm)(?:\s*\(?UTC\)?)?$/i;
11238
- var MS_PER_DAY = 24 * 60 * 60 * 1e3;
11239
- function parseAmPm(hourStr, minStr, ampm) {
11240
- const rawHour = Number.parseInt(hourStr, 10);
11241
- if (!Number.isFinite(rawHour) || rawHour < 1 || rawHour > 12)
11242
- return null;
11243
- let minute = 0;
11244
- if (minStr) {
11245
- minute = Number.parseInt(minStr, 10);
11246
- if (!Number.isFinite(minute) || minute < 0 || minute > 59)
11247
- return null;
11248
- }
11249
- const isPm = ampm.toLowerCase() === "pm";
11250
- return { hour: rawHour % 12 + (isPm ? 12 : 0), minute };
11251
- }
11252
- function parseResetDateTime(humanDate, now) {
11253
- const trimmed = humanDate.trim();
11254
- const timeOnly = trimmed.match(TIME_ONLY);
11255
- if (timeOnly) {
11256
- const hm = parseAmPm(timeOnly[1], timeOnly[2], timeOnly[3]);
11257
- if (!hm)
11258
- return null;
11259
- const todayAt = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), hm.hour, hm.minute);
11260
- return {
11261
- at: new Date(todayAt <= now.getTime() ? todayAt + MS_PER_DAY : todayAt),
11262
- precision: "hour_only"
11263
- };
11264
- }
11265
- const timeMatch = trimmed.match(TIME_TAIL);
11266
- const dateOnly = timeMatch ? trimmed.slice(0, timeMatch.index).trim() : trimmed;
11267
- const parts = dateOnly.split(/\s+/);
11268
- if (parts.length !== 2)
11269
- return null;
11270
- const month = MONTHS.indexOf(parts[0].slice(0, 3).toLowerCase());
11271
- if (month < 0)
11272
- return null;
11273
- const day = Number.parseInt(parts[1], 10);
11274
- if (!Number.isFinite(day) || day < 1 || day > 31)
11275
- return null;
11276
- let hour = 0;
11277
- let minute = 0;
11278
- if (timeMatch) {
11279
- const hm = parseAmPm(timeMatch[1], timeMatch[2], timeMatch[3]);
11280
- if (!hm)
11281
- return null;
11282
- hour = hm.hour;
11283
- minute = hm.minute;
11284
- }
11285
- const baseYear = now.getUTCFullYear();
11286
- let resolved = null;
11287
- let bestDelta = Number.POSITIVE_INFINITY;
11288
- for (const y of [baseYear - 1, baseYear, baseYear + 1]) {
11289
- const candidate = new Date(Date.UTC(y, month, day, hour, minute));
11290
- const delta = Math.abs(candidate.getTime() - now.getTime());
11291
- if (delta < bestDelta) {
11292
- bestDelta = delta;
11293
- resolved = candidate;
11294
- }
11295
- }
11296
- return resolved ? { at: resolved, precision: "dated" } : null;
11297
- }
11298
11326
 
11299
11327
  // ../../packages/core/dist/claude-code-usage/transcript-parser.js
11300
11328
  function nonNegInt(value) {
@@ -11521,6 +11549,150 @@ function attributeTranscriptUsageByRun(jsonl) {
11521
11549
  return { perRunModel: [...agg.values()], runIds: [...runIds] };
11522
11550
  }
11523
11551
 
11552
+ // ../../packages/core/dist/claude-code-usage/usage-report-parser.js
11553
+ var AGGREGATE_BUCKET = "all models";
11554
+ var SEP2 = /[\s·\-–—]+/.source;
11555
+ var WINDOW_LINE = new RegExp(`^\\s*Current\\s+(session|week)(?:\\s*\\(([^)]*)\\))?\\s*:\\s*(\\d{1,3})%\\s+used(?:${SEP2}resets\\s+(${RESET_DATE_SOURCE}))?\\s*$`, "gim");
11556
+ var SUBSCRIPTION_LINE = /using\s+your\s+subscription\s+to\s+power\s+your\s+Claude\s+Code\s+usage/i;
11557
+ function parseUsageReport(text, now = /* @__PURE__ */ new Date()) {
11558
+ if (typeof text !== "string" || text.length === 0)
11559
+ return null;
11560
+ const windows = [];
11561
+ const pattern = new RegExp(WINDOW_LINE.source, WINDOW_LINE.flags);
11562
+ let match;
11563
+ while ((match = pattern.exec(text)) !== null) {
11564
+ if (match.index === pattern.lastIndex)
11565
+ pattern.lastIndex++;
11566
+ const kind = match[1].toLowerCase();
11567
+ const bucketRaw = match[2];
11568
+ const pct = Number.parseInt(match[3], 10);
11569
+ const resetStr = match[4];
11570
+ if (!Number.isFinite(pct) || pct < 0 || pct > 100)
11571
+ continue;
11572
+ let resetsAt = null;
11573
+ let resetPrecision = null;
11574
+ if (resetStr) {
11575
+ const resolved = parseResetDateTime(resetStr, now);
11576
+ if (!resolved)
11577
+ continue;
11578
+ resetsAt = resolved.at;
11579
+ resetPrecision = resolved.precision;
11580
+ }
11581
+ windows.push({
11582
+ kind,
11583
+ bucket: bucketRaw === void 0 ? null : bucketRaw.trim(),
11584
+ pct,
11585
+ resetsAt,
11586
+ resetPrecision
11587
+ });
11588
+ }
11589
+ if (windows.length === 0)
11590
+ return null;
11591
+ const session = windows.find((w) => w.kind === "session") ?? null;
11592
+ const weeks = windows.filter((w) => w.kind === "week");
11593
+ const week = weeks.find((w) => (w.bucket ?? "").toLowerCase() === AGGREGATE_BUCKET) ?? // Defensive: if the CLI ever drops the "(all models)" label from the
11594
+ // aggregate, a bucket-less weekly line is still the aggregate. A per-model
11595
+ // bucket always names its model, so this cannot capture one by accident.
11596
+ weeks.find((w) => w.bucket === null) ?? null;
11597
+ const perModelWeek = weeks.filter((w) => w !== week);
11598
+ return {
11599
+ subscription: SUBSCRIPTION_LINE.test(text),
11600
+ session,
11601
+ week,
11602
+ perModelWeek,
11603
+ windows
11604
+ };
11605
+ }
11606
+
11607
+ // ../../packages/core/dist/claude-code-usage/host-usage-reading.js
11608
+ var HOST_USAGE_SOURCE = "cli_print_usage";
11609
+ function unknown(reason, readAt, cliVersion) {
11610
+ return {
11611
+ state: "unknown",
11612
+ weekPct: null,
11613
+ weekResetsAt: null,
11614
+ sessionPct: null,
11615
+ sessionResetsAt: null,
11616
+ readAt,
11617
+ cliVersion,
11618
+ source: HOST_USAGE_SOURCE,
11619
+ unknownReason: reason
11620
+ };
11621
+ }
11622
+ function buildHostUsageReading(input) {
11623
+ const { report, readAt, cliVersion, authMode, pollFailed } = input;
11624
+ if (authMode != null && authMode !== "subscription") {
11625
+ return {
11626
+ state: "not_applicable",
11627
+ weekPct: null,
11628
+ weekResetsAt: null,
11629
+ sessionPct: null,
11630
+ sessionResetsAt: null,
11631
+ readAt,
11632
+ cliVersion,
11633
+ source: HOST_USAGE_SOURCE,
11634
+ unknownReason: null
11635
+ };
11636
+ }
11637
+ if (pollFailed)
11638
+ return unknown("poll_failed", readAt, cliVersion);
11639
+ if (!report)
11640
+ return unknown("unparseable_output", readAt, cliVersion);
11641
+ if (!report.subscription) {
11642
+ return {
11643
+ state: "not_applicable",
11644
+ weekPct: null,
11645
+ weekResetsAt: null,
11646
+ sessionPct: null,
11647
+ sessionResetsAt: null,
11648
+ readAt,
11649
+ cliVersion,
11650
+ source: HOST_USAGE_SOURCE,
11651
+ unknownReason: null
11652
+ };
11653
+ }
11654
+ if (!report.week && !report.session) {
11655
+ return unknown("unparseable_output", readAt, cliVersion);
11656
+ }
11657
+ return {
11658
+ state: "ok",
11659
+ weekPct: report.week?.pct ?? null,
11660
+ // ONLY a DATED reset is stored (CodeRabbit on #4988).
11661
+ //
11662
+ // Print mode has always rendered a date, so `hour_only` here means the CLI
11663
+ // changed its render and `parseResetDateTime` reconstructed the day from an
11664
+ // hour. That reconstruction can never be more than 24h out, and storing it
11665
+ // in a column consumers treat as a measurement is precisely ENG-8472: every
11666
+ // host whose render named the same hour landed on the same millisecond, and
11667
+ // eleven days went into reading that as evidence of a shared subscription.
11668
+ //
11669
+ // The PERCENTAGE survives - it is a real reading either way, and dropping it
11670
+ // would blind the fleet over a formatting change. Only the boundary is
11671
+ // withheld, which degrades an alert to "cannot auto-close at reset" rather
11672
+ // than to "asserts a reset instant nobody measured".
11673
+ weekResetsAt: datedResetOnly(report.week),
11674
+ sessionPct: report.session?.pct ?? null,
11675
+ sessionResetsAt: datedResetOnly(report.session),
11676
+ readAt,
11677
+ cliVersion,
11678
+ source: HOST_USAGE_SOURCE,
11679
+ unknownReason: null
11680
+ };
11681
+ }
11682
+ function datedResetOnly(window) {
11683
+ if (!window || !window.resetsAt)
11684
+ return null;
11685
+ return window.resetPrecision === "dated" ? window.resetsAt : null;
11686
+ }
11687
+ var RESET_JITTER_TOLERANCE_MS = 5 * 60 * 1e3;
11688
+ function stabiliseResetInstant(previous, next, toleranceMs = RESET_JITTER_TOLERANCE_MS) {
11689
+ if (!next)
11690
+ return null;
11691
+ if (!previous)
11692
+ return next;
11693
+ return Math.abs(next.getTime() - previous.getTime()) <= toleranceMs ? previous : next;
11694
+ }
11695
+
11524
11696
  // ../../packages/core/dist/claude-code-usage/rate-limit-classifier.js
11525
11697
  var UNKNOWN_RATE_LIMIT = Object.freeze({
11526
11698
  verdict: "unknown",
@@ -12571,6 +12743,9 @@ export {
12571
12743
  sumTranscriptUsageInWindow,
12572
12744
  isEmptyTotals,
12573
12745
  attributeTranscriptUsageByRun,
12746
+ parseUsageReport,
12747
+ buildHostUsageReading,
12748
+ stabiliseResetInstant,
12574
12749
  UNKNOWN_RATE_LIMIT,
12575
12750
  pickNewerClassification,
12576
12751
  classifyTranscriptRateLimit,
@@ -12622,4 +12797,4 @@ export {
12622
12797
  minutesSinceLocalMidnight,
12623
12798
  peekCurrentSession
12624
12799
  };
12625
- //# sourceMappingURL=chunk-NYWCE5JH.js.map
12800
+ //# sourceMappingURL=chunk-XB2RCS5S.js.map