@cortexkit/opencode-anthropic-auth 1.23.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/README.md +239 -195
  2. package/dist/cli-failure.d.ts +69 -0
  3. package/dist/cli.d.ts +14 -9
  4. package/dist/cli.js +103 -80
  5. package/dist/custody-dimensions.d.ts +7 -24
  6. package/dist/custody-mode.d.ts +29 -169
  7. package/dist/effort-history.d.ts +6 -1
  8. package/dist/{index-xzbhzz0a.js → index-04syas8a.js} +2 -2
  9. package/dist/index-1jkyhgyr.js +2 -0
  10. package/dist/{index-8y2t4mwz.js → index-2arfb1y3.js} +1 -1
  11. package/dist/index-3xqv3rw3.js +2 -0
  12. package/dist/{index-0jfsxyn9.js → index-52r2e1h9.js} +1 -1
  13. package/dist/index-b3mxpp4w.js +2 -0
  14. package/dist/index-p4wvcwhh.js +3 -0
  15. package/dist/{index-1gr8v4fn.js → index-rqync0pc.js} +1 -1
  16. package/dist/index-ynq181e8.js +42 -0
  17. package/dist/index-yxtdke11.js +449 -0
  18. package/dist/index-zdgceztz.js +1 -0
  19. package/dist/index.js +1 -38
  20. package/dist/native-command.d.ts +19 -0
  21. package/dist/rpc/notifications.d.ts +2 -1
  22. package/dist/rpc/port-file.js +1 -1
  23. package/dist/rpc/protocol.d.ts +8 -4
  24. package/dist/rpc/protocol.js +1 -1
  25. package/dist/rpc/rpc-client.d.ts +2 -0
  26. package/dist/rpc/rpc-client.js +1 -1
  27. package/dist/rpc/rpc-dir.js +1 -1
  28. package/dist/rpc/rpc-server.d.ts +5 -1
  29. package/dist/setup/command.d.ts +12 -0
  30. package/dist/setup/command.test.d.ts +1 -0
  31. package/dist/setup/detect.d.ts +7 -4
  32. package/dist/setup/host-executable.d.ts +3 -0
  33. package/dist/setup/native-activation.d.ts +29 -0
  34. package/dist/setup/native-enrollment.d.ts +26 -0
  35. package/dist/setup/native-enrollment.test.d.ts +1 -0
  36. package/dist/setup/native-local.d.ts +20 -0
  37. package/dist/setup/native-login.d.ts +3 -0
  38. package/dist/setup/native-paths.d.ts +15 -0
  39. package/dist/setup/native-paths.test.d.ts +1 -0
  40. package/dist/setup/paths.d.ts +3 -2
  41. package/dist/setup/pi.d.ts +14 -4
  42. package/dist/setup/process-fence.d.ts +7 -1
  43. package/dist/setup/process-fence.test.d.ts +1 -0
  44. package/dist/sidebar-state.js +1 -1
  45. package/dist/tui/command-dialogs.d.ts +5 -0
  46. package/dist/tui-preferences.js +2 -2
  47. package/dist/v2/activation.d.ts +7 -0
  48. package/dist/v2/adapter.d.ts +276 -0
  49. package/dist/v2/install.d.ts +13 -0
  50. package/dist/v2/lifecycle.d.ts +8 -0
  51. package/dist/v2/menu-contract.d.ts +8 -0
  52. package/dist/v2/menu.d.ts +10 -0
  53. package/dist/v2/models.d.ts +6 -0
  54. package/dist/v2/ownership.d.ts +11 -0
  55. package/dist/v2/prime.d.ts +12 -0
  56. package/dist/v2/rpc.d.ts +50 -0
  57. package/dist/v2/server.d.ts +8 -0
  58. package/dist/v2/server.js +4 -0
  59. package/dist/v2/setup.d.ts +58 -0
  60. package/dist/v2/source.d.ts +41 -0
  61. package/dist/v2/tui.d.ts +13 -0
  62. package/dist/v2/tui.js +2 -0
  63. package/dist/v2/wire.d.ts +36 -0
  64. package/package.json +20 -5
  65. package/src/rpc/notifications.ts +9 -2
  66. package/src/rpc/protocol.ts +8 -7
  67. package/src/rpc/rpc-client.ts +17 -0
  68. package/src/rpc/rpc-server.ts +20 -3
  69. package/src/tui/command-dialogs.tsx +264 -0
  70. package/src/tui/entry.mjs +44 -18
  71. package/src/tui-compiled/rpc/protocol.ts +8 -7
  72. package/src/tui-compiled/rpc/rpc-client.ts +17 -0
  73. package/src/tui-compiled/tui/command-dialogs.tsx +315 -76
  74. package/src/tui-compiled/tui.tsx +24 -7
  75. package/src/tui.tsx +37 -9
  76. package/dist/claustrum-enrollment-registry.d.ts +0 -4
  77. package/dist/custody-enrollment.d.ts +0 -14
  78. package/dist/custody-live.d.ts +0 -111
  79. package/dist/custody-manifest-watcher.d.ts +0 -16
  80. package/dist/index-1fq7h6yd.js +0 -430
  81. package/dist/index-797pmamn.js +0 -2
  82. package/dist/index-a5d6v3ba.js +0 -5
  83. package/dist/index-n96q8pks.js +0 -2
  84. package/dist/index-xxhyhp98.js +0 -2
  85. package/dist/index-z7gfdyv3.js +0 -1
  86. package/dist/local-login.d.ts +0 -64
  87. package/dist/logger-kk9vyem9.js +0 -1
  88. package/dist/setup/claustrum.d.ts +0 -26
