@nervekit/orchestrator 0.1.0 → 0.2.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.
Files changed (271) hide show
  1. package/dist/domains/agents/run/agent-run-session.d.ts.map +1 -1
  2. package/dist/domains/agents/run/agent-run-session.js +25 -2
  3. package/dist/domains/agents/run/agent-run-session.js.map +1 -1
  4. package/dist/domains/agents/run/agent-runner.d.ts +12 -1
  5. package/dist/domains/agents/run/agent-runner.d.ts.map +1 -1
  6. package/dist/domains/agents/run/agent-runner.js +166 -1
  7. package/dist/domains/agents/run/agent-runner.js.map +1 -1
  8. package/dist/domains/agents/run/inline-command-results.d.ts +8 -0
  9. package/dist/domains/agents/run/inline-command-results.d.ts.map +1 -0
  10. package/dist/domains/agents/run/inline-command-results.js +109 -0
  11. package/dist/domains/agents/run/inline-command-results.js.map +1 -0
  12. package/dist/domains/tasks/task-manager-foreground.d.ts.map +1 -1
  13. package/dist/domains/tasks/task-manager-foreground.js +4 -1
  14. package/dist/domains/tasks/task-manager-foreground.js.map +1 -1
  15. package/dist/domains/tasks/task-manager.d.ts +2 -1
  16. package/dist/domains/tasks/task-manager.d.ts.map +1 -1
  17. package/dist/domains/tasks/task-manager.js.map +1 -1
  18. package/dist/domains/tasks/task-supervisor.d.ts.map +1 -1
  19. package/dist/domains/tasks/task-supervisor.js +12 -1
  20. package/dist/domains/tasks/task-supervisor.js.map +1 -1
  21. package/dist/domains/tools/orchestration-tool-dispatcher.d.ts.map +1 -1
  22. package/dist/domains/tools/orchestration-tool-dispatcher.js +2 -1
  23. package/dist/domains/tools/orchestration-tool-dispatcher.js.map +1 -1
  24. package/dist/domains/tools/tool-service.d.ts +2 -0
  25. package/dist/domains/tools/tool-service.d.ts.map +1 -1
  26. package/dist/domains/tools/tool-service.js.map +1 -1
  27. package/dist/registry.d.ts +11 -11
  28. package/dist/runtime/runtime-state.d.ts +2 -2
  29. package/dist/web/assets/{dist-DVpGQCt0.js → dist-BaA_eB0I.js} +1 -1
  30. package/dist/web/assets/{index-DFKLdj_D.css → index-C45Kmr75.css} +1 -1
  31. package/dist/web/assets/index-DHfIkEia.js +167 -0
  32. package/dist/web/index.html +2 -2
  33. package/dist/web/sw.js +1 -1
  34. package/package.json +4 -4
  35. package/dist/agent-process.d.ts +0 -32
  36. package/dist/agent-process.d.ts.map +0 -1
  37. package/dist/agent-process.js +0 -129
  38. package/dist/agent-process.js.map +0 -1
  39. package/dist/agent-runner/agent-runner.d.ts +0 -65
  40. package/dist/agent-runner/agent-runner.d.ts.map +0 -1
  41. package/dist/agent-runner/agent-runner.js +0 -802
  42. package/dist/agent-runner/agent-runner.js.map +0 -1
  43. package/dist/agent-runner/index.d.ts +0 -6
  44. package/dist/agent-runner/index.d.ts.map +0 -1
  45. package/dist/agent-runner/index.js +0 -4
  46. package/dist/agent-runner/index.js.map +0 -1
  47. package/dist/agent-runner/message-mirror.d.ts +0 -44
  48. package/dist/agent-runner/message-mirror.d.ts.map +0 -1
  49. package/dist/agent-runner/message-mirror.js +0 -154
  50. package/dist/agent-runner/message-mirror.js.map +0 -1
  51. package/dist/agent-runner/run-state.d.ts +0 -12
  52. package/dist/agent-runner/run-state.d.ts.map +0 -1
  53. package/dist/agent-runner/run-state.js +0 -2
  54. package/dist/agent-runner/run-state.js.map +0 -1
  55. package/dist/agent-runner/subagent-runner.d.ts +0 -29
  56. package/dist/agent-runner/subagent-runner.d.ts.map +0 -1
  57. package/dist/agent-runner/subagent-runner.js +0 -84
  58. package/dist/agent-runner/subagent-runner.js.map +0 -1
  59. package/dist/agent-runner/system-prompt-builder.d.ts +0 -19
  60. package/dist/agent-runner/system-prompt-builder.d.ts.map +0 -1
  61. package/dist/agent-runner/system-prompt-builder.js +0 -35
  62. package/dist/agent-runner/system-prompt-builder.js.map +0 -1
  63. package/dist/agent-runner/tool-draft-streaming.d.ts +0 -2
  64. package/dist/agent-runner/tool-draft-streaming.d.ts.map +0 -1
  65. package/dist/agent-runner/tool-draft-streaming.js +0 -5
  66. package/dist/agent-runner/tool-draft-streaming.js.map +0 -1
  67. package/dist/agent-suspension-service.d.ts +0 -44
  68. package/dist/agent-suspension-service.d.ts.map +0 -1
  69. package/dist/agent-suspension-service.js +0 -96
  70. package/dist/agent-suspension-service.js.map +0 -1
  71. package/dist/agent-tool-adapter.d.ts +0 -20
  72. package/dist/agent-tool-adapter.d.ts.map +0 -1
  73. package/dist/agent-tool-adapter.js +0 -215
  74. package/dist/agent-tool-adapter.js.map +0 -1
  75. package/dist/agents/agent-authority.d.ts +0 -5
  76. package/dist/agents/agent-authority.d.ts.map +0 -1
  77. package/dist/agents/agent-authority.js +0 -28
  78. package/dist/agents/agent-authority.js.map +0 -1
  79. package/dist/agents/agent-budget.d.ts +0 -3
  80. package/dist/agents/agent-budget.d.ts.map +0 -1
  81. package/dist/agents/agent-budget.js +0 -17
  82. package/dist/agents/agent-budget.js.map +0 -1
  83. package/dist/agents/agent-status.d.ts +0 -4
  84. package/dist/agents/agent-status.d.ts.map +0 -1
  85. package/dist/agents/agent-status.js +0 -10
  86. package/dist/agents/agent-status.js.map +0 -1
  87. package/dist/conversation-operations/compaction-service.d.ts +0 -37
  88. package/dist/conversation-operations/compaction-service.d.ts.map +0 -1
  89. package/dist/conversation-operations/compaction-service.js +0 -102
  90. package/dist/conversation-operations/compaction-service.js.map +0 -1
  91. package/dist/conversation-operations/export-service.d.ts +0 -22
  92. package/dist/conversation-operations/export-service.d.ts.map +0 -1
  93. package/dist/conversation-operations/export-service.js +0 -79
  94. package/dist/conversation-operations/export-service.js.map +0 -1
  95. package/dist/conversation-operations/import-service.d.ts +0 -20
  96. package/dist/conversation-operations/import-service.d.ts.map +0 -1
  97. package/dist/conversation-operations/import-service.js +0 -97
  98. package/dist/conversation-operations/import-service.js.map +0 -1
  99. package/dist/conversation-operations/index.d.ts +0 -8
  100. package/dist/conversation-operations/index.d.ts.map +0 -1
  101. package/dist/conversation-operations/index.js +0 -6
  102. package/dist/conversation-operations/index.js.map +0 -1
  103. package/dist/conversation-operations/navigation-service.d.ts +0 -18
  104. package/dist/conversation-operations/navigation-service.d.ts.map +0 -1
  105. package/dist/conversation-operations/navigation-service.js +0 -102
  106. package/dist/conversation-operations/navigation-service.js.map +0 -1
  107. package/dist/conversation-operations/summary.d.ts +0 -11
  108. package/dist/conversation-operations/summary.d.ts.map +0 -1
  109. package/dist/conversation-operations/summary.js +0 -29
  110. package/dist/conversation-operations/summary.js.map +0 -1
  111. package/dist/conversation-runtime.d.ts +0 -96
  112. package/dist/conversation-runtime.d.ts.map +0 -1
  113. package/dist/conversation-runtime.js +0 -363
  114. package/dist/conversation-runtime.js.map +0 -1
  115. package/dist/conversation-service.d.ts +0 -17
  116. package/dist/conversation-service.d.ts.map +0 -1
  117. package/dist/conversation-service.js +0 -56
  118. package/dist/conversation-service.js.map +0 -1
  119. package/dist/domains/processes/index.d.ts +0 -10
  120. package/dist/domains/processes/index.d.ts.map +0 -1
  121. package/dist/domains/processes/index.js +0 -7
  122. package/dist/domains/processes/index.js.map +0 -1
  123. package/dist/domains/processes/process-launch-config.store.d.ts +0 -21
  124. package/dist/domains/processes/process-launch-config.store.d.ts.map +0 -1
  125. package/dist/domains/processes/process-launch-config.store.js +0 -49
  126. package/dist/domains/processes/process-launch-config.store.js.map +0 -1
  127. package/dist/domains/processes/process-log.service.d.ts +0 -25
  128. package/dist/domains/processes/process-log.service.d.ts.map +0 -1
  129. package/dist/domains/processes/process-log.service.js +0 -155
  130. package/dist/domains/processes/process-log.service.js.map +0 -1
  131. package/dist/domains/processes/process-manager.d.ts +0 -107
  132. package/dist/domains/processes/process-manager.d.ts.map +0 -1
  133. package/dist/domains/processes/process-manager.js +0 -814
  134. package/dist/domains/processes/process-manager.js.map +0 -1
  135. package/dist/domains/processes/process-readiness.service.d.ts +0 -7
  136. package/dist/domains/processes/process-readiness.service.d.ts.map +0 -1
  137. package/dist/domains/processes/process-readiness.service.js +0 -26
  138. package/dist/domains/processes/process-readiness.service.js.map +0 -1
  139. package/dist/domains/processes/process-status.d.ts +0 -5
  140. package/dist/domains/processes/process-status.d.ts.map +0 -1
  141. package/dist/domains/processes/process-status.js +0 -13
  142. package/dist/domains/processes/process-status.js.map +0 -1
  143. package/dist/domains/processes/process-supervisor.d.ts +0 -34
  144. package/dist/domains/processes/process-supervisor.d.ts.map +0 -1
  145. package/dist/domains/processes/process-supervisor.js +0 -211
  146. package/dist/domains/processes/process-supervisor.js.map +0 -1
  147. package/dist/domains/processes/process.repository.d.ts +0 -11
  148. package/dist/domains/processes/process.repository.d.ts.map +0 -1
  149. package/dist/domains/processes/process.repository.js +0 -31
  150. package/dist/domains/processes/process.repository.js.map +0 -1
  151. package/dist/domains/tasks/task-completion.service.d.ts +0 -31
  152. package/dist/domains/tasks/task-completion.service.d.ts.map +0 -1
  153. package/dist/domains/tasks/task-completion.service.js +0 -147
  154. package/dist/domains/tasks/task-completion.service.js.map +0 -1
  155. package/dist/domains/tasks/task-legacy-migration.d.ts +0 -15
  156. package/dist/domains/tasks/task-legacy-migration.d.ts.map +0 -1
  157. package/dist/domains/tasks/task-legacy-migration.js +0 -191
  158. package/dist/domains/tasks/task-legacy-migration.js.map +0 -1
  159. package/dist/events.d.ts +0 -2
  160. package/dist/events.d.ts.map +0 -1
  161. package/dist/events.js +0 -2
  162. package/dist/events.js.map +0 -1
  163. package/dist/git/git-service.d.ts +0 -51
  164. package/dist/git/git-service.d.ts.map +0 -1
  165. package/dist/git/git-service.js +0 -716
  166. package/dist/git/git-service.js.map +0 -1
  167. package/dist/git/git-status.d.ts +0 -24
  168. package/dist/git/git-status.d.ts.map +0 -1
  169. package/dist/git/git-status.js +0 -133
  170. package/dist/git/git-status.js.map +0 -1
  171. package/dist/harness-manager.d.ts +0 -21
  172. package/dist/harness-manager.d.ts.map +0 -1
  173. package/dist/harness-manager.js +0 -105
  174. package/dist/harness-manager.js.map +0 -1
  175. package/dist/index-store.d.ts +0 -2
  176. package/dist/index-store.d.ts.map +0 -1
  177. package/dist/index-store.js +0 -2
  178. package/dist/index-store.js.map +0 -1
  179. package/dist/plan-paths.d.ts +0 -6
  180. package/dist/plan-paths.d.ts.map +0 -1
  181. package/dist/plan-paths.js +0 -30
  182. package/dist/plan-paths.js.map +0 -1
  183. package/dist/plan-service.d.ts +0 -61
  184. package/dist/plan-service.d.ts.map +0 -1
  185. package/dist/plan-service.js +0 -255
  186. package/dist/plan-service.js.map +0 -1
  187. package/dist/policy.d.ts +0 -14
  188. package/dist/policy.d.ts.map +0 -1
  189. package/dist/policy.js +0 -247
  190. package/dist/policy.js.map +0 -1
  191. package/dist/process-manager.d.ts +0 -72
  192. package/dist/process-manager.d.ts.map +0 -1
  193. package/dist/process-manager.js +0 -376
  194. package/dist/process-manager.js.map +0 -1
  195. package/dist/registry/agent-lifecycle-service.d.ts +0 -38
  196. package/dist/registry/agent-lifecycle-service.d.ts.map +0 -1
  197. package/dist/registry/agent-lifecycle-service.js +0 -199
  198. package/dist/registry/agent-lifecycle-service.js.map +0 -1
  199. package/dist/registry/conversation-lifecycle-service.d.ts +0 -35
  200. package/dist/registry/conversation-lifecycle-service.d.ts.map +0 -1
  201. package/dist/registry/conversation-lifecycle-service.js +0 -136
  202. package/dist/registry/conversation-lifecycle-service.js.map +0 -1
  203. package/dist/registry/pinned-command-service.d.ts +0 -11
  204. package/dist/registry/pinned-command-service.d.ts.map +0 -1
  205. package/dist/registry/pinned-command-service.js +0 -40
  206. package/dist/registry/pinned-command-service.js.map +0 -1
  207. package/dist/registry/project-lifecycle-service.d.ts +0 -22
  208. package/dist/registry/project-lifecycle-service.d.ts.map +0 -1
  209. package/dist/registry/project-lifecycle-service.js +0 -87
  210. package/dist/registry/project-lifecycle-service.js.map +0 -1
  211. package/dist/repositories/agent-repository.d.ts +0 -12
  212. package/dist/repositories/agent-repository.d.ts.map +0 -1
  213. package/dist/repositories/agent-repository.js +0 -33
  214. package/dist/repositories/agent-repository.js.map +0 -1
  215. package/dist/repositories/conversation-repository.d.ts +0 -13
  216. package/dist/repositories/conversation-repository.d.ts.map +0 -1
  217. package/dist/repositories/conversation-repository.js +0 -39
  218. package/dist/repositories/conversation-repository.js.map +0 -1
  219. package/dist/repositories/entry-repository.d.ts +0 -15
  220. package/dist/repositories/entry-repository.d.ts.map +0 -1
  221. package/dist/repositories/entry-repository.js +0 -81
  222. package/dist/repositories/entry-repository.js.map +0 -1
  223. package/dist/repositories/index.d.ts +0 -7
  224. package/dist/repositories/index.d.ts.map +0 -1
  225. package/dist/repositories/index.js +0 -7
  226. package/dist/repositories/index.js.map +0 -1
  227. package/dist/repositories/pinned-command-repository.d.ts +0 -10
  228. package/dist/repositories/pinned-command-repository.d.ts.map +0 -1
  229. package/dist/repositories/pinned-command-repository.js +0 -28
  230. package/dist/repositories/pinned-command-repository.js.map +0 -1
  231. package/dist/repositories/project-repository.d.ts +0 -12
  232. package/dist/repositories/project-repository.d.ts.map +0 -1
  233. package/dist/repositories/project-repository.js +0 -33
  234. package/dist/repositories/project-repository.js.map +0 -1
  235. package/dist/repositories/prompt-queue-repository.d.ts +0 -28
  236. package/dist/repositories/prompt-queue-repository.d.ts.map +0 -1
  237. package/dist/repositories/prompt-queue-repository.js +0 -88
  238. package/dist/repositories/prompt-queue-repository.js.map +0 -1
  239. package/dist/routes/process-routes.d.ts +0 -4
  240. package/dist/routes/process-routes.d.ts.map +0 -1
  241. package/dist/routes/process-routes.js +0 -43
  242. package/dist/routes/process-routes.js.map +0 -1
  243. package/dist/storage.d.ts +0 -2
  244. package/dist/storage.d.ts.map +0 -1
  245. package/dist/storage.js +0 -2
  246. package/dist/storage.js.map +0 -1
  247. package/dist/tool-service.d.ts +0 -82
  248. package/dist/tool-service.d.ts.map +0 -1
  249. package/dist/tool-service.js +0 -409
  250. package/dist/tool-service.js.map +0 -1
  251. package/dist/transcription-service.d.ts +0 -15
  252. package/dist/transcription-service.d.ts.map +0 -1
  253. package/dist/transcription-service.js +0 -128
  254. package/dist/transcription-service.js.map +0 -1
  255. package/dist/usage/anthropic-client.d.ts +0 -9
  256. package/dist/usage/anthropic-client.d.ts.map +0 -1
  257. package/dist/usage/anthropic-client.js +0 -207
  258. package/dist/usage/anthropic-client.js.map +0 -1
  259. package/dist/usage/codex-client.d.ts +0 -18
  260. package/dist/usage/codex-client.d.ts.map +0 -1
  261. package/dist/usage/codex-client.js +0 -316
  262. package/dist/usage/codex-client.js.map +0 -1
  263. package/dist/usage/subscription-usage-service.d.ts +0 -42
  264. package/dist/usage/subscription-usage-service.d.ts.map +0 -1
  265. package/dist/usage/subscription-usage-service.js +0 -131
  266. package/dist/usage/subscription-usage-service.js.map +0 -1
  267. package/dist/web/assets/index-DP6SGqvJ.js +0 -165
  268. package/dist/worker-manager.d.ts +0 -51
  269. package/dist/worker-manager.d.ts.map +0 -1
  270. package/dist/worker-manager.js +0 -116
  271. package/dist/worker-manager.js.map +0 -1
