sidekick-agent-hub 0.21.4 → 0.21.6
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/README.md +4 -3
- package/dist/sidekick-cli.mjs +208 -39
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -8,6 +8,7 @@ Sidekick CLI reads from `~/.config/sidekick/` — the same data files the [VS Co
|
|
|
8
8
|
|
|
9
9
|
## What's New
|
|
10
10
|
|
|
11
|
+
- **Codex reset credits** — when Codex quota is refreshed from the API, `sidekick quota` now lists available rate-limit reset credits (`Reset Credits: N available`) and their expirations.
|
|
11
12
|
- **`sidekick quota --provider zai`** — authoritative z.ai Coding Plan quota (5-Hour / Weekly) from z.ai's quota API, using OpenCode's stored z.ai token when available.
|
|
12
13
|
- **`sidekick extract`** — pull URLs, file paths, commands, and plans out of recent Claude Code and Codex chats, with `--json` and an interactive picker.
|
|
13
14
|
- **`sidekick quota history`** — a 13-week, per-workspace, GitHub-style heatmap of session-limit utilization.
|
|
@@ -157,7 +158,7 @@ sidekick quota
|
|
|
157
158
|
Provider-aware quota and rate-limit display. The command auto-detects the active provider:
|
|
158
159
|
|
|
159
160
|
- **Claude Code**: Shows Claude Max subscription quota — 5-hour and 7-day windows with color-coded progress bars, projections, and reset countdowns. Includes a peak-hours summary line.
|
|
160
|
-
- **Codex**: Shows rate limits from Codex `token_count.rate_limits` events — primary and secondary windows with progress bars, projected end-of-window utilization, and reset countdowns. The default path is local-only: current workspace rollout, recent account-level rollouts, then the active account's cached snapshot. Add `--refresh` to explicitly refresh from Codex's usage API before falling back to local data.
|
|
161
|
+
- **Codex**: Shows rate limits from Codex `token_count.rate_limits` events — primary and secondary windows with progress bars, projected end-of-window utilization, and reset countdowns. The default path is local-only: current workspace rollout, recent account-level rollouts, then the active account's cached snapshot. Add `--refresh` to explicitly refresh from Codex's usage API before falling back to local data. When refreshed from the API, the output also lists any available **reset credits** — a `Reset Credits: N available` line plus each credit's expiration.
|
|
161
162
|
- **OpenCode / z.ai**: OpenCode has no native rate-limit data, but when z.ai Coding Plan credentials are available, `sidekick quota --provider opencode` can auto-route to authoritative z.ai quota (5-Hour / Weekly, with projected end-of-window utilization). Use `--provider zai` to request it explicitly. z.ai quota is read from z.ai's quota API using OpenCode's stored token, with fallback support for `ANTHROPIC_BASE_URL` and `ANTHROPIC_AUTH_TOKEN`.
|
|
162
163
|
|
|
163
164
|
Every provider renders in the same aligned table — a `now` column (current utilization), a `projected` column (estimated end-of-window utilization, or `—` when it can't be computed), and a `resets` countdown:
|
|
@@ -172,11 +173,11 @@ Subscription Quota now projected resets
|
|
|
172
173
|
|
|
173
174
|
When quota data is unavailable, `sidekick quota` shows structured auth, rate-limit, network, server, or unexpected-failure messaging instead of a generic raw error. The dashboard Sessions panel also keeps a compact inline quota/rate-limit state visible instead of hiding the section entirely.
|
|
174
175
|
|
|
175
|
-
Use `--json` for machine-readable output. Use `--provider codex` to explicitly check Codex rate limits, and `--refresh` to opt in to a Codex usage API refresh. Claude Code requires active credentials (read from the system Keychain on macOS, or `~/.claude/.credentials.json` on Linux/Windows). JSON output includes `failureKind`, `httpStatus`, and `retryAfterMs` on unavailable responses.
|
|
176
|
+
Use `--json` for machine-readable output. Use `--provider codex` to explicitly check Codex rate limits, and `--refresh` to opt in to a Codex usage API refresh for that single-provider check (the combined `--all` view is API-first for Codex — see below). Claude Code requires active credentials (read from the system Keychain on macOS, or `~/.claude/.credentials.json` on Linux/Windows). JSON output includes `failureKind`, `httpStatus`, and `retryAfterMs` on unavailable responses.
|
|
176
177
|
|
|
177
178
|
When multi-account is enabled, `sidekick quota` shows the currently logged-in account email above the quota bars — resolved live from the provider's auth, so it stays correct even after a native `claude login` / `codex login`.
|
|
178
179
|
|
|
179
|
-
Use `sidekick quota --all` to show Claude and Codex quota together in a single run, plus z.ai when API quota is available or z.ai traffic is active. Each provider degrades independently — if one provider's quota can't be fetched, its error is shown inline and the others still render (the command never aborts on a single provider's failure). `--all --json` emits a provider-keyed payload for dashboards and automation.
|
|
180
|
+
Use `sidekick quota --all` to show Claude and Codex quota together in a single run, plus z.ai when API quota is available or z.ai traffic is active. Each provider degrades independently — if one provider's quota can't be fetched, its error is shown inline and the others still render (the command never aborts on a single provider's failure). Codex is fetched **API-first** under `--all` (falling back to local rollouts and the cached snapshot), matching the live Claude and z.ai legs, so the combined view reflects the authoritative aggregate plan quota. `--all --json` emits a provider-keyed payload for dashboards and automation.
|
|
180
181
|
|
|
181
182
|
### Quota History
|
|
182
183
|
|
package/dist/sidekick-cli.mjs
CHANGED
|
@@ -3366,6 +3366,18 @@ var init_esm = __esm({
|
|
|
3366
3366
|
}
|
|
3367
3367
|
});
|
|
3368
3368
|
|
|
3369
|
+
// ../sidekick-shared/dist/types/codex.js
|
|
3370
|
+
var require_codex = __commonJS({
|
|
3371
|
+
"../sidekick-shared/dist/types/codex.js"(exports) {
|
|
3372
|
+
"use strict";
|
|
3373
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3374
|
+
exports.isAggregateCodexLimit = isAggregateCodexLimit;
|
|
3375
|
+
function isAggregateCodexLimit(limitId) {
|
|
3376
|
+
return !limitId || limitId === "codex";
|
|
3377
|
+
}
|
|
3378
|
+
}
|
|
3379
|
+
});
|
|
3380
|
+
|
|
3369
3381
|
// ../sidekick-shared/dist/types/taskPersistence.js
|
|
3370
3382
|
var require_taskPersistence = __commonJS({
|
|
3371
3383
|
"../sidekick-shared/dist/types/taskPersistence.js"(exports) {
|
|
@@ -12435,6 +12447,7 @@ var require_codexParser = __commonJS({
|
|
|
12435
12447
|
exports.normalizeCodexToolName = normalizeCodexToolName;
|
|
12436
12448
|
exports.normalizeCodexToolInput = normalizeCodexToolInput;
|
|
12437
12449
|
exports.extractPatchFilePaths = extractPatchFilePaths;
|
|
12450
|
+
var codex_1 = require_codex();
|
|
12438
12451
|
var openCodeParser_1 = require_openCodeParser();
|
|
12439
12452
|
function normalizeRateLimits(rateLimits) {
|
|
12440
12453
|
if (!rateLimits?.primary && !rateLimits?.secondary)
|
|
@@ -12514,6 +12527,7 @@ var require_codexParser = __commonJS({
|
|
|
12514
12527
|
lastTokenUsage = null;
|
|
12515
12528
|
modelContextWindow = null;
|
|
12516
12529
|
lastRateLimits = null;
|
|
12530
|
+
hasAggregateRateLimits = false;
|
|
12517
12531
|
inPlanMode = false;
|
|
12518
12532
|
emittedToolUseIds = /* @__PURE__ */ new Set();
|
|
12519
12533
|
patchExpandedToolUseIds = /* @__PURE__ */ new Map();
|
|
@@ -12565,6 +12579,7 @@ var require_codexParser = __commonJS({
|
|
|
12565
12579
|
this.lastTokenUsage = null;
|
|
12566
12580
|
this.modelContextWindow = null;
|
|
12567
12581
|
this.lastRateLimits = null;
|
|
12582
|
+
this.hasAggregateRateLimits = false;
|
|
12568
12583
|
this.inPlanMode = false;
|
|
12569
12584
|
this.emittedToolUseIds.clear();
|
|
12570
12585
|
this.patchExpandedToolUseIds.clear();
|
|
@@ -12873,7 +12888,12 @@ var require_codexParser = __commonJS({
|
|
|
12873
12888
|
this.modelContextWindow = e.info.model_context_window;
|
|
12874
12889
|
}
|
|
12875
12890
|
if (e.rate_limits) {
|
|
12876
|
-
|
|
12891
|
+
if ((0, codex_1.isAggregateCodexLimit)(e.rate_limits.limit_id)) {
|
|
12892
|
+
this.lastRateLimits = e.rate_limits;
|
|
12893
|
+
this.hasAggregateRateLimits = true;
|
|
12894
|
+
} else if (!this.hasAggregateRateLimits) {
|
|
12895
|
+
this.lastRateLimits = e.rate_limits;
|
|
12896
|
+
}
|
|
12877
12897
|
}
|
|
12878
12898
|
const usage = e.info?.last_token_usage || e.info?.total_token_usage;
|
|
12879
12899
|
return this.handleTokenCount(timestamp, usage ?? null, e.rate_limits);
|
|
@@ -13342,7 +13362,7 @@ var require_codexDatabase = __commonJS({
|
|
|
13342
13362
|
});
|
|
13343
13363
|
|
|
13344
13364
|
// ../sidekick-shared/dist/providers/codex.js
|
|
13345
|
-
var
|
|
13365
|
+
var require_codex2 = __commonJS({
|
|
13346
13366
|
"../sidekick-shared/dist/providers/codex.js"(exports) {
|
|
13347
13367
|
"use strict";
|
|
13348
13368
|
var __createBinding = exports && exports.__createBinding || (Object.create ? (function(o, m, k, k2) {
|
|
@@ -21453,6 +21473,7 @@ var require_quotaSnapshots = __commonJS({
|
|
|
21453
21473
|
var fs10 = __importStar(__require("fs"));
|
|
21454
21474
|
var path9 = __importStar(__require("path"));
|
|
21455
21475
|
var paths_1 = require_paths();
|
|
21476
|
+
var codex_1 = require_codex();
|
|
21456
21477
|
function getQuotaSnapshotPath() {
|
|
21457
21478
|
return path9.join((0, paths_1.getConfigDir)(), "quota-snapshots.json");
|
|
21458
21479
|
}
|
|
@@ -21500,6 +21521,10 @@ var require_quotaSnapshots = __commonJS({
|
|
|
21500
21521
|
return Number.isFinite(ms) ? ms : 0;
|
|
21501
21522
|
}
|
|
21502
21523
|
function shouldKeepExistingSnapshot(existing, next) {
|
|
21524
|
+
const existingAggregate = (0, codex_1.isAggregateCodexLimit)(existing.limitId);
|
|
21525
|
+
const nextAggregate = (0, codex_1.isAggregateCodexLimit)(next.limitId);
|
|
21526
|
+
if (existingAggregate !== nextAggregate)
|
|
21527
|
+
return existingAggregate;
|
|
21503
21528
|
const existingPrimaryReset = windowResetMs(existing.fiveHour.resetsAt);
|
|
21504
21529
|
const nextPrimaryReset = windowResetMs(next.fiveHour.resetsAt);
|
|
21505
21530
|
if (existingPrimaryReset !== nextPrimaryReset)
|
|
@@ -21516,14 +21541,16 @@ var require_quotaSnapshots = __commonJS({
|
|
|
21516
21541
|
}
|
|
21517
21542
|
function writeQuotaSnapshot(providerId, accountId, quota) {
|
|
21518
21543
|
const store = readStore();
|
|
21544
|
+
const index = store.snapshots.findIndex((item) => item.providerId === providerId && item.accountId === accountId);
|
|
21545
|
+
const existingQuota = index >= 0 ? store.snapshots[index].quota : void 0;
|
|
21519
21546
|
const snapshot = {
|
|
21520
21547
|
...quota,
|
|
21521
21548
|
providerId,
|
|
21522
21549
|
capturedAt: quota.capturedAt ?? (/* @__PURE__ */ new Date()).toISOString(),
|
|
21523
21550
|
source: quota.source ?? "session",
|
|
21524
|
-
stale: false
|
|
21551
|
+
stale: false,
|
|
21552
|
+
resetCredits: quota.resetCredits ?? (providerId === "codex" ? existingQuota?.resetCredits : void 0)
|
|
21525
21553
|
};
|
|
21526
|
-
const index = store.snapshots.findIndex((item) => item.providerId === providerId && item.accountId === accountId);
|
|
21527
21554
|
if (index >= 0 && shouldKeepExistingSnapshot(store.snapshots[index].quota, snapshot)) {
|
|
21528
21555
|
return;
|
|
21529
21556
|
}
|
|
@@ -22470,15 +22497,18 @@ var require_codexQuota = __commonJS({
|
|
|
22470
22497
|
exports.resolveCodexQuotaFromLocalSources = resolveCodexQuotaFromLocalSources;
|
|
22471
22498
|
exports.resolveCodexQuota = resolveCodexQuota2;
|
|
22472
22499
|
exports.fetchCodexQuotaFromApi = fetchCodexQuotaFromApi;
|
|
22500
|
+
exports.fetchCodexResetCreditsFromApi = fetchCodexResetCreditsFromApi;
|
|
22473
22501
|
var fs10 = __importStar(__require("fs"));
|
|
22474
22502
|
var path9 = __importStar(__require("path"));
|
|
22475
22503
|
var codexProfiles_1 = require_codexProfiles();
|
|
22476
22504
|
var quotaSnapshots_1 = require_quotaSnapshots();
|
|
22477
22505
|
var quota_1 = require_quota();
|
|
22478
|
-
var codex_1 =
|
|
22506
|
+
var codex_1 = require_codex2();
|
|
22507
|
+
var codex_2 = require_codex();
|
|
22479
22508
|
var DEFAULT_TAIL_BYTES = 2 * 1024 * 1024;
|
|
22480
22509
|
var DEFAULT_MAX_SESSION_FILES = 50;
|
|
22481
22510
|
var CHATGPT_USAGE_URL = "https://chatgpt.com/backend-api/wham/usage";
|
|
22511
|
+
var CHATGPT_RESET_CREDITS_URL = "https://chatgpt.com/backend-api/wham/rate-limit-reset-credits";
|
|
22482
22512
|
function timestampMs(value, fallbackMs = 0) {
|
|
22483
22513
|
if (!value)
|
|
22484
22514
|
return fallbackMs;
|
|
@@ -22488,6 +22518,10 @@ var require_codexQuota = __commonJS({
|
|
|
22488
22518
|
function isPreferredQuotaHit(candidate, current) {
|
|
22489
22519
|
if (!current)
|
|
22490
22520
|
return true;
|
|
22521
|
+
const candidateAggregate = (0, codex_2.isAggregateCodexLimit)(candidate.quota.limitId);
|
|
22522
|
+
const currentAggregate = (0, codex_2.isAggregateCodexLimit)(current.quota.limitId);
|
|
22523
|
+
if (candidateAggregate !== currentAggregate)
|
|
22524
|
+
return candidateAggregate;
|
|
22491
22525
|
const candidatePrimaryReset = timestampMs(candidate.quota.fiveHour.resetsAt);
|
|
22492
22526
|
const currentPrimaryReset = timestampMs(current.quota.fiveHour.resetsAt);
|
|
22493
22527
|
if (candidatePrimaryReset !== currentPrimaryReset)
|
|
@@ -22567,6 +22601,33 @@ var require_codexQuota = __commonJS({
|
|
|
22567
22601
|
balance: credits.balance ?? void 0
|
|
22568
22602
|
};
|
|
22569
22603
|
}
|
|
22604
|
+
function normalizeCount(value) {
|
|
22605
|
+
return typeof value === "number" && Number.isFinite(value) ? value : 0;
|
|
22606
|
+
}
|
|
22607
|
+
function normalizeResetCreditsPayload(payload, capturedAt) {
|
|
22608
|
+
const credits = Array.isArray(payload.credits) ? payload.credits.flatMap((credit) => {
|
|
22609
|
+
const status = firstString(credit.status);
|
|
22610
|
+
const expiresAt = firstString(credit.expires_at);
|
|
22611
|
+
if (!status || !expiresAt)
|
|
22612
|
+
return [];
|
|
22613
|
+
return [
|
|
22614
|
+
{
|
|
22615
|
+
title: firstString(credit.title),
|
|
22616
|
+
status,
|
|
22617
|
+
resetType: firstString(credit.reset_type),
|
|
22618
|
+
expiresAt,
|
|
22619
|
+
grantedAt: firstString(credit.granted_at)
|
|
22620
|
+
}
|
|
22621
|
+
];
|
|
22622
|
+
}) : [];
|
|
22623
|
+
return {
|
|
22624
|
+
availableCount: normalizeCount(payload.available_count),
|
|
22625
|
+
totalEarnedCount: typeof payload.total_earned_count === "number" && Number.isFinite(payload.total_earned_count) ? payload.total_earned_count : void 0,
|
|
22626
|
+
credits,
|
|
22627
|
+
source: "api",
|
|
22628
|
+
capturedAt
|
|
22629
|
+
};
|
|
22630
|
+
}
|
|
22570
22631
|
function normalizeRateLimitReachedType(value) {
|
|
22571
22632
|
if (typeof value === "string")
|
|
22572
22633
|
return value;
|
|
@@ -22766,7 +22827,8 @@ var require_codexQuota = __commonJS({
|
|
|
22766
22827
|
}
|
|
22767
22828
|
async function fetchCodexQuotaFromApi(options = {}) {
|
|
22768
22829
|
const capturedAt = options.capturedAt ?? (/* @__PURE__ */ new Date()).toISOString();
|
|
22769
|
-
const
|
|
22830
|
+
const auth = options.accessToken != null ? { accessToken: options.accessToken, accountId: options.accountId } : readCodexAuth(options.codexHome ?? (0, codexProfiles_1.resolveSidekickCodexHome)());
|
|
22831
|
+
const accessToken = auth?.accessToken;
|
|
22770
22832
|
if (!accessToken) {
|
|
22771
22833
|
return {
|
|
22772
22834
|
fiveHour: { utilization: 0, resetsAt: "" },
|
|
@@ -22822,6 +22884,15 @@ var require_codexQuota = __commonJS({
|
|
|
22822
22884
|
sevenDayLabel: "Secondary"
|
|
22823
22885
|
};
|
|
22824
22886
|
}
|
|
22887
|
+
const resetCredits = await fetchCodexResetCreditsFromApi({
|
|
22888
|
+
...options,
|
|
22889
|
+
accessToken,
|
|
22890
|
+
accountId: auth?.accountId,
|
|
22891
|
+
capturedAt
|
|
22892
|
+
});
|
|
22893
|
+
if (resetCredits) {
|
|
22894
|
+
quota.resetCredits = resetCredits;
|
|
22895
|
+
}
|
|
22825
22896
|
return quota;
|
|
22826
22897
|
} catch {
|
|
22827
22898
|
return {
|
|
@@ -22838,12 +22909,46 @@ var require_codexQuota = __commonJS({
|
|
|
22838
22909
|
};
|
|
22839
22910
|
}
|
|
22840
22911
|
}
|
|
22841
|
-
function
|
|
22912
|
+
async function fetchCodexResetCreditsFromApi(options = {}) {
|
|
22913
|
+
const capturedAt = options.capturedAt ?? (/* @__PURE__ */ new Date()).toISOString();
|
|
22914
|
+
const auth = options.accessToken != null ? { accessToken: options.accessToken, accountId: options.accountId } : readCodexAuth(options.codexHome ?? (0, codexProfiles_1.resolveSidekickCodexHome)());
|
|
22915
|
+
const accessToken = auth?.accessToken;
|
|
22916
|
+
if (!accessToken)
|
|
22917
|
+
return void 0;
|
|
22918
|
+
try {
|
|
22919
|
+
const fetchImpl = options.fetchImpl ?? fetch;
|
|
22920
|
+
const headers = {
|
|
22921
|
+
Authorization: `Bearer ${accessToken}`,
|
|
22922
|
+
originator: "Codex Desktop",
|
|
22923
|
+
"OAI-Product-Sku": "CODEX",
|
|
22924
|
+
Accept: "application/json"
|
|
22925
|
+
};
|
|
22926
|
+
if (auth?.accountId) {
|
|
22927
|
+
headers["ChatGPT-Account-ID"] = auth.accountId;
|
|
22928
|
+
}
|
|
22929
|
+
const response = await fetchImpl(options.resetCreditsUrl ?? CHATGPT_RESET_CREDITS_URL, {
|
|
22930
|
+
method: "GET",
|
|
22931
|
+
headers
|
|
22932
|
+
});
|
|
22933
|
+
if (!response.ok)
|
|
22934
|
+
return void 0;
|
|
22935
|
+
return normalizeResetCreditsPayload(await response.json(), capturedAt);
|
|
22936
|
+
} catch {
|
|
22937
|
+
return void 0;
|
|
22938
|
+
}
|
|
22939
|
+
}
|
|
22940
|
+
function readCodexAuth(codexHome) {
|
|
22842
22941
|
try {
|
|
22843
22942
|
const parsed = JSON.parse(fs10.readFileSync(path9.join(codexHome, "auth.json"), "utf8"));
|
|
22844
22943
|
if (parsed.OPENAI_API_KEY || parsed.auth_mode === "api_key")
|
|
22845
22944
|
return null;
|
|
22846
|
-
|
|
22945
|
+
const accessToken = parsed.tokens?.access_token;
|
|
22946
|
+
if (!accessToken)
|
|
22947
|
+
return null;
|
|
22948
|
+
return {
|
|
22949
|
+
accessToken,
|
|
22950
|
+
accountId: parsed.tokens?.account_id
|
|
22951
|
+
};
|
|
22847
22952
|
} catch {
|
|
22848
22953
|
return null;
|
|
22849
22954
|
}
|
|
@@ -22867,6 +22972,7 @@ var require_codexQuota = __commonJS({
|
|
|
22867
22972
|
text = firstNewline >= 0 ? text.slice(firstNewline + 1) : "";
|
|
22868
22973
|
}
|
|
22869
22974
|
const lines = text.split("\n");
|
|
22975
|
+
let fallback = null;
|
|
22870
22976
|
for (let i = lines.length - 1; i >= 0; i--) {
|
|
22871
22977
|
const line = lines[i].trim();
|
|
22872
22978
|
if (!line || !line.includes("rate_limits"))
|
|
@@ -22876,11 +22982,18 @@ var require_codexQuota = __commonJS({
|
|
|
22876
22982
|
if (parsed.type !== "event_msg" || parsed.payload?.type !== "token_count")
|
|
22877
22983
|
continue;
|
|
22878
22984
|
const quota = quotaFromCodexRateLimits2(parsed.payload.rate_limits, source, parsed.timestamp ?? new Date(stat.mtime).toISOString());
|
|
22879
|
-
if (quota)
|
|
22880
|
-
|
|
22985
|
+
if (!quota)
|
|
22986
|
+
continue;
|
|
22987
|
+
const hit = { quota, filePath: sessionPath, mtimeMs: stat.mtime.getTime() };
|
|
22988
|
+
if ((0, codex_2.isAggregateCodexLimit)(quota.limitId))
|
|
22989
|
+
return hit;
|
|
22990
|
+
if (!fallback)
|
|
22991
|
+
fallback = hit;
|
|
22881
22992
|
} catch {
|
|
22882
22993
|
}
|
|
22883
22994
|
}
|
|
22995
|
+
if (fallback)
|
|
22996
|
+
return fallback;
|
|
22884
22997
|
} catch {
|
|
22885
22998
|
return null;
|
|
22886
22999
|
} finally {
|
|
@@ -22974,7 +23087,7 @@ var require_codexQuotaWatcher = __commonJS({
|
|
|
22974
23087
|
var codexQuota_1 = require_codexQuota();
|
|
22975
23088
|
var quotaSnapshots_1 = require_quotaSnapshots();
|
|
22976
23089
|
var quotaHistory_1 = require_quotaHistory();
|
|
22977
|
-
var codex_1 =
|
|
23090
|
+
var codex_1 = require_codex2();
|
|
22978
23091
|
var DEFAULT_DISCOVERY_POLL_INTERVAL_MS = 3e4;
|
|
22979
23092
|
function accountEmail(account) {
|
|
22980
23093
|
return account?.email ?? account?.metadata?.email;
|
|
@@ -23131,26 +23244,31 @@ var require_codexQuotaWatcher = __commonJS({
|
|
|
23131
23244
|
return;
|
|
23132
23245
|
}
|
|
23133
23246
|
const account = this.getActiveAccount();
|
|
23247
|
+
const cached = account ? this.readSnapshot("codex", account.id) : null;
|
|
23248
|
+
const liveQuotaWithResetCredits = {
|
|
23249
|
+
...liveQuota,
|
|
23250
|
+
resetCredits: liveQuota.resetCredits ?? cached?.resetCredits
|
|
23251
|
+
};
|
|
23134
23252
|
if (account) {
|
|
23135
|
-
this.writeSnapshot("codex", account.id,
|
|
23253
|
+
this.writeSnapshot("codex", account.id, liveQuotaWithResetCredits);
|
|
23136
23254
|
if (this.workspaceId) {
|
|
23137
23255
|
const sample = {
|
|
23138
|
-
timestamp:
|
|
23256
|
+
timestamp: liveQuotaWithResetCredits.capturedAt ?? (/* @__PURE__ */ new Date()).toISOString(),
|
|
23139
23257
|
runtimeProvider: "codex",
|
|
23140
23258
|
providerId: account.id,
|
|
23141
23259
|
workspaceId: this.workspaceId,
|
|
23142
23260
|
fiveHour: {
|
|
23143
|
-
utilization:
|
|
23144
|
-
resetsAt:
|
|
23261
|
+
utilization: liveQuotaWithResetCredits.fiveHour.utilization,
|
|
23262
|
+
resetsAt: liveQuotaWithResetCredits.fiveHour.resetsAt
|
|
23145
23263
|
},
|
|
23146
23264
|
sevenDay: {
|
|
23147
|
-
utilization:
|
|
23148
|
-
resetsAt:
|
|
23265
|
+
utilization: liveQuotaWithResetCredits.sevenDay.utilization,
|
|
23266
|
+
resetsAt: liveQuotaWithResetCredits.sevenDay.resetsAt
|
|
23149
23267
|
},
|
|
23150
|
-
available:
|
|
23151
|
-
error:
|
|
23152
|
-
source:
|
|
23153
|
-
stale:
|
|
23268
|
+
available: liveQuotaWithResetCredits.available,
|
|
23269
|
+
error: liveQuotaWithResetCredits.error,
|
|
23270
|
+
source: liveQuotaWithResetCredits.source,
|
|
23271
|
+
stale: liveQuotaWithResetCredits.stale
|
|
23154
23272
|
};
|
|
23155
23273
|
try {
|
|
23156
23274
|
const result = this.appendHistorySample(sample);
|
|
@@ -23163,7 +23281,7 @@ var require_codexQuotaWatcher = __commonJS({
|
|
|
23163
23281
|
}
|
|
23164
23282
|
}
|
|
23165
23283
|
this.emitState(enrichQuotaState({
|
|
23166
|
-
...
|
|
23284
|
+
...liveQuotaWithResetCredits,
|
|
23167
23285
|
runtimeProvider: "codex",
|
|
23168
23286
|
providerId: "codex"
|
|
23169
23287
|
}, account));
|
|
@@ -41156,7 +41274,7 @@ var require_quota2 = __commonJS({
|
|
|
41156
41274
|
"../sidekick-shared/dist/schemas/quota.js"(exports) {
|
|
41157
41275
|
"use strict";
|
|
41158
41276
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41159
|
-
exports.providerQuotaMapSchema = exports.zaiProviderQuotaStateSchema = exports.codexProviderQuotaStateSchema = exports.claudeProviderQuotaStateSchema = exports.providerQuotaStateSchema = exports.runtimeQuotaProviderSchema = exports.quotaFailureDescriptorSchema = exports.peakHoursStateSchema = exports.quotaStateSchema = exports.quotaSourceSchema = exports.quotaProviderIdSchema = exports.quotaFailureKindSchema = exports.quotaWindowSchema = void 0;
|
|
41277
|
+
exports.providerQuotaMapSchema = exports.zaiProviderQuotaStateSchema = exports.codexProviderQuotaStateSchema = exports.claudeProviderQuotaStateSchema = exports.providerQuotaStateSchema = exports.runtimeQuotaProviderSchema = exports.quotaFailureDescriptorSchema = exports.peakHoursStateSchema = exports.quotaStateSchema = exports.codexResetCreditsSnapshotSchema = exports.codexResetCreditSchema = exports.quotaSourceSchema = exports.quotaProviderIdSchema = exports.quotaFailureKindSchema = exports.quotaWindowSchema = void 0;
|
|
41160
41278
|
var zod_1 = require_zod();
|
|
41161
41279
|
exports.quotaWindowSchema = zod_1.z.object({
|
|
41162
41280
|
utilization: zod_1.z.number(),
|
|
@@ -41171,6 +41289,20 @@ var require_quota2 = __commonJS({
|
|
|
41171
41289
|
]);
|
|
41172
41290
|
exports.quotaProviderIdSchema = zod_1.z.enum(["claude-code", "codex", "zai"]);
|
|
41173
41291
|
exports.quotaSourceSchema = zod_1.z.enum(["api", "session", "cache"]);
|
|
41292
|
+
exports.codexResetCreditSchema = zod_1.z.object({
|
|
41293
|
+
title: zod_1.z.string().optional(),
|
|
41294
|
+
status: zod_1.z.string(),
|
|
41295
|
+
resetType: zod_1.z.string().optional(),
|
|
41296
|
+
expiresAt: zod_1.z.string(),
|
|
41297
|
+
grantedAt: zod_1.z.string().optional()
|
|
41298
|
+
});
|
|
41299
|
+
exports.codexResetCreditsSnapshotSchema = zod_1.z.object({
|
|
41300
|
+
availableCount: zod_1.z.number(),
|
|
41301
|
+
totalEarnedCount: zod_1.z.number().optional(),
|
|
41302
|
+
credits: zod_1.z.array(exports.codexResetCreditSchema),
|
|
41303
|
+
source: zod_1.z.enum(["api", "cache"]).optional(),
|
|
41304
|
+
capturedAt: zod_1.z.string().optional()
|
|
41305
|
+
});
|
|
41174
41306
|
exports.quotaStateSchema = zod_1.z.object({
|
|
41175
41307
|
fiveHour: exports.quotaWindowSchema,
|
|
41176
41308
|
sevenDay: exports.quotaWindowSchema,
|
|
@@ -41190,6 +41322,7 @@ var require_quota2 = __commonJS({
|
|
|
41190
41322
|
limitId: zod_1.z.string().optional(),
|
|
41191
41323
|
limitName: zod_1.z.string().optional(),
|
|
41192
41324
|
credits: zod_1.z.unknown().optional(),
|
|
41325
|
+
resetCredits: exports.codexResetCreditsSnapshotSchema.optional(),
|
|
41193
41326
|
planType: zod_1.z.string().optional(),
|
|
41194
41327
|
rateLimitReachedType: zod_1.z.string().optional()
|
|
41195
41328
|
});
|
|
@@ -41518,12 +41651,16 @@ var require_dist = __commonJS({
|
|
|
41518
41651
|
"../sidekick-shared/dist/index.js"(exports) {
|
|
41519
41652
|
"use strict";
|
|
41520
41653
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41521
|
-
exports.
|
|
41522
|
-
exports.
|
|
41523
|
-
exports.
|
|
41524
|
-
exports.
|
|
41525
|
-
exports.
|
|
41526
|
-
exports.scopePeakHoursToSessionProvider = exports.isClaudeCodeSessionProvider = exports.fetchPeakHoursStatus = exports.createPeakHoursNotApplicableState = exports.fetchOpenAIStatus = exports.fetchProviderStatus = exports.assistantTurnToolRefSchema = exports.assistantTurnToolGroupStepSchema = exports.assistantTurnTimelineItemSchema = exports.assistantTurnSubagentStatusSchema = exports.assistantTurnSubagentSchema = exports.assistantTurnReasoningTimelineItemSchema = exports.assistantTurnProjectionSchema = exports.assistantTurnProcessStepSchema = exports.assistantTurnProcessSchema = exports.assistantTurnNarrationStepSchema = exports.assistantTurnEventTypeSchema = exports.assistantTurnEventSchema = exports.listAllAccountsResultSchema = exports.savedAccountProfileSchema = exports.accountEntrySchema = exports.accountLoginStatusSchema = exports.beginAccountLoginResultSchema = exports.accountManagerResultSchema = exports.accountProviderIdSchema = exports.activeAccountStatusSchema = exports.activeProviderAccountStatusSchema = exports.quotaHistoryDailyBucketSchema = exports.quotaHistorySampleSchema = exports.quotaHistoryRuntimeProviderSchema = exports.providerQuotaMapSchema = exports.zaiProviderQuotaStateSchema = exports.codexProviderQuotaStateSchema = exports.claudeProviderQuotaStateSchema = exports.providerQuotaStateSchema = exports.runtimeQuotaProviderSchema = exports.quotaFailureDescriptorSchema = exports.peakHoursStateSchema = exports.quotaSourceSchema = exports.quotaProviderIdSchema = exports.quotaFailureKindSchema = exports.quotaStateSchema = exports.quotaWindowSchema = exports.extractSessionEvents = exports.permissionModeSchema = exports.sessionEventSchema = void 0;
|
|
41654
|
+
exports.getClaudeSessionDirectory = exports.encodeClaudeWorkspacePath = exports.detectSessionActivity = exports.extractTaskInfo = exports.scanSubagentDir = exports.normalizeCodexToolInput = exports.normalizeCodexToolName = exports.extractPatchFilePaths = exports.CodexRolloutParser = exports.parseDbPartData = exports.parseDbMessageData = exports.convertOpenCodeMessage = exports.detectPlanModeFromText = exports.normalizeToolInput = exports.normalizeToolName = exports.TRUNCATION_PATTERNS = exports.JsonlParser = exports.CodexProvider = exports.getOpenCodeDataDir = exports.OpenCodeProvider = exports.ClaudeCodeProvider = exports.getAllDetectedProviders = exports.detectProvider = exports.readClaudeCodePlanFiles = exports.getPlanAnalytics = exports.writePlans = exports.getLatestPlan = exports.readPlans = exports.readLatestHandoff = exports.readHistory = exports.readNotes = exports.readDecisions = exports.readTasks = exports.getProjectSlugRaw = exports.getProjectSlug = exports.encodeWorkspacePath = exports.getGlobalDataPath = exports.getProjectDataPath = exports.getConfigDir = exports.MAX_PLANS_PER_PROJECT = exports.PLAN_SCHEMA_VERSION = exports.createEmptyTokenTotals = exports.HISTORICAL_DATA_SCHEMA_VERSION = exports.STALENESS_THRESHOLDS = exports.IMPORTANCE_DECAY_FACTORS = exports.KNOWLEDGE_NOTE_SCHEMA_VERSION = exports.DECISION_LOG_SCHEMA_VERSION = exports.normalizeTaskStatus = exports.TASK_PERSISTENCE_SCHEMA_VERSION = exports.isAggregateCodexLimit = void 0;
|
|
41655
|
+
exports.formatSessionJson = exports.formatSessionMarkdown = exports.formatSessionText = exports.classifyNoise = exports.shouldMergeWithPrevious = exports.classifyFollowEvent = exports.classifyMessage = exports.getSoftNoiseReason = exports.isHardNoiseFollowEvent = exports.isHardNoise = exports.formatToolSummary = exports.formatTokenCount = exports.formatDurationMs = exports.createJsonlTail = exports.toFollowEvents = exports.createWatcher = exports.parseChangelog = exports.extractProposedPlanShared = exports.parsePlanMarkdownShared = exports.PlanExtractor = exports.segmentAssistantTurn = exports.reasoningSummary = exports.isAssistantTurnSubagentTool = exports.extractTurnSubagents = exports.assistantTurnEventsFromSessionEvents = exports.readSessionContextSnapshot = exports.createSessionContextProjector = exports.calculateSessionContextPressure = exports.buildSessionContextSnapshot = exports.composeContext = exports.FilterEngine = exports.searchSessions = exports.CodexDatabase = exports.OpenCodeDatabase = exports.discoverDebugLogs = exports.collapseDuplicates = exports.filterByLevel = exports.parseDebugLog = exports.scanSubagentTraces = exports.findAllSessionsWithWorktrees = exports.discoverWorktreeSiblings = exports.resolveWorktreeMainRepo = exports.getAllClaudeProjectFolders = exports.decodeEncodedPath = exports.getMostRecentlyActiveSessionDir = exports.findSubdirectorySessionDirs = exports.findSessionsInDirectory = exports.findAllClaudeSessions = exports.findActiveClaudeSession = exports.discoverSessionDirectory = void 0;
|
|
41656
|
+
exports.getActiveSavedAccount = exports.listSavedAccountProfiles = exports.writeSavedAccountRegistry = exports.readSavedAccountRegistry = exports.getAccountsDir = exports.resolveClaudeLoginCommand = exports.listAllAccounts = exports.switchAccount = exports.spawnAccountLogin = exports.finalizeAccountLogin = exports.getAccountLoginStatus = exports.beginAccountLogin = exports.isMultiAccountEnabled = exports.resolveActiveClaudeAccount = exports.getActiveAccount = exports.listAccounts = exports.removeAccount = exports.reconcileClaudeAuthState = exports.applyActiveClaudeToLiveHome = exports.resolveActiveClaudeHome = exports.switchToAccount = exports.addCurrentAccount = exports.readActiveClaudeAccount = exports.writeAccountRegistry = exports.readAccountRegistry = exports.ensureDefaultAccounts = exports.readClaudeMaxAccessTokenSync = exports.readClaudeMaxCredentials = exports.writeActiveCredentials = exports.readActiveCredentials = exports.openInBrowser = exports.parseTranscriptFromEvents = exports.parseTranscript = exports.generateHtmlReport = exports.PatternExtractor = exports.HeatmapTracker = exports.FrequencyTracker = exports.getSnapshotPath = exports.isSnapshotValid = exports.deleteSnapshot = exports.loadSnapshot = exports.saveSnapshot = exports.parseTodoDependencies = exports.EventAggregator = exports.getRandomPhrase = exports.PHRASE_CATEGORIES = exports.ALL_PHRASES = exports.HIGHLIGHT_CSS = exports.clearHighlightCache = exports.highlightEvent = void 0;
|
|
41657
|
+
exports.quotaFromCodexRateLimits = exports.fetchCodexQuotaFromApi = exports.fetchCodexResetCreditsFromApi = exports.getWorkspaceIdFromPath = exports.pruneQuotaHistory = exports.readQuotaHistoryDailyBuckets = exports.readQuotaHistoryRange = exports.appendQuotaHistorySample = exports.writeQuotaSnapshot = exports.readQuotaSnapshot = exports.QuotaPoller = exports.describeQuotaFailure = exports.withQuotaProjections = exports.projectQuotaWindow = exports.fetchQuota = exports.SEVEN_DAY_WINDOW_MS = exports.FIVE_HOUR_WINDOW_MS = exports.AutoSwitchController = exports.decideAutoSwitch = exports.DEFAULT_AUTO_SWITCH_CONFIG = exports.removeLauncher = exports.writeLauncher = exports.isShellHookInstalled = exports.uninstallShellHook = exports.installShellHook = exports.setTerminalActiveProfile = exports.removeCodexAccount = exports.switchToCodexAccount = exports.finalizeCodexAccount = exports.prepareCodexAccount = exports.getCodexExecutionEnv = exports.resolveSidekickCodexHome = exports.resolveActiveCodexAccount = exports.getActiveCodexAccount = exports.listCodexAccounts = exports.getSystemCodexHome = exports.getCodexMonitoringHomes = exports.getCodexProfileHome = exports.getCodexProfilesDir = exports.readClaudeProfileIdentity = exports.isClaudeProfileAuthenticated = exports.claudeKeychainService = exports.claudeKeychainSuffix = exports.getClaudeProfileHome = exports.getClaudeProfilesDir = exports.getActiveAccountStatus = exports.removeSavedAccountProfile = exports.replaceSavedAccountProfiles = exports.setActiveSavedAccount = exports.upsertSavedAccountProfile = void 0;
|
|
41658
|
+
exports.gatherAssetsForCwd = exports.codexSessions = exports.readCodexAssets = exports.claudeSessions = exports.readClaudeAssets = exports.extractCommands = exports.extractFilePaths = exports.extractUrls = exports.extractToolCalls = exports.extractToolCall = exports.extractTokenUsage = exports.LITELLM_CATALOG_URL = exports.normalizeLiteLlmCatalog = exports.hydratePricingCatalog = exports.formatCost = exports.sortModelIds = exports.compareModelIds = exports.getModelDisplayInfo = exports.shortModelName = exports.mergeCostSources = exports.calculateCostWithProvenance = exports.calculateCostWithPricing = exports.calculateCost = exports.getModelInfo = exports.getModelPricing = exports.parseModelId = exports.DEFAULT_CONTEXT_WINDOW = exports.getModelContextWindowSize = exports.MultiProviderQuotaService = exports.resolveZaiQuota = exports.readZaiCredentials = exports.quotaStateFromZaiQuotaLimitPayload = exports.fetchZaiQuotaFromApi = exports.ZaiQuotaWatcher = exports.ZAI_TIER_BUDGETS = exports.ZAI_PROVIDER_IDS = exports.ZAI_PROMPT_INVOCATIONS = exports.turnTokenWeight = exports.rowsToZaiTurnsAndErrors = exports.resolveZaiTier = exports.parseZaiQuotaError = exports.makeUnavailableZaiQuotaState = exports.isZaiProviderId = exports.inferZaiQuotaState = exports.extractNextFlushTime = exports.accumulateZaiUsage = exports.CodexQuotaWatcher = exports.resolveCodexQuotaFromLocalSources = exports.resolveCodexQuota = exports.readLatestCodexQuotaFromRollouts = void 0;
|
|
41659
|
+
exports.scopePeakHoursToSessionProvider = exports.isClaudeCodeSessionProvider = exports.fetchPeakHoursStatus = exports.createPeakHoursNotApplicableState = exports.fetchOpenAIStatus = exports.fetchProviderStatus = exports.assistantTurnToolRefSchema = exports.assistantTurnToolGroupStepSchema = exports.assistantTurnTimelineItemSchema = exports.assistantTurnSubagentStatusSchema = exports.assistantTurnSubagentSchema = exports.assistantTurnReasoningTimelineItemSchema = exports.assistantTurnProjectionSchema = exports.assistantTurnProcessStepSchema = exports.assistantTurnProcessSchema = exports.assistantTurnNarrationStepSchema = exports.assistantTurnEventTypeSchema = exports.assistantTurnEventSchema = exports.listAllAccountsResultSchema = exports.savedAccountProfileSchema = exports.accountEntrySchema = exports.accountLoginStatusSchema = exports.beginAccountLoginResultSchema = exports.accountManagerResultSchema = exports.accountProviderIdSchema = exports.activeAccountStatusSchema = exports.activeProviderAccountStatusSchema = exports.quotaHistoryDailyBucketSchema = exports.quotaHistorySampleSchema = exports.quotaHistoryRuntimeProviderSchema = exports.providerQuotaMapSchema = exports.zaiProviderQuotaStateSchema = exports.codexProviderQuotaStateSchema = exports.claudeProviderQuotaStateSchema = exports.providerQuotaStateSchema = exports.runtimeQuotaProviderSchema = exports.quotaFailureDescriptorSchema = exports.peakHoursStateSchema = exports.codexResetCreditsSnapshotSchema = exports.codexResetCreditSchema = exports.quotaSourceSchema = exports.quotaProviderIdSchema = exports.quotaFailureKindSchema = exports.quotaStateSchema = exports.quotaWindowSchema = exports.extractSessionEvents = exports.permissionModeSchema = exports.sessionEventSchema = exports.sessionMessageSchema = exports.messageUsageSchema = void 0;
|
|
41660
|
+
var codex_1 = require_codex();
|
|
41661
|
+
Object.defineProperty(exports, "isAggregateCodexLimit", { enumerable: true, get: function() {
|
|
41662
|
+
return codex_1.isAggregateCodexLimit;
|
|
41663
|
+
} });
|
|
41527
41664
|
var taskPersistence_1 = require_taskPersistence();
|
|
41528
41665
|
Object.defineProperty(exports, "TASK_PERSISTENCE_SCHEMA_VERSION", { enumerable: true, get: function() {
|
|
41529
41666
|
return taskPersistence_1.TASK_PERSISTENCE_SCHEMA_VERSION;
|
|
@@ -41632,9 +41769,9 @@ var require_dist = __commonJS({
|
|
|
41632
41769
|
Object.defineProperty(exports, "getOpenCodeDataDir", { enumerable: true, get: function() {
|
|
41633
41770
|
return openCode_1.getOpenCodeDataDir;
|
|
41634
41771
|
} });
|
|
41635
|
-
var
|
|
41772
|
+
var codex_2 = require_codex2();
|
|
41636
41773
|
Object.defineProperty(exports, "CodexProvider", { enumerable: true, get: function() {
|
|
41637
|
-
return
|
|
41774
|
+
return codex_2.CodexProvider;
|
|
41638
41775
|
} });
|
|
41639
41776
|
var jsonl_1 = require_jsonl();
|
|
41640
41777
|
Object.defineProperty(exports, "JsonlParser", { enumerable: true, get: function() {
|
|
@@ -42177,6 +42314,9 @@ var require_dist = __commonJS({
|
|
|
42177
42314
|
return quotaHistory_1.getWorkspaceIdFromPath;
|
|
42178
42315
|
} });
|
|
42179
42316
|
var codexQuota_1 = require_codexQuota();
|
|
42317
|
+
Object.defineProperty(exports, "fetchCodexResetCreditsFromApi", { enumerable: true, get: function() {
|
|
42318
|
+
return codexQuota_1.fetchCodexResetCreditsFromApi;
|
|
42319
|
+
} });
|
|
42180
42320
|
Object.defineProperty(exports, "fetchCodexQuotaFromApi", { enumerable: true, get: function() {
|
|
42181
42321
|
return codexQuota_1.fetchCodexQuotaFromApi;
|
|
42182
42322
|
} });
|
|
@@ -42379,6 +42519,12 @@ var require_dist = __commonJS({
|
|
|
42379
42519
|
Object.defineProperty(exports, "quotaSourceSchema", { enumerable: true, get: function() {
|
|
42380
42520
|
return quota_2.quotaSourceSchema;
|
|
42381
42521
|
} });
|
|
42522
|
+
Object.defineProperty(exports, "codexResetCreditSchema", { enumerable: true, get: function() {
|
|
42523
|
+
return quota_2.codexResetCreditSchema;
|
|
42524
|
+
} });
|
|
42525
|
+
Object.defineProperty(exports, "codexResetCreditsSnapshotSchema", { enumerable: true, get: function() {
|
|
42526
|
+
return quota_2.codexResetCreditsSnapshotSchema;
|
|
42527
|
+
} });
|
|
42382
42528
|
Object.defineProperty(exports, "peakHoursStateSchema", { enumerable: true, get: function() {
|
|
42383
42529
|
return quota_2.peakHoursStateSchema;
|
|
42384
42530
|
} });
|
|
@@ -44731,7 +44877,7 @@ var init_UpdateCheckService = __esm({
|
|
|
44731
44877
|
/** Run the update check (one-shot). */
|
|
44732
44878
|
async check() {
|
|
44733
44879
|
try {
|
|
44734
|
-
const current = "0.21.
|
|
44880
|
+
const current = "0.21.6";
|
|
44735
44881
|
const cached = this.readCache();
|
|
44736
44882
|
let latest;
|
|
44737
44883
|
if (cached && Date.now() - cached.checkedAt < CACHE_TTL_MS) {
|
|
@@ -85542,7 +85688,7 @@ function StatusBar({
|
|
|
85542
85688
|
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Text, { children: parseBlessedTags(BRAND_INLINE) }),
|
|
85543
85689
|
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(Text, { dimColor: true, children: [
|
|
85544
85690
|
" v",
|
|
85545
|
-
"0.21.
|
|
85691
|
+
"0.21.6"
|
|
85546
85692
|
] }),
|
|
85547
85693
|
updateInfo && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(Text, { color: "yellow", children: [
|
|
85548
85694
|
" (v",
|
|
@@ -85949,7 +86095,7 @@ function ChangelogOverlay({
|
|
|
85949
86095
|
" ",
|
|
85950
86096
|
/* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(Text, { bold: true, color: "cyan", children: [
|
|
85951
86097
|
"Terminal Dashboard v",
|
|
85952
|
-
"0.21.
|
|
86098
|
+
"0.21.6"
|
|
85953
86099
|
] }),
|
|
85954
86100
|
latestDate ? /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(Text, { color: "gray", children: [
|
|
85955
86101
|
" \u2014 ",
|
|
@@ -86264,7 +86410,7 @@ var init_mouse = __esm({
|
|
|
86264
86410
|
var CHANGELOG_default;
|
|
86265
86411
|
var init_CHANGELOG = __esm({
|
|
86266
86412
|
"CHANGELOG.md"() {
|
|
86267
|
-
CHANGELOG_default = '# Changelog\n\nAll notable changes to the Sidekick Agent Hub CLI will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),\nand this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n\n## [0.21.4] - 2026-06-30\n\n### Fixed\n\n- **`sidekick quota` shows the logged-in account**: The account line now reflects the currently logged-in Claude/Codex account even after a native `claude /login` or `codex login`, instead of the stale saved registry pointer. The live Codex account is resolved once per invocation and reused across the fetch and the printed output\n\n### Changed\n\n- **Bundled `sidekick-shared` 0.21.4**: Picks up the live-first active-account resolvers\n\n## [0.21.3] - 2026-06-23\n\n### Changed\n\n- **`sidekick quota` projects every provider**: Quota output is now rendered as a unified table with aligned `now` / `projected` / `resets` columns, and projected end-of-window utilization is shown for **all** providers (Claude, Codex, z.ai) \u2014 previously only Claude displayed a projection. A `\u2014` placeholder appears when a projection is unavailable, and utilization bars are clamped to 0\u2013100% so over-limit projections render cleanly. `sidekick quota --all` uses the same table for each provider section\n- **Bundled `sidekick-shared` 0.21.3**: Picks up the quota projection helpers and the bounded synchronous CLI probes\n\n### Security\n\n- **npm audit**: Bumped `esbuild` to `^0.28.1` and `vitest` to `^4.1.9` to clear reported dev-dependency advisories\n\n## [0.21.2] - 2026-06-22\n\n### Changed\n\n- **`sidekick quota --provider zai`** now renders authoritative z.ai plan utilization from z.ai\'s quota API (5-Hour / Weekly windows with real reset times) instead of estimating from observed OpenCode traffic, falling back to a cached snapshot when the API is unavailable. `sidekick quota --all` and `sidekick quota history --provider zai` use the same authoritative source\n- **`--tier lite|pro|max|auto`** is deprecated and no longer affects the displayed utilization\n\n## [0.21.1] - 2026-06-21\n\n### Added\n\n- **z.ai Coding Plan quota**: `sidekick quota --provider zai` derives and renders z.ai plan utilization from OpenCode traffic already on disk (5-Hour / Weekly windows with per-tier prompt budgets). `--tier lite|pro|max|auto` overrides the assumed plan tier (default `auto`). `sidekick quota --provider opencode` now auto-routes to z.ai quota when z.ai traffic is detected. `sidekick quota --all` includes the z.ai section when active\n- **z.ai quota history heatmap**: `sidekick quota history --provider zai` renders a 13-week z.ai utilization heatmap for the current workspace, alongside the existing Claude and Codex heatmaps (now also in `--all`)\n\n### Changed\n\n- **Bundled `sidekick-shared` 0.21.1**: Picks up z.ai quota derivation and the OpenCode data directory resolution fix.\n\n### Limitations\n\n- z.ai quota is **estimated, not authoritative** \u2014 it reflects only the OpenCode traffic Sidekick observed on this machine/workspace (z.ai exposes no usage API) compared against provisional per-tier prompt budgets. z.ai is observed-only (no z.ai inference provider) and has no account management yet; with `--tier auto`, the tier is under-detected early in a cycle (use an explicit `--tier`); reset times are approximate unless a rate-limit error is trapped.\n\n## [0.21.0] - 2026-06-21\n\n### Added\n\n- **Account login**: `sidekick account --login` starts the provider-isolated login flow for Claude Max or Codex and saves the authenticated profile without disturbing the active account until finalization\n- **All-provider account view**: `sidekick account --provider all` lists Claude and Codex saved accounts together, including active state. JSON output returns provider-keyed account arrays and active ids\n- **Terminal account helpers**: `sidekick account --launcher <name>` creates opt-in launchers for the selected account, and `--auto-switch <pct|off>` persists the CLI auto-switch threshold preference\n- **Multi-provider quota output**: `sidekick quota --all` shows Claude and Codex quota state together \u2014 each provider degrades independently, so one provider\'s quota still prints even when the other is unavailable; `--all --json` emits a provider-keyed payload for automation\n\n### Changed\n\n- **Bundled `sidekick-shared` 0.21.0**: Picks up Account Management 2.0 acquisition, switching, terminal sync, quota auto-switch, and account schema exports.\n\n## [0.20.0] - 2026-06-17\n\n### Added\n\n- **`sidekick extract`**: New one-shot command for pulling actionable assets out of recent Claude Code and Codex chats for exactly the current cwd. It extracts URLs, filesystem-validated file paths, commands the agent suggested for the user to run, and plan-mode plans. Output is grouped and colored by default, labels each item with its source agent, validates invalid `--type` and `--limit` values, preserves `inChat` and per-item provenance in `--json`, and offers `-i/--interactive` for a picker that opens URLs or copies selected paths, commands, and plans. `--provider claude-code` and `--provider codex` scope extraction to one agent; OpenCode is reported as unsupported for now\n\nThanks to [@B33pBeeps](https://github.com/B33pBeeps) (Juan Fourie) for contributing this feature in [#17](https://github.com/cesarandreslopez/sidekick-agent-hub/pull/17), adapted from his MIT-licensed [`trawl`](https://github.com/B33pBeeps/trawl) project.\n\n## [0.19.3] - 2026-06-17\n\n### Changed\n\n- **Bundled `sidekick-shared` projection contract**: The shared assistant-turn projection now exposes a v2 `timeline` array for interleaved reasoning, narration, and tool groups. This is a shared-library contract update for downstream consumers and does not change CLI behavior by itself\n\n## [0.19.2] - 2026-06-15\n\n### Changed\n\n- **Bundled `sidekick-shared` 0.19.2**: The shared library gains a browser-safe assistant-turn projection module (`segmentAssistantTurn()`, `assistantTurnEventsFromSessionEvents()`, and mirrored Zod schemas) that segments an assistant turn into a compact Process + Answer shape, with Claude `Task` subagent refs surfaced without leaking prompt text \u2014 internal additions that don\'t change CLI behavior\n\n## [0.19.1] - 2026-06-09\n\n### Changed\n\n- **Bundled `sidekick-shared` 0.19.1**: Model-ID pricing and context-window lookups (behind the dashboard\'s cost and context gauges) now tolerate padded or mixed-case IDs. The shared library also gains Zod boundary schemas, an `extractSessionEvents()` progress-unwrapping helper, and a `/schemas` subpath export for downstream consumers \u2014 internal additions that don\'t change CLI behavior\n\n## [0.19.0] - 2026-06-09\n\n### Added\n\n- **Claude Opus 4.8 & Fable 5 support**: The dashboard\'s context-window gauge and cost estimates recognize `claude-opus-4-8` and `claude-fable-5` (both 1M-token context; Opus 4.8: $5/$25 per MTok, Fable 5: $10/$50 per MTok) via the shared model catalog\n\n### Changed\n\n- **Codex account switching now swaps `~/.codex/auth.json`**: `sidekick account --provider codex --switch-to <id>` (and `--add`) activates the account by atomically swapping its backed-up credentials into the system `~/.codex/` home, mirroring the Claude switch pattern \u2014 codex terminals outside Sidekick pick up the switch. Profile directories become pure credential backups, with a one-time startup migration for installs created under the old `CODEX_HOME`-redirection model. The command surfaces swap warnings on add, switch, and remove: a running codex process that needs restarting, stale credentials, or OS-keyring credential storage that Sidekick cannot swap\n\n### Fixed\n\n- **Opus 4.6/4.7 cost over-estimation**: Dashed model IDs fell back to the Opus 4.0 pricing tier ($15/$75 instead of $5/$25), inflating estimated costs 3\xD7\n- **Haiku 4.5 unpriced under dashed IDs**: Costs for `claude-haiku-4-5-*` sessions could render as "\u2014" because no dashed static pricing key existed\n\n## [0.18.5] - 2026-06-04\n\n### Changed\n\n- **Consistent Codex transcripts**: `sidekick dashboard` and `sidekick report` now parse Codex sessions via `parseTranscriptFromEvents()`, matching the canonical `SessionEvent` pipeline used by the other providers\n- **Bundled `sidekick-shared` 0.18.5**: Picks up the new session context evidence snapshot API (`buildSessionContextSnapshot`, `readSessionContextSnapshot`, `SessionContextSnapshot` and related types) and the Codex session evidence gap closures \u2014 `system` audit events, normalized `token_count` rate limits, per-file `apply_patch` expansion, tool-emission dedupe, MCP server attribution, and the new `ProviderReaderSessionWatcher`\n\n## [0.18.4] - 2026-05-27\n\n### Added\n\n- **`sidekick peak --provider <id>`**: New flag gates peak-hours output on the session provider. When the resolved provider is not `claude-code`, the command prints a "not applicable" message instead of calling the upstream endpoint\n\n### Changed\n\n- **Bundled `sidekick-shared` 0.18.4**: Picks up `scopePeakHoursToSessionProvider()`, `isClaudeCodeSessionProvider()`, `createPeakHoursNotApplicableState()` for peak-hours scoping, the improved Codex quota snapshot selection logic (`isPreferredQuotaHit`, `findAccountRolloutFiles`, `shouldKeepExistingSnapshot`), and the `notApplicable` field on `PeakHoursState`\n\n## [0.18.3] - 2026-05-19\n\n### Added\n\n- **`sidekick quota history`**: New subcommand that renders a 13-week GitHub-contributions-style heatmap of quota utilization for the current workspace. Flags: `--weeks <n>` (1-26, default 13), `--provider claude|codex` (default both), `--workspace <path>` (default cwd). Bucketed glyphs (`\xB7 \u2591 \u2592 \u2593 \u2588`) are color-coded by utilization band (\u22640 / <25 / <50 / <75 / \u226575), with per-provider rows and a peak / avg / unavailable-days / samples footer. Days that hit `available: false` render as a red `\xD7`. With `--json`, emits a `{ workspaceId, weeks, providers: { claude?, codex? }, generatedAt }` payload \u2014 the same shape consumed by the VS Code dashboard\n\n### Changed\n\n- **Bundled `sidekick-shared` 0.18.3**: Picks up the new per-workspace quota history surface (`appendQuotaHistorySample`, `readQuotaHistoryRange`, `readQuotaHistoryDailyBuckets`, `pruneQuotaHistory`, `getWorkspaceIdFromPath`) and the optional `workspaceId` / `appendHistorySample` hooks on `CodexQuotaWatcher`\n\n## [0.18.2] - 2026-05-19\n\n### Added\n\n- **`sidekick quota --refresh`**: New flag on the `quota` command that, for Codex, explicitly refreshes from the ChatGPT usage API before falling back to local rollout data and cached snapshots. Without the flag, the Codex quota path stays fully local and makes no upstream network call\n\n### Changed\n\n- **Codex quota is local-only by default**: `sidekick quota --provider codex` now delegates to the new `resolveCodexQuota` orchestrator in `sidekick-shared`. It checks the current workspace\'s most recent rollout, then recent account-level rollouts under `CODEX_HOME/sessions`, then the active account\'s cached snapshot \u2014 no upstream network call unless `--refresh` is passed. Failure output continues to include structured `failureKind` / `httpStatus` / `retryAfterMs` fields under `--json`\n- **Bundled `sidekick-shared` 0.18.2**: Picks up the new Codex quota orchestrator (`resolveCodexQuota`, `resolveCodexQuotaFromLocalSources`, `readLatestCodexQuotaFromRollouts`, `fetchCodexQuotaFromApi`), the relaxed `CodexRateLimits` shape (nullable `resets_at` / `window_minutes`), the rate-limit-only `token_count` event emission in `JsonlSessionWatcher`, and `state_N.sqlite` discovery in `CodexDatabase` + provider auto-detect\n\n## [0.18.1] - 2026-05-08\n\n### Changed\n\n- **Shared dashboard formatting**: terminal dashboard `fmtNum()` and `formatDuration()` now delegate to `formatTokenCount()` and `formatDurationMs()` from `sidekick-shared`, keeping the existing CLI surface (uppercase `K`/`M` suffix, compact `1m5s` style) while removing forked rounding logic\n\n## [0.18.0] - 2026-05-08\n\n### Changed\n\n- **Bundled `sidekick-shared` 0.18.0**: Picks up the new provider-aware quota orchestration surface \u2014 `MultiProviderQuotaService`, `CodexQuotaWatcher`, `getActiveAccountStatus()`, `extractToolCall()`, cost-provenance helpers (`calculateCostWithProvenance`, `mergeCostSources`), and model display helpers (`shortModelName`, `getModelDisplayInfo`, `compareModelIds`, `sortModelIds`). `parseModelId()` also now recognizes legacy Claude IDs such as `claude-3-opus-20240229` and `claude-3-5-sonnet-20241022`\n- **No CLI runtime changes**: This release ships the shared library upgrade for downstream tooling alignment; `sidekick quota`, `sidekick status`, and the live dashboard keep using the existing polling path. Wiring the new orchestrator into the CLI will land in a follow-up release\n\n## [0.17.7] - 2026-04-28\n\n### Fixed\n\n- **Quota snapshot write race**: Updated the bundled `sidekick-shared` snapshot writer so concurrent `sidekick quota` / Codex session updates no longer collide on `quota-snapshots.json.tmp` or throw `ENOENT`. Failed writes now also clean up their partial temp files instead of leaving orphans in `~/.config/sidekick/`\n\n## [0.17.6] - 2026-04-19\n\n### Added\n\n- **`sidekick peak` command**: One-shot check for Claude\'s current peak-hours state \u2014 weekdays 13:00\u201319:00 UTC, when session limits drain faster on Free/Pro/Max/Team subscriptions. Prints a color-coded status block with a countdown to the next transition. Data comes from the public `promoclock.co/api/status` endpoint (third-party, unaffiliated with Anthropic) with a graceful fallback when unreachable. `--json` emits the full raw state\n- **Peak-hours block in `sidekick status`**: When the active provider is `claude-code`, the Claude + OpenAI health blocks are now followed by a **Claude Peak Hours** block (off-peak or in-peak, with countdown). Gated on the provider so OpenCode / Codex users don\'t trigger an unnecessary third-party fetch. `--json` output includes the new `peak` field\n- **Peak-hours summary in `sidekick quota`**: Claude subscription quota output now shows a **Peak** line under the 5-hour / 7-day bars \u2014 green dot off-peak, orange dot during an active peak, with a countdown to the next transition. `--json` output includes the new `peak` field\n\n## [0.17.5] - 2026-04-18\n\n### Added\n\n- **Default account bootstrap at CLI startup**: The CLI now calls `ensureDefaultAccounts()` from `sidekick-shared` at module load and awaits the result inside a Commander `preAction` hook, so the first real subcommand blocks briefly on the bootstrap while `--version` and `--help` stay instant. When a system Claude Code or Codex credential exists and no saved account is active for that provider yet, the CLI registers it as "Default" \u2014 `sidekick quota`, `sidekick account`, and `sidekick stats` now reflect the active account on first run without requiring an explicit `sidekick account --add` first. Idempotent, never overwrites manually saved accounts, and all errors are swallowed so startup is never blocked\n\nThanks to [@B33pBeeps](https://github.com/B33pBeeps) (Juan Fourie) for contributing this feature in [#16](https://github.com/cesarandreslopez/sidekick-agent-hub/pull/16).\n\n## [0.17.4] - 2026-04-17\n\n### Changed\n\n- **Pricing hydration import migrated to `sidekick-shared/node`**: `cli.ts` now imports `hydratePricingCatalog` from the new Node-only subpath and keeps `detectProvider` on the package root. Runtime behavior is unchanged; the split makes the CLI\'s import surface self-documenting (hydration is explicitly a Node API) and aligns the CLI with the shared library\'s new versioned public API contract\n\n## [0.17.3] - 2026-04-17\n\n### Changed\n\n- **Version sync with the VS Code extension**: Republished to keep CLI, extension, and shared-library versions aligned after a cosmetic changelog fix in 0.17.3. No CLI code changes \u2014 functionally identical to 0.17.2\n\n## [0.17.2] - 2026-04-17\n\n### Added\n\n- **LiteLLM pricing hydration on startup**: The CLI now fetches the LiteLLM pricing catalog on startup and caches to `~/.config/sidekick/pricing-catalog.json` with a 24-hour TTL, 3s timeout, and stale-cache fallback \u2014 new model prices are picked up without a CLI upgrade\n- **Expanded pricing coverage**: GPT-4o, GPT-4.1, GPT-5.x, o1, o3, and o3-mini families are now priced alongside the existing Claude entries\n- **Real-dollar Codex / Claude Code costs**: `EventAggregator` computes cost from the pricing table when the session provider doesn\'t report one, so `sidekick` live dashboards now show actual dollars for Codex and Claude Code sessions\n- **`stats` footer lists unpriced models**: `sidekick stats` prints any models encountered with no pricing entry so missing coverage is visible\n\n### Fixed\n\n- **Context-gauge % wrong for Opus 4.7 (1M) and other new models**: The dashboard\'s context gauge was dividing by 200K for Claude Opus 4.7 (native 1M), inflating the displayed %. The shared model \u2192 context-window map now includes Opus/Sonnet 4.7 (1M), GPT-5.4 (1.05M), GPT-5.3-Codex (400K), and GPT-5.3-Codex-Spark (128K). Claude Code\'s `[1m]` suffix is now also honored as an explicit 1M marker\n- **Silent Sonnet-priced fallback for unknown models**: Codex, GPT-5.x, and o-series rows were being rendered at Sonnet rates. Unknown-model rows now render as `\u2014` in yellow instead of inventing a dollar figure\n\n### Changed\n\n- **`historical-data.json` schema v2**: reads `priced` flag and `unpricedModelIds` from records written by the latest VS Code extension; v1 records still read correctly\n\n## [0.17.1] - 2026-04-13\n\n### Fixed\n\n- **Codex multi-home session discovery**: Provider detection now scans all candidate Codex home directories, fixing missed sessions when the managed profile home is empty but the system `~/.codex/` has activity\n\n## [0.17.0] - 2026-04-13\n\n### Added\n\n- **Multi-provider account management**: `sidekick account` now supports `--provider codex` for Codex profile management alongside Claude Code accounts\n- **Codex account lifecycle**: `--add` prepares a profile and spawns `codex login`; `--switch-to` and `--remove` accept email, label, or profile ID\n- **Quota snapshot fallback**: `sidekick quota` for Codex shows cached rate-limit snapshots when no active session exists, with "cached from" timestamp\n\n### Fixed\n\n- **Email normalization**: Claude account lookup normalizes email case for reliable matching\n\n## [0.16.1] - 2026-03-27\n\n### Fixed\n\n- **Dashboard provider status scoping**: The TUI now shows degraded-service notices only for the monitored provider \u2014 Claude for Claude Code sessions, OpenAI for Codex sessions, and no status banner for OpenCode\n\n## [0.16.0] - 2026-03-23\n\n### Changed\n\n- **Consistent cost formatting**: All cost displays (`stats`, `context`, Sessions panel, narrative prompt) now use shared `formatCost()` with intelligent decimal precision (4 places for < $0.01, 2 otherwise)\n- **QuotaService**: Rewritten to wrap shared `QuotaPoller` with exponential backoff instead of manual polling loop\n- **modelContext**: Now re-exports `getModelInfo` from shared library alongside `getContextWindowSize`\n\n## [0.15.2] - 2026-03-18\n\n### Fixed\n\n- **CLI help descriptions**: Updated `quota` and `status` command descriptions to reflect provider-aware behavior\n- **`sidekick quota --provider`**: Added local `--provider` option so `sidekick quota --provider codex` works naturally\n\n## [0.15.0] - 2026-03-18\n\n### Added\n\n- **OpenAI status page monitoring**: CLI dashboard now shows OpenAI API status alongside Claude API status\n- **Codex rate limits in dashboard**: Sessions panel displays Codex rate-limit data with "Rate Limits" header instead of "Quota"\n- **Provider-aware `sidekick quota` command**: Detects active provider and shows Codex rate limits, Claude subscription quota, or an informational message for OpenCode\n\n### Fixed\n\n- **QuotaService polling for Codex**: Dashboard no longer starts Claude OAuth quota polling when the active provider is Codex\n\n## [0.14.2] - 2026-03-16\n\n### Fixed\n\n- **Quota polling interval**: Reduced quota refresh from every 30 seconds to every 5 minutes to avoid unnecessary API calls\n- **SessionsPanel `detailWidth()` call**: Removed unused parameter from `detailWidth()` in the Sessions panel quota rendering\n\n## [0.14.1] - 2026-03-14\n\n### Fixed\n\n- **Per-model context window sizes**: Dashboard context gauge now shows correct utilization for Claude Opus 4.6 (1M context) and other models with non-200K windows\n\n### Changed\n\n- **Shared model context lookup**: CLI dashboard now uses the centralized `getModelContextWindowSize()` from `sidekick-shared` instead of a local duplicate map\n\n## [0.14.0] - 2026-03-12\n\n### Added\n\n- **`sidekick account` Command**: Manage Claude Code accounts from the terminal \u2014 list saved accounts, add the current account with an optional label, switch to the next or a specific account, and remove accounts. Supports `--json` output for scripting\n- **Quota Account Label**: `sidekick quota` now shows the active account email and label above the quota bars when multi-account is enabled\n- **macOS Keychain Support**: `sidekick account` and `sidekick quota` now read and write credentials via the system Keychain on macOS, fixing account switching and quota checks on Mac\n\n## [0.13.8] - 2026-03-12\n\n### Changed\n\n- **Structured quota failure output**: `sidekick quota` now renders consistent auth, rate-limit, server, network, and unexpected-failure copy from shared quota failure descriptors while preserving `--json` machine-readable output\n- **Dashboard unavailable quota rendering**: The Sessions panel now shows Claude Code quota failures inline instead of hiding the quota section whenever subscription data is unavailable\n- **Quota transition toasts**: The Ink dashboard now fires low-noise toast notifications only when Claude Code quota failure state changes, avoiding repeated alerts every polling interval\n\n## [0.13.7] - 2026-03-11\n\n### Changed\n\n- **npm README sync**: Updated the published CLI package README to reflect current OpenCode monitoring behavior, platform-specific data directories, and the `sqlite3` runtime requirement\n- **README badge cleanup**: Removed the Ask DeepWiki badge from the published CLI package README; the repo root README still keeps it\n\n## [0.13.6] - 2026-03-11\n\n### Changed\n\n- **Refreshed CLI Dashboard Wordmark**: Updated the dashboard wordmark/header styling for a cleaner splash and dashboard identity\n\n### Fixed\n\n- **OpenCode dashboard startup**: OpenCode DB-backed session discovery now resolves projects by worktree, sandboxes, and session directory instead of quietly behaving like no session exists\n- **OpenCode runtime notices**: The CLI now prints an OpenCode-only actionable notice when `opencode.db` exists but `sqlite3` is missing, blocked, or otherwise unusable in the current shell environment\n\n## [0.13.5] - 2026-03-10\n\n### Added\n\n- **`sidekick status` Command**: One-shot Claude API status check with color-coded text output and `--json` mode\n- **Dashboard Status Banner**: Status bar shows a colored `\u25CF API minor/major/critical` indicator when Claude is degraded; Sessions panel Summary tab shows an "API Status" section with affected components and active incident details. Polls every 60s\n\n## [0.13.4] - 2026-03-08\n\n### Fixed\n\n- **Onboarding Phrase Spam**: Splash screen and detail pane motivational phrases memoized \u2014 no longer flicker every render tick (fixes [#13](https://github.com/cesarandreslopez/sidekick-agent-hub/issues/13))\n\n### Changed\n\n- **Simplified Logo**: Replaced 6-line ASCII robot art with compact text header in splash, help, and changelog overlays\n- **Removed Dead Code**: Removed unused `getSplashContent()` and `HELP_HEADER` exports from branding module\n\n## [0.13.3] - 2026-03-04\n\n_No CLI-specific changes in this release._\n\n## [0.13.2] - 2026-03-04\n\n_No CLI-specific changes in this release._\n\n## [0.13.1] - 2026-03-04\n\n### Added\n\n- **`sidekick quota` Command**: One-shot subscription quota check showing 5-hour and 7-day utilization with color-coded progress bars and reset countdowns \u2014 supports `--json` for machine-readable output\n- **Quota Projections**: Elapsed-time projections shown in `sidekick quota` output and TUI dashboard quota section \u2014 displays projected end-of-window utilization next to current value (e.g., `40% \u2192 100%`), included in `--json` output as `projectedFiveHour` / `projectedSevenDay`\n\n## [0.13.0] - 2026-03-03\n\n_No CLI-specific changes in this release._\n\n## [0.12.10] - 2026-03-01\n\n### Added\n\n- **Events Panel** (key 7): Scrollable live event stream with colored type badges (`[USR]`, `[AST]`, `[TOOL]`, `[RES]`), timestamps, and keyword-highlighted summaries; detail tabs for full event JSON and surrounding context\n- **Charts Panel** (key 8): Tool frequency horizontal bars, event type distribution, 60-minute activity heatmap using `\u2591\u2592\u2593\u2588` intensity characters, and pattern analysis with frequency bars and template text\n- **Multi-Mode Filter**: `/` filter overlay now supports four modes \u2014 substring, fuzzy, regex, and date range \u2014 Tab cycles modes, regex mode shows red validation errors\n- **Search Term Highlighting**: Active filter terms highlighted in blue within side list items\n- **Timeline Keyword Coloring**: Event summaries in the Sessions panel Timeline tab now use semantic keyword coloring \u2014 errors red, success green, tool names cyan, file paths magenta\n\n### Removed\n\n- **Search Panel**: Removed redundant Search panel (previously key 7) \u2014 the `/` filter with multi-mode support serves the same purpose\n\n## [0.12.9] - 2026-02-28\n\n### Added\n\n- **Standalone Data Commands**: `sidekick tasks`, `sidekick decisions`, `sidekick notes`, `sidekick stats`, `sidekick handoff` for accessing project data without launching the TUI\n- **`sidekick search <query>`**: Cross-session full-text search from the terminal\n- **`sidekick context`**: Composite output of tasks, decisions, notes, and handoff for piping into other tools\n- **`--list` flag on `sidekick dump`**: Discover available session IDs before requiring `--session <id>`\n- **Search Panel**: Search panel (panel 7) wired into the TUI dashboard\n\n### Changed\n\n- **`taskMerger` utility**: Duplicate `mergeTasks` logic extracted into shared `taskMerger` utility\n- **Model constants**: Hardcoded model IDs extracted to named constants\n\n### Fixed\n\n- **`convention` icon**: Notes panel icon replaced with valid `tip` type\n- **Linux clipboard**: Now supports Wayland (`wl-copy`) and `xsel` fallbacks, with error messages instead of silent failure\n- **`provider.dispose()`**: Added to `dump` and `report` commands (prevents SQLite connection leaks)\n\n## [0.12.8] - 2026-02-28\n\n### Changed\n\n- **Dashboard UI/UX Polish**: Visual overhaul for better hierarchy, consistency, and readability\n - Splash screen and help overlay now display the robot ASCII logo\n - Toast notifications show severity icons (\u2718 error, \u26A0 warning, \u25CF info) with inner padding\n - Focused pane uses double-border for clear focus indication\n - Section dividers (`\u2500\u2500 Title \u2500\u2500\u2500\u2500`) replace bare bold headers in summary, agents, and context attribution\n - Tab bar: active tab underlined in magenta, inactive tabs dimmed, bracket syntax removed\n - Status bar: segmented layout with `\u2502` separators; keys bold, labels dim\n - Summary metrics condensed: elapsed/events/compactions on one line, tokens on one line with cache rate and cost\n - Sparklines display peak metadata annotations\n - Progress bars use blessed color tags for consistent coloring\n - Help overlay uses dot-leader alignment for all keybinding rows\n - Empty state hints per panel (e.g. "Tasks appear as your agent works.")\n - Session picker groups sessions by provider with section headers when multiple providers are present\n\n## [0.12.7] - 2026-02-27\n\n### Added\n\n- **HTML Session Report**: `sidekick report` command generates a self-contained HTML report and opens it in the default browser\n - Options: `--session`, `--output`, `--theme` (dark/light), `--no-open`, `--no-thinking`\n - TUI Dashboard: press `r` to generate and open an HTML report for the current session\n\n## [0.12.6] - 2026-02-26\n\n### Added\n\n- **Session Dump Command**: `sidekick dump` exports session data in text, markdown, or JSON format with `--format`, `--width`, and `--expand` options\n- **Plans Panel Re-enabled**: Plans panel restored in CLI dashboard with plan file discovery from `~/.claude/plans/`\n- **Enhanced Status Bar**: Session info display improved with richer metadata\n\n### Fixed\n\n- **Old snapshot format migration**: Restoring pre-0.12.3 session snapshots no longer shows empty timeline entries\n\n### Changed\n\n- **Phrase library moved to shared**: CLI-specific phrase formatting kept local, all phrase content now from `sidekick-shared`\n\n## [0.12.5] - 2026-02-24\n\n### Fixed\n\n- **Update check too slow to notice new versions**: Reduced npm registry cache TTL from 24 hours to 4 hours so upgrade notices appear sooner after a new release\n\n## [0.12.4] - 2026-02-24\n\n### Fixed\n\n- **Session crash on upgrade**: Fixed `d.timestamp.getTime is not a function` error when restoring tool call data from session snapshots \u2014 `Date` objects were serialized to strings by JSON but not rehydrated on restore, causing the session monitor to crash on first run after upgrading from 0.12.2 to 0.12.3\n\n## [0.12.3] - 2026-02-24\n\n### Added\n\n- **Latest-node indicator**: The most recently added node in tree and boxed mind map views is now marked with a yellow indicator\n- **Plan analytics in mind map**: Tree and boxed views now display plan progress and per-step metrics\n - Tree view: plan header shows completion stats; steps show complexity, duration, tokens, tool calls, and errors in metadata brackets\n - Box view: progress bar with completion percentage; steps show right-aligned metrics; subtitle shows step count and total duration\n- **Cross-provider plan extraction**: Shared `PlanExtractor` now handles Claude Code (EnterPlanMode/ExitPlanMode) and OpenCode (`<proposed_plan>` XML) plans \u2014 previously only Codex plans were shown\n- **Enriched plan data model**: Plan steps include duration, token count, tool call count, and error messages\n- **Phase-grouped plan display**: When a plan has phase structure, tree and boxed views group steps under phase headers with context lines from the original plan markdown\n- **Node type filter**: Press `f` on the Mind Map tab to cycle through node type filters (file, tool, task, subagent, command, plan, knowledge-note) \u2014 non-matching sections render dimmed in grey\n\n### Fixed\n\n- **Kanban board regression**: Subagent and plan-step tasks now correctly appear in the kanban board\n\n### Changed\n\n- **Plans panel temporarily disabled**: The Plans panel in the CLI dashboard is disabled until plan-mode event capture is reliably working end-to-end. Plan nodes in the mind map remain active.\n- `DashboardState` now delegates to shared `EventAggregator` instead of maintaining its own aggregation logic\n\n## [0.12.2] - 2026-02-23\n\n### Added\n\n- **Update notifications**: The dashboard now checks the npm registry for newer versions on startup and shows a yellow banner in the status bar when an update is available (e.g., `v0.13.0 available \u2014 npm i -g sidekick-agent-hub`). Results are cached for 24 hours to avoid repeated network requests.\n\n## [0.12.1] - 2026-02-23\n\n### Fixed\n\n- **VS Code integration**: Fixed exit code 127 when the extension launches the CLI dashboard on systems using nvm or volta (node binary not found when shell init is bypassed)\n\n## [0.12.0] - 2026-02-22\n\n### Added\n\n- **"Open CLI Dashboard" VS Code Integration**: New VS Code command `Sidekick: Open CLI Dashboard` launches the TUI dashboard in an integrated terminal\n - Install the CLI with `npm install -g sidekick-agent-hub`\n\n## [0.11.0] - 2026-02-19\n\n### Added\n\n- **Initial Release**: Full-screen TUI dashboard for monitoring agent sessions from the terminal\n - Ink-based terminal UI with panels for sessions, tasks, kanban, mind map, notes, decisions, search, files, and git diff\n - Multi-provider support: auto-detects Claude Code, OpenCode, and Codex sessions\n - Reads from `~/.config/sidekick/` \u2014 the same data files the VS Code extension writes\n - Usage: `sidekick dashboard [--project <path>] [--provider <id>]`\n';
|
|
86413
|
+
CHANGELOG_default = '# Changelog\n\nAll notable changes to the Sidekick Agent Hub CLI will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),\nand this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n\n## [0.21.6] - 2026-07-02\n\n### Added\n\n- **Codex reset credits in `sidekick quota`**: When Codex quota is fetched from the API (`--refresh`, or the API-first `--all` view), the Rate Limits output now includes a `Reset Credits: N available` line plus a per-credit `Expires` row (expiry timestamp and title) for each available reset grant\n\n### Changed\n\n- **Bundled `sidekick-shared` 0.21.6**: Picks up `fetchCodexResetCreditsFromApi()` and the reset-credits snapshot on Codex quota state\n\n## [0.21.5] - 2026-06-30\n\n### Fixed\n\n- **`sidekick quota --all` no longer shows Codex at 0%**: Codex emits multiple rate-limit families per session (the aggregate plan quota plus per-model families like `codex_bengalfox`). A per-model family at 0% with a later reset window could mask the real plan quota in the local-data path; the aggregate family is now always preferred, so `--all` matches `--provider codex --refresh`. `quota --all` also fetches Codex API-first (with automatic local fallback), matching the live Claude/z.ai legs; the single-provider `quota --provider codex` stays local-by-default (live via `--refresh`)\n\n### Changed\n\n- **Bundled `sidekick-shared` 0.21.5**: Picks up the aggregate Codex rate-limit selection\n\n## [0.21.4] - 2026-06-30\n\n### Fixed\n\n- **`sidekick quota` shows the logged-in account**: The account line now reflects the currently logged-in Claude/Codex account even after a native `claude /login` or `codex login`, instead of the stale saved registry pointer. The live Codex account is resolved once per invocation and reused across the fetch and the printed output\n\n### Changed\n\n- **Bundled `sidekick-shared` 0.21.4**: Picks up the live-first active-account resolvers\n\n## [0.21.3] - 2026-06-23\n\n### Changed\n\n- **`sidekick quota` projects every provider**: Quota output is now rendered as a unified table with aligned `now` / `projected` / `resets` columns, and projected end-of-window utilization is shown for **all** providers (Claude, Codex, z.ai) \u2014 previously only Claude displayed a projection. A `\u2014` placeholder appears when a projection is unavailable, and utilization bars are clamped to 0\u2013100% so over-limit projections render cleanly. `sidekick quota --all` uses the same table for each provider section\n- **Bundled `sidekick-shared` 0.21.3**: Picks up the quota projection helpers and the bounded synchronous CLI probes\n\n### Security\n\n- **npm audit**: Bumped `esbuild` to `^0.28.1` and `vitest` to `^4.1.9` to clear reported dev-dependency advisories\n\n## [0.21.2] - 2026-06-22\n\n### Changed\n\n- **`sidekick quota --provider zai`** now renders authoritative z.ai plan utilization from z.ai\'s quota API (5-Hour / Weekly windows with real reset times) instead of estimating from observed OpenCode traffic, falling back to a cached snapshot when the API is unavailable. `sidekick quota --all` and `sidekick quota history --provider zai` use the same authoritative source\n- **`--tier lite|pro|max|auto`** is deprecated and no longer affects the displayed utilization\n\n## [0.21.1] - 2026-06-21\n\n### Added\n\n- **z.ai Coding Plan quota**: `sidekick quota --provider zai` derives and renders z.ai plan utilization from OpenCode traffic already on disk (5-Hour / Weekly windows with per-tier prompt budgets). `--tier lite|pro|max|auto` overrides the assumed plan tier (default `auto`). `sidekick quota --provider opencode` now auto-routes to z.ai quota when z.ai traffic is detected. `sidekick quota --all` includes the z.ai section when active\n- **z.ai quota history heatmap**: `sidekick quota history --provider zai` renders a 13-week z.ai utilization heatmap for the current workspace, alongside the existing Claude and Codex heatmaps (now also in `--all`)\n\n### Changed\n\n- **Bundled `sidekick-shared` 0.21.1**: Picks up z.ai quota derivation and the OpenCode data directory resolution fix.\n\n### Limitations\n\n- z.ai quota is **estimated, not authoritative** \u2014 it reflects only the OpenCode traffic Sidekick observed on this machine/workspace (z.ai exposes no usage API) compared against provisional per-tier prompt budgets. z.ai is observed-only (no z.ai inference provider) and has no account management yet; with `--tier auto`, the tier is under-detected early in a cycle (use an explicit `--tier`); reset times are approximate unless a rate-limit error is trapped.\n\n## [0.21.0] - 2026-06-21\n\n### Added\n\n- **Account login**: `sidekick account --login` starts the provider-isolated login flow for Claude Max or Codex and saves the authenticated profile without disturbing the active account until finalization\n- **All-provider account view**: `sidekick account --provider all` lists Claude and Codex saved accounts together, including active state. JSON output returns provider-keyed account arrays and active ids\n- **Terminal account helpers**: `sidekick account --launcher <name>` creates opt-in launchers for the selected account, and `--auto-switch <pct|off>` persists the CLI auto-switch threshold preference\n- **Multi-provider quota output**: `sidekick quota --all` shows Claude and Codex quota state together \u2014 each provider degrades independently, so one provider\'s quota still prints even when the other is unavailable; `--all --json` emits a provider-keyed payload for automation\n\n### Changed\n\n- **Bundled `sidekick-shared` 0.21.0**: Picks up Account Management 2.0 acquisition, switching, terminal sync, quota auto-switch, and account schema exports.\n\n## [0.20.0] - 2026-06-17\n\n### Added\n\n- **`sidekick extract`**: New one-shot command for pulling actionable assets out of recent Claude Code and Codex chats for exactly the current cwd. It extracts URLs, filesystem-validated file paths, commands the agent suggested for the user to run, and plan-mode plans. Output is grouped and colored by default, labels each item with its source agent, validates invalid `--type` and `--limit` values, preserves `inChat` and per-item provenance in `--json`, and offers `-i/--interactive` for a picker that opens URLs or copies selected paths, commands, and plans. `--provider claude-code` and `--provider codex` scope extraction to one agent; OpenCode is reported as unsupported for now\n\nThanks to [@B33pBeeps](https://github.com/B33pBeeps) (Juan Fourie) for contributing this feature in [#17](https://github.com/cesarandreslopez/sidekick-agent-hub/pull/17), adapted from his MIT-licensed [`trawl`](https://github.com/B33pBeeps/trawl) project.\n\n## [0.19.3] - 2026-06-17\n\n### Changed\n\n- **Bundled `sidekick-shared` projection contract**: The shared assistant-turn projection now exposes a v2 `timeline` array for interleaved reasoning, narration, and tool groups. This is a shared-library contract update for downstream consumers and does not change CLI behavior by itself\n\n## [0.19.2] - 2026-06-15\n\n### Changed\n\n- **Bundled `sidekick-shared` 0.19.2**: The shared library gains a browser-safe assistant-turn projection module (`segmentAssistantTurn()`, `assistantTurnEventsFromSessionEvents()`, and mirrored Zod schemas) that segments an assistant turn into a compact Process + Answer shape, with Claude `Task` subagent refs surfaced without leaking prompt text \u2014 internal additions that don\'t change CLI behavior\n\n## [0.19.1] - 2026-06-09\n\n### Changed\n\n- **Bundled `sidekick-shared` 0.19.1**: Model-ID pricing and context-window lookups (behind the dashboard\'s cost and context gauges) now tolerate padded or mixed-case IDs. The shared library also gains Zod boundary schemas, an `extractSessionEvents()` progress-unwrapping helper, and a `/schemas` subpath export for downstream consumers \u2014 internal additions that don\'t change CLI behavior\n\n## [0.19.0] - 2026-06-09\n\n### Added\n\n- **Claude Opus 4.8 & Fable 5 support**: The dashboard\'s context-window gauge and cost estimates recognize `claude-opus-4-8` and `claude-fable-5` (both 1M-token context; Opus 4.8: $5/$25 per MTok, Fable 5: $10/$50 per MTok) via the shared model catalog\n\n### Changed\n\n- **Codex account switching now swaps `~/.codex/auth.json`**: `sidekick account --provider codex --switch-to <id>` (and `--add`) activates the account by atomically swapping its backed-up credentials into the system `~/.codex/` home, mirroring the Claude switch pattern \u2014 codex terminals outside Sidekick pick up the switch. Profile directories become pure credential backups, with a one-time startup migration for installs created under the old `CODEX_HOME`-redirection model. The command surfaces swap warnings on add, switch, and remove: a running codex process that needs restarting, stale credentials, or OS-keyring credential storage that Sidekick cannot swap\n\n### Fixed\n\n- **Opus 4.6/4.7 cost over-estimation**: Dashed model IDs fell back to the Opus 4.0 pricing tier ($15/$75 instead of $5/$25), inflating estimated costs 3\xD7\n- **Haiku 4.5 unpriced under dashed IDs**: Costs for `claude-haiku-4-5-*` sessions could render as "\u2014" because no dashed static pricing key existed\n\n## [0.18.5] - 2026-06-04\n\n### Changed\n\n- **Consistent Codex transcripts**: `sidekick dashboard` and `sidekick report` now parse Codex sessions via `parseTranscriptFromEvents()`, matching the canonical `SessionEvent` pipeline used by the other providers\n- **Bundled `sidekick-shared` 0.18.5**: Picks up the new session context evidence snapshot API (`buildSessionContextSnapshot`, `readSessionContextSnapshot`, `SessionContextSnapshot` and related types) and the Codex session evidence gap closures \u2014 `system` audit events, normalized `token_count` rate limits, per-file `apply_patch` expansion, tool-emission dedupe, MCP server attribution, and the new `ProviderReaderSessionWatcher`\n\n## [0.18.4] - 2026-05-27\n\n### Added\n\n- **`sidekick peak --provider <id>`**: New flag gates peak-hours output on the session provider. When the resolved provider is not `claude-code`, the command prints a "not applicable" message instead of calling the upstream endpoint\n\n### Changed\n\n- **Bundled `sidekick-shared` 0.18.4**: Picks up `scopePeakHoursToSessionProvider()`, `isClaudeCodeSessionProvider()`, `createPeakHoursNotApplicableState()` for peak-hours scoping, the improved Codex quota snapshot selection logic (`isPreferredQuotaHit`, `findAccountRolloutFiles`, `shouldKeepExistingSnapshot`), and the `notApplicable` field on `PeakHoursState`\n\n## [0.18.3] - 2026-05-19\n\n### Added\n\n- **`sidekick quota history`**: New subcommand that renders a 13-week GitHub-contributions-style heatmap of quota utilization for the current workspace. Flags: `--weeks <n>` (1-26, default 13), `--provider claude|codex` (default both), `--workspace <path>` (default cwd). Bucketed glyphs (`\xB7 \u2591 \u2592 \u2593 \u2588`) are color-coded by utilization band (\u22640 / <25 / <50 / <75 / \u226575), with per-provider rows and a peak / avg / unavailable-days / samples footer. Days that hit `available: false` render as a red `\xD7`. With `--json`, emits a `{ workspaceId, weeks, providers: { claude?, codex? }, generatedAt }` payload \u2014 the same shape consumed by the VS Code dashboard\n\n### Changed\n\n- **Bundled `sidekick-shared` 0.18.3**: Picks up the new per-workspace quota history surface (`appendQuotaHistorySample`, `readQuotaHistoryRange`, `readQuotaHistoryDailyBuckets`, `pruneQuotaHistory`, `getWorkspaceIdFromPath`) and the optional `workspaceId` / `appendHistorySample` hooks on `CodexQuotaWatcher`\n\n## [0.18.2] - 2026-05-19\n\n### Added\n\n- **`sidekick quota --refresh`**: New flag on the `quota` command that, for Codex, explicitly refreshes from the ChatGPT usage API before falling back to local rollout data and cached snapshots. Without the flag, the Codex quota path stays fully local and makes no upstream network call\n\n### Changed\n\n- **Codex quota is local-only by default**: `sidekick quota --provider codex` now delegates to the new `resolveCodexQuota` orchestrator in `sidekick-shared`. It checks the current workspace\'s most recent rollout, then recent account-level rollouts under `CODEX_HOME/sessions`, then the active account\'s cached snapshot \u2014 no upstream network call unless `--refresh` is passed. Failure output continues to include structured `failureKind` / `httpStatus` / `retryAfterMs` fields under `--json`\n- **Bundled `sidekick-shared` 0.18.2**: Picks up the new Codex quota orchestrator (`resolveCodexQuota`, `resolveCodexQuotaFromLocalSources`, `readLatestCodexQuotaFromRollouts`, `fetchCodexQuotaFromApi`), the relaxed `CodexRateLimits` shape (nullable `resets_at` / `window_minutes`), the rate-limit-only `token_count` event emission in `JsonlSessionWatcher`, and `state_N.sqlite` discovery in `CodexDatabase` + provider auto-detect\n\n## [0.18.1] - 2026-05-08\n\n### Changed\n\n- **Shared dashboard formatting**: terminal dashboard `fmtNum()` and `formatDuration()` now delegate to `formatTokenCount()` and `formatDurationMs()` from `sidekick-shared`, keeping the existing CLI surface (uppercase `K`/`M` suffix, compact `1m5s` style) while removing forked rounding logic\n\n## [0.18.0] - 2026-05-08\n\n### Changed\n\n- **Bundled `sidekick-shared` 0.18.0**: Picks up the new provider-aware quota orchestration surface \u2014 `MultiProviderQuotaService`, `CodexQuotaWatcher`, `getActiveAccountStatus()`, `extractToolCall()`, cost-provenance helpers (`calculateCostWithProvenance`, `mergeCostSources`), and model display helpers (`shortModelName`, `getModelDisplayInfo`, `compareModelIds`, `sortModelIds`). `parseModelId()` also now recognizes legacy Claude IDs such as `claude-3-opus-20240229` and `claude-3-5-sonnet-20241022`\n- **No CLI runtime changes**: This release ships the shared library upgrade for downstream tooling alignment; `sidekick quota`, `sidekick status`, and the live dashboard keep using the existing polling path. Wiring the new orchestrator into the CLI will land in a follow-up release\n\n## [0.17.7] - 2026-04-28\n\n### Fixed\n\n- **Quota snapshot write race**: Updated the bundled `sidekick-shared` snapshot writer so concurrent `sidekick quota` / Codex session updates no longer collide on `quota-snapshots.json.tmp` or throw `ENOENT`. Failed writes now also clean up their partial temp files instead of leaving orphans in `~/.config/sidekick/`\n\n## [0.17.6] - 2026-04-19\n\n### Added\n\n- **`sidekick peak` command**: One-shot check for Claude\'s current peak-hours state \u2014 weekdays 13:00\u201319:00 UTC, when session limits drain faster on Free/Pro/Max/Team subscriptions. Prints a color-coded status block with a countdown to the next transition. Data comes from the public `promoclock.co/api/status` endpoint (third-party, unaffiliated with Anthropic) with a graceful fallback when unreachable. `--json` emits the full raw state\n- **Peak-hours block in `sidekick status`**: When the active provider is `claude-code`, the Claude + OpenAI health blocks are now followed by a **Claude Peak Hours** block (off-peak or in-peak, with countdown). Gated on the provider so OpenCode / Codex users don\'t trigger an unnecessary third-party fetch. `--json` output includes the new `peak` field\n- **Peak-hours summary in `sidekick quota`**: Claude subscription quota output now shows a **Peak** line under the 5-hour / 7-day bars \u2014 green dot off-peak, orange dot during an active peak, with a countdown to the next transition. `--json` output includes the new `peak` field\n\n## [0.17.5] - 2026-04-18\n\n### Added\n\n- **Default account bootstrap at CLI startup**: The CLI now calls `ensureDefaultAccounts()` from `sidekick-shared` at module load and awaits the result inside a Commander `preAction` hook, so the first real subcommand blocks briefly on the bootstrap while `--version` and `--help` stay instant. When a system Claude Code or Codex credential exists and no saved account is active for that provider yet, the CLI registers it as "Default" \u2014 `sidekick quota`, `sidekick account`, and `sidekick stats` now reflect the active account on first run without requiring an explicit `sidekick account --add` first. Idempotent, never overwrites manually saved accounts, and all errors are swallowed so startup is never blocked\n\nThanks to [@B33pBeeps](https://github.com/B33pBeeps) (Juan Fourie) for contributing this feature in [#16](https://github.com/cesarandreslopez/sidekick-agent-hub/pull/16).\n\n## [0.17.4] - 2026-04-17\n\n### Changed\n\n- **Pricing hydration import migrated to `sidekick-shared/node`**: `cli.ts` now imports `hydratePricingCatalog` from the new Node-only subpath and keeps `detectProvider` on the package root. Runtime behavior is unchanged; the split makes the CLI\'s import surface self-documenting (hydration is explicitly a Node API) and aligns the CLI with the shared library\'s new versioned public API contract\n\n## [0.17.3] - 2026-04-17\n\n### Changed\n\n- **Version sync with the VS Code extension**: Republished to keep CLI, extension, and shared-library versions aligned after a cosmetic changelog fix in 0.17.3. No CLI code changes \u2014 functionally identical to 0.17.2\n\n## [0.17.2] - 2026-04-17\n\n### Added\n\n- **LiteLLM pricing hydration on startup**: The CLI now fetches the LiteLLM pricing catalog on startup and caches to `~/.config/sidekick/pricing-catalog.json` with a 24-hour TTL, 3s timeout, and stale-cache fallback \u2014 new model prices are picked up without a CLI upgrade\n- **Expanded pricing coverage**: GPT-4o, GPT-4.1, GPT-5.x, o1, o3, and o3-mini families are now priced alongside the existing Claude entries\n- **Real-dollar Codex / Claude Code costs**: `EventAggregator` computes cost from the pricing table when the session provider doesn\'t report one, so `sidekick` live dashboards now show actual dollars for Codex and Claude Code sessions\n- **`stats` footer lists unpriced models**: `sidekick stats` prints any models encountered with no pricing entry so missing coverage is visible\n\n### Fixed\n\n- **Context-gauge % wrong for Opus 4.7 (1M) and other new models**: The dashboard\'s context gauge was dividing by 200K for Claude Opus 4.7 (native 1M), inflating the displayed %. The shared model \u2192 context-window map now includes Opus/Sonnet 4.7 (1M), GPT-5.4 (1.05M), GPT-5.3-Codex (400K), and GPT-5.3-Codex-Spark (128K). Claude Code\'s `[1m]` suffix is now also honored as an explicit 1M marker\n- **Silent Sonnet-priced fallback for unknown models**: Codex, GPT-5.x, and o-series rows were being rendered at Sonnet rates. Unknown-model rows now render as `\u2014` in yellow instead of inventing a dollar figure\n\n### Changed\n\n- **`historical-data.json` schema v2**: reads `priced` flag and `unpricedModelIds` from records written by the latest VS Code extension; v1 records still read correctly\n\n## [0.17.1] - 2026-04-13\n\n### Fixed\n\n- **Codex multi-home session discovery**: Provider detection now scans all candidate Codex home directories, fixing missed sessions when the managed profile home is empty but the system `~/.codex/` has activity\n\n## [0.17.0] - 2026-04-13\n\n### Added\n\n- **Multi-provider account management**: `sidekick account` now supports `--provider codex` for Codex profile management alongside Claude Code accounts\n- **Codex account lifecycle**: `--add` prepares a profile and spawns `codex login`; `--switch-to` and `--remove` accept email, label, or profile ID\n- **Quota snapshot fallback**: `sidekick quota` for Codex shows cached rate-limit snapshots when no active session exists, with "cached from" timestamp\n\n### Fixed\n\n- **Email normalization**: Claude account lookup normalizes email case for reliable matching\n\n## [0.16.1] - 2026-03-27\n\n### Fixed\n\n- **Dashboard provider status scoping**: The TUI now shows degraded-service notices only for the monitored provider \u2014 Claude for Claude Code sessions, OpenAI for Codex sessions, and no status banner for OpenCode\n\n## [0.16.0] - 2026-03-23\n\n### Changed\n\n- **Consistent cost formatting**: All cost displays (`stats`, `context`, Sessions panel, narrative prompt) now use shared `formatCost()` with intelligent decimal precision (4 places for < $0.01, 2 otherwise)\n- **QuotaService**: Rewritten to wrap shared `QuotaPoller` with exponential backoff instead of manual polling loop\n- **modelContext**: Now re-exports `getModelInfo` from shared library alongside `getContextWindowSize`\n\n## [0.15.2] - 2026-03-18\n\n### Fixed\n\n- **CLI help descriptions**: Updated `quota` and `status` command descriptions to reflect provider-aware behavior\n- **`sidekick quota --provider`**: Added local `--provider` option so `sidekick quota --provider codex` works naturally\n\n## [0.15.0] - 2026-03-18\n\n### Added\n\n- **OpenAI status page monitoring**: CLI dashboard now shows OpenAI API status alongside Claude API status\n- **Codex rate limits in dashboard**: Sessions panel displays Codex rate-limit data with "Rate Limits" header instead of "Quota"\n- **Provider-aware `sidekick quota` command**: Detects active provider and shows Codex rate limits, Claude subscription quota, or an informational message for OpenCode\n\n### Fixed\n\n- **QuotaService polling for Codex**: Dashboard no longer starts Claude OAuth quota polling when the active provider is Codex\n\n## [0.14.2] - 2026-03-16\n\n### Fixed\n\n- **Quota polling interval**: Reduced quota refresh from every 30 seconds to every 5 minutes to avoid unnecessary API calls\n- **SessionsPanel `detailWidth()` call**: Removed unused parameter from `detailWidth()` in the Sessions panel quota rendering\n\n## [0.14.1] - 2026-03-14\n\n### Fixed\n\n- **Per-model context window sizes**: Dashboard context gauge now shows correct utilization for Claude Opus 4.6 (1M context) and other models with non-200K windows\n\n### Changed\n\n- **Shared model context lookup**: CLI dashboard now uses the centralized `getModelContextWindowSize()` from `sidekick-shared` instead of a local duplicate map\n\n## [0.14.0] - 2026-03-12\n\n### Added\n\n- **`sidekick account` Command**: Manage Claude Code accounts from the terminal \u2014 list saved accounts, add the current account with an optional label, switch to the next or a specific account, and remove accounts. Supports `--json` output for scripting\n- **Quota Account Label**: `sidekick quota` now shows the active account email and label above the quota bars when multi-account is enabled\n- **macOS Keychain Support**: `sidekick account` and `sidekick quota` now read and write credentials via the system Keychain on macOS, fixing account switching and quota checks on Mac\n\n## [0.13.8] - 2026-03-12\n\n### Changed\n\n- **Structured quota failure output**: `sidekick quota` now renders consistent auth, rate-limit, server, network, and unexpected-failure copy from shared quota failure descriptors while preserving `--json` machine-readable output\n- **Dashboard unavailable quota rendering**: The Sessions panel now shows Claude Code quota failures inline instead of hiding the quota section whenever subscription data is unavailable\n- **Quota transition toasts**: The Ink dashboard now fires low-noise toast notifications only when Claude Code quota failure state changes, avoiding repeated alerts every polling interval\n\n## [0.13.7] - 2026-03-11\n\n### Changed\n\n- **npm README sync**: Updated the published CLI package README to reflect current OpenCode monitoring behavior, platform-specific data directories, and the `sqlite3` runtime requirement\n- **README badge cleanup**: Removed the Ask DeepWiki badge from the published CLI package README; the repo root README still keeps it\n\n## [0.13.6] - 2026-03-11\n\n### Changed\n\n- **Refreshed CLI Dashboard Wordmark**: Updated the dashboard wordmark/header styling for a cleaner splash and dashboard identity\n\n### Fixed\n\n- **OpenCode dashboard startup**: OpenCode DB-backed session discovery now resolves projects by worktree, sandboxes, and session directory instead of quietly behaving like no session exists\n- **OpenCode runtime notices**: The CLI now prints an OpenCode-only actionable notice when `opencode.db` exists but `sqlite3` is missing, blocked, or otherwise unusable in the current shell environment\n\n## [0.13.5] - 2026-03-10\n\n### Added\n\n- **`sidekick status` Command**: One-shot Claude API status check with color-coded text output and `--json` mode\n- **Dashboard Status Banner**: Status bar shows a colored `\u25CF API minor/major/critical` indicator when Claude is degraded; Sessions panel Summary tab shows an "API Status" section with affected components and active incident details. Polls every 60s\n\n## [0.13.4] - 2026-03-08\n\n### Fixed\n\n- **Onboarding Phrase Spam**: Splash screen and detail pane motivational phrases memoized \u2014 no longer flicker every render tick (fixes [#13](https://github.com/cesarandreslopez/sidekick-agent-hub/issues/13))\n\n### Changed\n\n- **Simplified Logo**: Replaced 6-line ASCII robot art with compact text header in splash, help, and changelog overlays\n- **Removed Dead Code**: Removed unused `getSplashContent()` and `HELP_HEADER` exports from branding module\n\n## [0.13.3] - 2026-03-04\n\n_No CLI-specific changes in this release._\n\n## [0.13.2] - 2026-03-04\n\n_No CLI-specific changes in this release._\n\n## [0.13.1] - 2026-03-04\n\n### Added\n\n- **`sidekick quota` Command**: One-shot subscription quota check showing 5-hour and 7-day utilization with color-coded progress bars and reset countdowns \u2014 supports `--json` for machine-readable output\n- **Quota Projections**: Elapsed-time projections shown in `sidekick quota` output and TUI dashboard quota section \u2014 displays projected end-of-window utilization next to current value (e.g., `40% \u2192 100%`), included in `--json` output as `projectedFiveHour` / `projectedSevenDay`\n\n## [0.13.0] - 2026-03-03\n\n_No CLI-specific changes in this release._\n\n## [0.12.10] - 2026-03-01\n\n### Added\n\n- **Events Panel** (key 7): Scrollable live event stream with colored type badges (`[USR]`, `[AST]`, `[TOOL]`, `[RES]`), timestamps, and keyword-highlighted summaries; detail tabs for full event JSON and surrounding context\n- **Charts Panel** (key 8): Tool frequency horizontal bars, event type distribution, 60-minute activity heatmap using `\u2591\u2592\u2593\u2588` intensity characters, and pattern analysis with frequency bars and template text\n- **Multi-Mode Filter**: `/` filter overlay now supports four modes \u2014 substring, fuzzy, regex, and date range \u2014 Tab cycles modes, regex mode shows red validation errors\n- **Search Term Highlighting**: Active filter terms highlighted in blue within side list items\n- **Timeline Keyword Coloring**: Event summaries in the Sessions panel Timeline tab now use semantic keyword coloring \u2014 errors red, success green, tool names cyan, file paths magenta\n\n### Removed\n\n- **Search Panel**: Removed redundant Search panel (previously key 7) \u2014 the `/` filter with multi-mode support serves the same purpose\n\n## [0.12.9] - 2026-02-28\n\n### Added\n\n- **Standalone Data Commands**: `sidekick tasks`, `sidekick decisions`, `sidekick notes`, `sidekick stats`, `sidekick handoff` for accessing project data without launching the TUI\n- **`sidekick search <query>`**: Cross-session full-text search from the terminal\n- **`sidekick context`**: Composite output of tasks, decisions, notes, and handoff for piping into other tools\n- **`--list` flag on `sidekick dump`**: Discover available session IDs before requiring `--session <id>`\n- **Search Panel**: Search panel (panel 7) wired into the TUI dashboard\n\n### Changed\n\n- **`taskMerger` utility**: Duplicate `mergeTasks` logic extracted into shared `taskMerger` utility\n- **Model constants**: Hardcoded model IDs extracted to named constants\n\n### Fixed\n\n- **`convention` icon**: Notes panel icon replaced with valid `tip` type\n- **Linux clipboard**: Now supports Wayland (`wl-copy`) and `xsel` fallbacks, with error messages instead of silent failure\n- **`provider.dispose()`**: Added to `dump` and `report` commands (prevents SQLite connection leaks)\n\n## [0.12.8] - 2026-02-28\n\n### Changed\n\n- **Dashboard UI/UX Polish**: Visual overhaul for better hierarchy, consistency, and readability\n - Splash screen and help overlay now display the robot ASCII logo\n - Toast notifications show severity icons (\u2718 error, \u26A0 warning, \u25CF info) with inner padding\n - Focused pane uses double-border for clear focus indication\n - Section dividers (`\u2500\u2500 Title \u2500\u2500\u2500\u2500`) replace bare bold headers in summary, agents, and context attribution\n - Tab bar: active tab underlined in magenta, inactive tabs dimmed, bracket syntax removed\n - Status bar: segmented layout with `\u2502` separators; keys bold, labels dim\n - Summary metrics condensed: elapsed/events/compactions on one line, tokens on one line with cache rate and cost\n - Sparklines display peak metadata annotations\n - Progress bars use blessed color tags for consistent coloring\n - Help overlay uses dot-leader alignment for all keybinding rows\n - Empty state hints per panel (e.g. "Tasks appear as your agent works.")\n - Session picker groups sessions by provider with section headers when multiple providers are present\n\n## [0.12.7] - 2026-02-27\n\n### Added\n\n- **HTML Session Report**: `sidekick report` command generates a self-contained HTML report and opens it in the default browser\n - Options: `--session`, `--output`, `--theme` (dark/light), `--no-open`, `--no-thinking`\n - TUI Dashboard: press `r` to generate and open an HTML report for the current session\n\n## [0.12.6] - 2026-02-26\n\n### Added\n\n- **Session Dump Command**: `sidekick dump` exports session data in text, markdown, or JSON format with `--format`, `--width`, and `--expand` options\n- **Plans Panel Re-enabled**: Plans panel restored in CLI dashboard with plan file discovery from `~/.claude/plans/`\n- **Enhanced Status Bar**: Session info display improved with richer metadata\n\n### Fixed\n\n- **Old snapshot format migration**: Restoring pre-0.12.3 session snapshots no longer shows empty timeline entries\n\n### Changed\n\n- **Phrase library moved to shared**: CLI-specific phrase formatting kept local, all phrase content now from `sidekick-shared`\n\n## [0.12.5] - 2026-02-24\n\n### Fixed\n\n- **Update check too slow to notice new versions**: Reduced npm registry cache TTL from 24 hours to 4 hours so upgrade notices appear sooner after a new release\n\n## [0.12.4] - 2026-02-24\n\n### Fixed\n\n- **Session crash on upgrade**: Fixed `d.timestamp.getTime is not a function` error when restoring tool call data from session snapshots \u2014 `Date` objects were serialized to strings by JSON but not rehydrated on restore, causing the session monitor to crash on first run after upgrading from 0.12.2 to 0.12.3\n\n## [0.12.3] - 2026-02-24\n\n### Added\n\n- **Latest-node indicator**: The most recently added node in tree and boxed mind map views is now marked with a yellow indicator\n- **Plan analytics in mind map**: Tree and boxed views now display plan progress and per-step metrics\n - Tree view: plan header shows completion stats; steps show complexity, duration, tokens, tool calls, and errors in metadata brackets\n - Box view: progress bar with completion percentage; steps show right-aligned metrics; subtitle shows step count and total duration\n- **Cross-provider plan extraction**: Shared `PlanExtractor` now handles Claude Code (EnterPlanMode/ExitPlanMode) and OpenCode (`<proposed_plan>` XML) plans \u2014 previously only Codex plans were shown\n- **Enriched plan data model**: Plan steps include duration, token count, tool call count, and error messages\n- **Phase-grouped plan display**: When a plan has phase structure, tree and boxed views group steps under phase headers with context lines from the original plan markdown\n- **Node type filter**: Press `f` on the Mind Map tab to cycle through node type filters (file, tool, task, subagent, command, plan, knowledge-note) \u2014 non-matching sections render dimmed in grey\n\n### Fixed\n\n- **Kanban board regression**: Subagent and plan-step tasks now correctly appear in the kanban board\n\n### Changed\n\n- **Plans panel temporarily disabled**: The Plans panel in the CLI dashboard is disabled until plan-mode event capture is reliably working end-to-end. Plan nodes in the mind map remain active.\n- `DashboardState` now delegates to shared `EventAggregator` instead of maintaining its own aggregation logic\n\n## [0.12.2] - 2026-02-23\n\n### Added\n\n- **Update notifications**: The dashboard now checks the npm registry for newer versions on startup and shows a yellow banner in the status bar when an update is available (e.g., `v0.13.0 available \u2014 npm i -g sidekick-agent-hub`). Results are cached for 24 hours to avoid repeated network requests.\n\n## [0.12.1] - 2026-02-23\n\n### Fixed\n\n- **VS Code integration**: Fixed exit code 127 when the extension launches the CLI dashboard on systems using nvm or volta (node binary not found when shell init is bypassed)\n\n## [0.12.0] - 2026-02-22\n\n### Added\n\n- **"Open CLI Dashboard" VS Code Integration**: New VS Code command `Sidekick: Open CLI Dashboard` launches the TUI dashboard in an integrated terminal\n - Install the CLI with `npm install -g sidekick-agent-hub`\n\n## [0.11.0] - 2026-02-19\n\n### Added\n\n- **Initial Release**: Full-screen TUI dashboard for monitoring agent sessions from the terminal\n - Ink-based terminal UI with panels for sessions, tasks, kanban, mind map, notes, decisions, search, files, and git diff\n - Multi-provider support: auto-detects Claude Code, OpenCode, and Codex sessions\n - Reads from `~/.config/sidekick/` \u2014 the same data files the VS Code extension writes\n - Usage: `sidekick dashboard [--project <path>] [--provider <id>]`\n';
|
|
86268
86414
|
}
|
|
86269
86415
|
});
|
|
86270
86416
|
|
|
@@ -88619,6 +88765,26 @@ function sourceLabel(source, stale) {
|
|
|
88619
88765
|
return null;
|
|
88620
88766
|
}
|
|
88621
88767
|
}
|
|
88768
|
+
function resetCreditMetaRows(resetCredits) {
|
|
88769
|
+
if (!resetCredits) return [];
|
|
88770
|
+
const availableCredits = resetCredits.credits.filter(
|
|
88771
|
+
(credit) => credit.status.toLowerCase() === "available"
|
|
88772
|
+
);
|
|
88773
|
+
const rows = [
|
|
88774
|
+
{
|
|
88775
|
+
label: "Reset Credits",
|
|
88776
|
+
value: `${resetCredits.availableCount} available`,
|
|
88777
|
+
color: source_default.cyan
|
|
88778
|
+
}
|
|
88779
|
+
];
|
|
88780
|
+
for (const credit of availableCredits) {
|
|
88781
|
+
rows.push({
|
|
88782
|
+
label: "Expires",
|
|
88783
|
+
value: credit.title ? `${credit.expiresAt} - ${credit.title}` : credit.expiresAt
|
|
88784
|
+
});
|
|
88785
|
+
}
|
|
88786
|
+
return rows;
|
|
88787
|
+
}
|
|
88622
88788
|
function printQuotaTable(title, rows, metaRows = []) {
|
|
88623
88789
|
const labelWidth = Math.max(
|
|
88624
88790
|
QUOTA_LABEL_WIDTH,
|
|
@@ -88772,7 +88938,7 @@ async function codexQuotaAction(provider, globalOpts, localOpts, jsonOutput) {
|
|
|
88772
88938
|
}
|
|
88773
88939
|
printCodexQuota(quota, resolvedAccount);
|
|
88774
88940
|
}
|
|
88775
|
-
async function fetchCodexQuotaPayload(provider, globalOpts, localOpts) {
|
|
88941
|
+
async function fetchCodexQuotaPayload(provider, globalOpts, localOpts, apiFirst = false) {
|
|
88776
88942
|
const workspacePath = globalOpts.project || process.cwd();
|
|
88777
88943
|
const activeAccount = (0, import_sidekick_shared29.getActiveCodexAccount)();
|
|
88778
88944
|
try {
|
|
@@ -88780,7 +88946,7 @@ async function fetchCodexQuotaPayload(provider, globalOpts, localOpts) {
|
|
|
88780
88946
|
workspacePath,
|
|
88781
88947
|
provider,
|
|
88782
88948
|
activeAccount,
|
|
88783
|
-
source: localOpts.refresh ? "api" : "local"
|
|
88949
|
+
source: apiFirst || localOpts.refresh ? "api" : "local"
|
|
88784
88950
|
});
|
|
88785
88951
|
} finally {
|
|
88786
88952
|
provider.dispose();
|
|
@@ -88822,6 +88988,7 @@ function printCodexQuota(quota, resolved) {
|
|
|
88822
88988
|
} else if (source) {
|
|
88823
88989
|
metaRows.push({ label: "Source", value: source });
|
|
88824
88990
|
}
|
|
88991
|
+
metaRows.push(...resetCreditMetaRows(quota.resetCredits));
|
|
88825
88992
|
printQuotaTable("Rate Limits", rows, metaRows);
|
|
88826
88993
|
}
|
|
88827
88994
|
async function detectZaiRouting() {
|
|
@@ -88890,7 +89057,9 @@ async function allQuotaAction(globalOpts, localOpts, jsonOutput) {
|
|
|
88890
89057
|
const resolvedCodex = (0, import_sidekick_shared29.resolveActiveCodexAccount)();
|
|
88891
89058
|
const [{ quota: claude, peak }, codex, zai] = await Promise.all([
|
|
88892
89059
|
fetchClaudeQuotaPayload(),
|
|
88893
|
-
|
|
89060
|
+
// API-first for the aggregate `--all` view, matching the live Claude/z.ai legs;
|
|
89061
|
+
// falls back to local rollouts/cache on any API failure.
|
|
89062
|
+
fetchCodexQuotaPayload(codexProvider, globalOpts, localOpts, true),
|
|
88894
89063
|
fetchZaiQuotaPayload(localOpts)
|
|
88895
89064
|
]);
|
|
88896
89065
|
if (jsonOutput) {
|
|
@@ -90306,7 +90475,7 @@ var init_cli = __esm({
|
|
|
90306
90475
|
defaultAccountsReady = (0, import_sidekick_shared36.ensureDefaultAccounts)().catch(() => {
|
|
90307
90476
|
});
|
|
90308
90477
|
program2 = new Command();
|
|
90309
|
-
program2.name("sidekick").description("Query Sidekick project intelligence from the command line").version("0.21.
|
|
90478
|
+
program2.name("sidekick").description("Query Sidekick project intelligence from the command line").version("0.21.6").option("--json", "Output as JSON").option("--project <path>", "Override project path (default: cwd)").option("--provider <id>", "Provider: claude-code, opencode, codex, auto (default: auto)");
|
|
90310
90479
|
program2.hook("preAction", async () => {
|
|
90311
90480
|
await defaultAccountsReady;
|
|
90312
90481
|
});
|