agentic-insights 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.md +44 -0
  2. package/dist/args.d.ts +11 -0
  3. package/dist/args.js +71 -0
  4. package/dist/args.js.map +1 -0
  5. package/dist/browser.d.ts +6 -0
  6. package/dist/browser.js +42 -0
  7. package/dist/browser.js.map +1 -0
  8. package/dist/config.d.ts +3 -0
  9. package/dist/config.js +17 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/index.d.ts +2 -0
  12. package/dist/index.js +76 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/port.d.ts +2 -0
  15. package/dist/port.js +38 -0
  16. package/dist/port.js.map +1 -0
  17. package/dist/runtime/node_modules/@agentic-insights/shared/index.d.ts +159 -0
  18. package/dist/runtime/node_modules/@agentic-insights/shared/index.js +70 -0
  19. package/dist/runtime/node_modules/@agentic-insights/shared/index.js.map +1 -0
  20. package/dist/runtime/node_modules/@agentic-insights/shared/package.json +13 -0
  21. package/dist/runtime/server/aggregation.d.ts +5 -0
  22. package/dist/runtime/server/aggregation.js +90 -0
  23. package/dist/runtime/server/aggregation.js.map +1 -0
  24. package/dist/runtime/server/app.d.ts +10 -0
  25. package/dist/runtime/server/app.js +30 -0
  26. package/dist/runtime/server/app.js.map +1 -0
  27. package/dist/runtime/server/calibration.d.ts +16 -0
  28. package/dist/runtime/server/calibration.js +69 -0
  29. package/dist/runtime/server/calibration.js.map +1 -0
  30. package/dist/runtime/server/claude.d.ts +13 -0
  31. package/dist/runtime/server/claude.js +158 -0
  32. package/dist/runtime/server/claude.js.map +1 -0
  33. package/dist/runtime/server/discovery.d.ts +5 -0
  34. package/dist/runtime/server/discovery.js +43 -0
  35. package/dist/runtime/server/discovery.js.map +1 -0
  36. package/dist/runtime/server/generated/pricing-catalog.d.ts +2 -0
  37. package/dist/runtime/server/generated/pricing-catalog.js +17990 -0
  38. package/dist/runtime/server/generated/pricing-catalog.js.map +1 -0
  39. package/dist/runtime/server/index.d.ts +1 -0
  40. package/dist/runtime/server/index.js +14 -0
  41. package/dist/runtime/server/index.js.map +1 -0
  42. package/dist/runtime/server/parser.d.ts +10 -0
  43. package/dist/runtime/server/parser.js +292 -0
  44. package/dist/runtime/server/parser.js.map +1 -0
  45. package/dist/runtime/server/paths.d.ts +10 -0
  46. package/dist/runtime/server/paths.js +42 -0
  47. package/dist/runtime/server/paths.js.map +1 -0
  48. package/dist/runtime/server/pricing-catalog-transform.d.ts +39 -0
  49. package/dist/runtime/server/pricing-catalog-transform.js +82 -0
  50. package/dist/runtime/server/pricing-catalog-transform.js.map +1 -0
  51. package/dist/runtime/server/pricing.d.ts +18 -0
  52. package/dist/runtime/server/pricing.js +276 -0
  53. package/dist/runtime/server/pricing.js.map +1 -0
  54. package/dist/runtime/server/service.d.ts +37 -0
  55. package/dist/runtime/server/service.js +752 -0
  56. package/dist/runtime/server/service.js.map +1 -0
  57. package/dist/runtime/server/static.d.ts +2 -0
  58. package/dist/runtime/server/static.js +48 -0
  59. package/dist/runtime/server/static.js.map +1 -0
  60. package/dist/runtime/server/timezone.d.ts +15 -0
  61. package/dist/runtime/server/timezone.js +197 -0
  62. package/dist/runtime/server/timezone.js.map +1 -0
  63. package/dist/runtime/server/types.d.ts +62 -0
  64. package/dist/runtime/server/types.js +2 -0
  65. package/dist/runtime/server/types.js.map +1 -0
  66. package/dist/runtime/web/agent.svg +5 -0
  67. package/dist/runtime/web/assets/index-CUN_NMpB.css +1 -0
  68. package/dist/runtime/web/assets/index-DzpKJhbf.js +112 -0
  69. package/dist/runtime/web/favicon.svg +5 -0
  70. package/dist/runtime/web/index.html +17 -0
  71. package/package.json +38 -0
