axusage 3.8.1 → 3.8.3

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 (174) hide show
  1. package/README.md +19 -8
  2. package/dist/adapters/claude.d.ts +1 -0
  3. package/dist/adapters/claude.d.ts.map +1 -0
  4. package/dist/adapters/claude.js +1 -0
  5. package/dist/adapters/claude.js.map +1 -0
  6. package/dist/adapters/coalesce-claude-usage-response.d.ts +1 -0
  7. package/dist/adapters/coalesce-claude-usage-response.d.ts.map +1 -0
  8. package/dist/adapters/coalesce-claude-usage-response.js +1 -0
  9. package/dist/adapters/coalesce-claude-usage-response.js.map +1 -0
  10. package/dist/adapters/codex.d.ts +1 -0
  11. package/dist/adapters/codex.d.ts.map +1 -0
  12. package/dist/adapters/codex.js +1 -0
  13. package/dist/adapters/codex.js.map +1 -0
  14. package/dist/adapters/copilot.d.ts +1 -0
  15. package/dist/adapters/copilot.d.ts.map +1 -0
  16. package/dist/adapters/copilot.js +1 -0
  17. package/dist/adapters/copilot.js.map +1 -0
  18. package/dist/adapters/gemini.d.ts +1 -0
  19. package/dist/adapters/gemini.d.ts.map +1 -0
  20. package/dist/adapters/gemini.js +1 -0
  21. package/dist/adapters/gemini.js.map +1 -0
  22. package/dist/adapters/parse-claude-usage.d.ts +1 -0
  23. package/dist/adapters/parse-claude-usage.d.ts.map +1 -0
  24. package/dist/adapters/parse-claude-usage.js +1 -0
  25. package/dist/adapters/parse-claude-usage.js.map +1 -0
  26. package/dist/adapters/parse-codex-usage.d.ts +1 -0
  27. package/dist/adapters/parse-codex-usage.d.ts.map +1 -0
  28. package/dist/adapters/parse-codex-usage.js +1 -0
  29. package/dist/adapters/parse-codex-usage.js.map +1 -0
  30. package/dist/adapters/parse-copilot-usage.d.ts +1 -0
  31. package/dist/adapters/parse-copilot-usage.d.ts.map +1 -0
  32. package/dist/adapters/parse-copilot-usage.js +1 -0
  33. package/dist/adapters/parse-copilot-usage.js.map +1 -0
  34. package/dist/adapters/parse-gemini-usage.d.ts +1 -0
  35. package/dist/adapters/parse-gemini-usage.d.ts.map +1 -0
  36. package/dist/adapters/parse-gemini-usage.js +1 -0
  37. package/dist/adapters/parse-gemini-usage.js.map +1 -0
  38. package/dist/cli.d.ts +1 -0
  39. package/dist/cli.d.ts.map +1 -0
  40. package/dist/cli.js +3 -0
  41. package/dist/cli.js.map +1 -0
  42. package/dist/commands/auth-setup-command.d.ts +1 -0
  43. package/dist/commands/auth-setup-command.d.ts.map +1 -0
  44. package/dist/commands/auth-setup-command.js +1 -0
  45. package/dist/commands/auth-setup-command.js.map +1 -0
  46. package/dist/commands/auth-status-command.d.ts +1 -0
  47. package/dist/commands/auth-status-command.d.ts.map +1 -0
  48. package/dist/commands/auth-status-command.js +1 -0
  49. package/dist/commands/auth-status-command.js.map +1 -0
  50. package/dist/commands/fetch-service-usage.d.ts +5 -3
  51. package/dist/commands/fetch-service-usage.d.ts.map +1 -0
  52. package/dist/commands/fetch-service-usage.js +14 -27
  53. package/dist/commands/fetch-service-usage.js.map +1 -0
  54. package/dist/commands/run-auth-setup.d.ts +1 -0
  55. package/dist/commands/run-auth-setup.d.ts.map +1 -0
  56. package/dist/commands/run-auth-setup.js +1 -0
  57. package/dist/commands/run-auth-setup.js.map +1 -0
  58. package/dist/commands/serve-command.d.ts +2 -19
  59. package/dist/commands/serve-command.d.ts.map +1 -0
  60. package/dist/commands/serve-command.js +43 -104
  61. package/dist/commands/serve-command.js.map +1 -0
  62. package/dist/commands/usage-command.d.ts +3 -1
  63. package/dist/commands/usage-command.d.ts.map +1 -0
  64. package/dist/commands/usage-command.js +5 -0
  65. package/dist/commands/usage-command.js.map +1 -0
  66. package/dist/config/credential-sources.d.ts +1 -0
  67. package/dist/config/credential-sources.d.ts.map +1 -0
  68. package/dist/config/credential-sources.js +2 -0
  69. package/dist/config/credential-sources.js.map +1 -0
  70. package/dist/config/serve-config.d.ts +16 -0
  71. package/dist/config/serve-config.d.ts.map +1 -0
  72. package/dist/config/serve-config.js +58 -18
  73. package/dist/config/serve-config.js.map +1 -0
  74. package/dist/server/routes.d.ts +15 -8
  75. package/dist/server/routes.d.ts.map +1 -0
  76. package/dist/server/routes.js +112 -60
  77. package/dist/server/routes.js.map +1 -0
  78. package/dist/server/serve-logger.d.ts +5 -0
  79. package/dist/server/serve-logger.d.ts.map +1 -0
  80. package/dist/server/serve-logger.js +88 -0
  81. package/dist/server/serve-logger.js.map +1 -0
  82. package/dist/server/server.d.ts +15 -7
  83. package/dist/server/server.d.ts.map +1 -0
  84. package/dist/server/server.js +91 -56
  85. package/dist/server/server.js.map +1 -0
  86. package/dist/server/usage-cache.d.ts +26 -0
  87. package/dist/server/usage-cache.d.ts.map +1 -0
  88. package/dist/server/usage-cache.js +77 -0
  89. package/dist/server/usage-cache.js.map +1 -0
  90. package/dist/services/gemini-api.d.ts +1 -0
  91. package/dist/services/gemini-api.d.ts.map +1 -0
  92. package/dist/services/gemini-api.js +1 -0
  93. package/dist/services/gemini-api.js.map +1 -0
  94. package/dist/services/get-instance-access-token.d.ts +3 -1
  95. package/dist/services/get-instance-access-token.d.ts.map +1 -0
  96. package/dist/services/get-instance-access-token.js +1 -0
  97. package/dist/services/get-instance-access-token.js.map +1 -0
  98. package/dist/services/resolve-service-instances.d.ts +1 -0
  99. package/dist/services/resolve-service-instances.d.ts.map +1 -0
  100. package/dist/services/resolve-service-instances.js +1 -0
  101. package/dist/services/resolve-service-instances.js.map +1 -0
  102. package/dist/services/service-adapter-registry.d.ts +4 -2
  103. package/dist/services/service-adapter-registry.d.ts.map +1 -0
  104. package/dist/services/service-adapter-registry.js +4 -3
  105. package/dist/services/service-adapter-registry.js.map +1 -0
  106. package/dist/services/service-diagnostics.d.ts +1 -0
  107. package/dist/services/service-diagnostics.d.ts.map +1 -0
  108. package/dist/services/service-diagnostics.js +1 -0
  109. package/dist/services/service-diagnostics.js.map +1 -0
  110. package/dist/services/supported-service.d.ts +1 -0
  111. package/dist/services/supported-service.d.ts.map +1 -0
  112. package/dist/services/supported-service.js +6 -1
  113. package/dist/services/supported-service.js.map +1 -0
  114. package/dist/types/codex.d.ts +1 -0
  115. package/dist/types/codex.d.ts.map +1 -0
  116. package/dist/types/codex.js +1 -0
  117. package/dist/types/codex.js.map +1 -0
  118. package/dist/types/copilot.d.ts +1 -0
  119. package/dist/types/copilot.d.ts.map +1 -0
  120. package/dist/types/copilot.js +1 -0
  121. package/dist/types/copilot.js.map +1 -0
  122. package/dist/types/domain.d.ts +1 -0
  123. package/dist/types/domain.d.ts.map +1 -0
  124. package/dist/types/domain.js +1 -0
  125. package/dist/types/domain.js.map +1 -0
  126. package/dist/types/gemini.d.ts +1 -0
  127. package/dist/types/gemini.d.ts.map +1 -0
  128. package/dist/types/gemini.js +1 -0
  129. package/dist/types/gemini.js.map +1 -0
  130. package/dist/types/serve-api.d.ts +53 -0
  131. package/dist/types/serve-api.d.ts.map +1 -0
  132. package/dist/types/serve-api.js +34 -0
  133. package/dist/types/serve-api.js.map +1 -0
  134. package/dist/types/usage.d.ts +1 -0
  135. package/dist/types/usage.d.ts.map +1 -0
  136. package/dist/types/usage.js +1 -0
  137. package/dist/types/usage.js.map +1 -0
  138. package/dist/utils/calculate-usage-rate.d.ts +1 -0
  139. package/dist/utils/calculate-usage-rate.d.ts.map +1 -0
  140. package/dist/utils/calculate-usage-rate.js +1 -0
  141. package/dist/utils/calculate-usage-rate.js.map +1 -0
  142. package/dist/utils/check-cli-dependency.d.ts +1 -0
  143. package/dist/utils/check-cli-dependency.d.ts.map +1 -0
  144. package/dist/utils/check-cli-dependency.js +1 -0
  145. package/dist/utils/check-cli-dependency.js.map +1 -0
  146. package/dist/utils/classify-usage-rate.d.ts +1 -0
  147. package/dist/utils/classify-usage-rate.d.ts.map +1 -0
  148. package/dist/utils/classify-usage-rate.js +1 -0
  149. package/dist/utils/classify-usage-rate.js.map +1 -0
  150. package/dist/utils/color.d.ts +1 -0
  151. package/dist/utils/color.d.ts.map +1 -0
  152. package/dist/utils/color.js +1 -0
  153. package/dist/utils/color.js.map +1 -0
  154. package/dist/utils/copilot-gh-token.d.ts +1 -0
  155. package/dist/utils/copilot-gh-token.d.ts.map +1 -0
  156. package/dist/utils/copilot-gh-token.js +1 -0
  157. package/dist/utils/copilot-gh-token.js.map +1 -0
  158. package/dist/utils/format-prometheus-metrics.d.ts +1 -0
  159. package/dist/utils/format-prometheus-metrics.d.ts.map +1 -0
  160. package/dist/utils/format-prometheus-metrics.js +9 -2
  161. package/dist/utils/format-prometheus-metrics.js.map +1 -0
  162. package/dist/utils/format-requires-help-text.d.ts +1 -0
  163. package/dist/utils/format-requires-help-text.d.ts.map +1 -0
  164. package/dist/utils/format-requires-help-text.js +1 -0
  165. package/dist/utils/format-requires-help-text.js.map +1 -0
  166. package/dist/utils/format-service-usage.d.ts +3 -1
  167. package/dist/utils/format-service-usage.d.ts.map +1 -0
  168. package/dist/utils/format-service-usage.js +3 -2
  169. package/dist/utils/format-service-usage.js.map +1 -0
  170. package/dist/utils/validate-root-options.d.ts +1 -0
  171. package/dist/utils/validate-root-options.d.ts.map +1 -0
  172. package/dist/utils/validate-root-options.js +1 -0
  173. package/dist/utils/validate-root-options.js.map +1 -0
  174. package/package.json +16 -13
