openlimiter 0.1.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { type ProviderFailure, type Snapshot } from "@openlimiter/core";
1
2
  import { type CredentialStore } from "./credentials.js";
2
3
  import { type QuotaServerHandle } from "./serve.js";
3
4
  export interface CliDependencies {
@@ -18,9 +19,11 @@ export interface CliDependencies {
18
19
  /**
19
20
  * Whether output may carry terminal colour.
20
21
  *
21
- * The QR symbol the serve command prints has to state its own black and
22
- * white, because a dark themed terminal would otherwise invert it and no
23
- * camera would read it.
22
+ * Two surfaces depend on it. The QR symbol the serve command prints has to
23
+ * state its own black and white, because a dark themed terminal would
24
+ * otherwise invert it and no camera would read it. The meter bars and the
25
+ * failure lines use it to choose between escape codes and plain ASCII, so a
26
+ * capture redirected into a file carries no control characters at all.
24
27
  */
25
28
  colorOutput: boolean;
26
29
  /**
@@ -41,5 +44,10 @@ export declare const EXIT_OK = 0;
41
44
  export declare const EXIT_FAILURE = 1;
42
45
  export declare const EXIT_USAGE = 2;
43
46
  export declare const EXIT_NO_DATA = 3;
47
+ export interface RefreshResult {
48
+ snapshots: Snapshot[];
49
+ /** Only genuine failures. A connector offered nothing is not one. */
50
+ failures: readonly ProviderFailure[];
51
+ }
44
52
  export declare function runCli(argumentsList: readonly string[], overrides?: Partial<CliDependencies>): Promise<CliResult>;
45
53
  //# sourceMappingURL=cli.d.ts.map
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAuCA,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAC1D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,eAAe,CAAC;IACjC,eAAe,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5C;;;;;;OAMG;IACH,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAChD;;;;;;OAMG;IACH,WAAW,EAAE,OAAO,CAAC;IACrB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;CACnD;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qEAAqE;AACrE,eAAO,MAAM,OAAO,IAAI,CAAC;AACzB,eAAO,MAAM,YAAY,IAAI,CAAC;AAC9B,eAAO,MAAM,UAAU,IAAI,CAAC;AAC5B,eAAO,MAAM,YAAY,IAAI,CAAC;AA4W9B,wBAAsB,MAAM,CAC1B,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,SAAS,GAAE,OAAO,CAAC,eAAe,CAAM,GACvC,OAAO,CAAC,SAAS,CAAC,CA8CpB"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAcL,KAAK,eAAe,EAEpB,KAAK,QAAQ,EACd,MAAM,mBAAmB,CAAC;AA4C3B,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,YAAY,CAAC;AAYpB,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAC1D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,eAAe,CAAC;IACjC,eAAe,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5C;;;;;;OAMG;IACH,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAChD;;;;;;;;OAQG;IACH,WAAW,EAAE,OAAO,CAAC;IACrB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;CACnD;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qEAAqE;AACrE,eAAO,MAAM,OAAO,IAAI,CAAC;AACzB,eAAO,MAAM,YAAY,IAAI,CAAC;AAC9B,eAAO,MAAM,UAAU,IAAI,CAAC;AAC5B,eAAO,MAAM,YAAY,IAAI,CAAC;AA6C9B,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,qEAAqE;IACrE,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAC;CACtC;AA8iBD,wBAAsB,MAAM,CAC1B,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,SAAS,GAAE,OAAO,CAAC,eAAe,CAAM,GACvC,OAAO,CAAC,SAAS,CAAC,CAiDpB"}
package/dist/cli.js CHANGED
@@ -1,10 +1,12 @@
1
- import { PROVIDER_CODES, buildAdvice, canonicalJson, floorFixed, freshness, mergeSnapshots, normalizeMeters, readSnapshotCache } from "@openlimiter/core";
1
+ import { PROVIDER_CODES, buildAdvice, canonicalJson, dedupeFailures, failureFromConnectorReason, freshness, mergeSnapshots, normalizeMeters, normalizeMetersReport, readSnapshotCache } from "@openlimiter/core";
2
2
  import { antigravityFixture, claudeFixture, codexFixture, connectors, manualFixture, opencodeFixture, openrouterFixture, parseAntigravityPayload, parseClaudePayload, parseCodexPayload, parseManualPayload, parseOpencodePayload, parseOpenrouterPayload } from "@openlimiter/connectors";
3
3
  import { agentContextFromCache, renderClaudeStatusline } from "@openlimiter/adapters";
4
- import { initialize } from "./config.js";
5
- import { environmentWithLocalMarkers, parseJsonText, persistSnapshots, readManualDocument } from "./ingest.js";
4
+ import { STATUSLINE_KEYS, defaultConfig, initialize, isStatuslineKey, readConfig, readStatuslineConfig, setStatuslineValue, statuslineValueText, writeConfig } from "./config.js";
5
+ import { INGEST_PROVENANCE, MANUAL_PROVENANCE, STATUSLINE_PROVENANCE, environmentWithLocalMarkers, STDIN_BYTE_LIMIT, parseJsonText, persistSnapshots, readManualDocument, withProvenance } from "./ingest.js";
6
6
  import { UnavailableCredentialStore } from "./credentials.js";
7
7
  import { DEFAULT_SERVE_PORT, serveBanner, startQuotaServer } from "./serve.js";
8
+ import { failureLine, failureLines, renderTable, supportsColor } from "./render.js";
9
+ import { renderStatuslineLayout, statuslineColor } from "./statusline.js";
8
10
  /** Exit codes. Enumerated so a script can tell these cases apart. */
9
11
  export const EXIT_OK = 0;
10
12
  export const EXIT_FAILURE = 1;
@@ -18,7 +20,7 @@ function defaults() {
18
20
  now: () => new Date().toISOString(),
19
21
  payloads: {},
20
22
  readStandardInput: async () => null,
21
- colorOutput: process.stdout.isTTY === true
23
+ colorOutput: supportsColor(process.env, process.stdout.isTTY === true)
22
24
  };
23
25
  }