@@ -1,207 +0,0 @@
1
- import { mkdir, readFile, stat, writeFile } from "node:fs/promises";
2
- import { join } from "node:path";
3
- const API_HOST = "api.anthropic.com";
4
- const API_PATH = "/api/oauth/usage";
5
- const API_URL = `https://${API_HOST}${API_PATH}`;
6
- const API_TIMEOUT_MS = 5000;
7
- const CACHE_MAX_AGE_MS = 30_000;
8
- const LOCK_MAX_AGE_MS = 10_000;
9
- const DEFAULT_RATE_LIMIT_BACKOFF_MS = 30_000;
10
- let cache = null;
11
- function cacheFile(cacheDir) {
12
- return join(cacheDir, "anthropic-usage.json");
13
- }
14
- async function readCacheFile(cacheDir) {
15
- const path = cacheFile(cacheDir);
16
- try {
17
- const raw = await readFile(path, "utf8");
18
- return {
19
- data: JSON.parse(raw),
20
- time: (await stat(path)).mtimeMs,
21
- };
22
- }
23
- catch {
24
- return null;
25
- }
26
- }
27
- async function writeCacheFile(cacheDir, data) {
28
- try {
29
- await mkdir(cacheDir, { recursive: true });
30
- await writeFile(cacheFile(cacheDir), JSON.stringify(data), "utf8");
31
- }
32
- catch {
33
- // best-effort cache
34
- }
35
- }
36
- function lockFile(cacheDir) {
37
- return join(cacheDir, "anthropic-usage.lock");
38
- }
39
- async function readLock(cacheDir, nowMs) {
40
- const path = lockFile(cacheDir);
41
- try {
42
- const parsed = JSON.parse(await readFile(path, "utf8"));
43
- const blockedUntil = Number(parsed.blockedUntil);
44
- return Number.isFinite(blockedUntil) && blockedUntil > nowMs
45
- ? blockedUntil
46
- : null;
47
- }
48
- catch {
49
- try {
50
- const blockedUntil = (await stat(path)).mtimeMs + LOCK_MAX_AGE_MS;
51
- return blockedUntil > nowMs ? blockedUntil : null;
52
- }
53
- catch {
54
- return null;
55
- }
56
- }
57
- }
58
- async function writeLock(cacheDir, blockedUntil) {
59
- try {
60
- await mkdir(cacheDir, { recursive: true });
61
- await writeFile(lockFile(cacheDir), JSON.stringify({ blockedUntil }), "utf8");
62
- }
63
- catch {
64
- // best-effort cross-process backoff
65
- }
66
- }
67
- function parseRetryAfterMs(header, nowMs) {
68
- const trimmed = header?.trim();
69
- if (!trimmed)
70
- return null;
71
- if (/^\d+$/.test(trimmed)) {
72
- const s = Number.parseInt(trimmed, 10);
73
- return s > 0 ? s * 1000 : null;
74
- }
75
- const ms = Date.parse(trimmed);
76
- if (Number.isNaN(ms))
77
- return null;
78
- return ms > nowMs ? ms - nowMs : null;
79
- }
80
- function toWindow(raw) {
81
- if (!raw)
82
- return null;
83
- const usedPercent = raw.utilization != null ? Number(raw.utilization) : null;
84
- const resetsAt = typeof raw.resets_at === "string" ? raw.resets_at : null;
85
- if (usedPercent == null && resetsAt == null)
86
- return null;
87
- return {
88
- usedPercent: usedPercent != null && Number.isFinite(usedPercent) ? usedPercent : null,
89
- resetsAt,
90
- resetAfterSeconds: null,
91
- windowMinutes: null,
92
- };
93
- }
94
- export function parseAnthropicUsageResponse(raw) {
95
- let parsed;
96
- try {
97
- parsed = JSON.parse(raw);
98
- }
99
- catch {
100
- return null;
101
- }
102
- if (typeof parsed !== "object" || parsed === null)
103
- return null;
104
- const obj = parsed;
105
- const session = toWindow(obj.five_hour);
106
- const weekly = toWindow(obj.seven_day);
107
- if (!session && !weekly)
108
- return null;
109
- return {
110
- provider: "anthropic",
111
- session,
112
- weekly,
113
- planType: null,
114
- updatedAt: new Date().toISOString(),
115
- };
116
- }
117
- async function fetchApi(token) {
118
- const controller = new AbortController();
119
- const timeout = setTimeout(() => controller.abort(), API_TIMEOUT_MS);
120
- try {
121
- const res = await fetch(API_URL, {
122
- method: "GET",
123
- headers: {
124
- Authorization: `Bearer ${token}`,
125
- "anthropic-beta": "oauth-2025-04-20",
126
- },
127
- signal: controller.signal,
128
- });
129
- if (res.ok)
130
- return { kind: "success", body: await res.text() };
131
- if (res.status === 429) {
132
- return {
133
- kind: "rate-limited",
134
- retryAfterMs: parseRetryAfterMs(res.headers.get("retry-after"), Date.now()) ??
135
- DEFAULT_RATE_LIMIT_BACKOFF_MS,
136
- };
137
- }
138
- return { kind: "error" };
139
- }
140
- catch {
141
- return { kind: "error" };
142
- }
143
- finally {
144
- clearTimeout(timeout);
145
- }
146
- }
147
- /**
148
- * Fetch Anthropic subscription usage (5h session + 7d weekly) using an OAuth
149
- * bearer token. Memoized for {@link CACHE_MAX_AGE_MS} with rate-limit backoff;
150
- * the last good snapshot is served on transient failures.
151
- */
152
- export async function fetchAnthropicUsage(token, cacheDir) {
153
- const now = Date.now();
154
- if (cache &&
155
- now - cache.time < CACHE_MAX_AGE_MS &&
156
- cache.blockedUntil <= now) {
157
- return cache.data;
158
- }
159
- const fileCache = await readCacheFile(cacheDir);
160
- if (fileCache?.data && now - fileCache.time < CACHE_MAX_AGE_MS) {
161
- cache = { data: fileCache.data, time: fileCache.time, blockedUntil: 0 };
162
- return fileCache.data;
163
- }
164
- const lastKnown = cache?.data ?? fileCache?.data ?? null;
165
- if (cache && cache.blockedUntil > now) {
166
- return lastKnown;
167
- }
168
- const lockedUntil = await readLock(cacheDir, now);
169
- if (lockedUntil) {
170
- cache = { data: lastKnown, time: now, blockedUntil: lockedUntil };
171
- return lastKnown;
172
- }
173
- await writeLock(cacheDir, now + LOCK_MAX_AGE_MS);
174
- const resp = await fetchApi(token);
175
- if (resp.kind === "rate-limited") {
176
- await writeLock(cacheDir, now + resp.retryAfterMs);
177
- cache = {
178
- data: lastKnown,
179
- time: now,
180
- blockedUntil: now + resp.retryAfterMs,
181
- };
182
- return lastKnown;
183
- }
184
- if (resp.kind === "error") {
185
- await writeLock(cacheDir, now + DEFAULT_RATE_LIMIT_BACKOFF_MS);
186
- cache = {
187
- data: lastKnown,
188
- time: now,
189
- blockedUntil: now + DEFAULT_RATE_LIMIT_BACKOFF_MS,
190
- };
191
- return lastKnown;
192
- }
193
- const data = parseAnthropicUsageResponse(resp.body);
194
- if (!data) {
195
- await writeLock(cacheDir, now + DEFAULT_RATE_LIMIT_BACKOFF_MS);
196
- cache = {
197
- data: lastKnown,
198
- time: now,
199
- blockedUntil: now + DEFAULT_RATE_LIMIT_BACKOFF_MS,
200
- };
201
- return lastKnown;
202
- }
203
- cache = { data, time: now, blockedUntil: 0 };
204
- await writeCacheFile(cacheDir, data);
205
- return data;
206
- }
207
- //# sourceMappingURL=anthropic-client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"anthropic-client.js","sourceRoot":"","sources":["../../src/usage/anthropic-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,QAAQ,GAAG,mBAAmB,CAAC;AACrC,MAAM,QAAQ,GAAG,kBAAkB,CAAC;AACpC,MAAM,OAAO,GAAG,WAAW,QAAQ,GAAG,QAAQ,EAAE,CAAC;AACjD,MAAM,cAAc,GAAG,IAAI,CAAC;AAC5B,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAChC,MAAM,eAAe,GAAG,MAAM,CAAC;AAC/B,MAAM,6BAA6B,GAAG,MAAM,CAAC;AAQ7C,IAAI,KAAK,GAAsB,IAAI,CAAC;AAEpC,SAAS,SAAS,CAAC,QAAgB;IACjC,OAAO,IAAI,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC;AAChD,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,QAAgB;IAI3C,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACzC,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAsB;YAC1C,IAAI,EAAE,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO;SACjC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,QAAgB,EAChB,IAAuB;IAEvB,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,MAAM,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,oBAAoB;IACtB,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,QAAgB;IAChC,OAAO,IAAI,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC;AAChD,CAAC;AAED,KAAK,UAAU,QAAQ,CACrB,QAAgB,EAChB,KAAa;IAEb,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAErD,CAAC;QACF,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACjD,OAAO,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,YAAY,GAAG,KAAK;YAC1D,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,GAAG,eAAe,CAAC;YAClE,OAAO,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,QAAgB,EAChB,YAAoB;IAEpB,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,MAAM,SAAS,CACb,QAAQ,CAAC,QAAQ,CAAC,EAClB,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC,EAChC,MAAM,CACP,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,oCAAoC;IACtC,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CACxB,MAAqB,EACrB,KAAa;IAEb,MAAM,OAAO,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACjC,CAAC;IACD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACxC,CAAC;AAED,SAAS,QAAQ,CACf,GAAwC;IAExC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7E,MAAM,QAAQ,GAAG,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1E,IAAI,WAAW,IAAI,IAAI,IAAI,QAAQ,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IACzD,OAAO;QACL,WAAW,EACT,WAAW,IAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI;QAC1E,QAAQ;QACR,iBAAiB,EAAE,IAAI;QACvB,aAAa,EAAE,IAAI;KACpB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,GAAW;IAEX,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/D,MAAM,GAAG,GAAG,MAAiC,CAAC;IAC9C,MAAM,OAAO,GAAG,QAAQ,CACtB,GAAG,CAAC,SAAgD,CACrD,CAAC;IACF,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAgD,CAAC,CAAC;IAC9E,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO;QACL,QAAQ,EAAE,WAAW;QACrB,OAAO;QACP,MAAM;QACN,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,QAAQ,CACrB,KAAa;IAMb,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,cAAc,CAAC,CAAC;IACrE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE;YAC/B,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,KAAK,EAAE;gBAChC,gBAAgB,EAAE,kBAAkB;aACrC;YACD,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,EAAE;YAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QAC/D,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,OAAO;gBACL,IAAI,EAAE,cAAc;gBACpB,YAAY,EACV,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;oBAC7D,6BAA6B;aAChC,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC3B,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAAa,EACb,QAAgB;IAEhB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,IACE,KAAK;QACL,GAAG,GAAG,KAAK,CAAC,IAAI,GAAG,gBAAgB;QACnC,KAAK,CAAC,YAAY,IAAI,GAAG,EACzB,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC;IACpB,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,IAAI,SAAS,EAAE,IAAI,IAAI,GAAG,GAAG,SAAS,CAAC,IAAI,GAAG,gBAAgB,EAAE,CAAC;QAC/D,KAAK,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;QACxE,OAAO,SAAS,CAAC,IAAI,CAAC;IACxB,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,EAAE,IAAI,IAAI,SAAS,EAAE,IAAI,IAAI,IAAI,CAAC;IAEzD,IAAI,KAAK,IAAI,KAAK,CAAC,YAAY,GAAG,GAAG,EAAE,CAAC;QACtC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAClD,IAAI,WAAW,EAAE,CAAC;QAChB,KAAK,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;QAClE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,SAAS,CAAC,QAAQ,EAAE,GAAG,GAAG,eAAe,CAAC,CAAC;IAEjD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QACjC,MAAM,SAAS,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;QACnD,KAAK,GAAG;YACN,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,GAAG;YACT,YAAY,EAAE,GAAG,GAAG,IAAI,CAAC,YAAY;SACtC,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,MAAM,SAAS,CAAC,QAAQ,EAAE,GAAG,GAAG,6BAA6B,CAAC,CAAC;QAC/D,KAAK,GAAG;YACN,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,GAAG;YACT,YAAY,EAAE,GAAG,GAAG,6BAA6B;SAClD,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,IAAI,GAAG,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,SAAS,CAAC,QAAQ,EAAE,GAAG,GAAG,6BAA6B,CAAC,CAAC;QAC/D,KAAK,GAAG;YACN,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,GAAG;YACT,YAAY,EAAE,GAAG,GAAG,6BAA6B;SAClD,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;IAC7C,MAAM,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACrC,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1,18 +0,0 @@
1
- import type { SubscriptionUsage } from "@nerve/shared";
2
- type HeaderLike = Record<string, string | number | boolean | null | undefined>;
3
- /** Parse a Codex usage JSON payload into a normalized snapshot. */
4
- export declare function parseCodexUsageResponse(payload: unknown, nowMs?: number): SubscriptionUsage | null;
5
- /** Parse Codex rate-limit usage from provider response headers. */
6
- export declare function parseCodexUsageHeaders(headers: HeaderLike, nowMs?: number): SubscriptionUsage | null;
7
- /** Merge a newer snapshot over a base, preferring defined fields. */
8
- export declare function mergeCodexUsage(base: SubscriptionUsage | null, update: SubscriptionUsage): SubscriptionUsage;
9
- /**
10
- * Fetch Codex subscription usage from the backend endpoint using an OAuth
11
- * bearer token. Memoized for {@link CACHE_MAX_AGE_MS} with rate-limit backoff;
12
- * live updates also arrive via {@link parseCodexUsageHeaders}.
13
- */
14
- export declare function fetchCodexUsage(token: string, cacheDir: string): Promise<SubscriptionUsage | null>;
15
- /** Persist a header-derived snapshot into the cache. */
16
- export declare function writeCodexUsageCache(cacheDir: string, data: SubscriptionUsage): Promise<void>;
17
- export {};
18
- //# sourceMappingURL=codex-client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"codex-client.d.ts","sourceRoot":"","sources":["../../src/usage/codex-client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAsB,MAAM,eAAe,CAAC;AAe3E,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;AAuI/E,mEAAmE;AACnE,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,OAAO,EAChB,KAAK,SAAa,GACjB,iBAAiB,GAAG,IAAI,CAkC1B;AAwCD,mEAAmE;AACnE,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,UAAU,EACnB,KAAK,SAAa,GACjB,iBAAiB,GAAG,IAAI,CAW1B;AAED,qEAAqE;AACrE,wBAAgB,eAAe,CAC7B,IAAI,EAAE,iBAAiB,GAAG,IAAI,EAC9B,MAAM,EAAE,iBAAiB,GACxB,iBAAiB,CASnB;AAwFD;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAiEnC;AAED,wDAAwD;AACxD,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,IAAI,CAAC,CAGf"}
@@ -1,316 +0,0 @@
1
- import { mkdir, readFile, stat, writeFile } from "node:fs/promises";
2
- import { join } from "node:path";
3
- const API_URL = "https://chatgpt.com/backend-api/wham/usage";
4
- const API_TIMEOUT_MS = 5000;
5
- const CACHE_MAX_AGE_MS = 30_000;
6
- const LOCK_MAX_AGE_MS = 10_000;
7
- const DEFAULT_RATE_LIMIT_BACKOFF_MS = 30_000;
8
- const ACCOUNT_ID_CLAIM = "https://api.openai.com/auth.chatgpt_account_id";
9
- let cache = null;
10
- function cacheFile(cacheDir) {
11
- return join(cacheDir, "codex-usage.json");
12
- }
13
- async function readCacheFile(cacheDir) {
14
- const path = cacheFile(cacheDir);
15
- try {
16
- return {
17
- data: JSON.parse(await readFile(path, "utf8")),
18
- time: (await stat(path)).mtimeMs,
19
- };
20
- }
21
- catch {
22
- return null;
23
- }
24
- }
25
- async function writeCacheFile(cacheDir, data) {
26
- try {
27
- await mkdir(cacheDir, { recursive: true });
28
- await writeFile(cacheFile(cacheDir), JSON.stringify(data), "utf8");
29
- }
30
- catch {
31
- // best-effort cache
32
- }
33
- }
34
- function lockFile(cacheDir) {
35
- return join(cacheDir, "codex-usage.lock");
36
- }
37
- async function readLock(cacheDir, nowMs) {
38
- const path = lockFile(cacheDir);
39
- try {
40
- const parsed = JSON.parse(await readFile(path, "utf8"));
41
- const blockedUntil = Number(parsed.blockedUntil);
42
- return Number.isFinite(blockedUntil) && blockedUntil > nowMs
43
- ? blockedUntil
44
- : null;
45
- }
46
- catch {
47
- try {
48
- const blockedUntil = (await stat(path)).mtimeMs + LOCK_MAX_AGE_MS;
49
- return blockedUntil > nowMs ? blockedUntil : null;
50
- }
51
- catch {
52
- return null;
53
- }
54
- }
55
- }
56
- async function writeLock(cacheDir, blockedUntil) {
57
- try {
58
- await mkdir(cacheDir, { recursive: true });
59
- await writeFile(lockFile(cacheDir), JSON.stringify({ blockedUntil }), "utf8");
60
- }
61
- catch {
62
- // best-effort cross-process backoff
63
- }
64
- }
65
- function numberValue(value) {
66
- if (typeof value === "number" && Number.isFinite(value))
67
- return value;
68
- if (typeof value !== "string" || value.trim() === "")
69
- return null;
70
- const parsed = Number(value);
71
- return Number.isFinite(parsed) ? parsed : null;
72
- }
73
- function stringValue(value) {
74
- if (typeof value === "string" && value !== "")
75
- return value;
76
- if (typeof value === "number" && Number.isFinite(value))
77
- return String(value);
78
- return null;
79
- }
80
- function normalizeResetAt(value) {
81
- if (value == null)
82
- return null;
83
- return value > 10_000_000_000 ? Math.round(value / 1000) : value;
84
- }
85
- function resetAfterFromResetAt(resetAt, nowMs) {
86
- const normalized = normalizeResetAt(resetAt);
87
- if (normalized == null)
88
- return null;
89
- return Math.max(0, Math.round(normalized - nowMs / 1000));
90
- }
91
- function parseApiWindow(window, nowMs) {
92
- if (!window)
93
- return null;
94
- const usedPercent = numberValue(window.used_percent ?? window.usedPercent);
95
- const resetAfterSeconds = numberValue(window.reset_after_seconds ?? window.resetAfterSeconds) ??
96
- resetAfterFromResetAt(numberValue(window.reset_at ?? window.resetAt), nowMs);
97
- const limitWindowSeconds = numberValue(window.limit_window_seconds ?? window.windowSeconds);
98
- const windowMinutes = numberValue(window.window_minutes ?? window.windowMinutes) ??
99
- (limitWindowSeconds != null ? limitWindowSeconds / 60 : null);
100
- if (usedPercent == null &&
101
- resetAfterSeconds == null &&
102
- windowMinutes == null) {
103
- return null;
104
- }
105
- return { usedPercent, resetsAt: null, resetAfterSeconds, windowMinutes };
106
- }
107
- /** Parse a Codex usage JSON payload into a normalized snapshot. */
108
- export function parseCodexUsageResponse(payload, nowMs = Date.now()) {
109
- if (typeof payload !== "object" ||
110
- payload === null ||
111
- Array.isArray(payload)) {
112
- return null;
113
- }
114
- const api = payload;
115
- const session = parseApiWindow(api.rate_limit?.primary_window ?? api.rate_limit?.primaryWindow, nowMs);
116
- const weekly = parseApiWindow(api.rate_limit?.secondary_window ?? api.rate_limit?.secondaryWindow, nowMs);
117
- if (!session && !weekly)
118
- return null;
119
- return {
120
- provider: "openai-codex",
121
- session,
122
- weekly,
123
- planType: stringValue(api.plan_type ?? api.planType),
124
- updatedAt: new Date().toISOString(),
125
- };
126
- }
127
- function headerValue(headers, name) {
128
- const wanted = `x-codex-${name}`.toLowerCase();
129
- for (const [key, value] of Object.entries(headers)) {
130
- if (key.toLowerCase() === wanted && value != null)
131
- return String(value);
132
- }
133
- return undefined;
134
- }
135
- function headerNumber(headers, name) {
136
- return numberValue(headerValue(headers, name));
137
- }
138
- function headerResetAfter(headers, prefix, nowMs) {
139
- return (headerNumber(headers, `${prefix}-reset-after-seconds`) ??
140
- resetAfterFromResetAt(headerNumber(headers, `${prefix}-reset-at`), nowMs));
141
- }
142
- function headerWindow(headers, prefix, nowMs) {
143
- const usedPercent = headerNumber(headers, `${prefix}-used-percent`);
144
- if (usedPercent == null)
145
- return null;
146
- return {
147
- usedPercent,
148
- resetsAt: null,
149
- resetAfterSeconds: headerResetAfter(headers, prefix, nowMs),
150
- windowMinutes: headerNumber(headers, `${prefix}-window-minutes`),
151
- };
152
- }
153
- /** Parse Codex rate-limit usage from provider response headers. */
154
- export function parseCodexUsageHeaders(headers, nowMs = Date.now()) {
155
- const session = headerWindow(headers, "primary", nowMs);
156
- const weekly = headerWindow(headers, "secondary", nowMs);
157
- if (!session && !weekly)
158
- return null;
159
- return {
160
- provider: "openai-codex",
161
- session,
162
- weekly,
163
- planType: headerValue(headers, "plan-type") ?? null,
164
- updatedAt: new Date().toISOString(),
165
- };
166
- }
167
- /** Merge a newer snapshot over a base, preferring defined fields. */
168
- export function mergeCodexUsage(base, update) {
169
- if (!base)
170
- return update;
171
- return {
172
- provider: "openai-codex",
173
- session: update.session ?? base.session,
174
- weekly: update.weekly ?? base.weekly,
175
- planType: update.planType ?? base.planType,
176
- updatedAt: update.updatedAt,
177
- };
178
- }
179
- function decodeBase64UrlJson(segment) {
180
- try {
181
- const normalized = segment.replace(/-/g, "+").replace(/_/g, "/");
182
- const padded = normalized.padEnd(normalized.length + ((4 - (normalized.length % 4)) % 4), "=");
183
- const parsed = JSON.parse(Buffer.from(padded, "base64").toString("utf8"));
184
- if (typeof parsed !== "object" ||
185
- parsed === null ||
186
- Array.isArray(parsed)) {
187
- return null;
188
- }
189
- return parsed;
190
- }
191
- catch {
192
- return null;
193
- }
194
- }
195
- function extractAccountId(token) {
196
- const [, payload] = token.split(".");
197
- if (!payload)
198
- return null;
199
- const claims = decodeBase64UrlJson(payload);
200
- return stringValue(claims?.[ACCOUNT_ID_CLAIM] ??
201
- claims?.chatgpt_account_id ??
202
- claims?.account_id);
203
- }
204
- function parseRetryAfterMs(header, nowMs) {
205
- const trimmed = header?.trim();
206
- if (!trimmed)
207
- return null;
208
- if (/^\d+$/.test(trimmed)) {
209
- const s = Number.parseInt(trimmed, 10);
210
- return s > 0 ? s * 1000 : null;
211
- }
212
- const ms = Date.parse(trimmed);
213
- if (Number.isNaN(ms))
214
- return null;
215
- return ms > nowMs ? ms - nowMs : null;
216
- }
217
- async function fetchApi(token, accountId) {
218
- const controller = new AbortController();
219
- const timeout = setTimeout(() => controller.abort(), API_TIMEOUT_MS);
220
- try {
221
- const headers = {
222
- Authorization: `Bearer ${token}`,
223
- accept: "application/json",
224
- "user-agent": "nerve/0.0.0",
225
- };
226
- if (accountId)
227
- headers["chatgpt-account-id"] = accountId;
228
- const res = await fetch(API_URL, {
229
- method: "GET",
230
- headers,
231
- signal: controller.signal,
232
- });
233
- if (res.ok)
234
- return { kind: "success", body: await res.json() };
235
- if (res.status === 429) {
236
- return {
237
- kind: "rate-limited",
238
- retryAfterMs: parseRetryAfterMs(res.headers.get("retry-after"), Date.now()) ??
239
- DEFAULT_RATE_LIMIT_BACKOFF_MS,
240
- };
241
- }
242
- return { kind: "error" };
243
- }
244
- catch {
245
- return { kind: "error" };
246
- }
247
- finally {
248
- clearTimeout(timeout);
249
- }
250
- }
251
- /**
252
- * Fetch Codex subscription usage from the backend endpoint using an OAuth
253
- * bearer token. Memoized for {@link CACHE_MAX_AGE_MS} with rate-limit backoff;
254
- * live updates also arrive via {@link parseCodexUsageHeaders}.
255
- */
256
- export async function fetchCodexUsage(token, cacheDir) {
257
- const now = Date.now();
258
- if (cache &&
259
- now - cache.time < CACHE_MAX_AGE_MS &&
260
- cache.blockedUntil <= now) {
261
- return cache.data;
262
- }
263
- const fileCache = await readCacheFile(cacheDir);
264
- if (fileCache?.data && now - fileCache.time < CACHE_MAX_AGE_MS) {
265
- cache = { data: fileCache.data, time: fileCache.time, blockedUntil: 0 };
266
- return fileCache.data;
267
- }
268
- const lastKnown = cache?.data ?? fileCache?.data ?? null;
269
- if (cache && cache.blockedUntil > now) {
270
- return lastKnown;
271
- }
272
- const lockedUntil = await readLock(cacheDir, now);
273
- if (lockedUntil) {
274
- cache = { data: lastKnown, time: now, blockedUntil: lockedUntil };
275
- return lastKnown;
276
- }
277
- await writeLock(cacheDir, now + LOCK_MAX_AGE_MS);
278
- const resp = await fetchApi(token, extractAccountId(token));
279
- if (resp.kind === "rate-limited") {
280
- await writeLock(cacheDir, now + resp.retryAfterMs);
281
- cache = {
282
- data: lastKnown,
283
- time: now,
284
- blockedUntil: now + resp.retryAfterMs,
285
- };
286
- return lastKnown;
287
- }
288
- if (resp.kind === "error") {
289
- await writeLock(cacheDir, now + DEFAULT_RATE_LIMIT_BACKOFF_MS);
290
- cache = {
291
- data: lastKnown,
292
- time: now,
293
- blockedUntil: now + DEFAULT_RATE_LIMIT_BACKOFF_MS,
294
- };
295
- return lastKnown;
296
- }
297
- const data = parseCodexUsageResponse(resp.body);
298
- if (!data) {
299
- await writeLock(cacheDir, now + DEFAULT_RATE_LIMIT_BACKOFF_MS);
300
- cache = {
301
- data: lastKnown,
302
- time: now,
303
- blockedUntil: now + DEFAULT_RATE_LIMIT_BACKOFF_MS,
304
- };
305
- return lastKnown;
306
- }
307
- cache = { data, time: now, blockedUntil: 0 };
308
- await writeCacheFile(cacheDir, data);
309
- return data;
310
- }
311
- /** Persist a header-derived snapshot into the cache. */
312
- export async function writeCodexUsageCache(cacheDir, data) {
313
- cache = { data, time: Date.now(), blockedUntil: 0 };
314
- await writeCacheFile(cacheDir, data);
315
- }
316
- //# sourceMappingURL=codex-client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"codex-client.js","sourceRoot":"","sources":["../../src/usage/codex-client.ts"],"names":[],"mappings":"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"}
@@ -1,42 +0,0 @@
1
- import { type SubscriptionUsage } from "@nerve/shared";
2
- import type { AuthManager } from "../auth.js";
3
- import type { EventBus } from "../infrastructure/events/index.js";
4
- type FetchUsage = (token: string, cacheDir: string) => Promise<SubscriptionUsage | null>;
5
- export interface SubscriptionUsageServiceDeps {
6
- auth: AuthManager;
7
- events: EventBus;
8
- /** Directory for persisted usage caches (e.g. `<dataDir>/cache/usage`). */
9
- cacheDir: string;
10
- fetchAnthropicUsage?: FetchUsage;
11
- fetchCodexUsage?: FetchUsage;
12
- now?: () => number;
13
- }
14
- /**
15
- * Manages provider subscription usage (Anthropic 5h/7d, Codex
16
- * primary/secondary) for globally supported OAuth providers.
17
- *
18
- * Refreshing is request-driven: callers ask for fresh snapshots and the service
19
- * debounces upstream provider calls to at most one attempt per provider every
20
- * {@link MIN_REFRESH_INTERVAL_MS}. Codex also receives live header updates via
21
- * {@link applyCodexHeaders}.
22
- */
23
- export declare class SubscriptionUsageService {
24
- #private;
25
- constructor(deps: SubscriptionUsageServiceDeps);
26
- start(): void;
27
- stop(): void;
28
- /** Current snapshots, optionally refreshing all globally supported providers. */
29
- getSnapshots(options?: {
30
- refresh?: boolean;
31
- }): Promise<SubscriptionUsage[]>;
32
- /** Mark a model provider as used and request a debounced refresh. */
33
- touchProvider(provider: string): void;
34
- /** Apply a Codex usage snapshot derived from provider response headers. */
35
- applyCodexHeaders(headers: Record<string, string>): void;
36
- private configuredSnapshots;
37
- private refreshProvider;
38
- private performRefresh;
39
- private now;
40
- }
41
- export {};
42
- //# sourceMappingURL=subscription-usage-service.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"subscription-usage-service.d.ts","sourceRoot":"","sources":["../../src/usage/subscription-usage-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,iBAAiB,EAEvB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAelE,KAAK,UAAU,GAAG,CAChB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,KACb,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;AAEvC,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,QAAQ,CAAC;IACjB,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,CAAC,EAAE,UAAU,CAAC;IACjC,eAAe,CAAC,EAAE,UAAU,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,qBAAa,wBAAwB;;gBAMvB,IAAI,EAAE,4BAA4B;IAI9C,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI;IAIZ,iFAAiF;IAC3E,YAAY,CAChB,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAO,GAClC,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAS/B,qEAAqE;IACrE,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKrC,2EAA2E;IAC3E,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;YAgB1C,mBAAmB;IAajC,OAAO,CAAC,eAAe;YAWT,cAAc;IAqC5B,OAAO,CAAC,GAAG;CAGZ"}