@claudexor/cli 1.0.1 → 2.1.2

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 (213) hide show
  1. package/dist/acp-surface-runner.d.ts +17 -0
  2. package/dist/acp-surface-runner.d.ts.map +1 -0
  3. package/dist/acp-surface-runner.js +187 -0
  4. package/dist/acp-surface-runner.js.map +1 -0
  5. package/dist/args.d.ts.map +1 -1
  6. package/dist/args.js.map +1 -1
  7. package/dist/bridge-serve.d.ts +3 -0
  8. package/dist/bridge-serve.d.ts.map +1 -0
  9. package/dist/bridge-serve.js +39 -0
  10. package/dist/bridge-serve.js.map +1 -0
  11. package/dist/capabilities.d.ts.map +1 -1
  12. package/dist/capabilities.js +12 -3
  13. package/dist/capabilities.js.map +1 -1
  14. package/dist/claude-oauth-usage.d.ts +33 -0
  15. package/dist/claude-oauth-usage.d.ts.map +1 -0
  16. package/dist/claude-oauth-usage.js +190 -0
  17. package/dist/claude-oauth-usage.js.map +1 -0
  18. package/dist/claude-statusline.d.ts +25 -0
  19. package/dist/claude-statusline.d.ts.map +1 -0
  20. package/dist/claude-statusline.js +259 -0
  21. package/dist/claude-statusline.js.map +1 -0
  22. package/dist/claudexord.js +346 -543
  23. package/dist/claudexord.js.map +1 -1
  24. package/dist/cli-io.d.ts +8 -9
  25. package/dist/cli-io.d.ts.map +1 -1
  26. package/dist/cli-io.js +11 -7
  27. package/dist/cli-io.js.map +1 -1
  28. package/dist/cli.js +475 -516
  29. package/dist/cli.js.map +1 -1
  30. package/dist/codex-quota-source.d.ts +11 -0
  31. package/dist/codex-quota-source.d.ts.map +1 -0
  32. package/dist/codex-quota-source.js +181 -0
  33. package/dist/codex-quota-source.js.map +1 -0
  34. package/dist/command-flags.d.ts +18 -0
  35. package/dist/command-flags.d.ts.map +1 -0
  36. package/dist/command-flags.js +124 -0
  37. package/dist/command-flags.js.map +1 -0
  38. package/dist/command-registry.d.ts +2 -40
  39. package/dist/command-registry.d.ts.map +1 -1
  40. package/dist/command-registry.js +74 -164
  41. package/dist/command-registry.js.map +1 -1
  42. package/dist/control-services.d.ts +2483 -0
  43. package/dist/control-services.d.ts.map +1 -0
  44. package/dist/control-services.js +437 -0
  45. package/dist/control-services.js.map +1 -0
  46. package/dist/credential-commands.d.ts +9 -0
  47. package/dist/credential-commands.d.ts.map +1 -0
  48. package/dist/credential-commands.js +224 -0
  49. package/dist/credential-commands.js.map +1 -0
  50. package/dist/daemon-lifecycle.d.ts +7 -3
  51. package/dist/daemon-lifecycle.d.ts.map +1 -1
  52. package/dist/daemon-lifecycle.js +40 -12
  53. package/dist/daemon-lifecycle.js.map +1 -1
  54. package/dist/daemon-run.d.ts +2 -0
  55. package/dist/daemon-run.d.ts.map +1 -1
  56. package/dist/daemon-run.js +62 -14
  57. package/dist/daemon-run.js.map +1 -1
  58. package/dist/daemon-runtime-shutdown.d.ts +58 -0
  59. package/dist/daemon-runtime-shutdown.d.ts.map +1 -0
  60. package/dist/daemon-runtime-shutdown.js +142 -0
  61. package/dist/daemon-runtime-shutdown.js.map +1 -0
  62. package/dist/decision.d.ts.map +1 -1
  63. package/dist/decision.js +12 -3
  64. package/dist/decision.js.map +1 -1
  65. package/dist/live.d.ts +29 -0
  66. package/dist/live.d.ts.map +1 -1
  67. package/dist/live.js +117 -6
  68. package/dist/live.js.map +1 -1
  69. package/dist/local-attachment.d.ts +14 -0
  70. package/dist/local-attachment.d.ts.map +1 -0
  71. package/dist/local-attachment.js +67 -0
  72. package/dist/local-attachment.js.map +1 -0
  73. package/dist/mcp-runner.d.ts +4 -15
  74. package/dist/mcp-runner.d.ts.map +1 -1
  75. package/dist/mcp-runner.js +273 -145
  76. package/dist/mcp-runner.js.map +1 -1
  77. package/dist/native-login.d.ts +21 -0
  78. package/dist/native-login.d.ts.map +1 -0
  79. package/dist/native-login.js +111 -0
  80. package/dist/native-login.js.map +1 -0
  81. package/dist/ops-commands.d.ts +8 -6
  82. package/dist/ops-commands.d.ts.map +1 -1
  83. package/dist/ops-commands.js +250 -168
  84. package/dist/ops-commands.js.map +1 -1
  85. package/dist/orchestrate-options.d.ts.map +1 -1
  86. package/dist/orchestrate-options.js +1 -1
  87. package/dist/orchestrate-options.js.map +1 -1
  88. package/dist/orphan-reaper.d.ts +4 -5
  89. package/dist/orphan-reaper.d.ts.map +1 -1
  90. package/dist/orphan-reaper.js +29 -56
  91. package/dist/orphan-reaper.js.map +1 -1
  92. package/dist/orphan-sweeper.d.ts +1 -2
  93. package/dist/orphan-sweeper.d.ts.map +1 -1
  94. package/dist/orphan-sweeper.js +29 -48
  95. package/dist/orphan-sweeper.js.map +1 -1
  96. package/dist/plugins.d.ts.map +1 -1
  97. package/dist/plugins.js +196 -64
  98. package/dist/plugins.js.map +1 -1
  99. package/dist/primary-output.d.ts.map +1 -1
  100. package/dist/primary-output.js.map +1 -1
  101. package/dist/profile-registration.d.ts +15 -0
  102. package/dist/profile-registration.d.ts.map +1 -0
  103. package/dist/profile-registration.js +68 -0
  104. package/dist/profile-registration.js.map +1 -0
  105. package/dist/project-command.d.ts +3 -0
  106. package/dist/project-command.d.ts.map +1 -0
  107. package/dist/project-command.js +87 -0
  108. package/dist/project-command.js.map +1 -0
  109. package/dist/quota-command.d.ts +3 -0
  110. package/dist/quota-command.d.ts.map +1 -0
  111. package/dist/quota-command.js +59 -0
  112. package/dist/quota-command.js.map +1 -0
  113. package/dist/registry.d.ts +1 -1
  114. package/dist/registry.d.ts.map +1 -1
  115. package/dist/registry.js +16 -4
  116. package/dist/registry.js.map +1 -1
  117. package/dist/release.d.ts.map +1 -1
  118. package/dist/release.js +15 -3
  119. package/dist/release.js.map +1 -1
  120. package/dist/repl.d.ts +3 -8
  121. package/dist/repl.d.ts.map +1 -1
  122. package/dist/repl.js +23 -122
  123. package/dist/repl.js.map +1 -1
  124. package/dist/request-preflight.d.ts +13 -0
  125. package/dist/request-preflight.d.ts.map +1 -0
  126. package/dist/request-preflight.js +81 -0
  127. package/dist/request-preflight.js.map +1 -0
  128. package/dist/retention-service.d.ts +24 -0
  129. package/dist/retention-service.d.ts.map +1 -0
  130. package/dist/retention-service.js +100 -0
  131. package/dist/retention-service.js.map +1 -0
  132. package/dist/retry-command-specs.d.ts +3 -0
  133. package/dist/retry-command-specs.d.ts.map +1 -0
  134. package/dist/retry-command-specs.js +21 -0
  135. package/dist/retry-command-specs.js.map +1 -0
  136. package/dist/retry-command.d.ts +4 -0
  137. package/dist/retry-command.d.ts.map +1 -0
  138. package/dist/retry-command.js +57 -0
  139. package/dist/retry-command.js.map +1 -0
  140. package/dist/review-command.d.ts.map +1 -1
  141. package/dist/review-command.js +47 -12
  142. package/dist/review-command.js.map +1 -1
  143. package/dist/run-options.d.ts +2 -2
  144. package/dist/run-options.d.ts.map +1 -1
  145. package/dist/run-options.js +27 -5
  146. package/dist/run-options.js.map +1 -1
  147. package/dist/settings-command.d.ts.map +1 -1
  148. package/dist/settings-command.js +143 -188
  149. package/dist/settings-command.js.map +1 -1
  150. package/dist/settings-service.d.ts +50 -0
  151. package/dist/settings-service.d.ts.map +1 -1
  152. package/dist/settings-service.js +67 -1
  153. package/dist/settings-service.js.map +1 -1
  154. package/dist/setup-job-reducer.d.ts +9 -0
  155. package/dist/setup-job-reducer.d.ts.map +1 -0
  156. package/dist/setup-job-reducer.js +290 -0
  157. package/dist/setup-job-reducer.js.map +1 -0
  158. package/dist/setup-job-store.d.ts +250 -0
  159. package/dist/setup-job-store.d.ts.map +1 -0
  160. package/dist/setup-job-store.js +359 -0
  161. package/dist/setup-job-store.js.map +1 -0
  162. package/dist/setup-job-support.d.ts +27 -0
  163. package/dist/setup-job-support.d.ts.map +1 -0
  164. package/dist/setup-job-support.js +141 -0
  165. package/dist/setup-job-support.js.map +1 -0
  166. package/dist/setup-jobs.d.ts +437 -22
  167. package/dist/setup-jobs.d.ts.map +1 -1
  168. package/dist/setup-jobs.js +813 -423
  169. package/dist/setup-jobs.js.map +1 -1
  170. package/dist/setup-lifecycle-binding.d.ts +40 -0
  171. package/dist/setup-lifecycle-binding.d.ts.map +1 -0
  172. package/dist/setup-lifecycle-binding.js +159 -0
  173. package/dist/setup-lifecycle-binding.js.map +1 -0
  174. package/dist/setup-login-protocol.d.ts +13 -0
  175. package/dist/setup-login-protocol.d.ts.map +1 -0
  176. package/dist/setup-login-protocol.js +179 -0
  177. package/dist/setup-login-protocol.js.map +1 -0
  178. package/dist/setup-login-runner.d.ts +20 -0
  179. package/dist/setup-login-runner.d.ts.map +1 -0
  180. package/dist/setup-login-runner.js +225 -0
  181. package/dist/setup-login-runner.js.map +1 -0
  182. package/dist/setup-supervisor.d.ts +53 -0
  183. package/dist/setup-supervisor.d.ts.map +1 -0
  184. package/dist/setup-supervisor.js +177 -0
  185. package/dist/setup-supervisor.js.map +1 -0
  186. package/dist/spec.d.ts +9 -20
  187. package/dist/spec.d.ts.map +1 -1
  188. package/dist/spec.js +49 -21
  189. package/dist/spec.js.map +1 -1
  190. package/dist/thread-delivery.d.ts +18 -0
  191. package/dist/thread-delivery.d.ts.map +1 -0
  192. package/dist/thread-delivery.js +67 -0
  193. package/dist/thread-delivery.js.map +1 -0
  194. package/dist/thread-select.d.ts +9 -0
  195. package/dist/thread-select.d.ts.map +1 -0
  196. package/dist/thread-select.js +12 -0
  197. package/dist/thread-select.js.map +1 -0
  198. package/dist/trust-command.d.ts.map +1 -1
  199. package/dist/trust-command.js +69 -61
  200. package/dist/trust-command.js.map +1 -1
  201. package/dist/trust-services.d.ts +5 -6
  202. package/dist/trust-services.d.ts.map +1 -1
  203. package/dist/trust-services.js +42 -13
  204. package/dist/trust-services.js.map +1 -1
  205. package/package.json +24 -22
  206. package/dist/attachment-resolver.d.ts +0 -11
  207. package/dist/attachment-resolver.d.ts.map +0 -1
  208. package/dist/attachment-resolver.js +0 -61
  209. package/dist/attachment-resolver.js.map +0 -1
  210. package/dist/settings-display.d.ts +0 -3
  211. package/dist/settings-display.d.ts.map +0 -1
  212. package/dist/settings-display.js +0 -33
  213. package/dist/settings-display.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-statusline.d.ts","sourceRoot":"","sources":["../src/claude-statusline.ts"],"names":[],"mappings":"AAGA,OAAO,EAAwC,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAI7F,eAAO,MAAM,6BAA6B,eAAe,CAAC;AAY1D,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,mGAAmG;AACnG,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,OAAO,EACd,UAAU,OAAa,GACtB,aAAa,GAAG,IAAI,CAqBtB;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,OAAO,EACd,UAAU,OAAa,GACtB,aAAa,GAAG,IAAI,CAKtB;AAED,6FAA6F;AAC7F,wBAAsB,4BAA4B,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAK7E;AAED,wBAAsB,4BAA4B,CAChD,QAAQ,EAAE,MAAM,EAChB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED,mGAAmG;AACnG,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,EAC9D,OAAO,EAAE,uBAAuB,EAChC,IAAI,EAAE,0BAA0B,GAC/B,OAAO,CA6FT;AAED,wBAAgB,4BAA4B,CAAC,SAAS,SAAkB,GAAG,MAAM,CAEhF"}