package/README.md ADDED
@@ -0,0 +1,44 @@
1
+ # Agentic Insights
2
+
3
+ `agentic-insights` launches a local dashboard that reads your Codex and Claude Code usage artifacts and helps you understand coding-agent usage, starting with water-impact estimates.
4
+
5
+ ## Run
6
+
7
+ ```bash
8
+ npx agentic-insights@0.1.1
9
+ ```
10
+
11
+ That command starts a local server, opens the dashboard in your browser, and reads usage data from your machine.
12
+
13
+ You can also install a reusable command:
14
+
15
+ ```bash
16
+ npm install -g agentic-insights
17
+ agentic-insights
18
+ ```
19
+
20
+ ## Useful flags
21
+
22
+ ```bash
23
+ agentic-insights --port 3001
24
+ agentic-insights --host 127.0.0.1
25
+ agentic-insights --codex-home /path/to/.codex
26
+ agentic-insights --no-open
27
+ ```
28
+
29
+ ## Data source
30
+
31
+ By default the app reads local Codex artifacts from:
32
+
33
+ - `~/.codex/sessions`
34
+ - `~/.codex/archived_sessions`
35
+ - `~/.codex/log/codex-tui.log`
36
+ - `~/.claude/projects`
37
+ - `~/.claude/usage-data/session-meta`
38
+
39
+ Override the Codex location with `--codex-home` or `CODEX_HOME=/path/to/.codex`. Claude Code usage is read from the default `~/.claude` home for the current user.
40
+
41
+ ## Repository
42
+
43
+ - Source: https://github.com/max-stoddard/agentic-insights
44
+ - Issues: https://github.com/max-stoddard/agentic-insights/issues
package/dist/args.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ export interface CliOptions {
2
+ codexHome: string | null;
3
+ help: boolean;
4
+ host: string;
5
+ openBrowser: boolean;
6
+ preferredPort: number;
7
+ }
8
+ export declare class CliArgumentError extends Error {
9
+ }
10
+ export declare function getHelpText(): string;
11
+ export declare function parseCliArgs(argv: string[]): CliOptions;
package/dist/args.js ADDED
@@ -0,0 +1,71 @@
1
+ const HELP_TEXT = `Agentic Insights
2
+
3
+ Usage:
4
+ agentic-insights [options]
5
+
6
+ Options:
7
+ --port <number> Preferred local port (default: 3001)
8
+ --host <host> Host to bind the local server to (default: 127.0.0.1)
9
+ --codex-home <path> Override the Codex home directory
10
+ --no-open Do not open the browser automatically
11
+ --help Show this help text
12
+ `;
13
+ export class CliArgumentError extends Error {
14
+ }
15
+ function parsePort(value) {
16
+ const parsed = Number.parseInt(value, 10);
17
+ if (!Number.isInteger(parsed) || parsed < 1 || parsed > 65_535) {
18
+ throw new CliArgumentError(`Invalid port: ${value}`);
19
+ }
20
+ return parsed;
21
+ }
22
+ function requireValue(flag, value) {
23
+ if (!value) {
24
+ throw new CliArgumentError(`Missing value for ${flag}`);
25
+ }
26
+ return value;
27
+ }
28
+ export function getHelpText() {
29
+ return HELP_TEXT;
30
+ }
31
+ export function parseCliArgs(argv) {
32
+ const options = {
33
+ codexHome: null,
34
+ help: false,
35
+ host: "127.0.0.1",
36
+ openBrowser: true,
37
+ preferredPort: 3001
38
+ };
39
+ for (let index = 0; index < argv.length; index += 1) {
40
+ const arg = argv[index];
41
+ if (!arg) {
42
+ continue;
43
+ }
44
+ if (arg === "--help") {
45
+ options.help = true;
46
+ continue;
47
+ }
48
+ if (arg === "--no-open") {
49
+ options.openBrowser = false;
50
+ continue;
51
+ }
52
+ if (arg === "--port") {
53
+ options.preferredPort = parsePort(requireValue(arg, argv[index + 1]));
54
+ index += 1;
55
+ continue;
56
+ }
57
+ if (arg === "--host") {
58
+ options.host = requireValue(arg, argv[index + 1]);
59
+ index += 1;
60
+ continue;
61
+ }
62
+ if (arg === "--codex-home") {
63
+ options.codexHome = requireValue(arg, argv[index + 1]);
64
+ index += 1;
65
+ continue;
66
+ }
67
+ throw new CliArgumentError(`Unknown argument: ${arg}`);
68
+ }
69
+ return options;
70
+ }
71
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA,MAAM,SAAS,GAAG;;;;;;;;;;;CAWjB,CAAC;AAUF,MAAM,OAAO,gBAAiB,SAAQ,KAAK;CAAG;AAE9C,SAAS,SAAS,CAAC,KAAa;IAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,MAAM,EAAE,CAAC;QAC/D,MAAM,IAAI,gBAAgB,CAAC,iBAAiB,KAAK,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,KAAyB;IAC3D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,gBAAgB,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAc;IACzC,MAAM,OAAO,GAAe;QAC1B,SAAS,EAAE,IAAI;QACf,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,IAAI;QACjB,aAAa,EAAE,IAAI;KACpB,CAAC;IAEF,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAExB,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;YACpB,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC;YAC5B,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACrB,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACtE,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,GAAG,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;YAClD,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,cAAc,EAAE,CAAC;YAC3B,OAAO,CAAC,SAAS,GAAG,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;YACvD,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,MAAM,IAAI,gBAAgB,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export interface BrowserLaunchSpec {
2
+ args: string[];
3
+ command: string;
4
+ }
5
+ export declare function getBrowserLaunchSpec(url: string, platform?: NodeJS.Platform): BrowserLaunchSpec | null;
6
+ export declare function openBrowser(url: string, platform?: NodeJS.Platform): Promise<boolean>;
@@ -0,0 +1,42 @@
1
+ import { spawn } from "node:child_process";
2
+ export function getBrowserLaunchSpec(url, platform = process.platform) {
3
+ switch (platform) {
4
+ case "darwin":
5
+ return {
6
+ command: "open",
7
+ args: [url]
8
+ };
9
+ case "win32":
10
+ return {
11
+ command: "cmd",
12
+ args: ["/c", "start", "", url]
13
+ };
14
+ case "linux":
15
+ return {
16
+ command: "xdg-open",
17
+ args: [url]
18
+ };
19
+ default:
20
+ return null;
21
+ }
22
+ }
23
+ export async function openBrowser(url, platform = process.platform) {
24
+ const spec = getBrowserLaunchSpec(url, platform);
25
+ if (!spec) {
26
+ return false;
27
+ }
28
+ return new Promise((resolve) => {
29
+ const child = spawn(spec.command, spec.args, {
30
+ detached: true,
31
+ stdio: "ignore"
32
+ });
33
+ child.once("error", () => {
34
+ resolve(false);
35
+ });
36
+ child.once("spawn", () => {
37
+ child.unref();
38
+ resolve(true);
39
+ });
40
+ });
41
+ }
42
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAO3C,MAAM,UAAU,oBAAoB,CAAC,GAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ;IAC3E,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO;gBACL,OAAO,EAAE,MAAM;gBACf,IAAI,EAAE,CAAC,GAAG,CAAC;aACZ,CAAC;QACJ,KAAK,OAAO;YACV,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC;aAC/B,CAAC;QACJ,KAAK,OAAO;YACV,OAAO;gBACL,OAAO,EAAE,UAAU;gBACnB,IAAI,EAAE,CAAC,GAAG,CAAC;aACZ,CAAC;QACJ;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ;IACxE,MAAM,IAAI,GAAG,oBAAoB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACjD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;YAC3C,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC;QAEH,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YACvB,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YACvB,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function resolveCodexHome(cliValue: string | null, envValue: string | undefined): string;
2
+ export declare function resolveBrowserHost(host: string): string;
3
+ export declare function formatUrl(host: string, port: number): string;
package/dist/config.js ADDED
@@ -0,0 +1,17 @@
1
+ import os from "node:os";
2
+ import path from "node:path";
3
+ export function resolveCodexHome(cliValue, envValue) {
4
+ const selected = cliValue ?? envValue ?? path.join(os.homedir(), ".codex");
5
+ return path.resolve(selected);
6
+ }
7
+ export function resolveBrowserHost(host) {
8
+ if (host === "0.0.0.0" || host === "::" || host === "[::]") {
9
+ return "127.0.0.1";
10
+ }
11
+ return host;
12
+ }
13
+ export function formatUrl(host, port) {
14
+ const normalizedHost = host.includes(":") && !host.startsWith("[") ? `[${host}]` : host;
15
+ return `http://${normalizedHost}:${port}`;
16
+ }
17
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,gBAAgB,CAAC,QAAuB,EAAE,QAA4B;IACpF,MAAM,QAAQ,GAAG,QAAQ,IAAI,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC3E,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3D,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,IAAY;IAClD,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IACxF,OAAO,UAAU,cAAc,IAAI,IAAI,EAAE,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,76 @@
1
+ #!/usr/bin/env node
2
+ import path from "node:path";
3
+ import process from "node:process";
4
+ import { fileURLToPath, pathToFileURL } from "node:url";
5
+ import { CliArgumentError, getHelpText, parseCliArgs } from "./args.js";
6
+ import { openBrowser } from "./browser.js";
7
+ import { formatUrl, resolveBrowserHost, resolveCodexHome } from "./config.js";
8
+ import { findAvailablePort } from "./port.js";
9
+ function getRuntimeDir() {
10
+ const currentFile = fileURLToPath(import.meta.url);
11
+ return path.resolve(path.dirname(currentFile), "runtime");
12
+ }
13
+ async function loadRuntimeModule() {
14
+ const runtimeModuleUrl = pathToFileURL(path.join(getRuntimeDir(), "server", "app.js")).href;
15
+ return import(runtimeModuleUrl);
16
+ }
17
+ async function run() {
18
+ const options = parseCliArgs(process.argv.slice(2));
19
+ if (options.help) {
20
+ console.log(getHelpText());
21
+ return;
22
+ }
23
+ const codexHome = resolveCodexHome(options.codexHome, process.env.CODEX_HOME);
24
+ process.env.CODEX_HOME = codexHome;
25
+ const selectedPort = await findAvailablePort(options.host, options.preferredPort);
26
+ const { createApp } = await loadRuntimeModule();
27
+ const app = createApp({
28
+ webDistDir: path.join(getRuntimeDir(), "web")
29
+ });
30
+ let shuttingDown = false;
31
+ const shutdown = async (signal) => {
32
+ if (shuttingDown) {
33
+ return;
34
+ }
35
+ shuttingDown = true;
36
+ console.log(`\nReceived ${signal}. Shutting down Agentic Insights...`);
37
+ await app.close();
38
+ process.exit(0);
39
+ };
40
+ process.once("SIGINT", () => {
41
+ void shutdown("SIGINT");
42
+ });
43
+ process.once("SIGTERM", () => {
44
+ void shutdown("SIGTERM");
45
+ });
46
+ await app.listen({ host: options.host, port: selectedPort });
47
+ const browserHost = resolveBrowserHost(options.host);
48
+ const url = formatUrl(browserHost, selectedPort);
49
+ console.log(`Agentic Insights is running at ${url}`);
50
+ console.log(`Reading Codex usage from ${codexHome}`);
51
+ if (selectedPort !== options.preferredPort) {
52
+ console.log(`Port ${options.preferredPort} was unavailable. Using ${selectedPort} instead.`);
53
+ }
54
+ if (options.openBrowser) {
55
+ const opened = await openBrowser(url);
56
+ if (!opened) {
57
+ console.log("Could not open your browser automatically. Open the URL above manually.");
58
+ }
59
+ }
60
+ else {
61
+ console.log("Browser auto-open disabled.");
62
+ }
63
+ console.log("Press Ctrl+C to stop the local dashboard.");
64
+ }
65
+ run().catch((error) => {
66
+ if (error instanceof CliArgumentError) {
67
+ console.error(error.message);
68
+ console.error("");
69
+ console.error(getHelpText());
70
+ process.exit(1);
71
+ }
72
+ const message = error instanceof Error ? error.message : "Unknown launcher error";
73
+ console.error(`Failed to start Agentic Insights: ${message}`);
74
+ process.exit(1);
75
+ });
76
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/port.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export type PortAvailabilityProbe = (host: string, port: number) => Promise<boolean>;
2
+ export declare function findAvailablePort(host: string, preferredPort: number, maxAttempts?: number, probe?: PortAvailabilityProbe): Promise<number>;
package/dist/port.js ADDED
@@ -0,0 +1,38 @@
1
+ import net from "node:net";
2
+ function isRetryablePortError(error) {
3
+ if (!error || typeof error !== "object" || !("code" in error)) {
4
+ return false;
5
+ }
6
+ const code = error.code;
7
+ return code === "EADDRINUSE" || code === "EACCES";
8
+ }
9
+ function canListen(host, port) {
10
+ return new Promise((resolve, reject) => {
11
+ const server = net.createServer();
12
+ server.once("error", (error) => {
13
+ server.close();
14
+ if (isRetryablePortError(error)) {
15
+ resolve(false);
16
+ return;
17
+ }
18
+ reject(error);
19
+ });
20
+ server.once("listening", () => {
21
+ server.close(() => resolve(true));
22
+ });
23
+ server.listen(port, host);
24
+ });
25
+ }
26
+ export async function findAvailablePort(host, preferredPort, maxAttempts = 25, probe = canListen) {
27
+ for (let offset = 0; offset < maxAttempts; offset += 1) {
28
+ const candidate = preferredPort + offset;
29
+ if (candidate > 65_535) {
30
+ break;
31
+ }
32
+ if (await probe(host, candidate)) {
33
+ return candidate;
34
+ }
35
+ }
36
+ throw new Error(`Could not find an available port starting from ${preferredPort}.`);
37
+ }
38
+ //# sourceMappingURL=port.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port.js","sourceRoot":"","sources":["../src/port.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,UAAU,CAAC;AAI3B,SAAS,oBAAoB,CAAC,KAAc;IAC1C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,EAAE,CAAC;QAC9D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,IAAI,GAAI,KAA2B,CAAC,IAAI,CAAC;IAC/C,OAAO,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,QAAQ,CAAC;AACpD,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,IAAY;IAC3C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;QAElC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC7B,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACf,OAAO;YACT,CAAC;YAED,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;YAC5B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAY,EACZ,aAAqB,EACrB,WAAW,GAAG,EAAE,EAChB,QAA+B,SAAS;IAExC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;QACvD,MAAM,SAAS,GAAG,aAAa,GAAG,MAAM,CAAC;QACzC,IAAI,SAAS,GAAG,MAAM,EAAE,CAAC;YACvB,MAAM;QACR,CAAC;QAED,IAAI,MAAM,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC;YACjC,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,kDAAkD,aAAa,GAAG,CAAC,CAAC;AACtF,CAAC"}
@@ -0,0 +1,159 @@
1
+ export type Bucket = "day" | "week" | "month";
2
+ export interface WaterRange {
3
+ low: number;
4
+ central: number;
5
+ high: number;
6
+ }
7
+ export interface TokenTotals {
8
+ totalTokens: number;
9
+ supportedTokens: number;
10
+ excludedTokens: number;
11
+ unestimatedTokens: number;
12
+ }
13
+ export interface CoverageCounts {
14
+ supportedEvents: number;
15
+ excludedEvents: number;
16
+ tokenOnlyEvents: number;
17
+ }
18
+ export interface CoverageSummary {
19
+ sessions: number;
20
+ prompts: number;
21
+ excludedModels: number;
22
+ }
23
+ export interface WeeklyGrowthMetric {
24
+ current: number;
25
+ previous: number;
26
+ increase: number;
27
+ }
28
+ export interface WeeklyGrowthSummary {
29
+ sessions: WeeklyGrowthMetric;
30
+ prompts: WeeklyGrowthMetric;
31
+ tokens: WeeklyGrowthMetric;
32
+ }
33
+ export type ModelUsageStatus = "allowed" | "unknown" | "local";
34
+ export interface ModelUsageEntry {
35
+ provider: string;
36
+ model: string;
37
+ totalTokens: number;
38
+ events: number;
39
+ supportedTokens: number;
40
+ excludedTokens: number;
41
+ unestimatedTokens: number;
42
+ status: ModelUsageStatus;
43
+ statusNote: string | null;
44
+ }
45
+ export type CoverageClassification = "supported" | "excluded" | "token_only";
46
+ export interface CoverageDetail {
47
+ provider: string;
48
+ model: string;
49
+ source: string;
50
+ tokens: number;
51
+ events: number;
52
+ classification: CoverageClassification;
53
+ reason: string | null;
54
+ }
55
+ export interface ExclusionSummary {
56
+ provider: string;
57
+ model: string;
58
+ source: string;
59
+ tokens: number;
60
+ events: number;
61
+ reason: string;
62
+ }
63
+ export interface CalibrationSnapshot {
64
+ referenceEventCostUsd: number;
65
+ computedAt: number;
66
+ supportedEventCount: number;
67
+ supportedMedianSource: string;
68
+ }
69
+ export type DiagnosticsState = "ready" | "no_data" | "read_error" | "indexing";
70
+ export type IndexingPhase = "discovering" | "parsing" | "estimating" | "finalizing";
71
+ export interface IndexingStatus {
72
+ phase: IndexingPhase;
73
+ startedAt: number;
74
+ updatedAt: number;
75
+ }
76
+ export interface OverviewDiagnostics {
77
+ state: DiagnosticsState;
78
+ codexHome: string;
79
+ message: string | null;
80
+ }
81
+ export interface OverviewResponse {
82
+ tokenTotals: TokenTotals;
83
+ waterLitres: WaterRange;
84
+ coverage: CoverageCounts;
85
+ coverageSummary: CoverageSummary;
86
+ weeklyGrowth: WeeklyGrowthSummary;
87
+ modelUsage: ModelUsageEntry[];
88
+ coverageDetails: CoverageDetail[];
89
+ exclusions: ExclusionSummary[];
90
+ lastIndexedAt: number | null;
91
+ calibration: CalibrationSnapshot | null;
92
+ indexing: IndexingStatus | null;
93
+ diagnostics: OverviewDiagnostics;
94
+ }
95
+ export interface TimeseriesPoint {
96
+ startTs: number;
97
+ key: string;
98
+ label: string;
99
+ tokens: number;
100
+ excludedTokens: number;
101
+ unestimatedTokens: number;
102
+ waterLitres: WaterRange;
103
+ }
104
+ export interface TimeseriesResponse {
105
+ bucket: Bucket;
106
+ points: TimeseriesPoint[];
107
+ }
108
+ export interface PricingEntry {
109
+ provider: string;
110
+ model: string;
111
+ inputUsdPerMillion: number;
112
+ cachedInputUsdPerMillion: number;
113
+ outputUsdPerMillion: number;
114
+ sourceUrl: string;
115
+ sourceLabel: string;
116
+ }
117
+ export type MethodologyTabId = "prompts" | "water" | "energy" | "carbon";
118
+ export interface MethodologySourceLink {
119
+ label: string;
120
+ url: string;
121
+ }
122
+ export type WaterComparisonType = "direct_intake" | "embedded_footprint" | "operational_use";
123
+ export interface WaterScaleComparison {
124
+ id: "cup-of-water" | "person-per-day" | "coffee" | "jeans" | "manufacturing-a-car" | "golf-course-daily";
125
+ label: string;
126
+ litres: number;
127
+ comparisonType: WaterComparisonType;
128
+ description: string;
129
+ sourceLabel: string;
130
+ sourceUrl: string;
131
+ sourceNote?: string;
132
+ singularLabel?: string;
133
+ pluralLabel?: string;
134
+ }
135
+ export interface WaterProductEquivalent extends WaterScaleComparison {
136
+ singularLabel: string;
137
+ pluralLabel: string;
138
+ }
139
+ export declare const WATER_SCALE_COMPARISONS: readonly WaterScaleComparison[];
140
+ export declare const WATER_PRODUCT_EQUIVALENTS: readonly WaterProductEquivalent[];
141
+ export interface PricingCatalogMetadata {
142
+ generatedAt: string;
143
+ sourceRepoUrl: string;
144
+ sourceDirectoryUrl: string;
145
+ licenseUrl: string;
146
+ providerCount: number;
147
+ modelCount: number;
148
+ }
149
+ export interface MethodologyResponse {
150
+ pricingTable: PricingEntry[];
151
+ benchmarkCoefficients: WaterRange;
152
+ calibration: CalibrationSnapshot | null;
153
+ exclusions: ExclusionSummary[];
154
+ pricingCatalog: PricingCatalogMetadata;
155
+ sourcesByTab: Record<MethodologyTabId, MethodologySourceLink[]>;
156
+ }
157
+ export interface ErrorResponse {
158
+ error: string;
159
+ }
@@ -0,0 +1,70 @@
1
+ export const WATER_SCALE_COMPARISONS = [
2
+ {
3
+ id: "cup-of-water",
4
+ label: "A cup of water",
5
+ litres: 0.24,
6
+ comparisonType: "direct_intake",
7
+ description: "The volume of one metric cup of drinking water.",
8
+ sourceLabel: "NIST Metric Kitchen: Cooking Measurement Equivalencies",
9
+ sourceUrl: "https://www.nist.gov/pml/owm/metric-kitchen-cooking-measurement-equivalencies",
10
+ sourceNote: "Uses NIST's 1 cup = 240 mL conversion."
11
+ },
12
+ {
13
+ id: "person-per-day",
14
+ label: "A daily intake",
15
+ litres: 2.25,
16
+ comparisonType: "direct_intake",
17
+ description: "A representative daily adult drinking-water intake from fluids.",
18
+ sourceLabel: "EFSA Dietary Reference Values for Water",
19
+ sourceUrl: "https://www.efsa.europa.eu/en/efsajournal/pub/1459",
20
+ sourceNote: "Midpoint of EFSA adult adequate intakes: 2.0 L/day for females and 2.5 L/day for males."
21
+ },
22
+ {
23
+ id: "coffee",
24
+ label: "A cup of coffee",
25
+ litres: 140,
26
+ comparisonType: "embedded_footprint",
27
+ description: "The embedded freshwater footprint associated with one cup of coffee.",
28
+ sourceLabel: "Ecological Economics DOI: The water footprint of coffee and tea consumption in the Netherlands",
29
+ sourceUrl: "https://doi.org/10.1016/j.ecolecon.2007.02.022",
30
+ sourceNote: "Represents the study's published water footprint per cup of coffee.",
31
+ singularLabel: "cup of coffee",
32
+ pluralLabel: "cups of coffee"
33
+ },
34
+ {
35
+ id: "jeans",
36
+ label: "A pair of jeans",
37
+ litres: 3781,
38
+ comparisonType: "embedded_footprint",
39
+ description: "The embedded freshwater footprint for one pair of denim jeans.",
40
+ sourceLabel: "Sustainability Science DOI: Comparing ecological and water footprint of denim jeans and a tri-blend T-shirt",
41
+ sourceUrl: "https://doi.org/10.1007/s11625-022-01131-0",
42
+ sourceNote: "Uses the study's published footprint for a pair of denim jeans.",
43
+ singularLabel: "pair of jeans",
44
+ pluralLabel: "pairs of jeans"
45
+ },
46
+ {
47
+ id: "manufacturing-a-car",
48
+ label: "A car",
49
+ litres: 67500,
50
+ comparisonType: "operational_use",
51
+ description: "A lifecycle water-consumption estimate for a European passenger car.",
52
+ sourceLabel: "Environmental Science & Technology DOI: Water Footprint of European Cars: Potential Impacts of Water Consumption along Automobile Life Cycles",
53
+ sourceUrl: "https://doi.org/10.1021/es2040043",
54
+ sourceNote: "Uses the midpoint of the study's 52–83 m³/car range. The paper reports that more than 95% occurs in the production phase."
55
+ },
56
+ {
57
+ id: "golf-course-daily",
58
+ label: "A golf course per day",
59
+ litres: 515000,
60
+ comparisonType: "operational_use",
61
+ description: "Approximate daily irrigation-scale water use for an average 18-hole U.S. golf course.",
62
+ sourceLabel: "GCSAA Golf Course Environmental Profile: Phase II Water Use and Conservation Practices on U.S. Golf Courses",
63
+ sourceUrl: "https://www.gcsaa.org/docs/default-source/Environment/phase-2-water-use-survey-full-report.pdf?sfvrsn=2b39123e_4",
64
+ sourceNote: "Derived as about 515,000 L/day from the 152.5 acre-feet/year 18-hole facility average used in GCSAA profile summaries."
65
+ }
66
+ ];
67
+ export const WATER_PRODUCT_EQUIVALENTS = WATER_SCALE_COMPARISONS.filter((comparison) => (comparison.id === "coffee" || comparison.id === "jeans") &&
68
+ comparison.singularLabel !== undefined &&
69
+ comparison.pluralLabel !== undefined);
70
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA0KA,MAAM,CAAC,MAAM,uBAAuB,GAAoC;IACtE;QACE,EAAE,EAAE,cAAc;QAClB,KAAK,EAAE,gBAAgB;QACvB,MAAM,EAAE,IAAI;QACZ,cAAc,EAAE,eAAe;QAC/B,WAAW,EAAE,iDAAiD;QAC9D,WAAW,EAAE,wDAAwD;QACrE,SAAS,EAAE,+EAA+E;QAC1F,UAAU,EAAE,wCAAwC;KACrD;IACD;QACE,EAAE,EAAE,gBAAgB;QACpB,KAAK,EAAE,gBAAgB;QACvB,MAAM,EAAE,IAAI;QACZ,cAAc,EAAE,eAAe;QAC/B,WAAW,EAAE,iEAAiE;QAC9E,WAAW,EAAE,yCAAyC;QACtD,SAAS,EAAE,oDAAoD;QAC/D,UAAU,EAAE,yFAAyF;KACtG;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,iBAAiB;QACxB,MAAM,EAAE,GAAG;QACX,cAAc,EAAE,oBAAoB;QACpC,WAAW,EAAE,sEAAsE;QACnF,WAAW,EAAE,gGAAgG;QAC7G,SAAS,EAAE,gDAAgD;QAC3D,UAAU,EAAE,qEAAqE;QACjF,aAAa,EAAE,eAAe;QAC9B,WAAW,EAAE,gBAAgB;KAC9B;IACD;QACE,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,iBAAiB;QACxB,MAAM,EAAE,IAAI;QACZ,cAAc,EAAE,oBAAoB;QACpC,WAAW,EAAE,gEAAgE;QAC7E,WAAW,EAAE,6GAA6G;QAC1H,SAAS,EAAE,4CAA4C;QACvD,UAAU,EAAE,iEAAiE;QAC7E,aAAa,EAAE,eAAe;QAC9B,WAAW,EAAE,gBAAgB;KAC9B;IACD;QACE,EAAE,EAAE,qBAAqB;QACzB,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,KAAK;QACb,cAAc,EAAE,iBAAiB;QACjC,WAAW,EAAE,sEAAsE;QACnF,WAAW,EAAE,+IAA+I;QAC5J,SAAS,EAAE,mCAAmC;QAC9C,UAAU,EAAE,2HAA2H;KACxI;IACD;QACE,EAAE,EAAE,mBAAmB;QACvB,KAAK,EAAE,uBAAuB;QAC9B,MAAM,EAAE,MAAM;QACd,cAAc,EAAE,iBAAiB;QACjC,WAAW,EAAE,uFAAuF;QACpG,WAAW,EAAE,6GAA6G;QAC1H,SAAS,EAAE,kHAAkH;QAC7H,UAAU,EAAE,wHAAwH;KACrI;CACO,CAAC;AAEX,MAAM,CAAC,MAAM,yBAAyB,GAAsC,uBAAuB,CAAC,MAAM,CACxG,CAAC,UAAU,EAAwC,EAAE,CACnD,CAAC,UAAU,CAAC,EAAE,KAAK,QAAQ,IAAI,UAAU,CAAC,EAAE,KAAK,OAAO,CAAC;IACzD,UAAU,CAAC,aAAa,KAAK,SAAS;IACtC,UAAU,CAAC,WAAW,KAAK,SAAS,CACvC,CAAC"}
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "@agentic-insights/shared",
3
+ "private": true,
4
+ "type": "module",
5
+ "main": "./index.js",
6
+ "types": "./index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./index.d.ts",
10
+ "default": "./index.js"
11
+ }
12
+ }
13
+ }
@@ -0,0 +1,5 @@
1
+ import type { Bucket, TimeseriesPoint } from "@agentic-insights/shared";
2
+ import type { ClassifiedUsageEvent } from "./types.js";
3
+ export declare function aggregateDayTimeseries(events: ClassifiedUsageEvent[], timeZone: string): TimeseriesPoint[];
4
+ export declare function aggregateFromDayBuckets(dayPoints: TimeseriesPoint[], bucket: Bucket, timeZone: string): TimeseriesPoint[];
5
+ export declare function aggregateTimeseries(events: ClassifiedUsageEvent[], bucket: Bucket, timeZone: string): TimeseriesPoint[];