@@ -0,0 +1,5 @@
1
+ import type { FastifyBaseLogger } from "fastify";
2
+ export type ServeLogger = Pick<FastifyBaseLogger, "info" | "warn" | "error">;
3
+ export declare function createConsoleServeLogger(): ServeLogger;
4
+ export declare function createDeferredServeLogger(getLogger: () => FastifyBaseLogger | undefined): ServeLogger;
5
+ //# sourceMappingURL=serve-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve-logger.d.ts","sourceRoot":"","sources":["../../src/server/serve-logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;AAE7E,wBAAgB,wBAAwB,IAAI,WAAW,CAwBtD;AAED,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,MAAM,iBAAiB,GAAG,SAAS,GAC7C,WAAW,CAwDb"}
@@ -0,0 +1,88 @@
1
+ export function createConsoleServeLogger() {
2
+ return {
3
+ info(objectOrMessage, message) {
4
+ if (typeof objectOrMessage === "string") {
5
+ console.error(objectOrMessage);
6
+ return;
7
+ }
8
+ console.error(message ?? "", objectOrMessage);
9
+ },
10
+ warn(objectOrMessage, message) {
11
+ if (typeof objectOrMessage === "string") {
12
+ console.error(objectOrMessage);
13
+ return;
14
+ }
15
+ console.error(message ?? "", objectOrMessage);
16
+ },
17
+ error(objectOrMessage, message) {
18
+ if (typeof objectOrMessage === "string") {
19
+ console.error(objectOrMessage);
20
+ return;
21
+ }
22
+ console.error(message ?? "", objectOrMessage);
23
+ },
24
+ };
25
+ }
26
+ export function createDeferredServeLogger(getLogger) {
27
+ const fallback = createConsoleServeLogger();
28
+ return {
29
+ info(objectOrMessage, message) {
30
+ const logger = getLogger();
31
+ if (typeof objectOrMessage === "string") {
32
+ if (logger) {
33
+ logger.info(objectOrMessage);
34
+ }
35
+ else {
36
+ fallback.info(objectOrMessage);
37
+ }
38
+ return;
39
+ }
40
+ const resolvedMessage = message ?? "";
41
+ if (logger) {
42
+ logger.info(objectOrMessage, resolvedMessage);
43
+ }
44
+ else {
45
+ fallback.info(objectOrMessage, resolvedMessage);
46
+ }
47
+ },
48
+ warn(objectOrMessage, message) {
49
+ const logger = getLogger();
50
+ if (typeof objectOrMessage === "string") {
51
+ if (logger) {
52
+ logger.warn(objectOrMessage);
53
+ }
54
+ else {
55
+ fallback.warn(objectOrMessage);
56
+ }
57
+ return;
58
+ }
59
+ const resolvedMessage = message ?? "";
60
+ if (logger) {
61
+ logger.warn(objectOrMessage, resolvedMessage);
62
+ }
63
+ else {
64
+ fallback.warn(objectOrMessage, resolvedMessage);
65
+ }
66
+ },
67
+ error(objectOrMessage, message) {
68
+ const logger = getLogger();
69
+ if (typeof objectOrMessage === "string") {
70
+ if (logger) {
71
+ logger.error(objectOrMessage);
72
+ }
73
+ else {
74
+ fallback.error(objectOrMessage);
75
+ }
76
+ return;
77
+ }
78
+ const resolvedMessage = message ?? "";
79
+ if (logger) {
80
+ logger.error(objectOrMessage, resolvedMessage);
81
+ }
82
+ else {
83
+ fallback.error(objectOrMessage, resolvedMessage);
84
+ }
85
+ },
86
+ };
87
+ }
88
+ //# sourceMappingURL=serve-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve-logger.js","sourceRoot":"","sources":["../../src/server/serve-logger.ts"],"names":[],"mappings":"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"}
@@ -1,19 +1,27 @@
1
1
  /**
2
- * Express HTTP server for axusage metrics.
2
+ * Fastify HTTP server for axusage metrics.
3
3
  *
4
4
  * Designed for both CLI and library usage via factory pattern.
5
5
  */