@@ -1,36 +1,19 @@
1
- import { type AccountStorage, type ClaustrumCredential, type CustodyHandleManifest, type CustodyHandleResolution, type CustodyStatusState, type OAuthAccount } from '@cortexkit/anthropic-auth-core';
2
- type CustodyDimensionsDeps = {
3
- getCache: () => {
4
- peek: (handle: string) => ClaustrumCredential | undefined;
5
- } | null | undefined;
6
- now: () => number;
7
- resolveAccountCustodyHandle: (account: OAuthAccount, storage: AccountStorage) => CustodyHandleResolution;
8
- usableAccessToken: (credential: ClaustrumCredential | undefined, now: number) => string | undefined;
9
- hasIdentityMismatch: (account: OAuthAccount, credential: ClaustrumCredential | undefined) => boolean;
10
- isBlocked: (accountId: string) => boolean;
11
- isReauth: (accountId: string) => boolean;
12
- getManifest: () => CustodyHandleManifest | undefined;
13
- };
14
- export declare function fallbackCustodyDimensions(storage: AccountStorage | null, deps: Pick<CustodyDimensionsDeps, 'getCache' | 'now' | 'resolveAccountCustodyHandle' | 'usableAccessToken'> & {
15
- construction?: boolean;
16
- }): {
17
- fallbacks: "R" | "T";
18
- evidence: "V" | "unknown";
19
- } | {
1
+ import { type AccountStorage, type CustodyStatusState } from '@cortexkit/anthropic-auth-core';
2
+ /** Only the enrolled scoped roster can establish vault ownership. */
3
+ export declare function isFallbackAccountVaultServed(accountId: string, storage: AccountStorage | null): boolean;
4
+ export declare function fallbackCustodyDimensions(storage: AccountStorage | null): {
20
5
  fallbacks: 'M';
21
- evidence: "N" | "unknown";
6
+ evidence: 'N';
22
7
  } | {
23
8
  fallbacks: "R" | "T";
24
- evidence: "N" | "V";
9
+ evidence: 'V';
25
10
  };
26
11
  export declare function mainCustodyDimension(auth: {
27
12
  type: string;
28
13
  access?: string;
29
14
  refresh?: string;
30
15
  }): "R" | "T" | "X";
31
- export declare function isFallbackAccountVaultServed(accountId: string, storage: AccountStorage | null, deps: Pick<CustodyDimensionsDeps, 'getCache' | 'now' | 'resolveAccountCustodyHandle' | 'usableAccessToken' | 'hasIdentityMismatch' | 'isBlocked'>): boolean;
32
16
  export declare function custodyStateFor(account: {
33
17
  id: string;
34
18
  role: 'main' | 'fallback';
35
- }, storage: AccountStorage | null, deps: CustodyDimensionsDeps, vaultServed?: boolean): CustodyStatusState;
36
- export {};
19
+ }, storage: AccountStorage | null): CustodyStatusState;
@@ -1,186 +1,46 @@
1
- type ModeDimension = 'L' | 'C';
2
- type MainDimension = 'R' | 'T' | 'X';
3
- type FallbackDimension = 'R' | 'T' | 'M';
4
- type EvidenceDimension = 'V' | 'N' | 'unknown';
5
- type Lock = {
6
- release: () => Promise<void>;
7
- };
8
- export declare const OPENCODE_MAIN_OAUTH_REFRESH_LOCK = "opencode-main-oauth-refresh";
9
- export declare const CUSTODY_PREFLIGHT_MIN_TTL_MS: number;
10
- export type CustodyCacheCredential = {
11
- credentialId?: string;
12
- recordVersion: number;
13
- access: string;
14
- refresh: string;
15
- expiresAt: number | null;
16
- state: 'usable' | 'revoked' | 'reauth' | 'timeout';
17
- };
18
- export type ClaustrumTakeoverPlan = {
19
- accounts: Array<{
20
- id: string;
21
- label: string;
22
- handle: string;
23
- credentialId: string;
24
- recordVersion: number;
25
- bindingPersisted: boolean;
26
- localAuthFingerprint: string;
27
- cacheCredential: CustodyCacheCredential;
28
- }>;
29
- toJSON: () => unknown;
30
- toString: () => string;
31
- };
32
- export type CustodyPreflightRefusalReason = 'TAKEOVER_INCOMPLETE_MAIN_REAL' | 'TAKEOVER_INCOMPLETE_MAIN_BINDING' | 'binding_missing' | 'credential_revoked' | 'credential_reauth' | 'credential_timeout' | 'credential_unusable' | 'credential_identity_mismatch' | 'divergence_fenced' | 'TAKEOVER_INCOMPLETE_MAIN_SLOT' | 'local_credential_unavailable';
33
- export type CustodyPreflightRefusal = {
34
- label: string;
35
- reason: CustodyPreflightRefusalReason;
36
- guidance?: string;
37
- };
38
- export type MainCustodyRefusal = 'cold' | 'reauth' | 'takeover-incomplete' | 'identity-mismatch';
39
- export declare class CustodyPreflightRefusedError extends Error {
40
- readonly accountId: string;
41
- readonly reason: CustodyPreflightRefusalReason;
42
- readonly refusals: CustodyPreflightRefusal[];
43
- readonly code = "custody_preflight_refused";
44
- constructor(accountId: string, reason: CustodyPreflightRefusalReason, refusals?: CustodyPreflightRefusal[]);
45
- toJSON(): {
46
- ok: boolean;
47
- code: string;
48
- accountId: string;
49
- reason: CustodyPreflightRefusalReason;
50
- refusals: CustodyPreflightRefusal[];
51
- };
52
- }
53
1
  export declare class CustodyStateMismatchError extends Error {
54
2
  readonly verdict: string;
55
3
  readonly dimensions: {
56
- mode: ModeDimension;
57
- main: MainDimension;
58
- fallbacks: FallbackDimension;
59
- evidence: EvidenceDimension;
4
+ mode: 'L' | 'C';
5
+ main: 'R' | 'T' | 'X';
6
+ fallbacks: 'R' | 'T' | 'M';
7
+ evidence: 'V' | 'N';
60
8
  };
61
9
  readonly code = "custody_state_mismatch";
62
10
  constructor(verdict: string, dimensions: {
63
- mode: ModeDimension;
64
- main: MainDimension;
65
- fallbacks: FallbackDimension;
66
- evidence: EvidenceDimension;
11
+ mode: 'L' | 'C';
12
+ main: 'R' | 'T' | 'X';
13
+ fallbacks: 'R' | 'T' | 'M';
14
+ evidence: 'V' | 'N';
67
15
  });
68
16
  toJSON(): {
69
17
  code: string;
70
18
  verdict: string;
71
19
  dimensions: {
72
- mode: ModeDimension;
73
- main: MainDimension;
74
- fallbacks: FallbackDimension;
75
- evidence: EvidenceDimension;
20
+ mode: 'L' | 'C';
21
+ main: 'R' | 'T' | 'X';
22
+ fallbacks: 'R' | 'T' | 'M';
23
+ evidence: 'V' | 'N';
76
24
  };
77
25
  };
78
26
  }
79
- export declare class CustodyLockBusyError extends Error {
80
- readonly lockName: string;
81
- readonly code = "lock_busy";
82
- constructor(lockName: string);
83
- }
84
- type PreflightRoute = {
85
- id: string;
86
- label?: string;
87
- enabled?: boolean;
88
- type: string;
89
- local?: unknown;
90
- };
91
- type PreflightBinding = {
92
- accountId: string;
93
- label: string;
94
- handle: string;
95
- credentialId: string;
96
- source?: 'manifest' | 'legacy';
97
- };
98
- export type PreflightClaustrumTakeoverInput = {
99
- now: number;
100
- storage: {
101
- refresh?: {
102
- refreshBeforeExpiryMinutes?: number;
103
- };
104
- claustrumDivergence?: Record<string, {
105
- minimumRecordVersion: number;
106
- observedAt?: number;
107
- }>;
108
- } | null;
109
- main: Pick<PreflightRoute, 'id' | 'label' | 'enabled'>;
110
- fallbacks: PreflightRoute[];
111
- hostAuth: {
112
- get: () => unknown | Promise<unknown>;
113
- };
114
- bindings: PreflightBinding[];
115
- cache: {
116
- get: (handle: string, options: {
117
- minTtlMs: number;
118
- }) => Promise<CustodyCacheCredential | {
119
- state: string;
120
- expiresAt?: number;
121
- }>;
122
- };
123
- debug?: (message: string) => void;
124
- };
125
- export declare function preflightClaustrumTakeover(input: PreflightClaustrumTakeoverInput): Promise<ClaustrumTakeoverPlan>;
27
+ /**
28
+ * Check custody independently from account availability. Modes L/C mean local
29
+ * and Claustrum vault. Main R/T/X means a real login, inert tombstone, or no
30
+ * recognized OAuth marker; fallback R/T/M means local rows, token-free vault
31
+ * inventory, or missing roster. Evidence V/N means verified or unavailable.
32
+ * Local mode still requires completed migration and local account rows. Vault
33
+ * mode requires enrollment authority, the host marker and a readable roster,
34
+ * not an active primary. Each request separately authorizes its chosen account;
35
+ * the marker enables the provider but cannot authenticate it. Ordinary OpenCode
36
+ * API-key authentication remains outside this OAuth custody check.
37
+ */
126
38
  export declare function reconcileCustodyStartup(input: {
127
- mode: ModeDimension;
128
- main: MainDimension;
129
- fallbacks: FallbackDimension;
130
- evidence: EvidenceDimension;
131
- } | {
132
- mode: ModeDimension;
133
- mainSlot: 'unknown';
134
- fallbacks: FallbackDimension;
135
- evidence: EvidenceDimension;
39
+ mode: 'L' | 'C';
40
+ main: 'R' | 'T' | 'X';
41
+ fallbacks: 'R' | 'T' | 'M';
42
+ evidence: 'V' | 'N';
43
+ authority?: 'committed' | 'retired';
136
44
  }): {
137
- verdict: string;
138
- provisional?: boolean;
139
- };
140
- export declare function acquireCustodyTransitionLocks(input: {
141
- storagePath: string;
142
- manifestPath: string;
143
- fallbackAccountIds: string[];
144
- acquireTransition: (input: {
145
- name: 'claustrum-mode-transition';
146
- path: string;
147
- }) => Promise<Lock | null>;
148
- acquireManifest: (input: {
149
- path: string;
150
- }) => Promise<Lock | null>;
151
- acquireRefresh: (input: {
152
- name: string;
153
- path: string;
154
- }) => Promise<Lock | null>;
155
- }): Promise<{
156
- release: () => Promise<void>;
157
- }>;
158
- export declare class CustodyTransitionError extends Error {
159
- readonly stage: 'reverify_fingerprint' | 'write_manifest' | 'write_sidecar' | 'readback' | 'mode_commit' | 'post_commit_readback';
160
- readonly accountId?: string | undefined;
161
- readonly guidance?: string | undefined;
162
- readonly code = "custody_transition_failed";
163
- constructor(stage: 'reverify_fingerprint' | 'write_manifest' | 'write_sidecar' | 'readback' | 'mode_commit' | 'post_commit_readback', accountId?: string | undefined, guidance?: string | undefined);
164
- toJSON(): {
165
- code: string;
166
- stage: "mode_commit" | "post_commit_readback" | "readback" | "reverify_fingerprint" | "write_manifest" | "write_sidecar";
167
- accountId: string | undefined;
168
- guidance: string | undefined;
169
- };
170
- }
171
- export type ExecuteClaustrumTakeoverDeps = {
172
- locks: Parameters<typeof acquireCustodyTransitionLocks>[0];
173
- getLocalAuth: (accountId: string) => Promise<unknown>;
174
- isCommitted: (plan: ClaustrumTakeoverPlan) => Promise<boolean>;
175
- writeManifestBindings: (plan: ClaustrumTakeoverPlan) => Promise<void>;
176
- writeSidecarAccount: (account: ClaustrumTakeoverPlan['accounts'][number]) => Promise<void>;
177
- verifyTarget: (plan: ClaustrumTakeoverPlan) => Promise<boolean>;
178
- verifyCommitted: (plan: ClaustrumTakeoverPlan) => Promise<boolean>;
179
- setMode: (mode: 'claustrum' | 'local') => Promise<'changed' | 'unchanged'>;
45
+ verdict: 'LOCAL_SERVE' | 'CLAUSTRUM_SERVE';
180
46
  };
