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.
- package/README.md +44 -0
- package/dist/args.d.ts +11 -0
- package/dist/args.js +71 -0
- package/dist/args.js.map +1 -0
- package/dist/browser.d.ts +6 -0
- package/dist/browser.js +42 -0
- package/dist/browser.js.map +1 -0
- package/dist/config.d.ts +3 -0
- package/dist/config.js +17 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/port.d.ts +2 -0
- package/dist/port.js +38 -0
- package/dist/port.js.map +1 -0
- package/dist/runtime/node_modules/@agentic-insights/shared/index.d.ts +159 -0
- package/dist/runtime/node_modules/@agentic-insights/shared/index.js +70 -0
- package/dist/runtime/node_modules/@agentic-insights/shared/index.js.map +1 -0
- package/dist/runtime/node_modules/@agentic-insights/shared/package.json +13 -0
- package/dist/runtime/server/aggregation.d.ts +5 -0
- package/dist/runtime/server/aggregation.js +90 -0
- package/dist/runtime/server/aggregation.js.map +1 -0
- package/dist/runtime/server/app.d.ts +10 -0
- package/dist/runtime/server/app.js +30 -0
- package/dist/runtime/server/app.js.map +1 -0
- package/dist/runtime/server/calibration.d.ts +16 -0
- package/dist/runtime/server/calibration.js +69 -0
- package/dist/runtime/server/calibration.js.map +1 -0
- package/dist/runtime/server/claude.d.ts +13 -0
- package/dist/runtime/server/claude.js +158 -0
- package/dist/runtime/server/claude.js.map +1 -0
- package/dist/runtime/server/discovery.d.ts +5 -0
- package/dist/runtime/server/discovery.js +43 -0
- package/dist/runtime/server/discovery.js.map +1 -0
- package/dist/runtime/server/generated/pricing-catalog.d.ts +2 -0
- package/dist/runtime/server/generated/pricing-catalog.js +17990 -0
- package/dist/runtime/server/generated/pricing-catalog.js.map +1 -0
- package/dist/runtime/server/index.d.ts +1 -0
- package/dist/runtime/server/index.js +14 -0
- package/dist/runtime/server/index.js.map +1 -0
- package/dist/runtime/server/parser.d.ts +10 -0
- package/dist/runtime/server/parser.js +292 -0
- package/dist/runtime/server/parser.js.map +1 -0
- package/dist/runtime/server/paths.d.ts +10 -0
- package/dist/runtime/server/paths.js +42 -0
- package/dist/runtime/server/paths.js.map +1 -0
- package/dist/runtime/server/pricing-catalog-transform.d.ts +39 -0
- package/dist/runtime/server/pricing-catalog-transform.js +82 -0
- package/dist/runtime/server/pricing-catalog-transform.js.map +1 -0
- package/dist/runtime/server/pricing.d.ts +18 -0
- package/dist/runtime/server/pricing.js +276 -0
- package/dist/runtime/server/pricing.js.map +1 -0
- package/dist/runtime/server/service.d.ts +37 -0
- package/dist/runtime/server/service.js +752 -0
- package/dist/runtime/server/service.js.map +1 -0
- package/dist/runtime/server/static.d.ts +2 -0
- package/dist/runtime/server/static.js +48 -0
- package/dist/runtime/server/static.js.map +1 -0
- package/dist/runtime/server/timezone.d.ts +15 -0
- package/dist/runtime/server/timezone.js +197 -0
- package/dist/runtime/server/timezone.js.map +1 -0
- package/dist/runtime/server/types.d.ts +62 -0
- package/dist/runtime/server/types.js +2 -0
- package/dist/runtime/server/types.js.map +1 -0
- package/dist/runtime/web/agent.svg +5 -0
- package/dist/runtime/web/assets/index-CUN_NMpB.css +1 -0
- package/dist/runtime/web/assets/index-DzpKJhbf.js +112 -0
- package/dist/runtime/web/favicon.svg +5 -0
- package/dist/runtime/web/index.html +17 -0
- 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
|
package/dist/args.js.map
ADDED
|
@@ -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>;
|
package/dist/browser.js
ADDED
|
@@ -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"}
|
package/dist/config.d.ts
ADDED
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"}
|
package/dist/index.d.ts
ADDED
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
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
|
package/dist/port.js.map
ADDED
|
@@ -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,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[];
|