6
- import { type Express, type Router } from "express";
6
+ import { type FastifyInstance } from "fastify";
7
+ import { type FastifyPluginCallbackZod } from "fastify-type-provider-zod";
7
8
  import type { ServeConfig } from "../config/serve-config.js";
8
- /** Server instance with lifecycle methods */
9
+ /**
10
+ * Server instance with lifecycle methods.
11
+ *
12
+ * Extend the server by passing plugins to {@link createServer}, not by
13
+ * mutating `app` directly — `start()` rebuilds the Fastify instance after
14
+ * a `stop()` call, so any ad-hoc additions would be lost.
15
+ */
9
16
  type AxusageServer = {
10
- /** The Express application instance */
11
- readonly app: Express;
12
- /** Start listening on the configured host:port */
17
+ /** The current Fastify application instance. Rebuilt after `stop()` + `start()`. */
18
+ readonly app: FastifyInstance;
19
+ /** Start listening on the configured host:port. Throws if already running. */
13
20
  start(): Promise<void>;
14
21
  /** Stop the server gracefully */
15
22
  stop(): Promise<void>;
16
23
  };
17
24
  /** Create an axusage server instance */
18
- export declare function createServer(config: Pick<ServeConfig, "port" | "host">, routers: Router[]): AxusageServer;
25
+ export declare function createServer(config: Pick<ServeConfig, "port" | "host" | "logLevel" | "trustProxy">, plugins: FastifyPluginCallbackZod[]): AxusageServer;
19
26
  export {};