@@ -0,0 +1,259 @@
1
+ import { spawn } from "node:child_process";
2
+ import { existsSync, lstatSync, readFileSync, rmSync } from "node:fs";
3
+ import { dirname, join } from "node:path";
4
+ import { QuotaSnapshot as QuotaSnapshotSchema } from "@claudexor/schema";
5
+ import { ensureDir, readJsonSafe, sha256, userConfigDir, writeJson } from "@claudexor/util";
6
+ const SOURCE = "claude_statusline";
7
+ export const CLAUDE_STATUSLINE_MANAGED_ARG = "managed-v2";
8
+ /** Parse only the vendor-documented subscription windows; discard every other statusline field. */
9
+ export function parseClaudeStatuslineQuota(value, observedAt = new Date()) {
10
+ const root = object(value);
11
+ const limits = object(root?.["rate_limits"]);
12
+ if (!limits)
13
+ return null;
14
+ const constraints = [
15
+ parseWindow(limits["five_hour"], "five_hour", "5 hour", 5 * 60 * 60),
16
+ parseWindow(limits["seven_day"], "seven_day", "7 day", 7 * 24 * 60 * 60),
17
+ ].filter((item) => item !== null);
18
+ if (constraints.length === 0)
19
+ return null;
20
+ return QuotaSnapshotSchema.parse({
21
+ subject: {
22
+ harness: "claude",
23
+ credential_route: "vendor_native",
24
+ plan_label: null,
25
+ subject_id: null,
26
+ },
27
+ constraints,
28
+ source: SOURCE,
29
+ observed_at: observedAt.toISOString(),
30
+ freshness: "fresh",
31
+ });
32
+ }
33
+ export function ingestClaudeStatuslineQuota(value, observedAt = new Date()) {
34
+ const snapshot = parseClaudeStatuslineQuota(value, observedAt);
35
+ if (!snapshot)
36
+ return null;
37
+ writeJson(claudeStatuslineSnapshotPath(), snapshot);
38
+ return snapshot;
39
+ }
40
+ /** Daemon refresher: the spool is Claudexor-owned and contains no raw statusline payload. */
41
+ export async function refreshClaudeStatuslineQuota() {
42
+ const parsed = readJsonSafe(claudeStatuslineSnapshotPath());
43
+ const snapshot = QuotaSnapshotSchema.safeParse(parsed);
44
+ if (!snapshot.success)
45
+ throw new Error("Claude statusline quota is not available");
46
+ return [snapshot.data];
47
+ }
48
+ export async function runClaudeStatuslineCollector(rawInput, upstreamBase64) {
49
+ let snapshot = null;
50
+ try {
51
+ snapshot = ingestClaudeStatuslineQuota(JSON.parse(rawInput));
52
+ }
53
+ catch {
54
+ // Statusline telemetry must never break or replace the user's display command.
55
+ }
56
+ if (upstreamBase64) {
57
+ const upstream = Buffer.from(upstreamBase64, "base64url").toString("utf8");
58
+ if (upstream)
59
+ await runUpstream(upstream, rawInput);
60
+ return;
61
+ }
62
+ if (snapshot) {
63
+ const summary = snapshot.constraints
64
+ .map((item) => `${item.label}: ${Math.round((item.used_ratio ?? 0) * 100)}%`)
65
+ .join(" · ");
66
+ process.stdout.write(`Claude quota · ${summary}\n`);
67
+ }
68
+ }
69
+ /** Explicit `plugin install claude` lifecycle; no project settings or credential/session files. */
70
+ export function manageClaudeStatusline(verb, runtime, sink) {
71
+ try {
72
+ const settingsPath = join(runtime.home, ".claude", "settings.json");
73
+ const statePath = join(runtime.configDir, "plugins", "claude-statusline.json");
74
+ const settings = readSettings(settingsPath);
75
+ const current = statusLine(settings["statusLine"]);
76
+ const state = readState(statePath);
77
+ if (verb !== "uninstall" && settings["disableAllHooks"] === true) {
78
+ sink.errors.push("Claude disableAllHooks=true disables statusLine; subscription quota remains unavailable");
79
+ return false;
80
+ }
81
+ if (verb === "status" || verb === "doctor") {
82
+ if (!state) {
83
+ sink.notes.push("Claude subscription quota statusline is not installed");
84
+ return false;
85
+ }
86
+ if (state.settings_path !== settingsPath ||
87
+ hashStatusLine(current) !== state.installed_hash) {
88
+ sink.errors.push("Claude statusLine changed outside Claudexor; leaving it untouched");
89
+ return false;
90
+ }
91
+ const desired = desiredStatusLine(runtime, statePrevious(state));
92
+ if (hashStatusLine(current) !== hashStatusLine(desired)) {
93
+ sink.notes.push("Claude quota statusline command is drifted");
94
+ return false;
95
+ }
96
+ sink.notes.push("Claude subscription quota source is composed through the user statusLine");
97
+ return true;
98
+ }
99
+ if (verb === "uninstall") {
100
+ if (!state)
101
+ return true;
102
+ if (state.settings_path !== settingsPath ||
103
+ hashStatusLine(current) !== state.installed_hash) {
104
+ sink.errors.push("Claude statusLine changed outside Claudexor; refusing to overwrite it");
105
+ return false;
106
+ }
107
+ if (!runtime.dryRun) {
108
+ if (state.has_previous)
109
+ settings["statusLine"] = state.previous_status_line;
110
+ else
111
+ delete settings["statusLine"];
112
+ writeSettings(settingsPath, settings);
113
+ rmSync(statePath, { force: true });
114
+ }
115
+ sink.changed = true;
116
+ sink.actions.push(`${runtime.dryRun ? "would restore" : "restored"} the prior Claude statusLine`);
117
+ return true;
118
+ }
119
+ let previous;
120
+ if (state) {
121
+ if (state.settings_path !== settingsPath ||
122
+ hashStatusLine(current) !== state.installed_hash) {
123
+ sink.errors.push("Claude statusLine changed outside Claudexor; refusing to overwrite it");
124
+ return false;
125
+ }
126
+ previous = statePrevious(state);
127
+ }
128
+ else {
129
+ previous = current;
130
+ }
131
+ const desired = desiredStatusLine(runtime, previous);
132
+ if (hashStatusLine(current) === hashStatusLine(desired))
133
+ return true;
134
+ if (!runtime.dryRun) {
135
+ settings["statusLine"] = desired;
136
+ writeSettings(settingsPath, settings);
137
+ writeJson(statePath, {
138
+ version: 1,
139
+ settings_path: settingsPath,
140
+ installed_hash: hashStatusLine(desired),
141
+ has_previous: previous !== undefined,
142
+ ...(previous ? { previous_status_line: previous } : {}),
143
+ updated_at: new Date().toISOString(),
144
+ });
145
+ }
146
+ sink.changed = true;
147
+ sink.actions.push(`${runtime.dryRun ? "would compose" : "composed"} Claude subscription quota statusline${previous ? " with the existing command" : ""}`);
148
+ return true;
149
+ }
150
+ catch (error) {
151
+ sink.errors.push(error instanceof Error ? error.message : String(error));
152
+ return false;
153
+ }
154
+ }
155
+ export function claudeStatuslineSnapshotPath(configDir = userConfigDir()) {
156
+ return join(configDir, "quota", "claude-statusline.json");
157
+ }
158
+ function desiredStatusLine(runtime, previous) {
159
+ const encoded = previous ? ` ${Buffer.from(previous.command, "utf8").toString("base64url")}` : "";
160
+ return {
161
+ type: "command",
162
+ command: `${shellQuote(runtime.nodePath)} ${shellQuote(runtime.cliPath)} quota ingest-claude-statusline ${CLAUDE_STATUSLINE_MANAGED_ARG}${encoded}`,
163
+ ...(previous?.padding === undefined ? {} : { padding: previous.padding }),
164
+ };
165
+ }
166
+ function readSettings(path) {
167
+ if (!existsSync(path))
168
+ return {};
169
+ const stat = lstatSync(path);
170
+ if (!stat.isFile() || stat.isSymbolicLink())
171
+ throw new Error(`${path} is not a regular settings file`);
172
+ const value = JSON.parse(readFileSync(path, "utf8"));
173
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
174
+ throw new Error(`${path} is not a Claude settings JSON object`);
175
+ }
176
+ return value;
177
+ }
178
+ function writeSettings(path, settings) {
179
+ ensureDir(dirname(path));
180
+ writeJson(path, settings);
181
+ }
182
+ function readState(path) {
183
+ if (!existsSync(path))
184
+ return null;
185
+ const value = readJsonSafe(path);
186
+ if (!value ||
187
+ value.version !== 1 ||
188
+ typeof value.settings_path !== "string" ||
189
+ typeof value.installed_hash !== "string" ||
190
+ typeof value.has_previous !== "boolean") {
191
+ throw new Error(`${path} has unsupported Claude statusline state`);
192
+ }
193
+ if (value.has_previous && !statusLine(value.previous_status_line)) {
194
+ throw new Error(`${path} is missing its prior Claude statusLine`);
195
+ }
196
+ return value;
197
+ }
198
+ function statePrevious(state) {
199
+ return state.has_previous ? statusLine(state.previous_status_line) : undefined;
200
+ }
201
+ function statusLine(value) {
202
+ if (value === undefined)
203
+ return undefined;
204
+ const item = object(value);
205
+ if (!item ||
206
+ item["type"] !== "command" ||
207
+ typeof item["command"] !== "string" ||
208
+ !item["command"].trim() ||
209
+ (item["padding"] !== undefined &&
210
+ (typeof item["padding"] !== "number" || !Number.isFinite(item["padding"])))) {
211
+ throw new Error("Claude statusLine is not a supported command configuration; leaving it untouched");
212
+ }
213
+ return {
214
+ type: "command",
215
+ command: item["command"],
216
+ ...(item["padding"] === undefined ? {} : { padding: item["padding"] }),
217
+ };
218
+ }
219
+ function hashStatusLine(value) {
220
+ return sha256(JSON.stringify(value ?? null));
221
+ }
222
+ function shellQuote(value) {
223
+ return `'${value.replaceAll("'", `'"'"'`)}'`;
224
+ }
225
+ function object(value) {
226
+ return value && typeof value === "object" && !Array.isArray(value)
227
+ ? value
228
+ : null;
229
+ }
230
+ function parseWindow(value, id, label, windowSeconds) {
231
+ const item = object(value);
232
+ if (!item)
233
+ return null;
234
+ const used = item["used_percentage"];
235
+ if (typeof used !== "number" || !Number.isFinite(used) || used < 0 || used > 100)
236
+ return null;
237
+ const reset = item["resets_at"];
238
+ const resetsAt = typeof reset === "number" && Number.isFinite(reset) && reset > 0
239
+ ? new Date(reset * 1000).toISOString()
240
+ : null;
241
+ return {
242
+ id,
243
+ label,
244
+ used_ratio: used / 100,
245
+ window_seconds: windowSeconds,
246
+ resets_at: resetsAt,
247
+ cooldown_until: null,
248
+ };
249
+ }
250
+ async function runUpstream(command, input) {
251
+ await new Promise((resolve) => {
252
+ const child = spawn(command, { shell: true, stdio: ["pipe", "pipe", "ignore"] });
253
+ child.stdout.pipe(process.stdout, { end: false });
254
+ child.once("error", () => resolve());
255
+ child.once("exit", () => resolve());
256
+ child.stdin.end(input);
257
+ });
258
+ }
259
+ //# sourceMappingURL=claude-statusline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-statusline.js","sourceRoot":"","sources":["../src/claude-statusline.ts"],"names":[],"mappings":"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"}