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
@@ -0,0 +1,90 @@
1
+ import { getBucketKeyFromStart, getBucketLabelFromStart, getBucketStartTs, getNextBucketStartTs } from "./timezone.js";
2
+ function zeroRange() {
3
+ return { low: 0, central: 0, high: 0 };
4
+ }
5
+ function addRange(target, source) {
6
+ target.low += source.low;
7
+ target.central += source.central;
8
+ target.high += source.high;
9
+ }
10
+ function createPoint(startTs, bucket, timeZone) {
11
+ return {
12
+ startTs,
13
+ key: getBucketKeyFromStart(startTs, bucket, timeZone),
14
+ label: getBucketLabelFromStart(startTs, bucket, timeZone),
15
+ tokens: 0,
16
+ excludedTokens: 0,
17
+ unestimatedTokens: 0,
18
+ waterLitres: zeroRange()
19
+ };
20
+ }
21
+ function addPointTotals(target, source) {
22
+ target.tokens += source.tokens;
23
+ target.excludedTokens += source.excludedTokens;
24
+ target.unestimatedTokens += source.unestimatedTokens;
25
+ addRange(target.waterLitres, source.waterLitres);
26
+ }
27
+ function fillPoints(pointsByStart, firstStartTs, lastStartTs, bucket, timeZone) {
28
+ const points = [];
29
+ let currentStartTs = firstStartTs;
30
+ while (currentStartTs <= lastStartTs) {
31
+ points.push(pointsByStart.get(currentStartTs) ?? createPoint(currentStartTs, bucket, timeZone));
32
+ const nextStartTs = getNextBucketStartTs(currentStartTs, bucket, timeZone);
33
+ if (nextStartTs <= currentStartTs) {
34
+ break;
35
+ }
36
+ currentStartTs = nextStartTs;
37
+ }
38
+ return points;
39
+ }
40
+ export function aggregateDayTimeseries(events, timeZone) {
41
+ const pointsByStart = new Map();
42
+ let firstStartTs = Number.POSITIVE_INFINITY;
43
+ let lastStartTs = Number.NEGATIVE_INFINITY;
44
+ for (const event of events) {
45
+ const startTs = getBucketStartTs(event.ts, "day", timeZone);
46
+ const point = pointsByStart.get(startTs) ?? createPoint(startTs, "day", timeZone);
47
+ point.tokens += event.totalTokens;
48
+ addRange(point.waterLitres, event.waterLitres);
49
+ if (event.classification === "excluded") {
50
+ point.excludedTokens += event.totalTokens;
51
+ }
52
+ if (event.classification === "token_only") {
53
+ point.unestimatedTokens += event.totalTokens;
54
+ }
55
+ pointsByStart.set(startTs, point);
56
+ firstStartTs = Math.min(firstStartTs, startTs);
57
+ lastStartTs = Math.max(lastStartTs, startTs);
58
+ }
59
+ if (pointsByStart.size === 0) {
60
+ return [];
61
+ }
62
+ return fillPoints(pointsByStart, firstStartTs, lastStartTs, "day", timeZone);
63
+ }
64
+ export function aggregateFromDayBuckets(dayPoints, bucket, timeZone) {
65
+ if (bucket === "day") {
66
+ return dayPoints.map((point) => ({
67
+ ...point,
68
+ waterLitres: { ...point.waterLitres }
69
+ }));
70
+ }
71
+ if (dayPoints.length === 0) {
72
+ return [];
73
+ }
74
+ const pointsByStart = new Map();
75
+ let firstStartTs = getBucketStartTs(dayPoints[0].startTs, bucket, timeZone);
76
+ let lastStartTs = getBucketStartTs(dayPoints[dayPoints.length - 1].startTs, bucket, timeZone);
77
+ for (const dayPoint of dayPoints) {
78
+ const startTs = getBucketStartTs(dayPoint.startTs, bucket, timeZone);
79
+ const point = pointsByStart.get(startTs) ?? createPoint(startTs, bucket, timeZone);
80
+ addPointTotals(point, dayPoint);
81
+ pointsByStart.set(startTs, point);
82
+ firstStartTs = Math.min(firstStartTs, startTs);
83
+ lastStartTs = Math.max(lastStartTs, startTs);
84
+ }
85
+ return fillPoints(pointsByStart, firstStartTs, lastStartTs, bucket, timeZone);
86
+ }
87
+ export function aggregateTimeseries(events, bucket, timeZone) {
88
+ return aggregateFromDayBuckets(aggregateDayTimeseries(events, timeZone), bucket, timeZone);
89
+ }
90
+ //# sourceMappingURL=aggregation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregation.js","sourceRoot":"","sources":["../../src/aggregation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAEvH,SAAS,SAAS;IAChB,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AACzC,CAAC;AAED,SAAS,QAAQ,CAAC,MAAkB,EAAE,MAAkB;IACtD,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC;IACzB,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC;IACjC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC;AAC7B,CAAC;AAED,SAAS,WAAW,CAAC,OAAe,EAAE,MAAc,EAAE,QAAgB;IACpE,OAAO;QACL,OAAO;QACP,GAAG,EAAE,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC;QACrD,KAAK,EAAE,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC;QACzD,MAAM,EAAE,CAAC;QACT,cAAc,EAAE,CAAC;QACjB,iBAAiB,EAAE,CAAC;QACpB,WAAW,EAAE,SAAS,EAAE;KACzB,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,MAAuB,EAAE,MAAgG;IAC/I,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC;IAC/B,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,cAAc,CAAC;IAC/C,MAAM,CAAC,iBAAiB,IAAI,MAAM,CAAC,iBAAiB,CAAC;IACrD,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,UAAU,CACjB,aAA2C,EAC3C,YAAoB,EACpB,WAAmB,EACnB,MAAc,EACd,QAAgB;IAEhB,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,IAAI,cAAc,GAAG,YAAY,CAAC;IAElC,OAAO,cAAc,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;QAChG,MAAM,WAAW,GAAG,oBAAoB,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC3E,IAAI,WAAW,IAAI,cAAc,EAAE,CAAC;YAClC,MAAM;QACR,CAAC;QACD,cAAc,GAAG,WAAW,CAAC;IAC/B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAA8B,EAAE,QAAgB;IACrF,MAAM,aAAa,GAAG,IAAI,GAAG,EAA2B,CAAC;IACzD,IAAI,YAAY,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAC5C,IAAI,WAAW,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAE3C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QAElF,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC;QAClC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QAC/C,IAAI,KAAK,CAAC,cAAc,KAAK,UAAU,EAAE,CAAC;YACxC,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,WAAW,CAAC;QAC5C,CAAC;QACD,IAAI,KAAK,CAAC,cAAc,KAAK,YAAY,EAAE,CAAC;YAC1C,KAAK,CAAC,iBAAiB,IAAI,KAAK,CAAC,WAAW,CAAC;QAC/C,CAAC;QAED,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAClC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAC/C,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,aAAa,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,UAAU,CAAC,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,SAA4B,EAAE,MAAc,EAAE,QAAgB;IACpG,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC/B,GAAG,KAAK;YACR,WAAW,EAAE,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE;SACtC,CAAC,CAAC,CAAC;IACN,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,GAAG,EAA2B,CAAC;IACzD,IAAI,YAAY,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7E,IAAI,WAAW,GAAG,gBAAgB,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAE/F,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,gBAAgB,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACrE,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACnF,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAChC,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAClC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAC/C,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,UAAU,CAAC,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAA8B,EAAE,MAAc,EAAE,QAAgB;IAClG,OAAO,uBAAuB,CAAC,sBAAsB,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC7F,CAAC"}
@@ -0,0 +1,10 @@
1
+ import Fastify from "fastify";
2
+ import { DashboardService } from "./service.js";
3
+ interface CreateAppOptions {
4
+ service?: DashboardService;
5
+ webDistDir?: string;
6
+ }
7
+ export declare function createApp(options?: CreateAppOptions): Fastify.FastifyInstance<import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, Fastify.FastifyBaseLogger, Fastify.FastifyTypeProviderDefault> & PromiseLike<Fastify.FastifyInstance<import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, Fastify.FastifyBaseLogger, Fastify.FastifyTypeProviderDefault>> & {
8
+ __linterBrands: "SafePromiseLike";
9
+ };
10
+ export {};
@@ -0,0 +1,30 @@
1
+ import cors from "@fastify/cors";
2
+ import Fastify from "fastify";
3
+ import { DashboardService } from "./service.js";
4
+ import { registerStaticRoutes } from "./static.js";
5
+ function isBucket(value) {
6
+ return value === "day" || value === "week" || value === "month";
7
+ }
8
+ export function createApp(options = {}) {
9
+ const service = options.service ?? new DashboardService();
10
+ const app = Fastify({ logger: false });
11
+ void app.register(cors, { origin: true });
12
+ app.get("/api/overview", async (request) => {
13
+ const timeZone = request.query.tz || Intl.DateTimeFormat().resolvedOptions().timeZone || "UTC";
14
+ return service.getOverview(timeZone);
15
+ });
16
+ app.get("/api/timeseries", async (request, reply) => {
17
+ const bucket = request.query.bucket ?? "day";
18
+ if (!isBucket(bucket)) {
19
+ return reply.code(400).send({ error: "Invalid bucket. Expected day, week, or month." });
20
+ }
21
+ const timeZone = request.query.tz || Intl.DateTimeFormat().resolvedOptions().timeZone || "UTC";
22
+ return service.getTimeseries(bucket, timeZone);
23
+ });
24
+ app.get("/api/methodology", async () => service.getMethodology());
25
+ if (options.webDistDir) {
26
+ registerStaticRoutes(app, options.webDistDir);
27
+ }
28
+ return app;
29
+ }
30
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,eAAe,CAAC;AACjC,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,SAAS,QAAQ,CAAC,KAAa;IAC7B,OAAO,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,CAAC;AAClE,CAAC;AAOD,MAAM,UAAU,SAAS,CAAC,UAA4B,EAAE;IACtD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,gBAAgB,EAAE,CAAC;IAC1D,MAAM,GAAG,GAAG,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACvC,KAAK,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1C,GAAG,CAAC,GAAG,CAAmC,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC3E,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC,eAAe,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC;QAC/F,OAAO,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAoD,iBAAiB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACrG,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC;QAC7C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,+CAA+C,EAA0B,CAAC,CAAC;QAClH,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC,eAAe,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC;QAC/F,OAAO,OAAO,CAAC,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAElE,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { CalibrationSnapshot } from "@agentic-insights/shared";
2
+ interface SignatureInput {
3
+ codexHome: string;
4
+ claudeHome?: string;
5
+ codexHomeState: string;
6
+ fileFingerprint: Array<{
7
+ path: string;
8
+ mtimeMs: number;
9
+ size: number;
10
+ }>;
11
+ }
12
+ export declare function buildSignature({ codexHome, claudeHome, codexHomeState, fileFingerprint }: SignatureInput): string;
13
+ export declare function readCalibration(signature: string): CalibrationSnapshot | null;
14
+ export declare function writeCalibration(signature: string, snapshot: CalibrationSnapshot): void;
15
+ export declare function getOrCreateCalibration(signature: string, eventCosts: number[]): CalibrationSnapshot | null;
16
+ export {};
@@ -0,0 +1,69 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { ensureDirSync, getCacheDir } from "./paths.js";
5
+ function getCalibrationPath() {
6
+ return path.join(getCacheDir(), "calibration.json");
7
+ }
8
+ export function buildSignature({ codexHome, claudeHome, codexHomeState, fileFingerprint }) {
9
+ return crypto
10
+ .createHash("sha1")
11
+ .update(JSON.stringify({
12
+ pricingVersion: "2026-03-13-portkey-catalog",
13
+ codexHome,
14
+ claudeHome,
15
+ codexHomeState,
16
+ files: fileFingerprint
17
+ }))
18
+ .digest("hex");
19
+ }
20
+ export function readCalibration(signature) {
21
+ const calibrationPath = getCalibrationPath();
22
+ if (!fs.existsSync(calibrationPath)) {
23
+ return null;
24
+ }
25
+ const parsed = JSON.parse(fs.readFileSync(calibrationPath, "utf8"));
26
+ return parsed.signature === signature ? parsed.snapshot : null;
27
+ }
28
+ function median(values) {
29
+ const sorted = [...values].sort((a, b) => a - b);
30
+ const midpoint = Math.floor(sorted.length / 2);
31
+ if (sorted.length === 0) {
32
+ throw new Error("Cannot compute median of an empty array.");
33
+ }
34
+ if (sorted.length % 2 === 0) {
35
+ const left = sorted[midpoint - 1];
36
+ const right = sorted[midpoint];
37
+ if (left === undefined || right === undefined) {
38
+ throw new Error("Median bounds were unexpectedly undefined.");
39
+ }
40
+ return (left + right) / 2;
41
+ }
42
+ const center = sorted[midpoint];
43
+ if (center === undefined) {
44
+ throw new Error("Median center was unexpectedly undefined.");
45
+ }
46
+ return center;
47
+ }
48
+ export function writeCalibration(signature, snapshot) {
49
+ ensureDirSync(getCacheDir());
50
+ fs.writeFileSync(getCalibrationPath(), JSON.stringify({ signature, snapshot }, null, 2));
51
+ }
52
+ export function getOrCreateCalibration(signature, eventCosts) {
53
+ const cached = readCalibration(signature);
54
+ if (cached) {
55
+ return cached;
56
+ }
57
+ if (eventCosts.length === 0) {
58
+ return null;
59
+ }
60
+ const snapshot = {
61
+ referenceEventCostUsd: median(eventCosts),
62
+ computedAt: Date.now(),
63
+ supportedEventCount: eventCosts.length,
64
+ supportedMedianSource: "local_median_event_cost_usd"
65
+ };
66
+ writeCalibration(signature, snapshot);
67
+ return snapshot;
68
+ }
69
+ //# sourceMappingURL=calibration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calibration.js","sourceRoot":"","sources":["../../src/calibration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { PromptRecord, RawUsageEvent } from "./types.js";
2
+ export interface ClaudeProjectParseResult {
3
+ events: RawUsageEvent[];
4
+ prompts: PromptRecord[];
5
+ sessionModels: Map<string, string>;
6
+ }
7
+ interface ClaudeSessionMetaOptions {
8
+ sessionModels: Map<string, string>;
9
+ sessionsWithProjectEvents: Set<string>;
10
+ }
11
+ export declare function parseClaudeProjectFile(filePath: string): ClaudeProjectParseResult;
12
+ export declare function parseClaudeSessionMetaFile(filePath: string, options: ClaudeSessionMetaOptions): RawUsageEvent[];
13
+ export {};
@@ -0,0 +1,158 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs";
3
+ function parseTimestamp(value) {
4
+ if (typeof value === "number" && Number.isFinite(value)) {
5
+ return value > 1_000_000_000 && value < 10_000_000_000 ? value * 1000 : value;
6
+ }
7
+ if (typeof value !== "string") {
8
+ return null;
9
+ }
10
+ const parsed = Date.parse(value);
11
+ return Number.isNaN(parsed) ? null : parsed;
12
+ }
13
+ function toFiniteNumber(value) {
14
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
15
+ }
16
+ function makeEventId(parts) {
17
+ return crypto.createHash("sha1").update(parts.join("|")).digest("hex").slice(0, 16);
18
+ }
19
+ function normalizePromptText(value) {
20
+ if (typeof value === "string") {
21
+ const text = value.trim();
22
+ return text ? text : null;
23
+ }
24
+ if (!Array.isArray(value)) {
25
+ return null;
26
+ }
27
+ const text = value
28
+ .flatMap((item) => {
29
+ if (!item || typeof item !== "object") {
30
+ return [];
31
+ }
32
+ const record = item;
33
+ return typeof record.text === "string" ? [record.text] : [];
34
+ })
35
+ .join("\n")
36
+ .trim();
37
+ return text ? text : null;
38
+ }
39
+ function getCacheCreationTokens(usage) {
40
+ const direct = toFiniteNumber(usage.cache_creation_input_tokens);
41
+ if (direct !== null) {
42
+ return direct;
43
+ }
44
+ const ephemeral5m = toFiniteNumber(usage.cache_creation?.ephemeral_5m_input_tokens) ?? 0;
45
+ const ephemeral1h = toFiniteNumber(usage.cache_creation?.ephemeral_1h_input_tokens) ?? 0;
46
+ return ephemeral5m + ephemeral1h;
47
+ }
48
+ export function parseClaudeProjectFile(filePath) {
49
+ const events = [];
50
+ const prompts = [];
51
+ const sessionModels = new Map();
52
+ const seenMessageIds = new Set();
53
+ const lines = fs.readFileSync(filePath, "utf8").split(/\r?\n/).filter(Boolean);
54
+ for (const line of lines) {
55
+ let row;
56
+ try {
57
+ row = JSON.parse(line);
58
+ }
59
+ catch {
60
+ continue;
61
+ }
62
+ const sessionId = typeof row.sessionId === "string" && row.sessionId ? row.sessionId : null;
63
+ const model = typeof row.message?.model === "string" && row.message.model ? row.message.model : null;
64
+ if (sessionId && model) {
65
+ sessionModels.set(sessionId, model);
66
+ }
67
+ if (row.type === "user" && sessionId) {
68
+ const text = normalizePromptText(row.message?.content);
69
+ const ts = parseTimestamp(row.timestamp);
70
+ if (text && ts !== null) {
71
+ const promptId = typeof row.uuid === "string" && row.uuid
72
+ ? makeEventId([sessionId, row.uuid])
73
+ : makeEventId([sessionId, "user", String(ts), text]);
74
+ prompts.push({
75
+ id: promptId,
76
+ sessionId,
77
+ ts
78
+ });
79
+ }
80
+ }
81
+ if (row.type !== "assistant" || !sessionId || !model || !row.message?.usage) {
82
+ continue;
83
+ }
84
+ const messageId = typeof row.message.id === "string" && row.message.id ? row.message.id : null;
85
+ if (messageId && seenMessageIds.has(messageId)) {
86
+ continue;
87
+ }
88
+ const ts = parseTimestamp(row.timestamp);
89
+ const inputTokens = toFiniteNumber(row.message.usage.input_tokens);
90
+ const cacheCreationTokens = getCacheCreationTokens(row.message.usage);
91
+ const cachedInputTokens = toFiniteNumber(row.message.usage.cache_read_input_tokens) ?? 0;
92
+ const outputTokens = toFiniteNumber(row.message.usage.output_tokens);
93
+ if (ts === null || inputTokens === null || outputTokens === null) {
94
+ continue;
95
+ }
96
+ if (messageId) {
97
+ seenMessageIds.add(messageId);
98
+ }
99
+ const resolvedInputTokens = inputTokens + cacheCreationTokens;
100
+ const totalTokens = resolvedInputTokens + outputTokens;
101
+ events.push({
102
+ id: messageId ? makeEventId([sessionId, messageId]) : makeEventId([sessionId, String(ts), model, String(totalTokens)]),
103
+ sessionId,
104
+ ts,
105
+ provider: "anthropic",
106
+ model,
107
+ source: "claude_code",
108
+ totalTokens,
109
+ inputTokens: resolvedInputTokens,
110
+ cachedInputTokens,
111
+ outputTokens,
112
+ splitSource: "last_usage",
113
+ transport: "claude_project"
114
+ });
115
+ }
116
+ return {
117
+ events,
118
+ prompts,
119
+ sessionModels
120
+ };
121
+ }
122
+ export function parseClaudeSessionMetaFile(filePath, options) {
123
+ let row;
124
+ try {
125
+ row = JSON.parse(fs.readFileSync(filePath, "utf8"));
126
+ }
127
+ catch {
128
+ return [];
129
+ }
130
+ const sessionId = typeof row.session_id === "string" && row.session_id ? row.session_id : null;
131
+ if (!sessionId || options.sessionsWithProjectEvents.has(sessionId)) {
132
+ return [];
133
+ }
134
+ const ts = parseTimestamp(row.start_time);
135
+ const inputTokens = toFiniteNumber(row.input_tokens);
136
+ const outputTokens = toFiniteNumber(row.output_tokens);
137
+ if (ts === null || inputTokens === null || outputTokens === null) {
138
+ return [];
139
+ }
140
+ const model = options.sessionModels.get(sessionId) ?? "unknown";
141
+ return [
142
+ {
143
+ id: makeEventId([sessionId, "claude_summary"]),
144
+ sessionId,
145
+ ts,
146
+ provider: "anthropic",
147
+ model,
148
+ source: "claude_code",
149
+ totalTokens: inputTokens + outputTokens,
150
+ inputTokens,
151
+ cachedInputTokens: 0,
152
+ outputTokens,
153
+ splitSource: "last_usage",
154
+ transport: "claude_summary"
155
+ }
156
+ ];
157
+ }
158
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/claude.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { FileRecord } from "./types.js";
2
+ export declare function listSessionFiles(codexHome: string): FileRecord[];
3
+ export declare function listClaudeProjectFiles(claudeHome: string): FileRecord[];
4
+ export declare function listClaudeSessionMetaFiles(claudeHome: string): FileRecord[];
5
+ export declare function getTuiLogPath(codexHome: string): string;
@@ -0,0 +1,43 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ function walkFiles(dirPath, extension, output) {
4
+ if (!fs.existsSync(dirPath)) {
5
+ return;
6
+ }
7
+ for (const dirent of fs.readdirSync(dirPath, { withFileTypes: true })) {
8
+ const fullPath = path.join(dirPath, dirent.name);
9
+ if (dirent.isDirectory()) {
10
+ walkFiles(fullPath, extension, output);
11
+ continue;
12
+ }
13
+ if (!dirent.isFile() || !fullPath.endsWith(extension)) {
14
+ continue;
15
+ }
16
+ const stat = fs.statSync(fullPath);
17
+ output.push({
18
+ path: fullPath,
19
+ mtimeMs: Math.floor(stat.mtimeMs),
20
+ size: stat.size
21
+ });
22
+ }
23
+ }
24
+ export function listSessionFiles(codexHome) {
25
+ const files = [];
26
+ walkFiles(path.join(codexHome, "sessions"), ".jsonl", files);
27
+ walkFiles(path.join(codexHome, "archived_sessions"), ".jsonl", files);
28
+ return files.sort((a, b) => a.path.localeCompare(b.path));
29
+ }
30
+ export function listClaudeProjectFiles(claudeHome) {
31
+ const files = [];
32
+ walkFiles(path.join(claudeHome, "projects"), ".jsonl", files);
33
+ return files.sort((a, b) => a.path.localeCompare(b.path));
34
+ }
35
+ export function listClaudeSessionMetaFiles(claudeHome) {
36
+ const files = [];
37
+ walkFiles(path.join(claudeHome, "usage-data", "session-meta"), ".json", files);
38
+ return files.sort((a, b) => a.path.localeCompare(b.path));
39
+ }
40
+ export function getTuiLogPath(codexHome) {
41
+ return path.join(codexHome, "log", "codex-tui.log");
42
+ }
43
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,SAAS,SAAS,CAAC,OAAe,EAAE,SAA6B,EAAE,MAAoB;IACrF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;YACzB,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;YACvC,SAAS;QACX,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACtD,SAAS;QACX,CAAC;QAED,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;YACjC,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC7D,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACtE,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,UAAkB;IACvD,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC9D,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,UAAkB;IAC3D,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,EAAE,cAAc,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAC/E,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAAiB;IAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { GeneratedPricingCatalog } from "../pricing-catalog-transform.js";
2
+ export declare const GENERATED_PRICING_CATALOG: GeneratedPricingCatalog;