181
- export declare function executeClaustrumTakeover(plan: ClaustrumTakeoverPlan, deps: ExecuteClaustrumTakeoverDeps): Promise<'changed' | 'unchanged'>;
182
- export declare function executeLocalExit(deps: {
183
- path?: string;
184
- setMode?: (mode: 'local') => Promise<'changed' | 'unchanged'>;
185
- }): Promise<"changed" | "unchanged">;
186
- export {};
@@ -13,7 +13,9 @@ export type OpenCodeEffortMarkerPlan = {
13
13
  messageId: string;
14
14
  };
15
15
  export declare class EffortMarkerCorrelationError extends Error {
16
- constructor(message: string);
16
+ readonly check: string;
17
+ readonly details: Record<string, unknown>;
18
+ constructor(message: string, check?: string, details?: Record<string, unknown>);
17
19
  }
18
20
  type OpenCodeMessageInfo = {
19
21
  id?: unknown;
@@ -49,6 +51,8 @@ export declare function applyOpenCodeEffortMarkers(body: Record<string, unknown>
49
51
  };
50
52
  export declare class OpenCodeEffortPlanTracker {
51
53
  private readonly plans;
54
+ private readonly history;
55
+ private readonly historyByMessage;
52
56
  record(plan: OpenCodeEffortMarkerPlan): void;
53
57
  clear(sessionId: string, messageId: string): void;
54
58
  markHeaders(input: {
@@ -57,6 +61,7 @@ export declare class OpenCodeEffortPlanTracker {
57
61
  headers: Record<string, string>;
58
62
  }): boolean;
59
63
  resolveHeader(value: string | undefined): OpenCodeEffortMarkerPlan | undefined;
64
+ private remember;
60
65
  private key;
61
66
  }
62
67
  export {};
@@ -1,2 +1,2 @@
1
- import{kh as O}from"./index-a5d6v3ba.js";import{randomUUID as H}from"node:crypto";import{mkdir as g,readFile as F,rename as T,rm as z,rmdir as w,stat as P,unlink as y,writeFile as I}from"node:fs/promises";import{tmpdir as m}from"node:os";import{dirname as d,join as L}from"node:path";var v="OPENCODE_ANTHROPIC_AUTH_SIDEBAR_STATE_FILE",c=L(m(),"opencode-anthropic-auth"),u=L(c,"sidebar-state.json");function E(){return process.env[v]||u}var C={main:{quota:null},fallbacks:[],activeId:void 0,route:"main",relay:null,fastMode:!1,lastUpdated:0};function K(J){return J!==null&&typeof J==="object"&&!Array.isArray(J)}function W(J){return typeof J==="number"&&Number.isFinite(J)}function n(J){if(!K(J))return;let Z=Number(J.count),V=Number(J.inputTokens),x=Number(J.outputTokens),Y=Number(J.since);if(![Z,V,x,Y].every(Number.isFinite)||Z<0||V<0||x<0||Y<0)return;return{count:Math.floor(Z),inputTokens:Math.floor(V),outputTokens:Math.floor(x),since:Math.floor(Y)}}function i(J){if(!K(J))return;if(typeof J.id!=="string"||!J.id.trim())return;if(typeof J.label!=="string"||!J.label.trim())return;let Z={id:J.id.trim(),label:J.label.trim()};if(J.nextDueAt===null)Z.nextDueAt=null;else if(W(J.nextDueAt))Z.nextDueAt=J.nextDueAt;if(J.lastPrimedAt===null)Z.lastPrimedAt=null;else if(W(J.lastPrimedAt))Z.lastPrimedAt=J.lastPrimedAt;if(J.lastResult==="ok"||J.lastResult==="error"||J.lastResult==="skipped")Z.lastResult=J.lastResult;let V=n(J.usage);if(V)Z.usage=V;if(W(J.estimatedCostUsd))Z.estimatedCostUsd=J.estimatedCostUsd;return Z}function s(J){if(!K(J))return;if(typeof J.enabled!=="boolean")return;let Z=Array.isArray(J.accounts)?J.accounts.map(i).filter((V)=>V!=null):[];return{enabled:J.enabled,accounts:Z}}function h(J){if(!K(J))return;let Z=Number(J.usedPercent),V=Number(J.remainingPercent);if(!Number.isFinite(Z)||!Number.isFinite(V))return;return{usedPercent:Z,remainingPercent:V,resetsAt:typeof J.resetsAt==="string"?J.resetsAt:void 0}}function A(J){if(!K(J))return null;let Z={},V=h(J.five_hour),x=h(J.seven_day);if(V)Z.five_hour=V;if(x)Z.seven_day=x;if(Array.isArray(J.scoped)){let Y=J.scoped.map((X)=>{if(!K(X))return;let $=h(X);if(!$)return;if(typeof X.id!=="string"||!X.id.trim())return;if(typeof X.title!=="string"||!X.title.trim())return;if(typeof X.modelName!=="string"||!X.modelName.trim())return;let j=typeof X.modelId==="string"&&X.modelId.trim()?X.modelId.trim():void 0;return{...$,id:X.id.trim(),title:X.title.trim(),...j&&{modelId:j},modelName:X.modelName.trim()}}).filter((X)=>X!=null);Z.scoped=Y}if(K(J.extraUsage)){let Y=R(J.extraUsage.used),X=R(J.extraUsage.limit);if(Y&&X&&typeof J.extraUsage.exhausted==="boolean")Z.extraUsage={used:Y,limit:X,...typeof J.extraUsage.utilizationPercent==="number"&&Number.isFinite(J.extraUsage.utilizationPercent)&&{utilizationPercent:J.extraUsage.utilizationPercent},...typeof J.extraUsage.severity==="string"&&{severity:J.extraUsage.severity},exhausted:J.extraUsage.exhausted}}if(typeof J.bindingWindow==="string"&&J.bindingWindow.trim())Z.bindingWindow=J.bindingWindow.trim();if(typeof J.fallbackAdvised==="boolean")Z.fallbackAdvised=J.fallbackAdvised;return Object.keys(Z).length?Z:null}function R(J){if(!K(J))return;if(!Number.isInteger(J.amountMinor)||typeof J.currency!=="string"||!/^[A-Za-z]{3}$/.test(J.currency.trim())||!Number.isInteger(J.exponent)||J.exponent<0||J.exponent>20)return;return{amountMinor:J.amountMinor,currency:J.currency.trim(),exponent:J.exponent}}function p(J){if(!K(J))return{...C};let Z={quota:null};if(K(J.main)){let $=J.main;if(Z.quota=A($.quota),typeof $.tierLabel==="string"&&$.tierLabel.trim())Z.tierLabel=$.tierLabel.trim();if(typeof $.quotaBackedOff==="boolean")Z.quotaBackedOff=$.quotaBackedOff;if(typeof $.quotaBackoffUntil==="number")Z.quotaBackoffUntil=$.quotaBackoffUntil;if(typeof $.refreshBackedOff==="boolean")Z.refreshBackedOff=$.refreshBackedOff;if(typeof $.refreshBackoffUntil==="number")Z.refreshBackoffUntil=$.refreshBackoffUntil}let V=Array.isArray(J.fallbacks)?J.fallbacks.filter(K).filter(($)=>typeof $.id==="string").map(($)=>({id:$.id,label:typeof $.label==="string"?$.label:void 0,quota:A($.quota),enabled:typeof $.enabled==="boolean"?$.enabled:!1,needsReauth:typeof $.needsReauth==="boolean"?$.needsReauth:!1,...$.vaultReauth===!0&&{vaultReauth:!0},...$.vaultServed===!0&&{vaultServed:!0},...typeof $.custodyState==="string"&&{custodyState:$.custodyState},tierLabel:typeof $.tierLabel==="string"&&$.tierLabel.trim()?$.tierLabel.trim():void 0})):[],x=null;if(K(J.relay)){let $=J.relay;if(typeof $.enabled==="boolean"&&typeof $.transport==="string")x={enabled:$.enabled,transport:$.transport}}let Y;if(K(J.cacheKeep)){let $=J.cacheKeep;if(typeof $.enabled==="boolean")Y={enabled:$.enabled,window:typeof $.window==="string"?$.window:void 0,trackedSessions:typeof $.trackedSessions==="number"?$.trackedSessions:void 0}}let X=Array.isArray(J.fableRecoveries)?J.fableRecoveries.filter(K).flatMap(($)=>{if(typeof $.sessionId!=="string"||$.mode!=="opus"&&$.mode!=="fable"&&$.mode!=="server"||typeof $.remaining!=="number"||!Number.isFinite($.remaining)||typeof $.changedAt!=="number"||!Number.isFinite($.changedAt))return[];return[{sessionId:$.sessionId,mode:$.mode,remaining:Math.max(0,Math.floor($.remaining)),changedAt:$.changedAt,requestedModelId:typeof $.requestedModelId==="string"?$.requestedModelId:void 0,targetModelId:typeof $.targetModelId==="string"?$.targetModelId:void 0}]}):[];return{main:Z,fallbacks:V,activeId:typeof J.activeId==="string"?J.activeId:void 0,route:typeof J.route==="string"?J.route:C.route,relay:x,fastMode:typeof J.fastMode==="boolean"?J.fastMode:C.fastMode,cacheKeep:Y,prime:s(J.prime),fableRecoveries:X.length>0?X:void 0,lastUpdated:typeof J.lastUpdated==="number"?J.lastUpdated:0}}var q=Promise.resolve(),l=1000,o=2000,r=5,a=15,U=new Map;function QJ(J,Z=E()){if(J)U.set(Z,J);else U.delete(Z)}function M(J){return U.get(J)}var S=null;function BJ(J){S=J}function OJ(){return S}function t(J){return new Promise((Z)=>setTimeout(Z,J))}async function k(J){let Z=`${J}.lock`,V=M(J),x=V?.lockBudgetMs??l,Y=V?.lockRetryMinMs??r,X=V?.lockRetryMaxMs??a,$=Date.now()+x;while(!0){try{await g(Z);let G=H(),Q=L(Z,G);return await I(Q,"",{encoding:"utf8",mode:384,flag:"wx"}),await V?.onLockAcquired?.(Z),{ownsLock:async()=>{try{return await P(Q),!0}catch{return!1}},release:async()=>{try{await y(Q)}catch{return}await V?.beforeReleaseDirectoryRemoval?.(Z),await w(Z).catch(()=>{})}}}catch(G){if(G.code!=="EEXIST")return O.trace("sidebar","state lock unavailable; write skipped",{stateFile:J,error:G instanceof Error?G.message:String(G)}),null}try{let G=await P(Z);if(Date.now()-G.mtimeMs>o){await V?.afterStaleLockStat?.(Z);let Q=`${Z}.evict-${process.pid}-${H()}`;try{await T(Z,Q)}catch(N){if(N.code==="ENOENT")continue;throw N}await V?.onStaleLockClaimed?.(Z),await z(Q,{recursive:!0,force:!0}).catch(()=>{});continue}}catch(G){if(G.code==="ENOENT")continue;return O.trace("sidebar","state lock inspection failed; write skipped",{stateFile:J,error:G instanceof Error?G.message:String(G)}),null}let j=$-Date.now();if(j<=0)return O.warn("sidebar","lock budget exhausted, write skipped",{stateFile:J,budgetMs:x}),null;let B=Y+Math.floor(Math.random()*(X-Y+1));await t(Math.min(B,j))}}async function NJ(J){return(await k(J))?.release??null}async function e(J,Z,V){let x=M(J),Y=`${J}.${process.pid}.${H()}.tmp`;await I(Y,JSON.stringify(Z),{encoding:"utf8",mode:384});try{if(!await V())return O.trace("sidebar","state lock lost before rename; write aborted",{stateFile:J}),await z(Y,{force:!0}).catch(()=>{}),"lock-lost-before-rename";if(await x?.beforeRename?.(J,Y),!await V())return O.trace("sidebar","state lock lost before rename; write aborted",{stateFile:J}),await z(Y,{force:!0}).catch(()=>{}),"lock-lost-before-rename";if(await T(Y,J),await x?.afterRename?.(J),!await V())return"lock-lost-after-rename";return"written"}catch(X){throw await z(Y,{force:!0}).catch(()=>{}),X}}async function b(J=E()){try{let Z=await F(J,"utf8");return p(JSON.parse(Z))}catch{return C}}async function zJ(J,Z=E(),V={}){return q=q.then(async()=>{await g(d(Z),{recursive:!0});for(let x=0;x<2;x++){let Y=x===1,X=await k(Z);if(!X){if(Y)O.warn("sidebar","post-rename repair lock unavailable; write skipped",{stateFile:Z});return}let $=J,j;try{if(V.routingAuthoritative===!1){let B=await b(Z),G=await V.resolvePreservedRouting?.(B);if(G){let Q=G.state??J;$={...Q,activeId:G.activeId,route:G.route,lastUpdated:Math.max(Q.lastUpdated,B.lastUpdated)}}await M(Z)?.afterMergeRead?.(Z)}else if(Y){let B=await b(Z);$={...B,activeId:J.activeId,route:J.route,relay:J.relay,fastMode:J.fastMode,cacheKeep:J.cacheKeep,lastUpdated:Math.max(B.lastUpdated,J.lastUpdated)}}$=p($),j=await e(Z,$,X.ownsLock)}finally{await X.release()}if(j==="lock-lost-after-rename"){if(Y){O.warn("sidebar","post-rename repair lost lock; write skipped",{stateFile:Z});return}O.warn("sidebar","state lock lost after rename; repairing write",{stateFile:Z});continue}if(j==="lock-lost-before-rename")return;V.onRoutingResolved?.({activeId:$.activeId,route:$.route});return}}).catch(()=>{}),q}async function CJ(){return q}function qJ(J){let Z=J.activeId;if(Z&&Z!=="main"){let V=J.fallbacks?.find((x)=>x.enabled&&x.id===Z);if(V)return{id:V.id,name:V.label??V.id,quota:V.quota}}return{id:"main",name:"main",quota:J.main?.quota??null}}function JJ(J){let Z=J.replace(/\s+only$/i,"").trim();return/^fable$/i.test(Z)?"Fa":Z}function f(J){if(J==="claude-mythos-5-1"||J?.startsWith("claude-mythos-5-1-"))return"Mythos 5.1";if(J==="claude-fable-5-1"||J?.startsWith("claude-fable-5-1-"))return"Fable 5.1";if(J==="claude-fable-5"||J?.startsWith("claude-fable-5-"))return"Fable 5";if(J==="claude-opus-5-5"||J?.startsWith("claude-opus-5-5-"))return"Opus 5.5";if(J==="claude-opus-5"||J?.startsWith("claude-opus-5-"))return"Opus 5";if(J==="claude-opus-4-8"||J?.startsWith("claude-opus-4-8-"))return"Opus 4.8";return J??"Fable 5"}function D(J){return new Date(J).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}function ZJ(J){if(J===0)return"0";if(J<0.0001)return J.toExponential(2);return J.toFixed(Math.min(6,Math.max(0,4)))}function WJ(J){if(J.lastResult==="error")return{text:"err",hasError:!0};if(J.lastResult==="skipped")return{text:"skip",hasError:!1};if(J.nextDueAt&&J.nextDueAt>Date.now())return{text:D(J.nextDueAt),hasError:!1};if(J.lastPrimedAt)return{text:`primed ${D(J.lastPrimedAt)} ✓`,hasError:!1};if(J.usage?.count)return{text:`✓ ${J.usage.count} ≈ $${ZJ(J.estimatedCostUsd??0)}`,hasError:!1};return{text:"—",hasError:!1}}function hJ(J,Z){let V=J.fableRecoveries?.find((x)=>x.sessionId===Z);if(!V)return;if(V.mode==="fable")return`${f(V.requestedModelId)} · restored`;if(V.mode==="server")return`${f(V.requestedModelId)}→${f(V.targetModelId)} · safety`;return`Opus 4.8 · ${V.remaining} left`}function fJ(J){let Z=J?.five_hour?.usedPercent??null,V=J?.seven_day?.usedPercent??null,x=J?.scoped??[],Y=x.map((j)=>j.usedPercent);if(Z==null&&V==null&&x.length===0)return{fiveHourUsedPercent:Z,sevenDayUsedPercent:V,scopedUsedPercents:Y,text:null};let X=x.map((j)=>`${JJ(j.title)}: ${Math.round(j.usedPercent)}%`),$=Z==null&&V==null?[]:[`5h: ${Z==null?"—":`${Math.round(Z)}%`}`,`7d: ${V==null?"—":`${Math.round(V)}%`}`];return{fiveHourUsedPercent:Z,sevenDayUsedPercent:V,scopedUsedPercents:Y,text:[...$,...X].join(" ")}}var HJ=18000000,UJ=604800000,$J=300000,VJ=0.01,XJ=1;function LJ(J,Z,V){if(!J.resetsAt)return null;let x=new Date(J.resetsAt).getTime();if(!Number.isFinite(x))return null;let Y=x-Z,X=V-Y;if(X<$J)return null;if(X<Z*VJ)return null;if(X>=Z)return null;let $=J.usedPercent,j=Math.min(Math.max(X/Z*100,0),100),B=$-j,G=Math.abs(B)<XJ?"on-pace":B>0?"deficit":"reserve",Q=null;if($>0){let N=X*100/$,_=Y+N;if(_<x)Q=new Date(_).toISOString()}return{pacePercent:j,deltaPercent:B,state:G,runsOutAt:Q}}
2
- export{E as h,C as i,p as j,QJ as k,BJ as l,OJ as m,NJ as n,b as o,zJ as p,CJ as q,qJ as r,JJ as s,f as t,D as u,ZJ as v,WJ as w,hJ as x,fJ as y,HJ as z,UJ as A,LJ as B};
1
+ import{zb as O}from"./index-yxtdke11.js";import{randomUUID as H}from"node:crypto";import{mkdir as g,readFile as F,rename as T,rm as z,rmdir as w,stat as P,unlink as y,writeFile as I}from"node:fs/promises";import{tmpdir as m}from"node:os";import{dirname as d,join as L}from"node:path";var v="OPENCODE_ANTHROPIC_AUTH_SIDEBAR_STATE_FILE",c=L(m(),"opencode-anthropic-auth"),u=L(c,"sidebar-state.json");function E(){return process.env[v]||u}var C={main:{quota:null},fallbacks:[],activeId:void 0,route:"main",relay:null,fastMode:!1,lastUpdated:0};function K(J){return J!==null&&typeof J==="object"&&!Array.isArray(J)}function W(J){return typeof J==="number"&&Number.isFinite(J)}function n(J){if(!K(J))return;let Z=Number(J.count),V=Number(J.inputTokens),x=Number(J.outputTokens),Y=Number(J.since);if(![Z,V,x,Y].every(Number.isFinite)||Z<0||V<0||x<0||Y<0)return;return{count:Math.floor(Z),inputTokens:Math.floor(V),outputTokens:Math.floor(x),since:Math.floor(Y)}}function i(J){if(!K(J))return;if(typeof J.id!=="string"||!J.id.trim())return;if(typeof J.label!=="string"||!J.label.trim())return;let Z={id:J.id.trim(),label:J.label.trim()};if(J.nextDueAt===null)Z.nextDueAt=null;else if(W(J.nextDueAt))Z.nextDueAt=J.nextDueAt;if(J.lastPrimedAt===null)Z.lastPrimedAt=null;else if(W(J.lastPrimedAt))Z.lastPrimedAt=J.lastPrimedAt;if(J.lastResult==="ok"||J.lastResult==="error"||J.lastResult==="skipped")Z.lastResult=J.lastResult;let V=n(J.usage);if(V)Z.usage=V;if(W(J.estimatedCostUsd))Z.estimatedCostUsd=J.estimatedCostUsd;return Z}function s(J){if(!K(J))return;if(typeof J.enabled!=="boolean")return;let Z=Array.isArray(J.accounts)?J.accounts.map(i).filter((V)=>V!=null):[];return{enabled:J.enabled,accounts:Z}}function h(J){if(!K(J))return;let Z=Number(J.usedPercent),V=Number(J.remainingPercent);if(!Number.isFinite(Z)||!Number.isFinite(V))return;return{usedPercent:Z,remainingPercent:V,resetsAt:typeof J.resetsAt==="string"?J.resetsAt:void 0}}function A(J){if(!K(J))return null;let Z={},V=h(J.five_hour),x=h(J.seven_day);if(V)Z.five_hour=V;if(x)Z.seven_day=x;if(Array.isArray(J.scoped)){let Y=J.scoped.map((X)=>{if(!K(X))return;let $=h(X);if(!$)return;if(typeof X.id!=="string"||!X.id.trim())return;if(typeof X.title!=="string"||!X.title.trim())return;if(typeof X.modelName!=="string"||!X.modelName.trim())return;let j=typeof X.modelId==="string"&&X.modelId.trim()?X.modelId.trim():void 0;return{...$,id:X.id.trim(),title:X.title.trim(),...j&&{modelId:j},modelName:X.modelName.trim()}}).filter((X)=>X!=null);Z.scoped=Y}if(K(J.extraUsage)){let Y=R(J.extraUsage.used),X=R(J.extraUsage.limit);if(Y&&X&&typeof J.extraUsage.exhausted==="boolean")Z.extraUsage={used:Y,limit:X,...typeof J.extraUsage.utilizationPercent==="number"&&Number.isFinite(J.extraUsage.utilizationPercent)&&{utilizationPercent:J.extraUsage.utilizationPercent},...typeof J.extraUsage.severity==="string"&&{severity:J.extraUsage.severity},exhausted:J.extraUsage.exhausted}}if(typeof J.bindingWindow==="string"&&J.bindingWindow.trim())Z.bindingWindow=J.bindingWindow.trim();if(typeof J.fallbackAdvised==="boolean")Z.fallbackAdvised=J.fallbackAdvised;return Object.keys(Z).length?Z:null}function R(J){if(!K(J))return;if(!Number.isInteger(J.amountMinor)||typeof J.currency!=="string"||!/^[A-Za-z]{3}$/.test(J.currency.trim())||!Number.isInteger(J.exponent)||J.exponent<0||J.exponent>20)return;return{amountMinor:J.amountMinor,currency:J.currency.trim(),exponent:J.exponent}}function p(J){if(!K(J))return{...C};let Z={quota:null};if(K(J.main)){let $=J.main;if(Z.quota=A($.quota),typeof $.tierLabel==="string"&&$.tierLabel.trim())Z.tierLabel=$.tierLabel.trim();if(typeof $.quotaBackedOff==="boolean")Z.quotaBackedOff=$.quotaBackedOff;if(typeof $.quotaBackoffUntil==="number")Z.quotaBackoffUntil=$.quotaBackoffUntil;if(typeof $.refreshBackedOff==="boolean")Z.refreshBackedOff=$.refreshBackedOff;if(typeof $.refreshBackoffUntil==="number")Z.refreshBackoffUntil=$.refreshBackoffUntil}let V=Array.isArray(J.fallbacks)?J.fallbacks.filter(K).filter(($)=>typeof $.id==="string").map(($)=>({id:$.id,label:typeof $.label==="string"?$.label:void 0,quota:A($.quota),enabled:typeof $.enabled==="boolean"?$.enabled:!1,needsReauth:typeof $.needsReauth==="boolean"?$.needsReauth:!1,...$.vaultReauth===!0&&{vaultReauth:!0},...$.vaultServed===!0&&{vaultServed:!0},...typeof $.custodyState==="string"&&{custodyState:$.custodyState},tierLabel:typeof $.tierLabel==="string"&&$.tierLabel.trim()?$.tierLabel.trim():void 0})):[],x=null;if(K(J.relay)){let $=J.relay;if(typeof $.enabled==="boolean"&&typeof $.transport==="string")x={enabled:$.enabled,transport:$.transport}}let Y;if(K(J.cacheKeep)){let $=J.cacheKeep;if(typeof $.enabled==="boolean")Y={enabled:$.enabled,window:typeof $.window==="string"?$.window:void 0,trackedSessions:typeof $.trackedSessions==="number"?$.trackedSessions:void 0}}let X=Array.isArray(J.fableRecoveries)?J.fableRecoveries.filter(K).flatMap(($)=>{if(typeof $.sessionId!=="string"||$.mode!=="opus"&&$.mode!=="fable"&&$.mode!=="server"||typeof $.remaining!=="number"||!Number.isFinite($.remaining)||typeof $.changedAt!=="number"||!Number.isFinite($.changedAt))return[];return[{sessionId:$.sessionId,mode:$.mode,remaining:Math.max(0,Math.floor($.remaining)),changedAt:$.changedAt,requestedModelId:typeof $.requestedModelId==="string"?$.requestedModelId:void 0,targetModelId:typeof $.targetModelId==="string"?$.targetModelId:void 0}]}):[];return{main:Z,fallbacks:V,activeId:typeof J.activeId==="string"?J.activeId:void 0,route:typeof J.route==="string"?J.route:C.route,relay:x,fastMode:typeof J.fastMode==="boolean"?J.fastMode:C.fastMode,cacheKeep:Y,prime:s(J.prime),fableRecoveries:X.length>0?X:void 0,lastUpdated:typeof J.lastUpdated==="number"?J.lastUpdated:0}}var q=Promise.resolve(),l=1000,o=2000,r=5,a=15,U=new Map;function QJ(J,Z=E()){if(J)U.set(Z,J);else U.delete(Z)}function M(J){return U.get(J)}var S=null;function BJ(J){S=J}function OJ(){return S}function t(J){return new Promise((Z)=>setTimeout(Z,J))}async function k(J){let Z=`${J}.lock`,V=M(J),x=V?.lockBudgetMs??l,Y=V?.lockRetryMinMs??r,X=V?.lockRetryMaxMs??a,$=Date.now()+x;while(!0){try{await g(Z);let G=H(),Q=L(Z,G);return await I(Q,"",{encoding:"utf8",mode:384,flag:"wx"}),await V?.onLockAcquired?.(Z),{ownsLock:async()=>{try{return await P(Q),!0}catch{return!1}},release:async()=>{try{await y(Q)}catch{return}await V?.beforeReleaseDirectoryRemoval?.(Z),await w(Z).catch(()=>{})}}}catch(G){if(G.code!=="EEXIST")return O.trace("sidebar","state lock unavailable; write skipped",{stateFile:J,error:G instanceof Error?G.message:String(G)}),null}try{let G=await P(Z);if(Date.now()-G.mtimeMs>o){await V?.afterStaleLockStat?.(Z);let Q=`${Z}.evict-${process.pid}-${H()}`;try{await T(Z,Q)}catch(N){if(N.code==="ENOENT")continue;throw N}await V?.onStaleLockClaimed?.(Z),await z(Q,{recursive:!0,force:!0}).catch(()=>{});continue}}catch(G){if(G.code==="ENOENT")continue;return O.trace("sidebar","state lock inspection failed; write skipped",{stateFile:J,error:G instanceof Error?G.message:String(G)}),null}let j=$-Date.now();if(j<=0)return O.warn("sidebar","lock budget exhausted, write skipped",{stateFile:J,budgetMs:x}),null;let B=Y+Math.floor(Math.random()*(X-Y+1));await t(Math.min(B,j))}}async function NJ(J){return(await k(J))?.release??null}async function e(J,Z,V){let x=M(J),Y=`${J}.${process.pid}.${H()}.tmp`;await I(Y,JSON.stringify(Z),{encoding:"utf8",mode:384});try{if(!await V())return O.trace("sidebar","state lock lost before rename; write aborted",{stateFile:J}),await z(Y,{force:!0}).catch(()=>{}),"lock-lost-before-rename";if(await x?.beforeRename?.(J,Y),!await V())return O.trace("sidebar","state lock lost before rename; write aborted",{stateFile:J}),await z(Y,{force:!0}).catch(()=>{}),"lock-lost-before-rename";if(await T(Y,J),await x?.afterRename?.(J),!await V())return"lock-lost-after-rename";return"written"}catch(X){throw await z(Y,{force:!0}).catch(()=>{}),X}}async function b(J=E()){try{let Z=await F(J,"utf8");return p(JSON.parse(Z))}catch{return C}}async function zJ(J,Z=E(),V={}){return q=q.then(async()=>{await g(d(Z),{recursive:!0});for(let x=0;x<2;x++){let Y=x===1,X=await k(Z);if(!X){if(Y)O.warn("sidebar","post-rename repair lock unavailable; write skipped",{stateFile:Z});return}let $=J,j;try{if(V.routingAuthoritative===!1){let B=await b(Z),G=await V.resolvePreservedRouting?.(B);if(G){let Q=G.state??J;$={...Q,activeId:G.activeId,route:G.route,lastUpdated:Math.max(Q.lastUpdated,B.lastUpdated)}}await M(Z)?.afterMergeRead?.(Z)}else if(Y){let B=await b(Z);$={...B,activeId:J.activeId,route:J.route,relay:J.relay,fastMode:J.fastMode,cacheKeep:J.cacheKeep,lastUpdated:Math.max(B.lastUpdated,J.lastUpdated)}}$=p($),j=await e(Z,$,X.ownsLock)}finally{await X.release()}if(j==="lock-lost-after-rename"){if(Y){O.warn("sidebar","post-rename repair lost lock; write skipped",{stateFile:Z});return}O.warn("sidebar","state lock lost after rename; repairing write",{stateFile:Z});continue}if(j==="lock-lost-before-rename")return;V.onRoutingResolved?.({activeId:$.activeId,route:$.route});return}}).catch(()=>{}),q}async function CJ(){return q}function qJ(J){let Z=J.activeId;if(Z&&Z!=="main"){let V=J.fallbacks?.find((x)=>x.enabled&&x.id===Z);if(V)return{id:V.id,name:V.label??V.id,quota:V.quota}}return{id:"main",name:"main",quota:J.main?.quota??null}}function JJ(J){let Z=J.replace(/\s+only$/i,"").trim();return/^fable$/i.test(Z)?"Fa":Z}function f(J){if(J==="claude-mythos-5-1"||J?.startsWith("claude-mythos-5-1-"))return"Mythos 5.1";if(J==="claude-fable-5-1"||J?.startsWith("claude-fable-5-1-"))return"Fable 5.1";if(J==="claude-fable-5"||J?.startsWith("claude-fable-5-"))return"Fable 5";if(J==="claude-opus-5-5"||J?.startsWith("claude-opus-5-5-"))return"Opus 5.5";if(J==="claude-opus-5"||J?.startsWith("claude-opus-5-"))return"Opus 5";if(J==="claude-opus-4-8"||J?.startsWith("claude-opus-4-8-"))return"Opus 4.8";return J??"Fable 5"}function D(J){return new Date(J).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}function ZJ(J){if(J===0)return"0";if(J<0.0001)return J.toExponential(2);return J.toFixed(Math.min(6,Math.max(0,4)))}function WJ(J){if(J.lastResult==="error")return{text:"err",hasError:!0};if(J.lastResult==="skipped")return{text:"skip",hasError:!1};if(J.nextDueAt&&J.nextDueAt>Date.now())return{text:D(J.nextDueAt),hasError:!1};if(J.lastPrimedAt)return{text:`primed ${D(J.lastPrimedAt)} ✓`,hasError:!1};if(J.usage?.count)return{text:`✓ ${J.usage.count} ≈ $${ZJ(J.estimatedCostUsd??0)}`,hasError:!1};return{text:"—",hasError:!1}}function hJ(J,Z){let V=J.fableRecoveries?.find((x)=>x.sessionId===Z);if(!V)return;if(V.mode==="fable")return`${f(V.requestedModelId)} · restored`;if(V.mode==="server")return`${f(V.requestedModelId)}→${f(V.targetModelId)} · safety`;return`Opus 4.8 · ${V.remaining} left`}function fJ(J){let Z=J?.five_hour?.usedPercent??null,V=J?.seven_day?.usedPercent??null,x=J?.scoped??[],Y=x.map((j)=>j.usedPercent);if(Z==null&&V==null&&x.length===0)return{fiveHourUsedPercent:Z,sevenDayUsedPercent:V,scopedUsedPercents:Y,text:null};let X=x.map((j)=>`${JJ(j.title)}: ${Math.round(j.usedPercent)}%`),$=Z==null&&V==null?[]:[`5h: ${Z==null?"—":`${Math.round(Z)}%`}`,`7d: ${V==null?"—":`${Math.round(V)}%`}`];return{fiveHourUsedPercent:Z,sevenDayUsedPercent:V,scopedUsedPercents:Y,text:[...$,...X].join(" ")}}var HJ=18000000,UJ=604800000,$J=300000,VJ=0.01,XJ=1;function LJ(J,Z,V){if(!J.resetsAt)return null;let x=new Date(J.resetsAt).getTime();if(!Number.isFinite(x))return null;let Y=x-Z,X=V-Y;if(X<$J)return null;if(X<Z*VJ)return null;if(X>=Z)return null;let $=J.usedPercent,j=Math.min(Math.max(X/Z*100,0),100),B=$-j,G=Math.abs(B)<XJ?"on-pace":B>0?"deficit":"reserve",Q=null;if($>0){let N=X*100/$,_=Y+N;if(_<x)Q=new Date(_).toISOString()}return{pacePercent:j,deltaPercent:B,state:G,runsOutAt:Q}}
2
+ export{E as F,C as G,p as H,QJ as I,BJ as J,OJ as K,NJ as L,b as M,zJ as N,CJ as O,qJ as P,JJ as Q,f as R,D as S,ZJ as T,WJ as U,hJ as V,fJ as W,HJ as X,UJ as Y,LJ as Z};
@@ -0,0 +1,2 @@
1
+ var z=(f)=>f!==null&&typeof f==="object"&&!Array.isArray(f),G=(f)=>z(f)&&typeof f.sessionId==="string"&&f.sessionId.length>0,Z=(f)=>{if(!G(f)||!z(f)||f.command!=="claude"||typeof f.sectionId!=="string"||typeof f.actionId!=="string")return!1;if(f.itemId!==void 0&&typeof f.itemId!=="string")return!1;if(f.confirmed!==void 0&&typeof f.confirmed!=="boolean")return!1;if(f.values!==void 0&&(!z(f.values)||!Object.values(f.values).every((q)=>q===null||typeof q==="string"||typeof q==="boolean"||typeof q==="number"&&Number.isFinite(q))))return!1;return!0};function B(f){return{"~standard":{version:1,vendor:"cortexkit-native",validate:(q)=>f(q)?{value:q}:{issues:[{message:"Invalid native menu payload"}]}}}}var W=(f)=>z(f)&&f.command==="claude"&&z(f.menu)&&f.menu.command==="claude"&&typeof f.menu.title==="string"&&Array.isArray(f.menu.sections),$=(f)=>z(f)&&f.command==="claude"&&typeof f.ok==="boolean"&&typeof f.text==="string"&&z(f.menu)&&Array.isArray(f.menu.sections),A={id:"cortexkit-anthropic-native",methods:{open:{input:B(G),output:B(W)},apply:{input:B(Z),output:B($)}},events:{opened:{schema:B((f)=>G(f)&&W(f.payload))},notification:{schema:B((f)=>G(f)&&typeof f.message==="string"&&["info","warning","error"].includes(String(f.kind)))}}};async function L(f,q,X){let K=new AbortController,H=(j)=>({sessionId:j,notify(F,J="info"){D.events.emit("notification",{sessionId:j,message:F,kind:J}).catch(()=>{})}}),D=await f.rpc.register(A,{open:(j)=>q.open(H(j.sessionId)),apply:(j)=>q.apply(j,H(j.sessionId))}),Q;try{Q=await f.command.transform((j)=>j.add({name:"claude",description:"Native Claude accounts and settings",async execute(F){let J=await q.open(H(F.sessionID));await D.events.emit("opened",{sessionId:F.sessionID,payload:J})}}))}catch(j){throw await D.dispose(),j}let Y=(async()=>{try{for await(let j of f.event.subscribe({signal:K.signal}))if(j.type==="session.deleted")X.forgetSession(j.data.sessionID)}catch{}})(),S=!1;return{async dispose(){if(S)return;S=!0,K.abort(),await Promise.all([D.dispose(),Q.dispose(),Y])}}}
2
+ export{A as s,L as t};
@@ -1,2 +1,2 @@
1
1
  var t=["claude-account","claude-cache","claude-cachekeep","claude-prime","claude-start","claude-quota","claude-dump","claude-fast","claude-routing","claude-killswitch","claude-logging"];
2
- export{t as qh};
2
+ export{t as p};
@@ -0,0 +1,2 @@
1
+ import{createRequire as q}from"node:module";var j=Object.create;var{getPrototypeOf:k,defineProperty:i,getOwnPropertyNames:l}=Object;var m=Object.prototype.hasOwnProperty;function n(a){return this[a]}var o,p,r=(a,b,d)=>{var f=a!=null&&typeof a==="object";if(f){var g=b?o??=new WeakMap:p??=new WeakMap,h=g.get(a);if(h)return h}d=a!=null?j(k(a)):{};let c=b||!a||!a.__esModule?i(d,"default",{value:a,enumerable:!0}):d;for(let e of l(a))if(!m.call(c,e))i(c,e,{get:n.bind(a,e),enumerable:!0});if(f)g.set(a,c);return c};var s=(a,b)=>()=>(b||a((b={exports:{}}).exports,b),b.exports);var u=q(import.meta.url);
2
+ export{r as Se,s as Te,u as Ue};
@@ -1,2 +1,2 @@
1
1
  import{mkdir as l,readdir as u,readFile as c,rename as p,unlink as m,writeFile as d}from"node:fs/promises";import{join as a}from"node:path";function f(t){try{return process.kill(t,0),!0}catch(r){return r.code==="EPERM"}}async function b(t,r){await l(t,{recursive:!0});let s={...r,startedAt:Date.now()},e=a(t,`port-${r.pid}.json`),i=`${e}.${process.pid}.tmp`;return await d(i,JSON.stringify(s),{encoding:"utf8",mode:384}),await p(i,e),e}async function h(t,r){let s;try{s=await u(t)}catch{return null}let e=[];for(let n of s){if(!n.startsWith("port-")||!n.endsWith(".json"))continue;try{let o=JSON.parse(await c(a(t,n),"utf8"));if(Number.isFinite(o.port))if(f(o.pid))e.push(o);else m(a(t,n)).catch(()=>{})}catch{}}if(e.length===0)return null;let i=r&&r>=1?e.filter((n)=>n.pid===r):[];return(i.length>0?i:e).sort((n,o)=>o.startedAt-n.startedAt)[0]??null}
2
- export{b as oh,h as ph};
2
+ export{b as Qe,h as Re};
@@ -0,0 +1,2 @@
1
+ import{existsSync as F,readFileSync as I}from"node:fs";import{homedir as J}from"node:os";import{dirname as X,join as B,resolve as V}from"node:path";import{fileURLToPath as Y}from"node:url";var Z="@cortexkit/opencode-anthropic-auth",L="@cortexkit/pi-anthropic-auth";function $(q=process.env,z=process.platform){return(z==="win32"?q.USERPROFILE||q.HOME:q.HOME)||J()}function K(q=process.env,z=process.platform){let w=q.OPENCODE_CONFIG_DIR?.trim();if(w)return V(w);return B(q.XDG_CONFIG_HOME||B($(q,z),".config"),"opencode")}function S(q=process.env){let z=q.XDG_DATA_HOME?.trim();if(z)return B(V(z),"opencode");return B(J(),".local","share","opencode")}function M(q=process.env){return B(S(q),"auth.json")}function R(q=process.env,z=process.platform){let w=q.PI_CODING_AGENT_DIR?.trim()||q.PI_AGENT_DIR?.trim();if(w)return V(w);return B($(q,z),".pi","agent")}function k(q=process.env){let w=q.PI_CODING_AGENT_DIR||B(J(),".pi","agent");if(w==="~")w=J();else if(w.startsWith("~/")||process.platform==="win32"&&w.startsWith("~\\"))w=B(J(),w.slice(2));if(w.startsWith("file://"))w=Y(w);return B(w,"auth.json")}function x(q){return`${Z}@${q}`}function y(q){return`${Z}@${q}`}function H(q){return`npm:${L}@${q}`}async function N(){let q=X(Y(import.meta.url));for(let z=0;z<5;z++){let w=B(q,"package.json");if(F(w))try{let Q=JSON.parse(I(w,"utf8"));if(typeof Q.version==="string"&&Q.version.trim())return Q.version.trim()}catch{}let W=X(q);if(W===q)break;q=W}return"1.22.0"}
2
+ export{Z as u,L as v,$ as w,K as x,M as y,R as z,k as A,x as B,y as C,H as D,N as E};
@@ -0,0 +1,3 @@
1
+ import{constants as X}from"node:fs";import{chmod as y,lstat as G,mkdir as v,open as N}from"node:fs/promises";import{createRequire as j}from"node:module";class H extends Error{code="ERR_PRIVATE_FILES_UNAVAILABLE"}function x(_,T){if(_!=="x64"&&_!=="arm64")throw new H(`Windows private files do not support ${_}; use x64 or ARM64 Node 24. No mode-only fallback is safe.`);if(_==="arm64"&&T&&!F(T))throw new H("Windows ARM64 requires Bun >= 1.3.10 with native ARM64 support; use ARM64 Node 24 or upgrade Bun. No mode-only fallback is safe.");return`private-files-win32-${_}.node`}function F(_){let T=/^(\d+)\.(\d+)\.(\d+)$/.exec(_);if(!T)return!1;let L=Number(T[1]),A=Number(T[2]),S=Number(T[3]);return L>1||L===1&&(A>3||A===3&&S>=10)}var z;function M(){if(z)return z;let _=x(process.arch,process.versions.bun);try{if(z=j(import.meta.url)(`../prebuilds/${_}`),!z||["create","read","verify","secure","verifySafeParent"].some((T)=>typeof z?.[T]!=="function"))throw Error("Invalid private-files N-API interface");return z}catch(T){throw new H(`Cannot load ${_}. Install @cortexkit/private-files with the matching Windows N-API v8 prebuild, or rebuild private-files/native with MSVC. Use local NTFS. No mode-only fallback is safe. Cause: ${String(T)}`)}}import*as O from"node:fs";import*as W from"node:fs/promises";import{posix as Q}from"node:path";function*P(_){return yield{kind:"realpath",path:_}}function*J(_,T){return yield{kind:_,path:T}}function*g(_){return yield{kind:"readFile",path:_}}function C(_,T){return{ok:!1,reason:T,path:_}}function $(_){return _?.code==="ENOENT"}function*f(_,T){if(!_||_.includes("\x00"))throw Error("invalid path");let L=T.isAbsolute(_)?_:`${process.cwd()}${T.sep}${_}`,A=[];for(;;)try{let S=yield*P(L);if(A.length&&!(yield*J("stat",S)).isDirectory())throw Error("nearest existing ancestor is not a directory");return{resolved:T.join(S,...A),existing:S,missing:A.length>0}}catch(S){if(!$(S))throw S;try{yield*J("lstat",L)}catch(R){if(!$(R))throw R;let E=T.dirname(L);if(E===L)throw S;A.unshift(T.basename(L)),L=E;continue}throw S}}function b(_,T){let L=new TextDecoder("utf-8",{fatal:!0}).decode(_),A=(S)=>S!==void 0&&/^\d+$/.test(S)&&Number.isSafeInteger(Number(S))&&Number(S)<=4294967295;return L.split(`
2
+ `).filter((S)=>S.trim()!==""&&!S.trimStart().startsWith("#")).map((S)=>{let R=S.split(":");if(R.length!==T||!R[0]||/\s/.test(R[0])||!A(R[2])||T===7&&!A(R[3]))throw Error("malformed account record");if(T===4&&R[3]!==""&&R[3].split(",").some((E)=>!E||/\s/.test(E)))throw Error("malformed group members");return R})}function*k(_,T){let L=[];for(let[D,K]of[["/etc/passwd",7],["/etc/group",4]]){let I;try{I=yield*g(D)}catch{return`could not read ${D} to establish a user-private group`}try{L.push(b(I,K))}catch{return`could not parse ${D} to establish a user-private group`}}let[A,S]=L,R=A.filter((D)=>Number(D[2])===_),E=S.filter((D)=>Number(D[2])===T);if(R.length!==1||E.length!==1)return"group-writable ancestor (effective user or group is absent or ambiguous in account files)";let Y=R[0][0];if(E[0][3]!==""&&E[0][3].split(",").some((D)=>D!==Y))return"group-writable ancestor (other group members)";if(A.some((D)=>Number(D[2])!==_&&Number(D[3])===T))return"group-writable ancestor (another user's primary group)";return}function*m(_,T,L,A=!1){if(T==null)return C(_,"could not determine effective uid");let S;try{let D=yield*f(_,Q);if(A&&(D.missing||!(yield*J("stat",D.existing)).isDirectory()))return C(_,"ancestor is not a directory");S=D.missing||(yield*J("stat",D.existing)).isDirectory()?D.existing:Q.dirname(D.existing)}catch{return C(_,"could not resolve target or its nearest existing ancestor")}let R,E,Y=!1;for(;;){let D;try{D=[yield*J("lstat",S),yield*J("stat",S)]}catch{return C(S,"could not inspect ancestor")}for(let I of D){if(!I.isDirectory())return C(S,"ancestor is not a directory");if(I.uid!==T&&I.uid!==0)return C(S,"foreign owner");if((I.mode&18)===0)continue;if(I.uid===0&&(I.mode&512)!==0){if(R?.every((Z)=>Z.uid===T&&(Z.mode&18)===0))continue;return C(S,"sticky ancestor without an owner-only child")}if((I.mode&2)!==0)return C(S,"world-writable ancestor");if((I.mode&512)!==0||I.uid!==T||L==null||I.gid!==L)return C(S,"group-writable ancestor (not a non-sticky user-private group)");if(!Y)E=yield*k(T,L),Y=!0;if(E)return C(S,E)}let K=Q.dirname(S);if(K===S)return{ok:!0};R=D,S=K}}function q(_,T){return m(_,T.euid===void 0?process.geteuid?.():T.euid,T.egid===void 0?process.getegid?.():T.egid,T.directoryOnly)}function w(_,T={}){let L={realpathSync:O.realpathSync.native,lstatSync:O.lstatSync,statSync:O.statSync,readFileSync:O.readFileSync,...T.fs},A=q(_,T),S=A.next();while(!S.done){let{kind:R,path:E}=S.value,Y;try{switch(R){case"realpath":Y=L.realpathSync(E);break;case"lstat":Y=L.lstatSync(E);break;case"stat":Y=L.statSync(E);break;case"readFile":Y=L.readFileSync(E);break}}catch(D){S=A.throw(D);continue}S=A.next(Y)}return S.value}async function B(_,T={}){let L={realpath:W.realpath,lstat:W.lstat,stat:W.stat,readFile:W.readFile,...T.fs},A=q(_,T),S=A.next();while(!S.done){let{kind:R,path:E}=S.value,Y;try{Y=await L[R](E)}catch(D){S=A.throw(D);continue}S=A.next(Y)}return S.value}function U(_,T){let L=_.aces?.[0];return(_.owner===_.currentUser||_.owner==="S-1-5-32-544"||_.owner==="S-1-5-18")&&_.kind===T&&!_.reparse&&_.daclPresent&&(_.daclProtected&&L?.flags===(T==="directory"?3:0)||T==="file"&&!_.daclProtected&&L?.flags===16&&!!_.parent&&_.parent.currentUser===_.currentUser&&U(_.parent,"directory"))&&_.aces?.length===1&&L?.type===0&&L.mask===2032127&&L.sid===_.currentUser}var n="wrong-owner",r="extra-ace",i="not-protected",a="null-dacl",t="empty-dacl",e="reparse-point",__="unsupported-filesystem",T_="mode",L_="writable-by-others";function V(_,T){if(T.ok)return T;return{ok:!1,reason:/writable|sticky|user-private group/.test(T.reason)?"writable-by-others":T.reason==="foreign owner"?"wrong-owner":T.reason==="ancestor is not a directory"?"wrong-kind":"io-error",path:_,level:T.path}}function Y_(_,T={}){if(process.platform==="win32")return{ok:!1,reason:"unsupported-filesystem",path:_};return V(_,w(_,{...T,directoryOnly:!0}))}async function I_(_,T={}){if(process.platform!=="win32")return V(_,await B(_,{...T,directoryOnly:!0}));try{return await M().verifySafeParent(_),{ok:!0}}catch(L){if(L instanceof H)return{ok:!1,reason:"unsupported-filesystem",path:_};let A=L;if(A.code!=="ERR_PRIVATE_FILES_SECURITY")throw L;return{ok:!1,reason:A.reason??"io-error",path:_,...A.level?{level:A.level}:{},...A.sid||A.ownerSid?{sid:A.sid??A.ownerSid}:{},...A.mask!==void 0?{mask:A.mask}:{}}}}async function c(_,T=""){if(process.platform==="win32")return M().create(_,"file",typeof T==="string"?Buffer.from(T):T);let L=await N(_,"wx",384);try{await L.writeFile(T)}finally{await L.close()}}async function l(_){if(process.platform==="win32")return M().create(_,"directory",Buffer.alloc(0));await v(_,{mode:448})}async function C_(_,T){if(process.platform==="win32")return M().verify(_,T);let L=await G(_);if((T==="file"?!L.isFile():!L.isDirectory())||(L.mode&511)!==(T==="file"?384:448)||L.uid!==process.getuid?.())throw Error(`Private ${T} requires current-user ownership and ${T==="file"?"0600":"0700"}: ${_}`)}async function h(_){if(process.platform==="win32")return M().read(_);let T=await N(_,X.O_RDONLY|X.O_NOFOLLOW|X.O_NONBLOCK);try{let L=await T.stat();if(!L.isFile()||(L.mode&511)!==384||L.uid!==process.getuid?.())throw Error(`Private file requires current-user ownership and 0600: ${_}`);return await T.readFile()}finally{await T.close()}}async function H_(_,T){if(process.platform==="win32")return M().secure(_,T);await y(_,T==="file"?384:448)}async function M_(_,T){if(T.kind==="dir")return l(_);return c(_)}async function O_(_){if(process.platform!=="win32"){let T=await G(_),L=T.isDirectory()?448:384;if(!T.isFile()&&!T.isDirectory())return{ok:!1,refusal:{reason:"wrong-kind",message:"Expected a regular file or directory"}};if(T.uid!==process.getuid?.())return{ok:!1,refusal:{reason:"wrong-owner",ownerSid:`uid:${T.uid}`}};let A=T.mode&511;return A===L?{ok:!0}:{ok:!1,refusal:{reason:"mode",actual:A,expected:L}}}try{return await M().verify(_,"auto"),{ok:!0}}catch(T){if(T instanceof H)return{ok:!1,refusal:{reason:"unsupported-filesystem",message:T.message}};let L=T;if(L.code!=="ERR_PRIVATE_FILES_SECURITY")throw T;if(L.reason==="wrong-owner")return{ok:!1,refusal:{reason:"wrong-owner",ownerSid:L.ownerSid??"unknown"}};if(L.reason==="extra-ace")return{ok:!1,refusal:{reason:"extra-ace",sid:L.sid??"unknown",mask:L.mask??0}};return{ok:!1,refusal:{reason:L.reason&&L.reason!=="mode"?L.reason:"io-error",message:L.message}}}}var W_=h;
3
+ export{H as te,w as ue,B as ve,U as we,n as xe,r as ye,i as ze,a as Ae,t as Be,e as Ce,__ as De,T_ as Ee,L_ as Fe,Y_ as Ge,I_ as He,c as Ie,l as Je,C_ as Ke,h as Le,H_ as Me,M_ as Ne,O_ as Oe,W_ as Pe};
@@ -1 +1 @@
1
- import{createHash as z}from"node:crypto";import{homedir as F,tmpdir as O}from"node:os";import{join as q,resolve as G}from"node:path";var J="OPENCODE_ANTHROPIC_AUTH_RPC_DIR";function T(g){let k=process.env[J]?.trim();if(k)return G(g,k);let w=z("sha256").update(g).digest("hex").slice(0,16),x=process.env.XDG_STATE_HOME||q(F(),".local","state");return q(x,"cortexkit","anthropic-auth","rpc",w)}export{O as rh,T as sh};
1
+ import{createHash as z}from"node:crypto";import{homedir as F,tmpdir as O}from"node:os";import{join as q,resolve as G}from"node:path";var J="OPENCODE_ANTHROPIC_AUTH_RPC_DIR";function T(g){let k=process.env[J]?.trim();if(k)return G(g,k);let w=z("sha256").update(g).digest("hex").slice(0,16),x=process.env.XDG_STATE_HOME||q(F(),".local","state");return q(x,"cortexkit","anthropic-auth","rpc",w)}export{O as q,T as r};