27
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAgB,EAAqB,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EACL,KAAK,wBAAwB,EAM9B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE7D;;;;;;GAMG;AACH,KAAK,aAAa,GAAG;IACnB,oFAAoF;IACpF,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC;IAC9B,8EAA8E;IAC9E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,iCAAiC;IACjC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB,CAAC;AAgFF,wCAAwC;AACxC,wBAAgB,YAAY,CAC1B,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,YAAY,CAAC,EACtE,OAAO,EAAE,wBAAwB,EAAE,GAClC,aAAa,CA2Cf"}
@@ -1,72 +1,107 @@
1
1
  /**
2
- * Express HTTP server for axusage metrics.
2
+ * Fastify HTTP server for axusage metrics.
3
3
  *
4
4
  * Designed for both CLI and library usage via factory pattern.
5
5
  */
6
- import express, {} from "express";
7
- /** Create and configure Express application */
8
- function createApp(routers) {
9
- const app = express();
10
- // Security: disable X-Powered-By header
11
- app.disable("x-powered-by");
12
- // Register all routers
13
- for (const router of routers) {
14
- app.use(router);
6
+ import helmet from "@fastify/helmet";
7
+ import rateLimit from "@fastify/rate-limit";
8
+ import Fastify, {} from "fastify";
9
+ import { hasZodFastifySchemaValidationErrors, isResponseSerializationError, serializerCompiler, validatorCompiler, } from "fastify-type-provider-zod";
10
+ function buildApp(config, plugins) {
11
+ const app = Fastify({
12
+ logger: {
13
+ level: config.logLevel,
14
+ redact: [
15
+ "req.headers.authorization",
16
+ "req.headers.cookie",
17
+ "headers.authorization",
18
+ "headers.cookie",
19
+ ],
20
+ },
21
+ connectionTimeout: 30_000,
22
+ requestTimeout: 30_000,
23
+ trustProxy: config.trustProxy,
24
+ });
25
+ app.setValidatorCompiler(validatorCompiler);
26
+ app.setSerializerCompiler(serializerCompiler);
27
+ app.register(helmet);
28
+ app.register(rateLimit, {
29
+ max: 100,
30
+ timeWindow: "1 minute",
31
+ errorResponseBuilder: (_request, context) => {
32
+ const error = new Error("Too many requests");
33
+ // @fastify/rate-limit throws whatever errorResponseBuilder returns.
34
+ // Fastify's error handler reads statusCode from the thrown object to
35
+ // set the HTTP status; without it the response falls back to 500.
36
+ error.statusCode = context.statusCode;
37
+ return error;
38
+ },
39
+ });
40
+ const typedApp = app.withTypeProvider();
41
+ typedApp.setErrorHandler((error, request, reply) => {
42
+ request.log.error({ err: error }, "Request error");
43
+ if (hasZodFastifySchemaValidationErrors(error)) {
44
+ return reply.code(400).send({ error: "Validation failed" });
45
+ }
46
+ if (isResponseSerializationError(error)) {
47
+ return reply.code(500).send({ error: "Internal Server Error" });
48
+ }
49
+ const statusCode = error.statusCode !== undefined && error.statusCode >= 400
50
+ ? error.statusCode
51
+ : 500;
52
+ const message = statusCode >= 500 ? "Internal Server Error" : error.message;
53
+ return reply.code(statusCode).send({ error: message });
54
+ });
55
+ for (const plugin of plugins) {
56
+ typedApp.register(plugin);
15
57
  }
16
- // 404 handler for unmatched routes
17
- app.use((_request, response) => {
18
- response.status(404).json({ error: "Not found" });
58
+ // Rate-limit the 404 handler. setNotFoundHandler must receive the
59
+ // rateLimit() preHandler, otherwise custom 404s bypass rate limiting
60
+ // entirely (@fastify/rate-limit README, "Preventing guessing of URLs
61
+ // through 404s"). The decorator is available after the plugin queue
62
+ // has been processed, so we defer via after().
63
+ typedApp.after(() => {
64
+ typedApp.setNotFoundHandler({ preHandler: app.rateLimit() }, async (_request, reply) => {
65
+ return reply.code(404).send({ error: "Not found" });
66
+ });
19
67
  });
20
68
  return app;
21
69
  }
22
70
  /** Create an axusage server instance */
23
- export function createServer(config, routers) {
24
- const app = createApp(routers);
25
- let server;
26
- let stopPromise;
27
- return {
28
- app,
29
- start() {
30
- if (server) {
31
- return Promise.reject(new Error("Server is already running. Call stop() before restarting."));
32
- }
33
- stopPromise = undefined;
34
- return new Promise((resolve, reject) => {
35
- const onStartupError = (error) => {
36
- server = undefined;
37
- reject(error);
38
- };
39
- server = app.listen(config.port, config.host, () => {
40
- server?.removeListener("error", onStartupError);
41
- server?.on("error", (error) => {
42
- console.error("Server error:", error);
43
- });
44
- console.error(`axusage listening on http://${config.host}:${String(config.port)}`);
45
- resolve();
46
- });
47
- server.once("error", onStartupError);
48
- });
71
+ export function createServer(config, plugins) {
72
+ let app = buildApp(config, plugins);
73
+ let started = false;
74
+ let stopped = false;
75
+ const server = {
76
+ get app() {
77
+ return app;
49
78
  },
50
- stop() {
51
- if (stopPromise) {
52
- return stopPromise;
79
+ async start() {
80
+ if (started) {
81
+ throw new Error("Server is already running. Call stop() before restarting.");
53
82
  }
54
- if (!server) {
55
- return Promise.resolve();
83
+ // Fastify instances cannot be reopened after close, so rebuild
84
+ // on restart. Skip rebuild on first start since we already have
85
+ // a fresh instance from createServer.
86
+ if (stopped) {
87
+ app = buildApp(config, plugins);
56
88
  }
57
- const serverToClose = server;
58
- server = undefined;
59
- stopPromise = new Promise((resolve, reject) => {
60
- serverToClose.close((error) => {
61
- if (error) {
62
- reject(error);
63
- }
64
- else {
65
- resolve();
66
- }
67
- });
89
+ const address = await app.listen({
90
+ port: config.port,
91
+ host: config.host,
68
92
  });
69
- return stopPromise;
93
+ // eslint-disable-next-line require-atomic-updates -- guarded by the started check above; no concurrent callers
94
+ started = true;
95
+ app.log.info({ address }, "axusage listening");
96
+ },
97
+ async stop() {
98
+ if (!started)
99
+ return;
100
+ started = false;
101
+ stopped = true;
102
+ await app.close();
70
103
  },
71
104
  };
105
+ return server;
72
106
  }
107
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { ServiceResult } from "../types/domain.js";
2
+ import { type ServeLogger } from "./serve-logger.js";
3
+ import type { ServerState } from "./routes.js";
4
+ type UsageCache = {
5
+ readonly getState: () => ServerState | undefined;
6
+ /** Waits for a fresh snapshot before returning. Use for data endpoints where staleness is unacceptable. */
7
+ readonly getFreshState: () => Promise<ServerState | undefined>;
8
+ /** Serves the current snapshot immediately; triggers a background refresh when stale.
9
+ * Blocks only if no snapshot exists yet (first ever request). Use for Prometheus /metrics
10
+ * where scrape latency matters more than strict freshness. */
11
+ readonly getStateStaleWhileRevalidate: () => Promise<ServerState | undefined>;
12
+ /** Waits for any in-flight refresh to complete. Use during shutdown to avoid dangling promises. */
13
+ readonly waitForPending: () => Promise<void>;
14
+ /** Signal that the server is shutting down. Prevents new fetches from starting. */
15
+ readonly shutdown: () => void;
16
+ };
17
+ /**
18
+ * Creates an on-demand usage cache. Data is fetched via `doFetch` when a
19
+ * caller requests fresh state and the cached snapshot is older than `intervalMs`.
20
+ * Concurrent callers during a refresh all receive the same in-flight promise.
21
+ * When all services fail, the cache retries after a short backoff (≤5s) rather
22
+ * than waiting the full interval.
23
+ */
24
+ export declare function createUsageCache(doFetch: () => Promise<ServiceResult[]>, intervalMs: number, logger?: ServeLogger): UsageCache;
25
+ export {};
26
+ //# sourceMappingURL=usage-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-cache.d.ts","sourceRoot":"","sources":["../../src/server/usage-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAoB,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,KAAK,WAAW,EAA4B,MAAM,mBAAmB,CAAC;AAC/E,OAAO,KAAK,EAAe,WAAW,EAAE,MAAM,aAAa,CAAC;AAE5D,KAAK,UAAU,GAAG;IAChB,QAAQ,CAAC,QAAQ,EAAE,MAAM,WAAW,GAAG,SAAS,CAAC;IACjD,2GAA2G;IAC3G,QAAQ,CAAC,aAAa,EAAE,MAAM,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;IAC/D;;mEAE+D;IAC/D,QAAQ,CAAC,4BAA4B,EAAE,MAAM,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;IAC9E,mGAAmG;IACnG,QAAQ,CAAC,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,mFAAmF;IACnF,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC;CAC/B,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC,EACvC,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,WAAwC,GAC/C,UAAU,CA0EZ"}
@@ -0,0 +1,77 @@
1
+ import { createConsoleServeLogger } from "./serve-logger.js";
2
+ /**
3
+ * Creates an on-demand usage cache. Data is fetched via `doFetch` when a
4
+ * caller requests fresh state and the cached snapshot is older than `intervalMs`.
5
+ * Concurrent callers during a refresh all receive the same in-flight promise.
6
+ * When all services fail, the cache retries after a short backoff (≤5s) rather
7
+ * than waiting the full interval.
8
+ */
9
+ export function createUsageCache(doFetch, intervalMs, logger = createConsoleServeLogger()) {
10
+ let state;
11
+ let refreshPromise;
12
+ let isShutDown = false;
13
+ async function doRefresh() {
14
+ const results = await doFetch();
15
+ const usage = [];
16
+ const errors = [];
17
+ for (const { service, result } of results) {
18
+ if (result.ok) {
19
+ usage.push(result.value);
20
+ }
21
+ else {
22
+ errors.push({
23
+ service,
24
+ message: result.error.message,
25
+ status: result.error.status,
26
+ });
27
+ logger.warn({ service, error: result.error.message, status: result.error.status }, "Failed to fetch service");
28
+ }
29
+ }
30
+ state = { usage, refreshedAt: new Date(), errors };
31
+ }
32
+ const FAILURE_RETRY_MS = 5000;
33
+ function ensureFresh() {
34
+ if (isShutDown)
35
+ return Promise.resolve();
36
+ const age = state === undefined ? Infinity : Date.now() - state.refreshedAt.getTime();
37
+ // If the last refresh produced no data (all services failed), retry on a
38
+ // short backoff (capped at 5s) so the server recovers promptly after
39
+ // transient failures without hammering failing services.
40
+ const hasData = state !== undefined && state.usage.length > 0;
41
+ const maxAge = hasData
42
+ ? intervalMs
43
+ : Math.min(intervalMs, FAILURE_RETRY_MS);
44
+ if (age < maxAge)
45
+ return Promise.resolve();
46
+ refreshPromise ??= doRefresh().finally(() => {
47
+ refreshPromise = undefined;
48
+ });
49
+ return refreshPromise;
50
+ }
51
+ return {
52
+ getState: () => state,
53
+ getFreshState: async () => {
54
+ await ensureFresh();
55
+ return state;
56
+ },
57
+ getStateStaleWhileRevalidate: async () => {
58
+ if (state === undefined) {
59
+ // No snapshot yet — block until we have something to serve.
60
+ await ensureFresh();
61
+ }
62
+ else {
63
+ // Serve the current snapshot immediately; kick off a background
64
+ // refresh if stale. Errors are logged; callers are not affected.
65
+ void ensureFresh().catch((error) => {
66
+ logger.error({ err: error }, "Background metrics refresh failed");
67
+ });
68
+ }
69
+ return state;
70
+ },
71
+ waitForPending: () => refreshPromise ?? Promise.resolve(),
72
+ shutdown: () => {
73
+ isShutDown = true;
74
+ },
75
+ };
76
+ }
77
+ //# sourceMappingURL=usage-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-cache.js","sourceRoot":"","sources":["../../src/server/usage-cache.ts"],"names":[],"mappings":"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"}
@@ -9,3 +9,4 @@ export declare function fetchGeminiProject(accessToken: string): Promise<string
9
9
  * Fetch quota data from Gemini API
10
10
  */
11
11
  export declare function fetchGeminiQuota(accessToken: string, projectId?: string): Promise<Result<GeminiQuotaResponse, ApiError>>;
12
+ //# sourceMappingURL=gemini-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-api.d.ts","sourceRoot":"","sources":["../../src/services/gemini-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAe9D;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA0C7B;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAC,CAiFhD"}
@@ -107,3 +107,4 @@ export async function fetchGeminiQuota(accessToken, projectId) {
107
107
  };
108
108
  }
109
109
  }
110
+ //# sourceMappingURL=gemini-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-api.js","sourceRoot":"","sources":["../../src/services/gemini-api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EACL,mBAAmB,IAAI,yBAAyB,EAChD,sBAAsB,IAAI,4BAA4B,GACvD,MAAM,oBAAoB,CAAC;AAE5B,wEAAwE;AACxE,8DAA8D;AAC9D,MAAM,aAAa,GACjB,kEAAkE,CAAC;AACrE,MAAM,gBAAgB,GACpB,yDAAyD,CAAC;AAE5D,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,WAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAChC,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAEvB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,gBAAgB,EAAE;YAC7C,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,WAAW,EAAE;aACvC;YACD,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QAEH,YAAY,CAAC,SAAS,CAAC,CAAC;QAExB,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,IAAI,GAAY,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC5C,MAAM,WAAW,GAAG,4BAA4B,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAEjE,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACvD,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,yFAAyF;QACzF,KAAK,MAAM,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChD,IAAI,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACpD,OAAO,OAAO,CAAC,SAAS,CAAC;YAC3B,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,qBAAqB,CAAC,KAAK,MAAM,EAAE,CAAC;gBACvD,OAAO,OAAO,CAAC,SAAS,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,WAAmB,EACnB,SAAkB;IAElB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAChC,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAEvB,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAEvE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,aAAa,EAAE;YAC1C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,WAAW,EAAE;gBACtC,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI;YACJ,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QAEH,YAAY,CAAC,SAAS,CAAC,CAAC;QAExB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,IAAI,QAAQ,CACjB,iEAAiE,EACjE,GAAG,CACJ;aACF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,IAAI,QAAQ,CACjB,qBAAqB,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,SAAS,EAAE,EAC3D,QAAQ,CAAC,MAAM,CAChB;aACF,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAY,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC5C,MAAM,WAAW,GAAG,yBAAyB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAE9D,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACzB,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,IAAI,QAAQ,CACjB,kCAAkC,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,EAC7D,SAAS,EACT,IAAI,CACL;aACF,CAAC;QACJ,CAAC;QAED,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1C,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,IAAI,QAAQ,CACjB,2DAA2D,CAC5D;aACF,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC1D,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,IAAI,QAAQ,CAAC,qCAAqC,CAAC;aAC3D,CAAC;QACJ,CAAC;QAED,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,IAAI,QAAQ,CACjB,iCAAiC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC1F;SACF,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -5,6 +5,7 @@
5
5
  * returning vault metadata (displayName) alongside the token.
6
6
  */
7
7
  import type { ResolvedInstanceConfig } from "../config/credential-sources.js";
8
+ import type { SupportedService } from "./supported-service.js";
8
9
  /** Result of resolving an instance token */
9
10
  interface InstanceTokenResult {
10
11
  token: string | undefined;
@@ -16,5 +17,6 @@ interface InstanceTokenResult {
16
17
  * Returns vault metadata (displayName) alongside the token
17
18
  * for multi-instance identification.
18
19
  */
19
- declare function getInstanceAccessToken(service: string, config: ResolvedInstanceConfig): Promise<InstanceTokenResult>;
20
+ declare function getInstanceAccessToken(service: SupportedService, config: ResolvedInstanceConfig): Promise<InstanceTokenResult>;
20
21
  export { getInstanceAccessToken };
22
+ //# sourceMappingURL=get-instance-access-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-instance-access-token.d.ts","sourceRoot":"","sources":["../../src/services/get-instance-access-token.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAC9E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AA8C/D,4CAA4C;AAC5C,UAAU,mBAAmB;IAC3B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAwDD;;;;;GAKG;AACH,iBAAe,sBAAsB,CACnC,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,mBAAmB,CAAC,CA6C9B;AAED,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
@@ -123,3 +123,4 @@ async function getInstanceAccessToken(service, config) {
123
123
  }
124
124
  }
125
125
  export { getInstanceAccessToken };
126
+ //# sourceMappingURL=get-instance-access-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-instance-access-token.js","sourceRoot":"","sources":["../../src/services/get-instance-access-token.ts"],"names":[],"mappings":"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"}
@@ -11,3 +11,4 @@
11
11
  */
12
12
  declare function resolveInstanceDisplayName(configDisplayName: string | undefined, vaultDisplayName: string | undefined, defaultName: string, index: number, total: number): string;
13
13
  export { resolveInstanceDisplayName };
14
+ //# sourceMappingURL=resolve-service-instances.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-service-instances.d.ts","sourceRoot":"","sources":["../../src/services/resolve-service-instances.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;GAKG;AACH,iBAAS,0BAA0B,CACjC,iBAAiB,EAAE,MAAM,GAAG,SAAS,EACrC,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,MAAM,CAUR;AAED,OAAO,EAAE,0BAA0B,EAAE,CAAC"}
@@ -22,3 +22,4 @@ function resolveInstanceDisplayName(configDisplayName, vaultDisplayName, default
22
22
  return `${defaultName} #${String(index + 1)}`;
23
23
  }
24
24
  export { resolveInstanceDisplayName };
25
+ //# sourceMappingURL=resolve-service-instances.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-service-instances.js","sourceRoot":"","sources":["../../src/services/resolve-service-instances.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;GAKG;AACH,SAAS,0BAA0B,CACjC,iBAAqC,EACrC,gBAAoC,EACpC,WAAmB,EACnB,KAAa,EACb,KAAa;IAEb,mCAAmC;IACnC,IAAI,iBAAiB;QAAE,OAAO,iBAAiB,CAAC;IAChD,IAAI,gBAAgB;QAAE,OAAO,gBAAgB,CAAC;IAE9C,uCAAuC;IACvC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC;IAEpC,kDAAkD;IAClD,OAAO,GAAG,WAAW,KAAK,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;AAChD,CAAC;AAED,OAAO,EAAE,0BAA0B,EAAE,CAAC"}
@@ -1,9 +1,11 @@
1
1
  import type { ServiceUsageFetcher } from "../types/domain.js";
2
+ import { type SupportedService } from "./supported-service.js";
2
3
  /**
3
4
  * Get a token-based usage fetcher by service type
4
5
  */
5
- export declare function getServiceUsageFetcher(name: string): ServiceUsageFetcher | undefined;
6
+ export declare function getServiceUsageFetcher(name: SupportedService): ServiceUsageFetcher;
6
7
  /**
7
8
  * Get all available service names
8
9
  */
9
- export declare function getAvailableServices(): string[];
10
+ export declare function getAvailableServices(): SupportedService[];
11
+ //# sourceMappingURL=service-adapter-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-adapter-registry.d.ts","sourceRoot":"","sources":["../../src/services/service-adapter-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAK9D,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,wBAAwB,CAAC;AAYhC;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,gBAAgB,GACrB,mBAAmB,CAErB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,gBAAgB,EAAE,CAEzD"}
@@ -2,6 +2,7 @@ import { codexUsageFetcher } from "../adapters/codex.js";
2
2
  import { claudeUsageFetcher } from "../adapters/claude.js";
3
3
  import { geminiUsageFetcher } from "../adapters/gemini.js";
4
4
  import { copilotUsageFetcher } from "../adapters/copilot.js";
5
+ import { SUPPORTED_SERVICES, } from "./supported-service.js";
5
6
  /**
6
7
  * Registry of token-based usage fetchers
7
8
  */
@@ -15,12 +16,12 @@ const SERVICE_USAGE_FETCHERS = {
15
16
  * Get a token-based usage fetcher by service type
16
17
  */
17
18
  export function getServiceUsageFetcher(name) {
18
- const key = name.toLowerCase();
19
- return SERVICE_USAGE_FETCHERS[key];
19
+ return SERVICE_USAGE_FETCHERS[name];
20
20
  }
21
21
  /**
22
22
  * Get all available service names
23
23
  */
24
24
  export function getAvailableServices() {
25
- return Object.keys(SERVICE_USAGE_FETCHERS);
25
+ return [...SUPPORTED_SERVICES];
26
26
  }
27
+ //# sourceMappingURL=service-adapter-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-adapter-registry.js","sourceRoot":"","sources":["../../src/services/service-adapter-registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EACL,kBAAkB,GAEnB,MAAM,wBAAwB,CAAC;AAEhC;;GAEG;AACH,MAAM,sBAAsB,GAAG;IAC7B,MAAM,EAAE,kBAAkB;IAC1B,KAAK,EAAE,iBAAiB;IACxB,OAAO,EAAE,mBAAmB;IAC5B,MAAM,EAAE,kBAAkB;CACsC,CAAC;AAEnE;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAAsB;IAEtB,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,CAAC,GAAG,kBAAkB,CAAC,CAAC;AACjC,CAAC"}
@@ -9,3 +9,4 @@ type ServiceDiagnostic = {
9
9
  export type { ServiceDiagnostic };
10
10
  export declare function getServiceDiagnostic(service: SupportedService): ServiceDiagnostic;
11
11
  export declare function getAllServiceDiagnostics(): ServiceDiagnostic[];
12
+ //# sourceMappingURL=service-diagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-diagnostics.d.ts","sourceRoot":"","sources":["../../src/services/service-diagnostics.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,KAAK,iBAAiB,GAAG;IACvB,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;CACzC,CAAC;AAEF,YAAY,EAAE,iBAAiB,EAAE,CAAC;AAElC,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,gBAAgB,GACxB,iBAAiB,CAuBnB;AAED,wBAAgB,wBAAwB,IAAI,iBAAiB,EAAE,CAE9D"}
@@ -27,3 +27,4 @@ export function getServiceDiagnostic(service) {
27
27
  export function getAllServiceDiagnostics() {
28
28
  return SUPPORTED_SERVICES.map((service) => getServiceDiagnostic(service));
29
29
  }
30
+ //# sourceMappingURL=service-diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-diagnostics.js","sourceRoot":"","sources":["../../src/services/service-diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC,OAAO,EACL,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,+BAA+B,EAAE,MAAM,8BAA8B,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAa5D,MAAM,UAAU,oBAAoB,CAClC,OAAyB;IAEzB,MAAM,UAAU,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAEjD,IAAI,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;QACvD,MAAM,iBAAiB,GAAG,+BAA+B,EAAE,CAAC;QAC5D,IAAI,iBAAiB,EAAE,CAAC;YACtB,UAAU,GAAG;gBACX,GAAG,UAAU;gBACb,aAAa,EAAE,IAAI;gBACnB,MAAM,EAAE,8BAA8B;aACvC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO;QACP,YAAY,EAAE,SAAS,CAAC,EAAE;QAC1B,OAAO,EAAE,SAAS,CAAC,IAAI;QACvB,aAAa,EAAE,UAAU,CAAC,aAAa;QACvC,UAAU,EAAE,UAAU,CAAC,MAAM;KAC9B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;AAC5E,CAAC"}
@@ -8,3 +8,4 @@ import type { AgentCli } from "axauth";
8
8
  export type SupportedService = Exclude<AgentCli, "opencode">;
9
9
  export declare const SUPPORTED_SERVICES: SupportedService[];
10
10
  export declare function validateService(service: string | undefined): SupportedService;
11
+ //# sourceMappingURL=supported-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supported-service.d.ts","sourceRoot":"","sources":["../../src/services/supported-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAGvC;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AAE7D,eAAO,MAAM,kBAAkB,EAAE,gBAAgB,EAEhD,CAAC;AAQF,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,gBAAgB,CAgB7E"}
@@ -1,14 +1,19 @@
1
1
  import { AGENT_CLIS } from "axauth";
2
2
  export const SUPPORTED_SERVICES = AGENT_CLIS.filter((cli) => cli !== "opencode");
3
+ const SUPPORTED_SERVICE_SET = new Set(SUPPORTED_SERVICES);
4
+ function isSupportedService(service) {
5
+ return SUPPORTED_SERVICE_SET.has(service);
6
+ }
3
7
  export function validateService(service) {
4
8
  if (!service) {
5
9
  throw new Error(`Service is required. Supported services: ${SUPPORTED_SERVICES.join(", ")}. ` +
6
10
  "Run 'axusage --help' for usage.");
7
11
  }
8
12
  const normalizedService = service.toLowerCase();
9
- if (!SUPPORTED_SERVICES.includes(normalizedService)) {
13
+ if (!isSupportedService(normalizedService)) {
10
14
  throw new Error(`Unsupported service: ${service}. Supported services: ${SUPPORTED_SERVICES.join(", ")}. ` +
11
15
  "Run 'axusage --help' for usage.");
12
16
  }
13
17
  return normalizedService;
14
18
  }
19
+ //# sourceMappingURL=supported-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supported-service.js","sourceRoot":"","sources":["../../src/services/supported-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAUpC,MAAM,CAAC,MAAM,kBAAkB,GAAuB,UAAU,CAAC,MAAM,CACrE,CAAC,GAAG,EAA2B,EAAE,CAAC,GAAG,KAAK,UAAU,CACrD,CAAC;AAEF,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAS,kBAAkB,CAAC,CAAC;AAElE,SAAS,kBAAkB,CAAC,OAAe;IACzC,OAAO,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAA2B;IACzD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,4CAA4C,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YAC3E,iCAAiC,CACpC,CAAC;IACJ,CAAC;IAED,MAAM,iBAAiB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAChD,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,wBAAwB,OAAO,yBAAyB,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YACvF,iCAAiC,CACpC,CAAC;IACJ,CAAC;IACD,OAAO,iBAAiB,CAAC;AAC3B,CAAC"}