24
26
  function succeed(stdout) {
@@ -27,20 +29,11 @@ function succeed(stdout) {
27
29
  function fail(exitCode, message, stdout = "") {
28
30
  return { exitCode, stdout, stderr: message };
29
31
  }
30
- function renderTable(snapshots, now) {
31
- if (snapshots.length === 0)
32
- return "No bounded quota data is available.";
33
- const lines = ["PROVIDER METER USAGE STATE RESET"];
34
- for (const snapshot of snapshots) {
35
- lines.push([
36
- snapshot.provider,
37
- snapshot.meter,
38
- floorFixed(snapshot.value, 2) + snapshot.unit,
39
- freshness(snapshot.observedAt, snapshot.expiresAt, now),
40
- snapshot.resetAt ?? "NONE"
41
- ].join(" "));
42
- }
43
- return lines.join("\n");
32
+ /** Fold red failure lines onto the end of a block of output. */
33
+ function withFailures(body, failures, color) {
34
+ if (failures.length === 0)
35
+ return body;
36
+ return [body, ...failureLines(dedupeFailures(failures), color)].join("\n");
44
37
  }
45
38
  async function cachedSnapshots(directory) {
46
39
  const cached = await readSnapshotCache(directory);
@@ -56,26 +49,55 @@ function flagValue(argumentsList, flag) {
56
49
  * Payloads stay caller supplied. The one local source this command reads on its
57
50
  * own is the manual document in the state directory, which is the documented
58
51
  * way to feed a provider that has no interface at all.
52
+ *
53
+ * A connector that was handed nothing is not a failure and is never reported as
54
+ * one: nothing was offered, so nothing could fail. A connector that was handed
55
+ * something and refused it is a failure, and so is a meter that a connector
56
+ * recognised and the normalizer then threw out. Those two are the only things
57
+ * the human surfaces ever claim went wrong, because they are the only two this
58
+ * code can actually tell apart.
59
59
  */
60
60
  async function refresh(dependencies, now) {
61
61
  const supplied = dependencies.payloads["manual"];
62
62
  const manual = supplied === undefined
63
63
  ? await readManualDocument(dependencies.stateDirectory)
64
64
  : supplied;
65
+ /*
66
+ * The manual connector is the only one this command reads from disk on its
67
+ * own, so it is the only one whose provenance is the document. Everything
68
+ * else here was handed in by a caller, which is an import by any other name.
69
+ */
70
+ const manualFromDisk = supplied === undefined;
65
71
  const environment = await environmentWithLocalMarkers(dependencies.environment, dependencies.stateDirectory);
66
72
  const raw = [];
73
+ const failures = [];
67
74
  for (const connector of connectors) {
68
75
  const payload = connector.id === "manual"
69
76
  ? manual
70
77
  : dependencies.payloads[connector.id];
71
78
  const result = await connector.read({ payload, now, environment });
72
- if (result.ok)
73
- raw.push(...result.meters);
79
+ if (result.ok) {
80
+ const provenance = connector.id === "manual" && manualFromDisk
81
+ ? MANUAL_PROVENANCE
82
+ : INGEST_PROVENANCE;
83
+ raw.push(...withProvenance(result.meters, provenance));
84
+ continue;
85
+ }
86
+ if (payload === undefined)
87
+ continue;
88
+ failures.push({
89
+ provider: connector.id.toUpperCase(),
90
+ category: failureFromConnectorReason(result.reason)
91
+ });
74
92
  }
75
- const snapshots = normalizeMeters(raw);
76
- if (snapshots.length === 0)
77
- return [];
78
- return (await persistSnapshots(snapshots, dependencies.stateDirectory)).merged;
93
+ const report = normalizeMetersReport(raw);
94
+ for (const provider of report.rejected) {
95
+ failures.push({ provider, category: "VALIDATION_REJECTED" });
96
+ }
97
+ if (report.snapshots.length === 0)
98
+ return { snapshots: [], failures };
99
+ const persisted = await persistSnapshots(report.snapshots, dependencies.stateDirectory);
100
+ return { snapshots: persisted.merged, failures };
79
101
  }
80
102
  function demoSnapshots(now) {
81
103
  const raw = [
@@ -86,7 +108,7 @@ function demoSnapshots(now) {
86
108
  ...(parseOpencodePayload(opencodeFixture(now), now) ?? []),
87
109
  ...(parseManualPayload(manualFixture(now), now) ?? [])
88
110
  ];
89
- return normalizeMeters(raw);
111
+ return normalizeMeters(withProvenance(raw, INGEST_PROVENANCE));
90
112
  }
91
113
  function doctorRows(snapshots, environment, now) {
92
114
  const lines = ["CONNECTOR DETECTED FRESHNESS DRIFT"];
@@ -115,11 +137,14 @@ const help = [
115
137
  "openlimiter statusline",
116
138
  "openlimiter hook [--dry-run]",
117
139
  "openlimiter ingest [--provider <id>] [--payload <json>]",
140
+ "openlimiter config get statusline[.<key>]",
141
+ "openlimiter config set statusline.<key> <value>",
118
142
  "openlimiter doctor",
119
143
  "openlimiter demo",
120
144
  "openlimiter export",
121
145
  "openlimiter serve [--port <n>] [--host <address>] [--no-qr]",
122
146
  "",
147
+ "statusline keys: " + STATUSLINE_KEYS.join(", ") + ".",
123
148
  "statusline and ingest read JSON from standard input when it is piped in.",
124
149
  "serve publishes read only quota on your local network, behind a token that",
125
150
  "changes on every start. It is for a trusted network, not the internet.",
@@ -141,7 +166,9 @@ async function ingestStandardInput(dependencies, now) {
141
166
  const meters = parseClaudePayload(document.value, now);
142
167
  if (meters === null)
143
168
  return null;
144
- const incoming = normalizeMeters(meters);
169
+ /* Claude Code wrote this to our standard input in this session. It is the
170
+ one live reading the product currently has, and it says so. */
171
+ const incoming = normalizeMeters(withProvenance(meters, STATUSLINE_PROVENANCE));
145
172
  if (incoming.length === 0)
146
173
  return null;
147
174
  try {
@@ -171,9 +198,10 @@ async function initCommand(dependencies) {
171
198
  }
172
199
  }
173
200
  async function snapshotCommand(dependencies, argumentsList, now) {
201
+ let failures = [];
174
202
  if (argumentsList.includes("--refresh")) {
175
203
  try {
176
- await refresh(dependencies, now);
204
+ failures = (await refresh(dependencies, now)).failures;
177
205
  }
178
206
  catch {
179
207
  return fail(EXIT_FAILURE, "openlimiter snapshot: the cache could not be written.");
@@ -184,7 +212,7 @@ async function snapshotCommand(dependencies, argumentsList, now) {
184
212
  return fail(EXIT_FAILURE, "openlimiter snapshot: quota state could not be read.");
185
213
  }
186
214
  const snapshots = cached.ok ? cached.snapshots : [];
187
- const stdout = renderTable(snapshots, now);
215
+ const stdout = withFailures(renderTable(snapshots, now, dependencies.colorOutput), failures, dependencies.colorOutput);
188
216
  return snapshots.length === 0
189
217
  ? fail(EXIT_NO_DATA, "openlimiter snapshot: no bounded quota data is available.", stdout)
190
218
  : succeed(stdout);
@@ -200,14 +228,39 @@ async function exportCommand(dependencies) {
200
228
  ? fail(EXIT_NO_DATA, "openlimiter export: no bounded quota data is available.", stdout)
201
229
  : succeed(stdout);
202
230
  }
231
+ /** The label a cache level failure is printed against, in place of a provider. */
232
+ const CACHE_SUBJECT = "CACHE";
233
+ /**
234
+ * What doctor can honestly say went wrong.
235
+ *
236
+ * The cache is the only thing this command reads, so it is the only thing it
237
+ * reports on, and it reports against the cache rather than against a provider
238
+ * because it cannot know which provider a corrupt file was going to name. A
239
+ * cache that would not parse is unreadable, a cache that parsed with rows
240
+ * thrown out is a validation rejection, and a cache that is simply not there
241
+ * yet is neither: it is a tool that has not been given anything.
242
+ */
243
+ function cacheFailureCategory(cached) {
244
+ if (!cached.ok) {
245
+ return cached.reason === "missing" ? null : "PAYLOAD_UNREADABLE";
246
+ }
247
+ return cached.dropped === 0 ? null : "VALIDATION_REJECTED";
248
+ }
203
249
  async function doctorCommand(dependencies, now) {
204
250
  const environment = await environmentWithLocalMarkers(dependencies.environment, dependencies.stateDirectory);
205
251
  const cached = await readSnapshotCache(dependencies.stateDirectory);
206
252
  const snapshots = cached.ok ? cached.snapshots : [];
207
253
  const status = cached.ok ? "ok" : cached.reason;
208
254
  const dropped = cached.ok ? cached.dropped : 0;
209
- const stdout = doctorRows(snapshots, environment, now) +
210
- "\nCACHE " + status + " DROPPED " + String(dropped);
255
+ const lines = [
256
+ doctorRows(snapshots, environment, now),
257
+ "CACHE " + status + " DROPPED " + String(dropped)
258
+ ];
259
+ const category = cacheFailureCategory(cached);
260
+ if (category !== null) {
261
+ lines.push(failureLine(CACHE_SUBJECT, category, dependencies.colorOutput));
262
+ }
263
+ const stdout = lines.join("\n");
211
264
  if (!cached.ok && cached.reason !== "missing") {
212
265
  return fail(EXIT_FAILURE, "openlimiter doctor: quota state could not be read.", stdout);
213
266
  }
@@ -231,14 +284,24 @@ async function ingestCommand(dependencies, argumentsList, now) {
231
284
  return fail(EXIT_USAGE, "openlimiter ingest: the payload flag needs a value.");
232
285
  }
233
286
  const text = inline ?? await dependencies.readStandardInput();
234
- const document = parseJsonText(text);
235
- if (!document.ok) {
236
- return text === null || text.trim() === ""
237
- ? fail(EXIT_USAGE, "openlimiter ingest: no input was supplied on standard input.")
238
- : fail(EXIT_FAILURE, "openlimiter ingest: input is not valid JSON.");
287
+ if (text === null || text.trim() === "") {
288
+ return fail(EXIT_USAGE, "openlimiter ingest: no input was supplied on standard input.");
239
289
  }
290
+ /*
291
+ * The connector says what its payload IS, and this boundary obeys it.
292
+ *
293
+ * Assuming JSON here made the OpenCode reader unreachable from this command
294
+ * entirely: its payload is a logged in HTML page, so every real capture died
295
+ * at JSON.parse with "input is not valid JSON" and no page could ever be
296
+ * ingested. A text connector is handed the raw text, bounded exactly as the
297
+ * JSON path is bounded, and nothing is parsed on its behalf.
298
+ */
240
299
  let meters;
241
300
  if (provider === undefined) {
301
+ const document = parseJsonText(text);
302
+ if (!document.ok) {
303
+ return fail(EXIT_FAILURE, "openlimiter ingest: input is not valid JSON.");
304
+ }
242
305
  meters = parseManualPayload(document.value, now);
243
306
  }
244
307
  else {
@@ -246,14 +309,35 @@ async function ingestCommand(dependencies, argumentsList, now) {
246
309
  if (connector === undefined) {
247
310
  return fail(EXIT_USAGE, "openlimiter ingest: unknown provider.");
248
311
  }
312
+ let payload;
313
+ if (connector.encoding === "text") {
314
+ if (text.length > STDIN_BYTE_LIMIT) {
315
+ return fail(EXIT_FAILURE, "openlimiter ingest: input is larger than accepted.");
316
+ }
317
+ payload = text;
318
+ }
319
+ else {
320
+ const document = parseJsonText(text);
321
+ if (!document.ok) {
322
+ return fail(EXIT_FAILURE, "openlimiter ingest: input is not valid JSON.");
323
+ }
324
+ payload = document.value;
325
+ }
249
326
  const result = await connector.read({
250
- payload: document.value,
327
+ payload,
251
328
  now,
252
329
  environment: dependencies.environment
253
330
  });
254
331
  meters = result.ok ? result.meters : null;
255
332
  }
256
- const incoming = meters === null ? [] : normalizeMeters([...meters]);
333
+ /*
334
+ * However this document reached the command, a person handed it over. It is
335
+ * an import, not a live reading, whichever connector parsed it, and a card
336
+ * that showed it as live would be the exact claim this wave exists to stop.
337
+ */
338
+ const incoming = meters === null
339
+ ? []
340
+ : normalizeMeters(withProvenance(meters, INGEST_PROVENANCE));
257
341
  if (incoming.length === 0) {
258
342
  return fail(EXIT_FAILURE, "openlimiter ingest: no bounded meter survived validation.");
259
343
  }
@@ -266,6 +350,115 @@ async function ingestCommand(dependencies, argumentsList, now) {
266
350
  return fail(EXIT_FAILURE, "openlimiter ingest: the cache could not be written.");
267
351
  }
268
352
  }
353
+ /**
354
+ * Draw the statusline.
355
+ *
356
+ * Standard input first, so a Claude Code session payload is ingested and drawn
357
+ * in the same call, then the cache. The layout comes from the configuration
358
+ * file and the fallback is the layout's own default, so a machine with no
359
+ * configuration still gets bars.
360
+ *
361
+ * `bars false` hands the whole job back to the adapter that produced the 0.1.0
362
+ * line. That path is byte for byte what it always was, which is the point of
363
+ * keeping it: it is the escape hatch for anything already parsing this output.
364
+ */
365
+ async function statuslineCommand(dependencies, now) {
366
+ const ingested = await ingestStandardInput(dependencies, now);
367
+ const snapshots = ingested ?? await cachedSnapshots(dependencies.stateDirectory);
368
+ const advice = buildAdvice(snapshots, now, PROVIDER_CODES);
369
+ const config = await readStatuslineConfig(dependencies.stateDirectory);
370
+ if (!config.bars)
371
+ return succeed(renderClaudeStatusline(advice));
372
+ return succeed(renderStatuslineLayout({
373
+ advice,
374
+ snapshots,
375
+ now,
376
+ config,
377
+ color: statuslineColor(config.color, dependencies.environment, dependencies.colorOutput)
378
+ }));
379
+ }
380
+ /* --------------------------------------------------------------- config */
381
+ /** The one section this command reads and writes. */
382
+ const CONFIG_SECTION = "statusline";
383
+ const configUsage = [
384
+ "openlimiter config: use one of",
385
+ " openlimiter config get statusline[.<key>]",
386
+ " openlimiter config set statusline.<key> <value>",
387
+ "Keys: " + STATUSLINE_KEYS.join(", ") + "."
388
+ ].join("\n");
389
+ /**
390
+ * Split `statusline.width` into its section and its key.
391
+ *
392
+ * A bare section name is a request for every key in it. Anything that is not
393
+ * the statusline section is refused rather than guessed at, because the config
394
+ * file also records connector detection and that is written by init, not by
395
+ * hand.
396
+ */
397
+ function parseConfigPath(target) {
398
+ if (target === undefined || target === "")
399
+ return null;
400
+ const separator = target.indexOf(".");
401
+ if (separator < 0)
402
+ return { section: target, key: null };
403
+ return {
404
+ section: target.slice(0, separator),
405
+ key: target.slice(separator + 1)
406
+ };
407
+ }
408
+ function configGet(keys, statusline) {
409
+ return keys
410
+ .map((key) => CONFIG_SECTION + "." + key + "=" + statuslineValueText(statusline, key))
411
+ .join("\n");
412
+ }
413
+ /**
414
+ * Read or change the statusline layout.
415
+ *
416
+ * The configuration file is the only thing this command touches, one key at a
417
+ * time, and every value is validated before it is written. A rejected value
418
+ * exits 2 and names what it would have accepted; nothing partial is ever
419
+ * written, because the write replaces the whole document atomically.
420
+ */
421
+ async function configCommand(dependencies, argumentsList) {
422
+ const action = argumentsList[1];
423
+ if (action !== "get" && action !== "set") {
424
+ return fail(EXIT_USAGE, configUsage);
425
+ }
426
+ const target = parseConfigPath(argumentsList[2]);
427
+ if (target === null || target.section !== CONFIG_SECTION) {
428
+ return fail(EXIT_USAGE, "openlimiter config: only the statusline section can be read or written.");
429
+ }
430
+ if (target.key !== null && !isStatuslineKey(target.key)) {
431
+ return fail(EXIT_USAGE, "openlimiter config: unknown statusline key. Known keys: " +
432
+ STATUSLINE_KEYS.join(", ") + ".");
433
+ }
434
+ const stored = await readConfig(dependencies.stateDirectory);
435
+ if (!stored.ok && stored.reason !== "missing") {
436
+ return fail(EXIT_FAILURE, "openlimiter config: configuration could not be read.");
437
+ }
438
+ const config = stored.ok
439
+ ? stored.config
440
+ : defaultConfig(dependencies.environment);
441
+ if (action === "get") {
442
+ return succeed(configGet(target.key === null ? STATUSLINE_KEYS : [target.key], config.statusline));
443
+ }
444
+ if (target.key === null) {
445
+ return fail(EXIT_USAGE, "openlimiter config: set needs a key, as in statusline.width.");
446
+ }
447
+ const value = argumentsList[3];
448
+ if (value === undefined) {
449
+ return fail(EXIT_USAGE, "openlimiter config: set needs a value.");
450
+ }
451
+ const update = setStatuslineValue(config.statusline, target.key, value);
452
+ if (!update.ok)
453
+ return fail(EXIT_USAGE, "openlimiter config: " + update.message);
454
+ try {
455
+ await writeConfig({ ...config, statusline: update.statusline }, dependencies.stateDirectory);
456
+ }
457
+ catch {
458
+ return fail(EXIT_FAILURE, "openlimiter config: configuration could not be written.");
459
+ }
460
+ return succeed(configGet([target.key], update.statusline));
461
+ }
269
462
  /**
270
463
  * Publish the cached quota on the local network, read only.
271
464
  *
@@ -315,17 +508,19 @@ export async function runCli(argumentsList, overrides = {}) {
315
508
  return await snapshotCommand(dependencies, argumentsList, now);
316
509
  }
317
510
  if (command === "statusline") {
318
- const ingested = await ingestStandardInput(dependencies, now);
319
- const snapshots = ingested ?? await cachedSnapshots(dependencies.stateDirectory);
320
- return succeed(renderClaudeStatusline(buildAdvice(snapshots, now, PROVIDER_CODES)));
511
+ return await statuslineCommand(dependencies, now);
512
+ }
513
+ if (command === "config") {
514
+ return await configCommand(dependencies, argumentsList);
321
515
  }
322
516
  if (command === "hook") {
323
517
  return succeed(await agentContextFromCache(dependencies.stateDirectory, now, PROVIDER_CODES));
324
518
  }
325
519
  if (command === "doctor")
326
520
  return await doctorCommand(dependencies, now);
327
- if (command === "demo")
328
- return succeed(renderTable(demoSnapshots(now), now));
521
+ if (command === "demo") {
522
+ return succeed(renderTable(demoSnapshots(now), now, dependencies.colorOutput));
523
+ }
329
524
  if (command === "export")
330
525
  return await exportCommand(dependencies);
331
526
  if (command === "ingest") {
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,WAAW,EACX,aAAa,EACb,cAAc,EACd,0BAA0B,EAC1B,SAAS,EACT,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,iBAAiB,EAOlB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,UAAU,EACV,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACvB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,eAAe,EACf,aAAa,EACb,UAAU,EACV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,EAGZ,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,2BAA2B,EAC3B,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,0BAA0B,EAE3B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAEjB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,WAAW,EACX,YAAY,EACZ,WAAW,EACX,aAAa,EACd,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,sBAAsB,EACtB,eAAe,EAChB,MAAM,iBAAiB,CAAC;AA0CzB,qEAAqE;AACrE,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC;AACzB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC;AAC9B,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC;AAC5B,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC;AAE9B,SAAS,QAAQ;IACf,OAAO;QACL,WAAW,EAAE,OAAO,CAAC,GAAG;QACxB,eAAe,EAAE,IAAI,0BAA0B,EAAE;QACjD,eAAe,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE;QAC/B,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,QAAQ,EAAE,EAAE;QACZ,iBAAiB,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;QACnC,WAAW,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC;KACvE,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,MAAc;IAC7B,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACnD,CAAC;AAED,SAAS,IAAI,CAAC,QAAgB,EAAE,OAAe,EAAE,MAAM,GAAG,EAAE;IAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC/C,CAAC;AAED,gEAAgE;AAChE,SAAS,YAAY,CACnB,IAAY,EACZ,QAAoC,EACpC,KAAc;IAEd,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,OAAO,CAAC,IAAI,EAAE,GAAG,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7E,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,SAAkB;IAC/C,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAClD,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3C,CAAC;AAED,SAAS,SAAS,CAChB,aAAgC,EAChC,IAAY;IAEZ,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AAC1D,CAAC;AAQD;;;;;;;;;;;;;GAaG;AACH,KAAK,UAAU,OAAO,CACpB,YAA6B,EAC7B,GAAW;IAEX,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,QAAQ,KAAK,SAAS;QACnC,CAAC,CAAC,MAAM,kBAAkB,CAAC,YAAY,CAAC,cAAc,CAAC;QACvD,CAAC,CAAC,QAAQ,CAAC;IACb;;;;OAIG;IACH,MAAM,cAAc,GAAG,QAAQ,KAAK,SAAS,CAAC;IAC9C,MAAM,WAAW,GAAG,MAAM,2BAA2B,CACnD,YAAY,CAAC,WAAW,EACxB,YAAY,CAAC,cAAc,CAC5B,CAAC;IACF,MAAM,GAAG,GAAe,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAsB,EAAE,CAAC;IACvC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,SAAS,CAAC,EAAE,KAAK,QAAQ;YACvC,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;QACnE,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACd,MAAM,UAAU,GAAG,SAAS,CAAC,EAAE,KAAK,QAAQ,IAAI,cAAc;gBAC5D,CAAC,CAAC,iBAAiB;gBACnB,CAAC,CAAC,iBAAiB,CAAC;YACtB,GAAG,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;YACvD,SAAS;QACX,CAAC;QACD,IAAI,OAAO,KAAK,SAAS;YAAE,SAAS;QACpC,QAAQ,CAAC,IAAI,CAAC;YACZ,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC,WAAW,EAAkB;YACpD,QAAQ,EAAE,0BAA0B,CAAC,MAAM,CAAC,MAAM,CAAC;SACpD,CAAC,CAAC;IACL,CAAC;IACD,MAAM,MAAM,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC1C,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvC,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,qBAAqB,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC;IACtE,MAAM,SAAS,GAAG,MAAM,gBAAgB,CACtC,MAAM,CAAC,SAAS,EAChB,YAAY,CAAC,cAAc,CAC5B,CAAC;IACF,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;AACnD,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,GAAG,GAAG;QACV,GAAG,CAAC,kBAAkB,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QACtD,GAAG,CAAC,sBAAsB,CAAC,iBAAiB,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QAC3D,GAAG,CAAC,iBAAiB,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QACpD,GAAG,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QAChE,GAAG,CAAC,oBAAoB,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QAC1D,GAAG,CAAC,kBAAkB,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;KACvD,CAAC;IACF,OAAO,eAAe,CAAC,cAAc,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,UAAU,CACjB,SAA8B,EAC9B,WAAyD,EACzD,GAAW;IAEX,MAAM,KAAK,GAAG,CAAC,oCAAoC,CAAC,CAAC;IACrD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAC,WAAW,EAAkB,CAAC;QAC5D,MAAM,MAAM,GAAG,SAAS;aACrB,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC;aACpD,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;QAC9E,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;YACpC,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;gBACxB,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,SAAS,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC;YACT,SAAS,CAAC,EAAE;YACZ,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;YAC5C,KAAK;YACL,YAAY;SACb,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACf,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,IAAI,GAAG;IACX,kBAAkB;IAClB,kCAAkC;IAClC,wBAAwB;IACxB,8BAA8B;IAC9B,yDAAyD;IACzD,2CAA2C;IAC3C,iDAAiD;IACjD,oBAAoB;IACpB,kBAAkB;IAClB,oBAAoB;IACpB,6DAA6D;IAC7D,EAAE;IACF,mBAAmB,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG;IACtD,0EAA0E;IAC1E,4EAA4E;IAC5E,wEAAwE;IACxE,qEAAqE;CACtE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb;;;;;;;GAOG;AACH,KAAK,UAAU,mBAAmB,CAChC,YAA6B,EAC7B,GAAW;IAEX,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,YAAY,CAAC,iBAAiB,EAAE,CAAC,CAAC;QACvE,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAC9B,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACvD,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QACjC;yEACiE;QACjE,MAAM,QAAQ,GAAG,eAAe,CAAC,cAAc,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC;QAChF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACvC,IAAI,CAAC;YACH,OAAO,CAAC,MAAM,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC;QAChF,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;YACpE,OAAO,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,YAA6B;IACtD,MAAM,WAAW,GAAG,MAAM,2BAA2B,CACnD,YAAY,CAAC,WAAW,EACxB,YAAY,CAAC,cAAc,CAC5B,CAAC;IACF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAC7B,WAAW,EACX,YAAY,CAAC,eAAe,EAC5B,YAAY,CAAC,eAAe,EAC5B,YAAY,CAAC,cAAc,CAC5B,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU;aACtC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC;aACzC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;aAChC,IAAI,CAAC,GAAG,CAAC,CAAC;QACb,OAAO,OAAO,CACZ,iCAAiC,GAAG,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAC1E,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,YAAY,EAAE,uDAAuD,CAAC,CAAC;IACrF,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,YAA6B,EAC7B,aAAgC,EAChC,GAAW;IAEX,IAAI,QAAQ,GAA+B,EAAE,CAAC;IAC9C,IAAI,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACxC,IAAI,CAAC;YACH,QAAQ,GAAG,CAAC,MAAM,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC,YAAY,EAAE,uDAAuD,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IACpE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9C,OAAO,IAAI,CAAC,YAAY,EAAE,sDAAsD,CAAC,CAAC;IACpF,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,MAAM,MAAM,GAAG,YAAY,CACzB,WAAW,CAAC,SAAS,EAAE,GAAG,EAAE,YAAY,CAAC,WAAW,CAAC,EACrD,QAAQ,EACR,YAAY,CAAC,WAAW,CACzB,CAAC;IACF,OAAO,SAAS,CAAC,MAAM,KAAK,CAAC;QAC3B,CAAC,CAAC,IAAI,CACF,YAAY,EACZ,2DAA2D,EAC3D,MAAM,CACP;QACH,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,YAA6B;IACxD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IACpE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9C,OAAO,IAAI,CAAC,YAAY,EAAE,oDAAoD,CAAC,CAAC;IAClF,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IACxC,OAAO,SAAS,CAAC,MAAM,KAAK,CAAC;QAC3B,CAAC,CAAC,IAAI,CACF,YAAY,EACZ,yDAAyD,EACzD,MAAM,CACP;QACH,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC;AAED,kFAAkF;AAClF,MAAM,aAAa,GAAG,OAAO,CAAC;AAE9B;;;;;;;;;GASG;AACH,SAAS,oBAAoB,CAC3B,MAAuB;IAEvB,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC;IACnE,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,qBAAqB,CAAC;AAC7D,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,YAA6B,EAC7B,GAAW;IAEX,MAAM,WAAW,GAAG,MAAM,2BAA2B,CACnD,YAAY,CAAC,WAAW,EACxB,YAAY,CAAC,cAAc,CAC5B,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;IAChD,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG;QACZ,UAAU,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,CAAC;QACvC,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC;KAClD,CAAC;IACF,MAAM,QAAQ,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,QAAQ,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC;IAC7E,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9C,OAAO,IAAI,CAAC,YAAY,EAAE,oDAAoD,EAAE,MAAM,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;AACzB,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,aAAa,CAC1B,YAA6B,EAC7B,aAAgC,EAChC,GAAW;IAEX,MAAM,QAAQ,GAAG,SAAS,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,SAAS,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IACrD,IAAI,aAAa,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACnE,OAAO,IAAI,CAAC,UAAU,EAAE,sDAAsD,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAChE,OAAO,IAAI,CAAC,UAAU,EAAE,qDAAqD,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,IAAI,MAAM,YAAY,CAAC,iBAAiB,EAAE,CAAC;IAC9D,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC,UAAU,EAAE,8DAA8D,CAAC,CAAC;IAC1F,CAAC;IACD;;;;;;;;OAQG;IACH,IAAI,MAAkC,CAAC;IACvC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC,YAAY,EAAE,8CAA8C,CAAC,CAAC;QAC5E,CAAC;QACD,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;QAC5E,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,UAAU,EAAE,uCAAuC,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,OAAgB,CAAC;QACrB,IAAI,SAAS,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;YAClC,IAAI,IAAI,CAAC,MAAM,GAAG,gBAAgB,EAAE,CAAC;gBACnC,OAAO,IAAI,CAAC,YAAY,EAAE,oDAAoD,CAAC,CAAC;YAClF,CAAC;YACD,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO,IAAI,CAAC,YAAY,EAAE,8CAA8C,CAAC,CAAC;YAC5E,CAAC;YACD,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC3B,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC;YAClC,OAAO;YACP,GAAG;YACH,WAAW,EAAE,YAAY,CAAC,WAAW;SACtC,CAAC,CAAC;QACH,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5C,CAAC;IACD;;;;OAIG;IACH,MAAM,QAAQ,GAAG,MAAM,KAAK,IAAI;QAC9B,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,eAAe,CAAC,cAAc,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC/D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CACT,YAAY,EACZ,2DAA2D,CAC5D,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,cAAc,CAAC,CAAC;QAChF,OAAO,OAAO,CACZ,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACrC,kCAAkC,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAC3E,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,YAAY,EAAE,qDAAqD,CAAC,CAAC;IACnF,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,KAAK,UAAU,iBAAiB,CAC9B,YAA6B,EAC7B,GAAW;IAEX,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,QAAQ,IAAI,MAAM,eAAe,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IACjF,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IACvE,IAAI,CAAC,MAAM,CAAC,IAAI;QAAE,OAAO,OAAO,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC;IACjE,OAAO,OAAO,CAAC,sBAAsB,CAAC;QACpC,MAAM;QACN,SAAS;QACT,GAAG;QACH,MAAM;QACN,KAAK,EAAE,eAAe,CACpB,MAAM,CAAC,KAAK,EACZ,YAAY,CAAC,WAAW,EACxB,YAAY,CAAC,WAAW,CACzB;KACF,CAAC,CAAC,CAAC;AACN,CAAC;AAED,4EAA4E;AAE5E,qDAAqD;AACrD,MAAM,cAAc,GAAG,YAAY,CAAC;AAEpC,MAAM,WAAW,GAAG;IAClB,gCAAgC;IAChC,6CAA6C;IAC7C,mDAAmD;IACnD,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG;CAC5C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb;;;;;;;GAOG;AACH,SAAS,eAAe,CACtB,MAA0B;IAE1B,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACvD,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,SAAS,GAAG,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IACzD,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC;QACnC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;KACjC,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAChB,IAA8B,EAC9B,UAA4B;IAE5B,OAAO,IAAI;SACR,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,mBAAmB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;SACrF,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,aAAa,CAC1B,YAA6B,EAC7B,aAAgC;IAEhC,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,MAAM,GAAG,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,OAAO,KAAK,cAAc,EAAE,CAAC;QACzD,OAAO,IAAI,CACT,UAAU,EACV,yEAAyE,CAC1E,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QACxD,OAAO,IAAI,CACT,UAAU,EACV,0DAA0D;YACxD,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CACnC,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IAC7D,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9C,OAAO,IAAI,CAAC,YAAY,EAAE,sDAAsD,CAAC,CAAC;IACpF,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE;QACtB,CAAC,CAAC,MAAM,CAAC,MAAM;QACf,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;IAC5C,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,OAAO,CAAC,SAAS,CACtB,MAAM,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EACpD,MAAM,CAAC,UAAU,CAClB,CAAC,CAAC;IACL,CAAC;IACD,IAAI,MAAM,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;QACxB,OAAO,IAAI,CACT,UAAU,EACV,8DAA8D,CAC/D,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,UAAU,EAAE,wCAAwC,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACxE,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC,UAAU,EAAE,sBAAsB,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IACjF,IAAI,CAAC;QACH,MAAM,WAAW,CACf,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,EAC5C,YAAY,CAAC,cAAc,CAC5B,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,YAAY,EAAE,yDAAyD,CAAC,CAAC;IACvF,CAAC;IACD,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,YAAY,CACzB,YAA6B,EAC7B,aAAgC;IAEhC,MAAM,QAAQ,GAAG,SAAS,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IACpD,IAAI,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC/D,OAAO,IAAI,CAAC,UAAU,EAAE,iDAAiD,CAAC,CAAC;IAC7E,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5E,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,MAAM,EAAE,CAAC;QACzD,OAAO,IAAI,CACT,UAAU,EACV,qEAAqE,CACtE,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,SAAS,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IAChD,IAAI,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAC3D,OAAO,IAAI,CAAC,UAAU,EAAE,iDAAiD,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC;YACpC,IAAI;YACJ,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YACvC,cAAc,EAAE,YAAY,CAAC,cAAc;YAC3C,GAAG,EAAE,YAAY,CAAC,GAAG;SACtB,CAAC,CAAC;QACH,YAAY,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC;QACnC,OAAO,OAAO,CACZ,WAAW,CAAC,MAAM,EAAE;YAClB,KAAK,EAAE,YAAY,CAAC,WAAW;YAC/B,SAAS,EAAE,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC;SAC7C,CAAC,CACH,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CACT,YAAY,EACZ,+DAA+D,CAChE,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,aAAgC,EAChC,YAAsC,EAAE;IAExC,MAAM,YAAY,GAAG,EAAE,GAAG,QAAQ,EAAE,EAAE,GAAG,SAAS,EAAE,CAAC;IACrD,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;IAC3C,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,CAAC;IAC/B,IAAI,CAAC;QACH,IAAI,OAAO,KAAK,MAAM;YAAE,OAAO,MAAM,WAAW,CAAC,YAAY,CAAC,CAAC;QAC/D,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;YAC3B,OAAO,MAAM,eAAe,CAAC,YAAY,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;YAC7B,OAAO,MAAM,iBAAiB,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;YACzB,OAAO,MAAM,aAAa,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YACvB,OAAO,OAAO,CAAC,MAAM,qBAAqB,CACxC,YAAY,CAAC,cAAc,EAC3B,GAAG,EACH,cAAc,CACf,CAAC,CAAC;QACL,CAAC;QACD,IAAI,OAAO,KAAK,QAAQ;YAAE,OAAO,MAAM,aAAa,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QACxE,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YACvB,OAAO,OAAO,CACZ,WAAW,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,YAAY,CAAC,WAAW,CAAC,CAC/D,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,KAAK,QAAQ;YAAE,OAAO,MAAM,aAAa,CAAC,YAAY,CAAC,CAAC;QACnE,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;YACzB,OAAO,MAAM,aAAa,CAAC,YAAY,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,OAAO,KAAK,OAAO;YAAE,OAAO,MAAM,YAAY,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;QAChF,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACnE,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,EAAE,+BAA+B,EAAE,IAAI,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP;;;;WAIG;QACH,IAAI,OAAO,KAAK,MAAM;YAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAC7E,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;YAC7B,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAC1E,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,EAAE,4CAA4C,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC"}
package/dist/config.d.ts CHANGED
@@ -1,16 +1,123 @@
1
1
  import type { CredentialStore } from "./credentials.js";
2
2
  export declare const CONFIG_FILE_NAME = "openlimiter-config.json";
3
+ /** Whether a provider with several meters shows one cell or all of them. */
4
+ export type StatuslineMeters = "worst" | "all";
5
+ /**
6
+ * When the statusline may paint.
7
+ *
8
+ * `auto` follows the terminal, which is what every other command does. It is
9
+ * the honest default and it is also the reason the other two exist: a
10
+ * statusline host captures the command's output rather than handing it a
11
+ * terminal, so `auto` resolves to no colour in exactly the place a person most
12
+ * wants colour. `always` is how you say the host understands escape codes.
13
+ * `never` is how you say it does not, whatever the terminal claims.
14
+ */
15
+ export type StatuslineColor = "auto" | "always" | "never";
16
+ export interface StatuslineConfig {
17
+ /**
18
+ * Provider ids, in the order they should appear.
19
+ *
20
+ * Empty means the built in order: subscription plans first, then the credit
21
+ * and API meters. A partial list is honoured as far as it goes and every
22
+ * provider it leaves out follows the built in order behind it.
23
+ */
24
+ readonly order: readonly string[];
25
+ readonly meters: StatuslineMeters;
26
+ /** The column budget one row may spend before the line stacks. */
27
+ readonly width: number;
28
+ readonly rows: 1 | 2;
29
+ /** False restores the single plain line released in 0.1.0. */
30
+ readonly bars: boolean;
31
+ readonly color: StatuslineColor;
32
+ }
33
+ export declare const STATUSLINE_KEYS: readonly ["order", "meters", "width", "rows", "bars", "color"];
34
+ export type StatuslineKey = (typeof STATUSLINE_KEYS)[number];
35
+ /**
36
+ * The narrowest and widest budget a row may be given.
37
+ *
38
+ * Below forty columns not one cell and its header fit, so the setting would
39
+ * only ever produce an empty row. Above four hundred the budget stops
40
+ * describing any real terminal and starts being a way to ask for an unbounded
41
+ * line, which this tool does not print.
42
+ */
43
+ export declare const MIN_STATUSLINE_WIDTH = 40;
44
+ export declare const MAX_STATUSLINE_WIDTH = 400;
45
+ export declare const DEFAULT_STATUSLINE: StatuslineConfig;
46
+ /**
47
+ * Read a stored statusline section, key by key, keeping what is usable.
48
+ *
49
+ * A key this does not understand falls back to its default rather than
50
+ * rejecting the file. The statusline is drawn inside somebody else's tool and
51
+ * a hand edited typo in one field is not a reason to stop drawing the other
52
+ * five. Everything written through `openlimiter config set` is validated
53
+ * before it lands, so this path only ever repairs a file edited by hand.
54
+ */
55
+ export declare function normalizeStatusline(value: unknown): StatuslineConfig;
56
+ /** One stored key, rendered the way `config get` prints it. */
57
+ export declare function statuslineValueText(statusline: StatuslineConfig, key: StatuslineKey): string;
58
+ export declare function isStatuslineKey(key: string): key is StatuslineKey;
59
+ export type StatuslineUpdate = {
60
+ ok: true;
61
+ statusline: StatuslineConfig;
62
+ } | {
63
+ ok: false;
64
+ message: string;
65
+ };
66
+ /**
67
+ * Apply one key from the command line, or say why it cannot be applied.
68
+ *
69
+ * Every rejection names the key and lists what it would have accepted, because
70
+ * a configuration error a person cannot fix from the message is a second
71
+ * problem on top of the first. No value is ever coerced into something near
72
+ * enough: a width of `wide` is refused rather than read as the default.
73
+ */
74
+ export declare function setStatuslineValue(statusline: StatuslineConfig, key: string, value: string): StatuslineUpdate;
75
+ export interface ConfigConnector {
76
+ id: string;
77
+ enabled: true;
78
+ detected: boolean;
79
+ }
3
80
  export interface OpenLimiterConfig {
4
81
  version: 1;
5
- connectors: readonly {
6
- id: string;
7
- enabled: true;
8
- detected: boolean;
9
- }[];
82
+ connectors: readonly ConfigConnector[];
83
+ statusline: StatuslineConfig;
10
84
  }
11
85
  export declare function writeConfig(config: OpenLimiterConfig, directory?: string): Promise<void>;
86
+ export type ConfigReadResult = {
87
+ ok: true;
88
+ config: OpenLimiterConfig;
89
+ } | {
90
+ ok: false;
91
+ reason: "missing" | "corrupt" | "unsafe";
92
+ };
93
+ /**
94
+ * Read the configuration file.
95
+ *
96
+ * The document is validated the same way the cache is: an unreadable or
97
+ * unsafe file is reported rather than replaced, and a readable file with a
98
+ * field this version does not recognise keeps the fields it does. A file that
99
+ * is simply not there yet is `missing`, which is not a failure.
100
+ */
101
+ export declare function readConfig(directory?: string): Promise<ConfigReadResult>;
102
+ /**
103
+ * The statusline section, or the defaults, and never an exception.
104
+ *
105
+ * The statusline command runs inside another tool's status row on every
106
+ * redraw. It reads its own configuration the way it reads everything else:
107
+ * if the answer is not there, the answer is the default, and the line is still
108
+ * drawn.
109
+ */
110
+ export declare function readStatuslineConfig(directory?: string): Promise<StatuslineConfig>;
12
111
  export declare function initialize(environment: Readonly<Record<string, string | undefined>>, credentialStore: CredentialStore, promptForSecret: () => Promise<string>, directory?: string): Promise<{
13
112
  config: OpenLimiterConfig;
14
113
  credentialStored: boolean;
15
114
  }>;
115
+ /**
116
+ * The configuration a `config set` writes into when there is no file yet.
117
+ *
118
+ * Connector detection is redone rather than left blank, so a first `config
119
+ * set` produces the same file `init` would have produced with the chosen key
120
+ * changed, instead of a file that claims no connector exists.
121
+ */
122
+ export declare function defaultConfig(environment: Readonly<Record<string, string | undefined>>): OpenLimiterConfig;
16
123
  //# sourceMappingURL=config.d.ts.map