@narumitw/pi-usage 0.64.3 → 0.65.0

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/src/usage.ts CHANGED
@@ -2,6 +2,7 @@
2
2
  // account cache, cancellation, and session lifecycle share one consistency boundary.
3
3
  import { randomUUID } from "node:crypto";
4
4
  import type { ExtensionAPI, ExtensionCommandContext, ExtensionContext } from "@earendil-works/pi-coding-agent";
5
+ import { isOfficialCodexModel } from "./codex-fast.js";
5
6
  import { FAST_USAGE_WARNING, registerCodexFastMode } from "./codex-fast-runtime.js";
6
7
  import {
7
8
  type CodexResetAvailability,
@@ -765,14 +766,27 @@ export default function usageExtension(pi: ExtensionAPI, dependencies: UsageExte
765
766
 
766
767
  const showMenu = async (ctx: ExtensionCommandContext): Promise<void> => {
767
768
  if (!ctx.hasUI) throw new Error("/usage requires TUI or RPC mode.");
768
- statusGeneration += 1;
769
- const menuGeneration = statusGeneration;
770
- statusController?.abort();
771
- statusController = undefined;
772
- clearStatusTimers();
773
769
  const controller = new AbortController();
774
770
  activeControllers.add(controller);
775
771
  try {
772
+ if (isOfficialCodexModel(ctx.model)) {
773
+ const refreshed = await runMenuOperation(
774
+ ctx,
775
+ "Checking Codex Fast capability…",
776
+ controller.signal,
777
+ async (signal) => {
778
+ await fastRuntime.refreshCapabilities(ctx, signal);
779
+ return true;
780
+ },
781
+ );
782
+ if (!refreshed || controller.signal.aborted) return;
783
+ }
784
+ // Capability updates can refresh status; take menu ownership after discovery.
785
+ statusGeneration += 1;
786
+ const menuGeneration = statusGeneration;
787
+ statusController?.abort();
788
+ statusController = undefined;
789
+ clearStatusTimers();
776
790
  let stableCurrent = await queryStableCurrent(ctx, false, controller, "Checking current usage…");
777
791
  if (!stableCurrent) return;
778
792
  publishStableCurrent(ctx, stableCurrent);
@@ -919,7 +933,9 @@ export default function usageExtension(pi: ExtensionAPI, dependencies: UsageExte
919
933
  ? [`Fast mode: ${fastAvailability.enabled ? "On" : "Off"}`, FAST_USAGE_WARNING]
920
934
  : fastAvailability.kind === "unavailable"
921
935
  ? [`Fast mode: Unavailable · ${fastAvailability.reason}`]
922
- : [];
936
+ : fastAvailability.kind === "unknown"
937
+ ? [`Fast mode: Unknown · ${fastAvailability.reason}`]
938
+ : [];
923
939
  return {
924
940
  kind: "actions",
925
941
  title: "Provider usage",
@@ -936,11 +952,12 @@ export default function usageExtension(pi: ExtensionAPI, dependencies: UsageExte
936
952
  },
937
953
  ]
938
954
  : []),
939
- ...(fastAvailability.kind === "available"
955
+ ...(fastAvailability.kind === "available" ||
956
+ (fastState.settings.codexFastMode && isOfficialCodexModel(ctx.model))
940
957
  ? [
941
958
  {
942
959
  id: "toggle-fast",
943
- label: fastAvailability.enabled ? "Turn Fast mode off" : "Turn Fast mode on",
960
+ label: fastState.settings.codexFastMode ? "Turn Fast mode off" : "Turn Fast mode on",
944
961
  description:
945
962
  fastState.kind === "invalid"
946
963
  ? "Repair pi-usage.json and reload before changing Fast mode."
@@ -1114,10 +1131,11 @@ export default function usageExtension(pi: ExtensionAPI, dependencies: UsageExte
1114
1131
  },
1115
1132
  "toggle-fast": async () => {
1116
1133
  const availability = fastRuntime.availability(ctx.model);
1117
- if (availability.kind !== "available" || fastState.kind === "invalid") {
1134
+ const enabled = settingsRuntime.get().settings.codexFastMode;
1135
+ if ((availability.kind !== "available" && !enabled) || fastState.kind === "invalid") {
1118
1136
  return { kind: "rejected" };
1119
1137
  }
1120
- const changed = await fastRuntime.toggle(ctx, !availability.enabled, controller.signal);
1138
+ const changed = await fastRuntime.toggle(ctx, !enabled, controller.signal);
1121
1139
  if (!changed) return { kind: "rejected" };
1122
1140
  fastState = settingsRuntime.get();
1123
1141
  return { kind: "stay" };
@@ -1449,5 +1467,8 @@ export default function usageExtension(pi: ExtensionAPI, dependencies: UsageExte
1449
1467
 
1450
1468
  fastRuntime = registerCodexFastMode(pi, settingsRuntime, (ctx) => startStatusRefresh(ctx, ctx.model, false), {
1451
1469
  registerSessionStart: false,
1470
+ credentialReader,
1471
+ candidateReader: credentialCandidates,
1472
+ timeoutMs: DEFAULT_TIMEOUT_MS,
1452
1473
  });
1453
1474
  }